2008/07/21(Mon)WindowsXPライセンスの判別

2008/07/21 00:25 Software::Windows
Windowsマシンのライセンスを調べる方法。
  • ラベルをキチンとつけずに散らかしていたWindows XPのセットアップCD、どれがどのライセンスの物だったかが分からなくなった時*1
  • コンピュータのOSライセンスを確認したい時*2
に便利です。

*1 : 自分でService PackをインストールCDに適用したものがいっぱいあったり…

*2 : ライセンス形態が色々のコンピュータがいっぱいあると、こういうことありませんか…

名前

製品版
リテール、FPPともいわれる
OEM版
DSP(ハードウェアと抱き合わせ販売)、SLP(System Locked Pre-installation; メーカー製PC)など
VL版
企業など大規模インストール向けのボリュームライセンス

稼働中のマシン

OEMかどうかの簡単な調べ方

[コントロールパネル]の[システム]でまずOEMかどうか分かる。
"使用者"の段の3段目。
2項目に注目。
?????-OEM-???????-?????のようになっていたらOEM、000ならRetail、640ならVL。

詳細な調べ方

レジストリエディタを起動して、HKEY_LOCAL_MACHINE\SYSTEM\Setup\Pid\Pidに書いてある値の下三桁に注目。
"270"ならVL、"000"ならRetail、"OEM"ならOEM。

セットアップメディア

\i386\setupp.iniを開き、中のPidを確認する。
下三桁が"270"ならVL、"000"ならRetail、"OEM"ならOEM。

一方ボリュームラベルでも判別できる。
"WXPFPP_JA"のようになっているが、_から左に3文字分を比較する。
FPPなら製品版、CCPならアップグレード版、OEMならOEM版、VOLならVL版。
また先頭1文字~3,4,5文字で、適用済みService Packもわかる。
WXPならSP無印、VRMPならSP2、GRTMPならSP3。
_の後ろは言うまでもなく言語ですね。

どうやら

Pidの先頭5桁の数字は製品ごとに違うようだ。
55383***:XP x86 製品版
55384***, 82503***:XP x86 アップグレード版?

日本語版と英語版とか…、HOME EditionとProfessional Editionとか、Upgradeかそうでないかとか……。
Vistaにこの法則が適用できるかは未確認です。

追記 Windows2003では 2009/01/17

使用している Windows Server 2003 の入手形態を確認する方法のKBを参照。

2008/07/17(Thu)Vistaでの証明書インポート時の注意

2008/07/17 13:47 Software::Windows
オレオレ証明書など、IEを立ち上げるたびに証明書の警告がうっとうしい場合は、信頼する証明書としてインポートしてしまえば良いのだが、Vista-IE7からはインポート手順がややこしくなっているので注意が必要である。

対象のサイトを開くと「このWebサイトのセキュリティ証明書には問題があります。」という警告が表示される状態から説明を始める。
  • 一旦全てのIEを終了し、IEを「管理者として実行...」する
cert_install_01.png

cert_install_02.png

  • 対象サイトを開くと、再び「このWebサイトのセキュリティ証明書には問題があります。」と文句を言われるが「このサイトの閲覧を続行する」を選ぶ
cert_install_03.png

  • アドレスバーがピンク赤色になっているので、「証明書のエラー」という部分をクリックし、「証明書の表示」を選ぶ
cert_install_04.png

  • 「証明書のインストール」をクリックする(管理者としてIEを実行しないとこのボタンが表示されない)
cert_install_05.png

  • 「証明書をすべて次のストアに配置する」を選び、「信頼されたルート証明機関」に切り替える*1
cert_install_06.png

cert_install_07.png

cert_install_08.png

  • 「次へ」「完了」をクリックする
cert_install_09.png

cert_install_10.png

  • 拇印(sha1)を確認後「はい」をクリックすると「正しくインポートされました。」が表示されるのを確認する
cert_install_11.png

cert_install_12.png

  • 管理権限のIEを終了し、一般権限で立ち上げ直す。
  • 対象サイトを開いた時、「このWebサイトのセキュリティ証明書には問題があります。」が表示されないこと、アドレスバーが赤色にならないことを確認する
cert_install_13.png

cert_install_14.png


なお、この方法では管理者権限が必要になるが、一旦証明書をファイルに落とせば不要?(未確認)
手順としては、一般権限で立ち上げているIEから「証明書の表示」をしたとき、「インストール」(表示されていない)ボタンの代わりに「ファイルへコピー」をクリックし、デフォルトの形式で.cerファイルに書き出し、それをダブルクリックしてインストールする。
この時もストア先を「信頼されたルート証明機関」に変更することをお忘れなく。

*1 : Vistaからはセキュリティ上の観点か、デフォルトがここにならなくなったようです。

2008/07/17(Thu)変数の展開の展開

2008/07/17 04:21 Languages::Perl
文字列処理にPerlほどすぐれた言語はない……と考えている今日この頃だが、ちょっとハマったので解決策をメモ。

やりたいこと

「何らかの処理の結果、ある文字列が得られたとする。その文字列と同じ名前の変数名を取得したい」

具体的には、リソースファイルに"この結果は$resultになります"のように埋め込んでおき、スクリプト実行時に変数$resultを代入して、"この結果は25になります"のように表示させたいわけだ。

今まで使っていた手法

リソースファイルをPerl化してしまってrequireすれば、同じ名前空間の変数で、すでに定義されているものは自動展開されるという仕様を使っていた。
埋め込む変数名ごとに正規表現で置換するような面倒な手法に比べると楽にできていたのだが、Perl化する手間とフォーマットが崩れるのが欠点。
拡張子がplになってしまうので*1、HTMLファイルのテンプレートを書いていたところで、vimなんかで読み込むとPerlの色づけしかしてくれなくて不便なのである。


