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 ---> 旧ISBN13桁の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)
今度は独自のコンテナタグの作り方を見てみよう。例)
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$> という変数タグが使えるようになる。