Archive for 算法-编程

今天领导推荐这个项目,中午看了一下,核心就是一个函数一条命令。最后精简为 gdb -p 9252 -batch -eval-command='call PyGILState_Ensure()' -eval-command='call PyRun_SimpleString("exec(open(\"/home/a0x55aa/code/toto/hello.py\").read())")' -eval-command='call PyGILState_Release($1)' 如果提示“ptrace: 不允许的操作.”执行命令:echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope就好了。 用到gdb和python gil相关知识,不怎么懂,感觉就是与正在运行的进程争抢python虚拟机,执行完文件里的代码,over。 正好在grep ps命令的时候,看到执行python manager.py runserver 的进程有两个(为啥两个读源码里读到)。然后我查了一下ps命令的stat字段都是什么意思。 D 不能中断的进程(

Continue

urlconf = settings.ROOT_URLCONF urlresolvers.set_urlconf(urlconf) resolver = urlresolvers.RegexURLResolver(r'^/', urlconf) set_urlconf,如果没有设置urlconf的文件路径,保存;有,删掉。下边生成 resolver对象。 resolver_match = resolver.resolve(request.path_info) callback, callback_args, callback_kwargs = resolver_match request.resolver_match = resolver_match 找到RegexURLResolver里的resolve,match = self.regex.search(path)是匹配上边的 r'^/',也就是path_info必须是’/‘开头,如果不匹配直接404。然后,生成新地址为去掉’/‘剩下的。获得url_pattern

Continue

WSGIHandler继承自BaseHandler,BaseHandler初始化的时候_request_middleware和其他moddleware变量都设置为None。 在WSGIHandler中,先通过判断_request_middleware为None,执行load_middleware。 在load_middleware里根据在settings.MIDDLEWARE_CLASSES里的配置导入所有middleware,并判断class里边包含的方法,分别插入相应的middleware列表里。现在_request_middleware是一个列表。load_middleware结束 回到WSGIHandler, set_script_prefix(base.get_script_name(environ)),get_script_name从environ得到SCRIPT_NAME,如果设置settings.FORCE_SCRIPT_NAME,回直接返回settings.FORCE_SCRIPT_NAME,默认为None。django竟然还提供这种碉堡的功能。。。s

Continue

django在你执行python manage.py runserver的时候,在修改代码后会自动重启,研究一下是怎么实现的。 django/utils/autoreload.py main(),我只看python_reloader,RUN_MAIN通过搜索源代码,发现只有在这个文件有两处,一个是下边else执行时设置为true。也就是说开始可能没有设置值,先执行restart_with_reloader()。精彩到了。。设置新的environ,RUN_MAIN为True。用os.spawnve启动新的reloader()进程,现在RUN_MAIN为True!然后在restart_with_reloader这个父进程里一直在等待判断子进程是否返回exit code,如果不是3就退出循环结束了。 在的reload进程执行new_thread(),也就是启动一个server。下边执行reloader_thread() ---- reloader_thread()里边 先执行ensure_echo_on(),先判断termios是否导入成功,termios是一个py模块,是u

Continue

这次从头看起。 --- 从项目的manage.py看,只有execute_from_command_line(sys.argv)这一个,sys.argv后边看到传不传一样。在django/core/management/__init__.py最后,ManagementUtility对象初始化,保存命令参数和项目路径。execute前边进行参数的解析,设置参数,最后一行 self.fetch_command(subcommand).run_from_argv(self.argv) 这个功能是执行相应的命令。 --- 先看fetch_command(),里边get_commands,取得django自带的命令和用户项目写的命令,返回map{命令:app_name},django自带目录的是django/core/management/commands,app_name为django.core。还要过滤目录下的__init__.py。。。 下一步在fetch_command通过返回的字典获得app_name,下边就是根据app_name导入command。django通过判

Continue

今天上午改了ror写的redmine的一个注册页面功能,主要验证用户名和邮箱地址前缀一样的功能,直接草代码。找到代码,写了一个验证函数,三个语法错误,启动的时候也没有提示,只能慢慢找但是不知道ruby语法半天找不出来,总共改了20行不到的代码。 然后ruby的交互模式进入命令是irb,我靠,不查都不知道。也不知道有没有命令查看安装软件都装了那些bin文件,只知道用dpkg可以看所有的。找到二进制文件就可以猜一下了。 群里推荐使用pry。用了一下挺不错可以使用终端的快捷键,写起来爽多了。irb直接进入交互模式是不支持的。 pry安装方法: gem install pry 然后pry启动 然后 我提示了Sorry, you can't use Pry without Readline or a compatible library.这个错误。 解决办法:sudo apt-get install libreadline-dev,sudo gem install rb-readline安装readline。 gem应该是一个类似python中pip的存在,可以使用gem lis

Continue

使用django写的微信应用,几个月前了,现在又看了一下。 当时想做一个宠物照片分享,信息查询的应用。现在发现微信应用不适合做这种功能这么全的,要依赖网页那样没意思了。接触微信多了也发现这个手机app也没什么意思,就用来做宣传什么的不错,再一个做个抽奖,定时发文章的那种应用比较适用。 用django写主要是操作数据库什么的也方便,其实就一个url请求,官方还有一套验证,不过如果url足够保密,不验证也无所谓。 然后解析xml,按照不同的动作做不同的事。已经实现的功能中,最大的一个是能够搜索宠物店或者宠物医院的。 数据来自百度地图,让同学帮忙抓的,直接用百度地图的开发api,抓取限制足够轻松的抓取完。 我用的结巴分词,分析的地址,店名数据,制作搜索词。用的whoosh检索。 这两个放在sae上时,不能创建文件,必须制定一个目录,由于店面不会长变,结巴分词的也不更新,所以我直接在项目下建的目录,然后本地生成,直接svn提交到sae上。whoosh是直接用api的很方便很爽,没有选择一些集成到django的插件,感觉配置什么的很麻烦也不爽,不如直接下载下代码放到项目目录下直接

Continue

汗,简直是无奇不有,在lisp群里看到他们说这个语言。当时就感觉很有意思,然后搜索看了一下wiki和官网。当时只是看了wiki的表格,那些文字没看。就感觉和草泥马语言一个东西,挺简单的,于是想自己实现一个python版的。然后没几天就写完了。 主要借助wiki的中文介绍,官方的例子程序和下载的haskell源代码。haskell以前没看过,然后发现看代码一点不费劲。在lisp群里说,妮神说他和erlang差不多,我才意识到可能是以前看过erlang的原因。parser是编写边测试正确的,vm是一口气写完再测的,然后就不想测了,但是开始官方的例子有的跑不通,没办法,就一个指令一个指令的写功能测试到基本正确。然后能跑通官方例子,大部分指令都测过基本功能,除了流程的没写。 说说这个语言,只有三个字符:空格,tab,换行。写完就是一片空白,说是有助于防止别人将代码打印带走。我去真蛋疼。让我写我会用“\n\t”代替,用代码再生成,不会用真的空白,那样怎么看。编辑器还好,可以将空格和tab的背景颜色修改一下,换行就是最后的换行。github上就是整个一片白。说这个和草泥马语言差不多,其

Continue

搜索找到lexer都有个参数stripnl=False,默认是True。 HtmlFormatter的时候还是不行,哪一个空行还是会过掉。 然后我就判断开头是'\n'的时候,在前边加上一个空格,然后格式就对了

Continue

开始想用python做一个键盘记录的工具,搜索linux keyboard hook,发现找不到东西。后来发现原来linux直接读设备文件就行了,才恍然大悟。 /dev/input/下有十多个event。要找到键盘对应的event,查看grep keyboard /proc/bus/input/devices -A 12。 然后找到一点资料,自己写了一段程序: <pre lang="python"># coding: utf-8 import os import struct fmt = "llHHI" size = struct.calcsize(fmt) filename = "/dev/input/event3" fd = os.open(filename, os.O_RDWR) while 1: op = os.read(fd, size) timeval, suseconds, typ, code, value = struct.unpack(fmt, op) print typ, code, value</pre>

Continue