Category: 编程、软件、技术

  • 关于我的站点的访问

    由于我的站点是建在自己家里的服务器上的,外网IP虽然存在,但是却时刻在“动态分配”。

    每次我一发现我的外网IP被改变,就不得不修改我的DNS,于是就要广播,于是就会出现我的站点暂时无法访问的问题。

    如果碰到这样的情况,那么只好请你暂时离开,稍后再回来访问。根据DNS广播规范,一般6小时内(快的话只要2分钟)全球广播就将完成。

    BTW,我的域名注册在68l.com,它们的域名服务器是ns.xinnetdns.com,所以你也可以直接修改你网络链接的DNS,这样可以在第一时间访问到我的站点。

    如果用OpenDNS的DNS服务器,应该也会很快.

  • IIS 8ffe2740错误的解决

    这个错误的出现主要是由于IIS默认的80端口被占用。解决之道之一当然是修改默认端口,比如改到8080啊什么的。但是这在浏览时毕竟不方便。

    很多别的应用程序都可能占用80端口,在我以前的XP系统上就是SKYPE作祟:

    Skype

    我推荐一个可以扫描端口占用的程序:Fport。虽然是命令行程序,但是可以很完整的查出是哪个程序占用了哪个端口。下载地址在这里

  • XAJAX学习笔记(一)

    前几天玩的是.NET + AJAX,而且还有.NET Ajax Control Toolkit,所以一下子体验了很多D’N’D编程的威力。

    当然,也是有代价的,比如:对AJAX底层的实现就不会太关心;而且对控件的调整也会囿于MS的框架;因此,从某种程度上说,要真正的去体会.NET + AJAX,而特别是后者,必需深入到更底层的框架中去。 当然,我也很讨厌一下子就跳到最底层的,所以在网络上搜索了一下,发现在PHP下还是有一个AJAX框架的,那就是XAJAX。 用XAJAX开发还是相对简单的,不过有一点还是要注意。普通的PHP文件中,<?php?>是可以出现在任意位置的,但是如果使用了XAJAX,那么以下这些代码必需出现在PHP文件的最开始:

    
    require_once(xajax.inc.php);
    
    $xajax=new xajax();
    $xajax->registerFunction(Func01);
    
    function Func01()
    {
        $resp=new xajaxResponse();
        ... ...
        return $resp;
    }
    
    $xajax->processRequests();

    否则在运行时会出现:The response received from the server is not valid.这样的错误。

    一些Demo可以在这里找到。

  • imagettftext的问题解决

    我在我的书评页中,采用的是后台动态生成jpg文件的方法,具体代码不赘述。 在XP下,程序运行正常:

    • 可以从数据库中读出经编码的图形文件;
    • 解码之;
    • 根据解码后的字符串创建JPG文件;
    • 在创建的JPG文件上继续写上版权声明;
    • 然后返回到调用页面,图片及版权文字(也是图片的一部分了)得到显示。

    换到VISTA后,发现图形可以正常显示,但是我要加上去的版权文字并未显示,而更诡异的是在PhpED的调试环境下是可以的,在FF/IE中显示就不可以。

    根本没有头绪如何解决,今天采用了一个比较“死马当成活马医”的方法。 原来的代码:

    imagettftext($im, 9, 0, 5, 10, $color, \’msyh.ttf\’, $copytext1);

    现在我改为:

    imagettftext($im, 9, 0, 5, 10, $color, \’c:windowsfontsmsyh.ttf\’, $copytext1);

    问题解决!

    想来是在Vista下PHP搜索字体资源的方式有了改变。但是在PhpED的调试环境中为什么又可以呢?难道是某些magic settings在起作用?

    不管那么多了。好了就行!

    2008年4月4日补记:后来发现,这个和文件保存的编码有关……

  • 开始学习Smarty

    今天和朋友在GTALK上聊天,谈到了一些PHP学习的方向。我是从半年前开始接触PHP的,虽然有C/C++的基础,但毕竟PHP是个新语种啊。

    下载了一个Smarty,然后安装,慢慢看吧。

    当然,我认为,学习一个新东西的最好方法有两种:

    一个当然是基于这个东西开发; 一个就是翻译文档。

    我准备从后者开始。翻译的文档会在站点中放出。

  • 外网IP变了

    今天起来发现:https://www.rsywx.net 无法访问,查看了外网分配的IP,发现和我当初绑定域名时的IP不同了。连忙让我的域名供应商修改DNS。

    现在好了。

  • BDS2006连接InterBase

    系统重装是正常的;如果原来编译的程序不能运行,也是——不怎么太让我头晕的,因为我可以重新安装IDE,重新编译。

    注意了!Vista下,在BDS2006(已经打了Patch 1)中连接InterBase 7.5时,选择当地连接死活不通过,一定要选择使用远程连接——哪怕你的服务器就是用的localhost。 我估计这是我安装的D版InterBase的问题。但是如果乍一下碰到这个问题,还真会被吓一跳从而抓狂的。

    ibconn.jpg

  • Encarta

    终于下载完了Microsoft Encarta 2006。

    安装完毕,不需要输入什么注册码,进行更新时也只要你有一个Live ID!即可。不过更新完毕它会告诉你有新版本的Encarta,本版本的更新将到此为止……残念。

    我从1999年开始就知道这个软件了。当时没有宽带,只好去买CD回家安装。

    这个软件真的是一个非常好的软件。我很喜欢。一直奇怪为什么国内没有这么一个好的软件呢?因为是全英文界面的,所以输入关键字搜索的时候也必须要用英文,有时就会出现一时想不出对应的英文的问题。

    cia-encarta.png

  • System Volume Information

    现在的病毒真的很厉害……真的,真的很厉害!

    第一是我不知道是什么时候就感染上了的。第二是,感染了也很难杀掉,因为它躲藏在各个盘的System Volume Information_restore{??????????????}下面。

    想了好多方法,最后还是用Ice Sword将病毒请出了系统。真是难为这些病毒程序的开发者了。

  • PHP中调用Soap/WebService

    关于在PHP中如何调用Soap/WebService的描述,网络上有不少帖子。但是主要讲述了如何用PHP开发服务器端、客户端并加以关联,而很少触及在PHP中调用现成的WebService的情况。在本文中我们做一个简单的示范。

    一、寻找WebService来源

    WebService可以自己编写,但是也可以从网络上去寻找现成的。我用的是www.xmethods.net里的US Zip Validator

    它的WSDL文件位置在:http://www.webservicemart.com/uszip.asmx?WSDL

    它的作用是根据输入的ZIP代码,返回该代码对应的美国地名,州名,经纬度等。

    二、创建SoapClient

    第二步就是创建SoapClient,并调用WebService中的方法,并获得返回值。PHP代码如下:

    
    $objSoapClient = new SoapClient(http://www.webservicemart.com/uszip.asmx?WSDL);
    $param=array(ZipCode=>$zip);
    $out=$objSoapClient->ValidateZip($param);
    $data=$out->ValidateZipResult;

    SoapClient的创建有好多方法,我们用的是最标准的(也是最简单的)WSDL方法。由于查询ZIP的方法肯定需要一个参数,所以我们必须创建一个数组,用“参数名=>取值”的方式进行赋值。

    也许读者会对这个数组的创建有一定的兴趣。比如,我们怎么知道“参数名”应该是“ZipCode”而不是别的什么呢?为什么没有更多的参数了,而只有一个?OK,这个问题我们稍后解释。因为这牵涉到WSDL的解读。

    创建好参数后,同样的,我们调用SoapClient的方法ValidateZip,并传递参数进去;对于返回的结果,我们用$data变量取出我们真正感兴趣的东西。同样的,这里也存在方法名称是如何确定的问题。我们也在稍后介绍。

    如果你也使用PhpEd进行PHP的开发和调试,那么从下面的调试窗口截图中,你可以很清除的看到$data和$out之间的关系:

    取出想要的数据

    三、解析数据上面得到的$data中的数据是标准的XML结构的数据。所以在PHP中,我们需要创建一个XML解析器来对这个数据进行分析。代码如下:

    
    $ParsedData=array();
    function startElement($parser, $name, $attribs)
    {
        global $ParsedData;
        echo <<font color=#0000cc>$name</font>;
        if (count($attribs)) {
            foreach ($attribs as $k => $v)
            {
                $ParsedData[$k]=$v;
                echo $k=$v;
            }
        }
        echo >;
    }
    function endElement($parser, $name)
    {
        echo </<font color=#0000cc>$name</font>>;
    }
    $xml_parser= xml_parser_create();
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1);
    xml_set_element_handler($xml_parser, startElement, endElement);
    echo ;
    if (!xml_parse($xml_parser, $data)) {
        die(sprintf(XML error: %s at line %d, xml_error_string(xml_get_error_code($xml_parser)),
             xml_get_current_line_number($xml_parser)));
    }
    echo ;
    xml_parser_free($xml_parser);

    这里的详细操作需要参考PHP函数手册中关于XML函数的那一章。这里不再赘述。一旦数据被解析成功,我们就可以进行进一步的处理。例如下面的代码就遍历该数组,然后输出:

    
    foreach ($ParsedData as $k=>$v)
    {
        echo $k."=>".$v."<br />";
    }

    四、解读WSDL

    上面我们留下了两个疑问:如何知道一个WebService提供的方法,以及它的参数?所有的答案都在WSDL描述中。对于本文使用的WSDL来说,我们从中截取一段来分析。由于我们是通过Soap进行调用,所以我对完整的WSDL进行了节选,只列出关于Soap调用的部分(反相显示的部分):

    00018_02.jpg

    首先我们注意到<wsdl:message name=ValidateZipSoapIn>这一节,它指出了在Soap调用中,入口参数要参照ValidateZip,于是我们接着转到文件上面一点的地方,看ValidateZip方法的定义:

    <s:element name=ValidateZip>
        <s:complexType>
            <s:sequence>
                <s:element minOccurs=0 maxOccurs=1 name=ZipCode type=s:string/>
            </s:sequence>
        </s:complexType>
    </s:element>

    很明显,ValidateZip要求一个参数,名称为ZipCode,类型为string。 同样,我们再看<wsdl:message name=ValidateZipSoapOut>这一节,它指出Soap调用的出口参数是ValidateZipResponse。而后者的传出参数名称是ValidateZipResult。于是,我们就解释了前两节提出的问题:

    • 怎样找到要调用的函数?
    • 怎样知道函数的参数、类型?
    • 怎样得到函数的返回值?

    如果你对这个示例有兴趣,可以点击此处体验在线演示。

    注(2021-04-30):WSDL/SOAP已经死去,现在人们在大多数应用中采用json和RESTful API来进行这样的操作。