• ITwiki

    2007-04-11

    分类:开发手记

    ITWiki  今天在准备周五讲座的时候找到了这个网站,觉得还不错,一本关于IT技术的中文百科全书,很多的IT数据与常识都可以在这里找到,而且还比较全。

    这是网站自己的描述“中文IT百科是一部内容开放的百科全书项目,其目标是包含并以中文来表达IT领域的知识。”

    中文IT百科采用了Wiki技术,任何人都可以对条目进行编辑,并且这些修改都会得到完整的记录。本百科的内容由本网站的所有访问者合作编写而成,我们相信它将在大家的无私奉献下得到不断完善。欢迎您一起参与中文IT百科的工作,自由地体会编书的乐趣,与大家分享您独到的知识和经验。

    Wiki技术的使用应该说只是共享的一个很好的应用。Wiki的中文名称是维基百科,是全球最大的百科全书,只可惜,在国内的部分地区不能访问,只能通过一些代理访问。

    关于Wiki:

    Wiki,来自夏威夷语的“wee kee wee kee”,本是“快点快点”之意。在这里wiki指的是一种可在网络上开放可供多人协同创作的超文本系统,是由“Wiki之父”沃德·坎宁安(Ward Cunningham)于1995年所创。

    wiki包含一套能简易创造、改变HTML网页的系统,再加上一套纪录以及编目所有改变的系统,以提供还原改变的功能。使用wiki系统的网站称 为wiki网站,wiki网站容许任何造访网站的人能快速轻易的加入、删除、编辑所有的内容,而且通常连登录都不必,因此特别适合团队合作的写作方式。 wiki系统也可以包括各种辅助工具,让使用者能轻易追踪wiki的持续变化,或是让众使用者之间讨论解决关于wiki内容的固有争议。wiki的内容也 可能有误,因为使用者必定会加上不正确的资料。

    有人认为,Wiki系统属于一种人类知识的网络系统,我们可以在Web的基础上对Wiki文本进行浏览、创建、更改,而且这种创建、更 改、及发布的代价远比HTML文本小;与此同时Wiki系统还支持那些面向社群的协作式写作,为协作式写作提供了必要的帮助;最后,Wiki的写作者自然 构成了一个社群,Wiki系统为这个社群提供了简单的交流工具。与其它超文本系统相比,Wiki有使用简便且开放的特点,所以Wiki系统可以帮助我们在 一个社群内共享某个领域的知识。

    wiki的中文翻译有维基、维客、围纪、快纪、共笔等。其中,“维基”一词是中文维基百科人特别为维基百科而创的,属于维基媒体的专用术语。虽然如此,随著“维基”一词使用日广,已逐渐成为wiki最普及的译名之一。而“共笔”这个翻译则反映了多人可以共同创作的特性。

  • 在项目开始之前

    2007-03-26

    分类:开发手记

      “在项目开始之前”这是The Pragmatic Programmer(程序员修炼之道)第七章的标题,读到这章,想想在这之前所经历的一些项目,感受深刻,有一种相见恨晚的感觉。下面是一些在需求过程中的小提示,有了这些提示,在对项目最需求的时候就会小心多了。
  •   成果鉴定时需要一个演示录像片,这个任务交给了我,重来没有做过视频剪辑,今天去遇到了,为了完成这个任务,花了我一天和一个晚上。
    最开始想到的办法是使用Microsoft 的 Movie Maker,下载安装后开始使用,还不错,非常简单,也很容易上手,但是却在我的机器上频繁出现致命错误,不能顺利的完成剪辑。没办法,只有使用Adobe Premiere这个比较专业的工具了。
    好不容易找到一个可以下载的,下载后安装完毕,再打开程序时去出现不能完成编辑的错误,再换台机器,还是这样的错误,最后只有重新找了一台机器,重新安装了WinXP,然后再安装了Adobe Premiere Pro 1.5,这回好了,终于可以用了。
    打开程序,终于看到界面了,虽然以前没有用过,但是凭着以前使用Adobe的其它产品的经验,感觉还是比较容易上手,经过一个晚上的努力,终于搞定了,虽然有点粗燥。
    不过在最后将视频导出的时候还是范了个大的错误,最开始用的是文件里的导出为电影,结果发现需要10多个小时,而且经过几分钟后提示磁盘空间不够,13 分钟的视频,而且还是导出到有35GB的硬盘上的,还不够,后来才发现这种导出的时电影格式,没有经过压缩,于是只有重新来过,再倒出菜单里发现了它自带的编码器,经过几番折腾,终于使用这个编码器把视频导出为RMVB的格式。不管怎么样,在凌晨3点钟的时候,还是把它搞定了。

  • 由于项目需要,要在Linux下虚拟一个Windows,经过查找些资料,发现可一用VMware来实现,当然还有其他一些虚拟机可以使用如Win4lin,bochs等,但经过试用,只有VMware还好用.以下就是安装的步骤.
    首先到https://www.vmware.com/ 下载最新的安装包,比如VMware-workstation-4.0.5-6030.tar.gz,假设放在“/tmp”下.然后使用下面的命令解压后安装.
    1、tar –zxvf VMware-workstation-4.0.5-6030.tar.gz
    2、cd ./vmware-distrib
    3、./vmware-install.pl
    下面按照提示选择就可以了,如果没有特殊要求,直接回车即可.
    4、安装完启动VM,提示符下输入命令:vmware,或者按照提示输入就可以起动,就可以看到VMware的界面了.

    如果是用rpm包安装:
    1、rpm -ivh VMware-workstation-4.0.5-6030.i386.rpm
    Preparing… ########################################### [100%]
    1:VMwareWorkstation ###########################################[100%]
    2、安装完现用下面命令启动:vmware &
    3、提示要配置vmware-install.pl,仔细查看“vmware-install.pl”他的位置,并进入他的文件夹,用命令./vmware-install.pl,进行配置,根据提示做就行。
    4、完成之后就可以用命令:“vmware”启动了。

    起动后就可以添加的你自己的虚拟机了,我这里添加的windows 2000 prwfessnal,把虚拟机的CDROM设置成光驱,就可以从光盘安装操作系统了.
    当然这里有很关键的一步,就是先到VMware的网站申请30天试用的序列号,在打开虚拟机之前要输入注册号,否则没办法Pow on。
    ok,现在你可以施用了.

  • Ajax牛刀小试

    2006-05-01

    分类:开发手记

      今天是五一,劳动人民的节日,但是我这个劳动人民仍然呆在实验室,继续在代码中游荡。
    前些天看了看Ajax,正好,在正在写的程序中用得着,马上拿过来试试,效果还不错。
    uploads/200605/01_145457_ajaxtest1.gif
    要完成的功能如下:在输入了职工的工号后,马上显示出该职工的一些基本信息。如图所示,在文本框“employeeid”输入工号,在层”showresult”处显示职工基本信息。
    在以前的处理中我是将“showresult”处用了一个Iframe来实现,当然也可以实现,但是每次当输完工号后,显示职工基本信息的页面都要加载一次,很是麻烦,正好Ajax可以解决此类问题,就用上了。下面就是具体的代码:

    输入页面的Ajax代码:

    < script language=”javascript”>
    //ajax start
    var xmlHttp;
    function createXMLHttpRequest() {
    xmlHttp = false;
    if(window.XMLHttpRequest) { //Mozilla
    xmlHttp = new XMLHttpRequest();
    if (xmlHttp.overrideMimeType) {
    xmlHttp.overrideMimeType(”text/xml”);
    }
    }
    else if (window.ActiveXObject) { // IE
    try {
    xmlHttp = new ActiveXObject(”Msxml2.XMLHTTP”);
    } catch (e) {
    try {
    xmlHttp = new ActiveXObject(”Microsoft.XMLHTTP”);
    } catch (e) {}
    }
    }
    if (!xmlHttp) { // 异常
    window.alert(”不能创建XMLHttpRequest 对象实例.”);
    return false;
    }

    }
    function processRequest() {
    if (xmlHttp.readyState == 4) {
    if (xmlHttp.status == 200) {
    document.getElementById(”showresult”).innerHTML = xmlHttp.responseText;
    } else {
    alert(”您所请求的页面有异常。”);
    }
    }
    }

    function startRequest(strurl){
    createXMLHttpRequest();
    xmlHttp.onreadystatechange = processRequest;
    xmlHttp.open(”Get”, strurl, true);
    xmlHttp.send(null);
    }
    function showemployeeinfo() {
    var employeeid=document.form1.employeeid.value;
    var temstr=”showmsg.asp?employeeid=” + employeeid;
    document.getElementById(”showresult”).parentNode.style.display = “”;
    document.getElementById(”showresult”).innerHTML = “正在读取数据…”
    startRequest(temstr);
    }

    数据录入部分的HTML代码:

    < form id=”form1″ name=”form1″ method=”post” action=”">
    工号:< input name=”employeeid” type=”text” id=”employeeid” size=”6″ maxlength=”8″ onblur=”javascript:showemployeeinfo();” />
    姓名:< input name=”employeename” type=”text” id=”employeename” size=”8″ maxlength=”8″ onblur=”javascript:showemployeeinfo();” />
    < input type=”submit” name=”Submit” value=”提交” />
    < /form>

    < div id=”showresult”>< /div>

    数据处理程序showmsg.asp的代码:

    Response.Charset=”gb2312″ ‘避免乱码
    EmployeeID=Request.Querystring(”employeeid”)
    ‘这里省略了数据库查询的代码,将职工信息给strEmployeeInfo,然后输出就可以了
    strEmployeeInfo strEmployeeInfo = “职工信息”
    Response.Write strEmployeeInfo

  •   在很多页面中都可能会用到同样的Ajax初始化代码,因此,可以把这部分公共的代码写到一个js文件中, 在某个页面需要调用时,直接调用这个文件就可以了,就不要在每个页面中都加入一段Ajax的初始化代码。这段公用代码如下:

    var xmlHttp;
    function createXMLHttpRequest() {
    xmlHttp = false;
    if(window.XMLHttpRequest) { //Mozilla
    xmlHttp = new XMLHttpRequest();
    if (xmlHttp.overrideMimeType) {
    xmlHttp.overrideMimeType(”text/xml”);
    }
    }
    else if (window.ActiveXObject) { // IE
    try {
    xmlHttp = new ActiveXObject(”Msxml2.XMLHTTP”);
    } catch (e) {
    try {
    xmlHttp = new ActiveXObject(”Microsoft.XMLHTTP”);
    } catch (e) {}
    }
    }
    if (!xmlHttp) { // 异常
    window.alert(”不能创建XMLHttpRequest对象实例.”);
    return false;
    }

    }
    function processRequest() {
    if (xmlHttp.readyState == 4) {
    if (xmlHttp.status == 200) {
    document.getElementById(”showresult”).innerHTML = xmlHttp.responseText;
    } else {
    alert(”您所请求的页面有异常。”);
    }
    }
    }

    function startRequest(strurl){
    createXMLHttpRequest();
    xmlHttp.onreadystatechange = processRequest;
    xmlHttp.open(”Get”, strurl, true);
    xmlHttp.send(null);
    }

    可以将这段代码存为ajaxcommon.js文件,在页
    中需要使用时在标签中引入就可以了,代码如下:

    < language=”JavaScript” type=”text/javascript” src=”http://mryang.blogspot.com/js/ajaxcommon.js”>< /script>

    在使用的页面中用下面的方法来调用:

    function resultshow() {
    var temstr=”showmsg.asp”;
    document.getElementById(”showresult”).parentNode.style.display = “”;
    document.getElementById(”showresult”).innerHTML = “正在读取数据…”;
    startRequest(temstr);
    }

  • 近日在读《程序员修炼之道》一书时,读到这样的故事,很有些意思,故事大概如下:

    三个士兵从战场返回家乡,在路上饿了。他们看见前面有村庄,就来了精神——他们相信村民会给他们一顿饭吃。但当他们到了哪里,去发现门紧锁,窗户也关着。经历了多年战乱,村民们粮食匮乏,并把他们仅有的一点粮食藏了起来。

    士兵们并未气妥,他们开始煮一锅水,小心地把三块石头放进去,吃惊的村民们走出来看望着他们。

    “这是石头汤。”士兵们解释说。“就放石头吗?”村民们问。“一点没错——但有人说加一些胡萝卜味道更好……”一个村民跑开了,又很快带着他储藏的一篮胡萝卜跑回来。
    几分钟之后,村民们又问:“就是这些了吗?”

    “哦,”士兵说:“几个土豆会让汤更实在。”又一个村民跑开了。

    接下来的一小时,士兵们列举了更多让汤更加鲜美的配料:牛肉、韭菜、盐,还有香菜。每次都回又一个不同的村民跑回去搜寻自己的私人储藏品。

    最后他们煮出了一大锅热气腾腾的汤。士兵们拿掉石头,和所有村民一起享用了一顿美餐,这是几个月以来他们所有人第一次吃饱饭。

    看完后,又在Google搜了一下,发现这个故事还有其他的版本,比如有的说是一个乞丐到了一个地主家使用了该方法,有的有说是一群小孩中的一个小孩使用了该方法,不管什么样的版本,故事的大概都查不都,不过我更喜欢这本书上的版本,因为在里面一直都有一种相互合作的氛围,实际上团队软件开发也是这样,团队中需要有个催化剂来提高队员的协作能力,而上面的士兵就充当了这个催化剂,只要团队协作效果好,最后每个人都是赢家。

    当然,每个故事在不同的情形下都有自己不同的寓意,对于读到这则故事的你,得到些收获了吗?

    最后在附上该故事的英文版:
    The Story of Stone Soup

    Once upon a time, somewhere in post-war Eastern Europe, there was a great famine in which people jealously hoarded whatever food they could find, hiding it even from their friends and neighbors. One day a wandering soldier came into a village and began asking questions as if he planned to stay for the night.

    “There’s not a bite to eat in the whole province,” he was told. “Better keep moving on.”

    “Oh, I have everything I need,” he said. “In fact, I was thinking of making some stone soup to share with all of you.” He pulled an iron cauldron from his wagon, filled it with water, and built a fire under it. Then, with great ceremony, he drew an ordinary-looking stone from a velvet bag and dropped it into the water.

    By now, hearing the rumor of food, most of the villagers had come to the square or watched from their windows. As the soldier sniffed the “broth” and licked his lips in anticipation, hunger began to overcome their skepticism.

    “Ahh,” the soldier said to himself rather loudly, “I do like a tasty stone soup. Of course, stone soup with cabbage — that’s hard to beat.”

    Soon a villager approached hesitantly, holding a cabbage he’d retrieved from its hiding place, and added it to the pot. “Capital!” cried the soldier. “You know, I once had stone soup with cabbage and a bit of salt beef as well, and it was fit for a king.”

    The village butcher managed to find some salt beef . . . and so it went, through potatoes, onions, carrots, mushrooms, and so on, until there was indeed a delicious meal for all. The villagers offered the soldier a great deal of money for the magic stone, but he refused to sell and traveled on the next day. The moral is that by working together, with everyone contributing what they can, a greater good is achieved.

  • XMLHttpRequest对象简介
    XMLHttpRequest对象在我看来是AJax的核心, XMLHttpRequest 是XMLHTTP 组件的对象,通过这个对象,AJAX 可以像桌面应用程序一样只同服务器进行数据层面的交换,而不用每次都刷新界面,也不用每次将数据处理的工作都交给服务器来做;这样既减轻了服务器负担又加 快了响应速度、缩短了用户等待的时间。

    IE5.0 开始,开发人员可以在Web 页面内部使用XMLHTTP ActiveX 组件扩展自身的功能,不用从当前的Web 页面导航就可以直接传输数据到服务器或者从服务器接收数据。,Mozilla1.0 以及NetScape7 则是创建继承XML 的代理类XMLHttpRequest;对于大多数情况,XMLHttpRequest 对象和XMLHTTP 组件很相似,方法和属性类似,只是部分属性不同。

    XMLHttpRequest对象的方法:

    XMLHttpRequest对象的属性:

    AJAX开发步骤(框架)
    AJAX 实质上也是遵循Request/Server 模式,所以这个框架基本的流程也是:对象初始化->发送请求->服务器接收->服务器返回->客户端接收->修改客户端页面内容。只不过这个过程是异步的。

    A、初始化对象并发出XMLHttpRequest 请求
    为了让Javascript 可以向服务器发送HTTP 请求,必须使用XMLHttpRequest 对象。使用之前,要先将XMLHttpRequest 对象实例化。之前说过,各个浏览器对这个实例化过程实现不同。IE 以ActiveX 控件的形式提供,而Mozilla 等浏览器则直接以XMLHttpRequest 类的形式提供。为了让编写的程序能够跨浏览器运行,要这样写:

    if (window.XMLHttpRequest) { // Mozilla, Safari, …
    http_request = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE
    http_request = new ActiveXObject(”Microsoft.XMLHTTP”);
    }

    有些版本的Mozilla 浏览器处理服务器返回的未包含XML mime-type 头部信息的内容时会出错。因此,要确保返回的内容包含text/xml 信息。

    http_request = new XMLHttpRequest();
    http_request.overrideMimeType(’text/xml’);


    B、指定响应处理函数

    接下来要指定当服务器返回信息时客户端的处理方式。只要将相应的处理函数名称赋给XMLHttpRequest 对象的onreadystatechange 属性就可以了。比如:

    http_request.onreadystatechange = processRequest;

    需要指出的时,这个函数名称不加括号,不指定参数。也可以用Javascript 即时定义函数的方式定义响应函数。比如:

    http_request.onreadystatechange = function() {};

    C、发出HTTP 请求
    指定响应处理函数之后, 就可以向服务器发出HTTP 请求了。这一步调用XMLHttpRequest 对象的open 和send 方法。

    http_request.open(’GET’, ‘http://www.example.org/some.file’, true);
    http_request.send(null);

    open 的第一个参数是HTTP 请求的方法,为Get、Post 或者Head。
    open 的第二个参数是目标URL。基于安全考虑,这个URL 只能是同网域的,否则会提示“没有权限”的错误。这个URL 可以是任何的URL,包括需要服务器解释执行的页面,不仅仅是静态页面。目标URL 处理请求XMLHttpRequest 请求则跟处理普通的HTTP 请求一样,比如JSP 可以用request.getParameter(“”)或者request.getAttribute(“”)来取得URL 参数值。
    open 的第三个参数只是指定在等待服务器返回信息的时间内是否继续执行下面的代码。如果为True,则不会继续执行,直到服务器返回信息。默认为True。
    按照顺序,open 调用完毕之后要调用send 方法。send 的参数如果是以Post 方式发出的话,可以是任何想传给服务器的内容。不过,跟form 一样,如果要传文件或者Post 内容给服务器,必须先调用setRequestHeader 方法,修改MIME 类别。如下:

    http_request.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);

    D、处理服务器返回的信息
    在第二步我们已经指定了响应处理函数,这一步,来看看这个响应处理函数都应该做什么。
    首先,它要检查XMLHttpRequest 对象的readyState 值,判断请求目前的状态。参照前文的属性表可以知道,readyState 值为4 的时候,代表服务器已经传回所有的信息,可以开始处理信息并更新页面内容了。如下:

    if (http_request.readyState == 4) {
    // 信息已经返回,可以开始处理
    } else {
    // 信息还没有返回,等待
    }

    服务器返回信息后,还需要判断返回的HTTP状态码,确定返回的页面没有错误。所有的状态码都可以在W3C的官方网站上查到。其中,200 代表页面正常。

    if (http_request.status == 200) {
    // 页面正常,可以开始处理信息
    } else {
    // 页面有问题
    }

    XMLHttpRequest 对成功返回的信息有两种处理方式:
    responseText:将传回的信息当字符串使用;
    responseXML:将传回的信息当XML 文档使用,可以用DOM 处理。
    E、一个初步的开发框架
    总结上面的步骤,我们整理出一个初步的可用的开发框架,供以后调用;这里,将服务器返回的信息用window.alert 以字符串的形式显示出来:

    < script language=”javascript”>
    var http_request = false;
    function send_request(url) {//初始化、指定处理函数、发送请求的函数
    http_request = false;
    //开始初始化XMLHttpRequest 对象
    if(window.XMLHttpRequest) { //Mozilla 浏览器
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {//设置MiME 类别
    http_request.overrideMimeType(”text/xml”);
    }
    }
    else if (window.ActiveXObject) { // IE 浏览器
    try {
    http_request = new ActiveXObject(”Msxml2.XMLHTTP”);
    } catch (e) {
    try {
    http_request = new ActiveXObject(”Microsoft.XMLHTTP”);
    } catch (e) {}
    }
    }
    if (!http_request) { // 异常,创建对象实例失败
    window.alert(”不能创建XMLHttpRequest 对象实例.”);
    return false;
    }
    http_request.onreadystatechange = processRequest;
    // 确定发送请求的方式和URL 以及是否同步执行下段代码
    http_request.open(”GET”, url, true);
    http_request.send(null);
    }
    // 处理返回信息的函数
    function processRequest() {
    if (http_request.readyState == 4) { // 判断对象状态
    if (http_request.status == 200) { // 信息已经成功返回,开始处理信息
    alert(http_request.responseText);
    } else { //页面不正常
    alert(”您所请求的页面有异常。”);
    }
    }
    }
    < /script>