我要把mercurial-server的相关文件放到web项目里一起部署,于是想知道在apt-get安装mercurial-server时都执行了那些操作。官方没有手动安装的教程,我就查了整理一下。
开始找到这个命令,这个命令只会将一些安装的文件列出来,还有一些不知道什么用0 0.没有达到目的。
dpkg -x xxxx.deb xxxx
然后找到
ar vx xxxx.deb
.deb其实是一个ar档,所以使用ar解压。
deb 包本身有三部分组成:数据包,包含实际安装的程序数据,文件名为 data.tar.XXX;安装信息及控制脚本包,包含 deb 的安装说明, 标识,脚本等,文件名为 control.tar.gz;最后一个是 deb 文件的一些二进制数据,包括文件头等信息,一般看不到,在某些软件中打开可 以看到。
control.tar.gz 则包含了一个 deb 安装的时候所需要的控制信息。一般有 5 个文件:control,用了记录软件标识,版本号,平 台,依赖信息等数据;preinst,在解包 data.tar.gz 前运行的脚本;postinst,在解包数据后运行的脚本;prerm,卸载时, 在删除文件之前运行的脚本;postrm,在删除文件之后运行的脚本。
搞定0 0.
参考:
http://www.linuxdiyf.com/viewarticle.php?id=78628
http://www.baike.com/wiki/DEB%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F
Read more...
go实现第一个web框架小总结-tfwf
从上上个周开始,就开始进行了。为啥起了这么蛋疼的一个名字,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...