• 11
  • 12月

过去的一周估计是我这学期过得最紧张的两周了。一周时间内看明白并修改一个Linux内核实在是一件相当挑战的工作。

事情还要从头说起,这学期我们开了一门bt的实验课,名字叫《系统软件分析与设计》,从第12周上到第15周,一周就两节,应该是个很小的课。这课课时虽少,老师出的题可不简单,整个课就研究一样东西Linux 0.11的内核源码,主要的问题有两个:

1.详细分析至少150行的一段代码

2.改造Linux内核,使其启动时能依次显示三个问题,由用户输入三个答案,然后退出。

初看起来两道题都不怎么难,因此前两个周我基本上都在看《linux011内核注释》前面的理论部分,没开始研究源码。到第三周开始看代码时真是服了——面向过程的典型非正交代码。代码之间有大量的交叉引用,想看明白确实不是件容易的事。

幸运的是之前囤的软件没有白囤,SourceInsight这款软件在分析源码时帮了我极大的忙。按住ctrl点一下就能转到引用处,在处理这种复杂代码时帮助太大了。

不过第二个问题就没那么简单了。内核毕竟不是应用软件,除了自己定义的函数可没有可以调用的“系统函数”(“系统”之中哪来“系统函数”?)。内核中定义了一个printk函数,输出问题不用考虑了。但内核里是没有任何类似scanf之类的输入函数的。怎么接收用户的输入成了难点。

一个在普通编程中简单到不能再简单的接收用户输入操作,放到内核里把我卡了好几天

(未完待续…)

  • 12
  • 10月

今天终于把《代码大全》读完了。读这本书的感觉就一个字——爽!

具体对这本书的赞美之辞我就不重复了:http://www.cc2e.com.cn书的中文网站上有很多的。

作者强调自己这本书是在讲软件构建的技术。但就我的理解,这本书从头到尾的主题就是一个:为人编程!

正如作者所言,人的智力是有限的,而软件开发是一个庞大的智力产品开发过程。人的大脑不足以一次完全驾驭这一过程。于是为了完成这一复杂的开发,我们必须想办法将这个大的问题拆分、简化到人类大脑可以完全理解并且能用计算机正确实现它的地步。而且为了确保软件的正确性,在编程时我们要尽力做到要让人易于理解。以方便调试和维护。

为了达到这个目标,我们发明了子程序,提出了对象对象的概念,在编码时要遵循一定的格式,让代码尽可能地易于人的理解。于是乎便到了为人编程这个中心。

当然,为人编程也是有些代价的,为了让程序更便于人的理解,很多时候我们牺牲了一些代码的运行效率。在尽可能提高程序的正确性时,我们消耗掉了越来越多的硬件成本,这便产生了安迪-比尔定理 (Andy and Bill’s Law)。但不管怎样,我们最需要的还是软件的正确性,而且借助于现在运行效率低一些的高级语言,我们可以在更短的时间内开发出更正确的软件来,这难道不是一种效率的提升吗?

为人编程,实为王道!

PS:将Code Complete翻译成代码大全可能是这本书唯一的败笔。害得我每次对没听说过这本书的人都得解释半天这是本到底讲什么的书…

  • 12
  • 9月

之前在Blog上发过一个将Subversion安装到Apache中的文章。

最近这个项目也用到了Subversion来进行源码控制。因为并不是每个人都有架Apache服务器 ,这次研究了一下如何直接架设Subversion服务器。

附件中的教程详细讲解了如何以Windows服务的方式安装Subversion服务器,并带有客户端TortoiseSVN的简单使用方法。

脱离了Apache服务器,终于可以使用Subversion自己的用户控制体系了,感觉还是很方便的。

不知道Subversion为何物的同学还是先Google一下吧:)

Subversion安装及使用简介

  • 02
  • 8月

今天玩asp.net时遇到了一个小小的问题:页面中有一个以JavaScript控制的select控件,用于时间的选择。

