搬家~
-
最新日志
最新评论
- zhkza99c 发表于《留言板》
- zhkza99c 发表于《使用perl进行系统性能采集(WMI)》
- 大猫 发表于《留言板》
- zhkza99c 发表于《留言板》
- 大猫 发表于《留言板》
存档页
分类
功能
访问WMI的COM接口需要Win32::OLE这个package
(如果是在windows平台下安装ActivePerl套件的话,则默认安装了这个package)
调用Win32::OLE->GetObjetct,传递参数为winmgmts://./root/cimv2
winmgmts:// 表示访问WMI服务
.//root/cimv2表示访问本地主机的/root/cimv2名称空间(namespace)
【注】经测试,这里不指定名称空间也可以,结果是一样的。
$wmi = Win32::OLE->GetObject(“winmgmts://./root/cimv2”);
之后需要取得相应COM类的实例,假设要获取CPU的名称,则
$inst = $wmi->InstanceOf(“Win32_Processor”);
这里的Win32_Processor是WMI namespace中的一个COM类,这个类包含了CPU一些相关的信息
(关于哪些COM类包含哪些属性,具体需要参考WMI官方文档)
得到实例后,还需要进行一步操作:
@hash = Win32::OLE::in $inst;
in将返回该实例的所有成员和成员的所有属性
例如,这里我们之前得到了关于CPU的实例 $inst,in 操作之后,将根据主机中含有的CPU个数(物理上的)来决定@hash这个数组中的成员个数。
也就是说如果当前主机(运行脚本的主机)有4个物理CPU,那么这里@hash这个数组的长度即为4,含有4个成员。
【注】 这里的数组命名为hash,是因为数组中每个成员都是一个hash的reference(哈希表的引用)
@hash有可能长度大于1,这样需要用循环来遍历,取出所有成员相应的属性,这里我们取CPU的Name
foreach (@hash)
{
print $_->{Name};
}
即可打印出每个物理CPU的名称,在本机运行结果如下:
![]()
为明显起见,对@hash取length,得到1,也就说在当前计算机中只有一个物理CPU,名称如上图所示。
不单单是CPU,所有的设备包括内存,硬盘,网络接口,进程等等信息都可以通过以上几个步骤,用相似的方法取出其属性。
但如果想找到采集参数对应的COM类和属性的话,还是需要进一步参考WMI的文档(在WMI Classes一节中)
地址:http://msdn.microsoft.com/en-us/library/aa394572(VS.85).aspx
[题目4-8]
The functions pushd and popd implement a stack of directories that enable you to move to another directory temporarily and have the shell remember where you were. Implement them as shell functions.
实现pushd和popd函数
[解答]
DIR_STACK="" # stack定义
export DIR_STACK # 输出到环境变量
function pushd
{
dirname=$1
DIR_STACK="$dirname ${DIR_STACK:-$PWD' '}" # 将新目录附加到栈顶,若栈空,则先压入当前目录
cd ${dirname
"missing directory name."} # 进入目录,无参数则报错退出
echo "$DIR_STACK" # 打印当前栈
}
function popd
{
DIR_STACK=${DIRSTACK#* } # 首段删除一个目录(目录间以空格分隔)
cd ${DIR_STACK%% *} # 进入下一个目录(尾端多次删除,取栈顶的目录)
echo "$PWD" # 打印当前目录
}
[题目4-5]
The file used in Task 4-1 is actually a report derived from a bigger table of data about albums. This table consists of several columns, or fields, to which a user refers by names like "artist," "title," "year," etc. The columns are separated by vertical bars (|, the same as the UNIX pipe character). To deal with individual columns in the table, field names need to be converted to field numbers.Suppose there is a shell function called getfield that takes the field name as argument and writes the corresponding field (or column) number on the standard output. Use this routine to help extract a column from the data table.
Task4-1扩展,album数据文件含有许多列如作者,题目,年代等等,每一项数据以 | 分隔。 想处理数据的话,需要将列名转化为列数。假设这里有一个函数 getfiled用来将列名转换为列数,请用这个函数帮助你提取数据表中的某一列。
[解答]
#! /bin/bash
fieldname=$1
cut -f$(getfield $fieldname) -d\| album
[题目4-6]
Send a mail message to everyone who is currently logged in.
给当前系统中登录的每一个人发一封邮件。
[解答]
mail $(who | cut -f1 -d' ')
[题目4-7]
The ls command gives you pattern-matching capability with wildcards, but it doesn't allow you to select files by modification date. Devise a mechanism that lets you do this.
ls命令允许使用通配符进行匹配查询,但是它不支持通过修改日期查询。设计一种机制可以让你按修改日期查询。
[解答]
function lsd
{
date=${1
'no date found'}
ls -l | grep -i "$date"
}
[题目4-2]
You are writing a graphics file conversion utility for use in creating a web page. You want to be able to take a PCX file and convert it to a JPEG file for use on the web page.[7]
你准备写一个图形文件转换工具,用来制作网页。你想把PCX格式的文件转换为可以在网页上显示的JPEG文件。
[解答]
#字符串尾部模式替换
outfile=${infile%@(.pcx|.PCX)}.jpg
#截图如下

[题目4-3]
You are implementing a filter that prepares a text file for printer output. You want to put the file's name without any directory prefix on the "banner" page. Assume that, in your script, you have the pathname of the file to be printed stored in the variable pathname.
将一个完整路径名缩短为只剩文件名(pathname to basename)
[解答]
basename=${pathname##*/}
#截图如下

[题目4-4]
The directories in PATH can be hard to distinguish when printed out as one line with colon delimiters. You want a simple way to display them, one to a line.
打印出环境变量PATH中的目录时,所有目录显示在一整行中并且是以冒号区分的。现在你想一行显示一个目录。
[解答]
echo -e ${PATH//:/'\n'} # -e 让echo开启转义字符
#截图如下


[题目]
You have a large album collection, and you want to write some software to keep track of it. Assume that you have a file of data on how many albums you have by each artist. Lines in the file look like this:
你有一本大型画册,并且你想写一些软件来统计管理它。假设这个画册有一个数据文件,上面有每位画家的作品数目,文件格式如下:
5 Depeche Mode
2 Split Enz
3 Simple Minds
1 Vivaldi, Antonio
Write a program that prints the N highest lines, i.e., the N artists by whom you have the most albums. The default for N should be 10. The program should take one argument for the name of the input file and an optional second argument for how many lines to print.
写一个程序,打印出你所拥有作品数量最多的前N个画家及其作品数 ,N的默认值为10。这个程序的第一个参数应当是数据文件的名称,第二个参数(可选参数)指定打印多少行信息(指定N)
[思考]
(1)数据文件不一定有序,需要排序
使用sort,对文件中每行数据进行排序,参数选用 -n 以数字为序,-r 逆序排列
(2)打印文件信息时需要截取
使用head,截取输出的起始部分,参数选用 -n 来指定截取的行数
(3)默认值 N=10
将第二参数作默认值处理 ${2:-10},即如果没有指定第二个参数直接指定其值为10(这里不能用${2:=10},因为$2有可能不存在)
[解答]
建立task4-1.sh文件,脚本如下:
#! /bin/bash
file=${1
"no file found"}
howmany=${2:-10}
echo
echo "============"
echo "top $howmany :"
sort -nr $file | head -n $howmany
echo "finished"
echo "============"
echo
运行过程如截图所示
(1)“内功”要学好。不要只是去学各种语言、工具,和一些三流公司招聘列出来的要求。要把数据结构、算法(algorithms, not numerical analysis)、数据库、操作系统原理、计算机结构、离散数学等课程学好。如果你可以做出Donald Knuth的Art of Computer Programming里面大部分的题目,那就代表功力不错了。
现在很多同学都在学各种各样的语言,框架,追赶技术潮流,不是说这样不好,在大学期间接触更多的技术固然可以开拓视野,这的确是件好事,但是一定不要忘了在语言和工具背后有更重要的东西等待着你去学习。或许学习了很多语言和工具后会发现,仍然无法写出效率高且赏心悦目的程序。这时候就要想想是不是应该把更多的注意力放到这些“内功”科目上?看看《算法导论》,《深入理解计算机系统》等书绝对是大有裨益的。当然,没有语言的基础这些便也无从谈起,但应当始终记得,语言工具仅仅是“招式”,只有“内功”深厚才能够做到无论面对任何敌人都可以“无招胜有招”。
(2)多编程,最好大学四年有十万行编程的经验。
看书,动手,思考是学习的三个主要环节,缺少任一部分都会使最终的效果大打折扣。学习程序设计更是如此。根据我自己的亲身体会,看一个月的书却不实践甚至比不上自己coding两天学到的东西多。当然了,这话有点绝对。但只看书不动手是非常不可取的。许多同学问编程应该怎么学,答案只有三个字:“多动手”。代码量虽然不是评判一个人编程能力的标准,但它可以决定你对程序的驾驱程度有多熟练。再顶级的程序员也是在动手中一点点磨练起来。无他,唯手熟尔。
(3)讲究“实干”,不要不屑于编程或测试,每一个工作的每一个细节都要认真。
一百行有质量的程序也比五百行凌乱不堪的程序有价值。盲目追求代码量其实也是学习心态不踏实的结果。学技术搞技术应该实实在在,稳扎稳打。有的同学觉得链表很简单,不愿意写,只用脑子想。链表嘛,最简单的数据结构,还用写嘛?真写的时候要么无从下手,要么写出来一看,指针错误,内存泄漏一大堆……社会很浮躁,网络很浮躁,我们做技术的不能浮躁,眼高手低实在要不得。
(4)不要放弃数学,尤其如果你对一些需要数学的领域有兴趣(例如视频、语音、图像。。。)。
总感觉搞程序的分这么两种人,一种是数学超好英语较烂的;另一种是英语很棒数学却跟不上劲的。左右脑都很强大的人貌似比较少(如果你是,那恭喜你哈 o(∩_∩)o),自己不幸属于后一种,更不幸的是还很想搞游戏开发。后悔自己在高数,线代等课上不听课,埋头学了一大堆乱七八糟的技术。以至于现在看D3D的书籍,还要不断回头找各种数学公式定理。所以如果有同学立志于游戏或图形处理等领域的话,好好学数学,好好听课吧。数学的自学难度和别的学科可是不一样的,先放下自学的课外书籍吧,认真想一想时间成本就会明白哪个比较重要了。
(5)练习团队精神,与人合作。
道不同不相为谋。技术方向不同的同学可能交流上不会很多,但是仍然建议大家能够多多的与别人合作。尝试建立开发小组,分工合作一个小项目,使用版本控制软件,体验下多人开发的感觉。个人英雄的时代已经过去了,软件开发不是一个人的战争,它需要团队共同的协作与努力。学技术其实是在与机器交流,团队合作则可以教会你如何与人交流,如何更好的表达自己。
(6)在不影响学业的前提下,寻找有真正有意义的暑期工作或打工。去一个公司在一个好的老板指导下作真正会被使用的程序,不要去一个要你做“头”的地方。打工和找工作一样,不要只看待遇和职衔,要挑一个你能够学习的环境,一个愿意培养员工的企业,一个重视你的专业的公司。最后,要挑一个好老板。”
真正的商业应用和校园里研究式的开发相距甚远,而不得不承认的是大学里的计算机教育又和实际需求脱轨。因此,在求学阶段快速提高自己实际能力的办法只有去做相关的兼职工作。在工作中去学习,当敲打那些”真正“的代码的时候,或许你会有不同的感受。选择工作大家都想去Microsoft,Google,IBM,但能去的毕竟是少数。我觉得,对公司的选择优先度应该是这样:能够不断学习提高自己 > 愿意培养员工重视员工 = 良好的企业文化和环境 = 公司待遇。 学习为先,其它一切次之。如果只想赚大钱的话,或许你不适合走技术这条路。
无意在网上看到李开复先生这些话(红色的六句话)很有感触,遗憾的是如果早些明白这些或许自己会在学习过程中少走一些弯路。在这里把以上内容写出来,希望能给还在为学习编程而苦恼的同学们些许帮助。
最后还是那句话,社会很浮躁,网络很浮躁,但请大家静下心来学技术。
学校里很多同学都在使用VC6,无论是学习C++还是做Windows的应用开发,合适的快捷键设置和颜色配置都是非常有帮助的。
【为什么要使用快捷键?】
用过Ctrl+C和Ctrl+V?那它是不是比点鼠标方便很多呢?……用VC6写代码的时候如果能够完全抛弃鼠标,coding的效率可以有相当大的提高(而且这也并不难做到)。不过想要达成这个目标,需要好好研究下它的快捷键;
【配置颜色有必要么?】
应该说,很有必要。合适的颜色配置可以让coding时代码书写的错误降低很多,而且比起默认VC6的颜色更加赏心悦目。下面是配置颜色完毕后的效果图:

关键字:“深蓝”
宏常量:“紫”
数字:“白色-青色”
自定义类型:“天蓝”
字符串常量:“红”
符号:“黄”
函数:“橙”
变量:“灰”
注释:“绿”
如此一来,各种信息一目了然,编译错误的出现率降低了很多。看着这种配色写程序感觉就是一种享受,难怪不懂代码的同学过来无意看到,都说很漂亮。。。= =|
【怎么配置快捷键和颜色?】
首先需要安装Visual Assist,它是VC的一个开发插件,功能非常强大(至于到底有多么强大,只有等同学们用过后才能体会了,网上有很多破解版,我使用的是Visual.Assist.X.10.4.1619.Crack)。之所以安装VA,是因为VC没有提供那么多颜色配置选项,但如果你不喜欢太复杂的配色方案并且也不需要VA提供的代码自动补全,智能跳转等功能的话,也可以不安装VA,只在Tools--Options--Format里面配置自己喜欢的颜色即可。

如果安装了VA,会在VC顶部出现一个ToolBar
![]()
第一项就是VA的设置选项,可以在里面设置更复杂的配色方案。

快捷键的设置更具有灵活性,因为它依赖于个人的使用习惯。大部分的设置都是在Tools--Customize--Keyboard里设置

这里附上我自己常用的快捷键设置和配色方案,解压后直接双击导入这两个注册表文件即可。(不包括VA设置的颜色,如有需要请在VA的设置选项里更改)
文件地址:http://www.cnitblog.com/Files/zhangsure/vc6_keyboard%20and%20format.rar
/**************************************************/
更改的快捷键说明:
SaveAll:Ctrl+Shift+S
ToggleWorkSpaceWindow:Alt+1 (数字1)
ToggleOutputWindow:Alt+2
ToggleWatchWindow:Alt+3
ToggleVariablesWindow:Alt+4
ActiveClassComboBox: Alt+Space
FindInFiles:Alt+F3
FullScreen:Ctrl+Enter
/**************************************************/
其它的快捷键基本上都保持默认设定。在coding的时候,多使用Ctrl+Shift+Left(Right),Shift+Up(Down),Shift+Home(End),Ctrl+L,Ctrl+F,Alt+G(在安装了VA后才起作用)会非常有帮助的。有兴趣的同学可以试试看。
在这里需要说的是,无论VC的配色再怎么好看,快捷键再怎么方便,没有良好的程序语言功底也是无法写出优秀的代码的,所以这个帖子仅仅是让VC能够更好的帮助大家,为coding而服务,而真正功力的提升还要靠各位同学平日的刻苦与努力。
PS:可能有的老师会反对装VA,因为它太强大以至于把刚入门的同学“引入歧途”。我也觉得刚学C++的同学们使用VC的时候不要装VA,这样可以多敲一些代码,培养coding的感觉,当进入Windows应用开发的时候(Win32API,MFC)再去装它也不迟。