测试中文slug

六月 12th, 2014 0 次阅读 3 条评论

中文slug文章

分类: 标签:  

再要你命3000.xml(分List版),可导入有道单词本

五月 11th, 2014 0 次阅读 2 条评论

近日在背琦叔的再要你命3000,用词汇控APP复习单词很不方便,解释和单词一起出来,每次都要用手盖住下面-_-b

于是乎制作了这个XML版的,可以导入到有道单词本,妈妈再也不用担心我单词记不住了~背单词~so easy~

下载请猛戳

分类: 标签: GRE 

Micolog浴火重生

四月 17th, 2014 0 次阅读 2 条评论

Micolog自从两年前就已经停止更新,官方发布的最终版本支持了django1.2,可惜仍不支持python2.7,导致gae的许多新特性用不了。

最近花了一番功夫,终于把Micolog成功移植到了python2.7,因为用的是xuming大大的develop版,该版本与release版比改动较大,许多地方与之前的旧模板不兼容。不想放弃最爱的iNove模板,于是手动修改了iNove模板里面的许多地方,尽量使之与develop版兼容,但是不保证没有bug。

此外还把图形验证码模块替换了,改成用PIL库绘制验证码,之前的验证码被人破解了不停发垃圾评论实在恶心。

代码已经上传github:

https://github.com/gkso/micolog (develop branch)

分类: 标签: Micolog 

【转载】进程地址空间与虚拟存储空间的理解

三月 29th, 2014 47 次阅读 0 条评论

原文地址:http://blog.csdn.net/do2jiang/article/details/4690967

在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制。

一  早期的内存分配机制

在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小。那当程序同时运行多个程序时,操作系统是如何为这些程序分配内存 的呢?下面通过实例来说明当时的内存分配方法:

某台计算机总的内存大小是128M,现在同时运行两个程序ABA需占用内存10MB需占用内存110M。计算机在给程序分配内存时会采取这样的方法:先将内存中的前10M分配给程序A,接着再从内存中剩余的118M中划分出110M分配给程序B。这种分配方法可以保证程序A和程序B都能运行,但是这种简单的内存分配策略问题很多。

  

图一 早期的内存分配方法

问题1:进程地址空间不隔离。由于程序都是直接访问物理内存,所以恶意程序可以随意修改别的进程的内存数据,以达到破坏的目的。有些非恶意的,但是有bug的程序也可能不小心修改了其它程序的内存数据,就会导致其它程序的运行出现异常。这种情况对用户来说是无法容忍的,因为用户希望使用计算机的时候,其中一个任务失败了,至少不能影响其它的任务。

问题2:内存使用效率低。在AB都运行的情况下,如果用户又运行了程序C,而程序C需要20M大小的内存才能运行,而此时系统只剩下8M的空间可供使用,所以此时系统必须在已运行的程序中选择一个将该程序的数据暂时拷贝到硬盘上,释放出部分空间来供程序C使用,然后再将程序C的数据全部装入内存中运行。可以想象得到,在这个过程中,有大量的数据在装入装出,导致效率十分低下。

问题3:程序运行的地址不确定。当内存中的剩余空间可以满足程序C的要求后,操作系统会在剩余空间中随机分配一段连续的20M大小的空间给程序C使用,因为是随机分配的,所以程序运行的地址是不确定的。

二  分段

为了解决上述问题,人们想到了一种变通的方法,就是增加一个中间层,利用一种间接的地址访问方法访问物理内存。按照这种方法,程序中访问的内存地址不再是实际的物理内存地址,而是一个虚拟地址,然后由操作系统将这个虚拟地址映射到适当的物理内存地址上。这样,只要操作系统处理好虚拟地址到物理内存地址的映射,就可以保证不同的程序最终访问的内存地址位于不同的区域,彼此没有重叠,就可以达到内存地址空间隔离的效果。

