这次从头看起。
---
从项目的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通过判断app_name有没有BaseCommand来确定是否已经导入command模块(命令命名的py文件),如果没有导入,导入并返回里边的Command类就是定义的命令。最后返回Command类。
----
下边调用run_from_argv方法,这个Command类是集成BaseCommand,在django/core/management/__init__.py里边,先设置参数然后到execute里边。self.validate()model的定义检查等。然后执行了handler()就是命令的逻辑函数了。最后就是输出结果,有一个output_transaction,应该是操作数据库进行的操作,如查看数据表结构,后边看,看是数据库操作。
----
然后就是找到你想看的命令对应的文件看了。先看runserver了,其他先不看。
django/core/management/commands/runserver.py,handler(),先判断了DEBUG为false时,必须设置ALLOWED_HOSTS。然后ipv6的一坨,没看。
到了run(),只区分是否自动重载代码,不想自动加载要命令后边加上--noreload。然后只看自动重载的代码autoreload.main(self.inner_run, args, options),不过也要用到self.inner_run。。。
----
/django/utils/autoreload.py,main(),里边通过判断sys.platform开始字符串是‘java'选择使用哪个reloader。。没研究过jython,长知识。check_errors捕获执行inner_run时的异常。下边就是reload了,没看懂,等后边详细看看。
----
回到inner_run,开始打印了一堆提示信息。到get_handler里边返回get_internal_wsgi_application().
django/core/servers/basehttp.py,get_internal_wsgi_application,,判断settings里边是否设置WSGI_APPLICATION,默认设置,在项目里wsgi.py.
如果没设置,找get_wsgi_application,设置了导入wsgi.py,返回application,而application也是get_wsgi_application.
get_wsgi_application返回WSGIHandler(),/django/core/handlers/wsig.py,处理请求的逻辑在这里开始了。以后分析。
inner_run最后run(),WSGIServer继承自wsgiref.simple_server.WSGIServer。初始化传入,addr,wsgi_handler(刚刚返回的处理请求的逻辑!,后边用set_app设置),ipv6的。
-----
下边主要想看一下reload是怎么做的(纯属好奇)和WSGIHandle(最终目的!)
Read more...
Archive for 算法-编程
ruby交互模式工具pry
今天上午改了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 list看都装的那些×和版本。
Read more...
一个小的微信应用
使用django写的微信应用,几个月前了,现在又看了一下。
当时想做一个宠物照片分享,信息查询的应用。现在发现微信应用不适合做这种功能这么全的,要依赖网页那样没意思了。接触微信多了也发现这个手机app也没什么意思,就用来做宣传什么的不错,再一个做个抽奖,定时发文章的那种应用比较适用。
用django写主要是操作数据库什么的也方便,其实就一个url请求,官方还有一套验证,不过如果url足够保密,不验证也无所谓。
然后解析xml,按照不同的动作做不同的事。已经实现的功能中,最大的一个是能够搜索宠物店或者宠物医院的。
数据来自百度地图,让同学帮忙抓的,直接用百度地图的开发api,抓取限制足够轻松的抓取完。
我用的结巴分词,分析的地址,店名数据,制作搜索词。用的whoosh检索。
这两个放在sae上时,不能创建文件,必须制定一个目录,由于店面不会长变,结巴分词的也不更新,所以我直接在项目下建的目录,然后本地生成,直接svn提交到sae上。whoosh是直接用api的很方便很爽,没有选择一些集成到django的插件,感觉配置什么的很麻烦也不爽,不如直接下载下代码放到项目目录下直接调用来的爽。
Read more...
whitespace的python实现
汗,简直是无奇不有,在lisp群里看到他们说这个语言。当时就感觉很有意思,然后搜索看了一下wiki和官网。当时只是看了wiki的表格,那些文字没看。就感觉和草泥马语言一个东西,挺简单的,于是想自己实现一个python版的。然后没几天就写完了。
主要借助wiki的中文介绍,官方的例子程序和下载的haskell源代码。haskell以前没看过,然后发现看代码一点不费劲。在lisp群里说,妮神说他和erlang差不多,我才意识到可能是以前看过erlang的原因。parser是编写边测试正确的,vm是一口气写完再测的,然后就不想测了,但是开始官方的例子有的跑不通,没办法,就一个指令一个指令的写功能测试到基本正确。然后能跑通官方例子,大部分指令都测过基本功能,除了流程的没写。
说说这个语言,只有三个字符:空格,tab,换行。写完就是一片空白,说是有助于防止别人将代码打印带走。我去真蛋疼。让我写我会用“\n\t”代替,用代码再生成,不会用真的空白,那样怎么看。编辑器还好,可以将空格和tab的背景颜色修改一下,换行就是最后的换行。github上就是整个一片白。说这个和草泥马语言差不多,其实我把三个字符换成草泥马三个字,也就真的差不多了。
是换行符的坏处就是,可能一行不是一个完整的语句,下一行又是两个语句。下意识的总喜欢把一行想成一个基本完整意思的代码。所以这个换行符很带疼,其实可能也是指令设计的不好。
项目地址:python-whitespace
Read more...
pygments 首行是空行,自动过滤
搜索找到lexer都有个参数stripnl=False,默认是True。
HtmlFormatter的时候还是不行,哪一个空行还是会过掉。
然后我就判断开头是'\n'的时候,在前边加上一个空格,然后格式就对了
Read more...
linux系统键盘输入-hook?
开始想用python做一个键盘记录的工具,搜索linux keyboard hook,发现找不到东西。后来发现原来linux直接读设备文件就行了,才恍然大悟。
/dev/input/下有十多个event。要找到键盘对应的event,查看grep keyboard /proc/bus/input/devices -A 12。
然后找到一点资料,自己写了一段程序:
Read more...
# 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
最后又找到两个库,用来读或模拟键盘按键的(或别的设备)。python-evdev和python-uinput。
python源码阅读感想
啃了python源代码,从python.c开始慢慢看到token获取,学到很多东西,但是我看到python源代码也有很多可以优化的地方。很多参数、变量可以不要的,同样的判断在不同地方使用的不同方法,我靠看的我晕头转向。一到晕头转向的时候,我就重新从有疑问的地方再走一遍,认真看关键代码,然后才能看懂这一部分的功能。
语言的基本语法想个差不多了,天马行空了一下,与开始想的差距太大。
Read more...
动手写一个语言玩-语言定位
n久前就有这样的冲动,这次读了淫神的代码后,决定还是动一下手。
语言语法主要类似python的,靠缩进来定义代码块,动态语言/静态语言还没想好0 0(应该会静态类型)。
以前想做的时候看过,flex,yacc/bison什么的,看了淫神的代码突然想自己实现一下,问题是难免的,出现问题解决问题。不下手不会知道问题会出在哪,这也是成长过程。看了淫神的代码开始想使用python写,后来觉得有必要复习一下c了,c语言用的太少了,是时候提高一下水平了。
再一个临时的决定是使用llvm,虽然现在还不是很懂其中的奥秘,看看文档慢慢来吧。这也是发现现在好多语言都在用来提示速度,dropbox也在搞py的实现,期待能达到更快的速度。
感觉如果用flex,bison ,llvm 写一个语言应该超简单。。。当然是写一个玩的而不是用的。
我看了淫神的代码 ,然后去翻python的源代码parse部分,无从下手,打眼也抽不出来各部分功能,然后就放弃了,自己慢慢搞。汗
更新
周末,屋里又看了一下python parser部分的源代码,找到了基本流程,开始基本就在Parser/pgenmain.c和Python/pythonrun.c这两个文件,流程我也过了一遍,函数里边具体的分析没仔细看。突然感觉流程都差不多,我可以借鉴一下python的c代码,质量不用说肯定是不错的,偶卡卡。
Read more...
llvm clang编译
1 安装
下载的最新的3.4, http://llvm.org/releases/download.html#3.4
Clang source code (.sig)
LLVM source code (.sig)
Compiler RT source code (.sig)
官方安装文档:http://llvm.org/docs/GettingStarted.html#getting-started-quickly-a-summary
下载的源码主要解压到正确目录就行了.
mkdir build
cd build
../configure
make
make install
编译的二进制文件在llvm-3.4/build/Release+Asserts/bin
搞定了
clang --version
clang version 3.4 (tags/RELEASE_34/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
源里边最新的是3.3的
2 写一个c的hello world
Read more...
#include
int main() {
printf("hello world\n");
return 0;
}
听说clang比gcc速度快。
clang hello.c -o hello
这里和gcc生成一样的系统执行文件
生成llvm的字节码文件
clang -O3 -emit-llvm hello.c -c -o hello.bc
两种形式运行
./hello
lli hello.bc
ubuntu使用yin语言
好吧,我先把yin语言的java代码看了个差不多才想编译一下,主要原因还是想打印点测试的东西,并不是想写点什么。
总的来说像淫神说的,写得代码却是容易阅读。我java只是上学的时候开过课,再没用过,看的过程中只查了两三个的函数就看完了。看完了发现写个括号语言不算太难0 0,我的意思仅仅是学习知识不是编写一个可以用的语言。编译原理的课也开了,都是理论,传说中的龙书又是啥书的,我几分钟看来一遍,感觉和课本没什么区别。看一个编写初期的代码更容易理解一些东西。以前也想自己实现过,想想解析代码的复杂程度就怕了。
环境需求,参照github的wiki上。
java jdk 1.7,ubuntu12.04自带好像是openjdk 我以前搞安卓游戏的时候换过了。
maven 3.2 我直接从官网下载的二进制版本,http://maven.apache.org/download.cgi。解压到/opt/maven-3.2.1,vim /home/a0x55aa/.bashrc,添加export PATH=/opt/maven-3.2.1/apache-maven-3.2.1/bin:$PATH。source一下。mvn -version看一下。应该没问题了
然后mvn compile,自动下了一堆的东西0 0。pom.xml配置文件也看不懂。
mvn exec:java -Dexec.mainClass="org.yinwang.yin.Interpreter" -Dexec.args="tests/assign1.yin"
又下载了一堆东西。。。java果然不是一般人能搞的。我草。太恶心了,都不知道什么用。
Read more...