2010年01月05日

パスワード付きのAccessのmdbファイルの処理

perlでパスワード付きのmdbファイルにアクセスしたい場合、あるいはパスワードを変更したい場合にどうしたらよいか調べてみた。(近年、勤務先で要求されるセキュリティのレベルが上がってきたのだ。)

パスワード付きのmdbファイルにアクセスするには接続文字列に
Jet OLEDB:Database Password=YourPassword;
と追加すれば良い。
# パスワード付きのmdbファイルにアクセスする例
# PASSWORD というパスワードをもつ hoge.mdb に接続する。

use Win32::OLE;
my $password="PASSWORD";

# 接続文字列を作る
$connStr="Provider=Microsoft.Jet.OLEDB.4.0;";
$connStr.="Data Source=hoge.mdb;";
# 接続文字列にパスワードを追加
$connStr.="Jet OLEDB:Database Password=$password;" if($password ne "");

#アクセスのデータベースへの接続
$objDB=Win32::OLE->new("ADODB.Connection");
$objDB->Open($connStr);

#
# ここに読み書きその他の処理を書く。
#

# 接続を閉じる
$objDB->Close();
$objDB=undef();


パスワード変更をしたいときは、データベースを排他モードで開いて
ALTER DATABASE PASSWORD 新パスワード 旧パスワード
を実行する。(空のパスワードは NULL と記述)
#
# hoge.mdb に接続して、パスワードを変更。
#
use Win32::OLE;
$password="PASSWORD";       #変更前のパスワード
$newpassword="NEWPASSWORD"; #変更後のパスワード

# 接続文字列を作る
$connStr="Provider=Microsoft.Jet.OLEDB.4.0;";
$connStr.="Data Source=hoge.mdb;";
# 接続文字列にパスワードを追加
$connStr.="Jet OLEDB:Database Password=$password;" if($password ne "");

#アクセスのデータベースへの接続
$objDB=Win32::OLE->new("ADODB.Connection");
$objDB->{Mode}=12; # 排他モードにする。
$objDB->Open($connStr);

# パスワード変更
$newpassword="NULL" if($newpassword eq "");
$cmd=$objDB->Execute(
	"ALTER DATABASE PASSWORD $newpassword $password"
 );

# 接続を閉じる
$objDB->Close();
$objDB=undef();
Posted by augustus at 2010年01月05日 10:48 | Comments (0)

2009年07月10日

USBメモリのシリアル番号の取得

USBデバイスには製造元を表わすベンダーID、製品の種別を表わすプロダクトID、個別の製品の固有番号である iSerialNumber と呼ばれる文字列があり、 WMI 経由でそれらは取得できる。
以下はサンプルの perl スクリプト。

use strict;
use Win32::OLE;
use Win32;

my $strComputer=".";
my $wmi = Win32::OLE->GetObject(
  "WinMgmts:{impersonationLevel=impersonate}!//".
  "$strComputer\\root\\cimv2"
) or die;
my $colDiskDrives = $wmi->ExecQuery(
  "SELECT * FROM Win32_DiskDrive"
);
for my $disk (in $colDiskDrives) {
	next if $disk->{PNPDeviceID}!~/^usbstor/i;
	print "$disk->{PNPDeviceID}\n";
}

これを使うとUSBメモリを簡単な鍵のように使うことができそうだ。
1)予めユーザが使用しているUSBメモリのシリアル番号を登録しておく。
2)ログオンスクリプトで、接続しているUSBメモリのシリアル番号を読み取り、登録済みのシリアル番号が見つからなければシャットダウンする。
3)ログオンスクリプトだけでなく、一定時間ごとにチェックしてやるとさらに良いかもしれない。
Posted by augustus at 2009年07月10日 21:48 | Comments (0)

2007年02月19日

ISBNの13桁化

今年(2007年)の1月から従来10桁だったISBNが13桁に拡張された。拡張の仕方は単純で頭に978を付け、最後の桁のチェックデジットを再計算するだけでよいらしい。

