从上上个周开始,就开始进行了。为啥起了这么蛋疼的一个名字,0 0当时建目录的时候不知道起啥名字,然后就起了一个the first web framework(tfwf),然后在bitbucket上开了一个私有项目,就开始写了。
先说说目的:一直都在用别人写的东西,包括接触的n多东西,一直想自己也实现一个。终于下决心用go准备写一个web框架,因为对这个还算是熟悉的了。选择go的原因是,写了可能会有别人用,但是我的出发点是学习并玩玩。不懂设计,不懂高深的理论,能有点样子就好了。
其实go自带的包写web应用已经非常方便了,现在主要实现的功能有:
url的正则匹配,并且可以定义`^/aa/(?P<second>\d+)/`这样的样式。
网站的基本设置,像域名,名字,templedir等
控制器模仿tornado的样子写的,感觉蹩脚的很0 0.
启动时模板的导入。
就这些了。
说说从一开始写的过程,现在只记得七七八八了,时间有点长了。
准备写web框架的时候,我先去大略看了一遍谢大的 goweb编程那本书,第3.4节是对web框架开头路由的编写起了关键性的作用。
然后我就直接从http包 函数找到源码,把那里的代码意思看懂,就开始写了支持正则匹配的路由,然后对应的handler是函数。之后我就想写成python里边面向对象可以重载的方法,就研究了一下go的面向对象的编程,写成了接口的模式,什么走路像鸭子就是鸭子0 0。。写这里的时候我遇到一点问题:从接口取到对应struct的元素和方法,我有去看来reflect包的内容。
这期间我找了,web.go和beego的代码,大体看来一遍,发现beego的控制器写的跟我想的基本一样,直接看代码,借鉴了很多代码- -算不算抄袭。像url里匹配的变量,我发现go不支持继承的方法参数啥的必须一样。我就在context里边加了一个属性args,感觉真二。
今天开会的时候又加上了temple的启动时集中导入功能,功能的来源beego。再可耻一下0 0.settings和templates都是全局的,这些都不需要修改,第一次启动添加,应该不会有问题。
现在还有好多细节没处理好。还有很多必要的功能没有,像:错误提示,我自己写的时候测试,都发现非常困难,只是自己比较了解,能快速定位刚才修改的代码。我现在很多代码的错误验证都还没有0 0.、
对 一个主要的功能准备,明天实现:异步的问题,现在还没头绪,明天仔细研究一下,并测试一下在普通http请求这两个差别真的很大吗。我现在只是直接调用方法。觉得挺直观明白的0 0.
代码明天实现异步在上传到github上,现在也没格式化。我觉得我应该用我自己写的框架写点能用的东西,才知道还有哪里需要修改的更好0 0.
Read more...
python程序内存占用分析-meliae
写的dht协议搜索的程序,这几天优化了一下发现速度确实快了好多。但是出现了一个新的问题,内存直接飙升,我开了十个爬虫占用内存800m。开始我以为是节点太多了,找了几个小问题修改一下,发现没用。后来就到网上查找python内存分析的工具,查了一点资料发现python有个meliae库操作非常方便,就使用分析了一下,发现不是节点太多的原因0 0,是保存发送的t_id,用来标示返回的消息是那个发出的一个字典过大了。
从分析的结果非常容易的定位了某个对象的数量和大小,非常容易分析。我开始以为是因为好多发送查询信息以后,对面没返回造成这个字典里的元素没有释放造成的,我就用过期时间判断了一下,进行过期删除。发现是小了,但是不是非常显著,好像少了几十不到100M。后来又减少了查找一个随机hash的时间,以前是1分钟查一次,我改成了就第一次查!,发现没减少0 0.不知道是啥的原因。应该就是查找hash,询问节点,然后返回然后询问里边的节点,最后数量越来越多,但是我不明白的是,怎么会这么多运行一分钟就有60万条。也就是说当时内存没释放的对象就有这么多。达到这个内存占用后,基本就不再变化,有很小很慢的提升,因为还开的其他程序,不确定是不是这些程序其他对象的增加造成的。等分阶段dump测试一下。
安装直接pip install meliae 就ok了,我看好久没更新的项目了,不知道还有没有好的替代品不过用着还不错。
将内存dump到文件
Read more...
from meliae import scanner
scanner.dump_all_objects('/tmp/dump%s.txt' % time.time())
分析文件:
from meliae import loader
#加载dump文件
om = loader.load('/opt/log/dump.txt')
#计算各Objects的引用关系
om.compute_parents()
#去掉各对象Instance的_dict_属性
om.collapse_instance_dicts()
#分析内存占用情况
om.summarize()
字段意义如下:
Index : 行索引号
Count : 该类型的对象总数
%(Count) : 该类型的对象总数 占 所有类型的对象总数 的百分比
Size : 该类型的对象总字节数
%(Size) : 该类型的对象总字节数 占 所有类型的对象总字节数 的百分比
Cum : 累积行索引后的%(Size)
Max : 该类型的对象中,最大者的字节数
Kind : 类型
分析某个对象,找出它的引用关系
#得到所有的POP3ClientProtocol对象
p = om.get_all('POP3ClientProtocol')
#查看第一个对象
p[0]
#可以查看该对象的所有引用
p[0].c
#查看谁引用了这个对象
p[0].p
使用django,nginx,supervisor,Gunicorn,virtualenv,mysql搭建网站
在工作时服务器上环境的搭建,做个笔记记录。用到的东西主要有:django,nginx,supervisor,Gunicorn,virtualenv,mysql。
安装就略过了,每一个的文档上有介绍。virtualenv有一个virtualenvwrapper方便操作。
先安装virtualenv,然后在python虚拟环境里边安装django,gunicorn等相关库。
supervisor用来守护django网站启动的进程,默认配置文件添加/etc/supervisor/conf.d/name.conf
Read more...
[program:code] command=/home/sys/.virtualenvs/%(program_name)s/bin/gunicorn %(program_name)s.wsgi:application -c /home/www/%(program_name)s/%(program_name)s/gunicorn.conf.py user=hg directory=/home/www/%(program_name)s autostart=true autorestart=true redirect_stderr=Truegunicorn.conf.py就是启动django的一些参数,制定监听的端口bind = "127.0.0.1:9006"。然后在nginx配置文件里边,进行转发。
server {
listen 80;
set $name "code";
server_name code.xx.com;
root /home/www/${name}/root;
access_log /var/log/nginx/${name}.access.log;
location ~ (\.hg|\.orig|\.bak) {
deny all;
}
location /static/ {
expires max;
access_log off;
alias /home/www/${name}/static/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://127.0.0.1:9006;
}
}
supervisor的一些命令:
修改配置文件以后要使用supervisorctl update命令,否则不会更新。刚开始的时候,捣鼓了好长时间 才知道要这样搞0 0.
supervisorctl start all启动所有进程,
supervisorctl start code 单独启动code进程。
使用supervisorctl可以进入管理程序。
python内建函数type()
今天在网上看到type的一段代码 ,然后查了一下文档,才知道type还有三个参数的用法。
http://docs.python.org/2/library/functions.html#type
以前只是知道type可以检测对象类型。然后发现了一个有趣的用法。
def println(self):
a = 1 + 1
print "%s,%s" % (self.aa, a)
A = type('A',(),{'aa':'print a', 'println': println})
a = A()
type(a)
Out[11]: __main__.A
a.println()
print a,2
第一个参数是类的名字,第二个元组是父类,第三个是属性。
哈哈,我觉得很好笑,虽然我函数里边第一个参数还是写的self,但是如果写一段代码都用这种方法定义类,然后再不注意类名的规范,代码会变的很难读。
Read more...
ubuntu安装qq和搜狗、谷歌输入法
同事写在wiki上,和我说照装的,记录一下。
安装wine
sudo add-apt-repository ppa:ubuntu-wine/ppa
1911 sudo apt-get update
1912 sudo apt-get install wine
安装gtk
sudo apt-get install libgtk2.0-0:i386
不加386不行,我开始没有加,qq不能启动,报错了。
到http://www.longene.org/download/下载qq,并安装。
ubuntu搜狗谷歌输入法安装
ubuntu install sougoupinyin/googlepinyin
1. sudo apt-get remove --purge ibus 卸载Ubuntu 自带输入法
2. sudo add-apt-repository ppa:fcitx-team/nightly 添加源
3. sudo apt-get update
4. sudo apt-get install fcitx-sogoupinyin fcitx-googlepinyin
Read more...
django1.6 RedirectView小改变
0 0,今天用到redirectview,查文档,发现在django1.6版本可以直接指定pattern_name参数来直接指定跳转的url,方便了好多0 0.以前很讨厌在url里引用一大堆东西,我都尽可能写在views里边,至少看起来清楚。
下面有介绍get_redirect_url()只有在url没有设置的时候才会用到pattern_name。doc:https://docs.djangoproject.com/en/1.6/ref/class-based-views/base/#redirectview
Read more...
大学同学的博客
http://0x7c00.sinaapp.com
我以前让他找博客网站申请一个,都一直没写过什么。昨天晚上给他在sae开了一个应用,用wp搭建了一个,他觉得好好利用一下0 0,不知道能坚持个什么情况。最坑的是,以前在群里给他讲0x55aa我为啥起这个名字,他都记错了,还非要个0x7c00。现在都工作了,希望都加油努力学习。
Read more...
Mercurial hg 指定ssh private key
发现现在越来越懒,很多小问题都不再记录。要改正
1.生成一个新key
Read more...
ssh-keygen2.添加key
ssh-add ~/.ssh/test
3.编辑~/.ssh/config 添加:
Host woqu
HostName 192.168.1.118
IdentityFile /home/a0x55aa/.ssh/test
4.项目.hg/hgrc修改
[paths]
default = ssh://hg@woqu/test/haha
还有一种方法:
定义hgrc里边[ui],ssh
ssh = ssh -i ~/.ssh/test -C
编辑的时候使用
hg clone -e 'ssh -i /path/to/key' ssh://user@host/path
dht爬虫终于有眉目了
从看了小虾的博文以后就也想写一个爬虫,一直写到现在才有点眉目。。其中还参考了http://codemacro.com上写的思路,不过有很多功能还没涉及到。
已经实现的功能,创建一个节点,能在dht网络中友好的生存并获取info_hash,好多技巧还没用到。实现插入数据库中,现在直接访问django写的应用(主要也是测试功能,两个功能分开了还没合到一起,直接用django的orm肯定要快好多),然后我在django里边写了下载种子文件和解析种子文件信息的功能。发现有许多hash找不到种子,下载不下来,后面还要在看一下怎么生成种子文件。分析种子信息的代码是从网上找的,然后修改了一下。
一个节点可能有点偏,不计算重复,开始时平均一分钟2个,计算重复一份钟一个。
前段时间又想到以前看群里讨论的关于p2p的应用,想自己实现一下,正好现在对协议了解了。不准备用 python写了,再看一个新语言折腾一下。
Read more...
ubuntu12.04+sqlalchemy+pymssql连接mssql server错误的解决
开始提示,
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/dialects/mssql/pymssql.py", line 72, in _get_server_version_info
r"Microsoft SQL Server.*? - (\d+).(\d+).(\d+).(\d+)", vers)
File "/usr/lib/python2.7/re.py", line 137, in match
return _compile(pattern, flags).match(string)
TypeError: expected string or buffer
然后我打印了vers,发现为None,然后有修改连接字符串,发现不是连接的错误。
然后使用~$ sqsh -U sa -P 123456 -S 192.168.1.21,
1> select @@version
2> go
正确的打印了版本信息,这也不可能是我sqlserver的问题了。
为什么就会为None了呢,shell下直接用pymssql 执行select语句也都返回None。
这期间各种搜索。。各种啊,,没有找到有用的信息,啥都有。
然后 搜索 pymssql no data 发现google都有好多关键字提示。。。然后搜到了问题。
http://stackoverflow.com/questions/7250464/python-and-pymssql
https://bugs.launchpad.net/ubuntu/+source/pymssql/+bug/918896
Read more...
$ apt-get remove python-pymssql
$ apt-get install freetds-dev
$ pip install Cython
$ pip install pymssql
就好了,我之前好像也是用apt-get安装的 因为我看编译需要依赖库,就没有安装,
直接apt-get了。fretds我是安装了的,Cython之前没有安装。不知道与Cython有没关系。
今天部署的时候发现好像是版本的问题,用1.0.2有这个问题,去下载dev 30130403没问题。。。