“独立博客”为什么独立?

03月 23rd, 2008

    春天到了,西安的独立博客忽然间多了起来。西安灰暗的互联网界俨然多了一抹亮色。

    独立博客这个提法也不知道始出何处。但是根据目前大家的理解,好像特别强调域名独立这个特点,就是说,从技术上讲,一个独立博客就是一个有独立域名的网站。

    促使独立博客产生的最初原因,从根本上讲,就是目前各大网站开的博客系统服务太差,一旦上了贼船,就很难逃离:已经发布的文章不能备份,即使备份了也不能导入别的类型的数据库中;博客系统提供的模板太单调,不能体现博客的个性需求;还有好多发言限制,不能随便发表言论等等。

    独立博客让人仿佛看到了希望。有人充满希望的扬言:“我的地盘我做主!”

    我个人理解的独立博客,应该更多的是一种个人精神上的自由和独立。域名独立、网站界面个性化都是表象的东西,是精神独立的外在体现。从这个意义上考虑,只要博客写的具有个性内容、体现个人的精神追求,那么是不是有独立域名、页面是不是好看,意义就不大了。

    但是,独立博客却不能理解为从此可以想写什么就写什么了。博客不是自己的私密日记,博客既然挂在了互联网上,就是信息载体,就成为社会化的东西,就要遵守相应的约束,最少不能触法律这条底线。触犯道德黄线虽然网警不会找你,但是这也许就失去了写博客的意义,反而糟践了博主的个人形象。

    独立博客到底是什么,可能现在还下不了一个定义。也许可以成为一个个人的新闻中心,个人的新鲜事可以在这里发布。也许可以成为一种媒体,一些公共的信息也可以在这里透漏。总之一切都是围绕博主个人来加工和组织信息。

    希望西安的个人博客越来越多,希望借助独立博客这个载体,生发出一些别的有商业意义和价值的活动。互联网需要不断地创新和刺激,才能持续的发展。

    张庆(网眼)
    网眼视点:http://blog.why100000.com
    2008-3-23

PHP 和 MySQL 的字符集编码问题(1)

03月 22nd, 2008

    几乎每个刚开始用 PHP 和 mySQL 开发 Web 应用的人,都受到过编码问题的困扰。要么页面原始汉字和从数据库里取出的汉字全是乱码;要么原始汉字和数据库汉字,一个显示正常了,另一个就变成乱码了。很烦很气人!

    问题需要一步一步的解决。在实际操作以下方法之前,需要配置 Web 服务器,使其与 PHP 集成,最终可以调试 PHP 程序。我们以常见的 GB2312 和 UTF-8 字符集为例来测试和说明。浏览器是 IE7.0。

    一,页面原始汉字乱码的解决

    编码的原理我就不说了,网上搜索一下字符串“PHP 乱码”,整框整框的文章供大家阅读。我最关心的是具体怎么做,就可以解决这个实际问题。我最喜欢使用的文本编辑器是 UltraEdit,不仅仅因为它可以进行 16 进制编辑,还因为它支持多编码文档。解决这个问题就需要使用 UltraEdit 的这个功能。

    1.1 打开中文 Windows,用 UltraEdit 创建一个文本文件,手工输入一个 PHP 页面文件,文件内容如下。保存为 test1.php 文件,注意保存时“格式”下拉框选择“默认”- 特别注意这里。

    <Html>
    <head>
      <title>页面标题</title>
      <META http-equiv=Content-Type content="text/html; charset=gb2312">
    </head>
    <Body>
    电脑学习网:<br>
    http://www.why100000.com
    </body>
    </html>

    用 IE 浏览器打开网站的这一页面。可以看到,页面显示正常。在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),字符编码是 GB2312。

    [Firefox 2.0 下显示正常。]

    1.2 然后,在 UltraEdit 的“文件”菜单下,选“另存为”,格式选择“UTF-8”,文件名为 test2.php。用 IE 浏览器打开这一页面。可以看到,页面显示正常(其实英文字体已经有略微的变化了)。在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),字符编码是 UTF-8,自动变了!注意 <META http-equiv=Content-Type content="text/html; charset=gb2312"> 一句并没有修改,但是浏览器却自动辨别出了真实的字符集编码!看来 IE 还是比较聪明的,也说明 IE 自动判别字符集是比 METE 标签中 charset=xxx 的定义优先的。

    [Firefox 2.0 下显示出现乱码。]

    1.3 在该页面首部加语句

    <?php
      header("Content-Type:text/html;charset=utf-8");
    ?>

    再次保存该页面文件,“格式”下拉框选择“默认”,文件名为 test3.php。用 IE 打开网站里的该文件,这次看到,除过英文字母,汉字变成乱码了!同时在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),字符编码是 UTF-8,已经被强制改变了。

    出现汉字乱码的原因,是因为原本的 GB2312 编码,被强制以 UTF-8 的编码形式显示,所以乱码出现了。这个时候在浏览器里人为指定 GB2312 编码,页面汉字又显示正常了(真正制作页面时是不能这么做的,非要让浏览者自己选择编码,一个是浏览者可能根本不知道怎么选择编码、选什么编码,再者也显得我们太菜了!)。

    [Firefox 2.0 下显示出现乱码。]

    1.4 在该页面首部加语句

    <?php
      header("Content-Type:text/html;charset=GB2312");
    ?>

    再次保存该页面文件,“格式”下拉框选择“UTF-8”,文件名为 test4.php。用 IE 打开网站里的该文件,奇怪:看到页面汉字显示正常,并不是预想到的乱码?!在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),字符编码仍然是 UTF-8,并没有被强制改变了 GB2312 字符集。

    这个时候在浏览器里人为指定 GB2312 编码,发现 IE 浏览器并不能人为指定编码。看来 IE 浏览器对 UTF-8 字符集特别关照。无论是在 META 标签指定,还是 PHP 语句指定,都不能让 IE 浏览器显示出汉字乱码。

    [Firefox 2.0 下显示出现乱码。]

    小结一下: 以上测试主要在 IE7.0 下进行,Web 服务器为 Windows Server 2003 下的 IIS6.0,PHP 版本为 4.4.7。可以看到,IE7.0 为了正确识别字符集做了很多额外的自动处理的工作,以显示其智能和友好。有时太殷勤了反而使我们不知所措。由于汉字乱码问题与不同的浏览器及其不同的版本、Web 服务器、后台脚本和不同的字符集都有点关系,所以问题显得特别复杂。作为 Web 编程人员,主要关心与自己有关的因素就可以了,没必要成为字符集编码方面的专家。为了兼容目前流行的 IE 和 FF 浏览器,我们可以按照以下简单的方法处理我们的 PHP 代码:
    1,页面的真正字符集与 META 标签指定的应该一致;
    2,也可以使用 header("Content-Type:text/html;charset=xxx"); 语句指定字符集,但是不能与字符的真正字符集冲突,也不能与 META 标签冲突。(尽管根据测试结果表明,当 header() 和 META 冲突时,header() 比 META 指定的字符集更优先,因为根据 HttpWatch Basic 跟踪显示,header() 指定字符集后,IE 浏览器 Type 会明确的得到字符集指定。但是不能保证其它非主流浏览器也会这样。)
    3,不能与数据库取回的字符的字符集冲突,否则页面会出现页面本身的汉字和数据库取回的汉字,全部乱码或部分乱码问题。

    二,数据库乱码的解决及其与页面字符集的配合

    mySQL 5.0 在安装完毕后,可以进入配置向导,对一些参数进行设置。其中就有配置服务器默认字符集选项。这里需要选择定制配置,指定一种我们常用的字符集,可以选择支持多字节编码的 UTF8 或 GB2312。因为据说其默认的 Latin1 字符集不支持汉字,因为不支持多字节编码。
    ……