如何在asp.net的后台文件.cs代码中取得它的值呢?

第一个想到的方法是asp.net中最“正宗”的方法,把这控件标为runat=”server”,就可以在.cs代码中直接使用它的id访问它的属性了。但问题是这个控件是造客户端JavaScript代码来添加它的值的。而将select变为runat=”server”后,控件在客户端的id会被系统自动改变,不再是VS设计器中的那个id了。于是那段JavaScript就失效了。

然后就想到的传统的Form法,如同asp、php那样,在接受数据的页面取得post来的内容。在asp中,可以用 Request.Form(“XXX”)得到Form中的值。php中可以直接访问枚举数组$_POST[‘XXX’]。查阅文档,asp.net使用的与asp几乎相同的方法,使用Request.Form[“XXX”];(注意三种方法用的括号)。

但在我的程序中却意外的发现,这样取得的值始终是null。问题又出在哪呢?

又是一番排查,终于找到问题所在——又是可恶的name属性惹的祸!

这个问题其实在做php时就发现过,很简单:表单传值时只认name属性。如果不设置一个控件的name属性,不管你接收页用的是什么技术(asp、php、asp.net…)都无法取得这个控件的值。

这也就是为什么用DreamWeaver生成的控件代码总是会自动生成内容相同的两个属性,如:<input type=”text” id=”tt” name=”tt” />。JavaScript只认id、Form传值只认name。没办法啊!

总结一下,两句话:

1.asp.net中可以用Request.Form[“XXX”]这个索引指示器来实现传统的表单内容取值。

2.表单中的控件,只要不是runat=”server”,需要给它设上name=”xxx”的属性。

最后引用一篇介绍asp.net的Request对象的文章:asp.net技术浅析(九)

  • 01
  • 8月

今天做了个WebService的客户代理WebForm,要将WebService返回的DataSet中的表显示出来。

说到显示表格数据,最先想到的自然是GridView控件,然而教科书上给的DataSet全是在aspx前台文件里绑定到一个DataSource控件上的。而这个WebService返回的DataSet中有多个表,这些表在WSDL里又没有描述,所以无法用GUI搞定数据绑定。只有用代码了。

稍微上网查了一下,又试验了一下发现,其实这东西真的很简单——只要把支持的对象赋给GridView的DataSource属性就可以了。不过赋完值之后得显式地调用一下DataBlinding()方法,不然数据不会被显示出来。

如:
myGridView.DataSource = serviceReturnDataSet.Tables[“theTable”];
myGridView.DataBind();

这就OK了。

不过这样绑定有个很明显的问题:GirdView的列标题显示的都是服务器返回的值,对用户很不友好。怎样才能在代码中修改GridView的表头呢?

又是一番查找和尝试。找到了两个解决方案:

1.在前台aspx文件中实现

点击GirdView右上角的三角,在“GirdView任务”中选择“编辑列…”。取消掉“自动生成字段”的选择,手动添加与返回数据列数相等个BoundField字段,将它们的DataField属性手动设为需要绑定数据的每列的列名,HeaderText属性设为想要显示的名称。

确定后应该生成类似以下代码:
<asp:GridView ID=”scores” runat=”server” AutoGenerateColumns=”False” >
<Columns>
<asp:BoundField DataField=”C_name” HeaderText=”课程名称” />
<asp:BoundField DataField=”C_teacher” HeaderText=”教师” />
<asp:BoundField DataField=”C_hours” HeaderText=”学时” />
<asp:BoundField DataField=”C_scores” HeaderText=”学分” />
<asp:BoundField DataField=”scores” HeaderText=”成绩” />
</Columns>
</asp:GridView>

这样默认显示的“C_name”就会变成“课程名称”。而且利用这种方法还可以控制某些列是否显示。

2.在后台.cs代码中实现

只需在调用DataBlinding()方法前,改变GridView对应Columns的HeaderText属性即可。例:

