Skip navigation.

Xruben's Blog

my space , 记录我的世界

Posts tagged with "程序"

总结

, ,

前段时间忙这敢着做东西,还碰上了自己以前很多没碰上的事情,所以干脆在这做个记录。

1. 乱码的问题:
以前以为写了一个filter就没有问题了,但事实上问题还很多。以前一直不知道为什么在Ajax中用GET方法发送的数据会有乱码的问题。就算是用了encodeURI进行编码,问题还是依旧。很多时候都尽量避免使用中文,又或者是使用字符串重建的方法来实现消除乱码问题。但一直都觉得这样的方法实在是不“协调”了,总觉得这是很别扭的事情。

几个这次又遇上必须要能下载中文文件名的的文件,以前的方法都是直接使用英文,但链接文字用中文,但是这样用户不干了。觉得写下载类,又加上要使用数据库进行管理,比较麻烦,不过写下载类,能更细粒度地控制整个下载。

IE有个总以UTF-8对链接进行编码,这也就是说,链接都是以UTF-8格式传上去的。但就是这样,服务器端依旧没有办法正常识别汉字,因为Tomcat总是以ISO-8859-1(java.net.URLDecoder.decode(url, "ISO-8859-1"))对URL进行解码,所以根本得不到正确的文件地址。解决方法很简单,那就是在配置文件中(访问端口的配置中)加入URIEncoding="UTF-8"这个设置,那么问题就解决了。但是这个问题解决了,老问题又来了,以前字符串重建获得参数值的方法又是乱码了。原来IE的UTF-8进行编码,并不包括对GET形式提交参数进行编码。也就是“?”后面的中文并没有进行编码。

用Opera的时候,就会发现,很多时候URL中的中文字符就被进行了编码。IE就不会帮你完成这项任务,所以你只有自己动手,使用encodeURI进行编码,或者在显示前,用Struts标签中的Link之类的便签编码后输出。当然自己用URLEncoder.encode(url, "UTF-8") 方法也行。

由于POST没有这样的问题,所以最好都是使用POST方法提交,有链接的地方,那还是先编码再输出,或者还是用脚本控制。还有就是字符串重建是非常非常愚蠢的方法,还是别用的好。

以前不知道JSP页面里的pageEncoding是干什么用的,现在知道了,是标识JSP源码是用的什么编码格式,这个属性可以令源码同页面字符的输出不是同一种格式。不过这样的做比较愚蠢。

2.线程安全
在使用ThreadLocal类的时候一定要注意,每次使用完毕了ThreadLocal中的数据后,一定记得要清理掉,或者每个请求前覆盖掉。在Tomcat中,每次请求后,此线程并没有消亡,只是假如不够用会启用新的,旧的会一直保留着,这点和连接池一样!只是连接池程序会帮我们清理。以前我一直以为每个请求后,都会启用新的线程,但事实上是每个请求都是独立的线程,但不一定是新的。结果上次写程序还犯了错误!!

3.数据库
一直没在数据库上遇到乱码问题,也许是因为用的Oracle,人家这方面已经做得很好了。不过上传发现,大数据类型,如BLOB这样的字段类型,对储存空间非常敏感,因为要是没有相同名称的空间,那根本就导不进去,哎!!!以前一直用Oracle提供的操作界面在操作,结果自己都不知道如何用SQL进行创建,结果使用简化版本的时候,我根本没办法创建空间!

一点总结

,

这两天给项目加入了权限管理,在Struts中覆盖了RequestProcessor的processActionPerform的方式,加上一定的配置来实现一个简单的拦截的实现!

其中也暴露出很多问题,这个权限管理的方式是我来实现的,但是项目前面的部分我却没有参与,结果造成一定的问题。最后对以前的程序还改了不少。这其实就是由于自己和别人的沟通不够,以自己所认为的那样,很简单就把问题解决了!

一方面,也体现出程序的混乱。关键字都是随便写,要是很多关键字在多个地方用到,那就应该让他成为公共的静态变量。还有就是数据的问题,由于没有好的约定,数据存在Request还是Session中都是很随意的(不过还没用到Cookies),当然其中关键字也是想到就取的。有的用户数据应该是存放到SessionBean里。

缺乏对关键字的管理,缺乏沟通,这些在项目中都是很致命的!

现在绝对,Web开发中,页面的开发和维护是最累的,也是最烦琐的。我想这才是为什么页面的组件化这么受欢迎。特别是当页面很复杂的时候。很多时候页面所需要的DTO和域对象并不相同,当对象很复杂的时候,其中的转换也让人头痛。

喜欢编程,就因为会遇到各种问题,解决这些问题是很有意思的。

