【Perl, Windows】WMIに接続する(応用編)

前回はWMIへの接続の基本を書いた。

$wmi  = Win32::OLE->GetObject( "winmgmts:/root/CIMV2" );
$items = $wmi->ExecQuery( $sql );

しかし、この構文ではローカルのPC、しかも現在のユーザー資格情報で接続しようとする。別の資格情報を使ったり、他のPCの情報が欲しいときは次の構文を使う。

$locator = Win32::OLE->CreateObject( "WbemScripting.SWbemLocator" )
$wmi = $locator->connectserver( "サーバー名", "root/CIMV2", "ユーザー名", "パスワード" );

前回の例(デスクトップの壁紙のファイル名を得るスクリプト)を書き直してみよう。

Continue reading

【Perl, Windows】WMIに接続する(基本編)

前回のネタについて細かく見て行こう。

そもそもWMIとは何か。

Windows Management Instrumentation – Wikipedia
http://ja.wikipedia.org/wiki/WMI

Windows Management Instrumentation(WMI)は、Windows Driver Modelへの拡張の一種で、システムの構成要素について情報収集と通知を行うオペレーティングシステムのインタフェースを提供する。

これだけではなんだかよくわからないが、要するに、OSから得られる様々な情報に対する統括的なインターフェイスだ。Windowsの状態について知りたいならばこれで全て賄えるのである。

PerlからこのWMIへのアクセスにはWin32::OLEモジュールを使う。基本的な構文はこうだ。

$wmi = Win32::OLE->GetObject( "winmgmts:/root/CIMV2" );
$items = $wmi->ExecQuery( $sql );

$sqlにはSQL(みたいな)構文が入る。例として、デスクトップに使っている壁紙のファイル名を得るプログラムを書いてみよう。

Continue reading

【Perl, Windows】使っているコーデックの一覧を得る

WMIを使ってコーデックの一覧を得るスクリプト。かなり煩雑で独自表記っぽくなってるけど、これもMooseの勉強の一環ってことで。コマンドプロンプトからperl codec.plとすると次のような結果が得られる。

C:\> perl codec.pl
No.1
Manufacturer: Microsoft Corporation
Name: C:\Windows\system32\MSRLE32.DLL
Path: \windows\system32\
Version: 6.1.7600.16490
Caption: c:\windows\system32\msrle32.dll
Drive: c:
Extension: dll
FileType: Application Extension
Group: Video
CreationDate: 2010/02/11 16:41:07
InstallDate: 2010/02/11 16:41:07
LastModified: 2009/12/19 18:47:46

No.2
Manufacturer: None
Name: C:\Windows\system32\FF_ACM.ACM
Path: \windows\system32\

    〜以下省略〜

表示する情報を制限したり、管理者権限のあるユーザー名とパスワードがわかれば、他のPCにアクセスしてリストを取り出すこともできる。

C:\> perl codec.pl --server コンピューター名 --user ユーザー名 --password パスワード --prop Name --prop Manufacturer
No.1
Name: C:\Windows\system32\MSRLE32.DLL
Manufacturer: Microsoft Corporation

No.2
Name: C:\Windows\system32\FF_VFW.DLL
Manufacturer: None

No.3
Name: C:\Windows\system32\FRAPSV64.DLL
Manufacturer: Beepa P/L

    〜以下省略〜

使っているテクニックについては、日を改めて説明しよう。(一度に書いたらネタが無くなるしね!)

Continue reading

VimでPerldocを引く(Unix系OS編)

100213-0001.png

Perlでごりごり書いてるときに、モジュールのドキュメントが読みたくなることはよくある。GNU Screen + Vimでやってるときは別のウィンドウで「perldoc モジュール名」でもいいのだが、GVimではそういうわけにも行かない。

そんなときに便利なのが次のプラグイン。

PERLDOC2 – Perldoc with sytnax highlighting in vim : vim online
http://www.vim.org/scripts/script.php?script_id=2171

インストールは以下の手順で行う。

  1. CPANからPod::Simple::Vimモジュールをインストール1
  2. ダウンロードしたzipファイルの中身を~/.vimに解凍する
  3. .vimrcに次のような記述を追加
" Perldoc表示用
let g:Perldoc_path=expand("$HOME")."/.vim/perldoc_cache/"