10桁のISBNと13桁のISBNを相互変換する関数が欲しくて CPAN を探すと、 Business::ISBN というぴったりのモジュールがあった。
use Business::ISBN qw( isbn_to_ean ean_to_isbn );
$isbn_10="4873113008";
$isbn_13=isbn_to_ean($isbn_10); # 旧ISBN ---> 13桁ISBN
$isbn_10=ean_to_isbn($isbn_13); # 13桁ISBN ---> 旧ISBN
13桁のISBN は EANコードと一致するのだ。

早速、「古代ローマ/書籍案内」で使っているプラグインに組み込んで ISBN: の後の10桁の番号を 13桁化して表示するようにした。これで各ページを個別に修正しなくてもよくてラッキーだ。

なお、13桁化したISBNはEANコード(日本ではJANコード)と一致するので、本の裏表紙などに印刷されているバーコードのうち上の方(978から始まるもの)がそのままISBNとなっている。
Posted by augustus at 2007年02月19日 18:47 | Comments (0)

2005年03月20日

mimeTeX (WEB上での数式の表示)

WEB上で数式を表示するのは結構大変だが、この mimeTeX を使えば簡単だ。
mimeTeX は C言語で書かれた CGI で、引数に TeX の文法で数式を書けば、数式の GIF イメージを戻してくれる。だから、imgタグを使って数式を簡単に表示することができるのだ。
例えば、 と表示したければ、
<img src="/cgi-bin/mimetex.cgi?\Large x^2+y^2=1">
のように書けば良い。(/cgi-bin に mimetex.cgi があると仮定してる。)

数式の書き方は基本的に LaTeX と一緒だが、全部の機能が使えるわけではないので mimeTeX のサイト(http://www.forkosh.com/mimetex.html)を確認してもらいたい。

mimeTeXのソースはC言語で書かれているが自分でコンパイルしなくても良いように Windows, Linux, FreeBSD 等々のバイナリも提供されている。


以下に数式の例をいくつか挙げる。
Continue reading "mimeTeX (WEB上での数式の表示)"
Posted by augustus at 2005年03月20日 10:56 | Comments (0)

2005年03月13日

Movable Type プラグイン作成入門(5)

今度は独自のコンテナタグの作り方を見てみよう。

例) --- CSVで与えられたリストでループする。
package MT::Plugin::CsvLoop;
use strict;
use MT::Template::Context;
MT::Template::Context->add_container_tag(
            CsvLoop=>\&CsvLoop);
sub CsvLoop{
    my($ctx,$arg) = @_;
    my(@list)=split(/,/, $arg->{list});
    my $res = '';
    my $builder = $ctx->stash('builder');
    my $tokens = $ctx->stash('tokens');
    for my $i (@list) {
        $ctx->stash('csv_value', $i);
        defined(my $out=$builder->build($ctx,$tokens))
            or return $ctx->error($ctx->errstr);
        $res .= $out;
    }
    $res;
}

MT::Template::Context->add_tag(
            CsvLoopValue=>\&CsvLoopValue  );
sub CsvLoopValue{
    my $ctx = shift;
    $ctx->stash('csv_value');
}
package MT::Plugin::CsvLoop;
関数などの名前が衝突しないように package を指定。

MT::Template::Context->add_container_tag(
         CsvLoop=>\&CsvLoop);

MTCsvLoop というコンテナタグがあると CsvLoop という メソッドを呼びだすことを指定。

my($ctx, $arg)=@_;
呼び出されるメソッドには2つの引数が渡される。一つ目はMT::Template::Contextオブジェクト。 2つ目はパラメータのハッシュへのリファランス。

my(@list)=split(/,/, $arg->{list});
テンプレートのコンテナタグ内で list='~' と記述した場合、 $arg->{list} に ~ が入る。
これを "," で区切ったものを @list に代入。