张庆(网眼)  QQ:9365822
网眼视界:http://blog.why100000.com
2008-3-22

互联网的本质:也论 Web2.0 和 Web1.0

03月 13th, 2008

    Web2.0 闹闹嚷嚷的发展到今天,有人说 Web2.0 的网站已经全面覆灭了,因为没有“盈利模式”。有人说,Web2.0 的应用和发展才刚刚开始。
    但是要问到底什么是“Web2.0”,却没有几个人能说的明白。搞明白这个问题十分紧迫,因为 Web 2.0 的观念已经传播的如此广泛, 以至于很多公司正在将这个词加到他们的行销炒作中,但却没有真正理解其含义。同时理清这个问题也很困难,因为许多号称 Web2.0 的创业公司也许并不是 Web 2.0,而一些我们认为是 Web 2.0 的应用程序甚至不是真正适当的网络程序!

    在网上搜索了一下,有一片文章谈了 Web 2.0 的一些主要特性(http://www.enet.com.cn/article/2005/1122/A20051122474593.shtml):

    1. 互联网作为平台
    2. 利用集体智慧
    3. 数据是核心
    4. 软件发布周期的终结
    5. 轻量型编程模型
    6. 软件超越单一设备
    7. 丰富的用户体验

    文章进一步具体总结到:

    - 服务,而不是打包的软件,具有高成本效益的可伸缩性。
    - 控制独特的、难以再造的数据源,并且用户越多内容越丰富。
    - 把用户作为共同开发者来信任。
    - 利用集体智慧。
    - 通过客户的自服务来发挥长尾的力量。
    - 软件超越单一设备。
    - 轻量型用户界面、开发模式、和商业模式。

    这些一看就是翻译过来的“舶来品”,其大概意思就是说,Web2.0 首先是互联网平台上的一个概念,强调的是服务、参与、交互。为此,互联网软件的代表性特征就是它应该被作为服务来交付(SaaS) - 这将导致这类公司的商业模式上必须有根本性的变化。运营必须成为一种核心竞争力,用户必须被作为共同开发者来对待。

    针对互联网的具体应用,还列举了 P2P 应用、维基、博客、搜索引擎优化、网络服务、标签、聚合等等新兴的应用。可以看到,过去的个人网站、内容发布、目录、粘性已经被新的概念所代替。过去的内容制作(收集)、编辑、管理,已经成为所有参与者的一项共同任务,大家建设、大家管理、大家共享。过去的内容分类是人为的、强制的,现在可以根据标签(Tag)的出现频度对内容的重要性进行排序,包含高频度标签的内容,被人为是重要的内容。这就比强制分类更科学和符合人性。博客代替了个人网站,使人更关注于内容的叙述,而不是被“网站”这个笼统的概念所压迫 - 站长留给那些该当的人当去吧。互联网从诞生之初,就承载了自由和共享的精神,但是 Web2.0 的理念使这种精神离我们更近一些、更清晰一些。

    实际上,Web1.0 时代,人们就一直在强调共享、交互,论坛就是其典型代表。直到 Web2.0 出现了博客等应用,才凸显了个人在网络生活中的能动性和重要性,强调张扬个性色彩。但是 Web1.0 和 2.0 并不是水火不容的两回事,发展总是连续的。比如现在的博客和论坛实际是并存的,并且假以技术手段,它们可以相互切换。看来主要还是形式的变化,不变的还是内容。瓶子包装变了,酒还是老坛子的酒。

    从 Web1.0 到 2.0,互联网精神没有变,变化的是内容的组织和表现形式。Web1.0 和 2.0 的技术也没有多大变化,没听说过哪门语言是专门用来写 Web2.0 的应用的。Ajax 技术普遍认为应该跻身于 Web2.0 的概念下,但是 Ajax 本身却并不是专门为 Web2.0 而生的,Ajax 是一个由 javascript、XML、CSS 等融合的技术,其组成部分在 Web1.0 时代已经在扮演重要角色。况且 Ajax 技术完全可以应用在 Web2.0 之前的程序中。不能说应用了 Ajax 技术的应用就是 Web2.0 的应用。

    Web2.0 对互联网经营者来说,则更多的是一个商业的、营销的,带着某种广告意味的概念。商业活动不时的需要一些新概念来刺激、来炒作,互联网需要不停的闹腾,发出些声音,吸引消费着的眼球和耳朵。毕竟互联网是“知识经济”,玩知识经济的人想必都是些有知识的文化人,让文人学那些艺人去搞些类似“艳照门”的勾当,毕竟有失斯文,欠点人文内涵,于是就按照 IT 业的惯例,版本升级,推陈出新。

    Web2.0 对参与互联网基础建设的网络工程师、程序员来说,两者的区别就更小。对于需求分析、程序设计人员来说,有必要容纳 Web2.0 的思想。但从编码的角度来讲,可以说完全是一回事。没见听说哪个程序员是 Web1.0 程序员,或者是 Web2.0 程序员。我听说有公司招聘程序员,其中一个要求是“有 Web2.0 的开发经验”。不知道所谓“Web2.0 的开发经验”具体是什么经验,难道写一个博客系统和一个 CMS 系统有什么本质的区别吗?我个人认为,招聘者本身就是个外行,不懂 Web 1.0 和 2.0,仅仅是人云亦云而已。即使对于需求分析人员,分析 Web1.0 和 2.0 的用户需求有本质区别吗?

    互联网的本质还是一个工具,为人服务是它诞生、存在和发展的唯一理由。只要能更贴近人性,为人提供更多、更贴心、更方便的服务,我们为什么非要强调是 1.0 还是 2.0?
   
    张庆(网眼)  网眼视界:http://blog.why100000.com
    2008-3-13

白话 Ajax 及其入门基础(2)

03月 8th, 2008

    四、常见Ajax编程框架
    既然上述Ajax框架已经能工作了,为什么还有那么多的框架呢?
    随着页面的复杂,可能需要书写大量的Javascript脚本来对页面中的DOM对象进行控制,工作量和复杂度会大大增加。Ajax编程框架通常利用面向对象的方法,对一些基本的对象和行为及其复杂性进行了合理的封装,建造了一套有自己特色的类库,并且考虑了效率和可扩充性等优点。我们在开发时,可以使用较少的、更清晰的代码,完成自己的工作。也使程序员有更多的时间和精力考虑业务逻辑本身,而不是与一堆脚本纠缠在一起。
    框架都是与后台脚本相关的。通过后台脚本编程,我们可以不必书写大量的Javascript脚本就能构建浏览器兼容的Ajax应用。
    比如,我使用一个比较流行的PHP xAjax框架,对前边的示例程序进行了改写:
    <?php
      require_once ("../xajax/xajax.inc.php");

      //服务器处理函数
      function processForm($aFormValues)
      {
       $objResponse = new xajaxResponse();
       $bError = false;

       //清空错误信息
       $objResponse->addClear("usernameInfo", "innerHTML");

       //判断账号
       if (trim($aFormValues['username']) == "")
       {
        $objResponse->addAppend("usernameInfo", "innerHTML", "Please Input user name.");
        $bError = true;
       }
       else
       {
          if(trim($aFormValues['username'])=="Thomas")
           $objResponse->addAppend("usernameInfo", "innerHTML", "Has been registed");
          else
           $objResponse->addAppend("usernameInfo", "innerHTML", "Has not been registed");
        $bError = false;
       }

       if (!$bError)
       {
        $sForm .="<div>账号:" .$aFormValues['username']. "</div>\n";
       }
       else
       {
        $objResponse->addAssign("submitButton", "value", "Submit");
        $objResponse->addAssign("submitButton", "disabled", false);
       }

       return $objResponse;
      }

      //构造对象
      $xajax = new xajax();

      //注册处理函数
      $xajax->registerFunction("processForm");

      //接管HTTP请求
      $xajax->processRequests();
    ?>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
      <?php
       //生成必要的JavaScript
       $xajax->printJavascript('../xajax/');
      ?>

      <title>XAJAX 用户注册</title>
      <style type="text/css">
        #formWrapper{ color: #111111; background-color: rgb(200,200,200); width: 360px;}
        #title{color: #FFFFFF; text-align: center; background-color: #000000; }
        #formDiv{ padding: 20px;}
        .submitDiv{ margin-top: 10px; text-align: center; }
        .errorSpan{ color:red;}
      </style>

      <script type="text/javascript">
      <!--//提交表单
        function submitSignup()
        {
         xajax.$('submitButton').disabled=true;
         xajax.$('submitButton').value="验证中...";
         xajax_processForm(xajax.getFormValues("signupForm"));
         return false;
        }
      //-->
      </script>

    </head>

    <body>

      <form id="signupForm" action="javascript:void(null);" onsubmit="submitSignup();">
      用户名:<input type="text" name="username" value=""> 
      <input type="button" name="check" value="Check Only one" onClick="submitSignup();">
      <input type="submit" id="submitButton" name="submit" value="Submit">
      </form>

      <div id="usernameInfo" class="errorSpan"> </div>

    </body>
    </html>

    大家看到了这段代码前边的包含语句了吧:require_once ("../xajax/xajax.inc.php")。xajax.inc.php就是定义xajax等相关类库的文件,这个文件里还包含了大量的javascript脚本文件和其他的常数定义等。Xajax类有一条自己的属性和方法,接管和封装了原始的Ajax的行为和方法,用于处理用户的事件和页面文档对象的属性和外观。
    Ajax框架有它自己的好处,但是,目前由于Ajax框架太多,各有各的优点和缺点,特别是对PHP语言,我们很难在众多的框架中选中一个最适合我们自己的项目的框架。框架太多加大了交流的成本。框架本身在降低了代码复杂度的同时,也带来了学习的成本。不像.NET,背靠财大气粗的公司,就一套程序库,一套通用的IDE,熟练一门语言(比如C#),就可以开发Web和桌面应用。
    最后还要注意一下,Ajax并不是万金油,任何项目都想用一下。Ajax目前大多数应用在数据校验等应用上,在项目中用的时候请慎重考虑。

    张庆(网眼)http://blog.why100000.com
    2008-3-8

白话 Ajax 及其入门基础(1)

03月 8th, 2008

    一、白话Ajax的原理
    这个其实要从C/S和B/S的原理说起。Windows操作系统的诞生,为单机通信提供了很大的支持,程序设计也从DOS早期的单任务单用户向网络的分布式应用过度。C/S提供的客户/服务器编程模式为网络应用提供了一个有效的通信手段。浏览器与Web服务器之间的请求/ 服务,就是一个典型的C/S应用。
    有人说,怎么是C/S?这应该是B/S呀!其实是这样理解的:浏览器/Web服务器作为我们实现网页发布的一个平台,对于我们在这个平台上开发的应用,我们的应用是由浏览器从Web服务器上下载下来然后展示在浏览器的“容器”里的,我们的应用是B/S模式的。但是浏览器与Web服务器的通信,却是C/S模式的。可以说,B/S模式是建立在C/S模式之上的。
    Windows早期的桌面应用程序(包括单机程序和C/S结构的网络应用程序),其界面是调用Windows的API来实现的,后来,出现了VB、Delph(VCL)、VC++(MFC)等应用程序框架,把繁杂的API包装起来,使Windows程序开发大大降低、效率大大提高。
    进入B/S编程阶段后,我们只需要面向Web服务器和浏览器编程,不需要考虑网络通信和并发等复杂的问题。但是在浏览器和Web服务器之间,为了进行数据交互,浏览器经常频繁的向Web服务器提交一些信息,现在的网络环境又极差,使我们经常等待于浏览器与Web服务器的通信状态,用户体验很差。而传统的桌面程序没有这个缺陷。
    怎样既能利用B/S程序极强的界面表现力,又能避免其提交后的那一段眩晕的“真空”状态呢?
    其实,在浏览器的设计阶段,设计师已经为我们考虑到了这个问题。这就是我们要说到的Ajax!Ajax英文是Asynchronous JavaScript and XML,就是在浏览器里通过一个机制,实现浏览器端与Web服务器端的一个异步通信,参与这个过程的有javascript、XML等技术。Ajax的引入,使B/S信息传递的量减少了,浏览器界面不再闪烁了,浏览者的感觉好多了。
    Ajax并不是一项新技术,而是几个现有技术的新组合,而且它的发展也得益于几家大的互联网企业的率先应用(大家常拿Google的在线Maps来举例)。连浏览器寡头微软当初都没怎么看得起这项技术,后来才在VS.NET2.0时代玩命的赶呀追。

    二、Ajax的实现
    Ajax是由浏览器通过内部的一个组件实现的,这个组件负责接收用户的请求,以XML作为信息中介,并与Web服务器实现异步通信,并把请求的结果返回给浏览器,再由浏览器呈现给用户界面。“异步”的意思就是组件在后台工作期间,浏览器与用户保持在交互状态,并不更新当前窗口。也不是所有的数据都被组件提交到后台去。
    Ajax实现的基础是:浏览器有一个Ajax引擎;浏览器支持Javascript;Web服务器端也支持XML数据格式。并不是所有浏览器都支持Ajax技术的,但支持Ajax的浏览器越来越多。
    这个组件在Windows下是一个COM组件,由IE浏览器调用。IE浏览器也是在5.0版本以后才提供这个组件的。不同的浏览器实现和创建XMLHttpRequest对象的方式是不太一样的。但作为一个通用的Ajax接口,其外在表现是一致的。
    Ajax其实是一项复杂的技术,牵扯到的东西很多。除过XMLHttpRequest对象和Javascript,还有DOM(文档对象模型),XML等。Javascript是一个粘合剂,它通过XMLHttpRequest对象对浏览器端页面的诸多元素进行操控,实现与Web服务器的后台交互,实现数据验证、存取等功能。

    三、Ajax编程示例

    1,客户端(文件client.htm)
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>AJAX 客户端</title>
    <script language="javascript">
     var xmlhttp = false;
     ////开始初始化XMLHttpRequest对象
      //这段代码考虑到了xmlhttp对象与目前主流浏览器的兼容
      //如果在IE浏览器下测试,一条
      //xmlhttp = new ActiveXObject("Msxml2.XMLHTTP")
      //或xmlhttp = new ActiveXObject("Microsoft.XMLHTTP")语句就可以了
     if(window.XMLHttpRequest)
     {
      //Mozilla 浏览器
      xmlhttp = new XMLHttpRequest();
      if (xmlhttp.overrideMimeType)
      {//设置MiME类别
       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)
       { }
      }
     }

     function send_request(url, data)
     {
      //初始化、指定处理函数、发送请求的函数
      if (!xmlhttp)
      { //异常,创建对象实例失败
       window.alert("不能创建XMLHttpRequest对象实例.");
       return false;
      }

      // 确定发送请求的方式和URL以及是否同步执行下段代码
      xmlhttp.open("POST", url, true);
      xmlhttp.onreadystatechange = processRequest;  //根据Web服务器应答,触发该状态改变事件
       xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
      xmlhttp.send("username=" + data);  //发送信息到后台程序
     }

     ////状态改变事件处理函数:处理返回的信息
     function processRequest()
     {
        if (xmlhttp.readyState == 4)
        { // 判断对象状态
          if (xmlhttp.status == 200)  //正常返回信息,状态编号200
          { // 信息已经成功返回,开始处理信息
            alert(xmlhttp.responseText);
          }
          else
          { //页面不正常
            alert("您所请求的页面有异常。");
          }
        }
     }

     function userCheck()
     {
      var f = document.form1;
      var username = f.username.value;
      if(username=="")
      {
       window.alert("用户名不能为空。");
       f.username.focus();
       return false;
      }
      else
      {
          //该语句由用户按“唯一性检查”按钮后执行
          send_request('server.php', username);
        }
     }
    </script>

    </head>

    <body>
    <body>
      <form name="form1" action="" method="post">
      用户名:<input type="text" name="username" value=""> 
      <input type="button" name="check" value="惟一性检查" onClick="userCheck()">
      <input type="submit" name="submit" value="提交">
      </form>
    </body>
    </html>

    2,Web服务器端(文件server.php)
    <?php
    //取得客户端数据
    $username = $_POST["username"];

    //判断用户名的惟一性
    if( $username=="网眼")  //实际工程中,这里一般是从数据库取用户名的值
    {
     printf("用户名“%s”已经被注册,请更换一个用户名", $username);
    }
    else
    {
      printf("用户名“%s”尚未被使用,您可以继续", $username);
    }
    ?>

    在以上Client.htm代码中,首先建立XMLHttpRequest对象实例,然后很据对象的状态触发事件处理函数,对返回的信息进行处理。一切控制逻辑都是用Javascript脚本来书写的,XMLHttpRequest对象与Web服务器的XML信息交换对我们是隐含的,我们不必关心。

    这是一个最原始的Ajax编程框架,它能简单的处理一些少量数据。经过代码重构,完全可以用在我们自己的小型工程中。

    注意Ajax本身是一种浏览器端技术,它和Web服务器端采用什么脚本书写代码是没有关系的。比如我们把Client.htm的语句send_request('server.php', username)换为send_request('server.asp', username),再相对应的建立server.asp文件,内容为:

    <%
    dim username
    username = request("username")

    if username="Thomas" then
     response.write("用户名" & username & "已经被注册,请更换一个用户名")
    else
     response.write("用户名" & username & "尚未被使用,您可以继续")
    end if
    %>
    做了这样的改变后,在浏览器端,用户看到的效果是一模一样的。

    张庆(网眼)http://blog.why100000.com
    2008-3-8

DOS 批处理实现 arp 绑定

03月 8th, 2008

    为了预防 ARP 病毒的攻击,一般都建议 Windows 用户把本机和网关实现 IP 与物理地址的绑定。Windows 下的绑定命令格式为:

    ARP -s [IP地址] [MAC地址]

    尽管命令很简单,但是对于初级用户仍然是一件困难的事情,特别是还要通过运行 ipconfig.exe 命令获取网关和本机的 MAC 地址就更是一件难事。即使是有经验的网管,敲这些命令,再获取数据,再完成绑定,也是一件单调乏味的事情。为了简化操作、提高效率,有必要发挥程序的作用,写一段代码来完成这项工作。那些 VC++、Delphi、C# 之流的大型编程自然能完成编程任务,但是总给人大动干戈的味道。其实,充分发挥 DOS 批处理的威力,只用写一些“脚本”就可以完成这些事情了。

    只要把以下代码保存成一个扩展名为 .bat 的批处理文件,需要的时候用鼠标双击一下,一切事情就全部搞定了。

    程序的流程如下:

    带参数 /all 运行 ipconfig.exe 程序,运行结果保存到生成的 ipconfig.txt 文本文件里。
    运行 find.exe 程序,在 ipconfig.txt 文件里搜索字符串 "Physical Address"。find.exe 程序的运行结果,保存到生成的文本文件 phyaddr.txt 里。在我的机器上,phyaddr.txt 内容为(实际文件没有行号):

    1,
    2,---------- IPCONFIG.TXT
    3,   Physical Address. . . . . . . . . : 00-00-E2-89-9E-BD
    4,

    语句 for /f "skip=2 tokens=12" %%M in (phyaddr.txt) do set Mac=%%M 是取得本地物理 MAC 地址的语句,结果临时保存在 %Mac% 变量里。“for ...”语句的意思是,phyaddr.txt 文件的内容,跳过前面 2 行,余下的行取第 12 列,每列之间的分隔符为默认的"空格"。注意本行的列包括单词和所有的“.”字母。这样 Mac=00-00-E2-89-9E-BD,就是本机网卡的物理地址了。

    下面取本机 IP 地址的道理也类似。绑定命令是 arp -s %IP% %Mac%。

    再后面获取网关的 MAC 和 IP 地址的方法也与前边类似。注意运行一次 ping %GateIP% -n 1 命令,是为了取得网关 Arp 信息在本机的缓存,确保 arp -a %GateIP% 命令能取得网关的信息,否则只能得到文本:No ARP Entries Found。

    然后生成 GateMac.txt 文件,从中取到网关的 MAC 地址。最终网关也获得了 arp 绑定。

    注意以冒号“:”开头的语句是批处理文件的注释语句。批处理脚本的语句(例如 for 语句)的更多信息,请在网上搜索相关资料。

    从这里可以看到,DOS 命令行程序,包括批处理文件,并不是作为摆设存在的,更没有过时,合理利用,作用还是非常大的。譬如 NET、NETSH、NETASAT 等等命令,在网管工作中都是经常用到的,可以完成几乎所有图形界面程序能完成的工作,但有时更方便一些。

    附:

    @echo off
    :::读取本机Mac地址
    if exist ipconfig.txt del ipconfig.txt
    ipconfig /all >ipconfig.txt
    if exist phyaddr.txt del phyaddr.txt
    find "Physical Address" ipconfig.txt >phyaddr.txt
    for /f "skip=2 tokens=12" %%M in (phyaddr.txt) do set Mac=%%M
    :::读取本机ip地址
    if exist IPAddr.txt del IPaddr.txt
    find "IP Address" ipconfig.txt >IPAddr.txt
    for /f "skip=2 tokens=15" %%I in (IPAddr.txt) do set IP=%%I
    :::绑定本机IP地址和MAC地址
    arp -s %IP% %Mac%
    :::读取网关地址
    if exist GateIP.txt del GateIP.txt
    find "Default Gateway" ipconfig.txt >GateIP.txt
    for /f "skip=2 tokens=13" %%G in (GateIP.txt) do set GateIP=%%G
    ping %GateIP% -n 1
    :::读取网关Mac地址
    if exist GateMac.txt del GateMac.txt
    arp -a %GateIP% >GateMac.txt
    for /f "skip=3 tokens=2" %%H in (GateMac.txt) do set GateMac=%%H
    :::绑定网关Mac和IP
    arp -s %GateIP% %GateMac%

    :::删除临时文件
    del GateIP.txt
    del GateMac.txt
    del IPAddr.txt
    del ipconfig.txt
    del phyaddr.txt

    :::测试绑定结果
    arp -a

    :::exit

    张庆(网眼) 网眼视界:http://blog.why100000.com
    2008-3-8

古都西安自助旅游完全攻略 - 意犹未尽

03月 8th, 2008

    这里,是中华民族的发祥之地。
  这里,有中国人最为自豪和珍贵的记忆。
  这里,浓缩着华夏人民的遗传基因。
  这,就是西安!

  从女娲补天、仓颉造字、到周礼秦治、汉风唐韵,这块土地上无数的远古神话、史书典籍、出土文物和古迹遗址都诉说着她的辉煌和沧桑。

  西安,深植着一个民族古老的根系。
  西安,凝聚着一个国家永恒的荣耀。

  秦中自古帝王都。从三千一百五十年前开始,十三个封建王朝先后定都西安,十三个至高无上的金印玉玺叠映在这块厚重的土地上。这就是与雅典、开罗、罗马并称于世的西安,这是一个海纳百川,含蓄而又博大的西安,这是一个高山仰止,尊贵而又质朴的西安。

  西安川塬相接、八水环绕、物庶民丰、人杰地灵,纵横开阖的山河大地哺育了西安人刚健有为的性格,雄浑厚重的文明沃土蕴藏着中华民族物质和精神的瑰宝。

  走进西安,就像走进了中国历史的博物馆,名胜古迹星罗棋布、稀世文物璨若星辰、翰墨丹青赏心悦目、诗书雅乐神韵悠远。一部城市就像一部鲜活的流动的历史,在这里不妨用心灵和历史对话,让目光和文化拥抱。从灿烂在古城的一张张淳朴、温厚、豪放的笑脸上感受这座城市厚德载物、开放包容、天人和谐的文化传统,去品味这座城市的先民们创造的履痕,智慧的结晶和生命的辉煌。

  西安,这所中国历史文化的首善之都,以世代传承的雍容儒雅,满腹经纶,博学智慧,大气恢弘成为中国历史的底片,中国文化的名片和中国精神的芯片。周秦汉唐呼而一揽,乾坤天地重在千秋。这座古代中国和亚洲政治文化中心的城市的曾经傲立于东方世界之巅,特殊的历史地位和文脉承传赋予了西安在中华民族全面复兴中的责任。漫长的岁月将历史的荣耀深埋在地下,十三个王朝的背影随着声声暮鼓早已远去。

  在21世纪的黎明,在西安的天空中又激荡起复兴的钟声。  

  新世纪的西安正将今日的荣耀带上太空。亚洲最大的航空城和中国的航天城崛起在这方黄天厚土;新型工业化和信息时代的洪流涌动在关中大地;现代装备制造业和高新科技产业两翼齐飞;高等院校人才济济;科研力量列全国前茅;铁路、高速公路、和国内国际航线四通八达;电力、油气能源和城市供水充裕;统一开放、竞争有序的现代市场体系基本形成;城市基础建设不断完善;人居环境诗意盎然。一个集亚洲知识技术创新中心,新亚欧大陆工业桥中国段的工业高地和世界历史文化名城为一身的新西安已经进入现今中国和世界的视野。

  故都遗香,现代气息交融并蓄在西安的胸襟当中,在这里,古老和现代相互和谐;传统和创新相互和谐;发展和保护相互和谐;人和自然,人和人相互和谐。科学的发展观给城市注入新的生机和活力,西安向着历史文化特色的国际化现代化大城市的目标奋起飞跃,担负起西部振兴的责任,复兴古城的荣耀。

  千年历史古都,华夏精神故乡。西安不仅属于历史还属于未来,西安不仅属于中国还属于世界。今天一座最具神韵的人文之都,一座国际化、市场化、人文化、生态化的盛世西安正在从愿景走向现实。西安人正继往开来为荣耀历史,为荣耀今天去创造一个荣耀的未来。

古都西安自助旅游完全攻略 - 美食

03月 8th, 2008

  说起西安的小吃那可不是几页可以写完的,所以我在这里给大家简单介绍,让我们有的放矢。直捣吃巢。

  1.西安首屈一指的小吃应该是羊肉泡馍了,它起源于清代,因为西安城的内的回民比较多,所以牛羊肉的食品也比较多。泡馍制作方法非常讲究,肉、馍、汤、汤料、糖蒜。我个人喜好吃泡馍一定要到小饭馆,比如大皮院的都不错。以前东洋市有家小炒特别好吃。大家可以去试试。西安人很少去老孙家和同盛祥,那里的很贵就想北京人没人去全举德吃烤鸭一样。大部分是招待外地来的朋友才去那里,要想吃到正宗的泡馍还得吃小饭馆的。西华门往西,到大皮院,里面可以随便挑一家都不错。其他的都是散落在城市各地的。如果能碰到就去尝尝,不会错的。

  2.葫芦头泡馍,南稍门风味葫芦头,柏树林的铁蛋葫芦头,土门的第一碗葫芦头,经二路的老李家葫芦头。香啊。

  3.粉汤羊血,也就是大家说的血块。麻辣味的,可爽啦。

  4.水盆羊肉----老白家(北广济街内),这个就是羊肉泡馍的一种变异吃法,比较适合喜欢汤多一点的吃家。

  小炒----老乌家(北院门向西300米路北)。
  杂羔汤----也就是大家吃的杂碎汤。别小看这玩意做好吃了不容易呢。
  烤肉----西安很少吃考羊肉,所以我们都叫考肉。筋,肉,腰子,外腰。考鱼等等,反正能考的我们都考,可以到东新街和鼓楼去吃。
  肉夹馍----腊汁肉夹馍。肥而不腻。秦豫肉夹馍(柏树林南口)樊记,竹笆市内。
  孜然炒肉夹馍----这可是西安独特的,尖椒和孜然加上红辣椒在锅里一爆炒,夹在饼饼里吃别提多香了,西安好多人晚上夜宵就是一个这个再来一玩八宝稀饭。巨好吃。
  水盆大肉----老宋家(柏树林十子西南角)也就是把羊肉换成大肉,满足不同口味。
  蒸碗----(建西街东口向西100米路南)将各种肉制品放上花椒大料等在锅里蒸制,这可是西安人过年时的住打菜呢。
  煎饼----顶顶香煎饼屋(龙首村十子向南50米路西)。
  酱大骨头---骨头庄(吉祥村十子向东100米路北)。
  麻辣粉----牵人(粉巷)。
  火锅----竹园可是正宗的陕西火锅,有鱼头锅,锑华锅等等。绝对区别于其他地方的火锅口味。与众不同哦。有机会一定要去吃!在和平路上和劳动路都有。
  蒜蘸面----绿蚂蚁对面。
  牛肉面----马虎面(西七路)。
  大盘鸡—郭老大。
  西大街桥梓口车站路南小巷里有一家〔卤汁凉粉〕。
  大雁塔正面的路东有一家〔肉夹馍〕和〔丸子汤〕。
  南稍门永宁村里有一家〔烤羊肉〕,现割现秤现穿现卖现烤现吃。
  除例如这些小吃,西安还有好多零食级的食品。果扑,油茶,大红枣,胡辣汤等等。这些都得慢慢去摸索,我也记不清了,大家见凉。
  购物有开元、民生、世纪金花、中大国际、唐城百货等等。买手机到西华门,海星和尚扑路。买书到西安图书大厦或者汉唐书城,一个在解放路,一个在长安路。这是规模比较大的。买车到莲湖路和西部国际车城。买小商品(包括衣服、鞋帽、皮包、茶叶、电器、百货等等到康复路和轻工)游泳到中体,西安体育场等。唱歌到好乐迪,音画时尚、天籁村、阳光丽都。蹦迪到1+1,中国城,夜猫,滚石,823。喝咖啡到德福巷,这里一条街全是咖啡屋,就像北京的三里屯。洗浴到南二环,那里全是高档娱乐场所饭店和洗浴场。

古都西安自助旅游完全攻略 - 关中八景,魂牵梦萦

03月 8th, 2008

    华岳仙掌首一景,
    骊山晚照不明显,
    灞柳风絮扑满面,
    草堂烟雾紧相连。
    雁塔晨钟响城南,
    曲江流饮团团转,
    太白积雪六月天,
    咸阳古渡几千年。 

  这首流传于陕西民间的一首脍炙人口的关中八景佚名诗,出自西安碑林的一块古碑上。
  关中八景流传于周秦汉唐,形成于明清。它的命名,有些是借大自然呈现的奇异景象,有些是文人学士赋传记胜,有些是民间的神话传说。
  华山仙掌:进了潼关,便进入了关中的东大门。“华山仙掌”首先向您鼓掌致意,这是关中八景第一景。
  雁塔晨钟:这里的雁塔,指的是西安市城南荐福寺内的小雁塔。塔旁保存着一口金明昌三年(公元1192年)铸的2万多斤重的大铁钟。过去,每天清晨都要按节律敲击大铁钟,向人们报晓。清脆而宏亮的钟声,远震古城内外。
  骊山晚照:骊山位于临潼县境内,属于秦岭支脉,海拔1256米。昔日松柏满山,一片苍郁,实像一匹纯青的骊马,美如锦绣。每当夕阳西下,骊山在斜阳的映照中涂上一抹红霞,非常美丽动人,人称“骊山晚照”。
  太白积雪:太白山位于眉县城南20公里。南界洋县,东接拂坪,西南与留坝、凤县相连,海拔4000余米,为秦岭的最高峰。太白山山高水冷,因而高处背阳的地方,在三伏天仍可看到白雪,“太白积雪”指的就是这里的风光。
  曲江流饮:曲江池,位于西安市南郊,距城约5公里,它曾经是我国汉、唐时期一处极为富丽优美的园林。
  灞柳风絮:灞河是发源于秦岭蓝谷的一条河,横贯西安东部,向北注入渭河。早在秦汉时,人们就在灞河两岸筑堤植柳,阳春时节,柳絮随风飘舞,好象冬日雪花飞扬。因此,“灞柳风絮”便成为“关中八景”之一。
  草堂烟雾:草堂寺,位于户县境内的主峰山北麓,相传始建于晋代。传说当年每到秋冬早晨,井内冒出一股烟雾,直往帝都长安飘去,因而被称“烟雾井”,形成“草堂烟雾”。
  咸阳古渡:横贯关中的渭河,从古秦都咸阳旁边流过。“咸阳古渡”指的就是咸阳的渭河渡口。

古都西安自助旅游完全攻略 - 线路四:北线

03月 8th, 2008

  1.黄帝陵,中华人文初祖黄帝的陵墓,古柏参天,庄严肃穆,中华儿女皆到此祭奠祖先,你能不来吗?位于黄陵县。

  2.司马迁祠,我国古代大哲学家历史学家司马迁的故乡。位于韩城市。这里有著名的关中民俗住宅大院。还有洽川自然湿地。可以到黄河上坐一次摆渡,抓上几天黏鱼,喝上几口鱼汤,美哉美哉。

  3.延安革命圣地,长征的会合点,新中国开创者门蛰伏了10年的地方,以前这里是穷的掉渣,现在?去看看就知道了,享受民俗风情,感受革命圣地,缅怀先烈遗志。宝塔山黄河延安,go go go。

  4.壶口瀑布,位于陕西宜川县与山西吉县交界处,距离延安220公里。我国落差最大的河流瀑布,气势雄伟,壮观、悲壮。养育中华儿女的黄河从这里奔流直下。1997年的小黑从这里飞过,不过物是人非。许多去过壶口的朋友都推荐由吉县一侧进入,这是因为黄河在这里是自偏西北向下流向偏西南,而吉县位于瀑布东侧,视角大,基本可从正面见到整个瀑布全景。不过,从陕西一侧看瀑布也有特色,正好可看到瀑布由“壶嘴”喷出的奇景。

  5.榆林,一个神秘古老的城市。一个现代充满生机的城市,毛乌苏沙漠,统万城,看惯了翠绿的山山水水,去感受一下沙漠的魅力吧。(主要景点:红石峡,镇北台,李自成行宫,红碱淖风景区。)

  6.三原城隍庙、药王山石刻、耀州窑博物馆。