分类目录归档:我的代码

查询域名状态(用python解析网页返回的XML数据,gd转utf8)

一段Python代码测试域名是否可以注册。用到了panda.www.net.cn提供的一个接口,返回的是一个XML数据。

例如
在浏览器里输入

http://panda.www.net.cn/cgi-bin/check.cgi?area_domain=xiaoxia.org

返回值是

<?xml version="1.0" encoding="gb2312"?>
<property>
<returncode>200</returncode>
<key>xiaoxia.org</key>
<original>211 : Domain name is not available</original>
</property>

使用xml.etree.ElementTree来解析上面的XML数据。
因为它不支持gb2312,所以需要在解析前,转换成utf-8格式的。
然后判断original的值来得知域名是否可用。 继续阅读

再次400多行Python代码实现了一个FTP服务器

Python版本
实现了比之前的xxftp更多更完善的功能 🙂
1、继续支持多用户
2、继续支持虚拟目录
3、增加支持用户根目录以及映射虚拟目录的权限设置
4、增加支持限制用户根目录或者虚拟目录的空间大小

xxftp的特点
1、开源、跨平台
2、简单、易用
3、不需要数据库
4、可扩展性超强
5、你可以免费使用xxftp假设自己的私人FTP服务器

测试地址
ftp://xiaoxia.org
匿名帐号可以使用!
匿名根目录只读,映射了一个虚拟目录,可以上传文件但不允许更改!

继续阅读

MyQQ3.30发布

声明
MyQQ is a cross-platform library for communication which uses a TencentQQ-like protocol to communicate with friends on the Internet. It can work well now and maintained by Xiaoxia.

Current Version: 3.30
Protocol Verison: 2011 Beta2

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
myqq3是个实验品,仅供研究和探讨,勿用于其他用途。它的不稳定性以及时效性可能会导致灾难性的后果!!!

Win32 & Win64 Package 下载
myqq3.30

Source Code:
See http://code.google.com/p/myqq3/
继续阅读

用Python写一个本地Sogou代理服务器程序

真难以自信,使用Python强大的类库,可以用这么简短的代码就写好一个本地的HTTP代理!
真难以自信,这是我用Python花了连续6个小时写的第一个程序(之前写的一个Hello world除外)!
真难以自信,我就这样爱上了Python……
所以,以后在我博客上估计会有不少Python代码了……

现在我使用Python仍然停留在Thinking In The C++ Way而不是Thinking In The Python Way,所以最近会打算看一些Python类库里面的代码,看看别人是如何写的。

一开始使用Python3.2编写这个代理服务器,后来移植到Python2.7上去,这两个版本的差异还真的挺大的,我记得移植的时候改了不少地方。
我用py2exe编译了不需要Python运行环境的Windows可执行文件版本,方便大家测试,貌似编译之后比较臃肿。

这里有一篇关于如何使用py2exe编译python脚本的文章:
www.cnblogs.com/jans2002/archive/2006/09/30/519393.html

下载地址:sogouproxy win32

Python源代码:
继续阅读

C/C++多线程编程介绍(1) – QuickSort

某同学写了一个多线程快排,出现了莫名其妙的问题!
今晚自己也花点时间写一个类似的多线程排序代码。对于QuickSort!一直认为,出自不同人的手,在写法上至少那么一点儿的差别。
下面是我最常用的单线程版本的写法,

int quick(int A[], int a, int b)
{
	int l = a, r = b, m = A[(a+b)>>1];
	do{
		while(A[l]<m) ++l;
		while(A[r]>m) --r;
		if(l<=r) swap(A[l++], A[r--]);
	}while(l<r);
	if(a<r) quick(A, a, r);
	if(l<b) quick(A, l, b);
}

我在Linux下使用pthread线程函数库实现多线程的排序。下面是用到的一些多线程相关的结构和函数。
继续阅读

用C++和libSDL开发游戏系列(3) – 简单A*算法寻径

