Emacs tramp

很好用的东东,可以方便的打开需要root权限或是远程服务器上的文件。 统一的url格式是 /method:usr@machine:port/path/to.file,这种方式需要在载入tramp前设置tramp-syntax (setq tramp-syntax 'url) (require 'tramp) 也可以用(setq tramp-default-method “scp”) 指定默认的访问方法,这样就不需要/method://了 以我现在的org日程管理为例,个人日程文件保存在机房的73号机上,实验室电脑和寝室电脑上的电脑只要通过tramp远程访问这个org文件即可: (setq org-agenda-files (list "/scp:[email protected]:/home/wyx/notes/lab.org")) 阅读全文 →

PieTTY 中按 Ctrl+S 导致挂起的问题解决

以前碰到这个问题都得先重启PieTTY然后用screen -x恢复到原来的工作界面,今天不知怎么的emacs里C-x C-s按了就挂起,只能google。 传说中,早期的终端会遇到显示字符的速度慢于接收字符的速度,为了解决这个问题,C-s用于先挂起当前终端,在数据传输之后用C-q恢复显示。所以最简单的解决方法就是在挂起后按C-q。 不过我的WinXP中C-q已经和快速启动工具(寝室里是Turbo Launcher,实验室的是Launchy)绑定了,也懒得为了这么个问题改操作习惯,于是再次google,终于找到一个一劳永逸的方法,以bash为例,在~/.bashrc中加入一行 stty -ixoff -ixon 即可。另外这样设置后似乎恢复了C-s在bash中正向增量查找的功能。恩。 阅读全文 →

OSDI 08 - CHESS

Finding and Reproducing Heisenbugs in Concurrent ProgramsOSDI ‘08上微软研究院发的paper,针对并发编程中难以发现的bug问题。 paper的内容主要分两大块。 一是如何在发现bug的时候记录下线程的运行先后(thread interleaving),途径是在线程API和用户程序多写一层wrapper functions,这里还有一些其他的问题,比如只记录下了thread interleaving的话出现data race怎么解决等。 另外一块内容是如何遍历出给定程序运行后所能产生的结果的集合,加入这个能实现的话那就能把所有隐藏的bug都找出来了。但是这个搜索空间很大,是指数级的,的一个结论就是:给定一个程序有n个的线程,所有线程共完成k条指令,那么c次占先调度后线程的排列情况数的复杂度是$$k^{c}$$的,所以在实现遍历代码的时候必须有效的降低k和c的值。 阅读全文 →

Daily Notes on Python[11.17-11.23]

模块动态加载机制 Advanced Python(某一期Google TechTalks的话题)上提到import指令本质是个语法糖,import sys等价于sys = import(“sys”)。解析import sys的bytecode可以看到四个指令(参数略): LOAD_CONST LOAD_CONST IMPORT_NAME STORE_NAME IMPORT_NAME把sys模块导入并保存到栈上,STORE_NAME把这个指针当作普通对象保存在sys这个变量中。 2. IMPORT_NAME指令行为分析将参数打包并用PyEval_CallObject()这个统一调用接口运行__import__方法,bltinmodule.c中的builtin__import__函数包装了这个功能。help(import)显示的__import__方法的参数列表 import(…) import(name, globals={}, locals={}, fromlist=[], level=-1) -> module 对应于builtin__import__中调用的另一层函数封装 PyObject * PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level) 这个函数调用了真正干活的函数,import.c中的 static PyObject * import_module_level(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level) 3. import_module_level函数首先调用get_parent()得到import发生时的package对象,接下来多次调用load_next依次得到各级的包名,跟踪了下import xml.dom.minidom的行为,发现name的值依次是"dom.minidom”, “minidom”。最后根据import的形式是from … import …还是import …返回不同的处理结果。 4. import_submodule函数load_next函数中调用这个函数进行模块的查找和载入。主要分三步:find_module, load_module, add_submodule。 5. from … import …ensure_fromlist处理了这个情况。另外对于from … import *的情况,会从module文件中读入一个__all__对象,从中知道module公开的符号信息。 阅读全文 →

Godel, Escher, Bach [2]

素数判定的形式化系统,精彩! 合数的判定系统比较容易构造,素数的判定当然不能简单的通过“不是合数”来解决。 首先构造一个不整除的概念(DND) 公理模式:xyDNDx,其中x和y是短横组成的符号串。(a>b,a自然不整除b) 生成规则:如果xDNDy是个定理,那么xDNDxy也是个定理。 接下来定义一个描述z在2到x的范围内没有因子的语言,zDFx (Divisor-Free) 规则1:如果–DNDz是个定理,那么zDF–也是个定理。 规则2:如果zDFx与x-DNDz都是定理,那么zDFx-也是个定理。 好了,到这里已经能检查一个数是否在给定范围内找出因子了,定义素数(Pz)就变得很简单。 规则:若z-DFz是个定理,那么Pz-是个定理。 再处理一个特例,为2制定一条公理 公理:P- - 阅读全文 →

Godel, Escher, Bach [1]

