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

Let's dream of a day without flash and java applet

我预感, 或许有一天我们可以把Flash, Java Applet 还有该死的 Internet Explorer 一起丢到 Trash 里面去

为了实现这一个伟大的梦想, 我要给朋友们看两个links
http://developer.mozilla.org/en/docs/HTML:Canvas
http://ejohn.org/blog/processingjs/

第一个比较重要一点, Firefox为我们带来的惊喜. 我们可以在 Firefox 中直接使用 JS 画出图形.

一直以来, 浏览器天生缺乏这方面的功能, 只能以插件方式来实现(Flash和Java Apple, 对了还有 ActiveX ). Gecko 1.8 引擎(Firefox 1.5)的开始支持 canvas标签, Webkit 也有支持(就是 Safari, 测试过), 据说最新 Opera 也支持.

第二个link是 jQuery 作者的一篇 blog post, 他做了一件很酷的事情, 就是让超级好玩的玩具 Processing 的语法可以被 JS 解释, 并且将结果显示在一个 canvas html 标签中, 不过, 看起来暂时还只能在 Firefox 中得到正确的结果.

看来最近大家都对图像多媒体比较感兴趣, 难道是最近趋势?
comments: 0  
by kernel1983

Rubik's Cube modeling in python

虽然知道一定有人写过这样的东西, 好起兴依然驱使我花时间做这样一件事情.
Rubik's Cube 的数据结构如何表现, 在多次失败以后, 发现坐标绝对是超级好用的东西. 在图形编程中, 千万不能小看坐标的威力.
from math import *

class RubikCore(object): # example of define the data struct of a rubik's cube R = 0.5 # red G = 0,1,0 # green B = 0,0,1 # blue W = 0,0,0 # white Y = 1,1,0 # yellow D = 0,1,1 # dark brown cube = {} def __init__(self): self.init_cube() self.fill_face()
def init_cube(self): # create a matrix seq = (-1, 0, 1) for x in seq: for y in seq: for z in seq: self.cube[(x,y,z)] = {}
def fill_face(self): # fill color for every face seq = (-1, 0, 1) colors = {(1,0,0): self.R, (-1,0,0): self.G, (0,1,0): self.B, (0,-1,0): self.W, (0,0,1): self.Y, (0,0,-1): self.D,} for x in seq: for y in seq: for z in seq: for i,v in colors.iteritems(): self.cube[(x,y,z)][i] = v
def find(self, axis, value): # give axis and value find all the objects matched
AXIS = {'x':0, 'y':1, 'z':2} res = [] for i in self.cube: if i[AXIS[axis]] == value: res.append(i) return res def _rotate_plane(self, x1, y1): """ x'=xcosA-ysinA y'=ycosA+xsinA """ x2 = int(round( x1*cos(-pi/2) - y1*(sin(-pi/2)) )) y2 = int(round( y1*cos(-pi/2) + x1*(sin(-pi/2)) )) return x2,y2 def _rotate(self, axis, t): # pass a tuple(x,y,z) if axis == 'x': y,z = self. _rotate_plane(t[1],t[2]) return (t[0],y,z)
elif axis == 'y': x,z = self. _rotate_plane(t[0], t[2]) return (x, t[1], z)
elif axis == 'z': x,y = self. _rotate_plane(t[0], t[1]) return (x, y, t[2]) else: return None
def turn(self, axis, value): t = self.find(axis, value) n1 = {} for i in t: n1[self._rotate(axis, i)] = self.cube[i] n2 = {} #print self.cube[i] for l in self.cube[i]: n2[self._rotate(axis, l)] = self.cube[i][l] #print n2 self.cube[i].update(n2)
self.cube.update(n1)

写了一个数据结构的core, 要显示这个cube, 方法很多, 可以用OpenGL, 用PyGame, 只要继承这个类就可以了.

我自己在调试的时候使用了最偷懒的方法, NodeBox. 而且看起来, 想要找一个不错的3D引擎来搞定这些凡人的活, 还是很有挑战性的. OpenGL的抽象程度还是太低了, NodeBox在3D方面仍然缺乏足够的力量... 这样的工作如果使用Panda3D之类的东西来做, 是不是又有用牛刀的嫌疑?

或许我们真的需要一个能抽象OpenGL的python lib, free your mind的图像玩具, 就像Processing那样.

最后, 这样一个core code的确可以更好的优化一下, 比如把着色的顶点坐标都写进去. 不过剩下的已经基本是体力活了, 作为一个prototype, 要继续它最好是换一种语言(用Flex或者Processing, 至少作为劳动成果可以得到一个swf或者applet放在网上展示)

OK, 总算搞定一件一直都想做的事情.
comments: 2  
by kernel1983

Spotlight crash and lxml install on leopard

Leopard在我欢天喜地的更新到了10.5.2以后, SPOTLIGHT Crash whenever I type...

Dam!

在网上找找解决方案, 只有一个家伙和我一样倒霉. 尝试他的方法, 删掉了spotlight的index文件, 重新索引, 无效.