毕业设计

,

毕业设计是大学本科生最后的一个作业(文科的主要是论文)。但是我们同学学校真扯淡,这个月20号就要交最后的论文,并包括完成的程序。他们老师让她15号前交给他,呵呵,他们老师好像从来没有关心过她的进度,哎!自然也怪我,功力不够,做事太慢了,否则也不会这么被动!

不过他们最后的终审要到6月去了,可以想象学校把大量的时间都浪费在流程上面了。很想不通怎么会这样!而我们学校是六月份答辩,六月份毕业。其实说起来,正确的做法就是答辩来确定一个毕业设计是好是坏。学校应该让学生有更多的时间来准备,把毕业设计做到最好!

也许他们学校本来就只是想让学生交个东西上去就好了,也许有能力点的能够交出一个比较不错的,其他的也就这样好了。而且发现他们有很多人都还是很菜的,我们学校也是。很多时候都是这样,你以前学的东西,可能很多都在毕业设计上用不了,反而很多要用的都是没学过的。

连个毕业设计都是这样了,我们在学校学到的东西,到社会上,到底能用上几成呢?

这两天觉得,程序开发一定要多和人交流,多和人交换自己的想法!否则很多时候自己想了很久,都只不过是在浪费时间!

一周又结束了

, , ,


过得好快的样子。刚开学的第一周还觉得好慢的样子,没想到这第二周居然过得这么快。时光真是匆匆地从身边溜走。自己一直是个不太会把握时间的人,对时间的管理也不是很好。这个周末我就把手机关了,结果关了两天连一条短信都没有,呵呵。看来都没有什么人想找我。

明天就是生日了,今天还有朋友记得我生日,呵呵!心里还是很安慰的。

周末自己写了两天的代码,发现子效率太低了,看来没有一个好的框架,会造成自己花费大量的时间到一些非业务逻辑上的东西上。看来真的有必要学习一个好的框架,不过想JAVA里,没有什么太好的一站式框架(虽然确实有几个),大多数都是用Struts+Spring+Hibernate这样的组合,和RoR比起来,真的是差很远的。现在越想约想学RoR了,不过不但现在它在Windows下的效率很差。某些数据库支持也不好。Jdon Framework这东西也听说很久了,是国内的开源框架,不过用的人很少。

原先自己很喜欢组件式的框架,但现在似乎不那么喜欢了,现在觉得Action式的灵活性要大很多。当然,在页面数据显示,表单处理等这些方面有很大的优势。有时候,做程序的时候感觉是在做体力活,真是不正常的现象。假如都是体力活了,那还要计算机来做什么呢?那我们还需要什么编程呢?这都说明自己还有很多需要继续学习的东西。

A ZA A ZA FIGHTING !

回想

, , , ...

又上了一个星期的课了,最近真是不太爽,感觉人都快死了,很像早点结束这样的生活,能开始新的生活!或许人都是很容易期待明天能有新的开始!

这周时间利用不充分,虽然自己现在睡觉时间已经少了很多了,但是自己也不知道这能坚持多久。现在觉得好累了,但是自己平时有时真的不知道该如何利用时间,看来自己的时间安排上,还是存在非常大的问题。也许自己有些没有目的,有些不知道方法。

今天把《越狱》的19集看了,看到这里,自己也觉得很能体会他们的那种绝望了。今天还看到了清考安排,自己这次要考四门,还真是很大的挑战!

上有限元的时候,发现居然发现老是是用的PDF做的讲义,可能老是还不是很熟,没能把做成幻灯片的尺寸,不过我觉得已经非常难得了。现在学校,那里还看得到什么非Office的文档呀!所有人,都不自觉上了MS的船,这次开题报告,说是要做成幻灯片的形式。我想,没有人会用PDF做吧,毕竟可能演示的电脑上不会装PDF阅读器,不过Office是肯定有的!

看了这期的《程序员》,看到几道面试题,发现自己真的差很多。比如求最大公约数的算法,我想很多人都想不简单大方法,我想,就算是在计算机专业也不会有多少人知道这个欧几里德的非平凡算法。

int gcd (int m, int n) {
    if(n == 0) return n;
    return gcd(n, m%n);
}

现在越发觉得,没有非专业出身真的是比别人缺失很多东西。不过我也觉得我们学校很扯淡。现在快毕业了,结果我们的毕业设计居然超过90%的都是和编程相关,呵呵,我们变成了一计算机专业了。当然这也说明现在工程已经离不开计算机编程了。不过现在大部分的编程都集中在C++,不过还不例外的全都是用的VC++,当然,这也是因为我们学校都用的是windows。不过让从来都没学过C++的人开发程序,我不知道这个是出于什么目的,虽然是学过C。

