分类目录归档:我的代码

My First OpenGL Application (Using PyOpenGL)

这个应该是OpenGL的hello world了。

上计算机图形学的老师还花了两节课去给同学讲解怎么在windows安装配置opengl,以及怎么编写第一个opengl程序。其实,如果用Ubuntu+Python,只需要安装一个python-opengl就行了。

apt-get install python-opengl

然后编写以下几行代码运行:
继续阅读

写了一个Web Gateway做Proxy

因为EMSVPS的服务器实在有太多的问题,故现在改回比较稳定的burst.net机器。现在Paypal支持Unionpay的卡,5.95USD/mo大概人民币38元。burst.net的机器提供512M内存和2个IP地址,内存充足的时候跑起Wordpress的确轻松很多了。现在一个IP用作博客服务,另外一个IP用作提供一些Web服务。

因为不同的Web服务都需要监听一个服务端口,为了能让他们共用一个IP上的80端口,需要一个代理分发请求的程序。例如
访问http://lab.xiaoxia.org/server/*的请求分发到localhost:10000的服务,
访问http://lab.xiaoxia.org/whois/*的请求分发到localhost:10001的服务,
而访问http://lab.xiaoxia.org/*的请求,直接获取www目录下的资源文件,例如index.html。

因为使用的都是同一个域名,不同的只是路径,要根据不同的路径选择不同的服务端口,我使用了正则表达式来解决这个问题。

效果见 http://lab.xiaoxia.org/
继续阅读

Python小程序: ServerInformation

监听一个端口,提供HTTP接口,通过访问Web地址,调用程序获取各种信息。

例如,想在远程服务器上执行free命令查看远程服务器的内存使用情况,

free -m 的base64编码为 ZnJlZSAtbQ==,则访问下面的地址:

http://xiaoxia.org:10000/ZnJlZSAtbQ==

提交之后返回类似于下面的结果,

             total       used       free     shared    buffers     cached
Mem:           118        114          4          0          3         36
-/+ buffers/cache:         74         44
Swap:          255         56        199

为了安全使用,在CommandList文本文件里保存着一个命令列表,即可以允许调用的程序。

ps aux
free -m
netstat -na
cat /proc/meminfo
cat /proc/cpuinfo

继续阅读

Python可变参数与标准输出的重定位

使用Python的内置函数print支持可变参数,也就是说,print的调用参数是不固定的。例如:

# 一个参数
print "Hello China!"
# 两个参数
print "Your name is", name
# 三个参数
print "The number of", what, "is", count, "!"

在Python里使用*和**来设置可变参数,它们的区别是*传递一个参数列表(准确来说是参数元组),**传递一个参数字典。二者可以同时混合使用。

>>> def printArgs(*argList, **argDict):
...     print "argList =", argList, ", argDict =", argDict
... 
>>> printArgs("The end of the world is", 2012, lastMan = "Xiaoxia")
argList = ('The end of the world is', 2012) , argDict = {'lastMan': 'Xiaoxia'}

下面举一个例子来模仿print的实现,
继续阅读

Python与C/C++的动态链接库完美配合

在Python里可以使用ctypes库来调用其它语言编译的动态链接库程序,使用方法很简单,Linux和Windows都测试过可行。

用C语言写一个简单的动态链接库,譬如一个加法函数,

int plus(int a, int b)
{
    return a + b;
}

编译一下!(Linux下还要加 -fPIC 参数来编译成so文件)

gcc foo.c -o foo.dll -shared

在同一目录编写python脚本,代码如下:

>>> import ctypes
>>> foo = ctypes.cdll.foo
>>> print foo.plus(1, 2)
3
>>> print foo.plus(100, -1)
99

继续阅读

简单的网络文件传输示例,多线程传一个目录!(pickle很实用)

写了很多年C/C++代码了,有时候换了一种语言去写程序,还是发觉自己的代码始终没有摆脱C的风格和思想。

正当我考虑是否用Python里struct的pack和unpack函数来实现C里的结构功能的时候,我想起来有个东西叫做pickle,可以把一个对象编译成字符串然后保存到外部文件。既然可以这样做,那么我想可不可以用它来把一些数据都用pickle来打包,然后把生成的字符串通过网络传输到另外一个程序,然后得到这些数据内容呢?经过了一些测试,我发现是可行的。

在Python的官网文档上说,有个叫cPickle的东西,和pickle实现了一样的功能,只不过cPickle是用C语言实现的,工作起来效率高很多。另外还了解到Python的marshal也可以实现一样的功能,只不过它没有文档化,不是一个公共的库,会随着版本变化而改变,所以不推荐使用。

对pickle使用方法的详细文档在http://docs.python.org/library/pickle.html

继续阅读

无聊入门一下传说中的验证码识别技术,学习笔记

背景

笔记本硬盘坏了,数据没了,盘里面的数据价值肯定超过联想数据恢复的RMB1500高价,不过当时身五分银,还是算了。。。
新硬盘需要重装很多东西,今晚在群里看到给宿舍评分的给力投票,网址上的验证码做得很水,想涉足一下传说中的验证码识别技术!


继续阅读

查询域名状态(用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
匿名帐号可以使用!
匿名根目录只读,映射了一个虚拟目录,可以上传文件但不允许更改!

继续阅读