qyb的博客

IronPython 里某些类型的显式转换


import clr, System
x = clr.Reference[System.UInt64](0)

#创建一个到System.UInt64对象的引用,C的行话是指针

x.Value = 1 * 1

上述代码在最后 x.Value = 1*1 的时候抛了一个类型异常出来..

我就直接在 ipy console 里执行 x.Value = 1 测试

我靠,没有任何错误啊。为啥后面赋值把整数替换成表达式就错呢?我想当然的以为这个是 IronPython 的 bug,差点就去开 Issue 了。后来转念一想,这个 2.0.3 的 ipy 出错,或许 2.6 就 fix 了...

然后发现在 2.6 里更悲剧,x.Value = 1 也直接抛异常..我这才意识到这种赋值操作是有问题的,改成 x.Value = System.UInt64(1*1) 搞定

Topic: 技术

关于动态gif的帧速

做了一个小实验,结果预期的目的失败了,倒是额外发现了关于动态gif帧速的一个链接:http://humpy77.deviantart.com/journal/12374968/

如果没耐心读英文,我中文介绍一下:

动态GIF的定义,是弄一组GIF图片,然后指定渲染图片序列的时候,处理下一帧之前 delay 多长时间。这个时间是一个整数n,表示延时 n * 1/100 秒。

理论上我们可以得到非常棒的动画图像,要知道电影也不过每秒24帧而已,但我们从来没有看到过效果很好的动态gif,不是么?

原因在浏览器对这个规范的实现上。所有的浏览器,都不支持 n=0,1的延迟,而且如果把值设成0或1,会得到更糟糕的动画效果!

  1. IE,所有n<6的延迟,统统提高到10 (0.1秒 or 10fps)
  2. Firefox,所有n<2的延迟,统统提高到 10。就是说 n=2 确实可以在firefox上看到很漂亮的动画,可惜IE上会慢得一塌糊涂
  3. Opera,最糟糕,最小是0.1秒
  4. Safari,和Firefox各有利弊,所有n<3的延迟,会提高到3。换句话说你不小心做了一个n=1的图,在其它浏览器下都悲剧了,但在Safari上还凑合
  5. 最后,上面都是2007年的测试,我自己又重新用各个浏览器最新的版本重新测了一下,看n=2以及n=6动画的表现:
    • 对IE 8/Firefox3.6来说,上面表现一样
    • 新版的Opera表现很好,n=2的时候,效果和Firefox一致,赞!没有测是否支持n=1
    • 新版Safari,至少是Windows上的Safari 4吧,比老版本退步了。n小于某个值的时候,会提高到一个更高的值(应该是10)。在我测试里n=6的图片,效果比n=2要好;但不知道现在它支持的最小值是多少,也许仍然是3?n<3的时候n=10?
    • Chrome表现和Safari一样。我猜所有webkit浏览器,应该都一样的

等下周有时间了生成n=1,2,3,4,5,6,10, 再全面测试看看

结论,千万不要用 0/1 来指定 n,这就彻底茶几了;用2/3/4/5?在Firefox和Opera下效果会如你预期;但为了兼容所有浏览器,还是用6吧

Topic: 技术

2:1 主场搞定切尔西

自1965年以来,国际米兰在冠军杯淘汰赛遭遇英超球队时,45年不胜。。。这个和恐韩症有一拼了

180 分钟的工作只进行了一半,等待下回合客场

Topic: 生活

IronPython 的 .NET 线程

IronPython 除了实现 Python 的 threading 接口,也包括了 .NET 线程接口。如果不考虑跨平台移植的话,.NET 的接口应该是更为好用,也更强大些.

IronPython 线程开发最权威同时也是最简洁的介绍,就是 Michael Foord 大神的 http://www.voidspace.org.uk/ironpython/threading.shtml。剩下的就去研究 MSDN 上的 System.Threading 吧

我模拟了一个 start_new_thread 实现如下:

from System.Threading import Thread, ParameterizedThreadStart

def start_new_thread(func, args, kwargs=None):
def thread_func(obj):
f = obj[0]
a = obj[1]
k = obj[2]
if not k:
return f(*a)
else:
return f(*a, **k)
t = Thread(ParameterizedThreadStart(thread_func))
t.Start((func, args, kwargs))
return t