程序是什么?突然想到这个问题是因为身边的人,现在都把程序和GUI画上等号。这不是他们的错,这是因为我们都只接触windows,也许接触过DOS的人会有不同的认识。当我告诉同学Linux内核不带GUI的时候,当同学发现书上用命令操作CVS的时候,毫无疑问,他们都觉得这样的东西是“垃圾”。好像大多数人都喜欢用鼠标狂点,也不会有多少人喜欢用*.bat来简化操作!

当然,在大多数人眼里,程序只是工具,好用就行,别的根本不重要。对于很多来说,编程也是这样,只不是过是种手段。很难相信,没有“信仰”能产出优秀的东西!

最近实验课在学patran,以前听都没听过的软件,是一个FEM的软件。今天在一个论坛里看了别人关于patran与ansys的对比,这个让我想到了JAVA世界里的IDE之争。应该说都是很好的软件,但是却总有人要挑起“战争”。当然,人是要有偏爱的,假如没有,怎么能激发人去学好、用好,迫使自己进步以让别人闭嘴呢?

真的想学好英语了,现在开始觉得英语真的是很重要,现在太多资料都是英文的了,虽然我们国家有那么多学英语的,可惜好的翻译却少得可怜。还是自己领悟来得比较实际。当然,我也无法忍受自己考试这么多次都不过!

A ZA A ZA FIGHTING !

我可怜的E50

, , , ...

哎!我的E50没有设计套挂件的地方,也许是因为觉得商务机不该有挂件。我哪会管这些,就把挂件套到喇叭口上。今天终于把喇叭口的“栅栏”给拉坏了!这下挂件彻底没有地方挂了!

今天一个朋友(其实我也不知道到底算不算朋友)找我帮她找个“导航员”。我就让庆升帮我这个忙。要是他们擦出火花,那我算不算媒人呢?呵呵!

今天在想怎么给系统做个独立的权限管理模块,现在是很头痛呀!今后几天就专门来思考这个问题好了!

不知如何下手

, , , ...


  近两天比较烦,答应帮同学做毕业设计。可是当开始做的时候,才意识到,事情并不是我所想的那样!倒不是觉得自己没能力做出来,而是发现做毕业设计同真的做一个程序或网站,根本就是两回事。总的说来,会觉得比做一个项目来得烦。我觉得我是在做无聊的事情!不过既然答应人家了,我就一定会认真做完的!

  如果是真的做一个项目,可能会采用迭代式开发,需求分析也是真实围绕用户的需求来做,功能可以分部实现。至于详细设计什么的,这个就比较灵活了,很多程序员之间沟通得比较好,设计也可以简略点。但是做毕业设计就不同了,什么需求,都是自己在那苦想,很多就算不是很实际的东西也可以写上去。一切都是要为了一个漂亮的设计,而不一定真的要一个好的实现,反正要求也只是实现某一部分。一切都只是为了验证所学知识,而不是真的在做项目。我想我已经开始跳出毕业设计,把它当成另一种项目了。这好比考试,你可以认真学习知识点,也可以解剖考试,针对试卷而复习。

LGRM程序总结