myGirdView.Columns[1].HeaderText = “aaa”;

注意,该语句必需出现在myGirdView.DataBlinding();之前,否则不起作用。

  • 30
  • 7月

又拾起asp.net来了,而且还做了个相当“时髦”的东西:WebService。

小记一下这两天的开发心得。

1.WebService中想返回表格数据怎么办?

目前查到的方法只有让它返回一个DataSet,不能用DataTable的,好像目前也没有什么更好的内置对象可以返回。

貌似问题出现在将表对象串行化为xml时。并不是所有的对象都能良好地串行化为xml。

2.如何才能把在设计器中设计好的页面的一部分不发送到客户端?

在asp、php中,只要把相关html代码放到一个判读块的中间,就可以容易的实现控制是否将这一部分html代码发送到客户端。

但asp.net是表现与逻辑完全分离的,html里是没有代码的(当然,如果你非要像asp那样嵌我也没办法),怎样才能实现对是否输出的控制呢?

经过实验,只要把需要控制输出部分的顶级块做成runat=”server”,就可以在后台代码里控制它的visible属性,只要visible=false,该部分就不会被发送到客户端。

最简单的实现就是把这一部分放到一个div里:
<div id=”sendOrNot” runat=”server”><!–要控制是否输出的那部分html代码–></div>

3.使用正则表达式进行输入验证

sp.net提供了非常方便的输入验证控件。其中功能最强大的莫过于RegularExpressionValidator。虽然其功能强大,但正则表达式可不是每个人都能写好的。找到了一个网站,正则表达式仓库,推荐一下:egexlib.com

  • 10
  • 7月

努力了两个整天、一个上午,今天中午我的Java课程设计——连连看终于搞定了!

从六月分的一次突发奇想——自己编一个连连看玩吧,到后来决定把它做为我课程设计的题目。然后开始研究这个游戏的逻辑,再到7月5日开始写第一个类,中间去做志愿者,又有几天没能写程序。中间解决了N多bug。

今天晚上终于可以玩上自己的游戏了。

希望这个连连看能为我赢得像去年c语言的俄罗斯方块一样的好成绩。

  • 16
  • 6月

终于无法忍受几个人一起做东西时版本混乱的状态。决定学习使用Subversion进行版本控制。自己架设一下Subversion的服务器。

在Google上搜到两篇教程:Subversion配置安装教程(一)Subversion在linux和Windows下的安装步骤。写的很好,但因为具体环境不同。完全照教程是搞不定的。这里总结一下我的安装心得。

首先介绍一下我现在的环境:WinXP sp2;为学习php,安装了一套集成的wamp:easyapm21,集成Apache 2.0.55、PHP 5.05、MySQL 5.0.15等。这套系统为绿色安装,全部文件都在D:\usr下;使用过GoogleCode提供的svn服务,机子上已经安装好SVN的客户端TortoiseSVN。

我准备把Subversion安装成基于Apache Http Server的方式。直接集成到机子上已有的Apache上去。

首先到this directory下载了 svn-1.4.3-setup.exe 这个文件(最新版是1.4.4,但教程上用的是1.4.3,第一次安装,保险起见,不求最新)。双击安装即可。我把它安装在了“D:\Program Files\Subversion”下。

然后打开Subversion的安装目录,将其bin下的两个.so文件复制到Apache下的modules目录下。再将bin下的所有dll文件复制到Apache下的bin目录下。

最后检查Apache的httpd.conf。打开Apache安装目录下conf目录中的httpd.conf,搜索#LoadModule dav_fs_module modules/mod_dav_fs.so,把前面的注释#去掉;并检查LoadModule配置节的末尾是不是有了LoadModule dav_svn_module modules/mod_dav_svn.so和LoadModule authz_svn_module modules/mod_authz_svn.so。

到此安装过程就算结束了,不过此时Subversion还是不可用的。接下来的是配置过程。