実際どんな手順かというと、リソースファイルとして、
#!/usr/local/bin/perl

# requireされるとき自動展開するためにダブルクォートにしておく
$tmp = << "_EOM_";
この結果は$resultになります
_EOM_

# requireのため、1;は削除できない(結構面倒な仕様)
1;
という代入だけを行うスクリプトを別途用意し、
呼び出し側として、
#!/usr/local/bin/perl

$result = 5*5;
require 'resource.pl';
print $tmp;
のような手順を踏まなくてはいけない。自動展開されるとはいえ、結構めんどい。
また、$tmpや$resultという変数名は両ファイルで合わせておかなくてはならず、use strictとか付けると変数宣言の問題で面倒な事に。

*1 : そりゃ.htmlとか付けてもいいけど、中身perlだしね…不適切。

どうしたかというと

なんとか引数に指定した変数を展開できないかなぁと思って調べていたら、evalなんてコマンドがあった。
存在は知ってたけど、いまいち使いどころが分からなかったヤツ。

これを使うと実にスマートに書ける。
#!/usr/local/bin/perl

# シングルクォート囲みなのでこの時点では展開されないことに注意
$tmp = q|この結果は$resultになります|;
$result = 5*5;
$tmp =~ s/(\$\w+)/eval($1)/eg;
print $tmp.qq|\n|;
この書き方のポイントは、
  • $resultのような展開したい変数がいくつあっても動作すること
  • requireの必要がないこと = requireを使う場合の煩雑さがない
  • 展開する変数への代入を、読み込み後に行えること(requireの場合は、結果が先に分かってからrequireしないと代入されない)
  • (use strict環境下で小細工しなくても普通に動く)
注意として、↑のマッチングだと変数名のすぐ後に英数字が来ると誤爆するので、${result}のような形式のものだけ反応させるようにとか、適宜工夫することを推奨。

2008/07/11(Fri)便利コマンド on Linux

2008/07/11 18:19 Software::Linux
Linuxのシェルは拡張性がヤバいですね。
Linuxを使い始めたときからbash一筋な私ですが、.bashrcに色々と拡張関数を作って便利に使っているので、少し紹介してみます。

コンパイラ系 省略コマンド

コンパイルしたら自動的にそのプログラム名で出力して欲しい!ってことで、N先生に作り方を教わったコマンド。
a.outのままだと、後からみてどのプログラムのコンパイル結果なのか分からないし、既存のと被る可能性があるからなぁ。
  • Usage: $ gcc prog.c
    # gcc
    alias gcc='mygcc'
    function mygcc(){
        pn=`echo $1 | sed -e 's/\.cp\?p\?//'`
        command gcc -Wall -lm -o $pn $*
    }
    # g++
    alias g++='mygpp'
    function mygpp(){
        pn=`echo $1 | sed -e 's/\.cpp//'`
        command g++ -Wall -lm -o $pn $*
    }
    # cc
    alias g++='mycc'
    function mycc(){
        pn=`echo $1 | sed -e 's/\.c//'`
        command cc -Wall -lm -o $pn $*
    }
    

プログラムコンパイルから出力をファイルに書くまで一発なコマンド

まぁごくたまに使いますかねぇ。大量のinputをプログラムに流し込んだ結果をとりたいときとか。
  • Usage: $ start prog.c input.dat
    function start(){
        pn=`echo $1 | sed -e 's/\.c//'`
        command cc -Wall -lm -o $pn $1; ./$pn $2 &> $pn.result; cat $pn.result
    }
    

ファイルの中をぐるぐる検索してくれるコマンド

でも、最近は$ grep -r HOGE ./ で事足りるじゃん…と思って使ってない。
  • Usage: $ exgrep HOGE
    # File grep
    function exgrep(){
        command find ./ -type f -exec grep -l "$1" {} \;
    }
    

ディレクトリ内のtarballを一気に解凍するコマンド

さっき必要だったので作ってみた。
$ tar zxvf *.tar.gzでディレクトリ内の全ての.tar.gzを解凍してほしかったんだけど(apacheログの日ごとにtarballしていたものを解凍したかった)、いちいちforとか打つの面倒だなと思って。
  • Usage: $ extar *.tar.gz
    # Expand decompress .tar.gz
    function extar(){
        for TGZ in $@
        do
            tar zxvf ${TGZ}
        done
    }
    

どーでもいいけど、シェルスクリプトってifの対がfiだったり、caseの対がesacなのに、doの対はodじゃないんだね^^;

追記: bashの関数名に+とか書くと怒られる 2012/04/30

今まで何ともなかったfunction g++() ...という書き方だが、Fedora 16を新規インストールした辺りのbashからどうもsyntax errorになる。仕方がないんで、aliasを噛ませて修正。

Before)
$ function g++(){ echo "hogehoge"; }
-bash: syntax error near unexpected token `echo'
After)
$ alias g++='mygpp'
$ function mygpp(){ echo "hogehoge"; }

2008/07/08(Tue)PuTTYで自動接続

2008/07/08 11:15 Software::Windows
私のクライアントマシンのOSは殆どWindowsなので、Linuxの遠隔サーバー制御のためにPuTTY ごった煮 v0.60-JP_Y-2007-08-06をよく使っている。
PuTTYの日本語化だけでなく、日本語ロケールに特化した機能が多く非常に便利なコンソールアプリである。

が、毎回セッションリストから接続先を指定するのが面倒なので、自動的にセッションをオープンできないかと思って調べてみた。
putty.exe -load <session-name>
で自動的につないでくれるみたい。
ちなみに-loadがない場合は、ホストとして認識するらしい。
セッション名に空白がある場合は""で囲むのを忘れないように…。