あとは、MT::Template::Contextオブジェクトの内容をまだ理解していないので説明できない。悪しからず。(^^;)

ここで作ったプラグインを CsvLoop.pl という名で保存し、plugins ディレクトリにアップロードしておこう。 これでテンプレート内で コンテナタグの利用は以下のような感じでやれば良い。
<MTCsvLoop list='claudius,nero,galba,otho'>
   <$MTCsvLoopValue$>:
   <a href="<$MTCsvLoopValue$>.html">
     <$MTCsvLoopValue$>.html
   </a>
   <br/>
</MTCsvLoop>
テンプレートの中に固定のループを書いてもあまり役に立たないような気もするが、まあ、サンプルということで。(^^;

2005年03月07日

Movable Type プラグイン作成入門(4)

変数タグにパラメータを渡すのも易しい。

例)<$MTRepeatStr$> --- 与えられた文字列を繰り返す。
package MT::Plugin::RepeatStr;
use strict;
use MT::Template::Context;

MT::Template::Context->add_tag(RepeatStr=> \&repeat);

sub repeat {
	my($ctx, $arg)=@_;
	my $str = $arg->{str} x $arg->{kaisuu};
	$str;
}
1;

package MT::Plugin::RepeatStr;
関数などの名前が衝突しないように package を指定。

MT::Template::Context->add_tag(RepeatStr=>\&repeat);
RepeatStr というタグがあると repeat という メソッドを呼びだすことを指定。

my($ctx, $arg)=@_;
呼び出されるメソッドには2つの引数が渡される。一つ目はMT::Template::Contextオブジェクト。 2つ目はパラメータのハッシュへのリファランス。

my $str = $arg->{str} x $arg->{kaisuu};
テンプレートの変数タグ内で str='xyz' kaisuu='99' と記述した場合、 $arg->{str} に xxx, $arg->{kaisuu} に 99 が入る。
"xyz" x 99 で xyz を 99 回繰り返した文字列が得られる。

$str;
呼び出されるメソッドは最後に結果の文字列を返せば良い。

ここで作ったプラグインを RepeatStr.pl という名で保存し、plugins ディレクトリにアップロードしておこう。 これでテンプレート内で <$RepeatStr str='-' kaisuu='50' $> と記述すれば - を 50 回繰り返した文字列が得られる。

例)<$MTPerlEval$> --- perl のコードを実行する。
package MT::Plugin::Eval;
use strict;
use MT::Template::Context;

MT::Template::Context->add_tag(PerlEval=>\&perleval);

sub repeat {
	my($ctx, $arg)=@_;
	eval($arg->{eval});
}
1;
テンプレート内で <$MTPerlEval eval='12*12' $> と記述すると 144 が得られる。便利なようだが、どんな perl のコードでも実行してしまうので危険極まりないとも言える。(^^;

Movable Type プラグイン作成入門(3)

独自の変数タグを作成してテンプレートで使うことも可能だ。

例)<$MTYahooLink$> --- Yahoo へのリンクを表示する
package MT::Plugin::YahooLink;
use strict;
use MT::Template::Context;

MT::Template::Context->add_tag(YahooLink=>\&yhlink);

sub yhlink {
	my $url="http://www.yahoo.co.jp/";
	"<a href='$url'>$url</a>";
}
1;

package MT::Plugin::YahooLink;
関数などの名前が衝突しないように package を指定。

MT::Template::Context->add_tag(YahooLink=>\&yhlink);
MTYahooLink というタグがあると yhlink という メソッドを呼びだすことを指定。

"<a href='$url'>$url</a>";
呼び出されるメソッドは最後に結果の文字列を返せば良い。 とてもシンプル。

ここで作ったプラグインを yahoolink.pl という名で保存し、plugins ディレクトリにアップロードしておこう。 これでテンプレート内で <$MTYahooLink$> という変数タグが使えるようになる。