2012/02/23 20:42
刚从 Java 或是 .Net 那些“严谨”的编程语言转向 Python 的人时常会惊异于这门语言简单粗暴到似乎不合理的设计。和许多流行的计算机语言相比 Python 确实是追求简洁胜过情理的。反正现代计算机也不可能完全理解人类,与其让它更接近人类的直觉,何不让它更简单?用 @kula 的话说,It works.
以下列举的三个 Python 中不可思议的设计,也可以算是 not a bug but a feature.
1、首先来看 Python 一拍脑门子弄出来的面向对象:
>>> class A(object):
... x = 1
...
>>> a = A()
>>> a.x
1
>>> a.x = 2
>>> a.x
2
>>> del a.x
>>> a.x
1
阅读全文 »
分类: Soft |
标签: features, Python | 3 回复 »
2012/02/16 01:26
Python 中的 tuple 是 immutable 的,也就是一旦创建就不能改动,这样一来操作没有副作用,在函数式编程中很有意义。但是 immutable 也有些不便,例如只能构建树和有向无环图,不能构建环。
list 可以轻松地实现自递归:
>>> l = []
>>> l.append(l)
>>> l
[[...]]
但是由于 tuple 不能修改,这种方式是不行的。
另一个思路是 Pickle ,不过 Pickle 实际上也是以类似执行 Python 代码的方式,同样不可能。 阅读全文 »
分类: Soft |
标签: Hack, Python, self recursive, tuple | 暂无回复 »
2011/12/07 21:30
因为不满意之前的便笺跟踪备份脚本,于是从 StickyNotes.snt 入手,实现了这个自动导出便笺数据并 commit 到 Mercurial(Hg) 的脚本。
Windows 7 便笺的数据保存在 %APPDATA%\Microsoft\Sticky Notes\StickyNotes.snt ,是一个 OLE Compound File ,每个便笺都以 Rich Text Format 的形式记录。Vista 的据说格式不兼容,不过应该也差不到哪去吧。 阅读全文 »
分类: Soft |
标签: Hack, Hg, Mercurial, OLE Compound File, Python, PyWin32, RTF, Windows 7, 便笺, 版本控制 | 1 回复 »
2011/10/11 18:26
Mouse Hover 是 GUI 领域很普遍的技术,例如本 blog 的链接文字在鼠标停留时显示为红色,就是最基本的 Hover 效果。除了改变元件的外观,Hover 还常用于实现诸如改变鼠标指针、弹出式菜单、工具提示等效果。这一方式最初仅用于通过视觉反馈即将操作的元件,但现在涉及的功能越来越强大,越来越底层,这是挺危险的——相信我,Hover 的实现并不好写。实际上也不只是我经常在这上面犯错误,很多流行框架的 Hover 实现都是有问题的。
当然 Hover 的实现“看上去”确实挺容易的,比如 ActionScript 3 实现 Hover 效果只需要这样:
1
2
3
4
5
6
7
8
9
10
| function rollOverHandler(event:MouseEvent):void {
hover();
}
function rollOutHandler(event:MouseEvent):void {
unhover();
}
addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
addEventListener(MouseEvent.ROLL_OUT, rollOutHandler); |
即,当鼠标移到元件内,则进入 hover 状态,当鼠标移到元件外,则进入 unhover 状态,会有什么问题呢? 阅读全文 »
分类: Soft |
标签: ActionScript, AIR, bug, Dragging, Flash, Flex, Hover | 暂无回复 »
2011/10/08 00:17
——写了一个数据库。
真是感觉良好的回答,怎么没人问呢……
于是这就是写了五天的数据库:
Immutabase – A lightweight pure-Python read-only key-value database.
起因是 GAE 不支持 shelve 、sqlite 之类,datastore 慢得出奇而且非常耗 CPU 配额,正巧我又只需要读操作而不需要写操作,于是用最简单的 file (GAE 上是 FakeFile)、struct 和 pickle 写一个只读数据库——这个其实只要 60 行代码就够了——但是考虑到各种各样的实现,半玩票地一路写下去,现在已经 2000 多行了。虽说如此,基本上是个重造轮子的事情,不过我一直认为重造轮子是学习轮子的好方法。
总之这是一个纯 Python 的 Key-Value 文件数据库,只有写入(w)、读取(r)、附加(a)三种模式(不能删改),面向检索优化,支持内存字典查找、二分查找、磁盘哈希查找、数组式查找,支持单文件数据库和限制大小的多文件数据库(GAE 单个文件不能超过 10 M),支持简单数据模型和 Django 、GAE 式的面向对象数据模型,支持缓存(还不给力)。 阅读全文 »
分类: Study |
标签: Database, GAE, Immutabase, NoSQL, Python | 6 回复 »
2011/09/09 20:23

Windows 7 的跳转列表(Jump List)是我挺喜欢的一个功能,可惜不知为何用 Vim 打开的文件并不会加入列表。这个小问题让我纠结了一年,直至最近发现 Vim script 可以内嵌 Python 才得以解决。
软件:
1、使用 DYNAMIC_PYTHON 编译的 gVim
2、Python
3、PyWin32
另外虽然名字是 PyWin32,但是 64 位下一点问题都没有。
在 _vimrc 中添加:
python << EOF
import vim
fn = vim.eval('expand("%:p:n")')
if fn:
fn = fn.decode('utf8').encode('gbk')
try:
from win32com.shell import shell, shellcon
shell.SHAddToRecentDocs(shellcon.SHARD_PATHA, fn)
except:
pass
EOF
要说明的是因为我前面有 set encoding=utf-8 所以要先用 utf8 解码再转成系统编码 gbk 以免中文文件名出错。如果没有 set encoding 则不需要这一句。更复杂的编码相关脚本则最好放在这段代码后。
分类: Soft |
标签: Hack, Jump List, Python, PyWin32, Vim, Windows 7 | 暂无回复 »
2011/08/26 13:15
因为豆瓣 FM 的桌面端和各种第三方的全局快捷键都让我无法接受——为什么不用媒体键呢——便折腾出了这么一个 Python + Firefox + Greasemonkey 的方案。思路很简单,用 Python 跑一个微型的 Web Server 监听全局快捷键,Greasemonkey 同步并调用播放器。 阅读全文 »
分类: Soft |
标签: Firefox, Google Music, Greasemonkey, Hack, JavaScript, Python, 豆瓣FM | 暂无回复 »
2011/08/03 19:22
这里说的拼图即是照片拼接(Photomerge),将多张视角较窄的照片合成一张视角较宽的照片:

拼图这事儿,说简单其实挺简单的,转动相机拍几张,用 Photoshop (CS3 以上版本)的 File → Automate → Photomerge 向导,点几下鼠标就出来了;要说复杂倒也确实需要一点点经验,初次尝试通常会黄掉,即便是老手,在拼完之前也很难打包票说绝对没问题。我的失败经历还算丰富,这里姑且归纳总结一下。 阅读全文 »
分类: Photo |
标签: Photomerge, Photoshop | 暂无回复 »
2011/08/02 06:44
分类: Photo |
标签: 乐山, 九寨沟, 峨眉山, 游记, 黄龙 | 暂无回复 »
2011/07/08 23:02
分类: Photo |
标签: 彩虹 | 暂无回复 »