初学Perl的感受之数据类型
Perl中四种基本数据类型(就我目前所知):标量、数组、列表、哈希。
标量应该是Perl中的原子数据结构,对程序员来说不能再分解了,类似C语言中的int、double。对于标量,我有以下看法:
“标量”这个名字很奇怪,有一种很“物理”、很“数学”的感觉,而且让初学者以为一定还有个叫“矢量”的数据类型。而实际上,标量就是一种普通的数据类型(有数学概念,跟物理没有什么关系),Perl中没有叫做“矢量”或者“向量”的基本数据类型。真不知道,当初Larry是怎么想的,会起这个名字。
标量包括数值量和字符串,两者会在需要的时候相互转换。如$v1 + $v2时,两个标量自动转换为数值量。转换过程自动进行,不用显示说明,暂时不知道有没有显示转换的语法。转换过程有一定的规则,比如$v1是“world”,那个$v1转化为0,当然不止这一条规则。如果是$v1.$v2,则是字符串拼接了,这里面的转换很好理解。很多时候不许要考虑是数值量还是字符串,因为大多数时候是在处理字符串,需要处理数值量的时候,Perl会自动做很多事情。
对于数值量的标量。Perl不区分是整型还是浮点数,Perl都按照浮点数做内部存储和数值计算,需要的时候(比如做数组索引$array[$index]),Perl内部会做一定的转换,但对程序员不可见和不可控,实际上也不需要。Perl在数值量上的这样的设计,也决定了Perl不适合用于大量数值计算的程序(通过模块等外部手段加速计算,不属于我谈论的范围),Perl本身就是为了处理文本而诞生的,在这种使用场景下,把数值量抽象和弱化,集中精力到字符串上,我喜欢这种专注!
数组和列表,我目前还没想通二者同时存在的必要,或者说二者的区别。我看的书是《Perl语言入门第四版》,网上一个不到2M、200多页的PDF文档。这本书在讲了列表以后,基本上就只有列表了,不见$xxx[$i]的代码了。我暂时就把数组给忘了,记住列表吧。
哈希和其他语言中的“字典”(Python)或“map”(Golang)是一个概念。Larry把这种数据结构叫做哈希,是因为其内部实现使用了哈希表。想到“标量”,又是一个奇怪的命名!有时候通用的东西叫个常用的名字,和人家交流起来也方便啊。在其他时候,我们说哈希,是指和安全、加密相关的一种技术、一种算法、一种函数、一种特殊的字符串!叫哈希表也好啊。这些大师的想法有时候就是与众不同,作为Perl用户,你必须接受哈希。
这四种数据类型,位于不同的名字空间,在变量命名上使用不同的前缀(标量$、列表@、哈希%),所以可以使用相同的名字,而互不影响。举下面这个例子:
#!/usr/bin/perl
$v="hello world";
$v[0]="hello";
$v[1]="hello world";
@v = qw/hello world/;
%v = qw/hello world hi planet/;
print "\$v=$v\n";
print "\$v[0]=$v[0] \$v[1]=$v[1]\n";
print "\@v=@v\n";
print "\@v[0]=@v[0] \@v[1]=@v[1]\n";
print "$_ in \@v\n" for @v;
print "$_ => $v{$_} in %v\n" for keys %v;
输出结果是:
$v=hello world
$v[0]=hello $v[1]=world
@v=hello world
@v[0]=hello @v[1]=world
hello in @v
world in @v
hi => planet in %v
hello => world in %v
Perl有一条设计原则是不给程序员多余的限制。从上面的程序可以看出,变量命名确实够*的,《Perl语言入门》的作者推荐程序员不要采取上面代码中的做法,这样会给程序的维护带来不便。其实我认为,因为四种数据类型内部实现是位于不同的名字空间,所以不会出现重名的问题,如果不允许不同类型的变量有相同变量名,则需要专门的检查,在某种可能的实现方式下,这反倒会增加额外的编码工作,所以不做重名检查或许是种偷懒。在其他语言中,至今未见过有类似的语法规则的。Perl中的这一条“*”应该考虑废止。
总体看来Perl中数据类型和Shell有很多共同之处,特别是标量,毕竟Perl一开始是在Unix上工作的。Perl这套数据类型体系对于PHP的影响比较大,PHP中进一步简化,变量类型进一步弱化,变量前缀都是$,数组、列表和哈希也都合并为PHP中的array。这个$符号我感觉也是多余的,像Ruby(Perl对其也有一定的影响)中变量前就不存在这种符号了。
High CPU Dump收集工具 - ProcDump使用方法
2013-05-05 10:51 by 微软互联网开发支持, 214 阅读, 1 评论, 收藏, 编辑工具介绍
ProcDump是System Internal提供的一个专门用来监测程序CPU高使用率从而生成进程dump文件的工具。ProcDump可以根据系统的CPU使用率或者指定的性能计数器来针对特定进程生成一系列的dump文件,以便调试者对事故原因进行分析。
下载地址
http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx
使用方法
命令行
procdump [-64] [[-c CPU usage] [-u] [-s seconds]] [-n exceeds] [-e [1 [-b] [-f filter] [-g]]] [-h] [-l] [-m commit usage] [-ma | -mp] [-o] [-p counter threshold] [-r] [-t] [-d <callback DLL>] <[-w] <process name or PID> [dump file] | -i <dump file> |-x <dump file> <image file> [arguments]> [-? [ -e]]
实例
procdump -c 70 -s 5 -ma -n 3 w3wp
当系统CPU使用率持续5秒超过70%时,连续抓3个full dump。
Procdump outlook -p "\Processor(_Total)\% Processor Time" 80
当系统CPU使用率超过80%,抓取outlook进程的mini dump。
procdump -ma outlook -p "\Process(Outlook)\Handle Count" 10000
当outlook进程handle数超过10000时抓取full dump
procdump -ma 4572
直接生成进程号位4572的full dump。
运行效果
以下是通过一个测试页面在w3wp进程中造成high cpu时运行ProcDump命令的效果。可以看到在系统CPU每次持续5秒达到70%后就会生成相应的dump文件。
注意
- Procdump需要进程已经启动,并且中途不能停止。比如需要抓取IIS Worker Process的High CPU Dump,由于IIS Worker Process默认会配置Idle Timeout = 20 min,即该进程在20分钟内没有任何请求的话就会自动结束,这种情况下ProcDump也会自动结束。需要重新运行命令。因此如果目标程序存在这样的配置,需要暂时将该配置取消。
- 有些系统管理员希望能够运行该工具后退出用户session,ProcDump是做不到的,如果有这种需求可以考虑使用debugdiag。
- 在调试High CPU问题的时候经常用到的一个命令是!runaway,但是有些时候!runway在ProcDump抓取的dump中提取不出来。解决的方法是将Debug Tools for Windows (windbg)安装目录下的dbghelp.dll拷贝到procdump目录下,然后再运行命令抓取dump。
0:000> !runaway ERROR: !runaway: extension exception 0x80004002.
"Unable to get thread times - dumps may not have time information"
走在vimer的路上
对编辑器一直没有太多的爱,自写代码以来,便很没节操地哪个方便用哪个。
从vs+va+vim,到source insight,subtext,甚至eclipse一路用来,所选无不是图形界面下的利器。
图的就是简单方便,不愿花太多时间在配置,插件等的鼓捣上,也因此一直理解不了为何有人偏爱于命令行、终端下的vi,vim,emacs,
觉得这些选择不过让人徒费更多时间在无谓的配置管理上面,并不明智。
不过这些是藏在心里的话,说出来是要挨骂的。
对我而言,这些都只是工具罢了。用不同的工具而产生优越感,简直无法理喻。
时间走到了2012,在一些无奈的现实面前,我开始倾向于在公司的服务器上写代码。
linux的桌面表现实话就是渣,这是无论我对linux有多敬仰都无法消除的成见。
编辑器的选择成了问题,还好选择也不多,那就vim吧,学习的成本最小了---我的意思是,这个玩意必竟用的久了,很多命令已经很熟,现在只是要用的更熟。
这个选择实无任何成见与派别歧视。
emacs ,vim都多少曾经用过,自我感觉两者并无不可替代的优点,退一步来讲,不过只是选择一个工具而已,用得着那么认真吗?
说到vim.
得吐吐槽,太折腾了,不亲自花几天的时间来整理一下配置,插件,单纯原生的vim根本无法在大工程上使用。
文件查找,符号搜索,智能提示完全无法与之前用过的编辑器相提并论。
用这样上古时代留下来的神器写代码,那感觉尼玛就像是从美好的共产主义社会回到了石器时代,简直让人崩溃。
尽管早有心理准备,但真用起来,那心情,那体验,完全就像终端命令行那黑乎乎冷冰冰的外表一样让人抗拒。
好吧,天下没有现成的午餐,vim的哲学嘛,大家引以为傲的,那就是拼装,折腾是必须的!
既然来了,就学会适应!不经过刻骨铭心的煎熬,就没有永恒的爱情!
vim,我来了!
西邮Linux小组免试题——继续挑战
上一篇博客(http://www.cnblogs.com/ma6174/archive/2013/05/04/3058889.html)发表后,西邮Linux小组发微信并且在博客上提示挑战还没有结束,这个提示:“对不起,你目前还没有通过任何一次面试.”和这次挑战没关系。看来是我理解错了,小组那边也疏忽了这个问题。还要继续挑战。
晚上看到@goodname大神的回复,说是图片可以解压,尝试了一下,7z e new.jpg
,奇迹出现了,提示输入密码,上文提到,我们已经获得密码了,输入密码:LinusTorvalds1969
,得到了一个文件:new.txt
!内容是StayHungryStayFoolish
,看来这就是进入下一关的密码了!!太神奇了,一张图片,竟然可以隐藏这么多的信息!真心佩服西邮Linux小组!
果断在微信上输入密码:StayHungryStayFoolish
,顺利进入下一关。
第四关
输入上面的密码之后,微信返回一张图片
分析
这个题看着像是找规律的,给你几个坐标点的值,让你算(-5,-5)
那个点的值。什么规律呢?我个人比较懒,规律都懒得找,让谷歌帮我找找吧,将上面的数字谷歌一下,点开第一个结果,就来到了这个网站:http://answers.yahoo.com/question/index?qid=20100308160117AAPQ1pp,这个网站上有人提问:
1 1 1 3 5 9 17 31 57 WHAT IS THE RULE FOR THE PATTERN?
I AM TRYING TO FIND THE RULE FOR THE PATTERN.
再回去审视一下那张图片,看到规律了吧?!简单描述一下就是从(0,0)
坐标开始,先向左,再向上,然后向右,向下,就是沿着数字增大的方向,正好是一个顺时针的螺旋线!再来看看数字有什么规律?万能的谷歌其实刚才已经告诉我们答案了,在打开的那个雅虎问答网站上,有人回答:3 previous digits equal the next one. 1+1+1=3 1+1+3=5 1+3+5=9 etc.
。懂了吧?就是说从第四个数开始每个数就是前三个数的和。感觉和斐波那契额数列差不多。写个递推或者递归程序很轻松就能解决。还有个问题比较关键,坐标(5,5)
那个点是第几个数?如果想不出来的话就在纸上画画,比如楼主这么笨的人就是在纸上画出来的。后来想明白了,不画也可以的,因为按照图片的环绕方法,只要绕到(5,5)
那个点,那么坐标绝对值小于5的点肯定是被绕到的,也就是说要算一个数,那么我们只需要算以(|5|,|5|)
为边界的正方形里面有多少点就是了。很明显,每行11个,总共11行,11×11=121,也就是算第121个数的值!python解决这种问题小菜一叠:
a = [1,1,1]
for i in range(3,121):
a.append(a[i-1]+a[i-2]+a[i-3])
print i,a[i]
这里使用了递推算法,因为递归层数太深,效率太低。通过这个程序算出,第121个数是:24948097296824045968731381433737
,真没想到竟然这么大!幸亏我用python这门语言,天生支持大整数,不然用C等程序再去处理大整数就费劲了!人生苦短,大家抓紧时间去学学python吧!
将这一长串数字输入到微信,然后顺利进入最后一关!
第五关
输入上面的数字之后,微信返回下面的信息:
[5/5]
IP:222.24.19.63
username:last
passwd:good_job
看这意思,应该是最后一关了,给你用户名和密码,让你去登陆,但问题来了,在浏览器上输入上面的IP,根本打不开,本机ping了一下,不通,然后又在站长工具上ping了一下,全部超时。然后又扫了一下那个IP的端口,什么都没扫出来。然后查了一下这个IP的归属地,结果:
查询的 IP:222.24.19.63 来自:陕西省西安市 邮电学院
GeoIP: Xian, China
China Education and Research Network
看来这是个教育网。我们学校的网站对外只开放80端口,也就是说外网只能访问服务器的80端口,内网没用限制,难道西邮也这样?这仅仅是一种猜测。或许题目设计者故意这么设计的,可能还需要一些特殊的方法才能访问到这台服务器。比如借助其他机器访问。
首先先扫扫222.24.19.0/24
这个网段吧: 这是2013年5月5日0点55分的扫描结果
$ nmap -sP 222.24.19.0/24
Starting Nmap 5.21 ( http://nmap.org ) at 2013-05-05 00:54 CST
Nmap scan report for 222.24.19.3
Host is up (0.073s latency).
Nmap scan report for 222.24.19.4
Host is up (0.088s latency).
...此处省略若干行...
Nmap scan report for 222.24.19.201
Host is up (0.072s latency).
Nmap scan report for 222.24.19.202
Host is up (0.087s latency).
Nmap done: 256 IP addresses (66 hosts up) scanned in 4.89 seconds
$
扫了一下,收获不小啊,这个网段内竟然有66台机器是开着的!半夜一点还开机,除了程序猿的电脑就是服务器了
(小码哥语录)!哈哈!66台,看来这应该是一个服务器的地址段,随便找几个看看。
打开最后那个222.24.19.202
一看,我差点笑出来!为什么呢?先看张截图,题目明天再做,下面这个更有趣。
正方教务系统!!这个还没啥可笑的,大家仔细看我圈出来的那块验证码,这里需要我们输入红色
的文字,除了谷歌的验证码,没见过比这还变态的!知道这变态验证码的来历吗?听小码哥慢慢道来~
记得去年冬天,我们Linux小组在一起讨论技术,聊到了教务管理系统。原来正方教务系统是没用验证码的,但是查询不太方便,关键是我们学校在校外几乎不能访问教务系统,寒暑假想查成绩那叫一个难啊!于是乎,我们Linux小组以拯救全人类的身份站出来了,一定要打通对外通道,要让校外的学生方便查成绩!由于我们的特殊网络环境,对外只能开放80端口,要帮助外界访问校内网站的话,不外乎有以下几种方式:
使用代理:原理很简单,就是我在外网不能访问正方系统,但是代理服务器能访问,我还能访问代理服务器,那么我们只要像代理服务器发送请求,然后代理服务器向正方系统发送请求,然后正方系统返回给代理服务器,然后代理服务器再返回给我们就OK了。代理可以使用ssh或者squid
使用VPN:通过连接学校的VPN服务器,我们就和学校的VPN服务器建立了一个虚拟专用网络(
Virtual Private Network
),也就是说我们的网络就和服务器在一个网段,也就是校内网啦,校内网访问正方肯定是没问题的,于是乎就能正常查成绩了。做一个新的网站,网站的功能就是获取用户的正方系统用户名和密码(好孩子从来不保存人家的密码),根据用户的需求,我们去正方系统模拟登陆,然后查询信息,再将有用的信息返回给用户。当然,这个新的网站必须是能快速访问到正方系统的。
分析了一下,使用代理和VPN都比较麻烦,对新手来说往往不知道怎么设置,但是网站就简单了,只要知道域名,打开浏览器就访问访问,简单,方便,还好扩充新功能。
于是,我联合@zhwei一起搞了个http://gotit.asia/正方教务系统查询网站。当初做这个网站的时候,功能很单一,就是同学输入自己的学号密码,选择查成绩或者查课表,然后我们就查出来了。那是相当方便啊!寒假放假前和寒假里,我们的网站迎来了访问小高峰,每天的访问量最少也要几千吧。(PS:北京时间:半夜两点整)
假期里,我们又增加了计算学分基点功能。但是好景不长,有一天zhwei突然给我打电话说网站出问题了,没法查询了,跑教务处网站一看,原来是教务处网站增加验证码了!估计是管理员发现教务处的异常,也就是大量访问来自同一个IP(仅仅是猜测),然后增加了这样的验证码:
上面的图像太小,放大一下看看
分析一下,我们可以看到这个验证码还是比较变态的,数字验证码,每个数字颜色不同,单个数字组成的像素点颜色也不同,还有大量干扰点,字体还这么小。
商量了一下,然后就开始和zhwei同学搞这个验证码,之间学了python图像处理相关知识,还有高级点的python模拟提交(就是有验证码),还有就是用firefox的firebug插件分析网络请求等知识。
经过一段时间的研究分析和测试,我们是这样的:首先是将验证码图像灰度图像,也就是黑白的,然后再降噪,删除干扰点,处理之后,大约能达到这样的效果:
上面的图片处理的就算是比较好了。然后再用ocr字符识别程序自动识别验证码。经过测试,识别正确率能达到百分之八九十,这就很好了,如果识别不成功,重新抓一张图片去识别,多抓几张,识别成功率就高了!哈哈。
至此,我们的查成绩网站就比教务处的网站有优势了:校外能登陆,不用输入验证码,查成绩课表考试时间等方便,还能自定计算学分基点,那叫一个好用啊!哈哈!访问量更是提高啊,最高一天5万PV!8000多独立访客!放一张网站的百度统计图炫耀一下:
后来我们又增加了四六级查询功能。但是好景不长,终于有一天,又接到了@zhwei的电话,说,网站有不能用了,快去看看正方系统吧!打开一看,就像前面看到那张西邮的正方系统截图一样,验证码成中文了,但是,我们学校的验证码比西邮的还变态,因为西邮的大部分汉字我们还是认识的,我们学校的字好多都是生僻字,都不认识!大学白上了!汗~
还要想法解决中文验证码问题啊!打算用原来那种方式,简单处理后交给OCR去识别,但是OCR在识别中文的时候就不是那么给力了,识别率低得惨不忍睹!这么多汉字,我们不可能去手工建字模识别,干脆直接让用户去识别吧!
由于网站只让输入红色的汉字,那我们就过滤一下呗,把不是红色的汉字过滤掉,让用户方便识别和输入。
但是新的难题又来了,因为验证码刷新之后每次都会变,那么如何将正方系统的验证码放到我们的网站上还能保证验证码不过期呢?经过一番研究之后,发现下面的方法可行:
用户访问我们的gotit查成绩网站,我们在后台首先访问一次正方网站,记录cookies和viewstate等信息,然后用这个cookies去请求验证码,抓取下来之后,将图片显示给用户,当然包含这个验证码和viewstate。我们将这些验证码和viewstate等信息保存下来,其实是把那个函数保存下来,这就是python里面的闭包。因为用户的请求是无连接的,我们如何区分用户输入的验证码是哪个验证码呢?把viewstate一块传递到前台,用户在输入用户名,密码还有验证码,点击提交的时候,viewstate一块传递到后台,然后我们后台就能根据viewstate来定位到原来的访问函数来继续访问!这样检索到成绩等信息后再返回。终于搞定了! 记得当时模拟这个过程的时候没有注意编码,正方是gb2312
的,我在linux下写python一直用utf-8
,怎么交都不行。后来还是@zhwei发现了这个问题才让我们实现登陆功能。
(PS:北京时间:半夜三点整)
啰啰嗦嗦一大堆,简单概括一下,就是:
正方没验证码 -> gotit网站能正常查成绩 ->
正方升级增加数字验证码 -> 我们的网站自动识别验证码登陆 ->
正方升级增加中文验证码 -> 我们处理中文验证码让用户输入然后登陆查成绩 ->
明天,不,今天我们学校还要举行第四届ACM校赛,我还要看场子去呢!二三百号人呢!今天就少扯点,第五关忙完了再搞。
顺便借博客园这个大圈子投投简历吧
本人山东理工大学计算机学院本科学生,专业是计算机科学与技术
,目前读大三
。
学院规定大四我们可以出去实习
或培训,也就四不用待在学校里面了,可以进行学分置换
。只要最后进行毕业答辩就行了。
所以我打算暑假还有大四找个公司去实习
。下面简单说说我的情况,希望大神们指点指点,或者给个去贵公司学习深造的机会
- 我的博客:http://www.cnblogs.com/ma6174/,这里主要是一些我的原创文章,学习笔记等
- 我的github:https://github.com/ma6174,熟悉
git
版本控制 - 我的麦库记事:麦库记事链接,一些我浏览过的文章保存下来,方便大家学习,也方便我日后查找。
- 喜欢摄影:http://ma6174.lofter.com/
- 对
python
和Linux
极度热爱,Linux使用两年多了,python学习有一年多了,上文提到的gotit网站就是用python写的,部署在Linux服务器上 - 做过
ACM
,对基本算法
还是有一定了解的,也获得过一些奖 - 大二加入学校Linux小组,开始维护学校的
服务器
,包括windows和Linux服务器,对apache,nginx,mysql,squid,memcached,php等有一定了解 - 在ACM协会担任技术部部长兼副会长,2012年在我们学校举办的山东省ACM程序设计竞赛,我做全程
技术支持
,包括网络搭建,服务器搭建,客户端机器(全部Linux)配置,PC2配置等。在两届ACM校赛中担任技术支持,曾获得“社团工作先进个人
”称号 - 学习成绩基本都过关,没有挂科现象,曾获得省奖学金和班级奖学金等
- 对嵌入式有一定了解,喜欢
树莓派
,曾经在《移动信息》
杂志发表树莓派的的文章:http://www.mispace.cn/?action-viewnews-itemid-167240 - 对C/C++/JAVA/等编程语言有些了解,熟悉python
- 做过一些项目:Linux下的ACM在线测评系统评测程序,树莓派在线点歌系统,操作系统词汇在线测评系统,gotit正方系统查询网站,答题卡识别程序等。
- 喜欢开源,搭建了山东理工大学第一个Ubuntu开源镜像站
- 四级过关,看外文文档无压力。正在组织同学
翻译
密歇根州立大学编程语言(python)入门课后作业翻译,希望能对国内教育有一定帮助https://github.com/ma6174/pythoncourse - 目前正在学习CCNA思科网络技术
- 喜欢vim
- 喜欢折腾
- 喜欢简单实用的东西,本文用markdown编写
- 其他:喜欢打乒乓球,跑步等
希望找一份python
,linux
的开发
或运维
的相关实习工作,如果您对我感兴趣的话可以给我留言,或者通过下面的联系方式联系我:
- 电子邮件:ma617495@gmail.com
- gtalk:ma617495@gmail.com
- QQ:674108687
谢谢!
博主ma6174对本博客文章(除转载的)享有版权,未经许可不得用于商业用途。转载请注明出处http://www.cnblogs.com/ma6174/
对文章有啥看法或建议,可以评论或发电子邮件到ma6174@163.com