2007年10月22日
  当Gtalk用户(假设为A)添加某一位好友(假设为B)时(第一次),B会收到这样一段消息:
<presence from=’A@gmail.com’ type=’subscribe’ to=’B@gmail.com/resource’></presence>
如果B批准了A的订阅请求,会发出消息<presence to=’A@example.net’ type=’subscribed’/>如果B拒绝了A的订阅清酒,会发出消息
<presence to=’A@example.net’ type=’unsubscribed’/>

虽然在用户端可以接收到以上信息,但我猜测在发送订阅和处理订阅信息的同时,Gtalk 服务器端会产生一个相互的订阅信息。

当我(使用Gtalk订阅某一帐户(D)之后,我使用程序登录该帐户,并且设置程序为:当接收到的type为subscribe时,发送subscribed作为应答。按照Jabber协议,此时的情况应该是:D可以看见我的在线信息,而我却看不见D的,因为我没有向D发送订阅请求,D更不会同意了我的请求。但出现的情况却是我们的联系人列表里都出现了对方,也就是双向订阅了。

如果真的不想在自己的联系人列表里看见该用户而只想让其看见你,那么可以在Gtalk中选择删除该用户。这样,你的好友列表中就不会有他的存在,而你的在线状态信息他却可以看到。删除的过程中没有向被删对象发送信息,仅仅改了自己的好友列表。当重新添加该被删好友时,会发送一段请求信息,但这段信息不会到达好友客户端,在好友服务器端就会被批准,因为该好友已经订阅了你,不需要再向好友发送请求了。

以上内容为个人学习过程中的猜测,如有人知道真正的原理,你留言。
2007年10月17日

  实现了信息的自动回复,可以把例如goog、ibm或yhoo等股票的价格作为对话的回复。

  写程序的过程中,当知道如何接收消息和发送消息后,只要再加个对消息的处理就可以了。

  写程序时偷懒,直接调用了以前写的查询股票价格的程序,并将查询结果返回,然后调用sendMessage()函数将结果发送给用户。

  这样就好办了,可以改成任意的交互形式了。比如读取某地天气预报(Google Desktop就有),查看是否有新邮件等等吧。

  仍需解决的问题:

  1.我想,对于机器人这种程序,应该是发现如果有人加它,那就应该自动加对方;删除也应如此。

  2.多线程。否则如果用户查询特别多,或者网络特别慢(更糟糕的是两者皆有),反馈的太慢用户说不定会认为机器人睡着了。

  其他问题要在继续的学习中不断的发现和提出。

2007年09月05日

小U盘传大电影时可以免去用winrar分割文件时的压缩和解压缩过程。

file.py

import sys
from os.path import exists
fileCount = 0

def splitFile(fileName, partSize=1):
    # 1024 * 1024 = 1048576
    length = partSize * 1048576
    f1 = open(fileName, "rb")
    while True:
        content = f1.read(length)
        if content == "":
            break
        newFile = distFile(fileName)
        f2 = open(newFile, "wb")
        f2.write(content)
        f2.close()
    f1.close()
    print ’split file complete!’
   

def distFile(sourceFile):
    global fileCount
    fileCount = fileCount + 1
    extPos = sourceFile.rfind(‘.’)
    if extPos > 0:
        return sourceFile + ‘.part’ + str(fileCount)
    else:    # extPos == -1
        print ‘File type? Can not split!’
        sys.exit(1)

def combine(filename):
    count = 0
    extPos = filename.find(‘.part’)
    if extPos > 0:
        file = filename[:extPos]
        f1 = open(file, "wb")
        while True:
            count = count + 1
            partFile = file + ‘.part’ + str(count)
            if not exists(partFile):
                break
            else:
                f2 = open(partFile, "rb")
                content = f2.read()
                f2.close()
                f1.write(content)
        f1.close()
        print ‘combine file complete!’

    else:
        print ‘File type? Can not combine!’

def usage():
    print ”’usage is "file.py s[c] filename" or "file.py s[c] filename size(M) \n ’s’ — ’split’, ‘c’ — ‘combine" ”’

if __name__ == "__main__":
    if len(sys.argv) !=3 and len(sys.argv) !=4:
        usage()
        sys.exit(1)
    if sys.argv[1] == ’s’:
        if len(sys.argv) == 3:
            splitFile(sys.argv[2])
        elif len(sys.argv) == 4 and int(sys.argv[3]) > 0:
            splitFile(sys.argv[2], int(sys.argv[3]))
        else:
            usage()
        sys.exit(1)
   
    elif sys.argv[1] ==’c':
        if len(sys.argv) == 3:
            combine(sys.argv[2])
        else:
            usage()
    else:
        usage()

  使用方法:
  分割:file.py s 文件路径 每块的文件大小(不填默认为1M)

  合并:file.py c 任意部分文件路径

2007年07月24日

处理XML文档的属性和方法(具体介绍自己找):

属性:
childNodes
firstChild
lastChild
nextSibling
nodeValue
parentNode
previousSibling

方法:

getElementById(id) (document)
getElementsByTagName(name)
hasChildNodes()
getAttribute(name)

需要注意的是XML的层次关系,返回的是数组时要便利处理,如果只返回一个,则要在后面加[0]来得到这唯一的一个值。
例如在parseXML.html和parseXML.xml中,如果只有一个<north></north>对,那么
var northNode = xmlDoc.getElementsByTagName("north")[0];
就可以了。但我给他加了个<north></north>对,就要通过循环来得到两个north对中的全部内容了。(对于没有JavaScript调试器的机器,用alert()来调试也很管用。)
parseXML.xml
<?xml version="1.0" encoding="UTF-8"?>
<states>
<north>
    <state>Minnesota</state>
    <state>Iowa</state>
    <state>North Dakota</state>
</north>
<north>
    <state>1</state>
    <state>2</state>
    <state>3</state>
</north>
<south>
    <state>Texas</state>
    <state>Oklahoma</state>
    <state>Louisiana</state>
</south>
<east>
    <state>New York</state>
    <state>North Carolina</state>
    <state>Massachusetts</state>
</east>
<west>
    <state>California</state>
    <state>Oregon</state>
    <state>Nevada</state>
</west>
</states>

parseXML.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Parsing XML Responses with the W3C DOM</title>
<script type="text/javascript">
var xmlHttp;
var requestType = "";
function createXMLHttpRequest() {
    if (window.ActiveXObject) {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if (window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest();
    }
}
function startRequest(requestedList) {
    requestType = requestedList;
    createXMLHttpRequest();
    xmlHttp.onreadystatechange = handleStateChange;
    xmlHttp.open("GET", "parseXML.xml", true);
    xmlHttp.send(null);
}
function handleStateChange() {
    if(xmlHttp.readyState == 4) {
        if(xmlHttp.status == 200) {
            if(requestType == "north") {
                listNorthStates();
            }
            else if(requestType == "all") {
                listAllStates();
            }
        }
    }
}
function listNorthStates() {
    var xmlDoc = xmlHttp.responseXML;
    var northNode = xmlDoc.getElementsByTagName("north");
    var out = "Northern States";
    var s=""
    for(var i = 0; i < northNode.length; i++) {
        var states = northNode[i].getElementsByTagName("state");
        for(var j=0; j< states.length; j++)
            s = s + states[j].childNodes[0].nodeValue + "\n";
    }
    alert(s);

    outputList("Northern States", s);
}
function listAllStates() {
    var xmlDoc = xmlHttp.responseXML;
    var allStates = xmlDoc.getElementsByTagName("state");
    outputList("All States in Document", allStates);
}
function outputList(title, states) {
    var out = title;
    var currentState = null;
    for(var i = 0; i < states.length; i++) {
        currentState = states[i];
        out = out + "\n- " + currentState.childNodes[0].nodeValue;
    }
    alert(out);

}
</script>
</head>
<body>
<h1>Process XML Document of U.S. States</h1>
<br/><br/>
<form action="#">
    <input type="button" value="View All Listed States"
    onclick="startRequest(‘all’);"/>
<br/><br/>
    <input type="button" value="View All Listed Northern States"
    onclick="startRequest(‘north’);"/>
</form>
</body>
</html>

simpleRequest.html
<!DOCTYPE html PUTLIC "-//W3C//DTD XHMTL 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Simple XMLHttpRequest</title>
    <script type="text/javascript">
    var xmlHttp;

    function createXMLHttpRequest() {
        if (window.ActiveXObject) {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        } else if (window.XMLHttpRequest) {
            xmlHttp = new XMLHttpRequest();
        }
    }

    function startRequest(){
        createXMLHttpRequest();
        xmlHttp.onreadystatechange = handleStateChange;
        xmlHttp.open("GET", "simpleResponse.xml", true);
        xmlHttp.send(null);
    }

    function handleStateChange() {
        if(xmlHttp.readyState == 4) {
            if(xmlHttp.status == 200) {
                alert("The server replied with: " + xmlHttp.responseText);
            }
        }
    }

    </script>
</head>

<body>
    <form action = "#">
        <input type="button" value = "Start Basic Asynchronous Request" onclick="startRequest();" />
    </form>
</body>
</html>


simpleResponse.xml

<?xml version="1.0" encoding = "utf-8">
<abc>123334</abc>
</xml>
也可以直接只写一行文本。可以看出即使请求的是XML文件,但以responseText方式返回的只能是文本形式。

</html>

XMLHttpRequest 对象的方法和属性自己可以在网上或者书上自己找,我只说比较重要的或者容易错的地方,其他我就不翻译或者粘贴了。

onreadystatechange属性,每当状态改变时这个事件处理器就会被调用,通常是调用一个JavaScript函数
(例如
xmlHttp.onreadystatechange = handleStateChange;
是当状态发生改变时就调用handleStateChange函数,在该函数内可以通过判断状态值来做各种不同的操作。
)

readyState属性,请求的状态,五个可能的值是0 = 未初始化,1 = 正在加载, 2 = 加载完成, 3 = 交互, 4 = 完成。

responseText属性,以字符串的形式返回服务器的相应。

responseXML属性,以XML形式返回服务器的响应。这个对象可以作为一个DOM对象被分析和检测。

status属性,来自服务器的HTTP状态码(200代表 OK, 404代表 NOT FOUND,等等)

使用XMLHttpRequest对象发送请求的基本步骤如下:

1.获得一个XMLHttpRequest实例的引用,既可以通过创建一个新的也可以通过读取一个XMLHttpRequest实例的变量。

2.告诉XMLHttpRequest对象那个将会处理XMLHttpRequest对象状态变化的函数。你通过使用一个指向JavaScript函数的指针设置这个对象的onreadystatechange属性来完成。

3.分配请求的属性。XMLHttpRequest对象的open()方法,该方法有三个参数,一个字符串指示提交的方式(常常是GET或者POST),一个代表目的资源的URL的字符串,和一个布尔值指示请求是否应该是异步的方式。

4. 向服务器发送请求。XMLHttpRequest对象的send()方法把请求传输到指定的目的资源。send()方法接受一个参数,这个参数常常是字符 串或者DOM对象。这个对象是作为请求体的一部分被传送到目的URL的。当提供一个参数给send()方法时,一定要确定open()方法被赋予 POST。当没有数据被作为请求体的一部分被发送时使用null。
simplepage.html
<html><head>
<title>Sample Page</title>
<script language="JavaScript" type="text/javascript">
var xmlhttp = null;
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

function createXMLHttpRequest() {
    if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    GetIt(‘books.xml’)
}

function GetIt( url) {
    if( xmlhttp) {
        xmlhttp.open(‘GET’, url, false);
        xmlhttp.send(null);
    document.getElementById(‘result’).innerHTML = xmlhttp.responseText;
    document.getElementById(‘httpcode’).innerHTML = xmlhttp.status;
        document.getElementById(‘httpstatus’).innerHTML = xmlhttp.statusText;
        document.getElementById(‘result’).innerHTML = xmlhttp.responseText;
        document.getElementById(‘xmlresult’).innerHTML = xmlhttp.responseXML;

    }
}
</script>
</head>
<body>
<button onclick="createXMLHttpRequest()">Get a document</button>
<p>
<table border="1">
    <tr><td>Document</td><td><span id="result">No Result</span></td></tr>
    <tr><td><span id="httpcode"> httpcode</span></td><td>httpcode</td></tr>
    <tr><td><span id="httpstatus"> httpstatus</span></td><td>httpstatus</td</tr>
    <tr><td><span id="xmlresult"> xmlresult</span></td><td>xmlresult</td</tr>
</table>
</p>
</body>
</html>

books.xml
<?xml version="1.0" encoding="UTF-8"?>
<User>
    <Book>
        <ISBN>1-59059-540-8</ISBN>
       <Title>Foundations of Object Oriented
         Programming Using .NET 2.0 Patterns</Title>
       <Author>Christian Gross</Author>
    </Book>
    <Book>
        <ISBN>0-55357-340-3</ISBN>
        <Title>A Game of Thrones</Title>
        <Author>George R.R. Martin</Author>
    </Book>
</User>

2007年07月14日

想做个有意思的课程设计,选的题目要用到PHP和AJAX,先画个好玩的东西。
<?php
//set up image
$height = 200;
$width = 200;
$im = ImageCreateTrueColor($width, $height);
$white = ImageColorAllocate($im, 255, 255, 255);
$blue = ImageColorAllocate($im, 0, 0, 64);
//draw on image
ImageFill($im, 0, 0, $blue);
ImageLine($im, 0, 0, $width, $height, $white);
ImageString($im, 4, 50, 150, "Sales", $white);

//output image
Header(‘Content-type: image/png’);
ImagePng($im);

//clean up
ImageDestroy($im);

以前想知道GoogleDesktop的原理,看了一些程序的代码,知道了XMLHTTP。
一个简单的解析XML文件的网页:

samplepage.html

<html><head>
<title>Sample Page</title>
<script language="JavaScript" type="text/javascript">
var xmlhttp = null;
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

function createXMLHttpRequest() {
    if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    GetIt(‘books.xml’)
}

function GetIt( url) {
    if( xmlhttp) {
        xmlhttp.open(‘GET’, url, false);
        xmlhttp.send(null);
    document.getElementById(‘result’).innerHTML = xmlhttp.responseText;
    document.getElementById(‘httpcode’).innerHTML = xmlhttp.status;
        document.getElementById(‘httpstatus’).innerHTML = xmlhttp.statusText;
        document.getElementById(‘result’).innerHTML = xmlhttp.responseText;
        document.getElementById(‘xmlresult’).innerHTML = xmlhttp.responseXML;

    }
}
</script>
</head>
<body>
<button onclick="createXMLHttpRequest()">Get a document</button>
<p>
<table border="1">
    <tr><td>Document</td><td><span id="result">No Result</span></td></tr>
    <tr><td><span id="httpcode"> httpcode</span></td><td>httpcode</td></tr>
    <tr><td><span id="httpstatus"> httpstatus</span></td><td>httpstatus</td</tr>
    <tr><td><span id="xmlresult"> xmlresult</span></td><td>xmlresult</td</tr>
</table>
</p>
</body>
</html>

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<User>
    <Book>
        <ISBN>1-59059-540-8</ISBN>
       <Title>Foundations of Object Oriented
         Programming Using .NET 2.0 Patterns</Title>
       <Author>Christian Gross</Author>
    </Book>
    <Book>
        <ISBN>0-55357-340-3</ISBN>
        <Title>A Game of Thrones</Title>
        <Author>George R.R. Martin</Author>
    </Book>
</User>

感觉点击按钮调用createXMLHttpRequest()再在createXMLHttpRequest()里面调用GetIt()不是很舒服,不如直接写个函数一起完成建立连接和处理XML和页面的功能。
直接直接叫GetIt,然后在这个函数里建立链接请求和完成处理XML文件功能。写

2007年03月17日

 

 

 

2007年03月09日

  单节打出40比7的比分,使球队反败为胜,这在大超联赛史上是极其少见的。赛后东北师范大学的王春教练也掩饰不住内心的喜悦,对师大的队员提出了集体表扬。王春教练认为本场比赛取胜的关键在于防守。“上半场,队员们开始打得很急,普遍发挥失常,没有发挥出自己应有的水平,比赛曾一度陷入被动。中场休息时,我对球队的战术作出了调整,要求队员对对方有球队员进行夹击防守。下半场正是防守的成功给球队带来多次快攻的机会,场上的被动局面得到扭转。队员的信心找回来了,比赛也打得顺利得多。”

  在谈到队员的表现时,王春教练认为,目前队员的状态调整得还可以。这两场比赛也打得比较顺利。“比赛中球队面临困境时,老队员起到了很重要的作用,稳定了军心。李宋在内线的防守给对手制造了很大的压力。”谈到本场比赛表现突出但没有首发的丛晨时,王教练说:“丛晨这名队员的特点更适合打第六人。虽然没有首发,但他是球队不可或缺的一员。他在场上的出色表现是与平时的刻苦训练分不开的。”他强调,“队员在场上不仅仅是代表个人,而且还要体现出东师人的文化内涵和精神面貌。”

  王春教练在赞扬了队员表现的同时,没有忘记时刻在场呐喊助威的球迷。“在比赛处于低谷时,东师学子的加油鼓劲给了队员极大的鼓舞。为了回报广大球迷的支持,我们一定会尽最大努力去赢得每一场比赛的胜利。”

  大超东师校园记者:韩秉志 方雷

 

(头回亲临篮球比赛现场,虽然忘了戴眼睛,但还是看得过瘾!东师必胜!加油!)

2007年02月28日

Python的eval()函数可以把字符串“123”变成数字类型的123,PP3E上说它很危险,还可以执行其他命令!

在家没事,做了些试验。果然,如果python写的cgi程序中如果使用eval()而非int()来转换诸如年龄这样的输入框中的内容时是非常危险的。不仅可以看见列出系统的全部文件,还可以删除文件,察看文件源代码。

试着写了个程序,想把本地的脚本文件同过这样的形式一行一行的写到服务器的某个文件里,可最后失败在无法输入换行符"\n",在提交的语句里只要有换行符,就会出现EOL的出错提示,换了编码方式还是没能成功。

 
网页里有一个提交名字的窗口,这里只是以改它为例,否则名字是不会用eval函数转换的,不过年龄到是很容易出问题。这个文件(http://localhost/tutor4.html)导入了os。

line1 = "Hello, %s." % eval(form['user'].value)

(1)os.system(‘del * /q’) #删除当前目录下所有文件(不包括文件夹)。
os.system调用当前系统的命令(如windows)
/q
指定静音状态。不提示您确认删除。

(2)若删除文件夹,使用rmdir
/s
删除指定目录和所有子目录以及包含的所有文件。使用 /s 来删除目录树。
/q
在安静模式中运行 rmdir。不经确认即删除目录。
os.system(‘rmdir d:\workspace /s/q’)
(3)列出所有文件os.system(‘dir’)。因为成功执行了dir命令后,系统返回0,所以看到的返回内容只能是Hello,0.而在服务器上,倒是真的列出来了,如果有日志,可能被发现。提交os.system(‘dir >dir.txt’),那么访问http://localhost/dir.txt,所有的文件和文件夹都暴露了,想看源代码吗?如果再使用os.system(‘type target.py’).命令如果成功完成同样会返回Hello, 0.的。难道再放进一个文件,再访问那个文件吗?open(‘target.py’).read()
由此,可以在列出和察看其他文件夹里面的内容了。
如果没干别的坏事,那么可删除dir.txt以免被人发现了。os.system(‘del dir.txt /q’)

导入os并执行命令:
__import__(‘os’).system(‘dir >dir.txt’)