1.建立源码库:

随便找个地方建个目录,作为源码库的根目录。(我的是f:/svn)

在其下新建一个源码库目录。我建的是test。《Subversion配置安装教程》一文中介绍的是使用命令行建立Subversion数据库。这个比较麻烦。我发现实际上TortoiseSVN可以更好地完成这个工作。装好TortoiseSVN后,直接在这个源码库目录(此处为test目录)上点右键,选择TortoiseSVN下的“在此创建版本库”,随便选择一种数据库格式就OK了。

2.修改Apache的httpd.conf

这个《Subversion配置安装教程》一文写的很明白。这里复制一下:
在httpd.conf末尾加入以下语句(其中SVNParentPath后的字符串就是上一步源码库根目录的路径):

<Location svn=””>
DAV svn
SVNParentPath “f:\svn”
AuthType Basic
AuthName “Subversion repositories”
AuthUserFile passwd
#AuthzSVNAccessFile svnaccessfile
Require valid-user
</Location>

这里建立了一个虚拟目录http://localhost/svn/,所有的Subversion源码仓库都在这个虚拟目录中,并且使用“passwd”文件中username/password(用户名/密码)列表访问http://localhost/svn/。

然后在cmd下进入Apache的安装目录(应该其下有个bin目录),执行bin\htpasswd -c passwd <username>(<username>是你想要加入的用户名,比如我的是work),系统会让你输入两次密码确认。这样你就可以在Apache的安装目录下看到生成了一个名为“passwd”的文件。

重启Apache,访问一下http://localhost/svn/test/,提示输入用户名密码,正确后显示Revision 0。证明安装成功。

现在就可以随便找个地方新建个目录,右击,选择“SVN检出…”,输入上面这个url,OK。开始享受SVN带来的便利吧!

  • 03
  • 6月

今天运气不错,天气很好居然也给电了。

打开电脑,随便吃点东西。翻开新买的《程序员》杂志。 这一期的特别策划是《业务敏捷:SOA的本质》

SOA现在真的是很热啊!但我居然连它是什么的缩写都不知道,先汗自己一个!

赶紧到网上搜一搜,恶补一下知识:

SOA——面向服务的体系结构(Service-oriented architecture)

查看了几个wiki中的介绍,大体上知道是怎么回事了。要做的无非是将每个功能模块化,尽可能地降低功能之间的耦合。模块之间通过服务的方法相互调用。这样当业务逻辑发生变化时,可以尽可能地降低对整个系统地影响,从而提高系统的可复用性。

为了真正降低耦合,xml这种平台无关语言起到了重要的作用。描述服务需要用WSDL(Web服务描述语言),服务调用需要SOAP。

在我看来,要想将SOA的设计思想真正实现在具体项目上,知识上要准备好xml那一套的东西。这需要时间学习和掌握。但真正难的是对软件设计的把握,什么时候使用SOA,怎样使用SOA。xml几个星期可以搞定,而软件设计则不是一天两天能够学成的。

路漫漫其修远兮,吾将上下而求索。

  • 31
  • 3月

下铺伙计从图书馆里淘来了本好书《Java Puzzles(Java解惑)》,没怎么看先被我抢来了。

先说一下这本书中文书名,感觉翻译的欠佳,Puzzle是谜题的意思,书中讲的也确实是Java里一个又一个有趣的小谜题,“解惑”貌似太正式了点,也怪不得这么好一本书居然没人借。

书中讲的就是些Puzzles:95个短小的Java小程序,程序很小,看起来也很简单,但一运行,总是会得到一个出乎意料的结果。从而引出Java一些需要注意的语法要点,让人在“游戏”中逐渐加深对Java的理解。

所有标签:.net Ajax Java javascript Linux map MySQL RSS TD-SCDMA Ubuntu vim web Win7 乱码 基础知识 备份 奥运会 希望泉 性能 缓存 编程