哥德尔定理 用比较通俗的英文来说,就是 All consistent axiomatic formulations of number theory include undicidable propositions. 图形和衬底也许会不带有完全相同的信息 There exist formal systems whose negative space (set of non-theorems) is not the positive space (set of theorems) of any formal system. 用更technical的说法 There exist recursively enumerable sets which are not recursive.这里recursively enumerable指能按照typographical规则生成,而recursive则对应域指衬底也是个图形的图形。 由此得出一个结论 There exist formal systems for which there is no typographical decision procedure.证明很简单,用反证法。如果所有的形式系统都能有typographical的判定方法,那么逐个测试所有的符号串,从而能生成一个非定理集合,与前面的定理矛盾。 关于那个数列谜题 {Ai} = 1, 3, 7, 12, 18, 26, 35, 45, 56, 69, … 既然讲到了衬底自然要考虑这个,负空间数列为 {Bi} = 2, 4, 5, 6, 8, 9, 10, 11, 13, 14, … An= An-1+ Bn-1 阅读全文 →

FEG归来

第三届复旦电竞赛,不过这次星际项目报名的高手很少。 小组赛居然输了一场,不过最后在半决赛把这个对手3:0,复仇成功了,恩。 貌似今天打了1把zvz,11把zvp,恩 决赛zvz,不过估计没多少时间准备了。。 阅读全文 →

Why explicit self has to stay

Bruce Eckel的一篇日志建议把self从方法的参数列表中移除,并把它作为一个关键字使用。 http://www.artima.com/weblogs/viewpost.jsp?thread=239003Guido的这篇日志说明了self作为参数是必不可少的。 http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html第一个原因是保证foo.meth(arg)和C.meth(foo, arg)这两种方法调用的等价(foo是C的一个实例),关于后者可以参见Python Reference Manual 3.4.2.3。这个原因理论上的意义比较大。 第二个原因在于通过self参数我们可以动态修改一个类的行为: # Define an empty class: class C: pass # Define a global function: def meth(myself, arg): myself.val = arg return myself.val # Poke the method into the class: C.meth = meth 这样类C就新增了一个meth方法,并且所有C的实例都可以通过c.meth(newval)调用这个方法。 前面两个原因或许都可以通过一些workaround使得不使用self参数时实现同样的效果,但是在存在decorator的代码中Bruce的方法存在致命的缺陷。(关于decorator的介绍可以参见http://www.python.org/dev/peps/pep-0318/) 根据修饰对象,decorator分两种,类方法和静态方法。两者在语法上没有什么区别,但前者需要self参数,后者不需要。而Python在实现上也没有对这两种方法加以区分。Bruce日志评论中有一些试图解决decorator问题的方法,但这些方法都需要修改大量底层的实现。 最后提到了另一种语法糖实现,新增一个名为classmethod的decorator,为每个方法加上一个self参数,当然这种实现也没必要把self作为关键字使用了。不过我觉得这么做还不如每次写类方法时手工加个self =_= 阅读全文 →

Python函数属性

定义一个简单的Python函数 dir(f)可以看到函数的几个主要属性 ‘func_closure’, ‘func_code’, ‘func_defaults’, ‘func_dict’, ‘func_doc’, ‘func_globals’, ‘func_name’。在funcobject.c中对PyFunction_Type的定义中可以看到这些属性的来源: static PyMemberDef func_memberlist[] = { {"func_closure", T_OBJECT, OFF(func_closure), RESTRICTED|READONLY}, {"func_doc", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED}, {"__doc__", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED}, {"func_globals", T_OBJECT, OFF(func_globals), RESTRICTED|READONLY}, {"__module__", T_OBJECT, OFF(func_module), WRITE_RESTRICTED}, {NULL} /* Sentinel */ }; static PyGetSetDef func_getsetlist[] = { {"func_code", (getter)func_get_code, (setter)func_set_code}, {"func_defaults", (getter)func_get_defaults, (setter)func_set_defaults}, {"func_dict", (getter)func_get_dict, (setter)func_set_dict}, {"__dict__", (getter)func_get_dict, (setter)func_set_dict}, {"func_name", (getter)func_get_name, (setter)func_set_name}, {"__name__", (getter)func_get_name, (setter)func_set_name}, {NULL} /* Sentinel */ }; f.func_defaults记录函数的默认值,这个例子中就是一个tuple(10,16) f.func_code是一个code对象,对应于源码中的PyCodeObject。除了《Python源码剖析》中提到的几个属性外,有三个tuple记录了不同类型的变量,co_varnames, co_freevars和co_cellvars,分别对应local variables, free variables和cell variables。 阅读全文 →

Python中inner function的binding处理

BBS上的一个帖子,问题是 def a(): def b(): x += 1 x = 1 print "a: ", x b() print "b: ", x def c(): def d(): x[0] = [4] x = [3] print "c: ", x[0] d() print "d: ", x[0] 运行a()会报UnboundLocalError: local variable ‘x’ referenced before assignment 但是运行c()会正确地显示3和4。 原因在于原因在于CPython实现closure的方式和常见的functional language不同,采用了flat closures实现。 “If a name is bound anywhere within a code block, all uses of the name within the block are treated as references to the current block. 阅读全文 →