山本ワールド
PerlでIntelサイトよりCPUIDを得る
ダウンロードURL
自作プログラムでCPUの種別・機能を判定したいので手始めにCPUID等をintelのsSpec Numberよりホームページから得るプログラムを作った。
玄箱標準状態のMonta Vista Linuxでテストした。
ダウンロードURL
http://processorfinder.intel.com/details.aspx?sspec=sSpec Number
上記の赤部分をSpec Number(たとえば Pentium 4 550J ならsl833)変えれば取得できる。
なお、ページの文字コードはutf-8なので注意。
プログラムの概要
- まず、wgetコマンドでホームページをダウンロードしカレントディレクトリへ保存する。
- その読み込んだホームページをds.plにリダイレクトし標準出力へCPUID等を出力する。
- 1~3.の手順をds.shというファイルに記述する。
- bash ss.sh スペックナンバー spec.txt で1個のsSpecに対するCPUID等をspec.txtに保存できる。
- sSpecの一覧表をintelの製品情報やサポート等から取得し 4の記述をaa.shに記述する。
- 漢字コードをUtf-8からShft-Jisに変換する。
nkf -Lw -W -s spec.txt > sj.txt
sl1833とsl684を取得する場合の、プログラムの階層は下記のような感じ bash aa.shを実行する
aa.sh | + bash ds.sh sl833 spec.txt | |+------------------- wget -O $1.htm http://processorfinder.intel.com/details.aspx?sspec=$1 | perl ss.pl < $1.htm >> $2 | + bash ds.sh sl684 spec.txt
all.sh
ほしいCPUの数だけ下記の行を繰り返して記述。
bash ss.sh sSpec Number spec.txt
ss.sh
1個のCPUのみの情報がほしい場合はss.shを実行すればよい。
wget -O $1.htm http://processorfinder.intel.com/details.aspx?sspec=$1
perl ss.pl < $1.htm >> $2
ss.pl
はじめた書いたPerlプログラムなのでかなり無駄が多いような気がする。
#! /usr/local/bin/perl
# インテルのページよりCPUスペックを抽出する
$t = 0;
$p = 0;
$tn=0;
$sn=0;
$pn=0;
while(<STDIN>){
if($t == 1){
if(/^.*>/){
$t=0;
s/^.*>//g;
}
}
if(/<span id="ctl00_PSFContentPlaceholder_lblProcessorName" class="pageheader" style="display:inline-block;">/){
$p=1;
}
s/<.*?>//g; # 1行に収まっているタグを消す
if(/<.*$/){ # <が見つかった場合、行の最後まで消す
$t=1;
}else{
s/How Do I Use This Tool\?//g;
s/http:.*$//g;
if(/Home > Processor Spec Finder Home > sSpec Details/){
s/Home > Processor Spec Finder Home > sSpec Details//g;
}
if(/Processor Specifications:/){
$p=2;
s/Processor Specifications://g;
}
if(/Package Type:/){
$p=3;
}
if(/Product Order Codes:/){
$p=4;
s/Product Order Codes://g;
}
if(/Supported Features:/){
$p=5;
s/Supported Features://g;
}
if(/Notes:/){
$p=0;
s/Notes://g;
}
if($p >= 1){
s/^\s*//g;
$nn=$_;
if($nn ne ""){
if($p == 1){
s/\r\n//g;
$cpu_name=$_;
$p=0;
}
if(2<=$p && $p <=4){
if(/:/){
s/://g;
s/\r\n//g;
$titles[$tn++]=$_;
}else{
s/\r\n//g;
$ss[$sn++]=$_;
}
}
if(5==$p){
s/\r\n//g;
if($_ =~ /\D/){
$pp[$pn++]=$_;
}
}
}
}
}
}
$n=0;
if($1 eq "-l"){
print "CPU,$cpu_name\n";
while($n < $tn && $n < $sn){
print "$titles[$n],$ss[$n]\n";
++$n;
}
foreach $tt (@pp){
print "Supported Features,$tt\n";
}
}else{
print "\"$cpu_name\",";
while($n < $tn && $n < $sn){
print "\"$ss[$n]\",";
++$n;
}
foreach $tt (@pp){
print "\"$tt\",";
}
print "\n";
}
Copyright (C) 2012 山本ワールド All Rights Reserved.