How to write AsctionScript program with linux-hello world

August 17, 2011

如何在linux环境下写一个简单的AsctionScript程序, 下面的例子是一个简单helloworld程序。
Env: Linux
Tools: Flex SDK

Step1: DownloadFlex SDK and run the following command:
unzip flexsdk4.5.1.zip

Step2: Add the path, vim ~/.bashrc, add following line:
export PATH=/home/zay/eggs/flexsdk4.5.1/bin:$PATH

Step3: Run the command: bash and then vim linux.as:
1 package{
2 import flash.display.;
3 import flash.text.
;
4 public class linux extends Sprite{
5 public function linux(){
6 var t:TextField = new TextField();
7 t.text = 'Hello world';
8 addChild(t);
9 }
10 }
11 }

Step4:
Run the command : mxmlc linux.as

Step5: firefox linux.swf

由于flex sdk是跨平台了并不需要安装别的什么包,一个简单的Hello world程序就完成了,是不是感觉很简单。

IE重载注册表信息

August 10, 2011

  众所周知, IE设置代理的配置信息是写在注册表里面的. 最近遇到一个问题, 需要通过python设置IE的代理并且无需重启IE便可生效. 其实这里涉及到一个注册表reload的问题, 一般来可以通过结束explorer.exe来reload注册表的信息. 而IE的话则是通过调用系统的另一个模块. 废话不多说直接上代码.
import ctypes
# IE Reload注册表的信息
INTERNETOPTIONREFRESH = 37
INTERNETOPTIONSETTINGSCHANGED = 39
internet
setoption = ctypes.windll.Wininet.InternetSetOptionW
internet
setoption(0, INTERNETOPTIONREFRESH, 0, 0)
internet
setoption(0, INTERNETOPTIONSETTINGSCHANGED, 0, 0)

Python协程的理解

August 4, 2011

  我在坛子里面看到有些人把coroutine称为微进程, 我还是喜欢协程这个称呼. 在python自身是对协程有很好的支持, 那就是yield.

  当初对yield的时候也只是停留在分批从数据库获取数据, 避免将数据库一次性读到内存当中. 我们假设一个场景, 在主线程中一直执行交换执行两个函数A和B, A的生成的数据供B来使用, 下面来个用yield实现协程的例子:

count = 0
def routine1():
  global count
  while 1:
    count +=1
    yield
    print u"协程1重新工作"
def routine2():
  global count
  while 1:
    print u"Now count is %d" %count
    yield
    print u"协程2重新工作"
def main():
  r1=routine1()
  r2=routine1()
  while 1:
    print u"主线程正在工作工作"
    r1.next()
    r2.next()
main()

  输出的结果如下: .... 主线程正在工作工作 协程1重新工作 协程2重新工作 Now count is 1180 主线程正在工作工作 协程1重新工作 协程2重新工作 Now count is 1181 主线程正在工作工作 协程1重新工作 协程2重新工作 Now count is 1182 主线程正在工作工作 协程1重新工作 协程2重新工作 Now count is 1183 主线程正在工作工作 协程1重新工作 ....

  routine1和routine2函数能够从上次暂停的地方重新开始执行. 如果我们不用协程的方式实现的话, 会出现什么后果呢, 下面来个例子二:
count = 0
def routine1():
  while 1:
    count += 1
    print u"协程1重新工作"
    routine2()
def routine2():
  while 1:
    print u"Now count is %d" %count
    print u"协程2重新工作"
    routine1()
def main():
  print u"主线程正在工作工作"
  routine1()
main()

  输出的结果如下: Now count is 494 协程2重新工作 协程1重新工作 Now count is 495 协程2重新工作 协程1重新工作 Now count is 496 协程2重新工作 协程1重新工作 Now count is 497 协程2重新工作 协程1重新工作 Now count is 498 协程2重新工作 协程1重新工作 RuntimeError: maximum recursion depth exceeded while calling a Python object

  这个例子会出现堆栈溢出的错误, 为什么堆栈会溢出呢? 在函数1和2在进行互相切换的时候堆栈的使用情况是下面这种情况:
[A-B-A-B-A-B-A-B-A-B-A-B-A-B-A-B-A-B-A-B-A-B-A.......]
此时Python堆栈一直在迅速膨胀, 所以当count计算到498的时候, python的堆栈已经达到最大的容量之后就会抛出异常. 通过这两个实例大家可以看到协程的魅力所在了吧. 协程能像线程那样工作而无需考虑锁和节省了线程上下文切换的消耗. 就像小提琴文章说的那句话, 不同协程之间的切换这点和线程很类似, 这也是为什么有人称呼为微线程.

回到python的道路

August 2, 2011

  在离开汇丰之后, 自己一直忙于项目开发, 连博客被停了也没发现, 在这最近的3个月时间弄了3个项目, 其中一个还在紧张的进行中. 虽然以下说到的两个项目基本是单兵作战, 但也是由于这两个项目让自己快速的重新拾起python.

  首先要说的是 FTS, 这个项目主要是用到了pyramid这个python框架和redis作为消息队列, 项目的作用呢? 是用于构建一个可监控可调度的分布式异步处理应用. 工作原理如下:

Message -> Redis -> Workers

  这里说的workers群可以当作发送邮件啊, 文件格式转换啊, 更新索引等等一系列的后台服务使用. 因为第一次弄架构, 很多方面都没考虑得很好, 和公司目前那套分布式应用对比起来还是比较羞涩. 这个是离开汇丰后弄的第一个Python应用.

  其次介绍的是自己维护的一个老应用, 反向代理: Gapp-Tweak. 由于公司有这方面的需求, 需要我弄一个代理应用, 于是乎我就基于之前在大学修改gappproxy的基础上弄了目前这个反向代理. 工作原理和gappproxy一样, 不同的是这个版本的服务端是基于tornado写的并且功能强大很多. 目前已部署使用的那个版本已经是实现大文件分段上传和下载的功能, 也正是因为这个项目我把tornado的核心代码看了一遍并且做了不少修改.

  最近的工作也就这样, 充满了挑战和新鲜感. 同时由于新项目的需要还得学javascript和jquery等等前端的知识. 幸亏大学期间弄过不少的开发, 页面也又同事设计好了, 说实在页面设计自己实在是弱.

博客搬家

July 27, 2011

    用了接近3年的博客由于各种原因被删掉了,事前朋友那边也没有任何的告知,因为服务器也不再由我朋友运维了. 所以还是搭建属于自己的服务器环境靠谱点, 但是由于GFW的存在, 自己还得经常翻墙写文章.
    目前这个博客框架比较简单用的是tornado的一个demo程序,日后有空的话就是基于这个进行重写了. 用这个新环境重新记录一下自己的心路历程也是蛮不错的.

Archive