为四川人民祈祷! www.onefoundation.cn
logo of kjam.org

Jython Installion

知道故意排斥某些东西是不对的,于是我今天怀着忏悔的心情第二次跑到 www.jython.org 并下载了jython_21.class

命令行下:
java jython_21.class
出错,难道这次和上次一样,无功而返?那是在是太对不起自己了

忽然灵光一现
java jython_21
一路回车安装好了jython

低级错误,post出来活跃气氛
PS: CPython玩多了,IronPython都1.1了,不加油不行了
comments: 12  
by kernel1983

Jampad Porting

花掉了两个晚上的时间,把pikipiki这样的cgi程序port称为了一个wsgiapp,事情还没远有结束,不过我隐约看到了一些成果

其实这样的port工作内容很简单,新建一个StringIO就叫他buf吧,被我当成内存文件用了。把所有的print替换成print >>buf,一切乱七八糟的内容就都被我截获了,这些内容我当成WsgiClient的输出就可以了

另外一件重要的工作,就是把所有从cgi对象中请求信息的行为,替换成从environ字典的某个对象请求,为此我还特地写了一个函数

完成了这两件大事,我们就可以在把程序嫁接到WsgiServer上了。我选用的是CherryPy的实现,当成我的测试开发服务器

OK!
Tag一下
稍稍整理一下代码,SVN上见……
comments: 0 | tags: Jampad   
by kernel1983

New Banner

如果你不是Pythoner,请忽略本消息
...
大家快往上看,什么?你在看RSS!混蛋,快点打开浏览器
大家现在可以欣赏我华丽抄袭来的新Banner了,我喜欢这个idea!

...


似曾相识?快点打开你python命令行
comments: 74  
by kernel1983

详解asyncore.py

asyncore库是python的一个标准库,它是一个异步socket的包装。我们操作网络的时候可以直接使用socket等底层的库,但是asyncore使得我们可以更加方便的操作网络,避免直接使用socket,select,poll等工具时需要面对的复杂。

这个库很简单,包含了一个函数和一个类
* loop()函数
* dispatcher基类
需要注意的是,loop函数是全局的,不是dispatcher的方法

每一个从dispatcher继承的类的对象,都可以看作我们需要处理的一个socket,可以是TCP连接或者UDP,甚至是其它不常用的。使用容易,我们需要定义一个类,它继承dispatcher,然后我们重写(覆盖)一些方法就可以了。

我们需要重写的方法一般都以handle_打头。
class refuse(dispatcher):
    def handle_accept():
        #do nothing ...
        pass

loop()函数负责检测一个dict,dict中保存dispatcher的实例,这个字典被称为channel。每次创建一个dispatcher对象,都会把自己加入到一个默认的dict里面去(当然也可以自己指定channel)。当对象被加入到channel中的时候,socket的行为都已经被定义好,程序只需要调用loop(),一切功能就实现了。

asyncore是python标准库中的一个良好的设计
在python的标准文档中,有一个asyncore的例子
import asyncore, socket

class http_client(asyncore.dispatcher): def __init__(self, host, path): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.connect( (host, 80) ) self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path
def handle_connect(self): pass
def handle_close(self): self.close()
def handle_read(self): print self.recv(8192)
def writable(self): return (len(self.buffer) > 0)
def handle_write(self): sent = self.send(self.buffer) self.buffer = self.buffer[sent:]
c = http_client('www.python.org', '/')
asyncore.loop()

运行这个函数,发现python.org的首页被下载下来了,也就是说我们实现了一个http层的协议?但是我们用的仅仅是socket级别的API...那么来看看这几行代码的奥妙吧!

writable和readable在检测到一个socket可以写入或者检测到数据到达的时候,被调用,并返回一个bool来决定是否handle_read或者handle_write

打开asyncore.py可以看到,dispatcher类中定义的方法writable和readable的定义相当的简单:
    def readable(self):
        return True

def writable(self): return True

就是说,一旦检测到可读或可写,就直接调用handle_read/handle_write,但是在上面的例子中,我们却看到了一个重载(看上去像C++的虚函数,不是吗?)
    def writable(self):
        return (len(self.buffer) > 0)

很明显,当我们有数据需要发送的时候,我们才给writable的调用者返回一个True,这样就不需要在handle_write中再做判断了,逻辑很明确,代码很清晰,美中不足的是理解需要一点时间,但是不算困难吧!

其余的代码看起来就很清晰了,有一种并来将挡的感觉。当一个http服务器发送处理完成你的请求,close socket的时候,我们的handle_close()也相应完成自己的使命。close()将对象自身从channel中删除,并且负责销毁socket对象。
    def close(self):
        self.del_channel()
        self.socket.close()

loop()函数检测到一个空的channel,将退出循环,程序完成任务,exit。
comments: 135  
by kernel1983

Jampad - V2 in Python

最近正在做的一项工作,就是重新写一遍Jampad。

在刚刚过去的那个时代,Jampad这个简单够用的wiki是一个基于PHP的程序。本来以为程序很小,甚至不需要封装。事实证明在PHP这样的Perl式语法(带美元符号的语法)中,结构化编程带来的副作用是巨大的,你永远都不会期待这样一个无比巨大的case

现在的计划是用Python重新让我的Jampad跑起来,并保留原来的数据。重新制造轮子已经是我们笑话刚刚入门的Geek们的时候经常使用的话题,所以现在的代码绝对不能从零开始,于是我追随着时间轴找到了一个使用Python写作的,古老的CGI程序——pikipiki,并加以改造

如果你看过我前几天写的文章,或许你会明白我的意图了——WSGI,没错,把一个CGI程序Port到一个基于WSGI的标准,这样我们有机会摆脱掉任何框架~~~Django,TurboGears,Pylons……邪恶的思想萌芽,让人热血沸腾

这样的好处就是,享受Python世界中对于WSGI的一切优点,你的程序可以被CGI或者FCGI等任意的环境支持。我好像一直在重复这个观点

OK!
I‘ve got a target.
comments: 0 | tags: Jampad   
by kernel1983
1...14151617181920