, , , ...

  LGRM -- Lao Geng Records Manager

  为同学开发的这个软件,也是自己第一个桌面程序,还是用JAVA写的。所用的数据库是陌生的(db4o),JFC(swing)以前也没用过,也是第一次用NetBeans来设计界面。整个过程下来,还是学到不少东西。

  以前没做过桌面程序,对开发模式,模块分化等等都好的设计。做了下来,个人觉得应该分为四个部分 GUI,Action,Model,DAO。

  GUI部分主要是界面布局,提供功能入口和数据呈现。应该尽量将拆分为独立的各个部分,最好是Panel,并添加到组件面板中。使用JDialog还是JFrame,那要按需求而定。这次我就改过,从JDialog到JFrame,因为JDialog不能全屏放大。只要将界面组件拆分好,再加上NetBeans的强大能力,是可以做出漂亮的界面,并且对界面的修改也容易。要是分离得好,那基本上对功能代码没有影响!

  Action部分,基本都继承Thread,也就是要有多线程运行能力,保证程序反应灵敏,特别是在访问数据库的的时候。这部分也是主要的逻辑部分,处理用户的操作、获取数据、验证数据完整性、提示用户、更新数据。有时候会觉得这部分太零散了,类过多。

  Model部分,基本是数据承载类,也是因为swing的原因,像JTable这样的数据组件都有个Model,提前封装好就可以直接使用。封装一般由Action完成,可以适应一个数据,多个Model。不过如果数据显示单一的话,也可以直接由DAO完成,这样还要个好处就是数据装填对应性好。

  DAO部分,负责和数据库交互,返回数据格式最好是和数据以方便装填。这部分多数以存储对象的为基础构造。

  实际中,组件间的相互访问,Action和组件访问都是比较多的,要想访问,就得有引用。要不所有组件放到一个Class中,要不保证本组件有要访问组件的引用。与其这样还不如搞个组件池,把几个主要的组件放个引用到池中,需要时就去拿。

  在Web程序中,表单验证是经常提到的事情,比较客户端和服务器端交互的主要手段就是表单。在桌面程序由于没这个故有的form,所以自由度很大,不过最优的解决方案还是验证的直接绑定。原则是,只写一次!

  在桌面程序,最复杂的地方应该算是事件的触发了。包括同一事件的不同触发方式,以及多事件的相关触发,以及同一事件不同情况的触发的不同结果。还要一个方面就是数据的完整性。保证数据的完整性是个很重要的方面,应该在Action和DAO两个部分都保证。主要在Action来完成,这样也可以向用户提示足够细致的信息,DAO主要是起到一个校验的作用。

  提供一个默认设置,从数据存放到功能方式。尽可能向用户提供更多的选择!尽量不要让提示、标识文字出现在程序中,将他资源化,保留一个默认资源。这样最大的好处就是可以国际化!如果有可能给用户提供一个BUG或意见的提交方式!

  建模的重要性。建模可以提前帮助你更清晰的看清每个部分,提前想好每个部分的关联。“过于敏捷”也不是什么好事!提早进入细节的实现,容易导致对全局的或略,使软件走偏。也容易犯考虑不周的问题。敏捷最主要还是要满足用户需求,可以让GUI部分走得块些,利用强大的界面设计器,和用户一起模拟使用环境。用户是“愚蠢的”,很多时候用户并不知道自己真正的需求,如果你想到了某需求可能需要,那请在进度保证的情况下加上去。如果是功能实现的不同见解,那就和用户沟通,如果自己坚持那就干脆提供两总方式!满足自己也满足用户!

  今天就写这些了!

关于产品化

, , , ...


这个也算是自己在已经有的开发经验上一些总结和构想。主要是自己所在的开发团队都是刚组合,而且都是一些没有经验的,所以出现了很多问题,这只是一部分,还有好多以后再慢慢总结。
项目管理:
1. 产品规划
2. 产品构架
3. 产品过程控制
4. 培养

一、产品规划
主要是关于产品导向问题。
1) 市场需求:在这一点上由于现在阶段面向客户对象比较明确,对客户本身也比较了解,产品需求明确。这个直接决定出产品。
2) 产品定位:这主要是关于产品在客户使用中,所体现出的价值。也就是之于客户它是什么,能用它做什么。这个也和集成密切关系。定位不同,其在集成中的主被动性质不同。定位不同,也可能是产品发展出不同版本。
3) 产品功能:主要决定产品功能,即所能做的事情。
4) 技术构架:这主要是产品的一个大的框架。如eclipse的插件方式,这种与采用技术无关的技术构想,真正软件技术上的灵魂。柔性化编码的具体实现方式也算是一种构架。
5) 采用技术:这一点主要是综合考虑,如开发人员掌握的技术,开发主导技术方向。如JavaEE是目前的技术方向,struts是已经掌握的技术。
6) 理论注入:伴随新的理论发展,就应当把新的理论成果溶入到软件中,努力保持软件的“先进性”。
以上应该是在开发中循环的过程。到了某个阶段应该对市场重新了解,并再次定位,或许是开发新的版本或衍生产品等。软件后续版本功能,以及以前产品功能更新,当然这其中要保证兼容或能使用户平滑地过度。技术和理论的更新将重构产品或发展新实现功能方法,并提高产品性能。

二、产品构架
主要是技术和功能的具体化。
1) 复用:提取软件的公共部分,使能被复用。
2) 组件:尽量在软件中使用各种组件,减少代码重复,杜绝copy行为。
3) 模块:在软件设计上使软件模块化,分离功能,利于软件扩展。如果可能,实现可插拔。
4) 测试:使用一种高效测试方式或框架,保证软件质量。功能、安全、效能都重要。每个部分都要测试。
5) 统一开发平台:使用成熟可靠的开发工具,做到所有成员统一。保证所有工具可以协调工作。并且这种工具是很好做到团队合作的。
6) 集成:由于这点很被动,这个可以单独提出,建立起自己的多种集成解决方案,应对不同客户需求。自己的产品可以无任何影响的情况下,加入一个集成模块就能实现集成功能。