expand以下がキャッシュディレクトリだ。ディレクトリ作成したりするのが面倒なら、単に「expand("$TEMP")."/"」とだけ指定しておけばいいかもしれない。使用法はコマンドモードで

:Perldoc モジュール名

とするとドキュメントが引ける。これだけでも十分読みやすいのだが、いくつか不満点があるので改良した。

Continue reading

【Perl,Windows】コマンドプロンプトで色付き文字を使う

l_3e0774cbecb97d5f081d3f535740e885_orig_3576.png

Unix系OSのコンソールと比べると途方もなく貧弱に見えるWindowsのコマンドプロンプトだが、文字に色を付ける機能くらいはちゃんとある。これを、Unix系OSで書き慣れた書式のまま使えるWin32::Console::ANSIというモジュールがお気に入りだ。

Win32::Console::ANSI – search.cpan.org
http://search.cpan.org/~jlmorel/Win32-Console-ANSI-1.04/lib/Win32/Console/ANSI.pm

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use Perl6::Say;
use Win32::Console::ANSI;
binmode STDOUT => ":raw :encoding(cp932)";
say "\e[1;32mこれは明るい緑です";
say "\e[41m背景を赤にしました";
say "\e[4m強調してみました";
say "\e[7m反転してみました";
say "\e[m元に戻りました";

別のモジュールと組み合わせることで、もう少しわかりやすい表記にもできる。

Term::ANSIColor – search.cpan.org
http://search.cpan.org/~rra/ANSIColor-3.00/ANSIColor.pm

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use Perl6::Say;
use Win32::Console::ANSI;
use Term::ANSIColor qw! :constants !;
binmode STDOUT => ":raw :encoding(cp932)";
say BOLD GREEN "これは明るい緑です";
say ON_RED "背景を赤にしました";
say UNDERSCORE "強調してみました";
say REVERSE "反転してみました";
say RESET "元に戻りました";

もっとも、このモジュール(Win32::Console::ANSI)は単なる色付き文字のためのモジュールではなく、ANSIコンソールをエミュレートするものだ。カーソル移動を可能にして画面の好きな場所に文字を出力できたりするらしいが、そこまでは試さなかった。

色の付け方も含めて、Unix系OSの解説がそのまま役に立つだろう。

Bash Prompt HOWTO: ANSI エスケープシーケンス: 色とカーソル操作
http://www.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO-5.html

【Vim】指定されたPerlモジュールのソースファイルを開く

Perlモジュール名を指定するとそのソース(.pmファイル)を開いてくれるコマンド。已にどっかにありそうな機能ではあるが、勉強のために作ってみた。

使い方

openPM.vimをpluginディレクトリ(Unix系なら~/.vim/plugins、Windowsなら$HOME/vimfiles/plguin)に、searchPM(WindowsはsearchPM.bat)をパスの通ったディレクトリに置き、実行権限を与える。そしてVimを起動し、

:OpenPM モジュール名

で、.pmファイルが開く。モジュール名が指定されなかった場合は、カーソル下にある文字列を認識して開く。

使用例

こんなファイルでカーソルをここにおいて、

100211-0001.png
:O<Enter>」とすると、モジュールのソースが開く。

100211-0002.png

Continue reading

DBIx::Classのクエリで関数を使う

備忘録。

UPDATE users SET password = MD5('mypass') WHERE id = 15;

idが15であるユーザーのパスワードに’mypass’をMD5で符号化して保存する。

みたいなSQL文をDBIx::Class(というか、SQL::Abstract)で表現するにはどうするか。この場合はこう書く。

$schema->resultset( "Users" )
    ->update( {
        password => \"MD5('mypass')",
        id => 15,
    } );

なんてことはない。文字列のリファレンスを値として与えるだけだ。更に応用として次のようなSQLだと、

SELECT CONCAT( 'ID', LPAD( id, 6, '0' ) ) AS member_id FROM users;

usersテーブルからidを取り出し、頭に'ID'を付けて6桁0埋めで取り出す。(id = 15なら'ID000015'となる)

こうなる。

my $it = $schema->resultset( "Users" )
    ->search( undef, {
        "+select" => [ \"CONCAT( 'ID', LPAD( id, 6, '0' ) )" ],
        "+as" => [ "member_id" ],
    } );

say $it->first->get_column( "member_id" );
# 「ID000015」などと表示される