游戏中经常会用到寻径算法,最简单的寻径算法就是走直线或者总是往最接近目的地的方向走,遇到障碍物就不可以继续前进。这样虽然得到的路线一定是最短的,但是一旦碰到障碍物就被卡住了,显然不够灵活。BFS、A*是最常见的路径寻找算法。BFS算法从起始点一直向周围辐射扩张盲目地寻找目的地,虽然找到的路径一定是最短路,但是效率不高。A*算法加入了对每个发现了的位置的评估,选择与目的地接近的方向搜索,比较灵活,效率也很高。

A*算法是改进的BFS(宽度优先搜索)算法,区别在于A*算法在搜索下一个点的时候,会在等待搜索的点中寻找一个最优的。这里最优的意味着,最容易到达目的地。最简单的一个评估方法是,看当前位置到目的地还有多远。

设f(x, y)为对位置(x, y)的评估函数,g(x, y)为从起始点到当前点所经过的路程,h(x, y)为从当前点到目的地还需要的大概路程。则f的表达式可以为f(x, y) = g(x, y) + h(x, y)

以下面这个地图为例,比较BFS和A*的差异。

19 33
 ############################### 
 #                       #     # 
 #                       #     # 
 #                       #  @  # 
 #                       #     # 
 #                       #     # 
 #     #     #######     ### ### 
 #     #     #           #     # 
 #     #     #           #     # 
 #     #     #        x  #     # 
 #     #     #           #     # 
 #     #     #           #     # 
 #     #     #######     #     # 
 #                             # 
 #                             # 
 #                             # 
 #                             # 
 #                             # 
 ############################### 

地图中,#表示障碍物,x表示起始位置,@表示终点,.表示搜索过的位置,*表示最终找到的路径。
假设地图上的怪物只可以上下左右四个方向移动。
继续阅读

用C++和libSDL开发游戏系列(2) – 使用SDL_mixer播放音乐和音效

SDL_mixer的用法很简单,它可以帮助你在你使用了SDL的项目中播放音频文件,包括
项目网址是:http://www.libsdl.org/projects/SDL_mixer/

这里有SDL_mixer的API说明,很详细,而且用法很简单,看了代码你就知道了!
http://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_frame.html

编译选项:
g++ -lmingw32 -lSDLmain SDL_mixer.dll -lSDL main.cpp

随手写的一坨代码:

#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>

int main(int argc, char **argv)
{
	/* 初始化SDL */
	SDL_Init(SDL_INIT_AUDIO);
	/* 在使用SDL_mixer前进行初始化 */
	int ret = Mix_Init(MIX_INIT_MP3);
	if(ret & MIX_INIT_MP3 != MIX_INIT_MP3){
		perror("failed to initialize mp3 module.");
		exit(1);
	}
	
	/* 设置音频格式,使用44100的cd格式即可 */
	if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)==-1) {
		fprintf(stderr, "Mix_OpenAudio: %s\n", Mix_GetError());
		exit(2);
	}

	/* 加载一个wav音频文件 */
	Mix_Chunk* wav = Mix_LoadWAV("./heal.wav");
	if(wav == NULL){
		fprintf(stderr, "Mix_LoadWAV: %s\n", Mix_GetError());
		exit(1);
	}
	/* 播放音频文件,第三个参数是循环次数这里设置为0表示播放一次,1表示播放两次,-1表示无穷次 
	 * 第一个参数是音频轨道,轨道数目可以通过Mix_AllocateChannels函数来改变,-1表示随机选择一个空闲的轨道 */
	Mix_PlayChannel(-1, wav, 0);
	
	/* 加载一首MP3吧! */
	Mix_Music* mp3 = Mix_LoadMUS("./music.mp3");
	if(mp3 == NULL){
		fprintf(stderr, "Mix_LoadMUS: %s\n", Mix_GetError());
		exit(1);
	}
	/* 播放一次 */
	Mix_PlayMusic(mp3, 1);
	/* 等待播放结束 */
	while(Mix_PlayingMusic())
		_sleep(1000);
		
	/* 资源回收处理 */
	Mix_CloseAudio();
	Mix_Quit();	
	return 0;
}