Agile
-
有好些日子没有写Blog了,奥运越来越近,工作是越来越忙了,呵呵。
最近主要是在搞公司的工作, 抽空把Scala研究了一下。
用Scala写了一些程序,因为还不熟悉,所以经常要查文档,看资料。
着重研究了一下Scala的Actor用法,在此推荐两篇论文:
Event-Based Programming without Inversion of Control 和 Actors that Unify Threads and Events,
这两个论文都是在Actor 的API中引用的。
Sala的Actor即有Erlang中轻量级Process的优势,又可以直接当作本地线程使用。
我总结了一下,对于Actor的使用,基本上可以根据任务的特点来决定使用哪种了:
1.cpu相关的
对于这种任务,无论是Erlang的Process,还是Scala的Actor都可以支持得很好,Scala的实现是用一个线程池来执行Actor,它可以根据cpu的个数决定线程池中工作线程的个数,同时根据任务的个数,适时的调整这工作线程的个数。
写法在Scala的例子中有很多,类似如下:
loop { react { ........ } }
2.io相关的这种任务主要的工作不在cpu,而在IO操作上,比如读写Socke等,类似这种操作的时候,最好使用Actor的线程特性,也就是在ract的时候,根据参数新创建一个Actor来执行和IO相关的任务,下面的“主Actor”的任务是接收消息,每收到一个消息就启动一个Actor去请求页面的内容,然后再做相关的处理,这也是Actors that Unify Threads and Events 里所主要表达的内容。
loop {react {case url:String =>
actor{
//由个新建的actor执行IO操作,避免阻塞后续的其它的请求
val response = HttpUtil.get(url)
}
}
}
用Scala写并发方面的程序要比Java来得容易,Actor的使用要小心一些,否则不小心就搞出一个“串行”来,呵呵。
说说Struts2吧,
很久没有用过Struts2之类的Web框架了,最近在用Struts2,开始是同事基本上把环境都搭好了,我只需要下载更新后,按步就班地开发就好了。昨天需要我从开始弄一个应用,那就一个背。照猫画虎地把应用弄起来,写action,写jsp,还算顺利。这时发现了一个问题,因为我用的了所谓的"模型驱动"这种参数注入方式,OGNL以前也用过,它可以根据表达来给Action中的对象属性设置由页面中传入的参数。
private Sample sample;
public void setSample(Sample sample){
this.sample = sample;
}
有了上面这段代码,OGNL就能自动地把提交的参数设置到sample这个对象的属性中,比如sample.user.
这就让我产生了一个疑问,如果用户知道我们的Action中的其它setter方法,那会不会受到”攻击“呢。
我试了一下,
private OwnSample ownSample;
public void setOwnSample(OwnSample sample){
this.OwnSample = sample;
}
假设用户知道有这么一个属性可以用,那种他在发送请求的时候会加上一个ownSample.id=XX之类的参数,就会造成OGNL首先会生成一个OwnSample对象,然后设置属性,然后调用 setOwnSample设置给Action中。如果这个参数是使用其它的途径注入,如用Spring,那用户设置的参数会被覆盖掉(在这种情况下也是有害的,因为无谓地多生成了一次对象,还要看创建对象的代价大小,如果是那种比较费时的创建那就惨了),反之用户的参数就会生效了。
虽然是内部使用的程序,我觉得还是能避免这种问题最好,找了一下API,发现可以定义一个acceptableParameterName的方法来过滤一下参数就保险了。
类似的问题还有Struts2在配置文件中定义Action的时候,支持通配符,例如:
<action name="user_*" class="com.UserAction" method="{1}">
这种配置我觉得也是有风险的,如果UserAction里有一个一般用户都不知道的方法,那么如果被猜出来,或者被“离职的职员”恶意访问,问题就大了,除非对这种方法有额外的权限检查。所以如果有这种问题,还是勤快点儿,尽量少用通配符的好,呵呵。
这两个问题是我正经用了两天Struts2之后感觉不太对的地方,写出来,也可能有更好的解决办法,供大家留意一下。
多说一句,现在的各种框架的Demo 或者样例一般是怎么简单怎么来,让人一看就觉得这太简单了,太好用了,省得我老得request.getParameter一个一个的把参数凑整齐再用,这么用多方便。我们还是小心点好,Demo中的例子,不一定在生产环境中靠谱,还需要我们自己推敲一下。:)
-
我最终还是没有忍住,刚才悄悄地在网上用信用卡买了一本<Programming in Scala>,$22.5啊,这是我买过得最贵的书了,而且还是PDF的,连张纸都没有。
传到我的8700上了,要好好学习,好赖也是用美元买的。 :)
-
First Steps to Scala - [自写]
2008-03-25

What is Scala?
Scala is a general purpose programming language designed to express common programming patterns in a concise, elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages. It is also fully interoperable with Java. (摘自Scala主页的简介)
最近晚上的大部分时间都耗在它上面了, 第一次知道Scala是我在网上搜索Groovy的性能问题的时候,
发现了一个Scala与Groovy的性能评测对比,简单的了解了一下Scala,没什么感觉,被它奇怪的语法
吓到了。
近期一段时间,一直在忙公司的项目,晚上回来想做点什么,就想起了Scala,想研究一下,连续几天,
慢慢的被它吸引了,原来认为奇怪的语法,现在看起来实在是很简洁,和阿菜两个人决定一起研究一下Scala。
他下午发给我一个地址 First Steps to Scala
讲Scala入门的,非常不错,推荐,呵呵。
到目前为止,刚刚入一点门,继续学习 :)







