在某群看到,
趣味题:
编写原型为int foo(int i, int n)的c函数,实现打印i,i+1,…,n-1,n,n-1,…,i+1,i的序列。要求函数内只能有一条语句,只能有一个分号,只能有一个printf,并且只能用这个printf输出。不允许使用if、else、do、for、while、goto关键字。
没有给出参考答案。下面是我自己写的一个方法。
继续阅读
在某群看到,
趣味题:
编写原型为int foo(int i, int n)的c函数,实现打印i,i+1,…,n-1,n,n-1,…,i+1,i的序列。要求函数内只能有一条语句,只能有一个分号,只能有一个printf,并且只能用这个printf输出。不允许使用if、else、do、for、while、goto关键字。
没有给出参考答案。下面是我自己写的一个方法。
继续阅读
众所周知,PNG是一种无损的图像压缩存储格式。“无损”意味着我们除了可以把图像数据存放到PNG容器之外,还可以把非图像数据(例如文本、音频、视频等)数据压缩并存放到PNG容器中。现在似乎还没有这类软件可以让我们直接把数据压缩到PNG,据说iceboy大牛写了一个(纠正一下,不是iceboy,是twd2同学啊),没有用过(似乎需要Windows和.net运行环境)。详见:http://twd2.me/index.php/archives/1036
花了一晚时间研究,我也用Python写了一个压缩和解压缩的程序,同时支持在线使用,入口:
http://lab.xiaoxia.org/file2png/
例如,把一个CPP代码封装到PNG里,用图片查看器可以看到下面的一坨:
拉伸一下看看,
继续阅读
这个应该是OpenGL的hello world了。
上计算机图形学的老师还花了两节课去给同学讲解怎么在windows安装配置opengl,以及怎么编写第一个opengl程序。其实,如果用Ubuntu+Python,只需要安装一个python-opengl就行了。
apt-get install python-opengl
然后编写以下几行代码运行:
继续阅读
因为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接口,通过访问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的内置函数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里可以使用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
写了很多年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高价,不过当时身五分银,还是算了。。。
新硬盘需要重装很多东西,今晚在群里看到给宿舍评分的给力投票,网址上的验证码做得很水,想涉足一下传说中的验证码识别技术!