使用 .NET 线程要注意,Thread.Abort() 方法无法中断非托管代码,比如一个阻塞的 socket 调用。线程会一直停留在 AbortRequested 状态下,而不去抛 ThreadAbortException 异常.

Topic: 技术

最近看的两个片

因为不是在电影院里看的,所以说是片

一个是无耻混蛋, 很昆汀,很好看.

然后就是李米的猜想,08年的电影了,qyt很早就copy到我电脑上,但春节期间我才看

必须得说俺现在看电影大概能看出些道道了,《李》看到最后我就直觉剪得有问题,少了不少情节,后来去网上搜才知道传说原剧本极好,本来是3个小时,但最后因为商业因素(我想影院不太愿意接受这么长的篇幅),以及审查因素(因为生活所迫去贩毒)变成了如今的 96 分钟,"三组人物关系,代表了三组感情类型, 张涵予扮演的警察和妻子,邓超和那个老板娘,王宝强和小香,都有相当充实的描写"...

希望它以后能重新出3小时版的 DVD;迅哥儿表演很棒,凭这个脖子上挂着个手电筒的女出租车司机拿到亚洲影后真没有话说;片中唱了首王菲的歌,主题曲是窦唯的窗外,我觉得好纠结呀,呵呵

Topic: 文化

搜狐邮箱最近几个后台更新

1. 个人邮箱的 lookup db 全部升级完毕...基本上也意味着这个平台完成度达到90%.. 接下来就是升级企业邮箱了

2. 不怕大家笑我们老土,邮件应用服务器——或者说桶服务器,开始进行64位OS测试。前两年纠结的是向 kernel 2.6/epoll,以及应用程序,存储格式的转换;今年主要是头疼计算环境了,除了32->64外,还包括虚拟化技术的应用。

3. imap.sohu.com 貌似可以连接了,但据说除了内部测试帐号外,也就只能认证玩玩,呵呵

Topic: 技术

Ironpython 生成 exe 文件的时候加入 ico 资源

分发 windows 下的 python 程序的时候,免不了要生成 .EXE 文件提供给最终用户。在 Ironpython 里,微软的例子里是有一个 pyc.py,利用 .Net Runtime 提供的 API 将脚本转成 DLL/EXE;Ironpython 2.6 发行的时候,干脆直接把这个 pyc.py 放进了安装包。

但是我在使用 pyc.py 的时候,觉得很不爽的一点就是不能像 py2exe 那样,指定一个 ico 文件作为 .EXE 在桌面环境下的显示图标。俺觉得 .Net 怎么也应该对 win32 desktop 有点特别的支持啊,于是就是好好研究了一下是否简单修改修改 pyc.py 就能搞定这事。

最后找到如下信息:
  1. .Net 下生成可执行文件有两种方法:Reflection.Emit vs. CodeDOM
  2. pyc.py 是 Reflection.Emit 方案
  3. c# 编译器提供了一个 win32icon 选项
  4. 顺藤摸瓜,在 .Net 环境里的 CompilerParameters 类的 CompilerOptions 可以指定 win32icon
  5. 然而这个 CompilerParameters 是 CodeDom 这个思路里的,所以简单修改 pyc.py 是不可行的
  6. 纠结的是 Ironpython 1.1 尚有 IronPython.CodeDom.PythonProvider,但 2.0 开始就消失了

结论就是,用2.0/2.6的话就别想一次性编译搞定了,用 1.1 的话也许能实现目标——不过近期内实在是没有闲心去弄这个了

话说 codedom 可以搞出一些很牛逼的应用,比如把 c# 代码转换成 ironpython 代码。当初 SharpDevelop 刚刚集成 Ironpython 1.1 开发的时候就搞了几个相关特性,后来集成 IP 2.0 的时候被迫去掉了。现在 SharpDevelop 换了个思路,利用抽象语法树又重新一一实现

Topic: 技术

一道小学一年级寒假数学题

把 2,3,4,5,6,7 六个数,填入如下图的空中,要求每条边三个数的和相等

是不是已经有点夸张了?

但更雷人的是要找出3种不同的方案!!(对于以为滚一滚就能弄出三种方案的同志,我得提示一下,应该是有4种方案的——三边之和分别是 12/13/14/15)

这个我就觉得完全超出了一个7岁儿童的思维能力...我相信就算是一个成年人,没有经过对数字敏感度的训练,也无从下手呢.

Topic: dada
订阅 RSS - qyb的博客