同一ファイルをリストアップするPerlScript

ファイルの整理は重要ですが、どんなに綺麗に分類していたとしても、内容が同一のファイルまでは整理から漏れてしまう事は往々にしてあります。
そんな時に役立つPerlScriptのサンプルです。
使い方を忘れてしまう事がままあったので、かなりヘルプに力が入っています・・・

続きを読む

ハッシュ値のチェックを簡単に行うPerlScript

インターネットからダウンロードしたデータは、ダウンロードに失敗して破壊されていたり、何者かの改ざんによって不正に改造されている場合があります。
ダウンロードしたファイルの整合性をチェックする方法の一つとしてハッシュ値による比較がありますが、これをPerlScriptで実現するサンプルです。
以下のソースはSHIFT-JISでコーディングする事を想定しています。

続きを読む

PNGとJPEG画像のファイルサイズを少なくする

PNGJPEG等の画像ファイルの中には、その画像を作成したアプリケーションが追加するコメント等が入っています。
これら、不要な情報を削除する事で、イメージファイルサイズを小さくする事が可能です。

8/8追記

PNG画像は不要領域を削除するのではなく、IDATセクションを最適化する事でファイルサイズを小さくしています。


Windowsでは、以下の2つのツールを用いて、上記の処理を実現できます。
下記ツールは、その両方ともWindowsバイナリを公開して下さっています。

OptiPNG

コマンドラインから使用できる、PNG画像の最適化ツール。
http://optipng.sourceforge.net/

jhead

コマンドラインから使用できる、JPEG画像の最適化ツール。
http://www.sentex.net/~mwandel/jhead/

簡単な使い方

OptiPNG

optipng -o 7 ファイル名

jhead

jhead -purejpg ファイル名

ネットワーククライアントの特定ユーザーレジストリキーを操作する

REGコマンドはコンソールからネットワークを介してクライアントのレジストリキーの値を操作する事が可能ですが、HKEY_LOCAL_MACHINEとHKEY_USERS以外は参照できません。
これはREGコマンドがログインしているユーザーを認識しない仕様であるためですが、クライアントの管理をする上では、少々不便です。
そこで、クライアントにログインしているユーザーレジストリをリモートで操作する方法について、知識を共有します。

注意点

Windows VistaWindows7Windows Server 2008ではRemote Registryサービスが起動していない場合があります。
Remote Registryサービスが起動していないと、リモートでのレジストリ操作ができないため、必要に応じて起動してください。

以下の例はクライアントpcnameのRemote Registryサービスを起動します。

SC \\pcname start RemoteRegistry

上と同じ条件でRemote Registryサービスを停止する場合は、以下のようにします。

SC \\pcname stop RemoteRegistry

ユーザー情報の参照先

レジストリでは、そのパソコンにおいてユニークな名前で各ログインユーザー情報を保存しています。
これらの情報はルートキーのHKEY_USERS以下に保存されており、現在ログインしているユーザーレジストリであるルートキーHKEY_CURRENT_USERも含みます。

クライアントに接続する

クライアントのレジストリを参照するには、クライアントへの接続が必要な場合があります。
接続が必要な場合はUSE NETコマンドを使用してください。
今回は説明を割愛します。

ログインユーザー名を調べる

まず、HKEY_USERS以下にあるレジストリキーを全て取得します。

以下の例は、クライアントpcnameのHKEY_USERS以下のレジストリキーを全て列挙するコマンドです。

REG QUERY \\pcname\HKEY_USERS

結果の例

HKEY_USERS\.DEFAULT
HKEY_USERS\S-000
HKEY_USERS\S-000_Classes
HKEY_USERS\S-111
HKEY_USERS\S-111_Classes
HKEY_USERS\S-222

レジストリではログインユーザーをユニークなキーで管理しており、それは人間にとっては分かりづらい値になっています。
ここからログインユーザー名を知る事は出来ないため、HKEY_USERSの各ユーザーレジストリルートから、目的のユーザーレジストリを探し出す必要があります。

以下の例は、クライアントpcnameのHKEY_USERSにあるS-000レジストリキーのログインユーザー名を取得します。

REG QUERY \\pcname\HKEY_USERS\S-000\Software\Microsoft\Windows\CurrentVersion\Explorer /v "Logon User Name"

結果の例
下の例ではuserがレジストリを使用しているログインユーザー名となります。

    Logon User Name    REG_SZ    user

レジストリを参照と操作

REGコマンドでクライアントのレジストリキーを操作する事が可能ですが、以下の点に注意が必要です。
レジストリのキーや値は操作できますが、インポート、エクスポート、リストア、ハイブファイルのロードとアンロードができません。
これらの操作はクライアントマシンのローカル上で実行する必要があるためです。

クライアントから切断する

クライアントにNET USEコマンドで接続した場合は、net useの/deleteオプションを使用して切断します。
立つ鳥跡を濁さずです。

このノウハウの使い道

セキュリティポリシーの適用、資産管理などで役立ちます。
数百台のクライアントコンピュータを有し、ActiveDirectory等による一元管理の適用が困難なローカルユーザーを持つネットワークでは重宝します。

Firefoxを任意のプロファイルを指定して開く

Firefoxを任意のプロファイルを指定して開く方法です。
バッチファイルに、以下のコマンドを記述すると、Firefox起動後もコマンドプロンプトの画面が残りません。

start firefox.exe -p profilename -no-remote
exit

同じプロファイルを指定して、Firefoxを起動しようとすると警告が表示される点に注意が必要です。
なお、default(または規定の)プロファイルを指定する場合は、普通にFirefox起動すればOKです。

Perlのちょっとした小技たち

めもめも。

ファイルの内容を変数に格納する

if(! open(in,"D:/web/t.csv")){
	print "file open\n";
}
$in = join('',<in>);
close(in);
print $in;

CSVの1列目をソート

昇順(A-Z)
@csv = sort { (split(/,/,$a))[0] cmp (split(/,/,$b))[0] } @csv;
@csv = reverse sort { (split(/,/,$b))[0] cmp (split(/,/,$a))[0] } @csv;
降順(Z-A)
@csv = reverse sort { (split(/,/,$a))[0] cmp (split(/,/,$b))[0] } @csv;
@csv = sort { (split(/,/,$b))[0] cmp (split(/,/,$a))[0] } @csv;

SHA1の16進(40文字)値を得る

use Digest::SHA1 qw(sha1 sha1_hex sha1_base64);
$str = "aaa";
$sha1 = sha1_hex($str);
print $sha1;

Perlによるファイルの排他制御を考える rename編

Perlでファイルの排他制御を行うにあたり、実運用に耐えるコーディングについて考えます。
今回はrenameを用いた排他制御を考えます。

続きを読む