汗,简直是无奇不有,在lisp群里看到他们说这个语言。当时就感觉很有意思,然后搜索看了一下wiki和官网。当时只是看了wiki的表格,那些文字没看。就感觉和草泥马语言一个东西,挺简单的,于是想自己实现一个python版的。然后没几天就写完了。
主要借助wiki的中文介绍,官方的例子程序和下载的haskell源代码。haskell以前没看过,然后发现看代码一点不费劲。在lisp群里说,妮神说他和erlang差不多,我才意识到可能是以前看过erlang的原因。parser是编写边测试正确的,vm是一口气写完再测的,然后就不想测了,但是开始官方的例子有的跑不通,没办法,就一个指令一个指令的写功能测试到基本正确。然后能跑通官方例子,大部分指令都测过基本功能,除了流程的没写。
说说这个语言,只有三个字符:空格,tab,换行。写完就是一片空白,说是有助于防止别人将代码打印带走。我去真蛋疼。让我写我会用“\n\t”代替,用代码再生成,不会用真的空白,那样怎么看。编辑器还好,可以将空格和tab的背景颜色修改一下,换行就是最后的换行。github上就是整个一片白。说这个和草泥马语言差不多,其实我把三个字符换成草泥马三个字,也就真的差不多了。
是换行符的坏处就是,可能一行不是一个完整的语句,下一行又是两个语句。下意识的总喜欢把一行想成一个基本完整意思的代码。所以这个换行符很带疼,其实可能也是指令设计的不好。
项目地址:python-whitespace
Read more...
django单元测试数据库设置
在settings里加入
Read more...
if 'test' in sys.argv:
DATABASES['default'] = {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'test_db'
}
回加快数据库的生成操作,用time试了一下,效果非常显著。我写了一个测试,从显示看创建数据库用了18秒,占了百分之九十九以上,当然这个比重没啥用。
每次都要在setUp()里边创建数据,然后再测试,不知道有没有好方法,可以在测试开始就创建一个完整数据库,并保证每一个测试类都能保持数据库数据的不变
父亲节日快乐
住的地方人多,早晨很吵。睡得晚起得早,起来想起是父亲节,又想起在学校那会儿父亲节给老爸,写过一个祝福画面,所以又想写一个。
于是搞起了
http://0x55aatools.sinaapp.com/Happy_Fathers_Day
找了老男孩的《父亲》,从网上查了一个jquery的插件,找了一段代码,一张图片,拼凑一下,样子也不好看,贵在心意,发给老爸了。
自动播放和循环播放不知道为什么不好用。。。早晨起来上火也不知怎地,嗓子肿了,不是扁桃体发炎,是上边感觉变大 都感觉到嘴里了我靠。也没心情研究了,赶紧送上祝福
住老爸节日快乐,身体健康
Read more...
pygments 首行是空行,自动过滤
搜索找到lexer都有个参数stripnl=False,默认是True。
HtmlFormatter的时候还是不行,哪一个空行还是会过掉。
然后我就判断开头是'\n'的时候,在前边加上一个空格,然后格式就对了
Read more...
snmp网络流量监控-累加上限然后清零问题
同事使用mtop监控mysql和redis,redis没有流量监控,然后我写个脚本集成到mtop里边。然后查了相关资料snmp。
发现线上n多的负值,不知道问题,我本地没有问题。我查了64位系统的流量累加没有上限,后来同事说可能snmp是32位的,汗。我在redis流量表中类似mtop的操作,保存临时值然后清除,移动到history表中,也看不到具体问题在哪。我也不能有线上权限,让同事查我看,大约知道在4000多M的时候出现负的,差不多应该上限是4g。然后判断 new-old<0,就new+4096-old,然后没出现负值了。
Read more...
android应用反编译classes.dex文件dex2jar
前边提到过jd jui这个工具。
又找到一个反编译classes.dex文件的dex2jar
直接解压文件,然后使用./dex2jar.sh classes.dex来反编译就行了,会生成一个classes_dex2jar.jar文件。可以用jd jui查看代码了。
具体原理也没研究不过看名字。。
Read more...
SNMP配置和查看网卡流量
安装snmp
apt-get install snmp snmpd
编辑/etc/snmp/snmpd.conf配置文件,
1.将原有“agentAddress udp:127.0.0.1:161”改为:
agentAddress 192.168.1.9 /*192.168.1.9为本机IP,即监控服务器要监控的主机IP*/
2.加入一行如下:
access MyROSystem "" any noauth exact all none none
3.将原有“rocommunity public default -V systemonly” 的"-V systemonly" 参数去掉,变成:
rocommunity public default
4.将“#trap2sink localhost public”和“#informsink localhost public”前面的“#”去掉,改为:
trap2sink localhost public
informsink localhost public
5.重启SNMP服务:
/etc/init.d/snmpd restart
6.检验snmp获取数据:
snmpwalk -v 2c -c public 192.168.1.9
流量查询
snmpwalk -v 2c -c public 192.168.1.103 .1.3.6.1.2.1.2.2.1.16.2 send
snmpwalk -v 2c -c public 192.168.1.103 .1.3.6.1.2.1.2.2.1.10.2 receive
查到的结果是总流量,需要取差值计算。
发现一篇好文章,http://www.freeoa.net/osuport/netmanage/get-host-net-traffice-info-by-snmp_1979.html
取得所有网/端口的描述
snmpwalk -v 2c -c public ipaddr ifDescr
cisco交换机端口流量取值需要注意的问题:
If interfaces are in trunk mode, you won't see them with that OID. CISCO-VLAN-MEMBERSHIP-MIB is only for non-trunking ports.
You can try vlanTrunkPortDynamicStatus from CISCO-VTP-MIB to check.
得到机器的网络接口:
snmpwalk -v 2c -c public 192.168.1.20 ifDescr
or
snmpwalk -v 2c -c public 192.168.1.20 .1.3.6.1.2.1.2.2.1.2
You should get a result like this:
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: wifi0
IF-MIB::ifDescr.4 = STRING: ath0
IF-MIB::ifDescr.5 = STRING: br0
# snmpwalk -v1 -c public 192.168.1.20 ifDescr
取得网卡的进/出流量计数:
# snmpwalk -v1 -c public 192.168.1.20 ifinOctets
IF-MIB::ifInOctets.1 = Counter32: 0
IF-MIB::ifInOctets.2 = Counter32: 186740992
IF-MIB::ifInOctets.3 = Counter32: 4117381100
IF-MIB::ifInOctets.4 = Counter32: 3824919421
IF-MIB::ifInOctets.5 = Counter32: 569163
# snmpwalk -v1 -c public 192.168.1.20 ifoutOctets
IF-MIB::ifOutOctets.1 = Counter32: 0
IF-MIB::ifOutOctets.2 = Counter32: 3824764209
IF-MIB::ifOutOctets.3 = Counter32: 305295003
IF-MIB::ifOutOctets.4 = Counter32: 168468497
IF-MIB::ifOutOctets.5 = Counter32: 172865
它们分别代表的意义
ifHCOutOctets OID 1.3.6.1.2.1.31.1.1.1.10 - outgoing traffic (bytes)
ifHCInOctets OID 1.3.6.1.2.1.31.1.1.1.6 - incoming traffic (bytes)
取得交换机端口1的流量
statistic for port 1, then OID is: 1.3.6.1.2.1.31.1.1.1.10.1
使用SNMP RFC1213-mib定义进行流量分析
使用snmp管理网络设备,unix下常用net-snmp的snmpwalk,snmpget等,要得到网络的相关信息,可通过提取'RFC1213-mib'的定义值得到。例如:要取得远程主机的团体字为'public',IP为'192.168.1.20'的网络端口流入(IN)的数据流量,可以使用如下命令:
snmpwalk -v 2c -c public 192.168.1.20 RFC1213-MIB::ifInOctets
返回各端口信息如下:
IF-MIB::ifInOctets.112 = counter32:165070862
IF-MIB::ifInOctets是 rfc1213的定义端口流入数据量
112是查询网络设备的1模块插槽12端口
counter32后的数值就是该端口的流量:165070862 bits,在终端下可以通过shell命令取得这两个值
# 首先取得 12 接口的 ifIndex
index=$(snmpwalk -v 2c -c public -IR 192.168.1.20 RFC1213-MIB::ifDescr |grep IF-MIB::ifInOctets.112 |cut -d ‘=’ -f 1|cut -d ‘.’ -f 2)
# 再通过 snmp 协议取得 ififInOctets 和 ifOutOctets 的值
# 也可在 /etc/snmp.conf 中配置好'defVersion'和'defCommunity',这样 snmpget 命令不用指定这两个参数:
eth12_in=$(snmpget -v 2c -c public -IR -Os 192.168.1.20 ifInOctets.${index}|cut -d ‘:’ -f 2|tr -d ‘[:blank:]‘)
eth12_out=$(snmpget -v 2c -c public -IR -Os 192.168.1.20 ifOutOctets.${index}|cut -d ‘:’ -f 2 |tr -d ‘[:blank:]‘)
echo $eth12_in
echo $eth12_out
一般端口流量分析
针对普通网络设备的端口,MIB的相关定义是Interface组,主要管理如下信息:
ifIndex 端口索引号
ifDescr 端口描述
ifType 端口类型
ifMtu 最大传输包字节数
ifSpeed 端口速度
ifPhysAddress 物理地址
ifOperStatus 操作状态
ifLastChange 上次状态更新时间
*ifInOctets 输入字节数
*ifInUcastPkts 输入非广播包数
*ifInNUcastPkts 输入广播包数
*ifInDiscards 输入包丢弃数
*ifInErrors 输入包错误数
*ifInUnknownProtos 输入未知协议包数
*ifOutOctets 输出字节数
*ifOutUcastPkts 输出非广播包数
*ifOutNUcastPkts 输出广播包数
*ifOutDiscards 输出包丢弃数
*ifOutErrors 输出包错误数
ifOutQLen 输出队长
其中,*号标识的是与网络流量有关的信息。
例如看看网络接口:
#snmpwalk -v 1 222.90.47.169 -c public ifIndex
输出:
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
表示有三个网络接口
网络接口明成:
[root@localhost snmp]# snmpwalk -v 1 222.90.47.169 -c public ifDescr
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: ppp0
三个接口分别为
1 本地回路
2 以太网卡
3 ADSL连接
通过 snmp 协议取得 ififInOctets 和 ifOutOctets 的值
# snmpwalk -v1 -c public ipaddr ififInOctets/ifOutOctets
注意:端口的流量是一个累加值,即是从其加电工作开始到取数时,流经其的注意,因此这个数值是一直增加的。但受制于硬件的32位模式,处于32的系统下,这个值在超过4G后,会重新计数,64位系统没有这个限制。
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...