三、产品过程控制
主要是为了保证产品的质量。
1) 时间安排:由于我们是学生,有的东西就需要考虑得比较多,软件开发的时间节点尽量细化,避免时间冲突。如考试。并且要有机动时间,用于应付突发事件。
2) 任务安排:根据时间段的划分任务具体化,每个时间节点都要有成果总结。
3) 人员安排:根据人员能力不同进行划分任务,注意人员间的搭配组合,有意识形成Pair。既能相互提高,又能保证产品开发的连续性。
以上三点主要是调度问题,一个进度问题,另一个就是人员流动问题。
4) 规范管理:这个就比较大了。应该有某一时间段软件需求(功能需求)说明和实现目标,项目调度(上面所提到的三点),进度报告,软件版本管理,相应文档。所有东西应该书面化,防止随意。可以仿照开源软件的方式,建立一个项目(产品)的主页,把所有信息都布到主页上,进行集中控制。
5) 建立一种协作机制和管理模式,保证开发统一性。例如开发一个主页,整个项目的所有信息,包括规划、文档、源代码、进度、项目调度、所取得成果……,开始的时候可以是一个局域网的,成果展示的时候,几乎不用再多做什么东西,访问网站就什么都有了。

四、培养
关于这点,主要是考虑到我们人员有着固定的流动和更新。就应该有一套人员培养规划,引导新人能顺利溶入新团队。并在技术上循序渐进培养,使整个团队人员技术达到平衡。

编码软件发展方向:定义,管理。
现阶段可以说是关于编码管理。虽然有了灵活的规则定义,但是依然处于一种被动管理的位置。在这部分成熟后,就应该考虑把规则定义的智能生成实现。就是说,普通用户在想对产品编码的时候,并不熟悉理论,我们就是是要开发这样一个软件工具,辅助甚至是替代人工制定规则。这可以独立成一个产品,并紧密和编码管理软件联系。


/**
* Sometimes , the only way to stay sane is go a little crazy .
*/

Java感想 一

, , , ...


Java SE 6 给我们带来了2个新特性

1. Classpath通配符

2. OutOfMemeory Error检测

简单而使用的东西,对于第一个,我个人觉得对干工程的人,作用好象不是太大,不过对于一个新手,用命令开发,那还是很有用的东西。第二个,那就是很有意义了。知道哪里错了,真是很不错的事情。最郁闷错了,但是就是找不到错在哪里!!

对于环境变量,其实本来是不用设置的,当然,那又是非常麻烦的一件事情,毕竟每次都输入那么多的东西并不是什么愉快的事情,我觉得很多书讲得都不是很明白,特别是对于一些刚接触程序开发的人来说,简直就是噩梦!!记得刚接触JAVA的时候是在我开始学习编程之前,那个时候我还什么都不知道,都不懂。那个时候我照着书弄个一个晚上的JAVA环境,然而最后失败了。。那以后,我学了C,学了Javascript和ASP技术,两年后,我又开始学JAVA了。走了那么一大圈,我还是回来了。

两年多以前,要是我真的开始学JAVA了,那我也不知道我现在会是怎么一个样子,呵呵!也许我就不再是现在这个样子了!!现在学习很忙,但自己还得不断学习自己热爱的Java。说实在的,这并不是什么轻松的事情。自己在煎熬中徘徊,想要放弃,却有无法放弃。。。

其实如果按正常的学习规律,大一大二是积累的时候,大三的时候干事情的时候,大四应该是成果满怀的时候。然而现在的我却还什么都没有,处了在同学间的一点点卑微的名气。

入门是很总要的事情,如果有个好“老师”,那将是终身受益的。可惜,我一直没有找到这样一个老师,一切都只有靠自己摸索,甚至是两年后重学JAVA那段时间,我依然是自学的。没有老师,没有指点,知识的来源就是图书馆和网络。可惜自己E文不好,哎!现在已经是自己学习中最大的障碍了!今后的努力弥补!!

现在程序的门算是入了!可是我现在又开始迷茫了!一方面是因为自己成绩很烂,陷入了毕业考研的痛苦旋涡中,而另一方面又发现自己在浩瀚的计算机世界里找不到自己的位置了,自己开始不知道应该往什么方向发展了。

JAVA的WEB开发也越来越远离我所设想的了,越来越觉得自己象是一个拼装者,拿着别人给的东西,然后把它跑起来。我想一个用门电路做一个CPU和一个人买个CPU来用,其中的乐趣我想是无法比拟的吧!!!

/**
* Sometimes , the only way to stay sane is go a little crazy .
*/
January 2010
S M T W T F S
December 2009February 2010
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30