<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4027349074927126303</id><updated>2011-07-08T15:23:38.982+08:00</updated><category term='google app engine'/><category term='flash'/><category term='education'/><category term='javascript'/><category term='qq'/><category term='funny'/><category term='erlang'/><category term='web'/><category term='3d'/><category term='street art'/><category term='alchemy'/><category term='gen_server'/><category term='scim'/><category term='tomcat'/><category term='adobe'/><category term='crack'/><category term='gnu'/><category term='gnome'/><category term='tencent'/><category term='augmented reality'/><category term='css'/><category term='python'/><category term='bookmarklet'/><category term='shenzhen'/><category term='oreilly'/><category term='servlet'/><category term='otp'/><category term='port'/><category term='actionscript'/><category term='c++'/><category term='mnesia'/><category term='apache'/><category term='linux'/><category term='debug'/><category term='xml'/><category term='xfce4'/><category term='virtualbox'/><category term='gravatar'/><category term='dreamweaver'/><category term='mysql'/><category term='php'/><category term='process'/><category term='random'/><category term='jsp'/><category term='flashplayer'/><category term='flex'/><category term='thread'/><category term='c'/><category term='mxml'/><category term='posix'/><category term='gedit'/><category term='jojo'/><category term='sniffer'/><category term='qt'/><category term='ubuntu'/><category term='cpp'/><category term='ftp'/><category term='university'/><category term='json'/><category term='google'/><title type='text'>M-OSCAR</title><subtitle type='html'>Everything that has a beginning has an end.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default?start-index=101&amp;max-results=100'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>142</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-4356940656407324598</id><published>2009-09-03T19:45:00.001+08:00</published><updated>2009-09-03T19:45:20.328+08:00</updated><title type='text'>Moving into Tencent Building</title><content type='html'>今日第一次准时落班，因为要搬迁到腾讯大厦，哈哈兴奋~~&lt;div&gt;&lt;br&gt;&lt;div&gt;&lt;div&gt;&lt;div style="text-align: left" id="i5eq"&gt;&lt;a href="http://docs.google.com/File?id=dcn4tm7d_1043hdh485ck_b" target="_blank"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1043hdh485ck_b" style="width: 400px; height: 533.333px"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;不过甘早落班，未有班车接送翻屋企，难得有时间，决定行路返去 :D&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: left" id="qze0"&gt;&lt;a href="http://docs.google.com/File?id=dcn4tm7d_1045chcm6vfn_b" target="_blank"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1045chcm6vfn_b" style="width: 400px; height: 533.333px"&gt;&lt;/a&gt;&lt;/div&gt;南山科技路，汇聚左好多IT公司，远处太阳底下突出来既就系腾讯大厦了~~&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: left" id="ru4n"&gt;&lt;a href="http://docs.google.com/File?id=dcn4tm7d_1046vcx2vgd5_b" target="_blank"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1046vcx2vgd5_b" style="width: 400px; height: 533.333px"&gt;&lt;/a&gt;&lt;/div&gt;中兴应该系腾讯大厦建成之前附近最高既建筑，夜景好正~~&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;div style="text-align: left" id="is9p"&gt;&lt;a href="http://docs.google.com/File?id=dcn4tm7d_1047dwnw88hp_b" target="_blank"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1047dwnw88hp_b" style="width: 400px; height: 533.333px"&gt;&lt;/a&gt;&lt;/div&gt;腾讯大厦~~传说中顶楼既风景一流，听日入去上班之后要上去睇睇~~&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: left" id="xnsk"&gt;&lt;a href="http://docs.google.com/File?id=dcn4tm7d_1050c3r42jcr_b" target="_blank"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1050c3r42jcr_b" style="width: 400px; height: 533.333px"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left" id="wpqq"&gt;从飞亚达出发大概行左半个钟头先来到腾讯大厦脚下 -____- |||&amp;nbsp;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left" id="uuuz"&gt;&lt;a href="http://docs.google.com/File?id=dcn4tm7d_1051dbtpd673_b" target="_blank"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1051dbtpd673_b" style="width: 400px; height: 533.333px"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left" id="uko6"&gt;屋企就系新大楼隔离，趁时间尚早，摸索条归家路先~~&lt;/div&gt;&lt;div style="text-align: left" id="v10s"&gt;深圳既天气除左比较热之外都仲唔错，蓝天白云都仲系偶然有的~~&lt;/div&gt;&lt;div style="text-align: left" id="zqls"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left" id="qjs0"&gt;&lt;div style="text-align: left" id="x2zz"&gt;&lt;a href="http://docs.google.com/File?id=dcn4tm7d_1052hs3zkxgr_b" target="_blank"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1052hs3zkxgr_b" style="width: 400px; height: 533.333px"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left" id="a:pw"&gt;我住的友邻公寓........隔离既西海明珠:P 同公司另一个同事合租左一个30楼既单位，坐北向南，景观唔错，西面可以远远望到一个码头，码头既对岸就系珠海了 :)&lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-4356940656407324598?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/4356940656407324598/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=4356940656407324598&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4356940656407324598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4356940656407324598'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/09/moving-into-tencent-building.html' title='Moving into Tencent Building'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-730353420875125452</id><published>2009-08-09T02:24:00.001+08:00</published><updated>2009-08-09T02:39:00.078+08:00</updated><title type='text'>东门“便便”游~~</title><content type='html'>今日某兴和小冰导游东门，稳到左传说中的“便所主题餐厅”，哇D雪糕真系同XX一样....好彩味道好正常:P 然后去左万象城睇Ice Age III 3D版，哇门票要120蚊（囧囧），哈哈只可怜既松鼠又为左粒松子四处奔波~~&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: left" id="pufg"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1030dtz363dn_b" style="width: 400px; height: 533.333px"&gt;&lt;/div&gt;&lt;div style="text-align: left" id="uy8j"&gt;小冰多有后现代非主流的潜质~~&lt;/div&gt;&lt;div style="text-align: left" id="jkbn"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left" id="syd4"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1031hmc4hjdg_b" style="width: 400px; height: 300px"&gt;&lt;/div&gt;&lt;div style="text-align: left" id="r7yv"&gt;东门步行街，感觉像回到广州的上下九~~&lt;/div&gt;&lt;div style="text-align: left" id="cg1i"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left" id="kfwj"&gt;&lt;div style="text-align: left" id="w7sq"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1032hb62tpg9_b" style="width: 400px; height: 533.333px"&gt;&lt;/div&gt;&lt;div style="text-align: left" id="zv-w"&gt;可怜的小冰，走着走着突然被埋伏在路边的卖花女用死亡缠绕攻击，瞬间被秒杀~~&lt;/div&gt;&lt;div style="text-align: left" id="x0gq"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left" id="m7k."&gt;&lt;div style="text-align: left" id="k6ja"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1033ftwq3kc4_b" style="width: 400px; height: 533.333px"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;信春哥者得永生，小冰在便便主体餐厅满状态复生~~（连座位都是马桶 -_-）&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left" id="r8d8"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_10346rs6zrdm_b" style="width: 400px; height: 533.333px"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;菜单都好有特色....&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left" id="v6tf"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1035dhss3kc8_b" style="width: 400px; height: 300px"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;用“马桶”装住的“便便”雪糕....&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;div style="text-align: left" id="ztrp"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1038cdm96jc7_b" style="width: 400px; height: 300px"&gt;&lt;/div&gt;&lt;div style="text-align: left" id="a52n"&gt;哈哈，间餐厅入面有好多XX公仔 :P&lt;/div&gt;&lt;div style="text-align: left" id="zwje"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left" id="a8z:"&gt;&lt;div style="text-align: left" id="lv82"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1040gj5dsxc5_b" style="width: 400px; height: 533.333px"&gt;&lt;/div&gt;传说中的大学班长某兴~~&lt;/div&gt;&lt;div style="text-align: left" id="bfht"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left" id="lw5b"&gt;&lt;div style="text-align: left" id="yvsh"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1041f3sk56d3_b" style="width: 400px; height: 533.333px"&gt;&lt;/div&gt;&lt;div style="text-align: left" id="fdsn"&gt;便便是用来舔D orz&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left" id="rj-o"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left" id="omg7"&gt;&lt;div style="text-align: left" id="trer"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1039ccsgdrhb_b" style="width: 400px; height: 533.333px"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;厕所入面有好多恶搞画报~~&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-730353420875125452?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/730353420875125452/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=730353420875125452&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/730353420875125452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/730353420875125452'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/08/blog-post.html' title='东门“便便”游~~'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2060274642772915183</id><published>2009-08-07T00:40:00.001+08:00</published><updated>2009-08-07T00:40:06.774+08:00</updated><title type='text'>Missing you ....</title><content type='html'>&lt;div style="text-align: left" id="y-9q"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1028c87fwhhf_b" style="width: 500px; height: 374.104px"&gt;&lt;/div&gt;&lt;div style="text-align: left" id="r-1m"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left" id="lyfz"&gt;今天收到了公司送的一对QQ公仔，本来是入职的时候送的，不过说当时没存货，就拖到现在才到手~~加上这两只已经拿了5只胖企鹅了....哈哈再接再厉~~&lt;/div&gt;&lt;div style="text-align: left" id="td:6"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: left" id="sir1"&gt;明天又是星期五了，感觉上班的时间过的很快，老婆我好想你！&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2060274642772915183?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2060274642772915183/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2060274642772915183&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2060274642772915183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2060274642772915183'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/08/missing-you.html' title='Missing you ....'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2689444169962993001</id><published>2009-08-04T07:52:00.002+08:00</published><updated>2009-08-04T07:58:16.349+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tencent'/><category scheme='http://www.blogger.com/atom/ns#' term='qq'/><title type='text'>Inside Fiyta</title><content type='html'>上班两周，就得了胃痛 -_- 飞亚达里到处都是QQ公仔：&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div id="ruq9" style="text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1022g9m49rcf_b" style="height: 300px; width: 400px;" /&gt;&lt;/div&gt;&lt;div id="f29-" style="text-align: left;"&gt;5楼办公室一进门就一只巨型企鹅，肚腩都已经胖得坠下来了~~&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div id="tmmf" style="text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1023fddkpzc2_b" style="height: 533.333px; width: 400px;" /&gt;&lt;/div&gt;&lt;div id="hlaj" style="text-align: left;"&gt;导向牌后面也躲着QQ&lt;/div&gt;&lt;div id="cjpc" style="text-align: left;"&gt;&lt;/div&gt;&lt;div id="ihe." style="text-align: left;"&gt;&lt;div id="g966" style="text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1024cjqmd6fc_b" style="height: 533.333px; width: 400px;" /&gt;&lt;/div&gt;&lt;div id="tea5" style="text-align: left;"&gt;旁边的导师的桌脚下也有一只加大的QMM&lt;/div&gt;&lt;div id="av97" style="text-align: left;"&gt;&lt;/div&gt;&lt;div id="wjl2" style="text-align: left;"&gt;&lt;div id="ttvw" style="text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1025f3nbc6g3_b" style="height: 300px; width: 400px;" /&gt;&lt;/div&gt;&lt;div id="hkl4" style="text-align: left;"&gt;连厕所门上的都是QQ -____- |||&lt;/div&gt;&lt;div id="l97q" style="text-align: left;"&gt;&lt;/div&gt;&lt;div id="qgu7" style="text-align: left;"&gt;&lt;div id="qttr" style="text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1026dnh3drhk_b" style="height: 300px; width: 400px;" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;每晚的免费宵夜：面包+汽水，还有免费自助餐，想不胖都不行....&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2689444169962993001?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2689444169962993001/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2689444169962993001&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2689444169962993001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2689444169962993001'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/08/inside-fiyta.html' title='Inside Fiyta'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-1300836150503523563</id><published>2009-07-27T13:23:00.002+08:00</published><updated>2009-08-04T07:58:38.330+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shenzhen'/><title type='text'>Moved to my new house ....</title><content type='html'>昨天搬到酒店隔离的友邻公寓30楼，哈哈风景不错~~&lt;br /&gt;&lt;br /&gt;从露台看出去的夜景~~好多“星星”~~&lt;br /&gt;&lt;div id="rrkw" style="text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1014f4mghdgd_b" style="height: 300px; width: 400px;" /&gt;&lt;/div&gt;&lt;br /&gt;从露台看出去的晨景....刚落完雨好多云....&lt;br /&gt;&lt;div id="v6al" style="text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1015cfpttsd6_b" style="height: 300px; width: 400px;" /&gt;&lt;br /&gt;&lt;br /&gt;室内系甘的:P&lt;br /&gt;&lt;div id="q1ex" style="text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=dcn4tm7d_1016ftkhr5km_b" style="height: 533.333px; width: 400px;" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-1300836150503523563?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/1300836150503523563/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=1300836150503523563&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1300836150503523563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1300836150503523563'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/07/moved-to-my-new-house_27.html' title='Moved to my new house ....'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5655263345505527657</id><published>2009-07-22T14:13:00.004+08:00</published><updated>2009-07-22T14:14:55.479+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Linux文件与目录权限</title><content type='html'>我们在linux里输入ls -l或者ll后，会输出一个如下的列表，显示当前目录下的文件和子目录详细信息（XXX表示文件名）：&lt;br /&gt;&lt;pre&gt;drwxr-xr-x&amp;nbsp; 4 oscartang users 4096 2009-07-22 11:25 xxx&lt;br /&gt;drwxr-xr-x 23 oscartang users 4096 2009-07-22 11:25 xxx&lt;br /&gt;drwxr-xr-x&amp;nbsp; 3 oscartang users 4096 2009-07-22 11:25 xxx&lt;br /&gt;drwxr-xr-x&amp;nbsp; 4 oscartang users 4096 2009-07-22 11:25 xxx&lt;br /&gt;drwxr-xr-x&amp;nbsp; 3 oscartang users 4096 2009-07-22 11:25 xxx&lt;br /&gt;-rwxr-xr-x&amp;nbsp; 1 oscartang users&amp;nbsp;&amp;nbsp; 69 2009-07-22 11:25 xxx&lt;br /&gt;drwxr-xr-x&amp;nbsp; 3 oscartang users 4096 2009-07-22 11:25 xxx&lt;/pre&gt;&lt;br /&gt;最前面有一堆“drwxr-xr-x”样子的东东是什么来的呢？它是文件/子目录的权限设置，第一个字母通常用于区分类型（是文件、目录、还是其他东东），后面9个字母由左至右每三个为一租分别标识所有者、与所有者同组用户、其他用户的权限。具体如下：&lt;br /&gt;&lt;br /&gt;&lt;code&gt; d : 表示是一个目录，事实上在ext2fs中，目录是一个特殊的文件；&lt;/code&gt;&lt;br /&gt;&lt;code&gt;- : 表示这是一个普通的文件；&lt;br /&gt;l : 表示这是一个符号链接文件，实际上它指向另一个文件；&lt;br /&gt;b、c : 分别表示区块设备和其他的外围设备，是特殊类型的文件；&lt;/code&gt;&lt;br /&gt;&lt;code&gt;s、p : 这些文件关系到系统的数据结构和管道，通常很少见到。&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;r(Read) : 对文件而言，具有读取文件内容的权限；对目录来说，具有浏览目录的权限；&lt;br /&gt;w(Write) : 对文件而言，具有新增、修改文件内容的权限；对目录来说，具有删除、移动目录内文件的权限；&lt;br /&gt;x(eXecute) : 对文件而言，具有执行文件的权限；对目录了来说该用户具有进入目录的权限；&lt;br /&gt;- : 表示不具有该项权限。&lt;br /&gt;&lt;br /&gt;下面举例说明：&lt;br /&gt;&lt;div class="codeblock"&gt;&lt;code&gt;-rwx------ : 文件所有者对文件具有读取、写入和执行的权限。&lt;br /&gt;-rwxr—r-- : 文件所有者具有读、写与执行的权限，其他用户则具有读取的权限。&lt;br /&gt;-rw-rw-r-x : 文件所有者与同组用户对文件具有读写的权限，而其他用户仅具有读取和执行的权限。&lt;br /&gt;drwx--x--x : 目录所有者具有读写与进入目录的权限,其他用户近能进入该目录，却无法读取任何数据。&lt;/code&gt;&lt;/div&gt;&lt;div class="codeblock"&gt;&lt;code&gt;drwx------ : 除了目录所有者具有完整的权限之外，其他用户对该目录完全没有任何权限。&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5655263345505527657?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5655263345505527657/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5655263345505527657&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5655263345505527657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5655263345505527657'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/07/linux.html' title='Linux文件与目录权限'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-7887660183158054157</id><published>2009-07-21T18:26:00.001+08:00</published><updated>2009-07-21T18:26:21.599+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tencent'/><title type='text'>Second day at work ....</title><content type='html'>同事们工作都好认真，唯独我仍在看文档看代码，努力跟上各位前辈的步伐....上班两日，最有感触的是....饿:P，看来要带点零食来上班才行了~~公司说5点半下班，但接送班车却到7点至11点才有....明显鼓励各位加班....饿晕了，先去吃饭~~&lt;br /&gt;Tomorrow will be a better day :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-7887660183158054157?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/7887660183158054157/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=7887660183158054157&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7887660183158054157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7887660183158054157'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/07/second-day-at-work.html' title='Second day at work ....'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5370083059783552726</id><published>2009-06-04T19:44:00.001+08:00</published><updated>2009-06-04T19:46:44.501+08:00</updated><title type='text'>5月35日</title><content type='html'>今天终于答辩完了～～哇演示的时候紧张得我手震震～～最后程序本身倒没什么问题，反而又是论文格式要改，郁闷，这些填表教授表填多了心理不平衡，也要让学生感受一下～～毕业了，感触良多，如果问我大学里最大的收获是什么，我会说，不是书本上的知识，不是技术上的进步，而是认识到什么叫做冷漠～～渐渐的，我对很多东西失去了信心，对周围的人，对这个社会，对这个国家，都已经不再像从前那样看待，我想这就叫做成长吧。&lt;br&gt;&lt;br&gt;今天又有更多网站进入“技术维护”状态，想必是企图完全切断国民讨论的渠道，让今天不了了之的过去，我对20年前的今天没有多少了解，我不对一段我不了解的历史做任何评论，只是觉得能够做出这种卑劣的事情，只能证明某些人心里有鬼～～连“分享网络2.0”这样的一个技术型网站都被自觉维护，还要特意强调自己真的是因为技术问题要进行维护，虚伪！我真的觉得很失望，不禁想起《V for Vendetta》里的一句对白：If you're looking for the guilty, you need only look into a mirror.&lt;br&gt;&lt;br&gt;&lt;div id="w35j" style="text-align: left;"&gt;&lt;img style="width: 500px; height: 177px;" src="http://docs.google.com/File?id=dcn4tm7d_1010skthvndd_b"&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5370083059783552726?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5370083059783552726/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5370083059783552726&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5370083059783552726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5370083059783552726'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/06/535.html' title='5月35日'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-574965206051594200</id><published>2009-06-03T17:30:00.001+08:00</published><updated>2009-06-03T17:34:34.714+08:00</updated><title type='text'>全国技术维护日</title><content type='html'>全国技术维护日&lt;br&gt;&lt;br&gt;&lt;div id="bo7." style="text-align: left;"&gt;&lt;div id="u5-y" style="text-align: left;"&gt;&lt;img style="width: 473px; height: 225px;" src="http://docs.google.com/File?id=dcn4tm7d_993dr7vp5dz_b"&gt;&lt;/div&gt;&lt;br&gt;今天国内的饭否和VeryCD两大网站也顶不住河蟹的重量，纷纷俯首称臣，在“敏感时刻”自觉进行“技术维护”整站关闭，还能说什么呢～～我也自觉技术维护一下吧～～&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-574965206051594200?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/574965206051594200/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=574965206051594200&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/574965206051594200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/574965206051594200'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/06/blog-post.html' title='全国技术维护日'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-1434483357150899484</id><published>2009-06-03T16:44:00.001+08:00</published><updated>2009-06-03T16:45:08.457+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>Use Erlang to handle xml stream</title><content type='html'>写了一个模块，使用xmerl_scan:string函数流式的读取和处理XML流（边读边处理），很适合用于处理XMPP协议的XML流数据，每读取到一个完整的节点（message, presence, iq ....）就会做相应处理～～&lt;a href="http://sites.google.com/site/mfilestation/gong-gong-wen-jian/stream_scanner.erl?attredirects=0"&gt;源码在这里&lt;/a&gt;～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-1434483357150899484?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/1434483357150899484/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=1434483357150899484&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1434483357150899484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1434483357150899484'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/06/use-erlang-to-handle-xml-stream.html' title='Use Erlang to handle xml stream'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-3575501768829086799</id><published>2009-06-03T02:10:00.000+08:00</published><updated>2009-06-03T02:10:36.489+08:00</updated><title type='text'>豆瓣网：BLOGSPOT网络遊彳亍小组！小组已被解散</title><content type='html'>尊敬的用户：&lt;br /&gt;&lt;br /&gt;作为一家在中国境内运营的网站，&lt;br /&gt;&lt;div class="ii gt" id=":39"&gt;&lt;wbr&gt;&lt;/wbr&gt;豆瓣遵守中国的法律法规和相关政策的要求。( 相关法律法规，请参考《互联网信息服务管理办法》&lt;a href="http://www.cnnic.net.cn/html/Dir/2000/09/25/0652.htm" target="_blank"&gt;http://&lt;wbr&gt;&lt;/wbr&gt;www.cnnic.net.cn/html/Dir/&lt;wbr&gt;&lt;/wbr&gt;2000/09/25/0652.htm&lt;/a&gt; 第十五条。)&lt;br /&gt;&lt;br /&gt;你参与的小组 BLOGSPOT网络遊彳亍小组！ 因讨论主题属于社区指导原则不允许、不欢迎的内容，已被解散。&lt;br /&gt;&lt;br /&gt;由此给你带来的不便，我们深表歉意，并感谢你的理解和配合。&lt;br /&gt;&lt;br /&gt;附 社区指导原则：&lt;a href="http://www.douban.com/about?policy=guideline" target="_blank"&gt;http://www.douban.com/&lt;wbr&gt;&lt;/wbr&gt;about?policy=guideline&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;——豆瓣&lt;/div&gt;&lt;div class="ii gt" id=":39"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="ii gt" id=":39"&gt;今日莫名其妙的收到了这样一封邮件，我都不记得了自己参加了这样一个游行小组，貌似只是声讨政府屏蔽BLOGSPOT的做法，近来说临近六四，国内很多动作，百度贴吧里各大学的贴吧都被禁止了评论功能，以图阻止学生们交流，很多网站都加大力度查封所谓敏感内容，事实上这样做实在不智，须知人的好奇心，越是搞的神秘，越是有人要翻墙去看个到底，现在互联网时代，要屏蔽资讯不像once upon a time那么容易～～再说平生不做亏心事，夜半敲门也不惊，如此之举实乃有些人实在心虚害怕～～&lt;/div&gt;&lt;div class="ii gt" id=":39"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="ii gt" id=":39"&gt;但是再怎么说，要在这样的社会存活下来，还是有不少网站，尤其是大网站很识时务，主动配合，不顾扭曲自己，不顾用户流失，但求留得青山在，对这样的服务商，我又能说什么呢，想起《斯巴达300勇士》里Leinidas的一句台词十分适合：You there, Ephialtes. May you live forever.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-3575501768829086799?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/3575501768829086799/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=3575501768829086799&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3575501768829086799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3575501768829086799'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/06/blogspot.html' title='豆瓣网：BLOGSPOT网络遊彳亍小组！小组已被解散'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-1054270706538325529</id><published>2009-05-31T16:35:00.001+08:00</published><updated>2009-05-31T16:35:27.923+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='port'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='cpp'/><title type='text'>erlang 与 linked-in driver 间的通信</title><content type='html'>erlang貌似没有直接向port写入整数的方法，通过port传送的全是binary数据，以下代码在erlang中通过port传送一个整数给cpp读取～～&lt;br /&gt;&lt;pre&gt;Erlang :&lt;br /&gt;send_integer(Int) -&gt;&lt;br /&gt;    Size = erlang:system_info(wordsize) * 8,&lt;br /&gt;    Data = &lt;b&gt;&amp;lt;&amp;lt;Int:Size/integer-little&amp;gt;&amp;gt;&lt;/b&gt;,&lt;br /&gt;    Port ! {self(), {command, Data}},&lt;br /&gt;    ....&lt;br /&gt;&lt;br /&gt;CPP :&lt;br /&gt;static void output(ErlDrvData handle, char* buff, int bufflen){&lt;br /&gt;    int *num = (int *)buff&lt;br /&gt;    ....&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-1054270706538325529?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/1054270706538325529/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=1054270706538325529&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1054270706538325529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1054270706538325529'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/erlang-linked-in-driver_31.html' title='erlang 与 linked-in driver 间的通信'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-3672259655676290761</id><published>2009-05-30T02:27:00.001+08:00</published><updated>2009-05-30T02:27:45.942+08:00</updated><title type='text'>Google Docs 写博测试</title><content type='html'>Google Docs 写博测试&lt;br&gt;&lt;div id="myc4" style="text-align: left;"&gt;&lt;br&gt;&lt;img style="width: 400px; height: 259px;" src="http://docs.google.com/File?id=dcn4tm7d_982f59f9hck_b"&gt;&lt;br&gt;&lt;br&gt;&lt;div id="shcd" style="text-align: left;"&gt;&lt;img style="width: 400px; height: 262px;" src="http://docs.google.com/File?id=dcn4tm7d_983hps2q9dh_b"&gt;&lt;br&gt;&lt;br&gt;&lt;div id="dzny" style="text-align: left;"&gt;&lt;img style="width: 400px; height: 258px;" src="http://docs.google.com/File?id=dcn4tm7d_984hsjb6sgm_b"&gt;&lt;br&gt;&lt;br&gt;&lt;div id="u4wj" style="text-align: left;"&gt;&lt;img style="width: 400px; height: 257px;" src="http://docs.google.com/File?id=dcn4tm7d_985dd6ff99m_b"&gt;&lt;br&gt;&lt;br&gt;&lt;div id="v4gc" style="text-align: left;"&gt;&lt;img style="width: 400px; height: 258px;" src="http://docs.google.com/File?id=dcn4tm7d_986dh3c44cj_b"&gt;&lt;br&gt;&lt;br&gt;拜GFW所赐，Blogspot从大陆不能直接访问，虽然用代理能够正常访问正常发文，但上传不了图片，无奈，发现原来Google Docs可以当作编辑器将文章发布到Blogspot，实在十分好！马上测试一下～～&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-3672259655676290761?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/3672259655676290761/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=3672259655676290761&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3672259655676290761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3672259655676290761'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/google-docs.html' title='Google Docs 写博测试'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-9167980237258711234</id><published>2009-05-26T12:10:00.000+08:00</published><updated>2009-05-26T12:10:24.531+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu下保存mms类型地址的视频</title><content type='html'>在ubuntu下用这个mimms软件可以下载mms类型地址的视频，安装很简单，如下：&lt;br /&gt;sudo apt-get install mimms&lt;br /&gt;&lt;br /&gt;装好后输入如下命令即可下载，有进度和剩余时间显示～～&lt;br /&gt;mimms mms://....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-9167980237258711234?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/9167980237258711234/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=9167980237258711234&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/9167980237258711234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/9167980237258711234'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/ubuntumms.html' title='Ubuntu下保存mms类型地址的视频'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2202431571967469742</id><published>2009-05-25T14:26:00.002+08:00</published><updated>2009-05-25T14:29:04.151+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><title type='text'>Google App Engine on Ubuntu 9.04</title><content type='html'>Google App Engine官方所支持的python版本为2.5，BUT Ubuntu 9.04默认使用的是python 2.6.2，这样在本地测试时就会遇到点问题了，比如会出现如下的异常：&lt;br /&gt;Throwing &lt;type exceptions.importerror=""&gt;: No module named _multiprocessing&lt;/type&gt;&lt;br /&gt;&lt;br /&gt;不过幸好，我们只要转回2.5版本就平安大吉了，步骤如下：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sudo apt-get install python2.5&lt;/li&gt;&lt;li&gt;修改dev_appserver.py文件，将第一行替换为&lt;b&gt;#!/usr/bin/env python2.5&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b style="font-weight: normal;"&gt;OK～～&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2202431571967469742?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2202431571967469742/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2202431571967469742&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2202431571967469742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2202431571967469742'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/google-app-engine-on-ubuntu-904.html' title='Google App Engine on Ubuntu 9.04'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5810580495745080521</id><published>2009-05-24T19:08:00.000+08:00</published><updated>2009-05-24T19:08:20.781+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='port'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang Linked in driver</title><content type='html'>Erlang允许其他语言编写的程序以共享库的方式动态连接到Erlang运行时环境里运行，与Erlang Port的方式相似，这种方式称为linked-in driver（内部连接驱动？？），是Erlang与其他语言程序交互的最高效的方式，但同时也是最危险的，因为一旦驱动内部出现致命异常，Erlang虚拟机也会崩溃，拖累其他Erlang进程一起挂掉，因此如非必要不推荐使用linked-in driver。&lt;br /&gt;&lt;br /&gt;下面是C++编写的driver，具体代码结构解析请参见《Programming Erlang》&lt;br /&gt;&lt;pre&gt;#include &lt;iostream&gt;&lt;br /&gt;&lt;b&gt;#include "erl_driver.h"&lt;/b&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;struct data{&lt;br /&gt;    ErlDrvPort port;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;//PORT打开时执行&lt;br /&gt;static ErlDrvData start(ErlDrvPort port, char *buff){&lt;br /&gt;    data* d = (data*)driver_alloc(sizeof(data));&lt;br /&gt;    d-&gt;port = port;&lt;br /&gt;    return (ErlDrvData)d;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//PORT关闭时执行&lt;br /&gt;static void stop(ErlDrvData handle){&lt;br /&gt;    driver_free((char*)handle);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//ERLANG发送来信息时执行&lt;br /&gt;static void output(ErlDrvData handle, char *buff, int bufflen){&lt;br /&gt;    cout &lt;&lt; buff &lt;&lt; endl;&lt;br /&gt;    char rs[] = "ok";&lt;br /&gt;    data* d = (data*)handle;&lt;br /&gt;    driver_output(d-&gt;port, rs, 2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ErlDrvEntry driver_entry = {&lt;br /&gt;    NULL,    //F_PTR init N/A&lt;br /&gt;    start,   //L_PTR PORT打开时执行此函数&lt;br /&gt;    stop,    //F_PTR PORT关闭时执行此函数&lt;br /&gt;    output,  //F_PTR ERLANG发来信息时执行&lt;br /&gt;    NULL,    //F_PTR ready_input, called when input descriptor ready to read&lt;br /&gt;    NULL,    //F_PTR ready_output&lt;br /&gt;    "test",  //DRIVER名，OPEN_PORT函数的参数&lt;br /&gt;    NULL,    //F_PTR finish, called when unloaded&lt;br /&gt;    NULL,    //F_PTR control, port_command callback&lt;br /&gt;    NULL,    //F_PTR timeout, reserved&lt;br /&gt;    NULL     //F_PTR outputv, reserved&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;extern "C"{&lt;br /&gt;    DRIVER_INIT(test){&lt;br /&gt;        return &amp;driver_entry;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;然后用如下命令编译成共享库：&lt;br /&gt;g++ test.cpp -I/usr/local/lib/erlang/usr/include/ -fPIC -shared -o test.so&lt;br /&gt;&lt;br /&gt;Erlang里调用这个共享库的代码如下：&lt;br /&gt;&lt;pre&gt;-module(test).&lt;br /&gt;-compile(export_all).&lt;br /&gt;&lt;br /&gt;start() -&gt;&lt;br /&gt;    ok = erl_ddll:load_driver(".", "test"),&lt;br /&gt;    Port = open_port({spawn, "test"}, [{packet, 2}]),&lt;br /&gt;    Port ! {self(), {command, "woo just a test"}},&lt;br /&gt;    receive&lt;br /&gt;        {Port, {data, Data}} -&gt;&lt;br /&gt;            ok = io:format("[~p/~p] ~p\n", [?MODULE, self(), Data])&lt;br /&gt;    end,&lt;br /&gt;    Port ! {self(), close}.&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5810580495745080521?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5810580495745080521/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5810580495745080521&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5810580495745080521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5810580495745080521'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/erlang-linked-in-driver.html' title='Erlang Linked in driver'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-3139613286814883965</id><published>2009-05-24T18:13:00.001+08:00</published><updated>2009-05-24T18:14:47.891+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>最近～～</title><content type='html'>今天更新了Ubuntu 9.04，性能好了不少，启动速度明显加快，开了可视化特效，Firefox页面滚动也不卡了～～我的ONDA主板上的集成显卡也能直接识别出来，再也不是“受限驱动”的，声音也很正常，不用自己去ALSA找驱动手动安装，系统安装完就直接有声音出来～～&lt;br /&gt;&lt;br /&gt;一切顺利的话，还有一个月就要去工作了，突然有点不安，不知不觉，原来大学四年时光已经过去了～～ Everything that has a beginning has an end.&lt;br /&gt;&lt;br /&gt;Blogspot依然被封，不过当然我也依然有办法翻墙来继续写博客，只是觉得这个国家又多一样不正常的平常事了，渐渐的，我发现我对这个社会的看法改变了，不再那么愤青，不是因为我不再追求，而是愤青只是一种无能的反应，我们有今天，不是社会的错，是每一个人的错。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-3139613286814883965?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/3139613286814883965/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=3139613286814883965&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3139613286814883965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3139613286814883965'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/blog-post_24.html' title='最近～～'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8731368151651020660</id><published>2009-05-19T18:27:00.000+08:00</published><updated>2009-05-19T18:27:14.344+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>Tail Recursion &amp; ActionScript 3.0</title><content type='html'>貌似AS3.0还未支持尾遞歸，如果執行尾遞歸函數的話，可能會得到如下的堆棧溢出異常：&lt;br /&gt;Error #1023: Stack overflow occurred&lt;br /&gt;&lt;br /&gt;包括在使用Alchemy時的C/C++函數裡如果有遞歸的話也可能會出現堆棧溢出，鬱悶～～唯有改改算法或者等AS4.0吧，聽說4.0會支持尾遞歸～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8731368151651020660?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8731368151651020660/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8731368151651020660&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8731368151651020660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8731368151651020660'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/tail-recursion-actionscript-30.html' title='Tail Recursion &amp; ActionScript 3.0'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8456186718603786417</id><published>2009-05-19T17:08:00.000+08:00</published><updated>2009-05-19T17:08:44.988+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='alchemy'/><title type='text'>sztrace not declared ?</title><content type='html'>今天用Alchemy編譯一個C++文件時，得到如下錯誤：&lt;br /&gt;error: ‘sztrace’ was not declared in this scope&lt;br /&gt;&lt;br /&gt;在c裡面sztrace函數都可以直接使用，怎麼到了c++就出錯了呢... 搜索一下在Adobe Forums裡有如下解答：&lt;br /&gt;sztrace is a C, rather than C++, function.&amp;nbsp; Because your are compiling your code as C++, you must wrap your manual declaration with &lt;b&gt;&lt;span style="font-family: 'courier new',courier;"&gt;extern "C" { }&lt;/span&gt; &lt;/b&gt;so that the function is not given c++ decorations.&lt;br /&gt;&lt;br /&gt;OK，在代碼裡加入如下定義，編譯成功～～&lt;br /&gt;extern "C"{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void sztrace(char*);&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8456186718603786417?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8456186718603786417/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8456186718603786417&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8456186718603786417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8456186718603786417'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/sztrace-not-declared.html' title='sztrace not declared ?'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8887713823142725808</id><published>2009-05-17T10:48:00.000+08:00</published><updated>2009-05-17T10:48:43.612+08:00</updated><title type='text'>Blogger is being GFWed</title><content type='html'>Blogger也撞牆了....Google的服務一個接一個的被拒之牆外，讓人怎麼活下去....然而對于這樣堂而皇之的侵犯，除了鬱悶和無奈，又能做什麼呢？這樣只會讓民眾更加討厭這個黨這個社會，更加討厭你們這群烏合之眾，遺為後世唾罵～～&lt;br /&gt;&lt;br /&gt;我改變不了世界，我改變不了他人，但至少我還能堅持做好自己～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8887713823142725808?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8887713823142725808/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8887713823142725808&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8887713823142725808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8887713823142725808'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/blogger-is-being-gfwed.html' title='Blogger is being GFWed'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-1698917888265321904</id><published>2009-05-15T09:13:00.002+08:00</published><updated>2009-05-15T10:05:31.819+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='alchemy'/><title type='text'>Alchemy之二值化圖像</title><content type='html'>今天試了一下通過Alchemy用C語言來處理FLASH裡的彩色圖像，圖像由Camera採集並將其像素數據以ByteArray格式傳入C函數，C計算圖像的Otsu最優灰度閥值，並據此將圖像轉換為二值化圖像，效果如下：&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_3uGUyB-9ISo/Sgy_pln1TdI/AAAAAAAAERA/3jy6U_8KZdc/s1600-h/ar-test.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_3uGUyB-9ISo/Sgy_pln1TdI/AAAAAAAAERA/3jy6U_8KZdc/s400/ar-test.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;因為所有算法相關的計算都用C實現，因此生成的SWF性能明顯比純AS實現的同樣功能要高效很多很多，幀率為24fps，CPU消耗30%，完全不卡，很爽很爽～～&lt;br /&gt;&lt;br /&gt;有興趣的話可以&lt;a href="http://sites.google.com/site/mfilestation/gong-gong-wen-jian/alchemy-test-binary-image.rar?attredirects=0"&gt;下載源碼和演示&lt;/a&gt;～～&lt;br /&gt;也可以&lt;a href="http://sites.google.com/site/mfilestation/gong-gong-wen-jian/Test.swf?attredirects=0"&gt;點這裡直接在瀏覽器上試試&lt;/a&gt;，需要Flash Player 10&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-1698917888265321904?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/1698917888265321904/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=1698917888265321904&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1698917888265321904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1698917888265321904'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/alchemy_15.html' title='Alchemy之二值化圖像'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3uGUyB-9ISo/Sgy_pln1TdI/AAAAAAAAERA/3jy6U_8KZdc/s72-c/ar-test.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-7926184774528922174</id><published>2009-05-14T19:11:00.001+08:00</published><updated>2009-05-14T19:12:29.491+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='alchemy'/><title type='text'>Alchemy之 Memory to ByteArray</title><content type='html'>Q: 我在C函數裡開了一片內存寫入了些數據，怎樣將這些數據作為ByteArray返回給AS呢？？&lt;br /&gt;A: 可將將數據塊的首指針地址返回給AS以讀取其中數據，具體看下面代碼：&lt;br /&gt;&lt;br /&gt;比如說我們在C裡創建了一個整型數組，要返回給AS：&lt;br /&gt;&lt;pre&gt;static AS3_Val myfun(void *self, AS3_Val args){&lt;br /&gt;    int buffer[4] = {1, 2, 3, 4};&lt;br /&gt;    return AS3_Array("IntType, AS3ValType", AS3_Int(4), &lt;b&gt;AS3_Ptr(buffer)&lt;/b&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;然後在AS裡進行讀取：&lt;br /&gt;&lt;pre&gt;var loader:CLibInit = new CLibInit();&lt;br /&gt;var clib:Object = loader.init();&lt;br /&gt;&lt;br /&gt;var rs:Array = clib.myfun();&lt;br /&gt;var len:init = rs[0];&lt;br /&gt;var ptr:uinit = rs[1];&lt;br /&gt;&lt;br /&gt;&lt;b&gt;var ns:Namespace = new Namespace("cmodule.ModuleName");&lt;br /&gt;var memory:ByteArray = (ns::gstate).ds;&lt;br /&gt;memory.position = ptr;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;var i:int;&lt;br /&gt;for(i = 0; i &lt; len; i ++){&lt;br /&gt;    trace(memory.readInt());&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-7926184774528922174?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/7926184774528922174/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=7926184774528922174&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7926184774528922174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7926184774528922174'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/alchemy-memory-to-bytearray.html' title='Alchemy之 Memory to ByteArray'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2000587741252149430</id><published>2009-05-14T14:31:00.008+08:00</published><updated>2009-05-14T20:59:25.749+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='alchemy'/><title type='text'>Alchemy之讀取AS ByteArray數據類型</title><content type='html'>Alchemy的C API裡沒有直接讀取ByteArray數據類型的方法，但在圖像處理等很多情況下我們都需要用到ByteArray，那C該如何處理ByteArray類型的數據呢？看下面的演示函數：&lt;br /&gt;&lt;pre&gt;//讀取AS傳入的ByteArray類型數據&lt;br /&gt;static AS3_Val readByteArray(void *self, AS3_Val args)&lt;br /&gt;{&lt;br /&gt;    //提取ByteArray&lt;br /&gt;    AS3_Val data = &lt;b&gt;AS3_Undefined&lt;/b&gt;();&lt;br /&gt;    AS3_ArrayValue(args, &lt;b&gt;"AS3ValType"&lt;/b&gt;, &amp;amp;data);&lt;br /&gt;&lt;br /&gt;    //獲取ByteArray長度&lt;br /&gt;    AS3_Val prop = AS3_String("length");&lt;br /&gt;    int length = &lt;b&gt;AS3_IntValue(AS3_Get(data, prop))&lt;/b&gt;;&lt;br /&gt;    &lt;br /&gt;    int i, tmp;&lt;br /&gt;    char buffer[128];&lt;br /&gt;    for (i = 0; i &amp;lt; length; i ++){&lt;br /&gt;        //讀取ByteArray裡的值並輸出到終端顯示&lt;br /&gt;        tmp = AS3_IntValue(AS3_Get(data, AS3_Int(i)));&lt;br /&gt;        sprintf(buffer, "[%d] : %d", i, tmp);&lt;br /&gt;        sztrace(buffer);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    return AS3_Null();&lt;br /&gt;}&lt;/pre&gt;注意一下AS3_Get這個函數，它用于獲取一個AS Object obj的指定屬性prop，屬性用一個AS String字符串來表示，其函數定義為：&lt;br /&gt;&lt;b&gt;AS3_Val AS3_Get(AS3_Val obj, AS3_Val prop)&lt;/b&gt;&lt;br /&gt;如果obj不存在指定屬性，則函數返回NULL&lt;br /&gt;&lt;br /&gt;然後在AS裡寫如下代碼來調用C函數並傳入ByteArray參數：&lt;br /&gt;&lt;pre&gt;//初始化Alchemy&lt;br /&gt;var loader:CLibInit = new CLibInit();&lt;br /&gt;var lib:Object = loader.init();&lt;br /&gt;&lt;br /&gt;//創建一個ByteArray並寫入點數據&lt;br /&gt;var bytes:ByteArray = new ByteArray();&lt;br /&gt;bytes.writeByte(10);&lt;br /&gt;bytes.writeByte(20);&lt;br /&gt;bytes.writeByte(255);&lt;br /&gt;&lt;br /&gt;//調用C函數&lt;br /&gt;&lt;b&gt;lib.readByteArray(bytes)&lt;/b&gt;;&lt;/pre&gt;測試結果如下：&lt;br /&gt;[0] : 10&lt;br /&gt;[1] : 20&lt;br /&gt;[2] : 255&lt;br /&gt;&lt;br /&gt;PS : 另外在C代碼裡，除了AS3_Get(data, AS3_Int(i))外，還可以用如下方法讀取ByteArray：&lt;br /&gt;&lt;pre&gt;unsigned char rs;&lt;br /&gt;AS3_ByteArray_seek(data, 0, SEEK_SET);&lt;br /&gt;AS3_ByteArray_readBytes(&amp;rs, data, 1);&lt;br /&gt;傳說中這樣比較高效～～&lt;br /&gt;&lt;/pre&gt;AS3_ByteArray_seek&lt;br /&gt;AS3_ByteArray_readBytes&lt;br /&gt;AS3_ByteArray_writeBytes&lt;br /&gt;這三個函數是C用來操作ByteArray的，詳細用法請自行參閱Alchemy API&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2000587741252149430?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2000587741252149430/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2000587741252149430&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2000587741252149430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2000587741252149430'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/alchemyas-bytearray.html' title='Alchemy之讀取AS ByteArray數據類型'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-3050962179993547640</id><published>2009-05-14T12:38:00.003+08:00</published><updated>2009-05-14T13:05:01.425+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='alchemy'/><title type='text'>初試 Adobe Alchemy</title><content type='html'>配置好了Alchemy後先去Adobe Labs裡看一看&lt;a href="http://labs.adobe.com/wiki/index.php/Alchemy:Documentation:Getting_Started"&gt;Getting Start Guide&lt;/a&gt;和&lt;a href="http://labs.adobe.com/wiki/index.php/Alchemy:Documentation:Developing_with_Alchemy"&gt;Alchemy API&lt;/a&gt;，下面的例子從AS裡傳入兩個整型參數到C函數中，C計算兩者之和並返回給AS：&lt;br /&gt;&lt;br /&gt;先看看C的代碼：&lt;br /&gt;&lt;pre class="prettyprint lang-c"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;b&gt;#include "AS3.h"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;//供AS調用的函數，args即為AS傳入給C函數的參數&lt;br /&gt;static AS3_Val myfun(void *self, AS3_Val args)&lt;br /&gt;{ &lt;br /&gt;    //提取參數&lt;br /&gt;    int a, b;&lt;br /&gt;    &lt;b&gt;AS3_ArrayValue(args, "IntType, IntType", &amp;a, &amp;b);&lt;/b&gt;&lt;br /&gt;    &lt;br /&gt;    //計算a, b之和，轉換為AS裡的Int數據類型並返回之&lt;br /&gt;    return &lt;b&gt;AS3_Int(a+b)&lt;/b&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;    //定義一個公開給AS調用的函數&lt;br /&gt;    AS3_Val myMethod = AS3_Function(NULL, myfun);&lt;br /&gt;&lt;br /&gt;    //創建一個持有該函數引用的Object&lt;br /&gt;    AS3_Val result = AS3_Object("myfun:AS3ValType", myMethod);&lt;br /&gt;&lt;br /&gt;    //Release&lt;br /&gt;    AS3_Release(myMethod);&lt;br /&gt;&lt;br /&gt;    //告知初始化完成，此方法不會返回&lt;br /&gt;    AS3_LibInit(result);&lt;br /&gt;&lt;br /&gt;    //永遠不會執行到這裡&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;下面是AS代碼：&lt;br /&gt;&lt;pre class="prettyprint lang-as3"&gt;package{&lt;br /&gt;&lt;br /&gt;    import flash.display.Sprite;&lt;br /&gt;    import flash.utils.ByteArray;&lt;br /&gt;    import cmodule.test.CLibInit;&lt;br /&gt;&lt;br /&gt;    public class Test extends Sprite&lt;br /&gt;    {&lt;br /&gt;        public function Test()&lt;br /&gt;        {&lt;br /&gt;            &lt;b&gt;var loader:CLibInit = new CLibInit();&lt;br /&gt;            var lib:Object = loader.init();&lt;br /&gt;            trace(lib.myfun(10, 20));&lt;/b&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;OK，然後編譯一下：&lt;br /&gt;C: gcc test.c -O3 -Wall -swc -o test.swc&lt;br /&gt;AS: mxmlc -library-path+=test.swc Test.as&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-3050962179993547640?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/3050962179993547640/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=3050962179993547640&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3050962179993547640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3050962179993547640'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/adobe-alchemy_14.html' title='初試 Adobe Alchemy'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-1390066677431240664</id><published>2009-05-12T18:44:00.003+08:00</published><updated>2009-05-14T12:39:01.046+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='alchemy'/><title type='text'>[轉載] 划时代的 Adobe Alchemy</title><content type='html'>&lt;div class="blog_content"&gt;此文章转载于天地会的HuangYZ。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Adobe 自从2007年中推出了AS3支持了面向&lt;span class="t_tag"&gt;对象&lt;/span&gt;的开发方式之后, 可谓动作不断. 去年又将AVM2的核心虚拟机tam&lt;span class="t_tag"&gt;ari&lt;/span&gt;n 捐赠给了ECMA4 , 又将FlexBuild2直接升级到FlexBuild3, 这不,在08年末,又蹦出一个 Adobe Alchemy, 这在战略上具有极为重要意义. 而FLASH 从一个简单的&lt;span class="t_tag"&gt;动画&lt;/span&gt;客户端,一跃升级成一个未来富媒体&lt;span class="t_tag"&gt;应用&lt;/span&gt;程序的平台. 从这一系列战略步骤,不难看出ADOBE想成为WEB乃至桌面开发霸主的野心! 微软你要小心了.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;那么你可能要问了, 为什么Alchemy这么重要呢?&amp;nbsp;&amp;nbsp;作为FLASH实践者, &lt;span class="t_tag"&gt;效率&lt;/span&gt;问 题是众所周知的. 因为, FLASH中运行的代码是 ACTIONSCRIPT, 它是一个脚本语言.而这个语言是运行在FLASH内部的AVM2虚拟机上的. 所以它的一些功能都需要经过, 语言解释成AVM2虚拟机字节码,然后AVM2运行字节码,最后由本地NATIVE语言,也就是本机2进制程序执行.虽然这解决了平台无关的问题,但是带 来一个副作用,就是比较慢,这就是为什么FLASH上一直没有杀手级应用的主要原因. &lt;br /&gt;&lt;br /&gt;从本质上来说, 这是一个构架上的问题. 而Alchemy 的出现,从构架上,改进了这个问题,你可以使用C/C++编写核心,快速的&lt;span class="t_tag"&gt;算法&lt;/span&gt;,让AS3进行&lt;span class="t_tag"&gt;调用&lt;/span&gt;, 达到加速的目标. 这在过去,你只能使用ADOVE提供给你的内置native 程序. 现在,你可以自己干这件事情了. 既解决了平台无关的问题,又解决了效率的问题,甚至可以利用FLASH本身几十亿现有的客户端的优势,解决了渠道问题.可以这样说, Alchemy 打开了一个前所未有的时代!&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 让我们看看 Alchemy 到底做什么. 从ADOBE的说明文档上可以看到, Alchemy 是一个 运行在低层的虚拟机 (Low Level Virtual Machine) ,他运行在AVM2之下. 那你又要问了.既然有了一个虚拟AVM2了,为什么还要一个LLVM?&amp;nbsp;&amp;nbsp;其实, LLVM 将C/C++代码进行&lt;span class="t_tag"&gt;编译&lt;/span&gt;, 并且生成RISC-LIKE指令的字节码, 存储在缓冲区之中, 在FLASH运行开始的时候, 实时翻译成机器相关的本地代码. 需要调用的时候是调用翻译之后的2进制本地代码.以此来提高整体速度.这就是LLVM的关键技术, 而运行时译 (Runtime-Compile) 这种技术有点像 .NET . 而这种LLVM和AVM2的区别是, AVM2实时解释运行脚本代码,LLVM 预编译本地运行.可以这样认为 AVM2 是 JAVA虚拟机, LLVM是 .NET虚拟机.他们在构架上处于不同的层次,满足不同需求对速度的要求.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 当生成编译完成后,字节码需要保存在一个缓冲区之内. 由于在框架之内需要和AVM2兼容,所以这个缓冲区,将以 AVM2能识别的BYTEARRAY 形式保存在内存之中. 即使使用反编译工具,反编译这个SWF文件,也看不到任何代码. 并且, alchemy自动生成一个 AS3的接口文件,以方便AS3程序进行调用. 值得注意的是, 所有C/C++编译之后的数据,都以 SWC 函数库的形式生成, 用户可以在自己的工程里 IMPORT.经过使用后发现,由 Alchemy 生成的SWC文件是比较大, 比 C/C++源文件大的多.即使一个只有几十来行的纯C 功能,生成SWC后都会有100多KB. 参考ADOBE的文档上说, 编译C/C++的代码,会将C/C++所需要的所有库,比如C标准库 统统放到一个SWC里去,并且严格遵循POSIX标准. (可移植操作系统接口) 由于这种机制的存在, 我们甚至可以在C/C++里嵌入线程的支持, 来运行同步或者异步的功能. 从而弥补了FLASH是单线程这一不足! 这将是一件美妙的事情! 而本人认为,由于C/C++代码是公用一个C标准库的,所以只要SWC中的功能越多,那么从空间效率上就越是划算. 并且在目前的宽带之下,多个100来KB问题不是太大.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 当然,安全问题,也是alchemy的重头戏, 我们知道, FLASH 对安全问题是有一套非常严格的措施的,比如访问本地资源后,就不能访问远程资源,访问这个域的资源后,就不能访问其他域的资源.如果你要访问,就要在另外 一个域上安装一个沙箱(SecurityBox)文件,才能顺利访问. 而alchemy将C/C++带入FLASH之中,而C/C++ 是否能坏了这个规矩,让应用程序出轨呢? 答案当然是否定的,一旦这个程序被调用之后,其C/C++程序被严格的运行在一LLVM上,LLVM作为一个代理机构,向上,提供了对C/C++的平台支 持,比如独立的内存空间,独立的堆栈空间,独立的线程管理机构,等等. 向下将2进制程序输送到 本机CPU进行执行. 所以安全问题上是非常到位的, 所以对C/C++来说,只要LLVM环境没有提供的,它将永远访问不到.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Adobe已经对 alchemy 进行了比较深度的优化,并且我相信以后将继续下去.就从用户来说,由于有了alchemy 的出现,一些对速度要求较高的算法,都可以使用C/C++来代替. 由于接口上都是AS3的接口,所以移植现有的程序将会非常轻松.比如目前&lt;span class="t_tag"&gt;游戏&lt;/span&gt;开发中广泛使用的那个BitmapData.CopyPixel 如果用C纯代码进行改写,那么速度将提高几十倍之多. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 总结.&amp;nbsp;&amp;nbsp;Alchemy 的出现,开启了一个全新的时代, 未来你将会发现网业上不再是简单画面,而是充满动态的不同的&lt;span class="t_tag"&gt;效果&lt;/span&gt;,给于用户全新的体验.随着LLVM提供的功能加多,比如将显卡硬件的功能作为一个抽象接口提供给C/C++调用,那么将来UNREAL3出现在网页上,你千万不要惊奇.甚至WOW出现在网页上,你也不要惊奇. 因为新时代的门已经打开!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-1390066677431240664?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/1390066677431240664/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=1390066677431240664&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1390066677431240664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1390066677431240664'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/adobe-alchemy.html' title='[轉載] 划时代的 Adobe Alchemy'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-4590195973317730868</id><published>2009-05-12T01:05:00.000+08:00</published><updated>2009-05-12T01:05:05.009+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>[ Erlang + ActionScript ] System Monitor</title><content type='html'>在畢業設計裡加入了一個遠程的服務端負載監測功能，可以遠程查看服務端的當前CPU負載、內存分配等狀況，效果圖如下：&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/_3uGUyB-9ISo/SghZFoUPPuI/AAAAAAAAEQI/fjNUUd_WIRQ/s1600-h/monitor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3uGUyB-9ISo/SghZFoUPPuI/AAAAAAAAEQI/fjNUUd_WIRQ/s400/monitor.png" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;前台用Flex實現，Flex的圖表組件很好用，坐標軸能自動根據數據來調整，不過數據綁定上好像有點問題，數據源更新了圖表卻不會自動刷新～～後台由Erlang提供數據，Erlang的OS_MON模塊可以提供系統CPU負載、內存狀況、硬碟空間使用情況等系統信息～～Erlang通過Socket主動推送JSON格式的數據給客戶端～～有興趣的話可以看看源碼：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/mfilestation/gong-gong-wen-jian/VerseMonitor.mxml?attredirects=0"&gt;客戶端源碼&lt;/a&gt; / &lt;a href="http://sites.google.com/site/mfilestation/gong-gong-wen-jian/monitor.erl?attredirects=0"&gt;服務端源碼&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-4590195973317730868?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/4590195973317730868/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=4590195973317730868&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4590195973317730868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4590195973317730868'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/erlang-actionscript-system-monitor.html' title='[ Erlang + ActionScript ] System Monitor'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3uGUyB-9ISo/SghZFoUPPuI/AAAAAAAAEQI/fjNUUd_WIRQ/s72-c/monitor.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-7088103800012198020</id><published>2009-05-09T17:27:00.006+08:00</published><updated>2009-05-14T14:33:12.609+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang處理JSON數據～～</title><content type='html'>要用Erlang處理JSON數據，先下載這個東東：&lt;br /&gt;&lt;a href="http://www.lshift.net/blog/2007/02/17/json-and-json-rpc-for-erlang"&gt;JSON and JSON-RPC for Erlang&lt;/a&gt;&lt;br /&gt;下載解壓編譯完之後，輸出的beam文件在ebin目錄下～～&lt;br /&gt;&lt;br /&gt;上面下載的包裡有一個rfc4627模塊，提供了JSON數據的encode、decode等方法，還可以將JSON與Erlang Record相互轉換，十分方便快捷，下面看看用法：&lt;br /&gt;&lt;pre&gt;首先試試將字符串轉換為Json Object：&lt;br /&gt;1&gt; JsonBin = &lt;&lt;"{ &lt;br /&gt;1&gt; \"username\":\"Oscar Tong\",&lt;br /&gt;1&gt; \"password\":\"123456\",&lt;br /&gt;1&gt; \"male\":true,&lt;br /&gt;1&gt; \"age\":23&lt;br /&gt;1&gt; }"&gt;&gt;.&lt;br /&gt;&lt;&lt;"{\n\"username\":\"Oscar Tong\",\n\"password\":\"123456\",\n\"male\":true,\n\"age\":23\n}"&gt;&gt;&lt;br /&gt;2&gt; {ok, {obj, JsonObj}, _Rest} = &lt;b&gt;rfc4627:decode&lt;/b&gt;(JsonBin).&lt;br /&gt;{ok,{obj,[{"username",&lt;&lt;"Oscar Tong"&gt;&gt;},&lt;br /&gt;          {"password",&lt;&lt;"123456"&gt;&gt;},&lt;br /&gt;          {"male",true},&lt;br /&gt;          {"age",23}]},&lt;br /&gt;    []}&lt;br /&gt;&lt;br /&gt;再轉換為JSON格式的字符串：&lt;br /&gt;3&gt; &lt;b&gt;rfc4627:encode&lt;/b&gt;({obj,JsonObj}).&lt;br /&gt;"{\"username\":\"Oscar Tong\",\"password\":\"123456\",\"male\":true,\"age\":23}"&lt;/pre&gt;經測試表明，JSON數據的解析與處理速度比XML要快得多，decode和encode僅耗時約40us，比xmerl模塊處理XML需要超過200us相比實在是快多了～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-7088103800012198020?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/7088103800012198020/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=7088103800012198020&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7088103800012198020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7088103800012198020'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/erlangjson.html' title='Erlang處理JSON數據～～'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-4592985322880262615</id><published>2009-05-09T17:09:00.001+08:00</published><updated>2009-05-09T17:10:33.103+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>ActionScript處理JSON數據～～</title><content type='html'>要用ActionScript來處理JSON數據，首先下載這東東：&lt;br /&gt;&lt;a href="http://code.google.com/p/as3corelib/"&gt;as3corelib&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;as3corelib包裡有一個JSON類，可以將一個AS Object轉換為JSON格式的字符串，例如：&lt;br /&gt;&lt;pre&gt;var obj:Object = {&lt;br /&gt;    username : "Oscar Tong",&lt;br /&gt;    password : "123456",&lt;br /&gt;    age : 23,&lt;br /&gt;    male: true,&lt;br /&gt;    contacts: {&lt;br /&gt;        mobile: "13800138000",&lt;br /&gt;        phone: "020-39322849",&lt;br /&gt;        addr: "guangdong university of technology"&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;  &lt;br /&gt;var json:String = &lt;b&gt;JSON.encode(obj)&lt;/b&gt;;&lt;br /&gt;trace(json);&lt;br /&gt;&lt;br /&gt;輸出JSON格式的字符串為：&lt;br /&gt;{"username":"Oscar Tong",&lt;br /&gt; "age":23,&lt;br /&gt; "password":"123456",&lt;br /&gt; "male":true,&lt;br /&gt; "contact":&lt;br /&gt;    {"addr":"guangdong university of technology",&lt;br /&gt;     "phone":"020-39322849",&lt;br /&gt;     "mobile":"13800138000"}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;貌似輸出結果的順序有點亂了，另外JSON還有一個靜態方法decode，可以將JSON格式的字符串轉換為一個AS Object，具體自己看看包裡附帶的reference吧～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-4592985322880262615?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/4592985322880262615/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=4592985322880262615&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4592985322880262615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4592985322880262615'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/actionscriptjson.html' title='ActionScript處理JSON數據～～'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-4292402212001995683</id><published>2009-05-09T13:17:00.001+08:00</published><updated>2009-05-09T13:18:42.264+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>精簡URL以減輕網站流量壓力？</title><content type='html'>這篇文章《&lt;a href="http://www.o3magazine.com/4/a/0/1.html"&gt;Thinking outside the box - Filenames and Web Optimization&lt;/a&gt;》講述了長URL如何吃掉高流量網站大量的帶寬，以及提供了一些解決方法，值得看看～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-4292402212001995683?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/4292402212001995683/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=4292402212001995683&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4292402212001995683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4292402212001995683'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/url.html' title='精簡URL以減輕網站流量壓力？'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-966590902517353874</id><published>2009-05-07T19:45:00.000+08:00</published><updated>2009-05-07T19:45:21.278+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>gen_tcp:controlling_process BADARG error ??</title><content type='html'>今晚嘗試了一下在ERLANG裡將SOCKET鏈接的控制進程轉到另一個節點上去，結果得了一個&lt;b&gt;{error,badarg}&lt;/b&gt;錯誤，代碼如下：&lt;br /&gt;&lt;pre&gt;....&lt;br /&gt;{ok, Sock} = gen_tcp:accept(Listener),&lt;br /&gt;Pid = spawn(SomeOtherNode, Mod, Fun, Arg),&lt;br /&gt;ok = gen_tcp:controlling_process(Sock, Pid),&lt;br /&gt;....&lt;/pre&gt;看來想用這種方式來將眾多SOCKET鏈接的壓力分擔到多個節點上是不行的 -____- |||&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-966590902517353874?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/966590902517353874/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=966590902517353874&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/966590902517353874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/966590902517353874'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/gentcpcontrollingprocess-badarg-error.html' title='gen_tcp:controlling_process BADARG error ??'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-7419795423544786814</id><published>2009-05-06T18:06:00.000+08:00</published><updated>2009-05-06T18:06:27.195+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang的進程信息過濾</title><content type='html'>Erlang進程之間可以通過收發信息來通信，有時可能有一堆信息從各處無序的湧來，你只想處理其中部分信息，而將其他的保留在進程的收件箱裡遲點再管，那該怎麼搞呢？其實很簡單的，看下面代碼：&lt;br /&gt;&lt;pre&gt;...&lt;br /&gt;wait_for_reply() -&gt;&lt;br /&gt;    receive&lt;br /&gt;        {reply, Reply} -&gt; handle(Reply);&lt;br /&gt;        _Other -&gt; wait_for_reply()&lt;br /&gt;    end.&lt;/pre&gt;上述函數僅處理匹配{reply, Reply}格式的信息，其他信息因為唯一的匹配模式是一個被忽略的參數_Other，因此不會被處理而繼續留在收件箱裡～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-7419795423544786814?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/7419795423544786814/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=7419795423544786814&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7419795423544786814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7419795423544786814'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/erlang.html' title='Erlang的進程信息過濾'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8958059622459916549</id><published>2009-05-02T20:52:00.000+08:00</published><updated>2009-05-02T20:52:56.600+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang : head mismatch ??</title><content type='html'>今天編譯代碼的時候出現了一個奇怪的問題，erlang老提示某個函數有head mismatch錯誤，但我看來看去沒發現什麼不對哇，函數的定義和調用都沒錯～～最後發現原來是因為函數放置了在兩個重名函數之間，即：&lt;br /&gt;&lt;pre&gt;出錯前：&lt;br /&gt;myfun(params1) -&gt; .... ;&lt;br /&gt;myfun(params2) -&gt; .... .&lt;br /&gt;&lt;br /&gt;這樣就會提示錯誤了：&lt;br /&gt;myfun(params1) -&gt; .... ;&lt;br /&gt;&lt;b&gt;new_fun_here(params) -&gt; .... .&lt;/b&gt;&lt;br /&gt;myfun(params2) -&gt; .... .&lt;/pre&gt;把新函數放到其他地方就OK了～～粗心之過～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8958059622459916549?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8958059622459916549/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8958059622459916549&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8958059622459916549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8958059622459916549'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/05/erlang-head-mismatch.html' title='Erlang : head mismatch ??'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-3629760588550922852</id><published>2009-04-30T14:06:00.005+08:00</published><updated>2009-05-04T14:13:15.794+08:00</updated><title type='text'>畢業相～～</title><content type='html'>&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="600" height="400" flashvars="host=picasaweb.google.com&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fmooooscar%2Falbumid%2F5330324218272195633%3Fkind%3Dphoto%26alt%3Drss" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;昨天拍了畢業照，感覺....好复雜～～覺得自己已經唔再系學校既一份子，本應系一個喜慶的日子，我卻總覺得自己....似乎未准備好～～Anyway, tomorrow will be a better day, I guess.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-3629760588550922852?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/3629760588550922852/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=3629760588550922852&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3629760588550922852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3629760588550922852'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/blog-post_30.html' title='畢業相～～'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-6032628089453529433</id><published>2009-04-27T01:14:00.002+08:00</published><updated>2009-04-27T01:16:54.841+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Reload Erlang Module</title><content type='html'>有时模块代码更新并编译后，需要重新载入才能生效，此时可以在erlang shell里输入如下：&lt;br /&gt;&lt;pre&gt;&gt; &lt;span style="font-weight:bold;"&gt;l(my_module)&lt;/span&gt;.&lt;br /&gt;{module, my_module)&lt;/pre&gt;&lt;br /&gt;输入&lt;span style="font-weight:bold;"&gt;help().&lt;/span&gt;还可以查看更多的erlang shell命令～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-6032628089453529433?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/6032628089453529433/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=6032628089453529433&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6032628089453529433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6032628089453529433'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/reload-erlang-module.html' title='Reload Erlang Module'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-4966091806966528972</id><published>2009-04-26T16:43:00.007+08:00</published><updated>2009-04-26T17:04:22.013+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Embed Prezi into your website</title><content type='html'>Prezi系一個很有特色的在線動態簡報服務，詳細簡介見&lt;a href="http://mooooscar.blogspot.com/2009/04/prezi.html"&gt;這里&lt;/a&gt;～～&lt;br /&gt;本文講解如何將Prezi嵌入到你的個人blog或其他网站里，首先打開你的Prezi主頁，點擊要嵌入的簡報，選擇Share，然后將右下角的link填入如下代碼的src里，然后在你的网頁上插入下面的代碼就OK了～～&lt;br /&gt;&lt;pre&gt;&amp;lt;iframe height="360" src="http://prezi.com/6272/view" width="480"&amp;gt&amp;lt/iframe&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3uGUyB-9ISo/SfQgUpw9ffI/AAAAAAAAB48/1SIDOOIRKO0/s1600-h/embed-prezi.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 252px;" src="http://2.bp.blogspot.com/_3uGUyB-9ISo/SfQgUpw9ffI/AAAAAAAAB48/1SIDOOIRKO0/s400/embed-prezi.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5328919798266822130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;嵌入效果如下：&lt;br /&gt;&lt;iframe height="360" src="http://prezi.com/45428/view" width="480"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;PS：很喜歡Prezi，可惜啊惡心的网路經常出問題，很多有創意的WebApp就是卡死了在网速上～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-4966091806966528972?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/4966091806966528972/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=4966091806966528972&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4966091806966528972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4966091806966528972'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/embed-prezi-into-your-website.html' title='Embed Prezi into your website'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3uGUyB-9ISo/SfQgUpw9ffI/AAAAAAAAB48/1SIDOOIRKO0/s72-c/embed-prezi.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-9120430976620680076</id><published>2009-04-26T14:27:00.003+08:00</published><updated>2009-04-26T14:39:31.848+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>在Erlang啟動時執行一系列操作</title><content type='html'>可以將任意的Erlang代碼放入HOME目錄里的.erlang文件中，當Erlang啟動時，它就會自動執行該文件里的命令，例如：&lt;br /&gt;&lt;pre&gt;io:format("Erlang is running ....\n").&lt;br /&gt;code:add_patha("."),&lt;br /&gt;code:add_pathz("/home/m/bin").&lt;/pre&gt;&lt;br /&gt;啟動erlang時，可以看到如下輸出：&lt;br /&gt;&lt;pre&gt;$ erl&lt;br /&gt;Erlang (BEAM) emulator version 5.6.5 [source] [smp:2] [async-threads:0] [hipe] [kernel-poll:false]&lt;br /&gt;&lt;br /&gt;Erlang is running ....&lt;br /&gt;Eshell V5.6.5  (abort with ^G)&lt;br /&gt;1&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;如果當前目錄下也有一個.erlang文件，則會優先于HOME目錄下的那個，這樣就可以在不同啟動位置定制不同的行為：&lt;br /&gt;&lt;br /&gt;如果你不知道系統的HOME目錄的位置，可以看看Erlang認為的HOME目錄在哪里：&lt;br /&gt;&lt;pre&gt;1&gt; init:get_argument(home).&lt;br /&gt;{ok,[["/home/m"]]}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-9120430976620680076?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/9120430976620680076/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=9120430976620680076&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/9120430976620680076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/9120430976620680076'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/erlang_7806.html' title='在Erlang啟動時執行一系列操作'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5692174684263925590</id><published>2009-04-26T14:12:00.005+08:00</published><updated>2009-04-26T14:37:45.407+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>設置Erlang裝載代碼的路徑</title><content type='html'>&lt;b&gt;code:get_path()&lt;/b&gt; 查看當前的裝載路徑：&lt;br /&gt;&lt;pre&gt;code:get_path().&lt;br /&gt;["ebin",".","/usr/local/lib/erlang/lib/kernel-2.12.5/ebin",&lt;br /&gt; "/usr/local/lib/erlang/lib/stdlib-1.15.5/ebin",&lt;br /&gt; "/usr/local/lib/erlang/lib/xmerl-1.1.10/ebin",&lt;br /&gt; "/usr/local/lib/erlang/lib/webtool-0.8.3.2/ebin",&lt;br /&gt; "/usr/local/lib/erlang/lib/typer-0.1.5/ebin",&lt;br /&gt; "/usr/local/lib/erlang/lib/tv-2.1.4.2/ebin",&lt;br /&gt; "/usr/local/lib/erlang/lib/tools-2.6.2/ebin",&lt;br /&gt; "/usr/local/lib/erlang/lib/toolbar-1.3.0.1/ebin",&lt;br /&gt; "/usr/local/lib/erlang/lib/test_server-3.2.4/ebin",&lt;br /&gt; "/usr/local/lib/erlang/lib/syntax_tools-1.5.6/ebin",&lt;br /&gt; "/usr/local/lib/erlang/lib/ssl-3.10/ebin",&lt;br /&gt; "/usr/local/lib/erlang/lib/ssh-1.0.2/ebin",&lt;br /&gt; [...]|...]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;code:add_patha(Dir) -&gt; true | {error, bad_directory}&lt;/b&gt;&lt;br /&gt;添加新目錄Dir到裝載路徑列表的開頭&lt;br /&gt;&lt;br /&gt;&lt;b&gt;code:add_pathz(Dir) -&gt; true | {error, bad_directory}&lt;/b&gt;&lt;br /&gt;添加新目錄Dir到裝載路徑列表的尾部&lt;br /&gt;&lt;br /&gt;如果怀疑裝載了錯誤的模塊，可以調用函數code:all_loaded()查看所有己加載的模塊列表，或者調用code:clash()&lt;br /&gt;&lt;br /&gt;也可以在啟動Erlang的時候指定代碼載入路徑：&lt;br /&gt;&lt;b&gt;&gt; erl -pa Dir1 -pa Dir2 ... -pz DirK1 -pz DirK2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;其中-pa將目錄添加到搜索路徑的開頭，而-pz則把目錄加到路徑的末尾～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5692174684263925590?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5692174684263925590/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5692174684263925590&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5692174684263925590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5692174684263925590'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/erlang_26.html' title='設置Erlang裝載代碼的路徑'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2371115192525536597</id><published>2009-04-26T08:42:00.003+08:00</published><updated>2009-04-26T09:11:00.311+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang的Makefile～～</title><content type='html'>Erlang有一個類似makefile的Emakefile文件，用于編譯項目，當我們在Erlang虛擬机里執行make:all()或輸入shell命令erl -make時，Erlang會搜索當前目錄下的Emakefile文件，并按其設置編譯一個或多個模塊。Emakefile內容格式如下：&lt;br /&gt;&lt;pre&gt;{Modules, Options}&lt;/pre&gt;&lt;br /&gt;Modules即需要編譯的模塊（atom），可以是模塊的文件名，如：mymod；&lt;br /&gt;也可以是其他目錄中的模塊名，如：/somefolder/mymod；&lt;br /&gt;也可以使用通配符來指定一組模塊名，如：my*；&lt;br /&gt;還可以是上述種種的列表，如：['mymod', '/somefolder/mymod', 'my*']；&lt;br /&gt;Options是編譯參數，詳細可參見compile模塊，下面几個比較常用：&lt;br /&gt;&lt;br /&gt;&lt;b&gt;debug_info&lt;/b&gt;&lt;br /&gt;在輸出的beam文件里包含debug調試信息，諸如Debugger、Xref、Cover的工具需要使用這些信息，&lt;b&gt;BUT&lt;/b&gt;可以從這些調試信息里重构出源代碼，用debuf_info_key選項可以加密debug信息以防止泄露源代碼；&lt;br /&gt;&lt;br /&gt;&lt;b&gt;{i, "/path/to/include"}&lt;/b&gt;&lt;br /&gt;導入文件所在的目錄；&lt;br /&gt;&lt;br /&gt;&lt;b&gt;{outdir, "ebin"}&lt;/b&gt;&lt;br /&gt;指定編譯輸出路徑。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2371115192525536597?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2371115192525536597/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2371115192525536597&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2371115192525536597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2371115192525536597'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/erlangmakefile.html' title='Erlang的Makefile～～'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2787943948005355644</id><published>2009-04-25T10:32:00.005+08:00</published><updated>2009-04-25T23:00:52.888+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>［转］Erlang开发建议(杂记版)</title><content type='html'>&lt;div style="padding: 4px; background-color: rgb(195, 217, 255);"&gt;&lt;h3 style="margin: 0px 3px; font-family: sans-serif;"&gt;由 Oscar Tang 透過 Google 閱讀器傳送給您：&lt;/h3&gt;&lt;/div&gt; &lt;div style="margin: 0px 1px; padding-top: 1px; background-color: rgb(195, 217, 255); font-size: 1px ! important; line-height: 0px ! important;"&gt; &lt;/div&gt; &lt;div style="margin: 0px 2px; padding-top: 1px; background-color: rgb(195, 217, 255); font-size: 1px ! important; line-height: 0px ! important;"&gt; &lt;/div&gt; &lt;div style="margin: 0px 10px; overflow: auto; font-family: sans-serif;"&gt;&lt;h2 style="margin: 0.25em 0pt 0pt;"&gt;&lt;div class=""&gt;&lt;a href="http://erlangdisplay.javaeye.com/blog/374167"&gt;Erlang开发建议(杂记版)&lt;/a&gt;&lt;/div&gt;&lt;/h2&gt; &lt;div style="margin-bottom: 0.5em;"&gt;經由 &lt;a href="http://erlangdisplay.javaeye.com/" class="f"&gt;Erlang Display - erlang:display(All_About_Erlang)&lt;/a&gt; litaocheng 著 (日期為 2009/4/24)&lt;/div&gt;  以下是在erlang项目开发中的一些记录，即包含很多通俗易懂的原则，也包含一些似是而非的建议，比较混乱，还没有积累到一个可以分门别类的地步，各位就将就看吧..&lt;br /&gt;:)&lt;br /&gt;&lt;br /&gt;* 确保没有任何编译警告&lt;br /&gt;&lt;br /&gt;* Erlang中String采用list实现，32位系统中，其1个字符用8个字节的空间（4个保存value, 4个保存指针)。因此string速度较慢，空间占用较大&lt;br /&gt;&lt;br /&gt;* 在Server中，总是尽力书写尾递归(tail-recursive)的函数&lt;br /&gt;&lt;br /&gt;* 使用'++'时，left list会被拷贝，然后添加到right list的头部，因此最好把length较短的list放在左侧&lt;br /&gt;&lt;br /&gt;* 避免使用regexp，如果需要正则表达式，请使用re&lt;br /&gt;&lt;br /&gt;* timer模块的大部分函数实现，依赖于一个process，如果过多使用timer，会导致这个process负载过大，影响效率。推荐使用erlang:send_after/3及erlang:start_timer/3&lt;br /&gt;&lt;br /&gt;* 避免使用list_to_atom/1，因为erlang中atom数量最大为1048576, 且不进行GC控制。因此如果持续性的调用list_to_atom/1，可能很容易达到系统上限，从而导致emulator terminate。请使用list_to_existing_atom/1。&lt;br /&gt;&lt;br /&gt;* list内部实现为一个列表，因此length(List), 需要遍历整个list比较耗时&lt;br /&gt;&lt;br /&gt;* 对于不同的数据类型，使用不同的size函数：tuple_size/1, byte_size/1, bit_size/1&lt;br /&gt;&lt;br /&gt;* 使用binary match来进行binary的分割，而不使用split_binary/2&lt;br /&gt;&lt;br /&gt;* 如果两个list都拥有很多数据，那么请不要使用'--'，而是将数据转化到ordsets，然后调用ordsets:substract/2.&lt;br /&gt;&lt;br /&gt;* 对于binary相关操作可以进行binary优化（bin_opt_info编译选项）代码框架：&lt;br /&gt;&lt;br /&gt;*   f(&amp;lt;&amp;lt;Pattern1,...,Rest/bits&amp;gt;&amp;gt;,...) -&amp;gt;&lt;br /&gt;   ... % Rest is not used here&lt;br /&gt;   f(Rest,...);&lt;br /&gt;f(&amp;lt;&amp;lt;Pattern2,...,Rest/bits&amp;gt;&amp;gt;,...) -&amp;gt;&lt;br /&gt;  ... % Rest is not used here&lt;br /&gt;  f(Rest,...);&lt;br /&gt;...&lt;br /&gt;f(&amp;lt;&amp;lt;&amp;gt;&amp;gt;, ...) -&amp;gt;&lt;br /&gt;  ReturnValue.&lt;br /&gt;&lt;br /&gt;* 调用lists:flatten/1可以将list扁平化，这个操作代价很大，比'++'还要昂贵。下面这些时候我们可以避免：&lt;br /&gt;将数据发送给port时&lt;br /&gt;调用list_bo_binary/1和iolist_to_binary前&lt;br /&gt;&lt;br /&gt;* 小的函数可以让您方便的找出错误的函数和代码&lt;br /&gt;&lt;br /&gt;* 不要在同一行出现相同的符号&lt;br /&gt;20    some_fun() -&amp;gt;&lt;br /&gt;21       L = [{key1, v1}, {key2, [some_record#v21, v22]}],&lt;br /&gt;22      ...&lt;br /&gt;编译时，会提示line 21 '[' 语法错误， 因为21行有多个 '[' ，所以这个bug不能准确定位，你需要花时间去排查代码。&lt;br /&gt;好的做法是：&lt;br /&gt;20 some_fun() -&amp;gt;&lt;br /&gt;21      L = [{key1, v1},&lt;br /&gt;22            {key2, [some_record#v21, v22]}&lt;br /&gt;23            ],&lt;br /&gt;  ...&lt;br /&gt;这样，编译其会提示你 line 22 '[' 语法错误，你很开就知道是那个地方错了。&lt;br /&gt;&lt;br /&gt;* 使用 CTRL ＋ \ 或 init:stop()， 可以退出Erlang， 使用CTRL ＋ G 及 CTRL + C 弹出菜单选项，可以选择是否退出Erlang。&lt;br /&gt;其中CTRL ＋ G可以用来连接其他的shell， CTRL ＋ C可以查看其他一些系统信息&lt;br /&gt;Ctrl + C abort 是野蛮的退出方式&lt;br /&gt;&lt;br /&gt;* use "open_port({fd,0,2}, [out])" make erlang program write standard error to unix system&lt;br /&gt;&lt;br /&gt;* If you don't run experiments before you start designing a new system, your entire system will be an experiment!&lt;br /&gt;&lt;br /&gt;* standard data structure desc:&lt;br /&gt;&lt;br /&gt;Module  Description&lt;br /&gt;sets  sets, i.e. a collection of unique elements.&lt;br /&gt;gb_sets sets, but based on a general balanced data structure&lt;br /&gt;gb_tree a general balanced tree&lt;br /&gt;dict  maps, also called associative arrays&lt;br /&gt;ets  hash tables and ordered sets (trees)&lt;br /&gt;dets  on-disk hash tables&lt;br /&gt;&lt;br /&gt;Suggestion：&lt;br /&gt;elments count: 0 － 100 | 100 - 10000  |  10000 -&lt;br /&gt;our select   :  list   |      ets     |  gb_tree&lt;br /&gt;&lt;br /&gt;* 通过code:clash/0 检测代码中是否有module冲突现象（sticky)&lt;br /&gt;&lt;br /&gt;* epmd -d -d 启动 epmd 可以查看erlang node之间的通讯&lt;br /&gt;&lt;br /&gt;* 将正常的逻辑代码和错误处理代码分离，发生错误时，尽管错误。由另一个错误处理模块进行处理&lt;br /&gt;&lt;br /&gt;* 类似于操作系统，我们的程序也可以分为kernel 和 user 两层， 对于kernel绝对不能出现错误， 对于user可以出现错误，进行恢复&lt;br /&gt;&lt;br /&gt;* process顶层loop涉及的代码及函数，最好在一个module中实现&lt;br /&gt;&lt;br /&gt;* process 的register name和module名称一致， 便于寻找代码&lt;br /&gt;&lt;br /&gt;* 每个process具有一个单一的角色，比如：supervisor 用来进行错误恢复， work 工作者，可以出现错误， trusted worker 不会出现错误&lt;br /&gt;&lt;br /&gt;* 通过函数调用可以实现的功能，就不要使用sever实现（如gen_server, 及类似的loop 实现）&lt;br /&gt;&lt;br /&gt;* 给消息加一个tag，在发生错误的时候，可以定位到消息，同时也有利于程序的稳健&lt;br /&gt;&lt;br /&gt;* 在消息循环中，对于unknown的消息，请调用lib:flush_receive/0 将其清除，减轻process msg queue的长度&lt;br /&gt;&lt;br /&gt;* server中总是书写尾递归的循环&lt;br /&gt;&lt;br /&gt;* 尽量使用record， 而不是原始的tuple来表现数据结构， 在使用record时，使用select match：&lt;br /&gt;#person{name = Name, age = Age} = Person&lt;br /&gt;&lt;br /&gt;* 对于返回值，最好也添加一个tag，用来说明返回值类型，或者执行成功与否&lt;br /&gt;&lt;br /&gt;* 尽可能少的使用catch和try，在erlang程序中，不推荐主动捕获异常。只有当我们的逻辑特别复杂，我们可以使用throw来返回数据，使用catch来获取返回值。&lt;br /&gt;&lt;br /&gt;* 当然程序与外界交互，外界数据不可靠时，需要使用catch和try&lt;br /&gt;&lt;br /&gt;* 慎重使用process dictory， 当你使用get/1, put/1时，你的应用会具有很大的slide effect。可以通过加入一个新的参数来保存原本需要存储到process dictory中数据&lt;br /&gt;&lt;br /&gt;* 如果不想使自己糊涂，请不要使用import&lt;br /&gt;&lt;br /&gt;* 使用export时，将功能类似的接口组合在一起，并添加合理的注视，这样你的接口更清晰，别人使用起来更方便&lt;br /&gt;&lt;br /&gt;* 不要书写嵌套太深的代码&lt;br /&gt;&lt;br /&gt;* 不要书写太长的module&lt;br /&gt;&lt;br /&gt;* 不要书写太长的函数&lt;br /&gt;&lt;br /&gt;* 每行代码不能太长&lt;br /&gt;&lt;br /&gt;* 避免使用 "_" 匿名变量，请为每个变量选择有意义的名称，如够某个变量暂时不使用，请以下划线 "_" 开始&lt;br /&gt;&lt;br /&gt;* {error, enfile} enfile error in socket 是以为内linux系统中 ulimit 限制， 在root下修改：ulimit -n 25000&lt;br /&gt;&lt;br /&gt;* {error, enotconn} 表示socket已经关闭&lt;br /&gt;&lt;br /&gt;* 在erlang开发时，慎重使用macro，因为erlang的single assign的缘故，同时调用某个marco，而macro又定义了某个变量，可能导致badmatch错误。&lt;br /&gt;比如：&lt;br /&gt;-define(ADDLINEINFO1(F),&lt;br /&gt;    (&lt;br /&gt;    begin&lt;br /&gt;    Str1 = lists:concat(["[Mod:", ?MODULE, " Line:", ?LINE, "]"]),&lt;br /&gt;    Str1 ++ F&lt;br /&gt;    end&lt;br /&gt;    )).&lt;br /&gt;-define(WARN(Log, F, D), log4erl:warn(Log, ?ADDLINEINFO(F), D)).&lt;br /&gt;如果连续使用 WARN, 会出现此错误&lt;br /&gt;&lt;br /&gt;* erlang中可以定义很多环境变量：&lt;br /&gt;ERL_MAX_ETS_TABLES 设置最大的ets数目 默认1400&lt;br /&gt;ERL_MAX_PORTS erlang最大的port数目 默认1024&lt;br /&gt;&lt;br /&gt;* .app文件中的start_phases， 选项既可以用来作为include applications之间的同步启动，也可以用来对单个application进行分布启动。&lt;br /&gt;顺序如下&lt;br /&gt;包含included app:&lt;br /&gt;&lt;br /&gt;application:start(prim_app)&lt;br /&gt;=&amp;gt; prim_app_cb:start(normal, [])&lt;br /&gt;=&amp;gt; prim_app_cb:start_phase(init, normal, [])&lt;br /&gt;=&amp;gt; prim_app_cb:start_phase(go, normal, [])&lt;br /&gt;=&amp;gt; incl_app_cb:start_phase(go, normal, [])&lt;br /&gt;ok&lt;br /&gt;&lt;br /&gt;无included app:&lt;br /&gt;application:start(prim_app)&lt;br /&gt;=&amp;gt; prim_app_cb:start(normal, [])&lt;br /&gt;=&amp;gt; prim_app_cb:start_phase(init, normal, [])&lt;br /&gt;=&amp;gt; prim_app_cb:start_phase(go, normal, [])&lt;br /&gt;ok&lt;br /&gt;&lt;br /&gt;* 任何时候，都要重视函数的返回值，通过match确保您的预期，如果发生错误，那么就大胆的表达出来。                                        &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div style="margin: 0px 2px; padding-top: 1px; background-color: rgb(195, 217, 255); font-size: 1px ! important; line-height: 0px ! important;"&gt; &lt;/div&gt; &lt;div style="margin: 0px 1px; padding-top: 1px; background-color: rgb(195, 217, 255); font-size: 1px ! important; line-height: 0px ! important;"&gt; &lt;/div&gt; &lt;div style="padding: 4px; background-color: rgb(195, 217, 255);"&gt;&lt;h3 style="margin: 0px 3px; font-family: sans-serif;"&gt;您可以在這裡操作的事項：&lt;/h3&gt; &lt;ul style="font-family: sans-serif;"&gt;&lt;li&gt;使用 &lt;b&gt;Google 閱讀器&lt;/b&gt;&lt;a href="http://www.google.com/reader/view/feed%2Fhttp%3A%2F%2Ferlangdisplay.javaeye.com%2Frss?source=email"&gt;訂閱 Erlang Display - erlang:display(All_About_Erlang)&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.google.com/reader/?source=email"&gt;開始使用 Google 閱讀器&lt;/a&gt;，&lt;b&gt;&lt;/b&gt;輕鬆掌握所有您最愛網站的最新資訊&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt; &lt;div style="margin: 0px 1px; padding-top: 1px; background-color: rgb(195, 217, 255); font-size: 1px ! important; line-height: 0px ! important;"&gt; &lt;/div&gt; &lt;div style="margin: 0px 2px; padding-top: 1px; background-color: rgb(195, 217, 255); font-size: 1px ! important; line-height: 0px ! important;"&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2787943948005355644?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2787943948005355644/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2787943948005355644&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2787943948005355644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2787943948005355644'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/erlang_25.html' title='［转］Erlang开发建议(杂记版)'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8691581195031080575</id><published>2009-04-23T00:38:00.003+08:00</published><updated>2009-04-23T00:54:02.911+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Embedding Resource with AS 3.0</title><content type='html'>哇，用了ActionScript那么久，现在才发现原来Embed那么有用～～可以直接嵌入外部图片，或是外部SWF内的元件，直接用嵌入的资源作为类来创建实例，例如：&lt;br /&gt;&lt;pre&gt;[Embed(source="....jpg")]&lt;br /&gt;private var MyImage:Class;&lt;br /&gt;....&lt;br /&gt;var img:Bitmap = &lt;span style="font-weight:bold;"&gt;new MyImage()&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;[Embed(source="....swf", symbol="SomeSymbolId")]&lt;br /&gt;private var MySymbol:Class;&lt;br /&gt;....&lt;br /&gt;var sym:Sprite = &lt;span style="font-weight:bold;"&gt;new MySymbol()&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8691581195031080575?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8691581195031080575/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8691581195031080575&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8691581195031080575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8691581195031080575'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/embedding-resource-with-as-30.html' title='Embedding Resource with AS 3.0'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8975390821585050539</id><published>2009-04-22T01:47:00.002+08:00</published><updated>2009-04-22T02:11:59.655+08:00</updated><title type='text'>What's my purpose ?</title><content type='html'>越來越近畢業，覺得每一天都有那麼多想做的事情，那麼多想學的東東，卻只剩下這麼少的時間～～最近一直听某人說A公司薪水多高B部門福利多好C城市生活多悠閒....感覺像是讀完大學就能過無憂的生活，不同的家庭環境養出來的人想法果然不同，難道讀20年書，學一身技術，就只為了高薪厚祿？為什么我們要重复又重复他人走過的路？&lt;br /&gt;&lt;br /&gt;考到間不錯的大學，找到份体面的工作，朋友都覺得我前程無憂，家人都對我寄予厚望，但我卻感受不到畢業生應有的興奮，反而系有點后悔，后悔大學這四年學得太少太少了....&lt;br /&gt;&lt;br /&gt;What's my purpose ? Where should I go ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8975390821585050539?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8975390821585050539/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8975390821585050539&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8975390821585050539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8975390821585050539'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/whats-my-purpose.html' title='What&apos;s my purpose ?'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-6089250485079780233</id><published>2009-04-22T01:23:00.003+08:00</published><updated>2009-04-22T01:45:59.781+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Prezi 在线动态简报</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3uGUyB-9ISo/Se4CppmDbdI/AAAAAAAAB4c/mrbGU51usng/s1600-h/prezi.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 227px;" src="http://2.bp.blogspot.com/_3uGUyB-9ISo/Se4CppmDbdI/AAAAAAAAB4c/mrbGU51usng/s400/prezi.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5327198323789229522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://prezi.com"&gt;Prezi&lt;/a&gt;系一個可縮放旋轉的在線動態簡報，比傳統的PowerPoint效果好好多，由于系基于FLASH的，所有文本和圖案內容都可以無限量伸縮，過渡效果十分有動感，可以將內容更好的關聯和展示～～可惜Prezi貌似比較多限制，雖然簡報可以下載，但免費用戶卻只能下載3次....分享協作功能也不如Google Docs～～不過總体來說還是創意十足的，有點衝動山寨一個～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-6089250485079780233?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/6089250485079780233/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=6089250485079780233&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6089250485079780233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6089250485079780233'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/prezi.html' title='Prezi 在线动态简报'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3uGUyB-9ISo/Se4CppmDbdI/AAAAAAAAB4c/mrbGU51usng/s72-c/prezi.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8097691931741991594</id><published>2009-04-17T16:03:00.004+08:00</published><updated>2009-04-17T16:22:03.017+08:00</updated><title type='text'>Firefox翻墙记之Youtube篇～～</title><content type='html'>Youtube貌似被封好久了，十分郁悶，无奈只好翻墙了，Firefox有一个插件Gladder可以自动用代理访问被GFW墙了的网站，不过进得了Youtube却还是看不到视频，欺人太甚了！不能在线播，我下载来看！一搜发现一个Youtube视频下载服务&lt;a href="http://www.keephd.com"&gt;KeepHD&lt;/a&gt;，哈哈下载速度还不错～～&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3uGUyB-9ISo/Seg5OB4oCII/AAAAAAAAB4U/-nv-6bvvrO8/s1600-h/keephd.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 86px;" src="http://3.bp.blogspot.com/_3uGUyB-9ISo/Seg5OB4oCII/AAAAAAAAB4U/-nv-6bvvrO8/s400/keephd.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5325569472552503426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;这个主仆颠倒的国家，什么时候连我们判断是非利害的权力都让给那些狗奴才了？凭什么你们说封就封说禁就禁？&lt;br /&gt;This country needs a little change.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8097691931741991594?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8097691931741991594/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8097691931741991594&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8097691931741991594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8097691931741991594'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/firefoxyoutube.html' title='Firefox翻墙记之Youtube篇～～'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3uGUyB-9ISo/Seg5OB4oCII/AAAAAAAAB4U/-nv-6bvvrO8/s72-c/keephd.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5936982362181807904</id><published>2009-04-15T16:29:00.003+08:00</published><updated>2009-04-15T17:17:32.160+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>How to use Erlang SSL Socket</title><content type='html'>首先要用OpenSSL生成私鑰和證書：&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;openssl genrsa -des3 -out privkey.pem 2048&lt;/span&gt;&lt;br /&gt;生成一個長2048 bit的私鑰，并用密碼以DES算法加密該私鑰，最后輸出為名為privkey.pem的文件。&lt;br /&gt;如果加密了該私鑰，則每次使用的時候都需要提供密碼，如果不需要密碼保謢，去掉-des3參數就可以了～～&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;openssl req -new -x509 -key privkey.pem -out cert.pem -days 1020&lt;/span&gt;&lt;br /&gt;生成一個自簽的測試用證書，輸出為文件cert.pem，有效期為1020天。&lt;/pre&gt;&lt;br /&gt;然后用Erlang的SSL模塊實現一個ssl socket server和client：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-module(test).&lt;br /&gt;-export([start/0, connect/0]).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;%啟動SSL服務&lt;br /&gt;start() -&gt;&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;application:start(ssl)&lt;/span&gt;,&lt;br /&gt;    ssl:seed("seed-every-time"),&lt;br /&gt;    {ok, spawn(fun() -&gt; start_server() end)}.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;%運行SSL SOCKET SERVER&lt;br /&gt;start_server() -&gt;&lt;br /&gt;    &lt;br /&gt;    %創建socket server&lt;br /&gt;    {ok, ListenSocket} = &lt;span style="font-weight:bold;"&gt;ssl:listen&lt;/span&gt;(51020, [&lt;br /&gt;        binary, {active, true},&lt;br /&gt;        {keyfile, "privkey.pem"},&lt;br /&gt;        {certfile, "cert.pem"}]),&lt;br /&gt;    io:format("SSL socket server is ready\n", []),&lt;br /&gt;&lt;br /&gt;    %接受客戶端連接&lt;br /&gt;    {ok, Sock} = &lt;span style="font-weight:bold;"&gt;ssl:transport_accept&lt;/span&gt;(ListenSocket),&lt;br /&gt;    ok = &lt;span style="font-weight:bold;"&gt;ssl:ssl_accept&lt;/span&gt;(Sock),&lt;br /&gt;    io:format("New ssl client is connected\n", []),&lt;br /&gt;    loop_client(Sock).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;%處理來自客戶端的信息&lt;br /&gt;loop_client(Sock) -&gt;&lt;br /&gt;    receive&lt;br /&gt;        {ssl, Sock, Data} -&gt;&lt;br /&gt;            io:format("Receive : ~p\n", [Data]),&lt;br /&gt;            ssl:send(Sock, Data),&lt;br /&gt;            loop_client(Sock);&lt;br /&gt;        {ssl_closed, Sock} -&gt; io:format("Client ~p is discionnected\n", [Sock]);&lt;br /&gt;        {ssl_errlr, Sock, Reason} -&gt; io:format("ERROR : ~p\n", [Reason])&lt;br /&gt;    end.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;%客戶端進行連接&lt;br /&gt;connect() -&gt;&lt;br /&gt;    {ok, Sock} = ssl:connect("localhost", 51020, [bianry]),&lt;br /&gt;    io:format("connected\n", []),&lt;br /&gt;    ssl:send(Sock, "this is just a test"),&lt;br /&gt;    receive&lt;br /&gt;        Any -&gt;&lt;br /&gt;            io:format("client receive : ~p\n", [Any])&lt;br /&gt;    end,&lt;br /&gt;    ssl:close(Sock),&lt;br /&gt;    io:format("client closed\n", []).&lt;/pre&gt;&lt;br /&gt;測試一下能否正常運行：&lt;br /&gt;1&gt; c(test).&lt;br /&gt;{ok,test}&lt;br /&gt;&lt;br /&gt;2&gt; test:start().&lt;br /&gt;{ok,&lt;0.46.0&gt;}&lt;br /&gt;SSL server socket is ready&lt;br /&gt;&lt;br /&gt;3&gt; test:connect().&lt;br /&gt;New ssl client connected&lt;br /&gt;connected&lt;br /&gt;Receive : &lt;&lt;"this is just a test"&gt;&gt;&lt;br /&gt;client receive : {ssl,{sslsocket,6,&lt;0.50.0&gt;},&lt;&lt;"this is just a test"&gt;&gt;}&lt;br /&gt;client closed&lt;br /&gt;ok&lt;br /&gt;Client {sslsocket,7,&lt;0.49.0&gt;} is disconnected&lt;br /&gt;&lt;br /&gt;哈哈，一切正常～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5936982362181807904?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5936982362181807904/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5936982362181807904&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5936982362181807904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5936982362181807904'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/how-to-use-erlang-ssl-socket.html' title='How to use Erlang SSL Socket'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-9079023188453049267</id><published>2009-04-13T20:57:00.001+08:00</published><updated>2009-04-13T21:04:59.686+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang Term Comparisons</title><content type='html'>Erlang的比较运算符如下：&lt;br /&gt;&lt;pre&gt;== 等于&lt;br /&gt;/= 不等于&lt;br /&gt;=&lt; 小于或等于&lt;br /&gt;&lt;  小于&lt;br /&gt;&gt;= 大于或等于&lt;br /&gt;&gt;  大于&lt;br /&gt;=:= 完全等于&lt;br /&gt;=/= 完全不等于&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-9079023188453049267?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/9079023188453049267/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=9079023188453049267&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/9079023188453049267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/9079023188453049267'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/erlang-term-comparisons.html' title='Erlang Term Comparisons'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2199662920555642216</id><published>2009-04-12T15:04:00.002+08:00</published><updated>2009-04-12T15:13:12.165+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang list item searching</title><content type='html'>使用lists:keysearch函数可以方便的对一个[{key, value}, ....]列表里的指定key进行搜索，函数定义如下：&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight:bold;"&gt;keysearch(Key, N, TupleList)&lt;/span&gt; -&gt; {value, Tuple} | false&lt;br /&gt;    Key = term()&lt;br /&gt;    N = 1..tuple_size(Tuple)&lt;br /&gt;    TupleList = [Tuple]&lt;br /&gt;        Tuple = tuple()&lt;/pre&gt;&lt;br /&gt;比如说我们有这样的一个列表：&lt;br /&gt;&lt;pre&gt;&gt; Attributes = [{to, "jojo@verse.com"},&lt;br /&gt;                {from, "oscar@verse.com/school"},&lt;br /&gt;                {type, "chat"},&lt;br /&gt;                {'xml:lang', "en"}].&lt;br /&gt;&lt;br /&gt;&gt; lists:keysearch(from, 1, Attributes).&lt;br /&gt;{value, {from, "oscar@verse.com/school"}}&lt;br /&gt;&lt;br /&gt;若指定Key不存在则返回false&lt;br /&gt;&gt; lists:keysearch(not_exist, 2, Attributes).&lt;br /&gt;false&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2199662920555642216?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2199662920555642216/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2199662920555642216&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2199662920555642216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2199662920555642216'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/erlang-list-item-searching.html' title='Erlang list item searching'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8731401077743327909</id><published>2009-04-11T21:57:00.002+08:00</published><updated>2009-04-11T22:11:33.438+08:00</updated><title type='text'>-____- |||</title><content type='html'>又一次要用这无语的表情做标题，楼下那恶心的工行ATM机，逢一三五故障二四六吞卡周末必坏.... 西区上万人就放两台ATM，让大家经常大排长龙，远在教学区边缘鸟都不飞去的野地里就放一堆，还有人工服务台，实在是让人郁闷～～&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3uGUyB-9ISo/SeClClN0faI/AAAAAAAAB2A/pEkTwdrtCSI/s1600-h/IMG0035A.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_3uGUyB-9ISo/SeClClN0faI/AAAAAAAAB2A/pEkTwdrtCSI/s400/IMG0035A.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5323436223320325538" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8731401077743327909?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8731401077743327909/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8731401077743327909&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8731401077743327909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8731401077743327909'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/blog-post_146.html' title='-____- |||'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3uGUyB-9ISo/SeClClN0faI/AAAAAAAAB2A/pEkTwdrtCSI/s72-c/IMG0035A.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2548330760162484791</id><published>2009-04-11T20:37:00.002+08:00</published><updated>2009-04-11T20:42:51.388+08:00</updated><title type='text'>最近～～</title><content type='html'>自从找到工作之后，体重一直直线上升，上年年底面试时买的西裤，现在穿上已经有点勉强了....学习越忙工作越多越是觉得空虚，可能系因为离开家、离开你，已经太长时间了～～难得周末夜，喝口咖啡，放松一下吧～～&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3uGUyB-9ISo/SeCQN9PceMI/AAAAAAAAB14/LDg4Zj6_fEU/s1600-h/4867cca6e97ac654c4e3e.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://2.bp.blogspot.com/_3uGUyB-9ISo/SeCQN9PceMI/AAAAAAAAB14/LDg4Zj6_fEU/s400/4867cca6e97ac654c4e3e.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5323413329003968706" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2548330760162484791?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2548330760162484791/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2548330760162484791&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2548330760162484791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2548330760162484791'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/blog-post_11.html' title='最近～～'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3uGUyB-9ISo/SeCQN9PceMI/AAAAAAAAB14/LDg4Zj6_fEU/s72-c/4867cca6e97ac654c4e3e.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2758197561534834735</id><published>2009-04-11T14:31:00.002+08:00</published><updated>2009-04-11T15:19:21.596+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='mnesia'/><title type='text'>Mnesia 事件处理</title><content type='html'>Mnesia会产生两类事件：系统事件（system events）和表事件（table events），用户可创建一个进程来订阅Mnesia所产生的事件，有如下两个相关的函数：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;mnesia:subscribe(EventCategory)&lt;/span&gt;&lt;br /&gt;当有事件发生时发送一个事件的copy给调用此函数的进程。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;mnesia:unsubscribe(EventCategory)&lt;/span&gt;&lt;br /&gt;取消事件订阅，不再接收Mnesia产生的事件。&lt;br /&gt;&lt;br /&gt;EventCategory可以是system、{table, Tab, simple}或{table, Tab, detailed}。事件会以进程间消息的形式发送给订阅了Mnesia事件的进程，系统事件的格式为{mnesia_system_event, Event}，表事件的格式则为{mnesia_table_event, Event}。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;System Events&lt;/span&gt;&lt;br /&gt;系统事件有如下几种：&lt;br /&gt;&lt;br /&gt;{mnesia_up, Node}&lt;br /&gt;Mnesia在节点Node上被启动；&lt;br /&gt;&lt;br /&gt;{mnesia_down, Node}&lt;br /&gt;Mnesia在节点Node上停止了运行；&lt;br /&gt;&lt;br /&gt;{mnesia_checkpoint_activated, Checkpoint}&lt;br /&gt;一个与本节点相关的checkpoint被激活了；&lt;br /&gt;&lt;br /&gt;{mnesia_checkpoint_deactivated, Checkpoint}&lt;br /&gt;一个与本节点相关的checkpoint被激死（:P）了～～&lt;br /&gt;&lt;br /&gt;{mnesia_overload, Details}&lt;br /&gt;本节点上的Mnesia负载过重，可能因为对硬碟的读写请求超过了Mnesia的处理能力，如果不做任何处理可能会导致硬碟空间不足；也可能是Mnesia处理事务的速度跟不上事务的请求速度，事务堆栈可能会越来越大，直至耗尽内存或请求速度减缓。对存在异地备份或位于远程节点上的表发起大量的脏操作（dirty updates）时也可能会引发此事件；&lt;br /&gt;&lt;br /&gt;{inconsistent|_database, Context, Node}&lt;br /&gt;Mnesia发现数据库可能存在不一致的情况；&lt;br /&gt;&lt;br /&gt;{mnesia_fatal, Format, Args, BinaryCore}&lt;br /&gt;Mnesia发生了致命错误，即将在短时间内终止；&lt;br /&gt;&lt;br /&gt;{mnesia_info, Format, Args}&lt;br /&gt;调试系统时，Mnesia发现了一些应用程序可能感兴趣的东东；&lt;br /&gt;&lt;br /&gt;{mnesia_error, Format, Args}&lt;br /&gt;Mnesia发生了错误；&lt;br /&gt;&lt;br /&gt;{mnesia_user, Event}&lt;br /&gt;某应用程序触发了函数mnesia:report_event(Event)，可用于调试Mnesia。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;Table Events&lt;/span&gt;&lt;br /&gt;表事件在数据表被更新时发生，分为simple和detailed两种，simple事件包括：&lt;br /&gt;&lt;br /&gt;{write, NewRecord, ActivityId}&lt;br /&gt;有新记录被写入；&lt;br /&gt;&lt;br /&gt;{delete_object, OldRecord, ActivityId}&lt;br /&gt;记录OldRecord可能被删除了（可能？），如果表类型为bag，则可能还存在其他与OldRecord主键相同的记录；&lt;br /&gt;&lt;br /&gt;{delete, {Tab, Key}, ActivityId}&lt;br /&gt;一个或多个记录可能被删除了（可能？？），表里所有主键为Key的记录都已被删除；&lt;br /&gt;&lt;br /&gt;detailed事件包括：&lt;br /&gt;&lt;br /&gt;{write, Table, NewRecord, [OldRecords], ActivityId}&lt;br /&gt;有新记录被写入；&lt;br /&gt;&lt;br /&gt;{delete, Table, What, [OldRecords], ActivityId}&lt;br /&gt;可能有记录被删除（又是可能....），What可能是{Table, Key}或{RecordName, Key, ....}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2758197561534834735?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2758197561534834735/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2758197561534834735&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2758197561534834735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2758197561534834735'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/mnesia_11.html' title='Mnesia 事件处理'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-3900841964803492134</id><published>2009-04-11T13:51:00.002+08:00</published><updated>2009-04-11T14:22:11.827+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='mnesia'/><title type='text'>用qlc进行数据排序与筛选</title><content type='html'>Erlang有一个类似SQL的数据检索机制，叫做QLC（Query Interface to Mnesia, ETS, Dets, etc），可用于对Mnesia、ETS/DETS的数据表进行数据检索，包括常见的按指定域排序（ORDER BY）、按条件筛选（WHERE...）以及限制返回的结果长度（COUNT）。看个简单的例子：&lt;br /&gt;&lt;pre&gt;-module(test).&lt;br /&gt;-export([start/0]).&lt;br /&gt;-include_lib("stdlib/include/qlc.hrl").&lt;br /&gt;&lt;br /&gt;start() -&gt;&lt;br /&gt;    QH1 = qlc:q([{X, Y} || X &lt;- [8,3,6,2], Y &lt;- [b,a,c]]),&lt;br /&gt;    %以第一个值作为key进行排序&lt;br /&gt;    QH2 = qlc:keysort(1, QH1, [{order, ascending}]),&lt;br /&gt;    QC = qlc:cursor(QH2),&lt;br /&gt;    %获取前两条记录&lt;br /&gt;    qlc:next_answers(QC, 2),&lt;br /&gt;    %获取剩余的其他记录&lt;br /&gt;    qlc:next_answers(QC, all_remainning).&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-3900841964803492134?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/3900841964803492134/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=3900841964803492134&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3900841964803492134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3900841964803492134'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/qlc.html' title='用qlc进行数据排序与筛选'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-3516163374323191263</id><published>2009-04-11T01:56:00.002+08:00</published><updated>2009-04-11T02:15:53.765+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='otp'/><title type='text'>Supervisor也崩溃了？？</title><content type='html'>今天测试程序的时候出现了一个怪问题：我用一个supervisor（sup）去监督一个gen_server（test）的工作，test崩溃后被重启了，但随即sup也跟着崩溃了，导致整棵监督树倒了...郁闷，检查错误报告（见下）发现test仅仅被重启了一次，不是因为重启次数过多而使得sup崩溃～～&lt;br /&gt;&lt;pre&gt;=ERROR REPORT==== 11-Apr-2009::01:51:47 ===&lt;br /&gt;** Generic server test terminating &lt;br /&gt;** Last message in was error&lt;br /&gt;** When Server state == []&lt;br /&gt;** Reason for termination == &lt;br /&gt;** error&lt;br /&gt;gen_server test is started （test重启时所输出的信息）&lt;br /&gt;** exception exit: {error,{gen_server,call,[test,error]}}&lt;br /&gt;    in function  gen_server:call/2&lt;br /&gt;13&gt; &lt;br /&gt;=ERROR REPORT==== 11-Apr-2009::01:51:47 ===&lt;br /&gt;** &lt;span style="font-weight:bold;"&gt;Generic server sup terminating&lt;/span&gt; &lt;br /&gt;** Last message in was {'EXIT',&lt;0.54.0&gt;,&lt;br /&gt;    {{error,{gen_server,call,[test,error]}},&lt;/pre&gt;&lt;br /&gt;可见sup系因为收到‘EXIT’信息才崩溃的，大白天谁无缘无故发个‘EXIT’信息出来？Google一番后在Google Groups里找到解答如下：&lt;br /&gt;&lt;br /&gt;在erlshell里测试，需要unlink supervisor，这是因为在shell里运行时，进程层次状况如下：&lt;br /&gt;&lt;pre&gt;shell&lt;br /&gt;    eval_loop&lt;br /&gt;        sup&lt;/pre&gt;&lt;br /&gt;这几个进程是link起来的，如不unlink，在出错时eval_loop会退出重启，导致sup收到{'EXIT', Pid, _}而发生退出。 &lt;br /&gt;&lt;br /&gt;OK，据此稍为修改监督者的启动函数即可：&lt;br /&gt;&lt;pre&gt;{ok, Pid} = supervisor:start_link({local, sup}, sup, []),&lt;br /&gt;unlink(Pid).&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-3516163374323191263?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/3516163374323191263/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=3516163374323191263&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3516163374323191263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3516163374323191263'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/supervisor.html' title='Supervisor也崩溃了？？'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-29213823550337746</id><published>2009-04-10T22:36:00.002+08:00</published><updated>2009-04-10T22:51:01.322+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='mnesia'/><title type='text'>动态增删Mnesia数据库节点</title><content type='html'>Mnesia支持动态的增删节点以进行数据转移或备份：&lt;br /&gt;&lt;pre&gt;首先启动新节点上面的mnesia&lt;br /&gt;&gt; rpc:call(Node, mnesia, start, []).&lt;br /&gt;添加新节点&lt;br /&gt;&gt; {ok, _} = mnesia:change_config(extra_db_nodes, [Node]).&lt;br /&gt;修改新节点上的schema表的类型&lt;br /&gt;&gt; {atomic, ok} = mnesia:change_table_copy_type(schema, Node, disc_copies).&lt;/pre&gt;&lt;br /&gt;OK，现在可以在新节点上添加表备份、分块等等了，如果不再需要某个节点，可以这样删除节点：&lt;br /&gt;&lt;pre&gt;首先关闭该节点上的mnesia&lt;br /&gt;&gt; rpc:call(Node, mnesia, stop, []).&lt;br /&gt;删掉该节点上的schema表&lt;br /&gt;&gt; {atomic, ok} = mnesia:del_table_copy(schema, Node).&lt;br /&gt;&gt; ok = mnesia:delete_schema([Node]).&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-29213823550337746?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/29213823550337746/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=29213823550337746&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/29213823550337746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/29213823550337746'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/mnesia.html' title='动态增删Mnesia数据库节点'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2908508594552971943</id><published>2009-04-10T20:39:00.002+08:00</published><updated>2009-04-10T20:49:15.122+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>record_info不能接受參數？</title><content type='html'>Q：有如下函數：&lt;br /&gt;&lt;pre&gt;1&gt; rd(test, {key, value}).&lt;br /&gt;2&gt; Arg = test.&lt;br /&gt;3&gt; record_info(fields, test).&lt;br /&gt;[key, value]&lt;br /&gt;4&gt; record_info(fields, Arg).&lt;br /&gt;* 1: illegal record info&lt;/pre&gt;&lt;br /&gt;Arg跟記錄名test系一樣的，為什么传入record_info里會提示错误呢？？&lt;br /&gt;&lt;br /&gt;A：转Google Goups - [erlang-questions]上的一段解答：&lt;br /&gt;record_info is not a proper function. It only exists during compilation, which means that it cannot take variable arguments:&lt;br /&gt;&lt;br /&gt;record_info(fields, address) %% works&lt;br /&gt;Rec = address,&lt;br /&gt;record_info(fields, Rec) %% doesn't work!&lt;br /&gt;&lt;br /&gt;Of course it only works if the address record is defined in that module. If you do want a function that uses record_info, try to use a macro instead.&lt;br /&gt;&lt;br /&gt;定義成Macro就可以？馬上試試先：&lt;br /&gt;&lt;pre&gt;-record(test, {key, value}).&lt;br /&gt;-define(FIELDS(Record), record_info(fields, Record)).&lt;br /&gt;....&lt;br /&gt;?FIELDS(test).&lt;br /&gt;&gt; [key, value]&lt;/pre&gt;&lt;br /&gt;哇哇，果然OK哦～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2908508594552971943?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2908508594552971943/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2908508594552971943&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2908508594552971943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2908508594552971943'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/recordinfo.html' title='record_info不能接受參數？'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-3821372086290865584</id><published>2009-04-10T17:03:00.002+08:00</published><updated>2009-04-10T17:12:04.816+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='mnesia'/><title type='text'>Local Content Tables</title><content type='html'>分布於多個節點上的同一個表，在各節點的備份上都保持有相同的數据，不過呢有時可能需要同一個表在不同節點備份上有不同的內容，這時就需要用到Local Content Tables了～～&lt;br /&gt;&lt;br /&gt;如果我們創建表的時候將其屬性設置為&lt;span style="font-weight:bold;"&gt;{local_content, true}&lt;/span&gt;，表同樣會分布多個備份到我們所指定的節點上，但寫操作僅會影響本地節點，不會同步到其他節點的備份上。另外當mnesia啟動時，這樣的表也僅會從本地讀取初始化數据，不會等待其他節點上的備份～～&lt;br /&gt;&lt;br /&gt;感覺有點像表的分塊哦～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-3821372086290865584?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/3821372086290865584/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=3821372086290865584&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3821372086290865584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3821372086290865584'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/local-content-tables.html' title='Local Content Tables'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-3260336894279316576</id><published>2009-04-10T13:45:00.013+08:00</published><updated>2009-04-10T18:39:34.025+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='mnesia'/><title type='text'>Mnesia Table Fragmentation</title><content type='html'>&lt;span style="font-weight:bold; font-size:140%;"&gt;The Concept&lt;/span&gt;&lt;br /&gt;Mnesia支持將一個龐大的數据表分割為多個分塊，每個分塊跟一個普通的表一樣，可以備份可以創建索引等。讀寫數据的時候，Mnesia通過mnesia_frag模塊（一個mnesia_access callback behaviour）來定位實際數据位于哪個分塊里：首先mnesia_frag根据記錄的key記算一個hash值，然后根据該hash值決定表分塊的名稱，最后用普通的數据庫讀寫函數來堆該表分塊進行讀寫。若事前不知道記錄的key，則mnesia會搜索所有的分塊來尋找匹配的記錄。&lt;br /&gt;&lt;br /&gt;下面的代碼描述如何將一個已存在的mnesia數据表轉化為一個分塊的表，以及如何動態的添加新分塊：&lt;br /&gt;&lt;pre&gt;(a@oscar) 1&gt; mnesia:start().&lt;br /&gt;ok&lt;br /&gt;&lt;br /&gt;當前有a、b、c三個節點正在運行&lt;br /&gt;(a@oscar) 2&gt; mnesia:system_info(running_db_nodes).&lt;br /&gt;[b@oscar, c@oscar, a@oscar]&lt;br /&gt;&lt;br /&gt;創建一個表dictionary&lt;br /&gt;(a@oscar) 3&gt; Tab = dictionary.&lt;br /&gt;(a@oscar) 4&gt; mnesia:create_table(Tab, [{ram_copies, [a@oscar, b@oscar]}]).&lt;br /&gt;{atomic, ok}&lt;br /&gt;(a@oscar) 5&gt; Write = fun(Keys) -&gt; [mnesia:write({Tab, K, -K}) || K &lt;- Keys], ok end.&lt;br /&gt;#Fun&lt;....&gt;&lt;br /&gt;(a@oscar) 6&gt; mnesia:activity(sync_dirty, Write, [lists:seq(1, 256)], mnesia_frag).&lt;br /&gt;ok&lt;br /&gt;&lt;br /&gt;啟動表分塊&lt;br /&gt;(a@oscar) 7&gt; mnesia:&lt;span style="font-weight:bold;"&gt;change_table_frag&lt;/span&gt;(Tab, {activate, []}).&lt;br /&gt;{atomic, ok}&lt;br /&gt;&lt;br /&gt;查看一下与分塊相關屬性&lt;br /&gt;(a@oscar) 8&gt; mnesia:table_info(Tab, frag_properties).&lt;br /&gt;[{base_table, dictionary},&lt;br /&gt; {foreign_key, undefined},&lt;br /&gt; {n_doubles, 0},&lt;br /&gt; {n_fragments, 1},&lt;br /&gt; {next_n_to_split, 1},&lt;br /&gt; {node_pool, [a@oscar, b@oscar, c@oscar]}]&lt;br /&gt;&lt;br /&gt;添加分塊&lt;br /&gt;(a@oscar) 9&gt; Info = fun(Item) -&gt; mnesia:table_info(Tab, Item) end.&lt;br /&gt;#Fun&lt;....&gt;&lt;br /&gt;(a@oscar) 10&gt; Dist = mnesia:activity(sync_dirty, Info, [&lt;span style="font-weight:bold;"&gt;frag_dist&lt;/span&gt;], &lt;span style="font-weight:bold;"&gt;mnesia_frag&lt;/span&gt;).&lt;br /&gt;[{c@oscar,0}, {a@oscar,1}, {b@oscar, 1}]&lt;br /&gt;(a@oscar) 11&gt; mnesia:&lt;span style="font-weight:bold;"&gt;change_table_frag&lt;/span&gt;(Tab, {&lt;span style="font-weight:bold;"&gt;add_frag&lt;/span&gt;, Dist}).&lt;br /&gt;{atomic, ok}&lt;br /&gt;&lt;br /&gt;再添加兩個分塊&lt;br /&gt;(a@oscar) 12&gt; Dist2 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).&lt;br /&gt;[{b@oscar, 1}, {c@oscar, 1}, {a@oscar, 2}]&lt;br /&gt;(a@oscar) 13&gt; mnesia:change_table_frag(Tab, {add_frag, Dist2}).&lt;br /&gt;{atomic, ok}&lt;br /&gt;(a@oscar) 14&gt; Dist3 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).&lt;br /&gt;[{a@oscar, 2}, {b@oscar, 2}, {c@oscar, 2}]&lt;br /&gt;(a@oscar) 15&gt; mnesia:change_table_frag(Tab, {add_frag, Dist3}).&lt;br /&gt;{atomic, ok}&lt;br /&gt;&lt;br /&gt;從分塊里讀取數据&lt;br /&gt;(a@oscar) 16&gt; Read = fun(Key) -&gt; mnesia:read({Tab, Key}) end.&lt;br /&gt;#Fun&lt;....&gt;&lt;br /&gt;(a@oscar) 17&gt; mnesia:activity(transaction, Read, [12], mnesia_frag).&lt;br /&gt;[{dictionary, 12, -12}]&lt;br /&gt;&lt;br /&gt;查看各分塊所包含的數据量&lt;br /&gt;(a@oscar) 18&gt; mnesia:activity(sync_dirty, Info, [frag_size], mnesia_frag).&lt;br /&gt;[{dictionary, 64},&lt;br /&gt; {dictionary_frag2, 64},&lt;br /&gt; {dictionary_frag3, 64},&lt;br /&gt; {dictionary_frag3, 64}]&lt;br /&gt;（哇，這么均衡～～）&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;Fragmentation Properties&lt;/span&gt;&lt;br /&gt;可調用&lt;span style="font-weight:bold;"&gt;mnesia:table_info(Tab, frag_properties)&lt;/span&gt;函數來查看指定表的分塊清況，包含如下屬性（不全）：&lt;br /&gt;&lt;br /&gt;{n_fragments, Int}：當前表包含有多少個分塊，此屬性可在創建表時設定，或由{add_frag, NodesOrDist}、del_frag等操作所修改，默認值為1。&lt;br /&gt;&lt;br /&gt;{node_pool, List}：分塊節點池，可在表創建時指定，或由{add_node, Node}、{del_node, Node}等操作所修改，在創建數据表的時候，mnesia會將表的分塊平均的分布到節點池里的各個節點上，默認為mnesia:system_info(db_nodes)的返回值。&lt;br /&gt;&lt;br /&gt;{n_ram_copies, Int}：設定每個分塊應該有多少個ram_copies型備份，默認為0，但若n_disc_copies和n_disc_only_copies都為0，則此屬性會默認為1。&lt;br /&gt;&lt;br /&gt;{n_disc_copies, Int}：設定每個分塊應有多少個disc_copies型備份，默認為0。&lt;br /&gt;&lt;br /&gt;{n_disc_only_copies, Int}：設定每個分塊應有多少個disc_only_copies型備份，默認為0。&lt;br /&gt;&lt;br /&gt;{hash_module, Atom}：此屬性允許用戶指定一個散列模式（hashing schema），此模塊必須實現mnesia_frag_hash回調行為（callback behaviour），默認為mnesia_frag_hash。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;Management of Fragmented Tables&lt;/span&gt;&lt;br /&gt;函數&lt;span style="font-weight:bold;"&gt;mnesia:change_table_frag(Tab, Change)&lt;/span&gt;用于修改分塊表的配置，其中Change可能為如下值：&lt;br /&gt;&lt;br /&gt;{activate, FragProps}：激活已存在表的分塊机制，FragProps應為{node_pool, Nodes}或[]。&lt;br /&gt;&lt;br /&gt;deactivate：關閉表的分塊机制，其分塊數必須為1。&lt;br /&gt;&lt;br /&gt;{add_frag, NodesOrDist}：向分塊表添加一個新的分塊，其中一個舊分塊里的數据會被重新散列，它們中的約一半會被搬到新的分塊上去。所有其他含有指向該表的外鍵的分塊表都會自動得到一個新分塊，并按同樣的方式重新分布數据。&lt;br /&gt;NodesOrDist可以是一列節點，或函數mnesia:table_info(Tab, frag_dist)的返回值，NodesOrDist應該是一個有序的數組，其中最适合放置新分塊的節點放在最前面的位置，新的分塊會得到与第一個分塊同樣數量的備份。&lt;br /&gt;&lt;br /&gt;del_frag：從分塊表里刪除一個分塊，最后一個分塊的所有數据都會被搬到另一個分塊里。&lt;br /&gt;&lt;br /&gt;{add_node, Node}：向node_pool里添加一個新節點，新的節點池會改變函數mnesia:table_info(Tab, frag_dist)的返回值。&lt;br /&gt;&lt;br /&gt;{del_node, Node}：從node_pool里刪除一個節點，同樣也會改變函數mnesia:table_info(Tab, frag_dist)的返回值。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-3260336894279316576?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/3260336894279316576/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=3260336894279316576&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3260336894279316576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3260336894279316576'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/mnesia-table-fragmentation.html' title='Mnesia Table Fragmentation'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8956541713874467599</id><published>2009-04-09T15:46:00.006+08:00</published><updated>2009-04-11T01:40:50.231+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='otp'/><title type='text'>Erlang OTP - Supervisor</title><content type='html'>supervisor behaviour用于实现层状监督树机制，包含一套标准的接口函数和追踪错误等的功能，监督者负责启动、停止和监督其子进程的工作，子进程可以是一个工作进程，也可以是一个子监督者，监督者机制的基本理念是通过自动重启子进程而保证其能正常持续的对外提供服务。&lt;br /&gt;&lt;br /&gt;监督者的子进程由child specifications列表定义，当监督者启动时，其子进程将按该列表顺序从左到右启动，监督者终止运行时，其子进程将按相反方向关闭，最后终止监督者自己。子进程列表定义如下：&lt;br /&gt;&lt;pre&gt;child_spec() = {Id, StartFunc, Restart, Shutdown, Type, Modules}&lt;br /&gt;    Id = term()&lt;br /&gt;    StartFunc = {M, F, A}&lt;br /&gt;        M = F = atom()&lt;br /&gt;        A = [term()]&lt;br /&gt;    Restart = permanent | transient | temporary&lt;br /&gt;    Shutdown = brutal_kill | int()&gt;=0 | infinity&lt;br /&gt;    Type = worker | supervisor&lt;br /&gt;    Modules = [Module] | dynamic&lt;br /&gt;        Module = atom()&lt;/pre&gt;&lt;br /&gt;其中Id是监督者内部标识该子进程的名称，StartFunc定义了启动该子进程所需调用的函数，这个启动函数必须创建并连接到一个子进程，然后返回{ok, Child}或{ok, Child, Info}，Child是子进程的pid，Info会被监督者所忽略；如果子进程因某些原因未能启动可返回ignore；如果发生了错误也可以返回一个{error, Error}。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Restart&lt;/span&gt;定义了子进程何时将会被重启：&lt;br /&gt;permanent：无论子进程因何终止都应被重启；&lt;br /&gt;temporary：无须重启子进程；&lt;br /&gt;transient：仅在子进程因非正常原因终止时才重启子进程。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Shutdown&lt;/span&gt;定义了子进程应被如何终止：&lt;br /&gt;brutal_kill：使用exit(Child, kill)强制终止；&lt;br /&gt;int()&gt;=0：监督者调用exit(Child, shutdown)告知子进程终止并等待其终止信号，若超过指定时间尚未收到再调用exit(Child, kill)来强制终止；&lt;br /&gt;infinity：如果子进程为一个子监督者，则应将超时时间设定为infinity，以让其有充足时间来终止其子监督树。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Type&lt;/span&gt;定义了子进程是一个监督者还是一个工作进程。&lt;br /&gt;&lt;br /&gt;监督者对子进程的重启方式（Restart Strategy）有如下几种：&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;one_for_one&lt;/span&gt;：如果一个子进程终止了，则只需重启该子进程；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;one_for_all&lt;/span&gt;：如果一个子进程终止了，所有其他子进程都将被终止，然后重启所有子进程；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;rest_for_one&lt;/span&gt;：如果一个子进程终止了，则按启动顺序比其晚启动的其他子进程都将被终止，然后该子进程和被终止掉的其他子进程都会被重启；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;simple_one_for_one&lt;/span&gt;：是one_for_one的简化版，该监督者的所有子进程都是动态加入的，并且每个子进程类型都相同，都运行一样的代码。&lt;br /&gt;&lt;br /&gt;为了避免监督者陷入子进程被不停的终止－重启的死循环，每个监督者都有一个最大重启频度（maximum restart frequency），由参数MaxR和MaxT所决定，如果在MaxT秒内发生多于MaxR次子进程重启，则监督者会终止其所有子进程和它本身。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;Callback Module&lt;/span&gt;&lt;br /&gt;supervisor behaviour的回调模块僅包含一个回调函数init/1：&lt;br /&gt;&lt;pre&gt;init(_Args) -&gt;&lt;br /&gt;    {ok, {{RestartStrategy, MaxR, MaxT}, [ChildSpec]}}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size: 140%"&gt;Starting a Supervisor&lt;/span&gt;&lt;br /&gt;监督者通过调用函数supervisor:start_link/2来启动，如下：&lt;br /&gt;&lt;pre&gt;supervisor:start_link(MODULE, []).&lt;/pre&gt;&lt;br /&gt;MODULE为该监督者的回调模块，第二个参数为传入到回调函数init/1里的参数。如果想为该监督者注册个名字，也可以用下面这个函数来启动：&lt;br /&gt;&lt;pre&gt;supervisor:start_link(&lt;span style="font-weight:bold;"&gt;{local, Name}&lt;/span&gt;, Module, Args) 或&lt;br /&gt;supervisor:start_link(&lt;span style="font-weight:bold;"&gt;{global, Name}&lt;/span&gt;, Module, Args)&lt;/pre&gt;&lt;br /&gt;启动后，监督者会调用回调模块里的init/1函数，并根据该函数的返回值启动其子进程，注意supervisor:start_link这函数不是异步的，要直到所有子进程都启动后才会返回。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%"&gt;Adding a Child Process&lt;/span&gt;&lt;br /&gt;监督树可以是静态的，也可以是动态的，我们可以随时加入新的子进程到监督树中：&lt;br /&gt;&lt;pre&gt;supervisor:start_child(Sup, ChildSpec)&lt;/pre&gt;&lt;br /&gt;其中Sup是监督者的pid或注册名，ChildSpec是一个子进程声明。动态增添的子进程和其他子进程一样，但若监督者死掉然后被重新启动后，所有动态添加的子进程都会丢失。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%"&gt;Stopping a Child Process&lt;/span&gt;&lt;br /&gt;所有子进程无论动态静态，都可以按照关闭设置被停止运行：&lt;br /&gt;&lt;pre&gt;supervisor:terminate_child(Sup, Id)&lt;/pre&gt;&lt;br /&gt;可用如下函数删除被停止运行的子进程的进程声明：&lt;br /&gt;&lt;pre&gt;supervisor:delete_child(Sup, Id)&lt;/pre&gt;&lt;br /&gt;同样，监督者本身重启后，删除静态子进程的操作将失效。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8956541713874467599?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8956541713874467599/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8956541713874467599&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8956541713874467599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8956541713874467599'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/erlang-otp-supervisor.html' title='Erlang OTP - Supervisor'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5347472287446153192</id><published>2009-04-08T11:21:00.005+08:00</published><updated>2009-04-08T11:39:22.657+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='mnesia'/><title type='text'>Mnesia写入数据错误？</title><content type='html'>Q:我创建了如下一个Mnesia表，为何写入数据时会出现&lt;span style="font-weight:bold;"&gt;bad type&lt;/span&gt;错误呢？？&lt;br /&gt;&lt;pre&gt;&gt; rd(message, {to, from, content}).&lt;br /&gt;&gt; mnesia:create_table(msg, [{attributes, record_info(fields, message)}]).&lt;br /&gt;&lt;br /&gt;&gt; mnesia:dirty_write({message, jojo, oscar, &lt;&lt;"missing you"&gt;&gt;}).&lt;br /&gt;** exception exit: {aborted,{&lt;span style="font-weight:bold;"&gt;no_exists&lt;/span&gt;,message}}&lt;br /&gt;    in function  mnesia:abort/1&lt;br /&gt;&lt;br /&gt;&gt; mnesia:dirty_write(msg, {message, jojo, oscar, &lt;&lt;"test"&gt;&gt;}).&lt;br /&gt;** exception exit: {aborted,{&lt;span style="font-weight:bold;"&gt;bad_type&lt;/span&gt;,&lt;br /&gt;    #message{to = jojo, from = oscar, content = &lt;&lt;"test"&gt;&gt;}}}&lt;br /&gt;        in function  mnesia:abort/1&lt;/pre&gt;&lt;br /&gt;A:第一次执行dirty_write时提示没有找到message表，当表名和表所存储的record名相同时，写入数据时可以忽略表名，但现在表名并非message而是msg，好吧我们指定一个表名再写入试试，这次却出现了第二个错误提示类型错误，郁闷，原来当表名和record名不同时，创建表的时候应另外添加一个参数{record_name, ...}，即：&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&gt; mnesia:create_table(msg, [&lt;br /&gt;    {attributes, record_info(fields, message)},&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;{record_name, message}&lt;/span&gt;]).&lt;/pre&gt;&lt;br /&gt;这样就可以正常插入数据了~~&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5347472287446153192?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5347472287446153192/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5347472287446153192&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5347472287446153192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5347472287446153192'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/mnesia-bad-type.html' title='Mnesia写入数据错误？'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-4366082317993909521</id><published>2009-04-07T22:05:00.002+08:00</published><updated>2009-04-07T22:09:30.192+08:00</updated><title type='text'>I am back ~~</title><content type='html'>祭祖归来~~学校校园网验证更新后，Ubuntu依然没有可用的客户端连接网络，无耻的网管！Youtube依然未能访问，无耻的GFW！go2居然说暂停对国内提供代理服务，要“增加过滤技术”，唉，还有什么话好说的呢~~&lt;br /&gt;&lt;br /&gt;This country needs a little change ....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-4366082317993909521?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/4366082317993909521/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=4366082317993909521&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4366082317993909521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4366082317993909521'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/i-am-back.html' title='I am back ~~'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2907988042606383348</id><published>2009-04-04T12:35:00.004+08:00</published><updated>2009-04-04T13:56:10.958+08:00</updated><title type='text'>我不高兴～～</title><content type='html'>今天报纸上看到几句言论比较精彩，特意记下来：&lt;br /&gt;&lt;br /&gt;“在一个法治上轨道的国家里，人是有权生气的。....不要以为你是大学教授，所以做研究比较重要；不要以为你是杀猪的，所以没有人会听你的话；也不要以为你是个大学生，不够资格管社会的事。你今天不生气，不站出来的话，明天－－还有我、还有你我的下一代，就要成为沉默的牺牲者、受害人！如果你有种、有良心，你现在就去告诉你的公仆‘立法委员’、告诉卫生署、告诉环保局：你受够了，你很生气！你一定要很大声地说。”－－龙应台&lt;br /&gt;&lt;br /&gt;“在一个代议制国家，我的利益被人堂而皇之地代表。然而，代表我利益的人姓甚名谁我竟不知晓－－即使是那隐姓埋名的佐罗，我也知道他的刀剑与相貌。他们从来没有向我询问过我需要什么利益。为此，我不高兴。”&lt;br /&gt;&lt;br /&gt;“17世纪英国中央政府给社会带来的经济负担不到5%，想到2007年中国财政收入占GDP比例占到了20.80%，而且财政收入的1/3被用于‘三公消费’，大学生不去创业，而是争考公务员。国富民穷，权利诱人。为此，我不高兴。”&lt;br /&gt;&lt;br /&gt;回想一下，我见识过两次人大代表的选举方式：一次是在我家乡珠海，村委们拿出一张所谓选票，上面有几个人名，老实说我是一个也不认识，也从来没见过他们出来宣传自己，告诉大家他会为大家争取些什么做些什么，随便打一个勾把票投了，就可以换来10块钱，实在是神奇，至于投完票后结果如何、点票是否公正、甚至说到底有没点票，实在是无人知晓；另一次是在广州读大学时，学校贴出个公告，说我们学校某某老师要参选人大，要求同学“踊跃支持”，但我为什么要支持一个我素未谋面毫无了解的人做自己的代表呢？学校的公告里貌似只给出了因为他是我们学校的老师这一条原因 -____- ||| 所以，我两次都没有参与～～&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3uGUyB-9ISo/Sdb2TpQYYiI/AAAAAAAABxw/RSeB-m0Xf90/s1600-h/4867cca608de7d97c3c22.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://3.bp.blogspot.com/_3uGUyB-9ISo/Sdb2TpQYYiI/AAAAAAAABxw/RSeB-m0Xf90/s400/4867cca608de7d97c3c22.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5320710827137327650" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2907988042606383348?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2907988042606383348/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2907988042606383348&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2907988042606383348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2907988042606383348'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/blog-post_04.html' title='我不高兴～～'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3uGUyB-9ISo/Sdb2TpQYYiI/AAAAAAAABxw/RSeB-m0Xf90/s72-c/4867cca608de7d97c3c22.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-1157713318742563798</id><published>2009-04-03T22:05:00.002+08:00</published><updated>2009-04-03T22:13:59.529+08:00</updated><title type='text'>郁闷～～</title><content type='html'>鬱悶啊！今天校園網要強製換用新的客戶端，卻只提供了Windows版，平時上網慢的難以忍受也就忍過去了，現在Linux是完全上不了网～～我還要在Ubuntu下搞畢業設計的啊！該死的牙又痛了整天....&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3uGUyB-9ISo/SdYZm5SdG6I/AAAAAAAABqE/D7F8TNSc0x8/s1600-h/65618B874C5D2EE805328C48C72C0042.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_3uGUyB-9ISo/SdYZm5SdG6I/AAAAAAAABqE/D7F8TNSc0x8/s400/65618B874C5D2EE805328C48C72C0042.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5320468165788769186" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-1157713318742563798?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/1157713318742563798/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=1157713318742563798&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1157713318742563798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1157713318742563798'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/blog-post_03.html' title='郁闷～～'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3uGUyB-9ISo/SdYZm5SdG6I/AAAAAAAABqE/D7F8TNSc0x8/s72-c/65618B874C5D2EE805328C48C72C0042.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8100939022619664347</id><published>2009-04-03T16:37:00.009+08:00</published><updated>2009-04-08T11:41:05.596+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>設置Erlang最大總進程數</title><content type='html'>Erlang默認的最大進程總數隻有32768個，有時不怎么夠用，此時可以在啓動Erlang時加上參數“+P”來設置最大進程總數，如下：&lt;br /&gt;&lt;pre&gt;erl +P 100000&lt;/pre&gt;&lt;br /&gt;看看是否設置成功：&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;1&gt; erlang:system_info(process_limit).&lt;br /&gt;100000&lt;/pre&gt;&lt;br /&gt;不過雖說在Erlang里進程不用錢，但也不應該想開多少就開多少，不然內存資源會被迅速耗盡死機的～～比如說我們創建1百萬個進程，看看繫統資源佔用情況：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3uGUyB-9ISo/SdXL9InPdaI/AAAAAAAABpk/KG6kfcvYEks/s1600-h/spawn-1M.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 326px;" src="http://3.bp.blogspot.com/_3uGUyB-9ISo/SdXL9InPdaI/AAAAAAAABpk/KG6kfcvYEks/s400/spawn-1M.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5320382785952642466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;黑色框部分就是創建1百萬個進程時的內存消耗情況，我那1.5GB的內存被迅速用光，交換區也被猛吃了一截....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8100939022619664347?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8100939022619664347/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8100939022619664347&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8100939022619664347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8100939022619664347'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/erlang.html' title='設置Erlang最大總進程數'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3uGUyB-9ISo/SdXL9InPdaI/AAAAAAAABpk/KG6kfcvYEks/s72-c/spawn-1M.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-1147982449285874683</id><published>2009-04-03T13:00:00.002+08:00</published><updated>2009-04-03T13:02:23.076+08:00</updated><title type='text'>Toothache ....</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3uGUyB-9ISo/SdWYWdgg39I/AAAAAAAABo8/Pb2u-kkGKuQ/s1600-h/bq76073721.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_3uGUyB-9ISo/SdWYWdgg39I/AAAAAAAABo8/Pb2u-kkGKuQ/s400/bq76073721.jpg" alt="" id="BLOGGER_PHOTO_ID_5320326046453653458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;嗚嗚～～牙好痛好痛～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-1147982449285874683?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/1147982449285874683/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=1147982449285874683&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1147982449285874683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1147982449285874683'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/toothache.html' title='Toothache ....'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3uGUyB-9ISo/SdWYWdgg39I/AAAAAAAABo8/Pb2u-kkGKuQ/s72-c/bq76073721.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-6485058206152278371</id><published>2009-04-02T19:57:00.003+08:00</published><updated>2009-04-02T20:11:03.643+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>利用List Comprehension過慮列表里的項目</title><content type='html'>Erlang的數据結構十分容易進行匹配和過慮，下面演示個例子：&lt;br /&gt;&lt;pre&gt;首先定義一個結構體&lt;br /&gt;1&gt; rd(person, {name, gender}).&lt;br /&gt;&lt;br /&gt;創建一個person列表&lt;br /&gt;2&gt; List=[&lt;br /&gt;2&gt;     {person, oscar, male},&lt;br /&gt;2&gt;     {person, jojo, female},&lt;br /&gt;2&gt;     {person, god, male},&lt;br /&gt;2&gt;     {person, jessica, female}].&lt;br /&gt;&lt;br /&gt;我們現在過慮出所有gender為male的人的名字&lt;br /&gt;3&gt; [P#person.name || P &lt;- List, P#person.gender==male].&lt;br /&gt;[oscar, god]&lt;br /&gt;&lt;br /&gt;再將名為jojo的項目過慮出來&lt;br /&gt;4&gt; [P || P &lt;- List, P#person.name==jojo].&lt;br /&gt;[#person{name = jojo, gender = female}]&lt;/pre&gt;&lt;br /&gt;很簡便吧～～有興趣的可詳細參見&lt;a href="http://erlang.org/doc/reference_manual/expressions.html#6.22"&gt;這里&lt;/a&gt;。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-6485058206152278371?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/6485058206152278371/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=6485058206152278371&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6485058206152278371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6485058206152278371'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/04/list-comprehension.html' title='利用List Comprehension過慮列表里的項目'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5340476190193501561</id><published>2009-03-30T14:38:00.001+08:00</published><updated>2009-03-30T14:39:38.211+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google Docs的繪圖功能</title><content type='html'>哇，今天發現原來Google Docs支持繪圖功能的，如下圖所示：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3uGUyB-9ISo/SdBpGbSq62I/AAAAAAAABRo/dTwXMFG8Evo/s1600-h/googledocs.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 314px;" src="http://2.bp.blogspot.com/_3uGUyB-9ISo/SdBpGbSq62I/AAAAAAAABRo/dTwXMFG8Evo/s400/googledocs.png" alt="" id="BLOGGER_PHOTO_ID_5318866719050754914" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5340476190193501561?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5340476190193501561/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5340476190193501561&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5340476190193501561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5340476190193501561'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/google-docs.html' title='Google Docs的繪圖功能'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3uGUyB-9ISo/SdBpGbSq62I/AAAAAAAABRo/dTwXMFG8Evo/s72-c/googledocs.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-4704715056516070063</id><published>2009-03-29T17:57:00.004+08:00</published><updated>2009-03-29T18:06:12.222+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scim'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>SCIM輸入選框無法自動跟隨光標？</title><content type='html'>Ubuntu下的中文輸入法真係多災多難，之前出現詞頻無法調整的問題，貌似換用繁体中文後就沒事了，今天又發現輸入選框沒有自動跟隨光標的位置，而係傻傻的呆在屏幕上....Google一番得出如下解決方法：&lt;br /&gt;打開/etc/X11/xinit/xinput.d/scim文件，找到如下內容：&lt;br /&gt;GTK_IM_MODULE=xim&lt;br /&gt;QT_IM_MODULE=xim&lt;br /&gt;&lt;br /&gt;將它們該成：&lt;br /&gt;GTK_IM_MODULE=scim&lt;br /&gt;QT_IM_MODULE=scim&lt;br /&gt;&lt;br /&gt;注銷或重啟X即可～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-4704715056516070063?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/4704715056516070063/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=4704715056516070063&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4704715056516070063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4704715056516070063'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/scim.html' title='SCIM輸入選框無法自動跟隨光標？'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-3535719900565625555</id><published>2009-03-29T14:06:00.003+08:00</published><updated>2009-03-29T14:27:21.293+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang 查看文件屬性</title><content type='html'>要查看某文件F的屬性，我們可以調用file:read_file_info(F)，如果F係一個有效的文件或目錄名，則函數返回{ok, Info}，Info係一個#file_info類型的record，包含如下項：&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;size&lt;/span&gt;：文件的大小（字節）；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;type&lt;/span&gt;：類型，可能為：device, directory, regular, other；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;access&lt;/span&gt;：讀寫模式，可能為：read, write, read_write, none；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;atime&lt;/span&gt;：文件最后一次被讀的本地時間：{{Year, Mon, Day}, {Hour, Min, Sec}}；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;mtime&lt;/span&gt;：文件最后一次被寫入的本地時間；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ctime&lt;/span&gt;：此項對不同的操作系統有不同的意義，在Unix下為文件或inode最后一次更改的時間，在Windows下為文件的創建時間；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;mode&lt;/span&gt;：（整數）文件權限；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;links&lt;/span&gt;：連接到該文件的鏈接個數（如果文件系統不支持連接則為1）；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;major_device&lt;/span&gt;：（整數）用于標識文件系統（Unix）或設備號（A:=0, B:=1）（Windows）。&lt;br /&gt;&lt;br /&gt;mode和access的功能其實係一樣的，不過你可以用mode來一次過設置多個文件的屬性。下例演示如何查看文件的大小和類型（注意需要包含file.hrl文件，其包含了#file_info的定義）：&lt;br /&gt;&lt;pre&gt;-include_lib("kernel/include/file.hrl").&lt;br /&gt;file_size_and_type(File) -&gt;&lt;br /&gt;    case file:read_file_info(File) of&lt;br /&gt;        {ok, Facts} -&gt;&lt;br /&gt;            {Facts#file_info.type, Facts#file_info.size};&lt;br /&gt;        _ -&gt;&lt;br /&gt;            error&lt;br /&gt;    end.&lt;/pre&gt;&lt;br /&gt;還有一种更為方便的方式，filelib模塊里包含了一些諸如file_size(File)和is_dir(X)的函數，如果你僅需得到文件的大小信息，直接調用file_size(File)就可以了，不用使用file:read_file_info那么囉嗦～～&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;譯自《Programming Erlang》- Chapter 13 - Programming with Files&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-3535719900565625555?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/3535719900565625555/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=3535719900565625555&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3535719900565625555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3535719900565625555'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/erlang_29.html' title='Erlang 查看文件屬性'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-6150897045055117563</id><published>2009-03-29T13:51:00.002+08:00</published><updated>2009-03-29T14:02:29.906+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang Directory Operations</title><content type='html'>file模塊里有三個函數用于目錄操作：list_dir(Dir)用于列舉目錄Dir里的所有文件；make_dir(Dir)用于創建一個新目錄；del_dir(Dir)用于刪除目錄，例如：&lt;br /&gt;&lt;pre&gt;1&gt; cd("/home/joe/book/erlang/Book/code").&lt;br /&gt;/home/joe/book/erlang/Book/code&lt;br /&gt;ok&lt;br /&gt;2&gt; file:list_dir(".").&lt;br /&gt;{ok, ["id3_v1.erl~",&lt;br /&gt;    "update_binary_file.beam",&lt;br /&gt;    "benchmark_assoc.beam",&lt;br /&gt;    ....&lt;br /&gt;]}&lt;/pre&gt;&lt;br /&gt;大家可以發現，輸出的文件列表貌似沒有什么順序，也沒有信息說明某項是文件還是子目錄，更沒有文件大小等信息....想要查看上述這些信息，我們可以使用函數file:read_file_info，詳細介紹見下一篇文章～～&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;譯自《Programming Erlang》- Chapter 13 - Programming with Files&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-6150897045055117563?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/6150897045055117563/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=6150897045055117563&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6150897045055117563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6150897045055117563'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/erlang-directory-operations.html' title='Erlang Directory Operations'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-7569121902861969292</id><published>2009-03-29T10:22:00.007+08:00</published><updated>2009-03-29T13:45:47.207+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang文件讀寫</title><content type='html'>&lt;span style="font-weight:bold; font-size:140%"&gt;Organization of the Libraries&lt;/span&gt;&lt;br /&gt;操作文件的函數被組織成如下4個模塊：&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;file&lt;/span&gt;：打開、關閉、讀寫文件、列取目錄等；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;filename&lt;/span&gt;：跨平台的文件名操作模塊；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;filelib&lt;/span&gt;：係file的擴展模塊，包含一系列用于列取文件、檢查文件類型等的函數；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;io&lt;/span&gt;：用于操作已經打開的文件，例如格式化輸出數据到文件等。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;The Different Ways of Reading a File&lt;/span&gt;&lt;br /&gt;例如我們要操作包含如下內容的一個文件data1.dat：&lt;br /&gt;&lt;pre&gt;{person, "oscar", "tang",&lt;br /&gt;    [{occupation, programmer}, {favoriteLanguage, erlang}]}.&lt;br /&gt;{cat, {name, "ml"},{owner, "oscar"}}.&lt;/pre&gt;&lt;br /&gt;下面我們用几种方式來讀取上述文件：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Reading All the Terms in the File&lt;/span&gt;&lt;br /&gt;函數file:consult可讀取文件里包含的所有Erlang terms：&lt;br /&gt;&lt;pre&gt;1&gt; file:consult("data1.dat").&lt;br /&gt;{ok, [{person, "oscar", "tang",&lt;br /&gt;    [{occupation, programmer}, {favoriteLanguage, erlang}]},&lt;br /&gt;    {cat, {name, "ml"}, {owner, "oscar"}}]}&lt;/pre&gt;&lt;br /&gt;file:consult(File)假設文件由一堆Erlang terms組成，如成功讀取文件里的所有terms則返回{ok, [Term]}，否則返回{error, Reason}。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Reading the Terms in the File One at a Time&lt;/span&gt;&lt;br /&gt;如果想逐個讀取文件里的erlang term，可首先用file:open來打開文件，然后用io:read讀取一個erlang term，直到去到文件尾，最后用file:close關閉文件：&lt;br /&gt;&lt;pre&gt;1&gt; {ok, S} = file:open("data1.dat", read).&lt;br /&gt;{ok, &lt;0.36.0&gt;}&lt;br /&gt;2&gt; &lt;span style="font-weight:bold;"&gt;io:read&lt;/span&gt;(S, '').&lt;br /&gt;{ok, {person, "oscar", "tang",&lt;br /&gt;    [{occupation, programmer}, {favoriteLanguage, erlang}]}}&lt;br /&gt;3&gt; &lt;span style="font-weight:bold;"&gt;io:read&lt;/span&gt;(S, '').&lt;br /&gt;{ok, {cat, {name, "ml"}, {owner, "oscar"}}}&lt;br /&gt;4&gt; &lt;span style="font-weight:bold;"&gt;io:read&lt;/span&gt;(S, '').&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;eof&lt;/span&gt;&lt;br /&gt;5&gt; file:close(S)&lt;/pre&gt;&lt;br /&gt;上例用到的函數用法如下：&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;@spec file:open(File, read)&lt;/span&gt; -&gt; {ok, IoDevice} | {error, Why}&lt;br /&gt;嘗試以讀取方式打開文件，如果成功打開則返回{ok, IoDevice}，否則返回{error, Reason}，IoDevice係一個用于操作文件的標識符。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;@spec io:read(IoDevice, Prompt)&lt;/span&gt; -&gt; {ok, Term} | {error, Why} | eof&lt;br /&gt;從IoDevice處讀取一個erlang term，如果係讀取文件，參數Prompt會被省略，當我們用io:read從標准輸入處獲取用戶輸入時，Prompt負責輸出一句提示輸入的信息。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;@spec file:close(IoDevice)&lt;/span&gt; -&gt; ok | {error, Why}&lt;br /&gt;關閉文件。&lt;br /&gt;&lt;br /&gt;使用上述的几個函數我們就可以自己實現file:consult了：&lt;br /&gt;&lt;pre&gt;consult(File) -&gt;&lt;br /&gt;    case file:open(File, read) of&lt;br /&gt;        {ok, S} -&gt;&lt;br /&gt;            Val = consult1(S),&lt;br /&gt;            file:close(S),&lt;br /&gt;            {ok, Val};&lt;br /&gt;        {error, Why} -&gt;&lt;br /&gt;            {error, Why}&lt;br /&gt;    end.&lt;br /&gt;&lt;br /&gt;consult1(S) -&gt;&lt;br /&gt;    case io:read(S, '') of&lt;br /&gt;        {ok, Term} -&gt; [Term | consult1(S)];&lt;br /&gt;        eof -&gt; [];&lt;br /&gt;        Error -&gt; Error&lt;br /&gt;    end.&lt;/pre&gt;&lt;br /&gt;BUT file:consult其實并非這樣定義的，它有更好的錯誤報告功能，如果你明白上面的代碼的話，可以去看看真正的file:consult係怎樣的。不過還有一個小問題，我們去哪里找file.erl的源文件？Well，我們可以使用函數code:which，該函數可以定位任何已加載模塊的源文件所在路徑：&lt;br /&gt;&lt;pre&gt;1&gt; code:which(file).&lt;br /&gt;"/usr/local/lib/erlang/lib/kernel-2.11.2/ebin/file.beam"&lt;/pre&gt;&lt;br /&gt;在標准發布（standard release）里，每個庫都包含有兩個子目錄，一個叫做src，包含源文件，另一個叫ebin，包含已編譯的Erlang代碼，所以根据上面的返回結果，我們可以知道file.erl的源文件應該在：&lt;br /&gt;/usr/local/lib/erlang/lib/kernel-2.11.2/src/file.erl&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Reading the Lines in a File One at a Time&lt;/span&gt;&lt;br /&gt;如果我們將io:read換成io:get_line，我們就可以每次讀取文件的一行數据，例如：&lt;br /&gt;&lt;pre&gt;1&gt; {ok, S} = file:open("data1.dat", read).&lt;br /&gt;{ok, &lt;0.43.0&gt;}&lt;br /&gt;2&gt; &lt;span style="font-weight:bold;"&gt;io:get_line&lt;/span&gt;(S, '').&lt;br /&gt;"{person, \"oscar\", \"tang\", \n"&lt;br /&gt;3&gt; &lt;span style="font-weight:bold;"&gt;io:get_line&lt;/span&gt;(S, '').&lt;br /&gt;"\t[{occupation, programmer}, {favoriteLanguage, erlang}]}.\n"&lt;br /&gt;....&lt;br /&gt;6&gt; &lt;span style="font-weight:bold;"&gt;io:get_line&lt;/span&gt;(S, '').&lt;br /&gt;eof&lt;br /&gt;7&gt; file:close(S).&lt;br /&gt;ok&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Reading the Entire File into a Binary&lt;/span&gt;&lt;br /&gt;你可以用函數file:read_file(File)將整個文件當作一個二進製數据來讀取：&lt;br /&gt;&lt;pre&gt;1&gt; &lt;span style="font-weight:bold;"&gt;file:read_file&lt;/span&gt;("data1.dat").&lt;br /&gt;{ok, &lt;&lt;"{person, \"oscar\", \"tang\"" ....&gt;&gt;}&lt;/pre&gt;&lt;br /&gt;如果讀取成功的話，file:read_file(File)返回{ok, Bin}，否則返回{error, Why}。這種方式係至今讀取文件最高效的方式。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Reading a File with Random Access&lt;/span&gt;&lt;br /&gt;如果我們想要讀取的文件非常大不能一次過進行讀取，那么我們可以打開raw模式用file:pread來讀取文件的任何部分，例如：&lt;br /&gt;&lt;pre&gt;1&gt; &lt;span style="font-weight:bold;"&gt;file:open&lt;/span&gt;("data1.dat",&lt;span style="font-weight:bold;"&gt;[read, binary, raw]&lt;/span&gt;).&lt;br /&gt;{ok, {file_descriptor, prim_file, {#Port&lt;0.106&gt;, 5}}}&lt;br /&gt;2&gt; &lt;span style="font-weight:bold;"&gt;file:pread&lt;/span&gt;(S, 22, 46).&lt;br /&gt;{ok, &lt;&lt;"ng\", \n\t[{occupation, progr ....&gt;&gt;}&lt;br /&gt;3&gt; &lt;span style="font-weight:bold;"&gt;file:pread&lt;/span&gt;(S, 1, 10).&lt;br /&gt;{ok, &lt;&lt;"person, \"o"&gt;&gt;}&lt;br /&gt;4&gt; &lt;span style="font-weight:bold;"&gt;file:pread&lt;/span&gt;(S, 2, 10).&lt;br /&gt;{ok, &lt;&lt;"erson, \"os"&gt;&gt;}&lt;br /&gt;5&gt; file:close(S).&lt;/pre&gt;&lt;br /&gt;file:pread(IoDevice, Start, Len)從IoDevice處讀取以Start為開頭讀取Len個字節的數据（第一個字節的位置為1，不是0），返回{ok, Bin}或{error, Why}。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;The Different Ways of Writing to a File&lt;/span&gt;&lt;br /&gt;寫文件的過程跟讀文件差不多～～&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Write a List of Terms to a File&lt;/span&gt;&lt;br /&gt;假設我們想要創建一個能用file:consult來讀取的文件，標准庫里并沒有提供這樣的一個函數，所以我們要自己實現，看下面的例子：&lt;br /&gt;&lt;pre&gt;unconsult(File, L) -&gt;&lt;br /&gt;    {ok, S} = file:open(File, write),&lt;br /&gt;    lists:foreach(fun(X) -&gt; io:format(S, "~p.\n", [X] end, L),&lt;br /&gt;    file:close(S).&lt;/pre&gt;&lt;br /&gt;然后在shell里運行上述代碼：&lt;br /&gt;&lt;pre&gt;1&gt; lib_misc:unconsult("test1.dat",&lt;br /&gt;    [{cats, ["zorrow", "daisy"]},&lt;br /&gt;    {weather, snowing}]).&lt;br /&gt;ok&lt;/pre&gt;&lt;br /&gt;看看是否寫入成功并且可以正常打開：&lt;br /&gt;&lt;pre&gt;2&gt; file:consult("test1.dat").&lt;br /&gt;{ok, [{cats, ["zorrow", "daisy"]}, {weather, snowing}]}&lt;/pre&gt;&lt;br /&gt;unconsult首先以write模式來打開文件，然后用io:format(S, "~p\n", [X])來將erlang terms輸出到文件里。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Writing Lines to a File&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;1&gt; {ok, S} = file:open("test2.dat", write).&lt;br /&gt;{ok, &lt;0.62.0&gt;}&lt;br /&gt;2&gt; io:format(S, "~s\n", ["Hello readers"]).&lt;br /&gt;ok&lt;br /&gt;3&gt; io:format(S, "~w\n", [123]).&lt;br /&gt;ok&lt;br /&gt;4&gt; io:format(S, "~s\n", ["that's it"]).&lt;br /&gt;ok&lt;br /&gt;5&gt; file:close(S).&lt;/pre&gt;&lt;br /&gt;上述代碼會生成一個名為test2.dat的文件，并寫入如下內容到文件里：&lt;br /&gt;&lt;pre&gt;Hello readers&lt;br /&gt;123&lt;br /&gt;that's it&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Writing an Entire File in One Operation&lt;/span&gt;&lt;br /&gt;用函數file:write_file(Filename, Bytes)一次過寫入整個文件，係最有效率的寫文件操作，如果指定的文件不存在則自動創建一個。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Writing to a Random-Access File&lt;/span&gt;&lt;br /&gt;首先我們要先把文件以write模式打開，然后用函數file:pwrite(Position, Bin)來寫入文件，例如：&lt;br /&gt;&lt;pre&gt;1&gt; {ok, S} = file:open("....", [raw, write, binary]).&lt;br /&gt;{ok, ....}&lt;br /&gt;2&gt; file:pwrite(S, 10, &lt;&lt;"new"&gt;&gt;).&lt;br /&gt;ok&lt;br /&gt;3&gt; file:close(S).&lt;br /&gt;ok&lt;/pre&gt;&lt;br /&gt;上述代碼在文件的第10個字節位置處寫入字符串"new"，如果原先已經有舊的內容，則舊內容會被覆蓋掉～～&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;譯自《Programming Erlang》- Chapter 13 - Programming with Files&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-7569121902861969292?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/7569121902861969292/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=7569121902861969292&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7569121902861969292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7569121902861969292'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/erlang-programming-with-files.html' title='Erlang文件讀寫'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5390219310876173909</id><published>2009-03-29T00:12:00.003+08:00</published><updated>2009-03-29T01:40:01.116+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang Gen_Event Behaviour</title><content type='html'>&lt;span style="font-weight:bold; font-size:140%"&gt;Event Handling Principles&lt;/span&gt;&lt;br /&gt;在Erlang OTP里，事件管理器（event manager）係一個用于處理事件的模塊，這些事件可能係錯誤、警報、或其他需要被記錄的信息。&lt;br /&gt;&lt;br /&gt;在事件管理器里可能會有0個、1個或多個事件處理器（event handlers），當事件管理器接收到事件時，所有這些事件處理器都會對事件進行處理。比如有一個處理錯誤的事件管理器，它有一個默認的事件處理器將錯誤信息輸出到終端顯示；你可以為其添加另一個事件處理器，在特定情況下將錯誤信息寫入文件；當不再需要將信息寫入文件時，可以將這個事件處理器移除。&lt;br /&gt;&lt;br /&gt;事件管理器實質上係一個接收事件的進程，而事件處理器則為一個回調模塊（callback module）。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;Example&lt;/span&gt;&lt;br /&gt;下例演示如何實現一個將錯誤信息輸出到終端的事件處理器：&lt;br /&gt;&lt;pre&gt;-module(terminal_logger).&lt;br /&gt;-behaviour(gen_event).&lt;br /&gt;-export([init/1, handle_event/2, terminate/2]).&lt;br /&gt;&lt;br /&gt;init(_Args) -&gt;&lt;br /&gt;    {ok, []}.&lt;br /&gt;&lt;br /&gt;handle_event(ErrorMsg, State) -&gt;&lt;br /&gt;    io:format("***ERROR*** ~p\n", [ErrorMsg]),&lt;br /&gt;    {ok, State}.&lt;br /&gt;&lt;br /&gt;terminate(_Args, _State) -&gt;&lt;br /&gt;    ok.&lt;/pre&gt;&lt;br /&gt;而將錯誤信息寫入文件的事件處理器可以這樣寫：&lt;br /&gt;&lt;pre&gt;-module(file_logger).&lt;br /&gt;-behaviour(gen_event).&lt;br /&gt;-export([init/1, handle_event/2, terminate/2]).&lt;br /&gt;&lt;br /&gt;init(File) -&gt;&lt;br /&gt;    {ok, Fd} = file:open(File, read),&lt;br /&gt;    %原文的打開方式係read，但我覺得應該是write或append吧&lt;br /&gt;    {ok, Fd}.&lt;br /&gt;&lt;br /&gt;handle_event(ErrorMsg, Fd) -&gt;&lt;br /&gt;    io:format(Fd, "***ERROR*** ~p\n", [ErrorMsg]),&lt;br /&gt;    {ok, Fd}.&lt;br /&gt;&lt;br /&gt;terminate(_Args, Fd) -&gt;&lt;br /&gt;    file:close(Fd).&lt;/pre&gt;&lt;br /&gt;下面會詳細講解上述代碼。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;Starting an Event Manager&lt;/span&gt;&lt;br /&gt;要啟動事件管理器來處理錯誤，可使用如下函數：&lt;br /&gt;&lt;pre&gt;gen_event:start_link({local, error_man}).&lt;/pre&gt;&lt;br /&gt;這函數會新生并連接一個新進程，即事件管理器進程。參數{local, error_man}指定了該事件管理器的注冊名，此例中其注冊名為error_man，僅在本節點有效。如果不注冊一個名字，則必需通過事件管理器進程的進程標識PID來向其發送信息，注冊名也可以設置為{global, Name}。&lt;br /&gt;&lt;br /&gt;如果事件管理器係屬於監督樹的一部分，則必需通過gen_event:start_link來啟動。另外有一個gen_event:start函數來啟動一個獨立的事件管理器～～&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;Adding an Event Handler&lt;/span&gt;&lt;br /&gt;下例在shell里演示如何啟動一個事件處理器并為其添加一個事件處理器：&lt;br /&gt;&lt;pre&gt;1&gt; gen_event:start({local, error_man}).&lt;br /&gt;{ok, &lt;0.31.0&gt;}&lt;br /&gt;2&gt; &lt;span style="font-weight:bold;"&gt;gen_event:add_handler&lt;/span&gt;(error_man, terminal_logger, []).&lt;br /&gt;ok&lt;/pre&gt;&lt;br /&gt;上述函數向名為error_man的事件管理器發送一個事件，告訴它添加一個事件處理器terminal_logger，事件管理器會調用terminal_logger模塊的初始化函數terminal_logger:init([])，其中[]即add_handler函數里的第三個參數。init應該返回{ok, State}，State即事件處理器的內部狀態。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%"&gt;Notifying About Events&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;3&gt; &lt;span style="font-weight:bold;"&gt;gen_event:notify&lt;/span&gt;(error_man, no_reply).&lt;br /&gt;***Error*** no_reply&lt;br /&gt;ok&lt;/pre&gt;&lt;br /&gt;error_man係事件管理器的名字，no_reply係事件。事件會作為信息發送給事件管理器進程，接收到事件後，事件管理器會按照添加順序調用它每個事件處理器的handle_event(Event, State)函數來處理事件，這些函數都應返回{ok, State1}，State1即事件處理器的新內部狀態。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%"&gt;Deleting an Event Handler&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;4&gt; &lt;span style="font-weight:bold;"&gt;gen_event:delete_handler&lt;/span&gt;(error_man, terminal_logger, []).&lt;br /&gt;ok&lt;/pre&gt;&lt;br /&gt;上述函數向名為error_man的事件管理器發送一個信息，告知它刪除事件處理器terminal_logger，事件管理器會調用terminal_logger模塊的terminate([], State)函數來終止該處理器。terminate函數應進行一些必要的清理工作等，其返回值會被忽略～～&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;Stopping&lt;/span&gt;&lt;br /&gt;當事件管理器停止時，它會給机會給它的每一個事件處理器進行清理工作。如果該事件處理器係監督樹的一部分，事件管理器在必要的時候會被其監督者關閉；如果是一個獨立的事件管理器，則可調用如下函數去停止它：&lt;br /&gt;&lt;pre&gt;&gt;gen_event:stop(error_man).&lt;br /&gt;ok&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5390219310876173909?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5390219310876173909/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5390219310876173909&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5390219310876173909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5390219310876173909'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/erlang-genevent-behaviour.html' title='Erlang Gen_Event Behaviour'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5974999498027657844</id><published>2009-03-28T13:32:00.010+08:00</published><updated>2009-03-29T01:40:27.533+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang Generic Event Handling</title><content type='html'>當我們編程去處理事件的時候，只需將事件作為一個信息發送給負責處理事件的進程：&lt;br /&gt;&lt;pre&gt;RegProcName ! {event, E}&lt;/pre&gt;&lt;br /&gt;E就係一個事件（可以係任何Erlang數据類型），RegProcName即處理進程的注冊名。事件發送出去後，發送方就毋需關心該事件會被如何處理了～～&lt;br /&gt;&lt;br /&gt;現在我們看看處理事件的進程（事件處理器 - event handler），看個例子：&lt;br /&gt;&lt;pre&gt;-module(event_handler).&lt;br /&gt;-export([make/1, add_handler/2, event/2]).&lt;br /&gt;&lt;br /&gt;%創建一個名為Name的新事件處理器&lt;br /&gt;%其接收到事件後，會執行函數no_op/1&lt;br /&gt;make(Name) -&gt;&lt;br /&gt;    register(Name, spawn(fun() -&gt; my_handler(fun no_op/1) end)).&lt;br /&gt;&lt;br /&gt;add_handler(Name, Fun) -&gt; Name ! {add, Fun}.&lt;br /&gt;&lt;br /&gt;%產生一個事件&lt;br /&gt;event(Name, X) -&gt; Name ! {event, X}.&lt;br /&gt;&lt;br /&gt;my_handler(Fun) -&gt;&lt;br /&gt;    receive&lt;br /&gt;        {add, Fun1} -&gt;&lt;br /&gt;            my_handler(Fun1);&lt;br /&gt;        {event, Any} -&gt;&lt;br /&gt;            (catch Fun(Any)),&lt;br /&gt;            my_handler(Fun)&lt;br /&gt;    end.&lt;br /&gt;&lt;br /&gt;no_op(_) -&gt; void.&lt;/pre&gt;&lt;br /&gt;上例的事件處理器有如下功能：&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;event_handler:make(Name)&lt;/span&gt;：創建一個名為Name的事件處理器；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;event_handler:event(Name, X)&lt;/span&gt;：向名為Name的事件處理器發送事件X；&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;event_handler:add_handler(Name, Fun)&lt;/span&gt;：將事件處理器的處理函數（最初係一個什么都不幹的函數no_op/1）替換為Fun，替換後當接收到事件時，就會調用新的處理函數Fun來處理該事件。&lt;br /&gt;&lt;br /&gt;運行試試效果如何：&lt;br /&gt;&lt;pre&gt;1&gt; event_handler:make(errors).&lt;br /&gt;true&lt;br /&gt;2&gt; event_handler:event(errors, hi).&lt;br /&gt;{event, hi}&lt;/pre&gt;&lt;br /&gt;Well，沒咩特別事發生，因為現在的處理函數什么都不幹～～我們接著寫個回調模塊（callback module）來設立一個會做實際工作的事件處理函數：&lt;br /&gt;&lt;pre&gt;-module(motor_controller).&lt;br /&gt;-export([add_event_handler/0]).&lt;br /&gt;&lt;br /&gt;add_event_handler() -&gt;&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;event_handler:add_handler(errors, fun controller/1).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;controller(too_hot) -&gt; io:format("Turn off the motor!n");&lt;br /&gt;controller(X) -&gt; io:format("~w ignored event: ~p~n", [?MODULE, X]).&lt;/pre&gt;&lt;br /&gt;上述代碼編譯之後就會添加一個事件處理函數了：&lt;br /&gt;&lt;pre&gt;3&gt; c(motor_controller).&lt;br /&gt;{ok, motor_controller}&lt;br /&gt;4&gt; motor_controller:add_event_handler().&lt;br /&gt;{add, #Fun&lt;motor_controller. .... &gt;}&lt;/pre&gt;&lt;br /&gt;現在向事件處理器發送信息，將由函數motor_controller:controller/1來處理：&lt;br /&gt;&lt;pre&gt;5&gt; event_handler:event(errors, cool).&lt;br /&gt;motor_controller ignored event: cool&lt;br /&gt;{event, cool}&lt;br /&gt;6&gt; event_handler:event(errors, too_hot).&lt;br /&gt;Turn off the motor&lt;br /&gt;{event, too_hot}&lt;/pre&gt;&lt;br /&gt;好了，上面寫了一大堆，到底都做了些什么呢？首先我們提供了一個接收事件的事件處理器（這里係一個注冊名為errors的進程），然后定義了如何發送事件給該處理器（發送方毋需知道處理器會對事件作什么處理），最后我們看到怎么在運行過程中動態的更新事件處理函數。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;譯自《Programming Erlang》&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5974999498027657844?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5974999498027657844/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5974999498027657844&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5974999498027657844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5974999498027657844'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/erlang-generic-event-handling.html' title='Erlang Generic Event Handling'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5926928136742800242</id><published>2009-03-27T00:15:00.019+08:00</published><updated>2009-04-11T11:32:03.663+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang Exception Handling</title><content type='html'>&lt;span style="font-weight:bold; font-size:140%"&gt;Raising an Exception&lt;/span&gt;&lt;br /&gt;当系统检测到有错误发生时会自动丢出一个异常，这些异常通常都是由模式匹配错误（没有符合的匹配结果）或传入不当类型的参数到BIFs函数里而引起的。&lt;br /&gt;&lt;br /&gt;我们也可以用如下BIFs手动的抛出异常：&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;exit(Why)&lt;/span&gt;：当你想终止当前进程的运行时可调用此BIF，如果不捕捉住这个异常，当前进程就会广播{'EXIT, Pid, Why}到所有与其相连的进程。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;throw(Why)&lt;/span&gt;：此BIF用于抛出异常。写程序注释时应注明调用此BIF的函数可能会抛出些什么异常。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;erlang:error(Why)&lt;/span&gt;：此BIF用于抛出一个“崩溃性错误（crashing errors）”，即一些比较奇异的我们没有意料到的错误。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%"&gt;try .... catch&lt;/span&gt;&lt;br /&gt;如果你熟悉Java的话，一定知道try...catch系干什么的，Java可以用如下方式来捉住一个异常：&lt;br /&gt;&lt;pre&gt;try{&lt;br /&gt;    block&lt;br /&gt;} catch(exception type identifier){&lt;br /&gt;    block&lt;br /&gt;} catch(exception type identifier){&lt;br /&gt;    block&lt;br /&gt;} ....&lt;br /&gt;finally{&lt;br /&gt;    block&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Erlang处理异常的方式也十分相近，就像这样：&lt;br /&gt;&lt;pre&gt;try FuncOrExpressionSequence of&lt;br /&gt;    Pattern1 [when Guard1] -&gt; Expressions1;&lt;br /&gt;    Pattern2 [when Guard2] -&gt; Expressions2;&lt;br /&gt;    ....&lt;br /&gt;catch&lt;br /&gt;    ExceptionType: ExPattern1 [when ExGuard1] -&gt; ExExpressions1;&lt;br /&gt;    ExceptionType: ExPattern2 [when ExGuard2] -&gt; ExExpressions2&lt;br /&gt;after&lt;br /&gt;    AfterExpressions&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;try...catch的工作方式是这样的：首先执行FuncOrExpressionSeq，如果这部分代码没有引发任何异常，函数就会根据Pattern1、Pattern2....来匹配一个函数返回值，然后返回数据结束运行；BUT如果在执行FuncOrExpressionSeq中跑出了个异常，函数就会跳去匹配ExPattern1、ExPattern2....看看到底是出了什么异常，然后执行相应的ExExpression来处理异常。ExceptionType（throw、exit、error）指明异常的类型，如果忽略的话则默认为throw。注意：由Erlang runtime system检测出的内部错误其异常类型总是error。&lt;br /&gt;&lt;br /&gt;跟在after后面的代码一般是用来做清理工作的，即使有异常发生，这部分代码也一定会被执行。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%"&gt;Shortcuts&lt;/span&gt;&lt;br /&gt;try...catch表達式的某些部分是可以被忽略的，例如：&lt;br /&gt;&lt;pre&gt;try F&lt;br /&gt;catch&lt;br /&gt;    ....&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;跟下面這段代碼系一樣的：&lt;br /&gt;&lt;pre&gt;try F of&lt;br /&gt;    Val -&gt; Val&lt;br /&gt;catch&lt;br /&gt;    ....&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;同樣的，after部分也可以省略掉～～&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%"&gt;Programming Idioms with try...catch&lt;/span&gt;&lt;br /&gt;我們設計應用程式時，通常都需要保証代碼產生的所有錯誤和异常都會被捕捉到，下面來個例子，首先我們要產生一些异常出來先：&lt;br /&gt;&lt;pre&gt;generate_exception(1) -&gt; a;&lt;br /&gt;generate_exception(2) -&gt; throw(a);&lt;br /&gt;generate_exception(3) -&gt; exit(a);&lt;br /&gt;generate_exception(4) -&gt; {'EXIT',a};&lt;br /&gt;generate_exception(5) -&gt; erlang:error(a).&lt;/pre&gt;&lt;br /&gt;然后我們用try...catch來處理這些异常：&lt;br /&gt;&lt;pre&gt;demo1() -&gt;&lt;br /&gt;    [catcher(I) || I &lt;- [1,2,3,4,5]].&lt;br /&gt;&lt;br /&gt;catcher(N) -&gt;&lt;br /&gt;    try generate_exception(N) of&lt;br /&gt;        Val -&gt; {N, normal, Val}&lt;br /&gt;    catch&lt;br /&gt;        throw:X -&gt; {N, caught, thrown, X};&lt;br /&gt;        exit:X -&gt; {N, caught, exited, X};&lt;br /&gt;        error:X -&gt; {N, caught, error, X}&lt;br /&gt;    end.&lt;/pre&gt;&lt;br /&gt;運行上述代碼可得如下結果：&lt;br /&gt;&lt;pre&gt;1&gt; try_test:demo1().&lt;br /&gt;[{1, normal, 1},&lt;br /&gt; {2, caught, thrown, a},&lt;br /&gt; {3, caught, exited, a},&lt;br /&gt; {4, normal, {'EXIT', a}},&lt;br /&gt; {5, caught, error, a}]&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%"&gt;catch&lt;/span&gt;&lt;br /&gt;另外也可以直接使用catch來捕捉异常，如下：&lt;br /&gt;&lt;pre&gt;demo2() -&gt;&lt;br /&gt;    [{I, (catch generate_exception(I))} || I &lt;- [1,2,3,4,5]].&lt;/pre&gt;&lt;br /&gt;運行上述代碼可得如下結果：&lt;br /&gt;&lt;pre&gt;2&gt; try_test:demo2().&lt;br /&gt;[{1, a},&lt;br /&gt; {2, a},&lt;br /&gt; {3, {'EXIT', a}},&lt;br /&gt; {4, {'EXIT', a}},&lt;br /&gt; {5, {'EXIT', {a, [&lt;br /&gt;    {try_test, generate_exception, 1},&lt;br /&gt;    {try_test, '-demo2/0-fun-0-', 1},&lt;br /&gt;    {lists, map, 2},&lt;br /&gt;    {lists, map, 2},&lt;br /&gt;    {erl_eval,do_apply,5},&lt;br /&gt;    {shell,exprs,6},&lt;br /&gt;    {shell,eval_loop,3}&lt;br /&gt;]}}}]&lt;/pre&gt;&lt;br /&gt;與try...catch的例子對比，你會發現上例丟失了很多錯誤原因信息～～&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;Improving Error Messages&lt;/span&gt;&lt;br /&gt;erlang:error的一個用途就是改善錯誤信息的提示方式，比如說如果我們在調用函數math:sqrt(X)時傳入一個負數作為參數，會看到如下錯誤提示：&lt;br /&gt;&lt;pre&gt;1&gt; math:sqrt(-1).&lt;br /&gt;** exited: {badarith, [&lt;br /&gt;    {math, sqrt, [-1]},&lt;br /&gt;    {erl_eval, do_apply, 5},&lt;br /&gt;    {shell, exprs, 6},&lt;br /&gt;    {shell, eval_loop, 3}]} **&lt;/pre&gt;&lt;br /&gt;羅羅唆唆一大堆又不直觀，我們可以寫如下這樣的代碼來改善一下輸出的信息：&lt;br /&gt;&lt;pre&gt;sqrt(X) when X&lt;0 -&gt;&lt;br /&gt;    erlang:error({squareRootNegativeArgument, X});&lt;br /&gt;sqrt(X) -&gt;&lt;br /&gt;    math:sqrt(X).&lt;br /&gt;&lt;br /&gt;2&gt; lib_misc:sqrt(-1).&lt;br /&gt;** exited: {&lt;br /&gt;    {squareRootNegativeArgument, -1},&lt;br /&gt;    [{lib_misc, sqrt, 1},&lt;br /&gt;     {erl_eval, do_apply, 5},&lt;br /&gt;     {shell, exprs, 6},&lt;br /&gt;     {shell, eval_loop, 3}]} **&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;Catching Every Possible Exception&lt;/span&gt;&lt;br /&gt;如果我們想捕捉晒所有可能出現的錯誤，可以使用如下形式的代碼：&lt;br /&gt;&lt;pre&gt;try Expr&lt;br /&gt;catch&lt;br /&gt;    _:_ -&gt; ...處理異常...&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold; font-size:140%;"&gt;Stack Traces&lt;/span&gt;&lt;br /&gt;當捉到異常時，可以通過調用erlang:get_stacktrace()獲取最新的堆棧追蹤信息（stack trace），下面看個例子：&lt;br /&gt;&lt;pre&gt;demo3() -&gt;&lt;br /&gt;    try generate_exception(5)&lt;br /&gt;    catch&lt;br /&gt;        error:X -&gt;&lt;br /&gt;            {X, erlang:get_stacktrace()}&lt;br /&gt;    end.&lt;br /&gt;&lt;br /&gt;1&gt; try_test:demo3().&lt;br /&gt;{a, [{try_test, generate_exception, 1},&lt;br /&gt;     {try_test, demo3, 0},&lt;br /&gt;     {erl_eval, do_apply, 5},&lt;br /&gt;     {shell, exprs, 6},&lt;br /&gt;     {shell, eval_loop, 3}]}&lt;/pre&gt;&lt;br /&gt;“堆棧追蹤（stack trace）”包含了一繫列在堆棧上的函數，如果不是因為出了異常，當前函數能順利執行的話，就會返囬到這些函數里去，這些函數的排列順序基本上等于我們進入到當前函數（發生了異常的函數）的函數調用順序（除了尾遞歸函數）。在調試程序的角度來講，stack trace隻有前幾行輸出比較有意義，比如上例的第一行輸出告訴我們繫統崩潰時正在執行函數generate_exception，其參數來自糢塊try_test，try_test:generate_exception/1可能是由try_test:demo3()調用的。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;譯自《Programming Erlang》- Chapter 4 - Exceptions&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5926928136742800242?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5926928136742800242/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5926928136742800242&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5926928136742800242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5926928136742800242'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/erlang-exception-handling.html' title='Erlang Exception Handling'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-9078878164483815139</id><published>2009-03-25T14:44:00.002+08:00</published><updated>2009-03-25T14:48:59.308+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>突然没有了eth0？？</title><content type='html'>郁闷，今天校园网老是出现IP冲突，想在Ubuntu下装个防火墙看有没效，谁知糊弄一番发现没有了网络连接....只剩下了lo本地回环～～郁闷～～Google一下用如下方法问题解决：&lt;br /&gt;&lt;br /&gt;输入命令&lt;span style="font-weight:bold;"&gt;sudo gedit /etc/network/interfaces&lt;/span&gt;，貌似是个网络设备配置文件，应该能看到如下内容：&lt;br /&gt;auto lo&lt;br /&gt;iface lo inet loopback&lt;br /&gt;&lt;br /&gt;在下面增加这两句：&lt;br /&gt;auto eth0&lt;br /&gt;iface eth0 inet dhcp&lt;br /&gt;&lt;br /&gt;保存并重启Ubuntu，一切恢复正常～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-9078878164483815139?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/9078878164483815139/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=9078878164483815139&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/9078878164483815139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/9078878164483815139'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/eth0.html' title='突然没有了eth0？？'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-472821771759834102</id><published>2009-03-24T16:37:00.003+08:00</published><updated>2009-03-24T17:24:45.797+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='mnesia'/><title type='text'>Mnesia Fragmenting</title><content type='html'>本文参考自Nick Gerakines的Dynamically sizing a fragmented mnesia store，原文请看&lt;a href="http://blog.socklabs.com/2008/02/06/dynamically_sizing_a_fragmente.html"&gt;这里&lt;/a&gt;～～&lt;br /&gt;&lt;br /&gt;Mnesia在32位系统下单个表最大只能存储4G的数据，很多情况下这显然系不够的，不过不要紧，Mnesia可以将单个表分拆成多个分块（Fragment），这些块可以分布到不同节点节点不同主机上，被分块的表和其他表一样可以备份复制等等～～&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;创建和初始化数据库表&lt;/span&gt;&lt;br /&gt;首先我们运行三个节点node1@m、node2@m和node3@m并将它们连接起来（详细可以参看&lt;a href="http://mooooscar.blogspot.com/2009/03/interconnecting-erlang-nodes_08.html"&gt;Interconnecting Erlang Nodes&lt;/a&gt;），然后在node1上初始化一个表，将该表分成三块，分布在上述的三个节点上：&lt;br /&gt;（以下代码省略了部分返回结果）&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;初始化schema&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; Nodes&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;node&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;|&lt;/span&gt; nodes&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;create_schema&lt;span style='color:#808030; '&gt;(&lt;/span&gt;Nodes&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;启动所有节点上的Mnesia&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;start&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node2 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;start&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node3 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;start&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在Node1上创建和初始化数据表&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; rd&lt;span style='color:#808030; '&gt;(&lt;/span&gt;test&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;key&lt;span style='color:#808030; '&gt;,&lt;/span&gt;value&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; FragProps&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800080; '&gt;{&lt;/span&gt;node_pool&lt;span style='color:#808030; '&gt;,&lt;/span&gt;Nodes&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800080; '&gt;{&lt;/span&gt;n_fragments&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;3&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800080; '&gt;{&lt;/span&gt;n_disc_only_copies&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;create_table&lt;span style='color:#808030; '&gt;(&lt;/span&gt;test&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800080; '&gt;{&lt;/span&gt;frag_properties&lt;span style='color:#808030; '&gt;,&lt;/span&gt;FragProps&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800080; '&gt;{&lt;/span&gt;attributes&lt;span style='color:#808030; '&gt;,&lt;/span&gt;record_info&lt;span style='color:#808030; '&gt;(&lt;/span&gt;fields&lt;span style='color:#808030; '&gt;,&lt;/span&gt;test&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; Write&lt;span style='color:#808030; '&gt;=&lt;/span&gt;fun&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;                  &lt;span style='color:#808030; '&gt;[&lt;/span&gt;mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;write&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;test&lt;span style='color:#808030; '&gt;,&lt;/span&gt;K&lt;span style='color:#808030; '&gt;,&lt;/span&gt;K&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;|&lt;/span&gt;&lt;span style='color:#808030; '&gt;|&lt;/span&gt; K&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;lists&lt;span style='color:#808030; '&gt;:&lt;/span&gt;seq&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1000&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;              end&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;activity&lt;span style='color:#808030; '&gt;(&lt;/span&gt;sync_dirty&lt;span style='color:#808030; '&gt;,&lt;/span&gt;Write&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;mnesia_frag&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;检查一下数据都写到哪里去了&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; Info&lt;span style='color:#808030; '&gt;=&lt;/span&gt;fun&lt;span style='color:#808030; '&gt;(&lt;/span&gt;Item&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;info&lt;span style='color:#808030; '&gt;(&lt;/span&gt;test&lt;span style='color:#808030; '&gt;,&lt;/span&gt;Item&lt;span style='color:#808030; '&gt;)&lt;/span&gt; end&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;activity&lt;span style='color:#808030; '&gt;(&lt;/span&gt;sync_dirty&lt;span style='color:#808030; '&gt;,&lt;/span&gt;Info&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;frag_size&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;mnesia_frag&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;test&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;230&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;test_frag2&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;524&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;test_frag3&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;246&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;添加新分块到新节点上&lt;/span&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;启动新节点node4&lt;br /&gt;$ erl &lt;span style='color:#808030; '&gt;-&lt;/span&gt;sname node4&lt;br /&gt;node4 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;start&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;连接并添加新节点&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; net_adm&lt;span style='color:#808030; '&gt;:&lt;/span&gt;ping&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'node4@m'&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;change_config&lt;span style='color:#808030; '&gt;(&lt;/span&gt;extra_db_nodes&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'node4@m'&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;通过mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;info&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;我们发现新节点的类新为ram_copies，这与其他几个节点不兼容&lt;br /&gt;所以要先对node4上的表进行类型转换&lt;br /&gt;node4 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; change_table_copy_type&lt;span style='color:#808030; '&gt;(&lt;/span&gt;schema&lt;span style='color:#808030; '&gt;,&lt;/span&gt;node&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;disc_copies&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;添加新分块到新节点上，可以向同一节点添加多个分块&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;change_table_frag&lt;span style='color:#808030; '&gt;(&lt;/span&gt;test&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;add_frag&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'node4@m'&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;change_table_frag&lt;span style='color:#808030; '&gt;(&lt;/span&gt;test&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;add_frag&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'node4@m'&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;change_table_frag&lt;span style='color:#808030; '&gt;(&lt;/span&gt;test&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;add_frag&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'node4@m'&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;activity&lt;span style='color:#808030; '&gt;(&lt;/span&gt;sync_dirty&lt;span style='color:#808030; '&gt;,&lt;/span&gt;Info&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;frag_dist&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;mnesia_frag&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'node1@m'&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'node2@m'&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'node3@m'&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'node4@m'&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;3&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;node1 &lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; mnesia&lt;span style='color:#808030; '&gt;:&lt;/span&gt;activity&lt;span style='color:#808030; '&gt;(&lt;/span&gt;sync_dirty&lt;span style='color:#808030; '&gt;,&lt;/span&gt;Info&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;frag_size&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;mnesia_frag&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;test&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;121&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;test_frag2&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;115&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;test_frag3&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;246&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;test_frag4&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;291&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;test_frag5&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;109&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;test_frag6&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#008c00; '&gt;118&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;OK，可以看到数据已经自动的分布到各个节点上的分块里了～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-472821771759834102?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/472821771759834102/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=472821771759834102&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/472821771759834102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/472821771759834102'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/mnesia-fragmenting.html' title='Mnesia Fragmenting'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-6988824661895085962</id><published>2009-03-24T00:02:00.002+08:00</published><updated>2009-03-24T00:30:31.602+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>List Comprehensions</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; font-family: arial;"&gt;1 Simple Examples&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;We start with a simple example:&lt;br /&gt;&gt; &lt;span style="font-weight: bold;"&gt;[X || X &lt;- [1,2,a,3,4,b,5,6], X &gt; 3].&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;[a,4,b,5,6]&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: arial;"&gt;&lt;br /&gt;This should be read as follows:    The list of X such that X is taken from the list [1,2,a,...] and X is greater than 3.    The notation X &lt;- [1,2,a,...] is a generator and the expression X &gt; 3 is a filter.  An additional filter can be added in order to restrict the result to integers:&lt;br /&gt;&gt; &lt;span style="font-weight: bold;"&gt;[X || X &lt;- [1,2,a,3,4,b,5,6], integer(X), X &gt; 3].&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;[4,5,6]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-family: arial;"&gt;Generators can be combined. For example, the Cartesian product of two lists can be written as follows:&lt;br /&gt;&gt; &lt;span style="font-weight: bold;"&gt;[{X, Y} || X &lt;- [1,2,3], Y &lt;- [a,b]].&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;[{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-family: arial;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;2 Quick Sort&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The well known quick sort routine can be written as follows:&lt;br /&gt;sort([Pivot|T]) -&gt; &lt;/span&gt;&lt;span style="font-family: arial;"&gt;sort([ X || X &lt;- T, X &lt;&gt;= Pivot]);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;sort([]) -&gt; [].&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-family: arial;"&gt;The expression [X || X &lt;- T, X &lt;&gt; is the list of all elements in T, which are less than Pivot. &lt;br /&gt;[X || X &lt;- T, X &gt;= Pivot] is the list of all elements in T, which are greater or equal to Pivot. &lt;br /&gt;To sort a list, we isolate the first element in the list and split the list into two sub-lists. The first sub-list contains all elements which are smaller than the first element in the list, the second contains all elements which are greater than or equal to the first element in the list. We then sort the sub-lists and combine the results.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;3 Permutations&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The following example generates all permutations of the elements in a list:&lt;br /&gt;perms([]) -&gt; [[]];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;perms(L)  -&gt; [[H|T] || H &lt;- L, T &lt;- perms(L--[H])].  &lt;br /&gt;&lt;br /&gt;We take take H from L in all possible ways. The result is the set of all lists [H|T], where T is the set of all possible permutations of L with H removed.&lt;br /&gt;&gt; perms([b,u,g]).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;[[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]]&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;4 Pythagorean&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Triplets  Pythagorean triplets are sets of integers {A,B,C} such that A**2 + B**2 = C**2. &lt;br /&gt;The function pyth(N) generates a list of all integers {A,B,C} such that A**2 + B**2 = C**2 and where the sum of the sides is equal to or less than N.&lt;br /&gt;pyth(N) -&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;   [ {A,B,C} ||&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;       A &lt;- lists:seq(1,N),&lt;br /&gt;B &lt;- lists:seq(1,N),&lt;br /&gt;C &lt;- lists:seq(1,N),&lt;br /&gt;A+B+C =&lt; N,&lt;br /&gt;A*A+B*B == C*C    ].&lt;br /&gt;&lt;br /&gt;&gt; &lt;span style="font-weight: bold;"&gt;pyth(3).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;[].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&gt; &lt;span style="font-weight: bold;"&gt;pyth(11).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;[].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&gt; &lt;span style="font-weight: bold;"&gt;pyth(12).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;[{3,4,5},{4,3,5}]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&gt; &lt;span style="font-weight: bold;"&gt;pyth(50).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;[{3,4,5},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;{4,3,5},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;{5,12,13},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;{6,8,10},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;{8,6,10},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;{8,15,17},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;{9,12,15},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;{12,5,13},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;{12,9,15},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;{12,16,20},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;{15,8,17},&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;{16,12,20}]&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family: arial;"&gt;&lt;br /&gt;The following code reduces the search space and is more efficient: &lt;br /&gt;pyth1(N) -&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;  [{A,B,C} ||&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;      A &lt;- lists:seq(1,N-2),      &lt;br /&gt;B &lt;- lists:seq(A+1,N-1),      &lt;br /&gt;C &lt;- lists:seq(B+1,N),      &lt;br /&gt;A+B+C =&lt; N,       A*A+B*B == C*C ].  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;5 Simplifications with List Comprehensions &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;As an example, list comprehensions can be used to simplify some of the functions in lists.erl: &lt;br /&gt;append(L)   -&gt;  [X || L1 &lt;- L, X &lt;- L1].&lt;br /&gt;map(Fun, L) -&gt; [Fun(X) || X &lt;- L].&lt;br /&gt;filter(Pred, L) -&gt; [X || X &lt;- L, Pred(X)].&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;6 Variable Bindings in List Comprehensions&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;  The scope rules for variables which occur in list comprehensions are as follows:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;all variables which occur in a generator pattern are assumed to be "fresh" variables&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;any variables which are defined before the list comprehension and which are used in filters have the values they had before the list comprehension&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;no variables may be exported from a list comprehension.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: arial;"&gt;As an example of these rules, suppose we want to write the function select, which selects certain elements from a list of tuples. We might write select(X, L) -&gt; [Y || {X, Y} &lt;- L]. with the intention of extracting all tuples from L where the first item is X. &lt;br /&gt;Compiling this yields the following diagnostic: &lt;br /&gt;./FileName.erl:Line: Warning: variable 'X' shadowed in generate&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: arial;"&gt;&lt;br /&gt;This diagnostic warns us that the variable X in the pattern is not the same variable as the variable X which occurs in the function head.&lt;br /&gt;Evaluating select yields the following result: &lt;br /&gt;&gt; &lt;span style="font-weight: bold;"&gt;select(b,[{a,1},{b,2},{c,3},{b,7}]).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;[1,2,3,7]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-family: arial;"&gt;This result is not what we wanted. To achieve the desired effect we must write select as follows: &lt;br /&gt;select(X, L) -&gt;  [Y || {X1, Y} &lt;- L, X == X1].  &lt;br /&gt;&lt;br /&gt;The generator now contains unbound variables and the test has been moved into the filter. This now works as expected: &lt;br /&gt;&gt; &lt;span style="font-weight: bold;"&gt;select(b,[{a,1},{b,2},{c,3},{b,7}]).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;[2,7]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-family: arial;"&gt;One consequence of the rules for importing variables into a list comprehensions is that certain pattern matching operations have to be moved into the filters and cannot be written directly in the generators. To illustrate this, do not write as follows:&lt;br /&gt;f(...) -&gt;&lt;/span&gt;&lt;span style="font-family: arial;"&gt; Y = ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;   [ Expression || PatternInvolving Y  &lt;- Expr, ...]&lt;br /&gt;...  &lt;br /&gt;&lt;br /&gt;Instead, write as follows: &lt;br /&gt;f(...) -&gt;&lt;/span&gt;&lt;span style="font-family: arial;"&gt; Y = ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;   [ Expression || PatternInvolving Y1  &lt;- Expr, Y == Y1, ...]    ... &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-6988824661895085962?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/6988824661895085962/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=6988824661895085962&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6988824661895085962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6988824661895085962'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/list-comprehensions.html' title='List Comprehensions'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8445654829245567485</id><published>2009-03-23T23:46:00.003+08:00</published><updated>2009-03-24T00:00:34.373+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='mnesia'/><title type='text'>Mnesia Indexing</title><content type='html'>&lt;span style="font-family:arial;"&gt;Data retrieval and matching can be performed very efficiently if we know the key for the record.&lt;/span&gt;&lt;span style="font-family:arial;"&gt; Conversely, if the key is not known, all records in a table must be searched. The larger the table the&lt;/span&gt;&lt;span style="font-family:arial;"&gt; more time consuming it will become. To remedy this problem Mnesia’s indexing capabilities are used to&lt;/span&gt;&lt;span style="font-family:arial;"&gt; improve data retrieval and matching of records.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;The following two functions manipulate indexes on existing tables:&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-weight: bold;"&gt;mnesia:add table index(Tab, AttributeName)&lt;/span&gt; -&gt; {aborted, R} |fatomic, ok}&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-weight: bold;"&gt;mnesia:del table index(Tab, AttributeName)&lt;/span&gt; -&gt; {aborted, R} |fatomic, ok}&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:arial;"&gt;These functions create or delete a table index on field defined by AttributeName. To illustrate this, add&lt;/span&gt;&lt;span style="font-family:arial;"&gt; an index to the table definition (employee, {emp_no, name, salary, sex, phone, room_no})&lt;/span&gt;&lt;span style="font-family:arial;"&gt;. The function which adds an index on the element&lt;/span&gt;&lt;span style="font-family:arial;"&gt; salary can be expressed in the following way:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;1 &gt; &lt;span style="font-weight: bold;"&gt;mnesia:add_table_index&lt;/span&gt;(employee, salary).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;The indexing capabilities of Mnesia are utilized with the following three functions, which retrieve and&lt;/span&gt;&lt;span style="font-family:arial;"&gt; match records on the basis of index entries in the database.&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-weight: bold;"&gt;mnesia:index read(Tab, SecondaryKey, AttributeName)&lt;/span&gt; -&gt; transaction abort |&lt;/span&gt;&lt;span style="font-family:arial;"&gt; RecordList. Avoids an exhaustive search of the entire table, by looking up the SecondaryKey in&lt;/span&gt;&lt;span style="font-family:arial;"&gt; the index to find the primary keys.&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-weight: bold;"&gt;mnesia:index match object(Pattern, AttributeName)&lt;/span&gt; -&gt; transaction abort |&lt;/span&gt;&lt;span style="font-family:arial;"&gt; RecordList. Avoids an exhaustive search of the entire table, by looking up the secondary key in&lt;/span&gt;&lt;span style="font-family:arial;"&gt; the index to find the primary keys. The secondary key is found in the AttributeName field of the&lt;/span&gt;&lt;span style="font-family:arial;"&gt; Pattern. The secondary key must be bound.&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-weight: bold;"&gt;mnesia:match object(Pattern)&lt;/span&gt; -&gt; transaction abort | RecordList. Uses indices to avoid&lt;/span&gt;&lt;span style="font-family:arial;"&gt; exhaustive search of the entire table. Unlike the other functions above, this function may utilize&lt;/span&gt;&lt;span style="font-family:arial;"&gt; any index as long as the secondary key is bound.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: arial; font-style: italic;"&gt;转自《Mnesia Database Management System&lt;/span&gt;&lt;span style="font-style: italic;"&gt;》&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8445654829245567485?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8445654829245567485/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8445654829245567485&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8445654829245567485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8445654829245567485'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/mnesia-indexing.html' title='Mnesia Indexing'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-7012519724369781897</id><published>2009-03-23T19:27:00.004+08:00</published><updated>2009-03-24T00:49:21.326+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='mnesia'/><title type='text'>Mnesia Database Management System</title><content type='html'>详细讲解Mnesia数据库，由简介入门到诸如分布式、容错、数据表分块等各种特性都涵盖到了，好文档，值得分享～～&lt;a href="http://sites.google.com/site/mfilestation/gong-gong-wen-jian/mnesia.pdf?attredirects=0"&gt;点这里下载&lt;/a&gt;～～&lt;br /&gt;&lt;br /&gt;另附一个Google搜出的文档&lt;a href="http://sites.google.com/site/mfilestation/gong-gong-wen-jian/mnesia_frags.pdf?attredirects=0"&gt;《Mnesia table fragmentation 过程及算法分析》（中文）&lt;/a&gt;，通过案例详细讲解了Mnesia的分片机制和原理～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-7012519724369781897?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/7012519724369781897/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=7012519724369781897&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7012519724369781897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7012519724369781897'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/mnesia-database-management-system.html' title='Mnesia Database Management System'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5779110253916644616</id><published>2009-03-23T08:57:00.002+08:00</published><updated>2009-03-23T09:06:37.567+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>在Ubuntu下排放多个终端窗口</title><content type='html'>在Ubuntu下，有时需要同时打开多个终端窗口来工作，一大堆窗口堆在桌面上，手动拖放排列很麻烦，此时Terminator就帮到你了，Terminator可以让你将一个终端水平或垂直的分割为两个，安装方法也很简单，直接sudo apt-get install terminator就可以了～～效果如下：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3uGUyB-9ISo/ScbghI4_UiI/AAAAAAAABMI/ASQzqZeVPdk/s1600-h/terminator.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 268px;" src="http://4.bp.blogspot.com/_3uGUyB-9ISo/ScbghI4_UiI/AAAAAAAABMI/ASQzqZeVPdk/s400/terminator.jpg" alt="" id="BLOGGER_PHOTO_ID_5316183270084268578" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5779110253916644616?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5779110253916644616/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5779110253916644616&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5779110253916644616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5779110253916644616'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/ubuntu_23.html' title='在Ubuntu下排放多个终端窗口'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3uGUyB-9ISo/ScbghI4_UiI/AAAAAAAABMI/ASQzqZeVPdk/s72-c/terminator.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-4637177082562042320</id><published>2009-03-19T19:32:00.005+08:00</published><updated>2009-03-19T19:49:31.623+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='augmented reality'/><title type='text'>V4L2 for ARToolKit</title><content type='html'>&lt;span style="font-family:arial;"&gt;之前运行ARToolKit的例子一直不成功，总是到了获取摄像头channel的地方出错，后来检查发现原来系我的摄像头只支持V4L2，但ARToolKit只提供了V4L1的驱动，怎么办呢～～唔洗惊，下载&lt;a href="http://sites.google.com/site/mfilestation/gong-gong-wen-jian/artk-v4l2-2.72.1.20080427.patch?attredirects=0"&gt;这个&lt;/a&gt;文件，将其放到ARToolKit根目录，然后输入如下命令：&lt;br /&gt;&lt;span&gt;&lt;b&gt;patch -p1 &amp;lt; path_file_name.patch&lt;/b&gt;&lt;br /&gt;重新编译一次ARToolKit，这次Configure的时候就会多出一个Video4Linux 2的选项了，编译完后摄像头设备就应该能够正常使用了～～&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-4637177082562042320?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/4637177082562042320/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=4637177082562042320&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4637177082562042320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4637177082562042320'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/v4l2-for-artoolkit.html' title='V4L2 for ARToolKit'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-1025562041939908540</id><published>2009-03-18T11:44:00.003+08:00</published><updated>2009-03-18T11:53:53.234+08:00</updated><title type='text'>体检日～～</title><content type='html'>&lt;span style="font-family: arial;font-family:arial;" &gt;今日学校要搞毕业体检，哇一早去到医院门前又系人山人海～～排左成个半钟先抽左个血....&lt;br /&gt;&lt;/span&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3uGUyB-9ISo/ScBvacr6jtI/AAAAAAAABKI/OfqlbeRV0Fc/s1600-h/IMG0033A.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_3uGUyB-9ISo/ScBvacr6jtI/AAAAAAAABKI/OfqlbeRV0Fc/s400/IMG0033A.jpg" alt="" id="BLOGGER_PHOTO_ID_5314370060464852690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;睇我地&lt;/span&gt;D大学生几有素质，平时灭火器箱上面放满的都系空汽水罐、宣传单张.... 依家居然连抽血之后用的绵签都甘样随处乱丢，完全唔顾及他人的感受同自己的形象～～某工业大学哇，睇你都教出什么学生了～～&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-1025562041939908540?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/1025562041939908540/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=1025562041939908540&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1025562041939908540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1025562041939908540'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/blog-post_18.html' title='体检日～～'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3uGUyB-9ISo/ScBvacr6jtI/AAAAAAAABKI/OfqlbeRV0Fc/s72-c/IMG0033A.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-3704188597527614433</id><published>2009-03-14T16:39:00.003+08:00</published><updated>2009-03-14T17:01:38.068+08:00</updated><title type='text'>最近....</title><content type='html'>&lt;span style="font-family:arial;"&gt;鼠标右键坏了，以为系统出了问题～～ARToolkit还是没装成功，老提示缺这个库缺那个包，装着装着发现系统不够空间....郁闷之下又重装了Ubuntu，这次给系统分了30GB的空间，应该足够了吧～～&lt;br /&gt;&lt;br /&gt;发现国内的技术相对国外还真的很很落后，别人N年前就已经发明的东东，现在在国内提起很多人还觉得很惊奇很神秘。大学理应系信息和技术的前沿，但大学生们都在忙着应付所谓学习，教科书里完全没有创造力和想象力～～连本应对我们最重要的毕业设计，也沦为老师们捞取项目外快的手段，不能自选导师、不能自选课题，一切由学院内定，院长还大条道理的说这是对我们好，大部分课题都系老师手头上的项目，感觉就像是借我们的毕业设计为他们提供免费劳动力，这和出卖学生有什么分别？教育是因什么如此沦落的？&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-3704188597527614433?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/3704188597527614433/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=3704188597527614433&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3704188597527614433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/3704188597527614433'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/blog-post_14.html' title='最近....'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8265271443420866264</id><published>2009-03-13T23:48:00.002+08:00</published><updated>2009-03-14T00:10:42.938+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='augmented reality'/><title type='text'>Augmented Reality 虚拟与现实的结合</title><content type='html'>&lt;span style="font-family:arial;"&gt;Augmented Reality系一种将电脑虚拟图像实时融合到现实世界的技术，可以广泛应用于导航、游戏、制造业、医学等各个领域～～下面两段视频演示的系其中一种实现手段：在真实世界中放置一些印有特殊编码的标记，当摄像头拍摄到包含这些标记的图像时，会实时识别标记的位置、角度、距离等信息，从而利用这些信息将虚拟物体添加到原始图像上，在屏幕上看起来就像虚拟物体真实存在一样～～&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ZKw_Mp5YkaE&amp;amp;hl=zh_CN&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/ZKw_Mp5YkaE&amp;amp;hl=zh_CN&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/HTYeuo6pIjY&amp;amp;hl=zh_CN&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/HTYeuo6pIjY&amp;amp;hl=zh_CN&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.hitl.washington.edu/artoolkit/"&gt;ARToolkit&lt;/a&gt;系一个实现Augmented Reailty技术的开源软件包，在Windows、Linux、MacOS三大主流系统上都能使用～～还有人开发了ActionScript版的，不过效率实在比较差～～等佩戴式显示设备流行起来之后，这样的技术应该会有很大的应用空间～～&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8265271443420866264?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8265271443420866264/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8265271443420866264&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8265271443420866264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8265271443420866264'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/augmented-reality.html' title='Augmented Reality 虚拟与现实的结合'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-1192576419589527610</id><published>2009-03-11T23:22:00.004+08:00</published><updated>2009-05-19T17:17:19.023+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><title type='text'>C++运算符重载</title><content type='html'>&lt;span style="font-family: arial;"&gt;运算符重载可以赋予已有的运算符多重含义，重新定义运算符的功能～～定义一个运算符重载函数跟定义普通函数相似，只是函数名必须以operator开头，如下：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&amp;lt;返回类型&amp;gt; operator &amp;lt;运算符&amp;gt;(&amp;lt;形参表&amp;gt;){....}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&amp;lt;返回类型&amp;gt;&amp;lt;类名&amp;gt;::operator &amp;lt;运算符&amp;gt;(&amp;lt;形参表&amp;gt;){....}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;重载的运算符必须是C++的合法运算符，如+、-、*、/、++等，下面来个例子：&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: rgb(255, 255, 255) none repeat scroll 0% 0%; color: black;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="color: #7f0055;"&gt;#&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;include &lt;/span&gt;&lt;span style="color: #2a00ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f3fbf;"&gt;stdio.h&lt;/span&gt;&lt;span style="color: #2a00ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #7f0055;"&gt;#&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;include &lt;/span&gt;&lt;span style="color: #2a00ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f3fbf;"&gt;string.h&lt;/span&gt;&lt;span style="color: #2a00ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #7f0055; font-weight: bold;"&gt;class&lt;/span&gt; Person{&lt;br /&gt;&lt;span style="color: #7f0055; font-weight: bold;"&gt;private&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: #7f0055; font-weight: bold;"&gt;char&lt;/span&gt; name[20];&lt;br /&gt;&lt;span style="color: #7f0055; font-weight: bold;"&gt;unsigned&lt;/span&gt; &lt;span style="color: #7f0055; font-weight: bold;"&gt;int&lt;/span&gt; age;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #7f0055; font-weight: bold;"&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: #3f7f59;"&gt;//构造函数&lt;/span&gt;&lt;br /&gt;Person(&lt;span style="color: #7f0055; font-weight: bold;"&gt;const&lt;/span&gt; &lt;span style="color: #7f0055; font-weight: bold;"&gt;char&lt;/span&gt; *pname,&lt;span style="color: #7f0055; font-weight: bold;"&gt;unsigned&lt;/span&gt; &lt;span style="color: #7f0055; font-weight: bold;"&gt;int&lt;/span&gt; page){&lt;br /&gt;strcpy(name,pname);&lt;br /&gt;age=page;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3f7f59;"&gt;//重载运算符+，返回两个Person实例的age相加&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #7f0055; font-weight: bold;"&gt;int&lt;/span&gt; &lt;span style="color: #7f0055; font-weight: bold;"&gt;operator&lt;/span&gt; +(Person &amp;amp;p){&lt;br /&gt;&lt;span style="color: #7f0055; font-weight: bold;"&gt;return&lt;/span&gt; age+p.age;&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #7f0055; font-weight: bold;"&gt;int&lt;/span&gt; &lt;span style="color: #7f0055; font-weight: bold;"&gt;main&lt;/span&gt;(){&lt;br /&gt;&lt;span style="color: #3f7f59;"&gt;//创建两个Person&lt;/span&gt;&lt;br /&gt;Person *p1=&lt;span style="color: #7f0055; font-weight: bold;"&gt;new&lt;/span&gt; Person(&lt;span style="color: #2a00ff;"&gt;"&lt;/span&gt;&lt;span style="color: #2a00ff;"&gt;Oscar Tang&lt;/span&gt;&lt;span style="color: #2a00ff;"&gt;"&lt;/span&gt;,23);&lt;br /&gt;Person *p2=&lt;span style="color: #7f0055; font-weight: bold;"&gt;new&lt;/span&gt; Person(&lt;span style="color: #2a00ff;"&gt;"&lt;/span&gt;&lt;span style="color: #2a00ff;"&gt;JoJo Zhou&lt;/span&gt;&lt;span style="color: #2a00ff;"&gt;"&lt;/span&gt;,22);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3f7f59;"&gt;//测试一下重载后的+号～～&lt;/span&gt;&lt;br /&gt;printf(&lt;span style="color: #2a00ff;"&gt;"&lt;/span&gt;&lt;span style="color: #2a00ff;"&gt;%d&lt;/span&gt;&lt;span style="color: #2a00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #2a00ff;"&gt;"&lt;/span&gt;,*p1+*p2);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;OK～～编译后运行就可以看到结果了～～&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-1192576419589527610?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/1192576419589527610/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=1192576419589527610&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1192576419589527610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1192576419589527610'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/c.html' title='C++运算符重载'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5450917224970989354</id><published>2009-03-09T21:14:00.004+08:00</published><updated>2009-03-12T15:08:55.714+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>SnippetShare</title><content type='html'>SnippetShare系我写的一个在线代码编辑器，有自动缩进、代码着色、行号标示、TAB输入等功能，主要用于在线编辑、管理自己的代码片段，或通过博客widget等方式共享代码～～现在只写好了核心部分，先发个图出来～～&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3uGUyB-9ISo/SbUYX0grWwI/AAAAAAAAA_M/scjMF6O_fEs/s1600-h/snippet.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 144px;" src="http://2.bp.blogspot.com/_3uGUyB-9ISo/SbUYX0grWwI/AAAAAAAAA_M/scjMF6O_fEs/s400/snippet.png" alt="" id="BLOGGER_PHOTO_ID_5311178133065128706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;有兴趣的可以到&lt;a href="http://mooooscar.appspot.com/index"&gt;这里&lt;/a&gt;试试效果，或者&lt;a href="http://sites.google.com/site/mfilestation/gong-gong-wen-jian/SnippetShare.rar?attredirects=0"&gt;下载源代码&lt;/a&gt;～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5450917224970989354?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5450917224970989354/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5450917224970989354&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5450917224970989354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5450917224970989354'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/snippetshare.html' title='SnippetShare'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3uGUyB-9ISo/SbUYX0grWwI/AAAAAAAAA_M/scjMF6O_fEs/s72-c/snippet.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8511589769589760649</id><published>2009-03-09T12:05:00.000+08:00</published><updated>2009-03-09T12:13:41.706+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gedit'/><category scheme='http://www.blogger.com/atom/ns#' term='mxml'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>扩展gedit的突出显示模式以支持MXML</title><content type='html'>gedit支持代码高亮（突出显示模式），十分方便编程，不过gedit也非万能，它不支持一些不太流行的代码的高亮显示，不过幸好可以自己手工扩展，只需到&lt;strong&gt;&lt;a href="http://code.google.com/p/flashbsm/source/browse/testing/language-specs/" target="_blank"&gt;这里&lt;/a&gt;&lt;/strong&gt;下载几个文件，将他们放到/usr/share/gtksourceview-2.0/language-specs/目录下，重启gedit即可，效果如下：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3uGUyB-9ISo/SbP0UQIij0I/AAAAAAAAA-U/9EEjLljO0GM/s1600-h/mxml.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 326px;" src="http://1.bp.blogspot.com/_3uGUyB-9ISo/SbP0UQIij0I/AAAAAAAAA-U/9EEjLljO0GM/s400/mxml.jpg" alt="" id="BLOGGER_PHOTO_ID_5310857014365294402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;一点感想：一个应用程序不可能一发布就什么都支持，但应该做到容易扩展和指引清晰，将用户变成自己开发团队的一员，不仅事半功倍，还利于软件的发展～～因此底层架构和事前规划十分十分重要～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8511589769589760649?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8511589769589760649/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8511589769589760649&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8511589769589760649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8511589769589760649'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/geditmxml_09.html' title='扩展gedit的突出显示模式以支持MXML'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3uGUyB-9ISo/SbP0UQIij0I/AAAAAAAAA-U/9EEjLljO0GM/s72-c/mxml.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-774854044110090886</id><published>2009-03-09T12:02:00.000+08:00</published><updated>2009-03-09T12:13:27.408+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Interconnecting Erlang Nodes</title><content type='html'>&lt;p&gt;&lt;strong&gt;警告&lt;/strong&gt;：Erlang节点一旦相互连接就可以对对方进行完全的控制，包括在对方上运行&lt;strong&gt;任何命令&lt;/strong&gt;，甚至可以完全关闭对方节点～～&lt;/p&gt; &lt;h3&gt;Cookie&lt;/h3&gt; &lt;p style="padding-left: 30px;"&gt;首先应将各个节点上的Cookie设置成一样，设置Cookie有如下方式：&lt;/p&gt; &lt;p style="padding-left: 60px;"&gt;在Erlang节点启动时添加如下参数：&lt;br /&gt;erl &lt;strong&gt;-setcookie THISISJUSTATEST&lt;/strong&gt; -name node1&lt;/p&gt; &lt;p style="padding-left: 60px;"&gt;或者可以将cookie存储在$HOME/.erlang.cookie文件里：&lt;strong&gt;&lt;br /&gt;THISISJUSTATEST&lt;/strong&gt;&lt;/p&gt; &lt;p style="padding-left: 60px;"&gt;又或者当你用参数-name或-sname启动Erlang节点之后，可以执行如下函数：&lt;br /&gt;&lt;strong&gt;erlang:set_cookie&lt;/strong&gt;(node(), ‘ THISISJUSTATEST ‘).&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;要检查各个节点上的Cookie是否都一样，可调用如下函数：&lt;br /&gt;&lt;strong&gt;erlang:get_cookie().&lt;/strong&gt;&lt;/p&gt; &lt;h3&gt;Nodes names&lt;/h3&gt; &lt;p style="padding-left: 30px;"&gt;当启动Erlang节点的时候，务必要设置一个唯一的节点名：&lt;br /&gt;erl &lt;strong&gt;-name&lt;/strong&gt; nodename&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;节点启动后，可用如下函数来检视当前节点名：&lt;br /&gt;&lt;strong&gt;node()&lt;/strong&gt;.&lt;br /&gt;‘ nodename@machine1.example.org ‘&lt;/p&gt; &lt;h3&gt;Hosts file&lt;/h3&gt; &lt;p style="padding-left: 30px;"&gt;在$HOME目录（或者code:root_dir()目录）创建文件.hosts.erlang，其内容为其他节点所在的主机名，例如在machine1里其内容如下：&lt;br /&gt;‘ machine2.example.com ‘.&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;执行如下函数检查其是否被正确的加载：&lt;br /&gt;&lt;strong&gt;net_adm:host_file()&lt;/strong&gt;.&lt;/p&gt; &lt;h3&gt;Interconnect the Erlang nodes&lt;/h3&gt; &lt;p style="padding-left: 30px;"&gt;首先当然系启动所有节点啦，然后在node1上执行如下函数：&lt;br /&gt;&lt;strong&gt;net_adm:world()&lt;/strong&gt;.&lt;br /&gt;[' node2@machine2.example.com ',' node1@machine1.example.com']&lt;br /&gt;可以看到node1已经发现了在machine2上的令一个节点node2～～&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;执行如下函数看看自己都连接到什么节点上了：&lt;br /&gt;&lt;strong&gt;nodes()&lt;/strong&gt;.&lt;br /&gt;[' node2@machine2.example.com ']&lt;br /&gt;已经连接到node2上了～～&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;当然啦你也可以手动尝试连接到其他节点，如果连接成功会返回pong，失败则返回pang：&lt;br /&gt;&lt;strong&gt;net_adm:ping&lt;/strong&gt;(’ node2@machine2.example.com ‘).&lt;br /&gt;pong&lt;br /&gt;&lt;strong&gt;net_adm:ping&lt;/strong&gt;(’ node3@notexist.com ‘).&lt;br /&gt;pang&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;最后搞个比较有趣的东东，调用如下函数可以收集所有其他节点上的时间：&lt;br /&gt;&lt;strong&gt;rpc:multical&lt;/strong&gt;(nodes(), erlang, localtime, []).&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;上面的这个函数定义如下：&lt;br /&gt;rpc:multical(Nodes, Module, Function, Args) -&gt; {ResL, BadNodes}&lt;/p&gt; &lt;p style="padding-left: 60px;"&gt;Nodes = [node()]&lt;br /&gt;Module = Function = atom()&lt;br /&gt;Args = [term()]&lt;br /&gt;ResL = [term()]&lt;br /&gt;BadNodes = [node()]&lt;/p&gt; &lt;h3&gt;Start an erlang shell on a remote node&lt;/h3&gt; &lt;p style="padding-left: 30px;"&gt;连接到其他节点上之后，你还可以在远程节点上运行Erlang shell，例如在node1的shell上按Ctrl+G可以进入到任务控制模式（jobs control mode）：&lt;br /&gt;User switch command&lt;br /&gt;–&gt;&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;输入h可以获得帮助：&lt;br /&gt;User switch command&lt;br /&gt;–&gt; &lt;strong&gt;h&lt;/strong&gt;&lt;br /&gt;c [nn] - connect to job&lt;br /&gt;i [nn] - interrupt job&lt;br /&gt;….&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;输入j以查看当前任务：&lt;br /&gt;–&gt; &lt;strong&gt;j&lt;/strong&gt;&lt;br /&gt;1* {shell, start, []}&lt;br /&gt;–&gt;&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;我们可以在node2上创建一个远程任务：&lt;br /&gt;–&gt; &lt;strong&gt;r ‘ node2@machine2.example.com ‘&lt;/strong&gt;&lt;br /&gt;–&gt; j&lt;br /&gt;1 {shell, start, []}&lt;br /&gt;2* {node2@machine2.example.com, shell, start, []}&lt;br /&gt;–&gt;&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;连接到新的任务：&lt;br /&gt;–&gt; &lt;strong&gt;c 2&lt;/strong&gt;&lt;br /&gt;Eshell V5.4 (abort with ^G)&lt;br /&gt;(node2@machine2.example.com) 1&gt;&lt;/p&gt; &lt;h3&gt;Play with your remote Erlang shell&lt;/h3&gt; &lt;p style="padding-left: 30px;"&gt;提醒一下：连接到远程节点上之后，你可以对其进行任何操作，就像你操作本地节点一样～～&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;例如我可以获取远程节点的内存状况：&lt;strong&gt;&lt;br /&gt;memory()&lt;/strong&gt;.&lt;br /&gt;[{total, 3010399}, ....]&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;或者可以获取远程节点当前有多少进程在运行：&lt;br /&gt;&lt;strong&gt;erlang:system_info(process_count)&lt;/strong&gt;.&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;….&lt;/p&gt; &lt;h3&gt;Close the remote Erlang shell safely&lt;/h3&gt; &lt;p style="padding-left: 30px;"&gt;搞掂之后记得要关闭远程Erlang shell，再次按Ctrl+G，然后输入j查看远程shell的ID：&lt;br /&gt;User switch command&lt;br /&gt;–&gt; &lt;strong&gt;j&lt;/strong&gt;&lt;br /&gt;1 {shell, start, []}&lt;br /&gt;2* {node2@machine2.example.com, shell, start, []}&lt;br /&gt;–&gt;&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;远程shell的ID系2，然后输入如下命令来关掉它：&lt;br /&gt;–&gt; &lt;strong&gt;k 2&lt;/strong&gt;&lt;br /&gt;–&gt;&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;不过没有任何关闭成功或失败的信息，所以再查看一下所有任务确认远程shell已经关闭：&lt;br /&gt;–&gt; &lt;strong&gt;j&lt;/strong&gt;&lt;br /&gt;1 {shell, start, []}&lt;br /&gt;–&gt;&lt;/p&gt; &lt;p&gt;最后还有一个更加便捷的方式来连接到远程节点并启动一个远程shell：&lt;br /&gt;erl -sname node1 &lt;strong&gt;-remsh node2@machine2.example.com&lt;br /&gt;&lt;/strong&gt;Erlang (BEAM) emulator version 5.4.8 [source] [hipe]&lt;br /&gt;Eshell V5.4.8 (abort with ^G)&lt;br /&gt;(node2@machine2.example.com)1&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;（译自Ejabber Tutorials）&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-774854044110090886?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/774854044110090886/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=774854044110090886&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/774854044110090886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/774854044110090886'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/interconnecting-erlang-nodes_08.html' title='Interconnecting Erlang Nodes'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2028969053252199274</id><published>2009-03-09T12:01:00.000+08:00</published><updated>2009-03-09T12:13:11.866+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3d'/><category scheme='http://www.blogger.com/atom/ns#' term='street art'/><title type='text'>3D Street Art</title><content type='html'>&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="600" height="400" flashvars="host=picasaweb.google.com&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fmooooscar%2Falbumid%2F5310428052788905425%3Fkind%3Dphoto%26alt%3Drss" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;鬼佬D创意真系一流～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2028969053252199274?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2028969053252199274/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2028969053252199274&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2028969053252199274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2028969053252199274'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/3d-street-art_7476.html' title='3D Street Art'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-1680030051528419565</id><published>2009-03-09T12:00:00.003+08:00</published><updated>2009-03-09T12:17:11.058+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><title type='text'>面瘫</title><content type='html'>&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="288" height="192" flashvars="host=picasaweb.google.com&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fmooooscar%2Falbumid%2F5310465277382469217%3Fkind%3Dphoto%26alt%3Drss" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;哈哈～～很搞笑～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-1680030051528419565?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/1680030051528419565/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=1680030051528419565&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1680030051528419565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1680030051528419565'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/blog-post_9173.html' title='面瘫'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-7741506917968987303</id><published>2009-03-09T12:00:00.000+08:00</published><updated>2009-03-09T12:12:11.318+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gravatar'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>在项目中使用Gravatar头像</title><content type='html'>Gravatar即Globally Recognized Avatars（个人全球统一标识），简单来说就系一种通用的头像服务，用户只需在Gravatar上注册，绑定一个头像到自己的邮箱地址，那么在所有使 用Gravatar服务的网站（例如WordPress）上使用这个邮箱地址发帖发评论时，头像就会自动贴上，开发者无须自己维护用户的头像数 据～～Gravator服务通过URL调用，提供PHP、JSP、.NET、Python等多种语言的帮助，例如用Python可以这样写：&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#3f7f59; '&gt;#import code for encoding urls and generating md5 hashes&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#7f0055; font-weight:bold; '&gt;import&lt;/span&gt; urllib, hashlib&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#3f7f59; '&gt;#Set your variables here&lt;/span&gt;&lt;br /&gt;email = &lt;span style='color:#2a00ff; '&gt;"someone@somewhere.com"&lt;/span&gt;&lt;br /&gt;default = &lt;span style='color:#2a00ff; '&gt;"http://www.somewhere.com/homsar.jpg"&lt;/span&gt;&lt;br /&gt;size = 40&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#3f7f59; '&gt;#construct the url&lt;/span&gt;&lt;br /&gt;gravatar_url = &lt;span style='color:#2a00ff; '&gt;"http://www.gravatar.com/avatar.php?"&lt;/span&gt; &lt;br /&gt;gravatar_url += urllib.urlencode({&lt;span style='color:#2a00ff; '&gt;'gravatar_id'&lt;/span&gt;:hashlib.md5(email).hexdigest(),&lt;br /&gt;    &lt;span style='color:#2a00ff; '&gt;'default'&lt;/span&gt;:default,&lt;span style='color:#2a00ff; '&gt;'size'&lt;/span&gt;:str(size)})&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;gravatar_url即为用户someone@somewhere.com的头像路径～～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-7741506917968987303?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/7741506917968987303/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=7741506917968987303&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7741506917968987303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7741506917968987303'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/gravatar_08.html' title='在项目中使用Gravatar头像'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-8368496311930094059</id><published>2009-03-09T11:39:00.000+08:00</published><updated>2009-03-09T12:14:21.374+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python中字符串与时间的转换</title><content type='html'>&lt;p&gt;使用datetime.strptime函数可将时间字符串转换为datetime类型数据，见下例：&lt;/p&gt; &lt;p&gt;&gt;&gt;&gt; from datetime import datetime&lt;br /&gt;&gt;&gt;&gt; datetime.&lt;strong&gt;strptime&lt;/strong&gt;(”2009-02-20 15:49:21″,&lt;strong&gt;“%Y-%m-%d %H:%M:%S”&lt;/strong&gt;)&lt;br /&gt;datetime.datetime(2009, 2, 20, 15, 49, 21)&lt;/p&gt; &lt;p&gt;%Y代表年份，%m代表月份…. 详细请参看&lt;a href="http://docs.python.org/library/time.html#time.strftime" target="_blank"&gt;Python Library Reference&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-8368496311930094059?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/8368496311930094059/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=8368496311930094059&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8368496311930094059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/8368496311930094059'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/python.html' title='Python中字符串与时间的转换'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-6111673059926998329</id><published>2009-03-09T02:11:00.001+08:00</published><updated>2009-03-09T02:11:55.284+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='gnu'/><title type='text'>inet_ntoa使用要注意….</title><content type='html'>在GNU C Library Reference里函数inet_ntoa有如下描述：&lt;br /&gt;&lt;br /&gt;char * inet_ntoa (struct in_addr addr)&lt;br /&gt;&lt;br /&gt;This function converts the IPv4 Internet host address addr to a string in the standard numbers-and-dots notation. The return value is a pointer into a statically-allocated buffer. Subsequent calls will overwrite the same buffer, so you should copy the string if you need to save it. In multi-threaded programs each thread has an own statically-allocated buffer. But still subsequent calls of inet_ntoa in the same thread will overwrite the result of the last call.&lt;br /&gt;&lt;br /&gt;注意粗体部分，inet_ntoa函数返回的指针系指向一个固定分配的缓存区的，因此每次调用inet_ntoa都会覆盖上次执行的结果，用来直接输出就没什么问题，但如果要保存的话，就需要自己另外开辟空间将结果复制过去了～～另外对于多线程程序，由于每个线程都有其独立的固定分配缓存区，因此各个线程之间不会互相覆盖对方的执行结果。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-6111673059926998329?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/6111673059926998329/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=6111673059926998329&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6111673059926998329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/6111673059926998329'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/inetntoa.html' title='inet_ntoa使用要注意….'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-7213764574745951617</id><published>2009-03-09T02:09:00.002+08:00</published><updated>2009-03-09T02:11:32.383+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='sniffer'/><title type='text'>解析Sniffer数据包中的地址与端口</title><content type='html'>继续昨天的FTP Sniffer的开发，现在要在嗅探到感兴趣的数据后，显示数据的来源和去向（源/目标地址及端口），地址以整数形式保存了在sniff_ip结构体里，而端口则在sniff_tcp结构体里，这些数据都以网络字节顺序（network byte order）保存，需要在使用前转换成本地字节顺序（host byte order），相关转换函数包含在arpa/inet.h和netinet/in.h两个头文件里，转换方法如下：&lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#3f7f59; '&gt;//输出源地址与端口&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#7f0055; font-weight:bold; '&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style='color:#2a00ff; '&gt;"&lt;/span&gt;&lt;span style='color:#2a00ff; '&gt;Src Addr : &lt;/span&gt;&lt;span style='color:#2a00ff; '&gt;"&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style='color:#7f0055; font-weight:bold; '&gt;inet_ntoa&lt;/span&gt; ( ip-&gt;ip_src ) &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;span style='color:#7f0055; font-weight:bold; '&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style='color:#2a00ff; '&gt;"&lt;/span&gt;&lt;span style='color:#2a00ff; '&gt;Src Port : &lt;/span&gt;&lt;span style='color:#2a00ff; '&gt;"&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style='color:#7f0055; font-weight:bold; '&gt;ntohs&lt;/span&gt; ( tcp-&gt;th_sport ) &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#3f7f59; '&gt;//输出目标地址与端口&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#7f0055; font-weight:bold; '&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style='color:#2a00ff; '&gt;"&lt;/span&gt;&lt;span style='color:#2a00ff; '&gt;Dst Addr : &lt;/span&gt;&lt;span style='color:#2a00ff; '&gt;"&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style='color:#7f0055; font-weight:bold; '&gt;inet_ntoa&lt;/span&gt; ( ip-&gt;ip_dst ) &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;span style='color:#7f0055; font-weight:bold; '&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style='color:#2a00ff; '&gt;"&lt;/span&gt;&lt;span style='color:#2a00ff; '&gt;Dst Port : &lt;/span&gt;&lt;span style='color:#2a00ff; '&gt;"&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style='color:#7f0055; font-weight:bold; '&gt;ntohs&lt;/span&gt; ( tcp-&gt;th_dport ) &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;inet_ntoa函数将struct in_addr类型数据转换为点分式IP地址字符串，ntohs将一个16位无符号整数从网络字节顺序转换为本地字节顺序。具体函数定义可参见GNU C Library相关章节。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-7213764574745951617?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/7213764574745951617/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=7213764574745951617&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7213764574745951617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7213764574745951617'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/sniffer.html' title='解析Sniffer数据包中的地址与端口'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-1839298695476364866</id><published>2009-03-09T02:09:00.001+08:00</published><updated>2009-03-09T02:09:45.735+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Linux卸载源码包</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Q：&lt;/span&gt;一般安装源码包都系./configure、make、make install，那怎么卸载呢？？&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A：&lt;/span&gt;卸载命令为 make uninstall&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-1839298695476364866?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/1839298695476364866/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=1839298695476364866&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1839298695476364866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/1839298695476364866'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/linux.html' title='Linux卸载源码包'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-7330969721973872317</id><published>2009-03-09T02:08:00.000+08:00</published><updated>2009-03-09T02:09:06.384+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gen_server'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='otp'/><title type='text'>gen_server中handle_call、cast、info的用法</title><content type='html'>Erlang中的gen_server有handle_call、handle_cast和handle_info这三个接口函数，其函数定义十分相近，但使用上有一些细微的差别：&lt;br /&gt;&lt;br /&gt;handle_call用于处理远程调用（remote procedure calls），一般应返回一个Reply（{reply, Reply, State}）作为调用结果；&lt;br /&gt;&lt;br /&gt;handle_cast一般不返回Reply（{noreply, NewState}），而只改变服务器的状态，一般用于对服务器进行某些操作，比如关闭服务器；&lt;br /&gt;&lt;br /&gt;handle_info用于处理其他一些“自发性”的信息（Spontaneous Message），即诸如相关连接进程崩溃所发出的{’EXIT’, Pid, Why}信息，同样一般没有Reply而只改变服务器状态。&lt;br /&gt;&lt;br /&gt;译自《Programming Erlang》&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-7330969721973872317?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/7330969721973872317/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=7330969721973872317&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7330969721973872317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7330969721973872317'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/genserverhandlecallcastinfo.html' title='gen_server中handle_call、cast、info的用法'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-4221898492893888466</id><published>2009-03-09T02:06:00.001+08:00</published><updated>2009-04-02T21:32:24.471+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>在Erlang中处理XML数据</title><content type='html'>xmerl_lib有一个方便处理XML的函数simplify_element（但该函数没有公开在文档里），可以用来解析和处理XML数据，如下例：&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;xml_example() -&gt;&lt;br /&gt;    Options=[{space,normalize},{encoding,&lt;span style='color:#2a00ff; '&gt;"utf-8"&lt;/span&gt;}],&lt;br /&gt;    Str=”&amp;lt;root title=’test’&gt;&amp;lt;person id=’oscar’ gender=’m'&gt;Oscar Tang&amp;lt;/person&gt;&lt;br /&gt;        &amp;lt;person id=’jojo’ gender=’f'&gt;JoJo Zhou&amp;lt;/person&gt;&amp;lt;/root&gt;”,&lt;br /&gt;    {Xml,_}=xmerl_scan:string(Str,Options),&lt;br /&gt;    xmerl_lib:simplify_element(Xml).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;上述函数运行在我机上大约耗时230微秒（绝大部分耗在xmerl_scan:string函数上），即每秒可以将超过4000个XML数据从字符串转换成如下数据结构：&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;{root,[{title,&lt;span style='color:#2a00ff; '&gt;"test"&lt;/span&gt;}],[&lt;br /&gt;    {person,[{id,&lt;span style='color:#2a00ff; '&gt;"oscar"&lt;/span&gt;},{gender,&lt;span style='color:#2a00ff; '&gt;"m"&lt;/span&gt;}],[&lt;span style='color:#2a00ff; '&gt;"Oscar Tang"&lt;/span&gt;]},&lt;br /&gt;    {person,[{id,&lt;span style='color:#2a00ff; '&gt;"jojo"&lt;/span&gt;},{gender,&lt;span style='color:#2a00ff; '&gt;"f"&lt;/span&gt;}],[&lt;span style='color:#2a00ff; '&gt;"JoJo Zhou"&lt;/span&gt;]}&lt;br /&gt;]}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;返回数据的一般结构为：&lt;br /&gt;{node_name,[attributes],[children]}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-4221898492893888466?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/4221898492893888466/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=4221898492893888466&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4221898492893888466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4221898492893888466'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/erlangxml.html' title='在Erlang中处理XML数据'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-267476181756808343</id><published>2009-03-09T02:05:00.000+08:00</published><updated>2009-03-09T02:06:12.435+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang性能评测</title><content type='html'>&lt;p&gt;JavaEye上的chaoslawful分别对Erlang的ETS/DETS、Port、I/O进行了性能评测，附有详细的测试环境、方法、结果以及测试用的代码下载～～见原文：&lt;/p&gt; &lt;p&gt;&lt;a href="http://chaoslawful.javaeye.com/blog/310346" target="_blank"&gt;Erlang文件IO性能评测&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://chaoslawful.javaeye.com/blog/310366" target="_blank"&gt;Erlang Port性能评测&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://chaoslawful.javaeye.com/blog/310376" target="_blank"&gt;Erlang ETS/DETS性能评测&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-267476181756808343?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/267476181756808343/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=267476181756808343&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/267476181756808343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/267476181756808343'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/erlang_4586.html' title='Erlang性能评测'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-2760186790544272175</id><published>2009-03-09T02:04:00.000+08:00</published><updated>2009-03-09T02:05:46.214+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gedit'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>提高Gedit的代码输入速度</title><content type='html'>在Ubuntu里比较喜欢用Gedit编写代码，有时面对又长又枯燥重复又重复的代码，会很有把键盘扔掉的冲动～～这个时候，gedit的“片段”插件就可以帮到你了，该插件用于帮助用户快速的插入一些常用的字符片段，还可以设置片段中变量的位置和默认值，看个例子： &lt;p&gt;首先选择&lt;strong&gt;编辑&gt;首选项&gt;插件&lt;/strong&gt;，激活“片段”，如下图左：&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3uGUyB-9ISo/SbQI4E-zBnI/AAAAAAAAA_E/G3JI2VnjLeo/s1600-h/gedit_plugin.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 192px;" src="http://2.bp.blogspot.com/_3uGUyB-9ISo/SbQI4E-zBnI/AAAAAAAAA_E/G3JI2VnjLeo/s400/gedit_plugin.jpg" alt="" id="BLOGGER_PHOTO_ID_5310879620079486578" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;然后我们添加一个Python分类下的片段handler，如上图右，其中的&lt;strong&gt;$1&lt;/strong&gt;为第一个变量，&lt;strong&gt;${2:get}&lt;/strong&gt;为另一个变量，其默认值为get，&lt;strong&gt;$0&lt;/strong&gt;为最后光标停留的位置，Tab触发器一项设置为handler，则输入时只需键入handler然后按Tab键，gedit就会自动按片段设置补齐，光标停留在$1所在位置等待用户输入，然后再按Tab光标会跑到$2处，如此类跑，最后到$0处～～&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-2760186790544272175?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/2760186790544272175/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=2760186790544272175&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2760186790544272175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/2760186790544272175'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/gedit.html' title='提高Gedit的代码输入速度'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3uGUyB-9ISo/SbQI4E-zBnI/AAAAAAAAA_E/G3JI2VnjLeo/s72-c/gedit_plugin.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-4430834490709470591</id><published>2009-03-09T02:03:00.002+08:00</published><updated>2009-03-09T02:04:27.744+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang连接操作MySQL</title><content type='html'>&lt;p&gt;需要用到一個名為Erlang-MySQL-Driver的開源項目，&lt;a href="http://code.google.com/p/erlang-mysql-driver/" target="_blank"&gt;點這裏去項目主頁&lt;/a&gt;~~&lt;/p&gt; &lt;p&gt;&lt;strong&gt;創建並打開第一個MySQL連接&lt;/strong&gt;（pl為連接池標識）：&lt;/p&gt; &lt;p&gt;mysql:start_link(pl,”localhost”,”user”,”password”,”database”).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;可繼續添加連接到連接池&lt;/strong&gt;：&lt;/p&gt; &lt;p&gt;mysql:connect(pl,”localhost”,undefined,”user”,”password”,”database”,true).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;執行SQL語句&lt;/strong&gt;：&lt;/p&gt; &lt;p&gt;mysql:fetch(pl,&lt;&lt;”insert into table ….”&gt;&gt;),&lt;/p&gt; &lt;p&gt;Result=mysql:fetch(pl,&lt;&lt;”select * from table ….”&gt;&gt;),&lt;/p&gt; &lt;p&gt;io:format(”Result : ~p\n”,[Result]).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;處理返回結果&lt;/strong&gt;：&lt;/p&gt; &lt;p&gt;執行語句後的返回結果有如下三種類型：&lt;/p&gt; &lt;p&gt;{data,MySQLRes}, {update,MySQLRes}, {error,MySQLRes}&lt;/p&gt; &lt;p&gt;MySQLRes為mysql_result類型的record數據（mysql_result定義與mysql.hrl文件中），其具體結構如下：&lt;/p&gt; &lt;p&gt;{mysql_result, [fieldinfo], [rows], affectedrows, [error]}&lt;/p&gt; &lt;p&gt;fieldinfo：域信息，包括域所屬表、域名、數據長度、數據類型；&lt;/p&gt; &lt;p&gt;rows：實際數據；&lt;/p&gt; &lt;p&gt;affectedrows：執行SQL語句影響的行數；&lt;/p&gt; &lt;p&gt;error：錯誤信息。&lt;/p&gt; &lt;p&gt;Erlang-mysql-driver還包括事務等其他功能，具體可以查看&lt;a href="http://code.google.com/p/erlang-mysql-driver/source/checkout" target="_blank"&gt;下載包&lt;/a&gt;裏的例子。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-4430834490709470591?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/4430834490709470591/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=4430834490709470591&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4430834490709470591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/4430834490709470591'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/erlangmysql.html' title='Erlang连接操作MySQL'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-7615127443336544499</id><published>2009-03-09T02:03:00.001+08:00</published><updated>2009-03-09T02:03:53.324+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tencent'/><category scheme='http://www.blogger.com/atom/ns#' term='qq'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>WebQQ限量封测中</title><content type='html'>&lt;p&gt;“从今天起，能看网页既能上QQ。无需下载、安装、等待、升级”~~&lt;/p&gt; &lt;p&gt;WebQQ开始了限量封测，用户可到&lt;a href="http://im.qq.com/webqq/" target="_blank"&gt;WebQQ主页&lt;/a&gt;登记申请，腾讯将通过QQ消息发送试用通知~~WebQQ提供如下功能：&lt;/p&gt; &lt;ul&gt;&lt;li&gt;直接在&lt;span class="ta"&gt;页面上与QQ好友以及群保持联系&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="tb"&gt;查收未读的QQ邮件&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="tc"&gt;跟踪好友的最新动态&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="td"&gt;便捷查看和处理未读消息&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;继腾讯在QQ-Mail里插入QQ聊天模块后，终于推出WebQQ了，哈哈爽，日后只要能用浏览器上网就可以方便快捷的上Q了~~有人觉得老是要开着浏览器很麻烦，但是试想一下，若将来的电脑只需安装浏览器，浏览器替代了今天桌面的作用，那还会麻烦么？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-7615127443336544499?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/7615127443336544499/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=7615127443336544499&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7615127443336544499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/7615127443336544499'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/webqq.html' title='WebQQ限量封测中'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5884741725220109274</id><published>2009-03-09T02:02:00.002+08:00</published><updated>2009-03-09T02:03:20.453+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><title type='text'>初试Google App Engine</title><content type='html'>&lt;p&gt;Google App Engine可以让你上传自己的应用到Google服务器上运行，基本上可让开发者完全摆脱服务器配置等繁琐的工作，将注意力集中到应用的开发上，目前仅支持用Python开发，相信将来应该会集成更多开发环境，如果再加一个在线编译器就更好了～～&lt;/p&gt; &lt;p&gt;要使用Google App Engine可先到其&lt;a href="http://code.google.com/appengine/" target="_blank"&gt;主页&lt;/a&gt;注册，并&lt;a href="http://code.google.com/appengine/downloads.html" target="_blank"&gt;下载Google App Engine的SDK&lt;/a&gt;，支持Windows / Linux / Mac OS X等多种主流操作系统，SDK里包含一个本地测使用服务端及上传组件等东东，安装完开发环境后可以到&lt;a href="http://code.google.com/appengine/docs/" target="_blank"&gt;这里&lt;/a&gt;查看相关帮助文档，很容易上手～～&lt;/p&gt; &lt;p&gt;为什么要使用Google App Engine呢？感觉上其实跟传统的虚拟主机服务差不多，不也是提供点空间让你上传点东东么～～其实好处还是很多的，比如说Google服务器在国外而且 速度很快，这就允许我们能避开国内万恶的审查机制做很多“坏事”了，嘿嘿～～另外Google的服务器也相当稳定，服务质量有保证，加之Google App Engine允许开发者调用Google众多的其他服务（比如用户验证等），降低开发难度～～&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5884741725220109274?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5884741725220109274/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5884741725220109274&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5884741725220109274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5884741725220109274'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/google-app-engine.html' title='初试Google App Engine'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4027349074927126303.post-5455391413636828172</id><published>2009-03-09T02:02:00.001+08:00</published><updated>2009-03-09T02:02:47.106+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>在Erlang中计算指定函数的执行耗时</title><content type='html'>timer模块内包含一个tc函数，可用于计算指定函数的执行时间：&lt;br /&gt;timer:tc ( Module, Func, Args ) -&gt; {Time,ReturnValue}&lt;br /&gt;Time : 运行耗时&lt;br /&gt;ReturnValue : 函数的返回值&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4027349074927126303-5455391413636828172?l=mooooscar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mooooscar.blogspot.com/feeds/5455391413636828172/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4027349074927126303&amp;postID=5455391413636828172&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5455391413636828172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4027349074927126303/posts/default/5455391413636828172'/><link rel='alternate' type='text/html' href='http://mooooscar.blogspot.com/2009/03/erlang_5600.html' title='在Erlang中计算指定函数的执行耗时'/><author><name>M-OSCAR</name><uri>http://www.blogger.com/profile/14112059109633013871</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_3uGUyB-9ISo/Sd8Php9deMI/AAAAAAAAB0o/ck2-mnn-jkE/S220/M.png'/></author><thr:total>0</thr:total></entry></feed>