找Crash Dump, 找到了Crash的线程
Thread 3 Crashed:
0   libxml2.2.dylib               	0x02e424fc xmlXPathCacheNewString + 44
1   libxml2.2.dylib               	0x02e4e3f2 xmlXPathCompPathExpr + 2546
2   libxml2.2.dylib               	0x02e4ebb5 xmlXPathCompUnaryExpr + 213
3   libxml2.2.dylib               	0x02e4edbf xmlXPathCompMultiplicativeExpr + 15
4   libxml2.2.dylib               	0x02e4efaf xmlXPathCompAdditiveExpr + 15
5   libxml2.2.dylib               	0x02e4f0ff xmlXPathCompRelationalExpr + 15
6   libxml2.2.dylib               	0x02e4f36b xmlXPathCompEqualityExpr + 203
7   libxml2.2.dylib               	0x02e4f40f xmlXPathCompAndExpr + 15
8   libxml2.2.dylib               	0x02e4f582 xmlXPathCompileExpr + 18
9   libxml2.2.dylib               	0x02e5464a xmlXPathCtxtCompile + 90
10  libxslt.1.dylib               	0x03c5f6e9 xsltXPathCompile + 76
11  libxslt.1.dylib               	0x03c6f939 xsltStylePreCompute + 1530
12  libxslt.1.dylib               	0x03c5b223 xsltParseTemplateContent + 2542
13  libxslt.1.dylib               	0x03c5b51e xsltParseStylesheetProcess + 105
14  libxslt.1.dylib               	0x03c5c78e xsltParseStylesheetImportedDoc + 493
15  libxslt.1.dylib               	0x03c5c7fc xsltParseStylesheetDoc + 26
16  com.apple.DictionaryServices  	0x007d4305 PredefinedXSLTDoc(DCSTransformStyle) + 267
17  com.apple.DictionaryServices  	0x007d4396 CopyTransformedTextFromXML + 110
18  com.apple.DictionaryServices  	0x007d155d DCSRecord::copyData(DCSTransformStyle) + 137
19  com.apple.DictionaryServices  	0x007d3393 DCSCopyTextDefinition + 417
20  com.apple.spotlight           	0x0002b916 0x1000 + 174358
21  com.apple.Foundation          	0x00471b34 -[NSOperation start] + 772
22  com.apple.Foundation          	0x00471822 __runop + 34
23  libSystem.B.dylib             	0x90ecd743 _pthread_wqthread + 331
24  libSystem.B.dylib             	0x90ecd5f6 start_wqthread + 30

难道是自作孽, stupid!

还记得我曾经在blog里面教大家怎么安装python lxml lib吗? 把链接改回来, 也就是libxml2的版本换回2.6.16, spotlight comes back.


但是lxml.etree还是彻底不能用了. 看来不能这样安装, 找一些更加安全的方法. 我可是spotlight的重度依赖者

另外, 还有一条信息, libxslt和libxml2据说要配套的用, 为了安全起见, 在/usr/local/下面安装最新的libxslt

重新安装lxml, 用下面的命令
python setup.py build_ext
    --with-xml2-config=/usr/local/bin/xml2-config
    --with-xslt-config=/usr/local/bin/xslt-config
python setup.py build
python setup.py install

这回应该是完美解决方案了
python
>>> from lxml import etree

终于没有报错, 安装成功

上面的命令可是我读lxml的setupinfo.py源码得出的, 果然源代码面前没有秘密

最后, 清理一下/usr/lib下面无用的文件, 收工!
comments: 0  
by kernel1983

PyDev on Flex Builder OS X

尝试在OS X的Flex Builder 3上安装PyDev

Flex Builder 3是一个构建在eclipse上的工具, 因为是Flex专用所以连JDT都没有带上. 不过本质上它还是一个eclipse.

安装PyDev过程中没有出现什么问题, 倒是配置python interpreter的时候出现了莫名其妙的错误.

原因是这样的, 由于eclipse安装的目录是在/Applications/Adobe Flex Builder 3/目录下的, 目录中有空格. 所以,在配置python interpreter的时候出现失败的提示. 解决方法很简单, 暂时把/Applications/Adobe Flex Builder 3/目录名字改为/Applications/eclipse/或者任何没有空格的名字, 问题就解决了.

配置完成以后, 还可以改回去.
comments: 0  
by kernel1983

Google App Engine 带来的

对于Google App Engine我似乎是后知后觉, 一直都能感觉周围的朋友在谈论它, 自己却从来没有注意

可是当仔细了解以后, 立刻发现Google App Engine绝对是Google有着划时代意义的产品:

以往, 依靠开源技术创建一个web应用, 软件成本已经近乎为零. 但是仍然需要投入硬件成本和人力成本. 硬件成本包括服务器购买或者租用, 人力成本包括开发人员和维护人员的成本.

有了Google App Engine, 我们就可以迅速降低硬件成本和维护人员成本, 不需要掏钱买服务器和请系统/数据库管理员(即使付费, 也是值得的, 至少不用担心数据丢失的风险). 在运营的后期, 由于Google App Engine的可扩展性, 也可以避免代码架构设计上的风险, 保证服务的可用性.

使用python的web开发者应该更加值得注意, 机会来了. Google App Engine的出现将会把python web开发的份额提升到于PHP/ASP同样重要的地位, 很多web应用在开发的初期会选择兼容Google的技术作为基础. 由于python框架在思想上的多元性, 设计上的简单, 开发速度上的优势, python的开发优势会加速体现.

对于python世界中长期以来的多种web框架并存的格局, 也将起到导向性的作用. (当然没有把其他的框架一竿子打死, Google App Engine还是基于WSGI接口的) Django必然成为主流, 其他框架也将在特定的应用方面出现十分出色的产品(论坛方面, 我有写过pforum, 基于Pylons)

在教学方面, 由于将django作为框架开发推荐的首选项, 能降低初学者对于python框架的第一次选择的难度, 大量熟悉django的python人才将出现, 大量网站将使用python/django进行开发. 借用Google自己的影响力, python不管在hosting方面和developer数量方面, 都回有质的提升.

就像ZQ在python邮件列表中预言的一样, 2008果然会是python职位的爆发年. 说的真准, 神了!
comments: 0  
by kernel1983
1234567...19