<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_施杨 's Think out</title><subtitle type="text">Think Different - Change the World.</subtitle><id>http://feed.cnblogs.com/blog/u/37598/rss</id><updated>2012-01-16T08:10:49Z</updated><author><name>施杨</name><uri>http://www.cnblogs.com/shiyangxt/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shiyangxt/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/37598/rss"/><entry><id>http://www.cnblogs.com/shiyangxt/archive/2011/12/29/Paoding-Rose-Analysis.html</id><title type="text">谈谈J2EE框架Paoding-Rose</title><summary type="text">很久没有发过文章了，不是俺懒，首先是精力放到了考试和申请上了，从八月到十二月都在忙考试和申请，现在已经都告一段落了，可以干些别的事了。其实说没时间也都是借口，主要还是技术上没有太值得写的东西，自己没亲自上手用过的，不想写些没啥质量的水文或者评论文章，非技术的东西又写着没意思，转载某本书的章节或者翻译外文的事，俺也兴趣不大。所以没东西写就干脆不写。	最近给我的一个产品做技术选型，耍了耍Paoding-Rose（下文简称Rose），其实这个框架早在两年前我就关注到了，当时是在Infoq上看到的一篇人人网架构师的文章，说开源了人人网的前端框架Rose，只不过那个时候已经被各种J2EE框架整的麻木了.</summary><published>2011-12-29T03:21:00Z</published><updated>2011-12-29T03:21:00Z</updated><author><name>施杨</name><uri>http://www.cnblogs.com/shiyangxt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shiyangxt/archive/2011/12/29/Paoding-Rose-Analysis.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shiyangxt/archive/2011/12/29/Paoding-Rose-Analysis.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;很久没有发过文章了，不是俺懒，首先是精力放到了考试和申请上了，从八月到十二月都在忙考试和申请，现在已经都&lt;/span&gt;&lt;/p&gt;&lt;p&gt;告一段落了，可以干些别的事了。其实说没时间也都是借口，主要还是技术上没有太值得写的东西，自己没亲自上手用过的，不&lt;/p&gt;&lt;p&gt;&lt;span&gt;想写些没啥质量的水文或者评论文章，非技术的东西又写着没意思，转载某本书的章节或者翻译外文的事，俺也兴趣不大。所以&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;没东西写就干脆不写。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;最近给我的一个产品做技术选型，耍了耍&lt;/span&gt;&lt;span&gt;Paoding-Rose&lt;/span&gt;&lt;span&gt;（下文简称&lt;/span&gt;&lt;span&gt;Rose&lt;/span&gt;&lt;span&gt;），其实这个框架早在两年前我就关注到了，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;当时是在&lt;/span&gt;&lt;span&gt;Infoq&lt;/span&gt;&lt;span&gt;上看到的一篇人人网架构师的文章，说开源了人人网的前端框架&lt;/span&gt;&lt;span&gt;Rose&lt;/span&gt;&lt;span&gt;，只不过那个时候已经被各种&lt;/span&gt;&lt;span&gt;J2EE&lt;/span&gt;&lt;span&gt;框架整的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;麻木了，所以只是下载了，但是一直没用过。当时的兴趣都在动态语言和&lt;/span&gt;&lt;span&gt;MacOS&lt;/span&gt;&lt;span&gt;上，那会的编译原理和操作系统课也挺牵扯精力&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;的（后半句是借口）。&lt;/span&gt;&lt;span&gt;Rose&lt;/span&gt;&lt;span&gt;的&lt;/span&gt;&lt;span&gt;Google Code&lt;/span&gt;&lt;span&gt;官网下载的包里没有&lt;/span&gt;&lt;span&gt;Demo&lt;/span&gt;&lt;span&gt;，只有几个&lt;/span&gt;&lt;span&gt;jar&lt;/span&gt;&lt;span&gt;文件，官网上有&lt;/span&gt;&lt;span&gt;Wiki&lt;/span&gt;&lt;span&gt;作为使用指南，帮助&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;开发者使用这个框架。&lt;/span&gt;&lt;span&gt;Wiki&lt;/span&gt;&lt;span&gt;写的挺全的，勤快点还是可以做出来官方&lt;/span&gt;&lt;span&gt;Demo&lt;/span&gt;&lt;span&gt;的。这次借这个机会，用&lt;/span&gt;&lt;span&gt;Rose&lt;/span&gt;&lt;span&gt;做了一个小&lt;/span&gt;&lt;span&gt;Demo&lt;/span&gt;&lt;span&gt;，一&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;个简单的雇员管理系统，包含了基本的&lt;/span&gt;&lt;span&gt;CRUD&lt;/span&gt;&lt;span&gt;、分页、上传、拦截器、&lt;/span&gt;&lt;span&gt;Portal&lt;/span&gt;&lt;span&gt;，持久层用的&lt;/span&gt;&lt;span&gt;Rose&lt;/span&gt;&lt;span&gt;自带的&lt;/span&gt;&lt;span&gt;Jade&lt;/span&gt;&lt;span&gt;，用的最新版本&lt;/span&gt;&lt;span&gt;1.01&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;（其实也不算新，一年半都没更新过了），用的很舒服，开发效率非常高。如果再来个脚本工具自动建个表并生成个&lt;/span&gt;&lt;span&gt;CRUD&lt;/span&gt;&lt;span&gt;，那效&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;率就真赶上&lt;/span&gt;&lt;span&gt;Rails&lt;/span&gt;&lt;span&gt;了。为啥我这里要提&lt;/span&gt;&lt;span&gt;Rails&lt;/span&gt;&lt;span&gt;，那是因为&lt;/span&gt;&lt;span&gt;Rails&lt;/span&gt;&lt;span&gt;有个闪亮的特点，叫约定优于配置。（您要非说两个框架的首字母都是&lt;/span&gt;&lt;span&gt;R&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;，我也没意见）。网上关于Rose的文章很少，俺写写填补一下空白吧。先声明一下，俺并没有任职于人人网，只是觉得这个开源框&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;架中有些设计思路不错，所以记下来。下面会谈谈我&lt;/span&gt;&lt;span&gt;在使用&lt;/span&gt;&lt;span&gt;Rose&lt;/span&gt;&lt;span&gt;的过程中发现的七个明显的优点。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;  &lt;p&gt;1.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;约定优于配置&lt;/span&gt;&lt;/p&gt;  &lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;先说约定优于配置，这个优点是我体会最深的。包路径，类名，类方法名都不需要配置文件声明，只要名称包含特定的关键&lt;/span&gt;字和&lt;/div&gt;&lt;p&gt;Annotation就行，只要满足这个条件，其他的命名部分可以随便修改，不需要修改任何配置。如图：&lt;/p&gt;&lt;p&gt;包名和类名：&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/RoseEM_1.jpg" width="342" height="301" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Annotation声明：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/RoseEM_2.jpg" width="333" height="388" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;这非常爽，当年用&lt;/span&gt;SSH&lt;span&gt;单挑项目的时候，写配置都写的手酸。这里就牵扯到&lt;/span&gt;XML&lt;span&gt;和&lt;/span&gt;Annotation&lt;span&gt;哪个更好的问题了，总之各有优&lt;/span&gt;&lt;span&gt;势，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;我会分场合使用。&lt;/span&gt;XML&lt;span&gt;的优点是配置独立于代码外，无需编译，结构也更清晰直观，便于管理与修改。例如&lt;/span&gt;Ibatis&lt;span&gt;就把&lt;/span&gt;sql&lt;span&gt;都放到&lt;/span&gt;xml&lt;/p&gt;&lt;p&gt;&lt;span&gt;里，这样确实非常方便管理。&lt;/span&gt;Annotation&lt;span&gt;的优点就是提供一体化解决方案，不涉及&lt;/span&gt;XML&lt;span&gt;等第三方技术标准，开发起来比较顺手也很简&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span&gt;洁，不用担心&lt;/span&gt;XML&lt;span&gt;文件过多。&lt;/span&gt;JPA&lt;span&gt;就是把数据映射都用&lt;/span&gt;Annotation&lt;span&gt;配置，也确实干净。我在使用的过程中会把经常变动的属性提到&lt;/span&gt;XML&lt;/div&gt;&lt;p&gt;&lt;span&gt;中，这样方便管理与修改。&lt;/span&gt;Annotation&lt;span&gt;则处理不经常变动的部分，比如一些数据或路径映射关系。&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;2.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;自动绑定&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;自动绑定也是非常实用的功能，&lt;/span&gt;Struts2&lt;span&gt;和&lt;/span&gt;Struts&lt;span&gt;比起来，比较明显的地方就是表单的自动绑定，我当时实用&lt;/span&gt;struts2&lt;span&gt;的时候，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;是必须&lt;/span&gt;使用struts2标签和set才能自动绑定表单数据的。Rose则不用这样，没有任何标签限制，可以自由绑定属性，并且直接通过&lt;/p&gt;&lt;p&gt;Annotation传参，不需要set数据。数据持久层的Jade框架也提供属性自动绑定，不需要任何的set，get方法，非常提升开发效率。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;3.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;REST&lt;span&gt;风格&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;由于&lt;/span&gt;Rose&lt;span&gt;基于&lt;/span&gt;Spring&lt;span&gt;开发，所以使用了很多&lt;/span&gt;Spring MVC&lt;span&gt;的组件，也带来了&lt;/span&gt;Spring MVC&lt;span&gt;的&lt;/span&gt;REST&lt;span&gt;风格，&lt;/span&gt;Rose&lt;span&gt;具备了&lt;/span&gt;Spring MVC&lt;/p&gt;&lt;p&gt;&lt;span&gt;的很多优势，为了验证与&lt;/span&gt;Spring MVC&lt;span&gt;的异同，我专门做了一个&lt;/span&gt;Spring MVC 3.0&lt;span&gt;版本的&lt;/span&gt;CRUD&lt;span&gt;操作，用来比较开发效率与实现方法。还&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;是&lt;/span&gt;Rose&lt;span&gt;更为快速，&lt;/span&gt;Rose&lt;span&gt;对&lt;/span&gt;Spring MVC&lt;span&gt;中的&lt;/span&gt;URL&lt;span&gt;映射和页面传值操作都进行了优化，看起来更优雅一些，完全支持&lt;/span&gt;REST&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;4.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Jade&lt;span&gt;极简主义&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Jade&lt;span&gt;框架极大的提升了开发效率，&lt;/span&gt;DAO&lt;span&gt;接口方法加一句&lt;/span&gt;SQL&lt;span&gt;实现数据库操作和赋值，不多说了，上图：&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/RoseEM_3.jpg" width="706" height="404" alt="" /&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;span&gt;补充一点，当然也是支持整合缓存框架的，即便是有些缓存框架的支持不是特别的好，我觉得自己管理缓存也无所谓，反倒更灵活一些。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;自己可以决定保存哪些字段。我倒是不怎么喜欢啥都扔给&lt;/span&gt;hibernate&lt;span&gt;管理。&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;5.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Portal&lt;span&gt;技术&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;这个技术蛮帅的，也是人人网架构师比较自豪的一个&lt;/span&gt;java&lt;span&gt;后台原创技术，实现的基本原理就是对于需要许多数据渲染的页面（例如&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;公共主页）&lt;/span&gt;做页面模块切分，比如关注列表一个模块，留言一个模块，最新动态一个模块等等。然后每个模块作为一个window并发从&lt;/p&gt;&lt;p&gt;数据库取数据，然后再重新整合数据，最终呈现给用户。可以设置一个时限，比如几百ms，如果在限定时间内，数据没有拿出来，就不&lt;/p&gt;&lt;p&gt;显示这个模块了，保证用户端的响应速度。这个技术也经过了SJ圣战的洗礼，确实发挥了作用，是一个蛮有意思的设计思路。后台原理&lt;/p&gt;&lt;p&gt;类似scala的并发算法，把数据分块，然后并发计算。前台效果也类似新浪微博使用的页面片段加载技术，为了保证用户的响应速度，先&lt;/p&gt;&lt;p&gt;部分加载页面片段，逐步显示整个页面。Facebook也有一套类似的实现方案。&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;6.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;兼容性&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;Rose&lt;span&gt;使用过滤器而非&lt;/span&gt;Servlet&lt;span&gt;拦截请求，现在大部分框架都在通过过滤器拦截请求，比如&lt;/span&gt;Struts2&lt;span&gt;，&lt;/span&gt;Spring&lt;span&gt;。这样做的好处就是，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;可以方便与&lt;/span&gt;其他框架的兼容。也基于这点使Rose有了REST的风格。并且也可以与基于Servlet拦截请求的Struts共存，改造遗留系统。&lt;/p&gt;&lt;p&gt;官方描述人人网的前端框架就是这样移植的。&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;7.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;养成好习惯&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;&lt;p&gt;&lt;span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;首先是灵活的拦截器控制，比如局部拦截器是基于包目录的作用域，这样可以帮助开发者养成良好的权限模块切分习惯。其次是&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;控制器方法&lt;/span&gt;映射支持正则表达式以及直接返回Json和XML格式数据，这样可以帮助开发者更好的命名映射路径与规范输出数据。约定&lt;/p&gt;&lt;p&gt;优于配置也帮助开发者规范的命名包和类。某种程度上Rose收集了最佳实践，引导开发者遵守规范。最后如果框架存在Bug或者兼容性&lt;/p&gt;&lt;p&gt;问题，可以通过修改框架源码解决。&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;PS：对Rose有兴趣可以访问&lt;span&gt;官网，链接：&lt;/span&gt;&lt;a href="http://code.google.com/p/paoding-rose/"&gt;http://code.google.com/p/paoding-rose/&lt;/a&gt;，wiki写的挺全。&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;我在这预祝大家元旦快乐了。&lt;/span&gt;I came back.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/shiyangxt/aggbug/2305778.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shiyangxt/archive/2011/12/29/Paoding-Rose-Analysis.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shiyangxt/archive/2011/07/30/2121663.html</id><title type="text">Scala.Actor实践心得与设计思想</title><summary type="text">这段时间系统的学习了Scala，编程思想上可谓收获不少，想从里面挑些值得写的东西分享给大家，Scala的Actor可谓这门语言的一个亮点，函数式编程核心价值在于多核编程，所以就打算说说这个Actor，总结一下学习心得。先很俗套的简单谈谈概念，然后会拿四个例子做补充。主要内容包括基本原理，设计思想，单机环境并发测试。 Actor是一种基于事件的轻量级线程，在以前的并发模型中，我们需要关注共享的数据结构，而使用Actor则需要关注操作数据的代码结构，因为减少了数据的共享。Actor的主要能力来源于消息传递，而不是采用阻塞调用的处理形式。如果创建直接或间接扩展Actor的类，要确保对对象的所有调用.</summary><published>2011-07-29T17:21:00Z</published><updated>2011-07-29T17:21:00Z</updated><author><name>施杨</name><uri>http://www.cnblogs.com/shiyangxt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shiyangxt/archive/2011/07/30/2121663.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shiyangxt/archive/2011/07/30/2121663.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;  &lt;/div&gt; &lt;p&gt;&lt;!--[endif]--&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;这段时间系统的学习了&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;，编程思想上可谓收获不少，想从里面挑些值得写的东西分享给大家，&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;的Actor&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;可谓这门语言的一个亮点，函数式编程核心价值在于多核编程，所以就打算说说这个Actor，总结一下学习心得。先很俗&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;套的简单谈谈概念，然后会拿四个例子做补充。主要内容包括基本原理，设计思想，单机环境并发测试。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;  &lt;/div&gt;&lt;p&gt;&lt;!--[endif]--&gt;  　　&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Actor&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;是一种基于事件的轻量级线程，在以前的并发模型中，我们需要关注共享的数据结构，而使用&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;则需要&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;关注操作数据的代码结构，因为减少了数据的共享。&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;的主要能力来源于消息传递，而不是采用阻塞调用的处理形式。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;如果创建直接或间接扩展&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;&amp;nbsp;Actor&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;的类，要确保对对象的所有调用都通过消息传递进行。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;&amp;nbsp;&amp;nbsp; 我把&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;的设计思想归为两类，使用目的归为两类。从设计思想上来说&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;推荐的是以消息传递为核心的设计&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;思想，由于&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;可以无缝使用&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Java&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;类库，所以也可以采用以共享数据为核心的设计，当然也可以写出混合式设计风格的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;。使用目的主要有两种，一种是&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;提供&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;API&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;给&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Java&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;调用，另一种就是&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;自给自足。举三个例子，例子很简单，是一&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;个累加器。&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt; &lt;!--[endif]--&gt;  &lt;p&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;1&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;、以消息传递为核心的设计：使用&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;的&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;actor&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;方法，使用不可变对象，不考虑数据共享问题，以消息传递为设计核心。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;  &lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;actors._,&amp;nbsp;Actor._&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;Author:ShiYang&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;Blog：&lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;http://shiyangxt.cnblogs.com&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;object&amp;nbsp;SendMessageStyle&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;def&amp;nbsp;main(args:&amp;nbsp;Array[String]):&amp;nbsp;Unit&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;caller&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;self&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;accumulator&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;actor&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;sum&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loopWhile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reactWithin(&lt;/span&gt;&lt;span style="color: #000000;"&gt;500&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;number:&amp;nbsp;Int&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sum&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;number&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;TIMEOUT&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;caller&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sum&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;accumulator&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;accumulator&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;accumulator&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;receiveWithin(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1000&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;result&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;println(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Total&amp;nbsp;is&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;result)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; &lt;!--[endif]--&gt;  &lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;2&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;、以共享数据为核心的设计：构建由&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;继承共享数据操作类，以共享数据为核心。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;actors._,&amp;nbsp;Actor._&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;Author:ShiYang&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;Blog：&lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;http://shiyangxt.cnblogs.com&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;object&amp;nbsp;SharedDataStyle&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Add(number:&amp;nbsp;Int)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;GetResult(sender:&amp;nbsp;Actor)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;AddActor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Actor&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;override&amp;nbsp;def&amp;nbsp;act():&amp;nbsp;Unit&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;process(&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;process(value:&amp;nbsp;Int):&amp;nbsp;Unit&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reactWithin(&lt;/span&gt;&lt;span style="color: #000000;"&gt;500&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Add(number)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;process(value&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;number)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;GetResult(a)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;a&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;value;&amp;nbsp;process(value)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;process(value)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;def&amp;nbsp;main(args:&amp;nbsp;Array[String]):&amp;nbsp;Unit&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;addActor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;AddActor&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addActor.start()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addActor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Add(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addActor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Add(&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addActor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Add(&lt;/span&gt;&lt;span style="color: #000000;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addActor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;GetResult(self)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;receiveWithin(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1000&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;result&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;println(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Total&amp;nbsp;is&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;result)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;  &lt;/div&gt;&lt;div&gt; &lt;!--[endif]--&gt;  &lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;3&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;、以&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;API&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;形式提供给&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Java&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;程序使用：由于&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Java&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;不能直接向&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;发消息，所以需要对&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;的&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;!()&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;方法进行封装。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;  &lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;actors._,&amp;nbsp;Actor._&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;Author:ShiYang&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;Blog：&lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;http://shiyangxt.cnblogs.com&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;object&amp;nbsp;ForJavaStyle&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Add(number:&amp;nbsp;Int)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;GetResult(sender:&amp;nbsp;Actor)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;AddActor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Actor&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;override&amp;nbsp;def&amp;nbsp;act():&amp;nbsp;Unit&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;process(&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;process(value:&amp;nbsp;Int):&amp;nbsp;Unit&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reactWithin(&lt;/span&gt;&lt;span style="color: #000000;"&gt;500&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Add(number)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;process(value&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;number)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;GetResult(a)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;a&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;value;&amp;nbsp;process(value)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;process(value)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;val&amp;nbsp;addActor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;AddActor&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;addActor.start()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;def&amp;nbsp;add(sender:&amp;nbsp;Actor,&amp;nbsp;num:&amp;nbsp;Int):&amp;nbsp;Unit&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sender&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Add(num)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;def&amp;nbsp;getResult(sender:&amp;nbsp;Actor):&amp;nbsp;Int&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sender&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;GetResult(self)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;receiveWithin(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1000&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;result:&amp;nbsp;Int&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;result&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;def&amp;nbsp;addForJava(num:&amp;nbsp;Int):&amp;nbsp;Unit&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add(addActor,&amp;nbsp;num)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;def&amp;nbsp;getResultForJava():&amp;nbsp;Int&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getResult(addActor)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; &lt;!--[endif]--&gt;  &lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;Java&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;端调用代码：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;  &lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;Author:ShiYang&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;Blog：&lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;http://shiyangxt.cnblogs.com&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;GetFromScala&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;main(String[]&amp;nbsp;args)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ForJavaStyle$.MODULE$.addForJava(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ForJavaStyle$.MODULE$.addForJava(&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ForJavaStyle$.MODULE$.addForJava(&lt;/span&gt;&lt;span style="color: #000000;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Total&amp;nbsp;is&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ForJavaStyle$.MODULE$.getResultForJava());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt; &lt;!--[endif]--&gt;  &lt;p&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 通过上面的例子可见&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;对&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Java&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;语言有非常大的补充，提高了生产力。为&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Java提供了&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;轻松实现多核并行编程的能&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;力。为了进一步测试&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;的并发性能，于是做了一个简单的单机环境并发测试。程序是构建一个&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;动态有序数组，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;并发创建&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;N&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;个&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;对象，为了证明这些对象全都可用，顺序从数组的第一个&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;发消息到最后一个&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;，只有当一个&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;接收到前一个&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;发送的消息后，才向后一个&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Actor&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;发送消息。当最后一个数组元素接收到消息后，再把消息从数组&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;尾部用同样处理过程逆序发送到数组头部。这个消息发送过程不是并发处理，是顺序处理。这里只是为了证明这些对象全都&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;可用。如果为了测试并发处理，可以修改程序，让每个数组元素给后一位数组元素发消息。这样就会看到输出混乱的发送信&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;息，因为并发是无序的。&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;&lt;br /&gt;&lt;div&gt;  &lt;p&gt;&lt;span style="font-size: 12pt;"&gt;测试环境：双核&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;4G&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;内存，&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Windows XP&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;，&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Sun JVM1.6&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;，单机环境，&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;版本&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;2.9.0.1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;  &lt;/div&gt;&lt;div&gt; &lt;!--[endif]--&gt;  &lt;p&gt;&lt;span style="font-size: 12pt;"&gt;测试结果：当使用&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Receive&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;方法接收消息时，由于&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Receive&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;会在结束任务前一直持有线程，而&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;在后台默认只给&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Receive&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;方法启动&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;256&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;个线程，我的程序又是顺序的发消息，而且不是临时接收器（只处理一次消息），所以&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Receive&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;在这种情况下，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;只有&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;255&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;个并发。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;React&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;接收器由于不需要长期持有线程，空闲即释放线程。所以&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;React&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;在本程序中可以跑&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;20w&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;的并发，如果&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;简单优化一下&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;JVM&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;，就可以达到&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;100w&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;的并发量。默认&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;React&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;接收器后台会调用&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;4&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;个线程组成的线程池。如果修改程序让每个数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;组元素给后一位数组元素并发的发消息，那么在不阻塞线程的情况下，&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Receive&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;方法也可以达到和&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;React&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;一样的并发量。因为&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;这个测试程序是顺序发送消息，所以就没有设置超时，如果是并发环境，建议加上超时，避免线程阻塞。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;  &lt;/div&gt;&lt;div&gt; &lt;!--[endif]--&gt;  &lt;p&gt;&lt;span style="font-size: 12pt;"&gt;下面是测试程序：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;  &lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;actors._,&amp;nbsp;Actor._,&amp;nbsp;java.util._&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;Author:ShiYang&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;Blog：&lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;http://shiyangxt.cnblogs.com&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;object&amp;nbsp;ConcurrentTest&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;val&amp;nbsp;actors&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ArrayList[Actor]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;val&amp;nbsp;length&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1000000&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;var&amp;nbsp;startTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.nanoTime&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;def&amp;nbsp;main(args:&amp;nbsp;Array[String]):&amp;nbsp;Unit&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;to&amp;nbsp;length)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;actors.add(actor&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;react:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;actor&amp;nbsp;created&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reactMessage&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;actors.get(&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;def&amp;nbsp;info(msg:&amp;nbsp;String)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;println(msg&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;received&amp;nbsp;by&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.currentThread)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;def&amp;nbsp;receiveMessage&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;receive&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(id:&amp;nbsp;Int,&amp;nbsp;direction:&amp;nbsp;Int)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendMessage(id:&amp;nbsp;Int,&amp;nbsp;direction:&amp;nbsp;Int)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;finish&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;endTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.nanoTime&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;println(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Finish,&amp;nbsp;spend&amp;nbsp;time:&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(endTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;startTime)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1000000000.0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;secs&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;println(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;input&amp;nbsp;error&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;def&amp;nbsp;reactMessage&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loopWhile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;react&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(id:&amp;nbsp;Int,&amp;nbsp;direction:&amp;nbsp;Int)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendMessage(id:&amp;nbsp;Int,&amp;nbsp;direction:&amp;nbsp;Int)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;finish&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;endTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.nanoTime&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;println(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Finish,&amp;nbsp;spend&amp;nbsp;time:&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(endTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;startTime)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1000000000.0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;secs&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;println(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;input&amp;nbsp;error&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;56&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;direction=0-&amp;gt;sendLatter;direction=1-&amp;gt;sendFormer&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;57&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;def&amp;nbsp;sendMessage(id:&amp;nbsp;Int,&amp;nbsp;direction:&amp;nbsp;Int)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;58&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(direction&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;length)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;59&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Actor&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;send&amp;nbsp;message&amp;nbsp;to&amp;nbsp;the&amp;nbsp;Actor&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;60&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;actors.get(id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;61&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;direction&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;62&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Actor&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;send&amp;nbsp;message&amp;nbsp;to&amp;nbsp;the&amp;nbsp;Actor&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;63&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;actors.get(id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;64&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(direction&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;length)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;65&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;actors.get(length)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(length,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;66&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;direction&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;67&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;actors.get(&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;finish&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;68&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;69&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;70&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt; &lt;!--[endif]--&gt;  &lt;p&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;&amp;nbsp; 前些天看到&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;正在努力支持&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;.net&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;平台，不过我觉得&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;.net&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;平台有&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;F#&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;，所以对于&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;.net&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;程序员来说&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;提供不了什么&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;附加价值。如果非要找出来这样做的优点的话，就是&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;可以同时支持两个主流平台，野心不小。如果看后有所收获，请&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;推荐让更多人看到，算我为&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;Scala&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Verdana;"&gt;的推广尽了点绵薄之力。行文仓促，如果有不对的地方，欢迎指正。&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shiyangxt/aggbug/2121663.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shiyangxt/archive/2011/07/30/2121663.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shiyangxt/archive/2011/06/21/2086064.html</id><title type="text">云计算平台实践心得</title><summary type="text">记录一些实践心得</summary><published>2011-06-21T07:12:00Z</published><updated>2011-06-21T07:12:00Z</updated><author><name>施杨</name><uri>http://www.cnblogs.com/shiyangxt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shiyangxt/archive/2011/06/21/2086064.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shiyangxt/archive/2011/06/21/2086064.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;div&gt; &lt;!--[endif]--&gt;  &lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 有段时间没写文章了，很快就大学毕业了，放松了一段时间，大四的生活过得有些惬意，放松的太久了，重新紧起&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;来有些难，但是内心一直在不断的鞭策自己，今天忍不住了，决定重新开始写文章。告诉大家这个博客还要继续更新，&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;没有荒废掉。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这篇文章简单记录一下我的云计算平台实践，云计算这个概念，总是被不断的提起，在大三的时候就关注过一段时&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;间，但是当时一直停留在理论阶段，没有做什么实际的东西，所以就一直没有写任何关于云计算的东西，因为我一向是&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;先实践，然后总结，再写文章。大四前半段，带着我的团队把一个项目的二期开发做完，然后下半段先是考了一个烦人&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;的考试，然后才着手将我的云计算平台实践出来，平台的功能很少，因为只是自己做着玩，初衷是希望能够为学校实现&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;一个云存储平台的，统一学校的数据源，方便学校今后的网络建设和科研，为学校多做些贡献。但是学校手头也紧，公&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;费买个服务器都困难，只想安于现状。所以后来只能自己做着玩了，不能因为没有实际需求就不做了。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;这个云存储平台是服务即平台模式的实践，提供&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;WebService&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;API&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;供其他应用系统调用，实现了&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;20&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;个接口，因为只&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;是模拟用的，数据模型做了简化，只保留核心字段。架构基于&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Hadoop+Hbase+EJB&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;，大二的时候学了&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;EJB&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;但一直没有实&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;践过，一是因为没有遇到必须用这个技术的项目；二是考虑到技术门槛，不方便后面的维护。实现平台过程中遇到一个数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;据节点不能为&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;0&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;的错误，因为报错实在是不太明确，让我一直以为是配置文件的问题，困扰了一段时间，后来发现是关于&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;用户权限的&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;linux&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;间无密码互访有问题造成的，这个问题本身简单，但是因为报错不明确，误导了我的判断。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;云计算技术还在发展中，随着很多公司的采用，已经趋于成熟。任何技术都需要通过实践来发现问题解决问题。目前&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;来看，云存储一定程度上可以取代关系型数据库，关于数据库事务和高级查询可以借由第三方组件实现。松散的数据结构&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;更加利于敏捷实践，数据模型的字段可以更灵活的变更，我的云存储平台数据就是把教务系统的一些关系型数据模型过渡&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;到基于键值对的松散结构中的。对于一些本身就具有映射关系的字段，甚至可以简化到一个键值对关系中来。把所有关系&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;型数据都打散成为松散数据，确实是很颠覆传统思维的。但是有的时候逆向思维正是解决瓶颈问题的办法，比如关系型数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;据库很难低成本的做到在限定时间内从几&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;TB&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;的数据中，排序并拿出&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;TOP50W&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;的数据。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-size: 12pt;"&gt;Hbase&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;本身的一些机制，可以从分布式文件存储层面就为所有数据提供缓存，对于一次写入多次读取的数据效果尤其&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;显著。我虽然没有看过&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;twitter&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;的数据层实现，但是如果让我设计，我会把最占用存储空间的数据部分，也就是一次写入多&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;次读取的微博和评论内容部分写入&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;NoSQL&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;中，稳妥起见把其他对安全性要求高的隐私数据部分写入&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;MySQL&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;，但是我仍然&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;可以把常用字段也同步到&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;NoSQL&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;中去以便提高系统性能。这可以看做是云存储最常见的一种实践方式。云存储的另一种常&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;见实践则是基于文档化的分布式存储，把视频，图片，音乐，文件以键值对的形式存储，这些媒介的共同特点都是占用空&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;间大，一次上传，多次读取。这两者其实可以归为一类。即使是多次写入，少量读取的数据也可以实现一个数据缓冲层，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;应对频繁变更，然后定时定量持久化数据。所以存取比重不会影响对云存储的使用，因此才有了我之前把关系型数据模型&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;完全转化到松散型的做法。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;利用&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Hbase&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;本身的一些设计特点可以让我们从松散表结构设计上提高系统的性能，比如&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;family&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;列相同的部分会在物理上&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;存储在更近的节点上，所以在从关系型到松散型过渡的时候，可以把&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;family&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;列设置为表名，把&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;label&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;子列设置为属性字段，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;这样同一个表的数据可以在物理上更加紧凑，便于系统更快的取出同一数据模型的相关属性。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;family&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;列&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;的定义和修改需要对&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;Hbase作类似于传统数据库的数据定义，而label列则不需要定义直接可以使用，通过这个特性可以使表结构字段动态化，从&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;而在数据持久层面实现动态化。对于功能独立的本身具有键值映射关系的属性则可以不使用上述的做法，而采用family列存&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;储键属性名称，label列存储键属性值，value列存储值属性的值的方法。这是松散模型设计可以采用的一种实践策略。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;在业务服务层面分离成两个层，一个层作为数据操作层，负责对数据操作和事务处理，另一个层作为业务服务层，负责&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;业务逻辑的拼装、数据验证、身份验证等工作。接口设计方面要保证接口的合理性，清晰性，重用性。目前能想到的就是这&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;些了。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;架构如图：&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/shiyangxt/%E4%BA%91%E8%AE%A1%E7%AE%97%E5%B9%B3%E5%8F%B0%E6%9E%B6%E6%9E%84.jpg" border="0" height="607" width="447" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt; &lt;!--[endif]--&gt;  &lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;云计算实践心得介绍到这，有些朋友挺关心我接下来的计划的，在此简单说一下，俺打算毕业后先准备另一个考试，忙&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;完了以后找个地方工作一年，然后继续念书，因为知识越学越觉得自己会的太少，所以希望继续深造提高，谢谢朋友们的关&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;心，我会一直努力下去的。期待与更多喜爱技术的朋友合作与交流。&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shiyangxt/aggbug/2086064.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shiyangxt/archive/2011/06/21/2086064.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shiyangxt/archive/2011/03/03/1970413.html</id><title type="text">ssh无密码登录小记</title><summary type="text">最近需要用，于是随便搞了一下，本来一个道理很简单的无密码登录，让我折腾了许久，不知道是不是ubuntu10.10的bug，我的ssh无密码登录在这个系统里无论如何就是搞不定，我尝试了root用户，和一些不同权限的普通账户登录，也改过了.ssh和里面文件的权限，还改了sshd.conf的一些参数，又尝试改了hosts以及不同的授权文件拷贝方法，差点有了研究一遍系统权限的冲动。最后还是没有成功，都要求输入密码，不能无密码登录。于是一咬牙重装了ubuntu10.04,终于搞定之，让我郁闷至极，于是记录一下无密码登录的方法。方便下次参考：-------------------------------.</summary><published>2011-03-03T15:10:00Z</published><updated>2011-03-03T15:10:00Z</updated><author><name>施杨</name><uri>http://www.cnblogs.com/shiyangxt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shiyangxt/archive/2011/03/03/1970413.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shiyangxt/archive/2011/03/03/1970413.html"/><content type="html">&lt;p&gt;最近需要用，于是随便搞了一下，本来一个道理很简单的无密码登录，让我折腾了许久，不知道&lt;/p&gt;&lt;p&gt;是不是ubuntu10.10的bug，我的ssh无密码登录在这个系统里无论如何就是搞不定，我尝试了root用户，和&lt;/p&gt;&lt;p&gt;一些不同权限的普通账户登录，也改过了.ssh和里面文件的权限，还改了sshd.conf的一些参数，又尝试改了&lt;/p&gt;&lt;p&gt;hosts以及不同的授权文件拷贝方法，差点有了研究一遍系统权限的冲动。最后还是没有成功，都要求输入&lt;/p&gt;&lt;p&gt;密码，不能无密码登录。于是一咬牙重装了ubuntu10.04,终于搞定之，让我郁闷至极，于是记录一下无密码&lt;/p&gt;&lt;p&gt;登录的方法。方便下次参考：&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------&amp;nbsp;&lt;/p&gt;&lt;p&gt;假设客户机名sy1,IP为ip1.用户名user；服务器名sy2.IP为ip2.用户名user&lt;/p&gt;&lt;p&gt;在sy1上输入：&lt;/p&gt;&lt;p&gt;&lt;span&gt;ssh-keygen -t rsa&lt;/span&gt;&lt;/p&gt;&lt;p&gt;然后弹出一些问题，一路回车。然后输入：&lt;/p&gt;&lt;div&gt;&lt;pre&gt;scp ~/.ssh/id_rsa.pub user@ip2:/home/user/.ssh/ip2&lt;/pre&gt;&lt;pre&gt;输入sy2上user的密码，拷贝完成。&lt;/pre&gt;&lt;pre&gt;在sy2上，输入：&lt;/pre&gt;&lt;pre&gt;&lt;div&gt;&lt;pre&gt;cat ~/.ssh/ip2 &amp;gt;&amp;gt; ~/.ssh/authorized_keys &lt;/pre&gt;&lt;pre&gt;（以上步骤也可用ssh-copy-id命令：ssh-copy-id user@ip2 ,不过少了一个授权文件的备份ip2）&lt;/pre&gt;&lt;pre&gt;在ubuntu10.04里，相关文件和目录的权限都不需要改。但是会有另外一个问题就是sy2返回&lt;/pre&gt;&lt;pre&gt;&lt;div&gt;Agent admitted failure to sign using the key错误，简单处理方法就是在sy1上执行两个命令：&lt;/div&gt;&lt;p&gt;ssh-agent &amp;nbsp;&lt;/p&gt;&lt;/pre&gt;&lt;pre&gt;&lt;div&gt;&lt;pre&gt;ssh-add id_rsa &lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre&gt;然后就可以实现无密码登录了。&lt;/pre&gt;&lt;pre&gt;&lt;div&gt;&lt;span&gt;----------------------------------------------------------------&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;因为重装系统，于是再次遇到两个中文乱码问题，一道记录一下，便于以后忘了参考用。&amp;nbsp;&lt;/p&gt;&lt;/pre&gt;&lt;pre&gt;一个是gedit的中文乱码，一个是fcitx的中文方块，处理方法：&lt;/pre&gt;&lt;pre&gt;&lt;div&gt;&lt;pre&gt;gedit的中文乱码：&lt;/pre&gt;&lt;pre&gt;&lt;div&gt;&lt;span&gt;输入gconf-editor，找到 /apps/gedit-2/preferences/encodings 节点并单击。&amp;nbsp;&lt;br /&gt;双击右边的 auto_detected 键，打开&amp;#8220;编辑键&amp;#8221;对话框。&amp;nbsp;&lt;br /&gt;单击列表右边的&amp;#8220;添加&amp;#8221;按钮，输入&amp;#8220;GB18030&amp;#8221;，单击确定按钮。&amp;nbsp;&lt;br /&gt;列表的最底部新增加了一个&amp;#8220;GB18030&amp;#8221;。单击选中它，并单击右边的 &amp;#8220;向上&amp;#8221; 按钮直到 &amp;#8220;GB18030&amp;#8221; 位于列表的顶部为止。&amp;nbsp;&lt;br /&gt;单击确定按钮，关闭配置编辑器。&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre&gt;fcitx的中文方块处理：&lt;/pre&gt;&lt;pre&gt;输入：gedit ~/.fcitx/config，把显示字体（中）后的*改为WenQuanYi Bitmap Song，然后重启输入法即可。&lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shiyangxt/aggbug/1970413.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shiyangxt/archive/2011/03/03/1970413.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shiyangxt/archive/2010/12/05/1896741.html</id><title type="text">Mac 系统自带字典加入中文支持(2010.12.5)</title><summary type="text">今天给mac的系统自带字典加入中文支持.但是网上很多的资料因为时间关系都不是完全正确, 比如下载链接失效,或者工具版本更新造成的装载失败,不过经过一点折腾,总算是弄好了. 我用的版本是10.5.8,仅供参考,其中DictUnifier,我用最新的2.0安装词库报错,所以我下载的是1.1版本,直接加载tar.bz2装载词库.词库我下了几个版本都不好使,不是格式比较难看就是加载失败,于是采用了比较稳妥的词库: stardict-21shijishuangxiangcidian-2.4.2.tar.bz2 下载地址DictUnifier下载地址格式看着还可以.上图:</summary><published>2010-12-04T19:08:00Z</published><updated>2010-12-04T19:08:00Z</updated><author><name>施杨</name><uri>http://www.cnblogs.com/shiyangxt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shiyangxt/archive/2010/12/05/1896741.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shiyangxt/archive/2010/12/05/1896741.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;今天给mac的系统自带字典加入中文支持.但是网上很多的资料因为时间关系都不是完全正确, 比如&lt;/p&gt;&lt;p&gt;下载链接失效,或者工具版本更新造成的装载失败,不过经过一点折腾,总算是弄好了. 我用的版本是10.5.8,仅供&lt;/p&gt;&lt;p&gt;参考,其中DictUnifier,我用最新的2.0安装词库报错,所以我下载的是1.1版本,直接加载tar.bz2装载词库.词库我&lt;/p&gt;&lt;p&gt;下了几个版本都不好使,不是格式比较难看就是加载失败,于是采用了比较稳妥的词库:&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: Arial; line-height: 30px; color: #333333; font-weight: bold; "&gt;stardict-21shijishuangxiangcidian-2.4.2.tar.bz2 &amp;nbsp;&lt;a href="http://ishare.iask.sina.com.cn/f/8209781.html"&gt;下载地址&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;DictUnifier&amp;nbsp;&amp;nbsp;&lt;a href="http://code.google.com/p/mac-dictionary-kit/"&gt;下载地址&lt;/a&gt;&lt;/p&gt;&lt;p&gt;格式看着还可以.上图:&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/mac/dictionaryChinese.jpg" width="500" height="398" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shiyangxt/aggbug/1896741.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shiyangxt/archive/2010/12/05/1896741.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shiyangxt/archive/2010/12/04/1896398.html</id><title type="text">{C++} COM 组件多层聚合嵌套原理</title><summary type="text">COM 组件多层聚合嵌套原理</summary><published>2010-12-04T07:35:00Z</published><updated>2010-12-04T07:35:00Z</updated><author><name>施杨</name><uri>http://www.cnblogs.com/shiyangxt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shiyangxt/archive/2010/12/04/1896398.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shiyangxt/archive/2010/12/04/1896398.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;大四的课还是蛮有意思的，其中有一个COM组件的课，感觉挺有收获，做了一个小Demo，是关于COM聚合的，&amp;nbsp;&lt;/p&gt;&lt;p&gt;聚合和包容是COM的基本特征，老师上课没把这俩的关系讲清楚，也不大知道为啥放着简单的包容不用，用聚合写模块。&lt;/p&gt;&lt;p&gt;通过做这个Demo，俺算是理解了。因为包容只是单向调用接口，也就是从外到内，不能从内到外。而聚合则是双向调用的，&lt;/p&gt;&lt;p&gt;非常的灵活。下面通过具体的例子说说。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这个小Demo是控制台调用三个动态链接库的，每个链接库中都有一个方法，最外面的库CompB.dll里面是减法运算，&amp;nbsp;&lt;/p&gt;&lt;p&gt;聚合CompC.dll里面的乘法，CompC.dll聚合CompA.dll里面的加法。CompB.dll调用接口是OtherInterface，CompC.dll&lt;/p&gt;&lt;p&gt;调用接口是AnyInterface，CompA.dll调用接口是SomeInterface。 CompB内部指针Inner指向CompC,CompC内部指针&amp;nbsp;&lt;/p&gt;&lt;p&gt;Inner指向CompA，Outer指针指向CompB，CompA内部指针Outer指针指向CompC，通过这四个指针，可以使接口查询&lt;/p&gt;&lt;p&gt;双向传递。也就是说我可以通过OtherInterface拿到CompA的Add方法，也可以通过SomeInterface拿到CompB的Minus&lt;/p&gt;&lt;p&gt;方法，调用方式非常灵活。三个接口无论调用哪一个都可以访问到三个动态链接库中的所有方法。每一个方法都可以通过不同&lt;/p&gt;&lt;p&gt;接口调用，原理也很清晰和简单。多层聚合调用的中间层dll就需要一对指针指向上层dll和下层dll，就像CompC一样。实现也不&lt;/p&gt;&lt;p&gt;复杂，每个动态链接库都有一个查询接口方法，CompC和CompA通过非委托查询接口，进行调用传递。初始化过程是这样的，&lt;/p&gt;&lt;p&gt;CompB初始化CompC实例，CompC初始化CompA实例。CompB如果希望调用CompA就必须先初始化CompC，初始化过&lt;/p&gt;&lt;p&gt;程也很清晰。为了模块的灵活性，多写些代码还是值得滴。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;基本原理如图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/COMAggreImage2.jpg" width="600" height="279" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;我本地的执行输出：&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/comAggre.jpg" width="600" height="526" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;多层聚合嵌套核心方法是CompC的两个查询方法：&lt;/p&gt;&lt;p&gt;QueryInterface:&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;HRESULT&amp;nbsp;CC::QueryInterface(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IID&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;iid,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;**&lt;/span&gt;&lt;span style="color: #000000;"&gt;ppv)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;---------------------excute&amp;nbsp;CompC&amp;nbsp;QueryInterface!!!\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&amp;nbsp;iid&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IID_OtherInterface&amp;nbsp;)&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(m_pUnknownOuter&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;NULL){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CompC&amp;nbsp;m_pUnknownOuter&amp;nbsp;is&amp;nbsp;not&amp;nbsp;null!\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;m_pUnknownOuter&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;QueryInterface(iid,&amp;nbsp;ppv);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;NondelegationQueryInterface(iid,&amp;nbsp;ppv);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&amp;nbsp;iid&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IID_SomeInterface&amp;nbsp;)&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;(&amp;nbsp;m_pUnknownInner&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;NULL&amp;nbsp;){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CompC&amp;nbsp;m_pUnknownInner&amp;nbsp;is&amp;nbsp;not&amp;nbsp;null!\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;m_pUnknownInner&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;QueryInterface(iid,&amp;nbsp;ppv);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;NondelegationQueryInterface(iid,&amp;nbsp;ppv);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;NondelegationQueryInterface(iid,&amp;nbsp;ppv);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; "&gt;NondelegationQueryInterface：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;HRESULT&amp;nbsp;CC::NondelegationQueryInterface(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IID&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;iid,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;**&lt;/span&gt;&lt;span style="color: #000000;"&gt;ppv)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;---------------------excute&amp;nbsp;CompC&amp;nbsp;NondelegationQueryInterface!!!\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&amp;nbsp;iid&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IID_IUnknown&amp;nbsp;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;ppv&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(INondelegatingUnknown&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((IUnknown&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)(&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;ppv))&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;AddRef()&amp;nbsp;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&amp;nbsp;iid&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IID_AnyInterface&amp;nbsp;)&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;ppv&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(IAnyInterface&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((IAnyInterface&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)(&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;ppv))&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;AddRef()&amp;nbsp;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&amp;nbsp;iid&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IID_SomeInterface&amp;nbsp;)&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;m_pUnknownInner&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;QueryInterface(iid,&amp;nbsp;ppv)&amp;nbsp;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&amp;nbsp;iid&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IID_OtherInterface&amp;nbsp;)&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;m_pUnknownOuter&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;QueryInterface(iid,&amp;nbsp;ppv)&amp;nbsp;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;ppv&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;NULL;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;E_NOINTERFACE&amp;nbsp;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;S_OK;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;网上这方面东西不多，发篇帖子填补一下。 为这方面不太清楚的同学提供下帮助。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shiyangxt/aggbug/1896398.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shiyangxt/archive/2010/12/04/1896398.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shiyangxt/archive/2010/11/23/1885379.html</id><title type="text">RVM 安装与使用帮助</title><summary type="text">这个东东安装和切换ruby的版本非常方便.在这里强烈推荐一下.Mac系统自带的ruby版本比较陈旧.所以俺需要一个工具来管理,RVM的安装需要借助bash和git,这两个工具安装很简单,不多做介绍了.安装RVM命令:bash&amp;lt;&amp;lt;(curlhttp://rvm.beginrescueend.com/releases/rvm-install-head)然后修改用户配置文件/Users/us...</summary><published>2010-11-23T05:51:00Z</published><updated>2010-11-23T05:51:00Z</updated><author><name>施杨</name><uri>http://www.cnblogs.com/shiyangxt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shiyangxt/archive/2010/11/23/1885379.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shiyangxt/archive/2010/11/23/1885379.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;这个东东安装和切换ruby的版本非常方便.在这里强烈推荐一下.Mac系统自带的ruby版本比较陈旧.所以俺需要一个工具来管理,RVM的安装&lt;/p&gt;&lt;p&gt;需要借助bash和git,这两个工具安装很简单,不多做介绍了.&lt;/p&gt;&lt;p&gt;&lt;meta charset="utf-8" /&gt;&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; "&gt;安装RVM命令:&lt;/p&gt;&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; "&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" style="background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; word-break: break-all; overflow-x: auto; overflow-y: auto; "&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;bash&amp;nbsp;&amp;lt;&amp;nbsp;&amp;lt;(&amp;nbsp;curl&amp;nbsp;http:&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;//&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;rvm.beginrescueend.com&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;/&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;releases&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;/&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;rvm&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;-&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;install&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;-&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;head&amp;nbsp;)&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;然后修改用户配置文件/Users/username/.profile,你也可以写到别的全局配置里.&lt;/p&gt;&lt;p&gt;添加一行代码:&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000;"&gt;[[&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;s&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$HOME/.rvm/scripts/rvm&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;]]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$HOME/.rvm/scripts/rvm&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;This&amp;nbsp;loads&amp;nbsp;RVM&amp;nbsp;into&amp;nbsp;a&amp;nbsp;shell&amp;nbsp;session.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;重启Terminal,RVM就安装好了.&amp;nbsp;RVM的使用过程中不需要使用sudo,gem也不需要.&lt;/p&gt;&lt;p&gt;然后就可以安装ruby了,例如:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000;"&gt;rvm&amp;nbsp;install&amp;nbsp;ruby&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1.8&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;7&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;head&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;docs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;meta charset="utf-8" /&gt;&lt;span  style="font-family: helvetica, arial, clean, sans-serif; line-height: 22px; font-size: 15px; "&gt;&lt;code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0.2em; padding-bottom: 0px; padding-left: 0.2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; background-color: #eeeeff; font-size: 14px; "&gt;--docs&lt;/code&gt;是编译安装后自动生成文档，&lt;code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0.2em; padding-bottom: 0px; padding-left: 0.2em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; background-color: #eeeeff; font-size: 14px; "&gt;--head&lt;/code&gt;是最新的版本&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;meta charset="utf-8" /&gt;&lt;span  style="font-family: helvetica, arial, clean, sans-serif; line-height: 22px; font-size: 15px; "&gt;删除某个版本的ruby，并且把文档和gems都删除,则:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000;"&gt;rvm&amp;nbsp;remove&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;meta charset="utf-8" /&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;ruby&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;-&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;1.8&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;.&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;7&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;docs&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;gems&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;选择版本:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000;"&gt;rvm&amp;nbsp;use&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;meta charset="utf-8" /&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;ruby&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;-&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;1.8&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;.&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #000000; "&gt;7&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;default&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;meta charset="utf-8" /&gt;&lt;span  style="font-family: helvetica, arial, clean, sans-serif; line-height: 22px; font-size: 15px; "&gt;查询当前版本:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000;"&gt;rvm&amp;nbsp;info&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;列出版本:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000;"&gt;rvm&amp;nbsp;list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;更多命令,访问&amp;nbsp;http://rvm.beginrescueend.com/rvm/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shiyangxt/aggbug/1885379.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shiyangxt/archive/2010/11/23/1885379.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shiyangxt/archive/2010/11/12/1876078.html</id><title type="text">俺只是个穷学生...培训企业诚与不诚请勿扰</title><summary type="text">哎,这个社会什么公司都有,但是基本都发扬着榨干员工最后一滴血的高尚情操,能多抠多抠,能多剥削多剥削.IT类企业尤甚.能花500找个学生干的,绝不花3000找个社会上的.能花个3000找个码工干的,绝不花10000找个高级程序员做,即使写出的代码难以维护,超烂,超多漏洞,只要功能过得去一切都好商量.	这些公司一般也就是些无名公司,但是没想到有些名气的公司,也搞这套.前两天一个公司来我校招人,俺觉得这...</summary><published>2010-11-12T15:06:00Z</published><updated>2010-11-12T15:06:00Z</updated><author><name>施杨</name><uri>http://www.cnblogs.com/shiyangxt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shiyangxt/archive/2010/11/12/1876078.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shiyangxt/archive/2010/11/12/1876078.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;哎,这个社会什么公司都有,但是基本都发扬着榨干员工最后一滴血的高尚情操,能多抠多抠,能多剥削多剥削.IT类企业尤甚.&lt;/p&gt;&lt;p&gt;能花500找个学生干的,绝不花3000找个社会上的.能花个3000找个码工干的,绝不花10000找个高级程序员做,即使写出的代码&lt;/p&gt;&lt;p&gt;难以维护,超烂,超多漏洞,只要功能过得去一切都好商量.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;这些公司一般也就是些无名公司,但是没想到有些名气的公司,也搞这套.前两天一个公司来我校招人,俺觉得这个公司挺有&lt;/p&gt;&lt;p&gt;名的,也看好这个公司的前景,毕竟国内没多少人在做他们那块.缺少竞争对手.所以俺就想去瞅瞅,仰慕一下,也试试自己的水平.后&lt;/p&gt;&lt;p&gt;来了解之后挺出乎意料的:&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;strong&gt;&lt;span style="color: red; "&gt;他们招的人并不是直接进北京总部,而是留在本学校培训,交10000块培训费,签1年的合同.&lt;/span&gt;&lt;span style="color: red; "&gt;顺便帮他们&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: red; "&gt;做做外包.前三个月&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: red; "&gt;没钱拿,第四个月开始月薪&lt;/span&gt;&lt;span  style="color: red; "&gt;1500,但是考虑到学生没那么多钱,可以先交3000,然后公资抵消一下剩下的7000,基本一年都白干了.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red; "&gt;&lt;strong&gt;说得那么啰唆,无非就是白干1年,还要交3000.不过如果只是说这些,当然没啥吸引力,然后又给你描绘培训后你的未来会很光明滴,&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red; "&gt;&lt;strong&gt;很多大公司抢着要滴.俺觉得这种小几两还是留着逗小孩吧.&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;但是俺本来也对早些进公司被剥削没啥欲望.不过毕竟是个"大公司",俺还是决定参加面试,长长见识,没料到后来更可笑,说是&amp;nbsp;&lt;/p&gt;&lt;p&gt;技术总监面试,后来来了个和我同届的女学生做面试官.而且还迟到了,俺觉得也太不专业了.面试(人家说是聊天)没问出个啥,俺好好的&lt;/p&gt;&lt;p&gt;"表现"了一下,本来打算给他们的软件提提建议的,做得确实切入点不够准确,后来人家说不方便聊产品,俺就算了.&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;这就是故事的经过.不过这个公司当时还口口声声说不是培训公司,说什么就是招聘.在这里俺想告诉他一件事:&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;strong&gt;&lt;span style="color: red; "&gt;作为一个正规企业招聘,即使员工不能马上上手,入职培训或者找个人带着都应该是免费的,企业安排的培训对于员工来说算是&lt;/span&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red; "&gt;&lt;strong&gt;一种福利,而&lt;/strong&gt;&lt;/span&gt;&lt;span  style="color: #ff0000; "&gt;&lt;strong&gt;不是企业赚员工钱的理由.只要是培训收钱的,都是培训公司.这就是培训公司和招聘公司的区别.不用谢,我白教你这个概&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="color: #ff0000; "&gt;&lt;strong&gt;念滴,不要钱.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;这时可能你又要反驳我了,说我们是为了企业的利益着想,如果白教给了你,你学会了跑了,那我们岂不是损失很大.我想说的是那是&lt;/p&gt;&lt;p&gt;你们的问题,你们根本就不该把素质那么低的人招进你们公司.那是你们看错了人,OK?有的时候不是有能力就一定有品德,你们招聘的&lt;/p&gt;&lt;p&gt;时候麻烦看清楚.&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;承认你们是培训公司了不?不承认?,你还可以反驳我说"我们让你们做外包,并没有让你们做玩具项目."这你就更Caodanlity了,找&lt;/p&gt;&lt;p&gt;在校生给你们做外包, 你们还真会节约成本.学生交给你3000,白给你做1年外包,开玩笑.我们又不是没有公司可去.唯一值得让我肯定一下&lt;/p&gt;&lt;p&gt;你们的就是,你们对我的水平比较认可.说不用3个月,学1个月就能上手开发外包,俺真是谢谢您. 但是待遇一样,交3000,白干1年.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;说的够多了,俺该洗洗睡了.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;俺是穷学生,买不起Mac,只能黑一个,莫鄙视俺,一般俺不进这个系统,因为驱动不够完美.(本本跑了4个系统,win7也不用),今天重新耍耍&lt;/p&gt;&lt;p&gt;Xcode:&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/mac2.jpg" width="500" height="359" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;PS:&amp;lt;"老男孩"这个电影还是不错滴&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/mac1.jpg" width="500" height="360" alt="" /&gt;&lt;/p&gt;&lt;p&gt;PS:最近听了GD的音乐,很潮,很有才.欣赏,但是不哈韩.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /&gt;&lt;img src="http://www.cnblogs.com/shiyangxt/aggbug/1876078.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shiyangxt/archive/2010/11/12/1876078.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shiyangxt/archive/2010/05/13/1734372.html</id><title type="text">编译原理 实验总结及实现分析 递归下降与算符优先原理</title><summary type="text">做些小小的笔记，供同学参考。</summary><published>2010-05-13T04:18:00Z</published><updated>2010-05-13T04:18:00Z</updated><author><name>施杨</name><uri>http://www.cnblogs.com/shiyangxt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shiyangxt/archive/2010/05/13/1734372.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shiyangxt/archive/2010/05/13/1734372.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;这篇文章本来不打算写了。但是后来还是决定写一下。写这篇文章的目的，是帮助大家了&lt;/p&gt;&lt;p&gt;解到编译原理语法分析的模拟实现过程，因为我身边的一些同学，对这后两个实验没什么思路，所以&lt;/p&gt;&lt;p&gt;就引发了写作此文的冲动。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;-----------------------先上图------------------------&lt;/p&gt;&lt;p&gt;使用说明 ：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/mac4.png" border="0" alt="" width="865" height="265" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;词法分析：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/mac3.png" border="0" alt="" width="561" height="489" /&gt;&lt;/p&gt;&lt;p&gt;语法分析：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/mac2.png" border="0" alt="" width="717" height="256" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/mac1.png" border="0" alt="" width="877" height="550" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;词法分析大部分同学没什么问题，所以就不写原理了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;下面简述后两个实验的代码实现分析：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;递归下降：&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;quot;Times New Roman&amp;quot;;mso-hansi-font-family:&#xD;
&amp;quot;Times New Roman&amp;quot;;color:black"&gt;把接收的输入字符串，转化成字符数组。过滤非法字符，如果输入非法则报错，如果是合法字符，则进行递归分析，先传入加减处理&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;quot;Times New Roman&amp;quot;;mso-hansi-font-family:&#xD;
&amp;quot;Times New Roman&amp;quot;;color:black"&gt;函数，然后转入乘除处理函数，乘除处理函数则将方法传递给括号处理函数。如果包含括号，则判断是否后一位是数字，如果是就进行数字分&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;quot;Times New Roman&amp;quot;;mso-hansi-font-family:&#xD;
&amp;quot;Times New Roman&amp;quot;;color:black"&gt;词，取出数字串转换成十进制，然后赋值给临时变量。如果不是则返回错误。返回计算结果临时变量给乘除方法，乘除方法判断是否包含乘除&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;quot;Times New Roman&amp;quot;;mso-hansi-font-family:&#xD;
&amp;quot;Times New Roman&amp;quot;;color:black"&gt;符号，如果包含，则转入括号处理函数做分词，然后对返回的临时变量做乘除运算，如果除数为&lt;/span&gt;&lt;span lang="EN-US" style="color:black"&gt;0&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&#xD;
&amp;quot;Times New Roman&amp;quot;;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;color:black"&gt;，则报错。返回计算结果到加减处理函数，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 宋体; "&gt;然后验证一下程序此时是否有错，如果没错，进行加减判断，如果包含加减符号则传入乘除处理函数处理，然后把计算结果传给加减函数对临时&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&#xD;
&amp;quot;Times New Roman&amp;quot;;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;color:black"&gt;变量做加减操作。并返回最终结果。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;算符优先：&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 宋体; "&gt;把输入字符串转换成字符数组，同时新建一个临时数组保存中间结果，遍历数组，进行字符类型检查，如果不符合，则报错。如果符&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 宋体; "&gt;合，执行移进归约判断，根据临时数组当前索引的值，调整索引位置，然后取出临时数组的字符，查表取出横坐标的值，然后根据当前输入字&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 宋体; "&gt;符查表取出纵坐标的值，然后根据获得的横纵坐标查算符优先表，获得字符优先关系，根据关系判断递进、归约和结束。如果归约则判断当前&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 宋体; "&gt;临时数组索引的字符是否是合法字符，如果不是则调整索引。然后在根据临时数组取出算符优先表里的横纵坐标，然后根据算符优先关系，经&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 宋体; "&gt;过判断，确定输出到界面的格式，并输出。然后再次判断移进还是归约，重复以上步骤，如果需要移进或者结束，则直接获取坐标，取得算符&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 宋体; "&gt;优先关系，如果关系为移进，则执行移进输出，如果关系为结束则输出接受。如果都不属于则报错。返回处理入口，取下一个输入字符，再次&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 宋体; "&gt;判断。&lt;/span&gt;&lt;/p&gt;&lt;p  style="text-indent:44.75pt;mso-char-indent-count:4.26"&gt;&lt;span lang="EN-US" style="color:black"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;代码就不贴了，不要养成copy代码的坏习惯。我已经尽力描述了我的实现，如果有不对的地方，可以指出来。&amp;nbsp;&lt;/p&gt;&lt;p&gt;有些人的机子分辨率低，页面会有些变形，因为图片可能有点宽。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;最初不想发到首页，但是发现其他地方的帖子看者寥寥，所以我也希望得到更多高人的指点，只有交流才能进步。如果管理员觉得不合适可以&lt;/p&gt;&lt;p&gt;移除。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shiyangxt/aggbug/1734372.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shiyangxt/archive/2010/05/13/1734372.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shiyangxt/archive/2010/05/04/1727195.html</id><title type="text">一个Java小程序的跨平台思考</title><summary type="text">最近做了一个小的编译原理作业，是一个C_minus语言的词法分析器，本来四月初就已经写好了一个版本，而且支持一部分的语义逻辑验证，并且还可以处理所有常数，所有的关键字，所有的算术运算符，因为功能超出了老师的预期，以至于被老师怀疑是抄袭网上的代码，当然老师不只怀疑我，也怀疑别人。最终凭借我的讲解，彻底让老师信服。但是由于我考虑到一个方法的可读性原则，不想一个循环把所有逻辑都处理掉，所以写了多个处理方...</summary><published>2010-05-04T06:10:00Z</published><updated>2010-05-04T06:10:00Z</updated><author><name>施杨</name><uri>http://www.cnblogs.com/shiyangxt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shiyangxt/archive/2010/05/04/1727195.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shiyangxt/archive/2010/05/04/1727195.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;最近做了一个小的编译原理作业，是一个C_minus语言的词法分析器，本来四月初就已经写好了一个版本，而且&lt;/p&gt;&lt;p&gt;支持一部分的语义逻辑验证，并且还可以处理所有常数，所有的关键字，所有的算术运算符，因为功能超出了老师的预期，&lt;/p&gt;&lt;p&gt;以至于被老师怀疑是抄袭网上的代码，当然老师不只怀疑我，也怀疑别人。最终凭借我的讲解，彻底让老师信服。但是由于&lt;/p&gt;&lt;p&gt;我考虑到一个方法的可读性原则，不想一个循环把所有逻辑都处理掉，所以写了多个处理方法，把一个大循环，分离成多个&lt;/p&gt;&lt;p&gt;子循环。 这样可读性上升了不止一个档次。但是老师还是坚持要我们能够一个几百行的循环把所有逻辑都覆盖了。所以俺只&lt;/p&gt;&lt;p&gt;有重新写了，但是由于前段时间比较忙，直到这会儿，才有空把这个作业完成。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;不管是刚接触Java的，还是Java学的半生不熟但说自己很牛的，都知道Java有个特性就是跨平台。俺就拿这个程序做&lt;/p&gt;&lt;p&gt;了一把验证。这个程序是带UI的，UI用的是Swing。但是Swing不像我希望的那样表现的那么出色。在相同jdk版本的情况下，&lt;/p&gt;&lt;p&gt;兼容Linux良好，但是Mac里表现的就不尽如人意了。界面变形很厉害。于是把代码小改了一下，把Area改窄了。于是可以跨&lt;/p&gt;&lt;p&gt;平台了。但还是做不到零修改。我这还算是比较简单的程序，UI很简单，但是如果是个比较复杂的swing做的C/S软件，那估&lt;/p&gt;&lt;p&gt;计就不会这么幸运了。而且Java这块打安装包的工具也很少，顺手的并不多。我用的那个软件在Linux和mac在打包的过程中，&lt;/p&gt;&lt;p&gt;不绑定jre，这也让Java桌面应用跨平台蒙上了一层阴影。希望这方面有经验的朋友给推荐个比较好的打包工具。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;目前Java的应用领域已经完全倾向webApp和mobileApp。如果桌面还想分的一杯羹的话，建议Oracle能出个强&lt;/p&gt;&lt;p&gt;大些jre打包软件（最好免费，不过不大现实）。或者出个兼容性好些的GUI框架，jre的版本之间的差别相信大家也深有体&lt;/p&gt;&lt;p&gt;会，而且一般打包后体积也大很多。&amp;nbsp;下面上几个截图：&lt;/p&gt;&lt;p&gt;Linux平台：&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/wordAnalysisForLinux.png" border="0" alt="" width="700" height="489" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Mac平台：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/wordAnalysisForMac.png" border="0" alt="" width="754" height="531" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;XP下：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shiyangxt/wordAnalysisForXP.png" border="0" alt="" width="685" height="491" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Mac平台词法分析软件下载连接（不含jre，mac下会自带jvm，但是往往版本较老，10.5.*一般是1.5的，这个安装包我已经测&lt;/p&gt;&lt;p&gt;试，可以完美运行在JVM1.6下，有兴趣的朋友可以装装试试）:&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/shiyangxt/CAnalysis-SY-Install.zip" target="_blank"&gt;点击下载&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shiyangxt/aggbug/1727195.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shiyangxt/archive/2010/05/04/1727195.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
