技术

关于动态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: 技术

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: 技术

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

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: 技术

GMail 最近的邮件会话整理有 bug 啊

无图无真相:

分别是一个15封信的会话,和一个7封信的会话;但在 GMail 里是 4 个会话

Update:
突然想明白了,GMail 回复邮件时候,如果修改了主题,会切换新的 message-id,它这里把 Re 加到中间了

Topic: 技术

IronPython 里实现进程单例

前言:在寒冷的互联网冬季,偶决定写一个小小的 IronPython 程序,充分发挥一下鄙人的无赖精神,以娱乐自己.

========== 我是分割线 ==========

有时候,希望自己的程序只能启动一次,而不会运行多个实例。在 .Net 下可以通过 System.Threading.Mutex 做到这一点,直接上代码:

MUTEX_STRING = "sohumailcenterblarblar"

if __name__ == "__main__":
from System.Threading import Mutex
m = Mutex(False, MUTEX_STRING)
if m.WaitOne(0, False):
main = Main()
Application.Run()

Topic: 技术

有关全文搜索

本周,sohu.com 的邮件全文搜索功能上线

作为免费邮箱提供商,得具备两个核心技术,一个是海量信息的处理能力,一个是用户产品的开发能力。全文搜索这个功能,就属于上述的第一个能力。不得不承认网易在这方面还是很强,把附件内容,压缩文件的搜索也做了进去;俺们的搜索,纯粹从开发角度看好像差一点就能达到,不过行百里半九十,这方面技术积累上的差距不是一两个季度可以弥补的。再过一年,或许我们也能玩玩压缩文件/附件搜索了。

其实用户执行搜索的可能极低,但一旦其开始搜索,对速度和准确度的要求又非常高。有时候会纠结花这么大的功夫提供性价比(用车东的话说"读写比")这么低的服务是否值当,后来想明白了两件事:所谓服务器,就是干冗余的活,但是让用户生活简单舒服的;其次如果不能合理成本的提供这样的服务,其实是IT能力有问题,应该想法改进技术(或者转换商业思路),而不是就此不做。

和海量信息处理能力相关的还有很多其他的事情 ,比如反垃圾邮件,比如保持多长时间未登录用户信件...2010还有很多东西等待去改进。

Topic: 技术

Postfix 2.7 将引入动态选择源IP的功能

Major changes with snapshot 20100117

====================================

The FILTER action in access maps or header/body_checks now supports sender reputation schemes that dynamically choose the SMTP source IP address.

This is implemented by specifying FILTER actions with empty next-hop destinations in access maps or header/body_checks, and by configuring in master.cf one Postfix SMTP client for each SMTP source IP address, where each client has its own "-o myhostname" and "-o smtp_bind_address" settings.

这样,可以让信用更好的用户通过一个可信度高的 IP 发送出去,而其它的用户,则走另外的 IP

Topic: 技术

网易 SMTP/POP3 归来

今天一上班,就听到同事说了这个最新的消息。。我试了下两个月之前注册的 163 帐号,设置里 POP3/SMTP 缺省是打开的了

感想1: 网易用户应该谢谢腾讯,没有腾讯的直接压力,这个服务是不会有的

感想2: 在邮件领域,开放标准必胜。在 MessageService 领域,开放标准必胜。一个特殊例子腾讯,不过我认为它远远不是消息服务了现在

感想3: 有个缩写叫 fm 的产品会很尴尬. 我觉得推出 Fuck Me 163 的这个人,居然选择了我们的品牌名字做推广,要么过于无知,要么过于自大,更可能两者兼而有之;再和网易的哥们说一句,闪电如果翻译成英文应该是 Lightning,不是 Flash!

以上的恶言相向我已经忍了一年多,现在终于痛痛快快的在 blog 上说出来了,哈哈哈哈.... yes,yes, 我其实也算自大和无知的二者兼备

再次感谢腾讯 :)

Topic: 商业 技术
订阅 RSS - 技术 | BT的花