当创建一个进程时,操作系统会为该进程分配一个4GB大小的虚拟进程地址空间。之所以是4GB,是因为在32位的操作系统中,一个指针长度是4字节,而4字节指针的寻址能力是从0x00000000~0xFFFFFFFF,最大值0xFFFFFFFF表示的即为4GB大小的容量。与虚拟地址空间相对的,还有一个物理地址空间,这个地址空间对应的是真实的物理内存。如果你的计算机上安装了512M大小的内存,那么这个物理地址空间表示的范围是0x00000000~0x1FFFFFFF。当操作系统做虚拟地址到物理地址映射时,只能映射到这一范围,操作系统也只会映射到这一范围。当进程创建时,每个进程都会有一个自己的4GB虚拟地址空间。要注意的是这个4GB的地址空间是“虚拟”的,并不是真实存在的,而且每个进程只能访问自己虚拟地址空间中的数据,无法访问别的进程中的数据,通过这种方法实现了进程间的地址隔离。那是不是这4GB的虚拟地址空间应用程序可以随意使用呢?很遗憾,在Windows系统下,这个虚拟地址空间被分成了4部分NULL指针区、用户区、64KB禁入区、内核区。应用程序能使用的只是用户区而已,大约2GB左右 ( 最大可以调整到3GB) 。内核区为2GB,内核区保存的是系统线程调度、内存管理、设备驱动等数据,这部分数据供所有的进程共享,但应用程序是不能直接访问的。

人们之所以要创建一个虚拟地址空间,目的是为了解决进程地址空间隔离的问题。但程序要想执行,必须运行在真实的内存上,所以,必须在虚拟地址与物理地址间建立一种映射关系。这样,通过映射机制,当程序访问虚拟地址空间上的某个地址值时,就相当于访问了物理地址空间中的另一个值。人们想到了一种分段 (Sagmentation) 的方法,它的思想是在虚拟地址空间和物理地址空间之间做一一映射。比如说虚拟地址空间中某个10M大小的空间映射到物理地址空间中某个10M大小的空间。这种思想理解起来并不难,操作系统保证不同进程的地址空间被映射到物理地址空间中不同的区域上,这样每个进程最终访问到的物理地址空间都是彼此分开的。通过这种方式,就实现了进程间的地址隔离。还是以实例说明,假设有两个进程AB,进程A所需内存大小为10M,其虚拟地址空间分布在0x000000000x00A00000,进程B所需内存为100M,其虚拟地址空间分布为0x000000000x06400000。那么按照分段的映射方法,进程A在物理内存上映射区域为0x001000000x00B00000,进程B在物理内存上映射区域为0x00C000000x07000000。于是进程A和进程B分别被映射到了不同的内存区间,彼此互不重叠,实现了地址隔离。从应用程序的角度看来,进程A的地址空间就是分布在0x000000000x00A00000,在做开发时,开发人员只需访问这段区间上的地址即可。应用程序并不关心进程A究竟被映射到物理内存的那块区域上了,所以程序的运行地址也就是相当于说是确定的了。 图二显示的是分段方式的内存映射方法。

图二 分段方式的内存映射方法

      这种分段的映射方法虽然解决了上述中的问题一和问题三,但并没能解决问题二,即内存的使用效率问题。在分段的映射方法中,每次换入换出内存的都是整个程序,这样会造成大量的磁盘访问操作,导致效率低下。所以这种映射方法还是稍显粗糙,粒度比较大。实际上,程序的运行有局部性特点,在某个时间段内,程序只是访问程序的一小部分数据,也就是说,程序的大部分数据在一个时间段内都不会被用到。基于这种情况,人们想到了粒度更小的内存分割和映射方法,这种方法就是分页 (Paging) 。  

三  分页

分页的基本方法是,将地址空间分成许多的页。每页的大小由CPU决定,然后由操作系统选择页的大小。目前Intel系列的CPU支持4KB4MB的页大小,而PC上目前都选择使用4KB。按这种选择,4GB虚拟地址空间共可以分成1048576个页,512M的物理内存可以分为131072个页。显然虚拟空间的页数要比物理空间的页数多得多。

在分段的方法中,每次程序运行时总是把程序全部装入内存,而分页的方法则有所不同。分页的思想是程序运行时用到哪页就为哪页分配内存,没用到的页暂时保留在硬盘上。当用到这些页时再在物理地址空间中为这些页分配内存,然后建立虚拟地址空间中的页和刚分配的物理内存页间的映射。

下面通过介绍一个可执行文件的装载过程来说明分页机制的实现方法。一个可执行文件 (PE 文件) 其实就是一些编译链接好的数据和指令的集合,它也会被分成很多页,在PE文件执行的过程中,它往内存中装载的单位就是页。当一个PE文件被执行时,操作系统会先为该程序创建一个4GB的进程虚拟地址空间。前面介绍过,虚拟地址空间只是一个中间层而已,它的功能是利用一种映射机制将虚拟地址空间映射到物理地址空间,所以,创建4GB虚拟地址空间其实并不是要真的创建空间,只是要创建那种映射机制所需要的数据结构而已,这种数据结构就是页目和页表。

