ようこそゲストさん

Kerosoft : Modus Operandi

メッセージ欄

2008年7月の日記

一覧で表示する

2008/07/22(Tue) Sleipnirの文字化け

はてブ情報 はてブに登録 はてブ数 2008/07/22 1:27 Software::Windows
先日からよく分からない現象に悩まされていた。
Sleipnirで特定のサイトを開いたとき、日本語が文字化けしたり、そもそも真っ白で何も表示されないという現象だ。

ページのソースを見てみると正常にまで受信できているので通信に問題があるようには思えないのだが…。

これらのうまく開かないページの特徴として、metaタグでContent-Typeが指定されていなかったり、ShiftJISの文字コードであるという点。
それをブラウザが毎回EUC-JPと勘違いしていて、自動選択されていないのが原因のようだ。


が、Sleipnirから何度、[表示]-[エンコード]-[自動選択(A)]を選んでやっても直らない。
どうしたものかと思っていたら……。


どうやらIEの設定に依存しているらしい


解決方法:
  1. Sleipnir、IEをすべて終了
  2. IEを起動して、[表示]-[エンコード]-[自動選択]にチェックを入れる
  3. IEを閉じる
  4. Sleipnirを開く
  5. 文字化けサイトにアクセスして確認。

参考元:http://community.tabbrowser.jp/forum/viewtopic.php?p=11225

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

はてブ情報 はてブに登録 はてブ数 2008/07/21 0: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にこの法則が適用できるかは未確認です。

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

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

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



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


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


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


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




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



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



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




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

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

1: shi-ta 『こんな面倒だったのですね・・・orz まだ実施していないのですが、これでつまずいてエライ大変です。 情報をありがとう御座いました...』 (2008/11/26 9:40)

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

はてブ情報 はてブに登録 はてブ数 2008/07/17 4: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}のような形式のものだけ反応させるようにとか、適宜工夫することを推奨。

1: ありがとうございます 『大変助かりました!』 (2011/05/05 21:53)

  • 変数の展開の展開 +α Kerosoft : Modus Operandi Keroberos
    変数の展開の展開で、printなどする予定の変数内に埋め込んだ変数名文字列を展開する方法を紹介したが、同じ手法で関数も展開するバージョン。#!/usr/local/bin/perlmy $str = q|この結果は&sum(10, 25)&...

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
function gcc(){
    pn=`echo $1 | sed -e 's/\.cp\?p\?//'`
    command gcc -Wall -lm -o $pn $*
}
# g++
function g++(){
    pn=`echo $1 | sed -e 's/\.cpp//'`
    command g++ -Wall -lm -o $pn $*
}
# cc
function cc(){
    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じゃないんだね^^;