Agile
-
刚才看了一下上一个blog的时间,7.6号,一算已经一个多月没写了。借口还是老样子,忙。
从3月中旬开始准备,到前些日子正式上线,一直在忙奥运的项目,主要是这个http://info.2008.sohu.com .
开幕式那天在公司值班,不停的检查系统状态,快讯的发送状态,也没好好看网上的直播。
晚上回到家中,快2点了,cctv5重播,我看了会儿,听那小孩唱歌,突然很感动,后来听全场唱国歌,差点哭了,在那一下,有种很自豪的感觉,我和同事所做的项目是很有意义的,呵呵。
还有10几天,坚持就是胜利,呵呵。
-
有好些日子没有写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中的例子,不一定在生产环境中靠谱,还需要我们自己推敲一下。:)
-
在家里的时候, 习惯使用Ubuntu,有时上班的时候,总是想这个功能要是在windows里有就好了。
随着Ubuntu8.04的,提供了一种新的安装方式 Wubi
以下是摘自官方站的介绍:
Wubi is a Ubuntu installer for Windows users that will bring you into the Linux world with a single click. Wubi allows you to install and uninstall Ubuntu as any other application. If you heard about Linux and Ubuntu, if you wanted to try them but you were afraid, Wubi is for you.
昨天报着试试看的心理,边工作边使用Wubi下载安装了一个Ubuntu8.04,安装完成后,重新启动竟然是两个启动选项,可以直接引导进入Ubuntu。
今天试着在Ubuntu下工作,基本上所有的工作都可以处理了,只是偶尔需要访问公司的内部网站,对FireFox支持不好,用不了, 还得借笔记本临时顶一下。
总得来说,经过一天的试用,Wubi是一种非常好的安装Ubuntu的方式,不影响现有的分区,如果不满意,随时可以删掉,不用担心分区表被破坏之类的问题,推荐一下。 :)
将来,在公司工作时,Ubuntu也将是我的首选平台,呵呵。
-
我最终还是没有忍住,刚才悄悄地在网上用信用卡买了一本<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入门的,非常不错,推荐,呵呵。
到目前为止,刚刚入一点门,继续学习 :) -
Apache MINA竟然源自Netty2 - [自写]
2008-03-05
最近可能要做一个网络相关的应用,这种应用少不了NIO的支持.
这几天一直在努力准备相关的技术,把以前学过用过的东西想捡回来.
今天晚上在网上看有关Reactor和Procator方面的资料,回忆起来一些,,不怎么就跑到Apache MINA上面去了.
看了一个PPT,发现它竟然源自NETTY2,NETTY2是Trustin Lee(韩国人)开发的NIO框架.记得是在2004年的时候,我所在的公司就用它开发IVR方面的应用.那段时间学了很多东西,在开发学习的过程中也发现了一个NETTY2在高并发时的bug,后来我的经理写了一个邮件提交给了作者,最后他也采用了我们的建议,呵呵 ,这是我第一次对开源做"贡献",当时看到作者把我们提交的BUG确认后并修复后,很兴奋.一晃好几年过去了,没想到NETTY2已经发展到如此地步了,最近需要严重关注一下,可能的话就用MINA作为我们新应用的开发框架,有一种老友重逢的感觉.
-
今天去爬香山,累。
-
Groovy字符串操作 - [自写]
2008-02-14
Groovy提供了GString,可以很方便地帮助我们完成字符串的拼装,例如生成大段的HTML代码。
例如在Groovy中可以这样写代码:
def s = "<div>${example.name}</div>"
java中一般是这样的:
String s = "<div>"+example.name+"</div>";
或者使用StringBuffer(StringBuilder)拼装字符串。
习惯了Java的写法,同时又会利用Groovy的方便的语法来构造字符串,不小心就会得到很不好的结果,例如如下的代码就是我以前一直用的办法,感觉这种写法太方便了:
def sp = ""
sp +="${content}add At ${i}"
最近发现这种做法在文本较大的情况下会带来很坏的结果:
下面是完成相同工作的两种写法:
def gs = "";
def sp = "";
def content = "";
for(i in 1..1024){
content += "a";
}//使用GString构造
def f = System.currentTimeMillis();
for(i in 1..200)
{
gs="${gs}${content}add At ${i}"
}gs.toString()
//使用GString和"+"构造
def s = System.currentTimeMillis();
for(i in 1..200)
{
sp +="${content}add At ${i}"
}
def e = System.currentTimeMillis();
println("${s-f}ms [${gs.length()}] ${e-s}ms [${sp.length()}]")如果运行这个脚本,运行多次的结果如下:
2ms [206692] 290ms [206692]
3ms [206692] 298ms [206692]
4ms [206692] 282ms [206692]
3ms [206692] 305ms [206692]
3ms [206692] 332ms [206692]可以看得出,第一种写法的性能要好很多,为什么呢?
答案在GString的实现中,有兴趣的同学可以看一下GString的实现,它采用了一种延迟"拼装"的策略,它是在需要的时候才拼字符串得出结果;而第二种写法是在每一次循环的时候都要进行字符串的"+"操作,同时需要进行新的内存的分配,以及字符数组的拷贝,结果就是慢了。
如果即要写程序省事,代码明了,还要保证性能,采用第一种写法是比较好的选择,呵呵。
-
昨天只是轻微的感冒,今天早上起来变得严重了,打开电脑,正在思考今天是上班,还是不去上班,是个问题啊。
去上班吧,怕传染到同事;不去吧, 心里又觉得过意不去。
自小老师就教导我们,“你们看某某感冒了,还发着烧呢,但为了不误了功课,还是坚持来上学“。
这影响了我的前半生,觉得感冒根本就不是什么病。
不过最近觉得感冒也算是大病了,不能再愚昧下去了,你要是把一个组的同事全给传染了,特别是组里边还有一个将要生宝宝的女同志,那是不是罪过就更大了?
所以我决定今天请假不去上班了,为了同事的健康我也不能去上班,哈。。。。。。。。
-
Gnome窗口最大,最小和关闭按钮消失 - [自写]
2008-01-20
两周以来,在家使用Ubuntu的时候,每个窗口上的最大化,最小化和关闭按钮一直都没有。
忘记是哪次升级之后就成这样子了,用起来别扭及了。可我一直没有找到怎么恢复.
今天我实在受不了,决定解决一下,google了一下,在这里找到了一些信息如何调整窗口标题栏中的关闭,最大化,最小化,菜单按钮位置
我检查了一下我的设置,gconf-editor之后,发现/apps/metacity/general/button_layout是空的,试着把它的值设置了一下:menu:minimize,maximize,close(类型为字符串)
设置之后,那三个消失的按钮出现了,呵呵,终于解决这个问题了。
/apps/metacity/general/button_layout=menu:minimize,maximize,close