当创建完虚拟地址空间所需要的数据结构后,进程开始读取PE文件的第一页。在PE文件的第一页包含了PE文件头和段表等信息,进程根据文件头和段表等信息,将PE文件中所有的段一一映射到虚拟地址空间中相应的页 (PE文件中的段的长度都是页长的整数倍。这时 PE 文件的真正指令和数据还没有被装入内存中,操作系统只是根据PE文件的头部等信息建立了PE文件和进程虚拟地址空间中页的映射关系而已。当CPU要访问程序中用到的某个虚拟地址时,当CPU发现该地址并没有相相关联的物理地址时,CPU认为该虚拟地址所在的页面是个空页面,CPU会认为这是个页错误 (Page Fault) ,CPU也就知道了操作系统还未给该PE页面分配内存,CPU会将控制权交还给操作系统。操作系统于是为该PE页面在物理空间中分配一个页面,然后再将这个物理页面与虚拟空间中的虚拟页面映射起来,然后将控制权再还给进程,进程从刚才发生页错误的位置重新开始执行。由于此时已为PE文件的那个页面分配了内存,所以就不会发生页错误了。随着程序的执行,页错误会不断地产生,操作系统也会为进程分配相应的物理页面来满足进程执行的需求。

分页方法的核心思想就是当可执行文件执行到第x页时,就为第x页分配一个内存页y,然后再将这个内存页添加到进程虚拟地址空间的映射表中,这个映射表就相当于一个y=f(x)函数。应用程序通过这个映射表就可以访问到x页关联的y页了。

总结:

32位的CPU的寻址空间是4G,所以虚拟内存的最大值为4G,windows操作系统把这4G分成2部分,2G的用户空间和2G的系统空间,系统空间是各个进程所共享的,他存放的是操作系统及一些内核对象等,而用户空间是分配给各个进程使用的,用户空间包括用:程序代码和数据,,共享库,栈。

分类: 标签: 内存 

巧用路由器QoS功能外加修改无线网频段解决网游延迟过大的情况

十二月 23rd, 2013 227 次阅读 0 条评论

起因:家里用的是ADSL拨号上网,大概一两个月前开始,玩Dota、Dota2延迟动辄成百上千ms,我和室友叫苦不迭。因为是3个人共享上网,连接的设备有笔记本、手机、ipad等等,加起来有8、9个。感觉上应该是局域网里有人用P2P之类的下载软件,但是观察了一段时间以后发现,即使没有人用P2P类的软件,也经常出现很大的延迟,于是开始了对网络延迟的调查,誓要找出“真凶”。

一开始每次遇到延迟很大的情况,都是直接重启重启路由器,重启以后就会管用几分钟,然后又会变得巨慢。后来慢到直接是网页打开要好久,连接路由器的管理页面也变的很慢。路由器型号是tp-link的wrt841nv8,本身的固件功能非常有限,很难查到是什么原因导致变慢,于是打算刷成dd-wrt,然后再查。无奈发现这一款路由器的v8版本,也就是现在用的,是同型号里面专门针对中国的定制版,ram的大小被从32m缩水到只有16m,刷不了dd-wrt,只能通过硬件改造才有可能刷,坑爹啊!跟室友讨论了以后决定换路由器,主要还是因为这款的ram太小,怀疑是因为内存耗尽而变慢。

于是欢天喜地换上了Asus的RT-N16,具有128m的大内存,而且该款路由器对dd-wrt的支持也非常好,所以才选了它。刚换上的时候,玩游戏延迟依旧比较大,于是又郁闷了。排查各种原因,发现白天人少的时候打开路由器管理页面很快,晚上人多的时候打开的很慢,猜测是受到了其他wifi的信号干扰,先不管是不是,换个Channel再说,结果果然大有改善,路由器管理页面可以很快打开了。看来确实是有无线信号干扰这个问题,观察周围可以搜到的无线AP大概有10几个。

不过郁闷的是,玩网游还是动不动会出现比较大的延迟,这种情况一般是家里3个人都在上网的时候才出现,所以不排除是带宽占用的问题。这个路由器固件比较好的一点,就是自带网络带宽占用的实时曲线图。可以看到比较卡的时候一般上传带宽都达到了50kB/s左右,而下载带宽并不高。因为ADSL的非对称性,上传带宽一般比较小,通常是只有512kbs,也就是60kB/s左右,难道是上传带宽被占满了,导致游戏的数据包发不出去?

小试了下用Asus RT-N16本身的QoS功能,可惜效果不大。最终,一筹莫展的情况下把路由器刷成了dd-wrt。dd-wrt用上以后,感觉比原厂固件效果要好些,ping路由器都是1ms左右,ping baidu正常情况下50~70ms左右,但是有时莫名其妙会到500~1000ms。到这时我才发现ping的nb之处,简直是检查网络状况的利器啊!如果是ping路由器比较高,肯定是无线信号干扰,只要换个频道,ping值就降下来了;如果是ping baidu比较高,就是带宽占用的问题,就需要看上传带宽是不是被占满了。后来尝试了下用qq邮箱发大邮件,占用上传带宽,果然ping baidu的值就上去了,室友也开始抱怨游戏卡,于是验证了上传带被占满才是导致网游卡的“真凶”!(其实无线信号干扰也是帮凶之一)由此猜测,运营商那边限制上传带宽是采用队列的方式,超过50k以后,后面的数据包就被放入队列中,需要等前面的处理完,因此就变得很慢。

最后,用dd-wrt的QoS功能,把游戏的数据包优先级调高,然后设置网络的Uplink和Downlink带宽,之前QoS一直不管用的原因原来是Uplink的带宽设的太高了,设成了400kbps以上,这次设成256kbps,问题彻底解决,不管怎么上传,ping baidu的值一直是50ms~100ms,游戏也不卡了。此前只要有上传ping值就会到500ms以上。看来QoS这里的Uplink带宽要往低处设,设到50%至少是没问题的,更高还没试,回头可以试试,但是不能超过80%,不然就会卡。

备注:路由器的QoS功能里面设置Uplink可以保证向运营商发送的数据量不会超过上传带宽,如果超过,就会出现拥塞、延迟,而QoS里面具体的规则可以保证我们指定的服务处于高优先级,因此在限制数据量的同时保证我们的高优先级服务畅行无阻。

分类: 标签: 路由器  QoS  网络延迟 

性能检测工具nmon在SecureCRT下乱码问题一则

十一月 6th, 2013 232 次阅读 0 条评论

今天在SecureCRT下连到远程服务器做性能测试,用nmon的interactive模式(即直接运行)总是会把制表符显示为一串乱码,整个排版看上去很乱,看不清里面的内容。

在网上搜了一下,有人说putty下是正常的,于是猜测应该是字体编码或者终端类型的问题,putty用的应该是vt100中断,SecureCRT的默认一般是ANSI或者Linux,尝试把SecureCRT终端类型设为vt100以后(Session Options--Terminal--Emulation--Terminal),重新连接Session,一切正常。

分类: 标签: SecureCRT  nmon 

Linux查看系统CPU、内存等系统信息的指令

十一月 6th, 2013 183 次阅读 0 条评论

系统

# uname -a               # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue   # 查看操作系统版本
# cat /proc/cpuinfo      # 查看CPU信息
# hostname               # 查看计算机名
# lspci -tv              # 列出所有PCI设备
# lsusb -tv              # 列出所有USB设备
# lsmod                  # 列出加载的内核模块
# env                    # 查看环境变量

资源

# free -m                # 查看内存使用量和交换区使用量
# df -h                  # 查看各分区使用情况
# du -sh <目录名>        # 查看指定目录的大小
# grep MemTotal /proc/meminfo   # 查看内存总量
# grep MemFree /proc/meminfo    # 查看空闲内存量
# uptime                 # 查看系统运行时间、用户数、负载
# cat /proc/loadavg      # 查看系统负载

磁盘和分区

# mount | column -t      # 查看挂接的分区状态
# fdisk -l               # 查看所有分区
# swapon -s              # 查看所有交换分区
# hdparm -i /dev/hda     # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE       # 查看启动时IDE设备检测状况

网络

# ifconfig               # 查看所有网络接口的属性
# iptables -L            # 查看防火墙设置
# route -n               # 查看路由表
# netstat -lntp          # 查看所有监听端口
# netstat -antp          # 查看所有已经建立的连接
# netstat -s             # 查看网络统计信息

进程

# ps -ef                 # 查看所有进程
# top                    # 实时显示进程状态

用户

# w                      # 查看活动用户
# id <用户名>            # 查看指定用户信息
# last                   # 查看用户登录日志
# cut -d: -f1 /etc/passwd   # 查看系统所有用户
# cut -d: -f1 /etc/group    # 查看系统所有组
# crontab -l             # 查看当前用户的计划任务

服务

# chkconfig --list       # 列出所有系统服务
# chkconfig --list | grep on    # 列出所有启动的系统服务

程序

# rpm -qa                # 查看所有安装的软件包
分类: 标签: Linux 

Crontab执行任务失败故障排除一例

八月 7th, 2013 276 次阅读 0 条评论

这两天在使用crontab执行脚本的时候发现,在shell下可以正常执行的脚本,到了crontab下怎么也无法正常执行。经过一天多查找原因,最终总结出两点:

1. crontab与shell运行环境不一样,最常见的导致失败的原因就是PATH变量不一致,网上说在脚本里面添加一行source ~/.profile(或者再加上source ~/.bashrc)可以解决问题,但是我试过不行,PATH里面还是少路径,最后只好吧shell下面的PATH原封不动的拷贝过来,在脚本开头设置一下PATH。

这样一来貌似是可以正常运行了,但是死活打印不出日志来。我之前在shell下运行的脚本是这样的:

nohup python2.7 manage.py celery worker -l info> worker_log.txt &

最终看了nohup的manpage发现:

2. nohup在shell下运行的时候会自动把stderr重定向到stdout,而在cron job中运行的时候不会重定向。因此脚本里只把stdout重定向到worker_log.txt是不够的,还需要加上2>&1,把stderr一并重定向过去。之前没有打印日志就是因为脚本的运行结果都是在stderr中,而shell下运行的时候被nohup自动重定向了。

到这里,我只想说,nohup真是坑爹啊!

 

分类: 标签:  

朱利安·阿桑奇系列访问:《明日的世界》

四月 21st, 2012 681 次阅读 0 条评论

The world tomorrow系列是由朱利安·阿桑奇主持的采访节目,包括十二段采访,第一集于2012.4.17在网上发布。节目延续了WikiLeak一贯的风格,将秘密公开于世,所有的访问都是秘密进行的,并且可以看到这次也是受到了众多追随者的拥护,可见各国政府和安全机构仍然拿这位高调而桀骜不训的自由主义战士没有办法。节目制作的目的是要从与正规媒体不同的角度,揭露不同的观点和事实,给政治家,改革者提供改善世界的想法。

“The World Tomorrow” is a dynamic new television discussion series featuring Julian Assange as host. It is a collection of twelve interviews featuring an eclectic range of guests, who are stamping their mark on the future: politicians, revolutionaries, intellectuals, artists and visionaries. -- "Offical Site"

(以下内容需要翻墙才能访问)

http://worldtomorrow.wikileaks.org

分类: 标签: WikiLeak 

【转载】好站: SQL Injection/XSS Cheat Sheet

二月 7th, 2012 830 次阅读 0 条评论

看到一篇文章里面不少有用的资料,本着拿来主义的精神转载如下:

最近很流行 Cheat Sheet, 把一些常用該知道的東西整理好的小抄(或許也可以說是懶人包?), 印出來立在桌邊, 不過印超過兩張就發現桌子沒地方放, 好像也蠻頭大的.. XD

今天正巧看到一篇不同於其它 Cheat Sheet 的文章: SQL Injection Cheat Sheet,這篇文章把常用的 SQL Injection的方法都列出來, 來看 SQL Injection 的危險程度(針對 MySQL, SQL Server, PostgreSQL, Oracle... 等).

不曉得 SQL Injection 是什麼, 可以看 M$ 的解說:SQL Injection (資料隱碼) - 駭客的 SQL填空遊戲及應用... XD

 順手整理 Cheat Sheet:

  • Cheat Sheets
  •  - 多種程式語言 Cheat Sheet, 輸出格式統一,印出來也很漂亮

  • XSS 筆記
  •  - 上面英文的不想看, 就看這個好了.. XD

既然都有了 SQL Injection, 那當然也得要有 XSS, 先看一些做法及說明:

PHP 少用 PHP_SELF, 或最好別用 PHP_SELF, 可看下述討論:

不過要防範也不是那麼困難, 總之, 沒有處理過的字串, 要轉成 HTML 輸出前, 要先經過 htmlentities/htmlspecialchars 處理就可以了.

總結: XSS 就是只要能在你頁面 Alert JS, 就能幹很多壞事(之前有寫一些 Demo Code,改天找到再放出來), 再來一樣是 Cheat Sheet 如下(壞人就是這樣子玩你的站的)...

PS: 網路上很多壞人呀~~ 很危險的~... XD

原文地址:http://blog.longwin.com.tw/2007/03/xss_sql_injection_cheat_sheet_20070317/

分类: 标签: Cheatsheet