ChaichanPapa-World !

燈明日記(2008/01

◆ インデックス

◆ 2008年1月

2008-01-31 有難嬉悲しメモ(2008/01/31)

2008-01-31 PerlでDBへNULLを書き込む時のvaluef関数

SQLのINSERTやUPDATEで書き込むデータを指定する時に、通常、文字列はシングルクォーテーションで囲み、数値とNULLはそのままになります。

しかし、数値に関してはシングルクォーテーションで囲んでも問題がないですね。


上記を踏まえて、Perlでvaluefという関数を作ってみました。

valuef関数は、引数が空文字列と未定義値の時はNULLとし、これ以外(数値と文字列)の時は、値をシングルクォーテーションで囲みます。

#!/usr/bin/perl
use strict;
my @Sql = ();
my $Code=15;
my $Level=();
my $Comment='11111111111';
$Sql[0] = "INSERT INTO tstTBL (Code, Level, Comment) ";
$Sql[0] .= "VALUES (@{[valuef($Code)]}, @{[valuef($Level)]}, @{[valuef($Comment)]}) ";
&SQLExecutor(@Sql);

sub valuef {
   my ($para) = @_;
   my $rtvalue;
   if (($para eq '') || (!defined($para))) {
       $rtvalue = 'NULL';
   }
   else {
       $rtvalue = "'" . $para . "'";
   }
   return $rtvalue;
}

sub SQLExecutor {
use Win32::OLE;
Win32::OLE->Option(Warn => 3); 

    my (@Sql) = @_;
    # データベースへの接続
    my $objDB = Win32::OLE->new("ADODB.Connection");
    # SQL Server 認証設定(WINDOWS認証の時は『Integrated Security=SSPI;』を付加する)
    my $connectStr = "Provider=sqloledb;".
                     "Data Source=SERVER_NAME;".
                     "Initial Catalog=DB_NAME;".
                     "User ID=sa;".
                     "Password=sa;";
    # 接続を開く
    $objDB->Open($connectStr);
    if ($objDB->{Errors}->{Count}) {
        die "cannot connect '$connectStr'";
    }
    $objDB->{CommandTimeout} = 100;
    foreach  my $wkSQL (@Sql) {
        # データ更新
        $objDB->Execute($wkSQL);
    }
    # 接続を閉じる
    $objDB->Close();
}

尚、SQLExecutorサブルーチンは、SQL Server系のDB専用です。

留意点として、SERVER_NAMEとDB_NAMEとsaは、本番用に書き換えが必要です。

2008-01-30 有難嬉悲しメモ(2008/01/30)

2008-01-30 WebページからEXE(WSH)を起動する

以下のようにIEのセキュリティ設定で、一箇所有効にすると WSH が使用することが出来るようになります。

サンプルソース
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>WebページからEXEを起動する</title>
<script language="VBScript">
Function up_notepad()
    Set WshShell=CreateObject("WScript.Shell")
    WshShell.Exec("notepad.exe")
End Function
</script>
</head>
<body>
<p><input type="button" value="メモ帳起動" onClick="up_notepad()"></p>
</body>
</html>
注意点:

WebからWSHが使用できるということは、PCのレジストリ等も自由に制御ができるということです。

したがって、使用後はIEでのセキュリティ設定を元に戻すことを強く推奨します。

2008-01-29 有難嬉悲しメモ(2008/01/29)

実は、寒中法華経読誦修行の導師のひとりが、青年部のお姉さんで、沙友里という名でした。

ちゃいちゃんも名を沙友里という・・・。

2008-01-29 ダウンロードCGIのPerlスクリプト

以下のソースは、ファイルのダウンロードのサンプルスクリプトです。

#!/usr/local/bin/perl
use strict;

#宣言
my $FilePath = 'C:\Inetpub\wwwroot\bin\files\xxx.csv'; # ダウンロードファイル
my @FileName = split(/\\/, $FilePath);

#ダウンロードファイルオープン
open (DF, $FilePath) or die "cannot open '$!'";

#ヘッダー部ダウンロード
print <<"HERE1";
Content-type: application/octet-stream
Content-Disposition: attachment; filename=$FileName[$#FileName]

HERE1

#本体ダウンロード
binmode DF;
binmode STDOUT;
while (my $DFdata = <DF>) {
    print STDOUT $DFdata;
}

#ダウンロードファイルクローズ
close DF;

ちなみに、アップロードはCGI.pmモジュールを使うと吉です。

2008-01-28 有難嬉悲しメモ(2008/01/28)

2008-01-28 改行コードとchomp

まず、WINDOWS上で改行コードが各々、\x0D\x0A、\x0D、\x0A、の3つのテキストファイルを用意します。

そのテキストファイルをPerl(v5.8.8)で読み込み、chomp(改行コード削除)の振る舞いをテストしてみました。


結論から言うと、読み込みモードがテキストでもバイナリでも、chompは、行の最後に \x0A があるときだけ、それを削除します。

\x0D に関しては、なにもしません。

したがって、1度のchompだけで行末の \x0D\x0A を削除することは、ないみたいです。


  1. 改行コードが \x0D\x0A のテキストファイルをテキストモードで読み込むと改行コードは \x0A になりました。
  2. 改行コードが \x0D\x0A のテキストファイルをバイナリモードで読み込むと改行コードは \x0D\x0A になりました。
  3. 改行コードが \x0D のテキストファイルをテキストモードで読み込むと改行コードは \x0D になりました。
  4. 改行コードが \x0D のテキストファイルをバイナリモードで読み込むと改行コードは \x0D になりました。
  5. 改行コードが \x0A のテキストファイルをテキストモードで読み込むと改行コードは \x0A になりました。
  6. 改行コードが \x0A のテキストファイルをバイナリモードで読み込むと改行コードは \x0A になりました。

chompが有効だったのは、1,2,5,6のケースで、2,3,4のケースでは、\x0Dが残ります。

ちなみに、データダンプは以下のようにしました。$wkには一行データが入っています。

print "--->", unpack("H*", $wk), "<---", "\n";

2008-01-27 有難嬉悲しメモ(2008/01/27)

2008-01-27 ついに我が家も家庭内LAN時代へ

話は、お正月までさかのぼります。

三男のマチャ(中1)がお年玉で iPod Nano を買いました。

iPod NanoのiTunesはXPかVistaしか対応していなく、我が家にあるのは、WIN2000ノートとWIN98の2台でした。

なので、iPod Nanoが使えなかったのです。

しかし、ひょんなことから、XPノートが手に入ったのです。しかもタダで。


話は変わって、某教会では、寒中修行といって、法華経を10日間で読誦します。

読誦には、導師(1人)、脇導師(2人)、太鼓(2人)の1セットで、一日当たり2セットが必要でした。

つまり、(1+2+2)*2*10で100人が必要なのです。

その人選に我が家がターゲットの一部になってしまったのです。


司会の役として長男を説得し、太鼓の役として次男と三男を説得しました。

私は、有無なく脇導師(去年は導師だったけど・・・)のお役でした。


説得は、長男は成人式ライブのことがあり簡単に落ち、次男はもともと優しい子なのですぐOKでした。

問題は三男で、いろいろ説得しましたが、頑なに嫌がります。

そんなとき、iPod Nanoの経緯で手に入ったXPノートを、ネットに繋げてあげるという条件で、ついに落ちたのです。


で、電気屋「でんきち」に行って無線LANルータを買い、WIN98だけだった接続を3台で接続できるようになったのです。

しかも、WIN2000ノートとXPノートは無線です。

また、凄いと思ったのは、PSPも簡単にネットに繋がったことでした。時代はいつのまにか進んでいる・・・。


居間のコタツの上やキッチンのテーブルの上で気軽にネットが出来るのは、快いですね!(ちなみに、書斎などない)

しかも、iTunesで音楽を聴きながらのネットです。時代は変わったな・・・。

2008-01-27 Cellsメソッドの第2引数の謎

EXCELオブジェクトでCellsメソッドの第2引数は、普通、列番号を指定します。

しかし、設定に関して、なぜかエラーになったり不思議な動きをするのです。

ネットで調べてもよく分からなかったので、テストをしてみました。


テスト結果

Cellsメソッドの第二引数は、数値指定では列番号で、文字列指定では列名になるのです。

したがって、列番号を文字列で渡すとエラーになるのです。


実はコレ、Perlの常識を超えています。

Perlでは、変数中の数字の値は、数値と文字列の区別がないのです。

したがって、Perl自体が区別つかないものを、Cellsメソッドは内部で判断しているのです。

たとえば、4と'4'を区別して、後者の時はエラーとしているのです。

どうやって、エラーにしているのかは謎です(私にはわかりません)。


テストソース
#!/usr/local/bin/perl
use Win32::OLE;

    my $FilePath = 'D:\test.xls'; # ファイル名
    # EXCEL使用可能かチェック
    eval {
            Win32::OLE->GetActiveObject('Excel.Application');
    };
    if ($@) {
            die "Excelが入っていません。$@";
    }
    #EXCELオブジェクト取得
    my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
             || Win32::OLE->new('Excel.Application', 'Quit');
    my $Book = $Excel->Workbooks->Open($FilePath);
    my $Sheet = $Book->Worksheets(1);
    $row = 4;
#    $col = 4;    #列番号を数値で渡すと大丈夫
#    $col = '4';  #列番号を文字列で渡すとエラーになる
    $col = 'D';   #文字列でも列名なら大丈夫

    my $ColumnCount = $Sheet->Cells($row, $col)->value;

    print $ColumnCount;

    $Book->Close;
    $Excel->Quit();

ちなみに、第1引数(行番号)は、文字列でも数値でも大丈夫です。

2008-01-27 文字列中のサブルーチン実行

Perlでは、ダブルクォーテーション文字列中の変数は、中身が展開されます。

しかし、サブルーチンは展開されません。単なる文字列になります。

これを展開するには、無名配列リファレンスの配列要素としてサブルーチンをコールし、この無名配列リファレンスをデリファレンスします。

use strict;
print "aaaaaaa @{[&test()]} bbbbbbb";
sub test {
    return "ABCDEF";
}

また、以下のように一度サブルーチンリファレンスをとり、デリファレンスして、それを無名配列リファレンスの配列要素とし、この無名配列リファレンスをデリファレンスします。

print "aaaaaaa @{[&{\&test}]} bbbbbbb";

2008-01-27 PerlでWINDOWS改行コードの扱い

通常、WINDOWS上での改行は2バイトで、\x0D\x0A です。

通常、WINDOWS上のPerlでテキストファイルを読み込むと、\x0D が落ちて、あたかもUNIXと同じ \x0A になるのです。

しかし、CGI.pm等でアップロードした場合は、\x0D\x0A のままだったりするのです。

すると、chompしても \x0D が残って、悪さをするのです。

したがって、WINDOWS上では、chompのあとにs/\x0D$//を行うと吉です。

chomp;
s/\x0D$//;

2008-01-27 数値と数値文字列の比較

数値と数値文字列の比較で、Perlではコンテキストによって、以下はすべて『真』となります。

しかし、実コーディングするときは、数値は数値で『==』系で比較し、文字列は文字列で『eq』系で比較した方が良いに決まっています。

use strict;
my $wk = '123';
print "真('123' eq '123')", "\n" if ($wk eq '123');
$wk = 123;
print "真(123 eq '123')", "\n" if ($wk eq '123');
$wk = '123';
print "真('123' eq 123)", "\n" if ($wk eq 123);
$wk = 123;
print "真(123 eq 123)", "\n" if ($wk eq 123);
$wk = '123';
print "真('123' == '123')", "\n" if ($wk == '123');
$wk = 123;
print "真(123 == '123')", "\n" if ($wk == '123');
$wk = '123';
print "真('123' == 123)", "\n" if ($wk == 123);
$wk = 123;
print "真(123 == 123)", "\n" if ($wk == 123);

2008-01-27 open関数の第一引数であるディスクリプタにスカラー変数を指定できるか?

通常、open関数の第一引数は、ファイルのディスクリプタです。

普通、ディスクリプタは、大文字のベアワードを指定します。

しかし、ディスクリプタにスカラー変数を指定しているケースに遭遇しました。

そこで、このケースをテストしてみました。


テスト結果

このときのスカラー変数は、型グロブのリファレンスになっていました。

したがって、まず該当ディスクリプタがどこかにあって、それの型グロブリファレンスが、ディスクリプタとして使用できるみたいです。

use strict;
my $fd;
open $fd, "test.txt";
print <$fd>;                         # 正常にアクセスできる
print "--->" . ref($fd) . "<---\n";  # 『--->GLOB<---』が表示される 
close $fd;

2008-01-26 有難嬉悲しメモ(2008/01/26)

2008-01-26 ちゃいちゃんの成人式

1月14日に某教会で「新春の集い」があり、その中で成人式がありました。

そして、成人者紹介の時に、なぜか、ちゃいちゃんの紹介もあったのです。

そう、ちゃいちゃんが生きていれば20才で成人者なのでした。


1月14日を前に、不思議なことがいろいろとありました。

私もママも年初めにちゃいちゃんのリアルな夢をみたり、今年初めてのお墓参りでは、お花が沢山上がっていたり・・・と。

また、6年生の時の担任の先生からタイムカプセルの品物(作品や写真)が送られて着たりなどなど・・・。


そんな中、「新春の集い」の主催者の教会長さんという人が、ママの実家に来て、たまたま仏壇(ご宝前)にあったちゃいちゃんの写真を見て、ママの姉からいろいろとお話を聞き、生きていれば成人式ということで、成人者紹介のお手配になったのです。


この絡みで、自称ミュージシャンの長男の「新春の集い」でのライブが決まり、2曲を歌えることになったのです。

150人近くの前で歌うのは、初めてで、親としてもなんとかビデオに撮りたいと思ったら、2年以上放置してあった父のビデオカメラが意外にも動き、ライブを撮ることができました。

ちなみに、このビデオカメラは、キャノンのXV1という機種で、30万円以上もするやつで驚きました。


「新春の集い」では、アマチュアの出し物の多い中、プロを目指している長男の弾き語りの歌はダントツの存在感がありました。単なる親バカかも!

ある意味、ちゃいちゃんの代わりにお兄ちゃんが成人式に出たような感じで、私は、必死にビデオで弾き語りを撮りました。


しかし、丸8年も経過しているのに、この存在感、すごいなーぁ、ちゃいちゃんは!

パパもママもお兄ちゃん・弟くん達みんな、ちゃいちゃんに負けないように頑張るね!応援してね!

また、いつでも天国からいろいろ指令を出して、不思議なことを起こしてください、楽しみにしています。

2008-01-26 Microsoft SQL Serverで『Deferred prepare は完了しませんでした。』がでたら

OLE exception from "Microsoft OLE DB Provider for SQL Server": [OLE/DB provider returned message: Deferred prepare は完了しませんでした。]

上記メッセージが出たら、テーブル名を以下のようにフルで指定してみてください。

DBサーバー名.DB名.所有者名.テーブル名

2008-01-26 Microsoft SQL Serverで『Non-interface error: OLE DB provider does not contain the table』がでたら

OLE DB エラー トレース [Non-interface error: OLE DB provider does not contain the table: ProviderName='xxxx', TableName='yyyy']。

上記メッセージが出たら、テーブル名を以下のようにフルで指定してみてください。

DBサーバー名.DB名.所有者名.テーブル名

2008-01-26 Microsoft SQL ServerでのDBリンク

OracleにはDBリンクという、今ログインしているDBから別DBへ、ログイン手続きなしでアクセスできる機能あります。

SQL Serverにもリンクサーバーを設定すると、別DBへログイン手続きなしにアクセスができるようになります。


リンクサーバー設定方法

留意点として、リンクサーバーアクセスする場合は、テーブル名をフル(リンクサーバー名.DB名.所有者名.テーブル名)で指定します。それでも繋がらない場合は、リンクサーバー先との権限やSQL記述ミス等を念入りに確認してみてください。

尚、上記はSQL Server 2000ですが、2005では、セキュリティフォルダでなくサーバーオブジェクトフォルダにリンクサーバーがありますね。

2008-01-26 Microsoft SQL Server 2005でデータ更新しない?

SQL Server 2005では、従来(SQL Server 2000)のエンタープライズマネジャーとクエリアナライザが無くなり、マネージメントスタジオに一本化されました(たぶん)。

データ表示は、クエリアナライザと同じように、マネージメントスタジオからテーブルを開くとデータが表示されます。

違いは、クエリアナライザはウインドウ表示なのに対して、マネージメントスタジオはタブ表示です。


たとえば、任意該当テーブルのデータを表示した後、別プロセス(プログラム)でデータ更新があったとします。

その後、該当テーブル名を右クリックして、再度「テーブルを開く」や「最新の情報に更新」をクリックしても、表示に更新が反映されないのです。

実データは確かに更新されているにもかかわらず、表示には更新が反映されないのです。


これを表示に反映させるには、一度タブ表示をクローズして、再度「テーブルを開く」でタブ表示させると表示更新するのです。

このマネージメントスタジオの操作は、明らかにおかしいです。ちなみに、マネージメントスタジオのバージョンは9.00.1399.00。

2008-01-16 耳鳴りがひどい

もともと、常に耳鳴りがあるのだけれど、今日は特にひどい。

しばらく、休みます。ってなにを…

2008-01-15 有難嬉悲しメモ(2008/01/15)

2008-01-15 月末日取得関数(うるう年計算)

以下の関数(getMonthEndDate)は、年を入力に、その年の全月の末日のテーブルを出力します。

use strict;

print getMonthEndDate(2008), "\n";

sub getMonthEndDate {
    my ($year) = @_;
    my @enddatetbl = (31,28,31,30,31,30,31,31,30,31,30,31);
    if ($year =~ m/\D/) {
        return ();
    }
    if ($year % 4 == 0) {
        if ($year % 100 == 0) {
            if ($year % 400 == 0) {
                $enddatetbl[1] = 29;
            }
            else {
                $enddatetbl[1] = 28;
            }
        }
        else {
            $enddatetbl[1] = 29;
        }
    }
    else {
        $enddatetbl[1] = 28;
    }
    return @enddatetbl;
}
うるう年計算

手順1.確認する年が 4 で割り切れる場合は手順2.へ、そうでない場合は「その年はうるう年でない」。

手順2.その年が 100 で割り切れる場合は手順3.へ、そうでない場合は「その年はうるう年である」。

手順3.その年が 400 で割り切れる場合は「その年はうるう年である」、そうでない場合は「その年はうるう年でない」。

参考:http://support.microsoft.com/kb/214019/ja

2008-01-14 有難嬉悲しメモ(2008/01/14)


先日、新年会で会社の後輩から信仰のことを聞かれ、信仰とは、「仏さまを信じきることだよ」というと、「なんだ他力なんだ」と一蹴されました。

そして、なんと「そうかも・・・」と答えていた自分がいました。あちゃ・・・。

家に帰ってきて、ママにいうと、以下のように教えてくれました。

あぁ、このセリフ、後輩に言いたかった!

2008-01-14 今(2008/01/14)、やりたいこと

やりたいことは、結構沢山あります。

実は、Perlノート系のネタも沢山スタックしています。

でも、なかなかまとめる時間がありません。


折角買ったPerlのラクダ本とプラクティス本も読み始めたい。

いざ、手に入れると、いつでも読めると安心となり、積読状態に・・・。


法華経読誦は、元旦2日から毎日つづいています。

今までに何度も読誦して、法華経の解説本で勉強をしていますが、読誦した内容と勉強した内容がリンクしないのです。

読誦しただけで、意味が分かるレベルになりたいです。


実は、白川静先生の「字統」を先日買いました。

今までは、「常用字解」をネタ本に「漢字起源と字解ページ」を書いていましたが、「字統」でそのページをパワーアップしたいと思っています。

2008-01-14 狭義での「てにをは」とは?

前々回の「てにをは」とは? は、広義すぎてイマイチでした。

なので今回は、狭義での「てにをは」とは? です。


「てにをは」とは、名詞の後に付く「は」「が」「を」「に」「と」「へ」「から」「で」「より」などのことを指します。

そして、これらを「助詞」といいます。

つまり、「てにをは」とは、「助詞」のエイリアスなのです。


それらの助詞のうち、「が」「を」「に」を格助詞といい、「が」は主格を表し、「に」は相手を表し、「を」は対象を表します。

また、「は」は、格助詞ではないのですが、文中の要素を主題化したり、対比的に表したりする役割があります。


格助詞のサンプル

格助詞は、事実を淡々と述べる場合に有効です。


「は」のサンプル

主題の「は」は、主題の次男を説明するという構造をもった文です。

また、対比の「は」は、ここに現れていない長男はどうした、という対比の構造をもった文にもなる場合があるのです。

参考:

2008-01-14 正規表現の拡張構文のうち簡単なもの

とりあえず、サンプルです。以下はすべてマッチします。
$bbb = '東京都庁';
$ccc = 'とうきょう都庁';
print "Match1", "\n" if ($bbb =~ /東京(?=都庁)/);  # 東京の後に都庁が続いている東京にマッチ
print "Match2", "\n" if ($bbb =~ /東京(?!議会)/);  # 東京の後に議会が続いていない東京にマッチ
print "Match3", "\n" if ($bbb =~ /(?<=東京)都庁/); # 東京の後に都庁が続いている都庁にマッチ
print "Match4", "\n" if ($ccc =~ /(?<!東京)都庁/); # 東京でないの後に都庁が続いている都庁にマッチ

ちなみに、拡張構文の「東京(?=都庁)」と普通構文の「東京(都庁)」は同じ結果になりますが、すべての拡張構文には後方参照がありません。


また、拡張構文では検索文字にパターンマッチ修飾子(imsx)が埋め込める
$_ = 'TOKYO';
# 普通構文
$ddd = 'Tokyo';
if (/$ddd/i) {
  print "$ddd\n";
}
# 拡張構文
$ddd = "(?i)Tokyo";
if (/$ddd/) {
  print "$ddd\n";
}

ちなみに、Unixコマンドegrepの受け付ける正規表現のことを拡張正規表現という。今回の拡張構文とまぎらわしい。

2008-01-13 有難嬉悲しメモ(2008/01/13)

ちなみに、WINDOW-XPのVB6で作成したEXEでは、上記は発生しません。

2008-01-13 runas実行時、パスワードを自動で入力したい

マルチユーザの場合、他のユーザIDでプログラムを実行したい場合があります。

runasを使えば、他のユーザIDでプログラムを起動することが出来ます。

しかし、パスワード入力を要求されるので、バッチ等ではSendKeysを使って対応します。

2008-01-13 「は」と「が」の違いについて

例えば、「大輔ボールを投げると、一郎がそれをジャストミートした」の場合、どこかしっくりきません。

これを、「大輔ボールを投げると、一郎がそれをジャストミートした」にすると、しっくりきます。


解説

「大輔は」にすると、遠くの述語の「ジャストミートした」にかかろとするので、おかしいなと思うわけです。

これを、近くの述語かかる「大輔が」にすると「ボールを投げると」にかかり、しっくりくるわけです。


しかし、微妙なニュアンスなので、なかなか難しいです。

参考:

2008-01-12 有難嬉悲しメモ(2008/01/12)

ここのところ、新年会やiPod nano対応でいろいろと忙しく、ご無沙汰でした!

では、ここ3日間にあった、有難嬉悲しメモです。



2008-01-12 スクリプトエンコーダ Windows Script Encoder

VBScriptやJScriptのスクリプトは、単なるテキストなので、セキュリティ的にはNGです。

セキュリティ的にするには、以下のスクリプトエンコーダを使用すると吉です。

http://www.microsoft.com/downloads/details.aspx?FamilyID=2976ee94-bec5-4314-84fd-8d7ec891c1c5&DisplayLang=ja

2008-01-12 『てにをは』とは?

ここに新しいカテゴリー『てにをはノート』をスタートさせます。

もともと、国語が苦手で、あいまいな『てにをは』を使っていたのですが、仕事で中国の人に『てにをは』を教える立場になってしまって・・・。

ということで、本カテゴリーで『てにをは』を再勉強していきます。

初回は、『てにをは』とは? です。


『てにをは』とは

そう、基本的には、漢文を訓読するときに使うものだったのですね!


参考:

2008-01-09 有難嬉悲しメモ(2008/01/09)

2008-01-09 SJIS漢字スペース対応のTrim

以下は、SJIS漢字スペースに対応したTrimです。

use strict;
my $string = "  あ あ あ   ";
print Trim($string), "\n";
sub Trim {
    my ($str) = @_;
    my $space = '([ \t\n\r\f]|\x81\x40)';
    $str =~ s/^$space+|$space+$//g;
    return $str;
}

このTrimは、文字列前後にある以下を削除します。

2008-01-08 有難嬉悲しメモ(2008/01/08)

2008-01-08 ref関数:リファレンスの存在判定(参照する型判定)

ref関数は、引数がリファレンスの場合は、リファレンスが参照する型(真)を返します。

それ以外の場合は、空文字列(偽)を返します。

返す型には、以下のものがあります。

尚、blessされたものであれば、型でなくパッケージ名(クラス名)を返します。

ref関数の使い方
if (ref($para) eq "ARRAY") {
    @wk = @$para; # $paraは配列のリファレンスです
}

2008-01-07 有難嬉悲しメモ(2008/01/07)

2008-01-07 PerlでのNULL

DBとか他の言語では、NULL値というものがありますが、Perlにはありません。

しかし、Perlには、ほぼ同じ概念の未定義値があります。

未定義値は、以下のように2通りの方法で設定することができます。

ちなみに、宣言しただけの状態の時も未定義値です。


テストサンプル
$aaa;
$bbb = "";
$ccc = 0;
$ddd = ();
$eee = {};
$fff = [];
undef $ggg;
@hhh;
@iii = "";
@jjj = 0;
@kkk = ();
@lll = {};
@mmm = [];
undef @nnn;
%ooo;
%ppp = ();
undef %rrr;

print '$aaa == 未定義', "\n" if (!defined($aaa));
print '$bbb == 未定義', "\n" if (!defined($bbb));
print '$ccc == 未定義', "\n" if (!defined($ccc));
print '$ddd == 未定義', "\n" if (!defined($ddd));
print '$eee == 未定義', "\n" if (!defined($eee));
print '$fff == 未定義', "\n" if (!defined($fff));
print '$ggg == 未定義', "\n" if (!defined($ggg));
print '@hhh == 未定義', "\n" if (!defined(@hhh));
print '@iii == 未定義', "\n" if (!defined(@iii));
print '@jjj == 未定義', "\n" if (!defined(@jjj));
print '@kkk == 未定義', "\n" if (!defined(@kkk));
print '@lll == 未定義', "\n" if (!defined(@lll));
print '@mmm == 未定義', "\n" if (!defined(@mmm));
print '@nnn == 未定義', "\n" if (!defined($nnn));
print '%ooo == 未定義', "\n" if (!defined(%ooo));
print '%ppp == 未定義', "\n" if (!defined(%ppp));
print '%rrr == 未定義', "\n" if (!defined(%rrr));
実行結果
C:\Documents and Settings\xxx>perl null.pl
$aaa == 未定義
$ddd == 未定義
$ggg == 未定義
@hhh == 未定義
@kkk == 未定義
@nnn == 未定義
%ooo == 未定義
%ppp == 未定義
%rrr == 未定義

2008-01-07 セレクトボックス・ラジオボタン・チェックボックス動作確認HTML

以下は、なにかとつまずくセレクトボックス・ラジオボタン・チェックボックスの動作確認HTMLです。

selectbox.htm
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>セレクトボックス・ラジオボタン・チェックボックス</title>
<script type='text/javascript'>
function onSubmitCheck() {
    alert("document.FM.select1[0].selected = " + document.FM.select1[0].selected);
    alert("document.FM.select1[1].selected = " + document.FM.select1[1].selected);
    alert("document.FM.select1[0].value = " + document.FM.select1[0].value);
    alert("document.FM.select1[1].value = " + document.FM.select1[1].value);
    alert("document.FM.select1.selectedIndex = " + document.FM.select1.selectedIndex);
    alert("document.FM.select1.options[0].value = " + document.FM.select1.options[0].value);
    alert("document.FM.select1.options[1].value = " + document.FM.select1.options[1].value);
    alert("document.FM.radio1[0].checked = " + document.FM.radio1[0].checked);
    alert("document.FM.radio1[1].checked = " + document.FM.radio1[1].checked);
    alert("document.FM.radio1[0].value = " + document.FM.radio1[0].value);
    alert("document.FM.radio1[1].value = " + document.FM.radio1[1].value);
    alert("document.FM.checkbox1[0].checked = " + document.FM.checkbox1[0].checked);
    alert("document.FM.checkbox1[1].checked = " + document.FM.checkbox1[1].checked);
    alert("document.FM.checkbox1[0].value = " + document.FM.checkbox1[0].value);
    alert("document.FM.checkbox1[1].value = " + document.FM.checkbox1[1].value);
    return false;
}
</script>
</head>
<body>
<form name="FM" onSubmit="return onSubmitCheck()">
<ul>
    <li><p>セレクト:<select name="select1" multiple>
        <option value="1">データ1</option>
        <option value="2">データ2</option>
        </select></p></li>
    <li><p>ラジオボタン1:<input type="radio" name="radio1" value="1" /></p></li>
    <li><p>ラジオボタン2:<input type="radio" name="radio1" value="2" /></p></li>
    <li><p>チェックボックス1:<input type="checkbox" name="checkbox1" value="1" /></p></li>
    <li><p>チェックボックス2:<input type="checkbox" name="checkbox1" value="2" /></p></li>
    <li><p><input type="submit" value="実行" /></p></li>
</ul>
</form>
</body>
</html>
補足:

上記3つの要素は、valueとcheckedまたはselectedのプロパティを該当オブジェクトに持っている。

特に、セレクトボックスは子要素のoptionsでもvalueを取得することができる。

また、単一セレクトならインデックス値をselectedIndexプロパティに持っている。

2008-01-04 有難嬉悲しメモ(2008/01/04)

2008-01-04 MS-SQLServer2005へネットワーク接続ができない

MS-SQLServer2000では他のDBへ簡単にネットワーク接続できたのに、SQLServer2005ではできません。

そう、デフォルトの設定が変わったのです。Server2005では以下の手順を試してみてください。

手順
参考

http://www.microsoft.com/japan/sql/ssj/tips/01.mspx

2008-01-04 JavaScriptでモーダルダイアログ

IEだとモーダルダイアログが可能です。(Firefox3.0でもOKとのうわさあり)

ちなみに、モーダルダイアログとは、本ダイアログ以外の操作ができないようにします。

以下に、サンプルをアップしときます。

参考

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpisdk/dhtml/references/methods/showModalDialog.asp

modal.htm
<html>
<head>
<title>テストshowModalDialog(親)</title>
<script type='text/javascript'>
function subModal() {
    //モーダルダイアログを表示し、戻り値を取得
    var value = showModalDialog('modaldialog.htm',window,'dialogWidth:320px;dialogHeight:240px;center:yes');
    alert(value);
}
</script>
</head>
<body>
<div>
<input type='button' value='開く' onClick='subModal()' />
</div>
</body>
</html>

modaldialog.htm
<html>
<head>
<title>テストshowModalDialog(子)</title>
<script type='text/javascript'>
function closeWindow() {
    //戻り値を設定し閉じる
    window.returnValue = 'ABC';
    window.close();
}
</script>
</head>
<body>
<div>
<input type='button' value='戻る' onClick='closeWindow()' />
</div>
</body>
</html>

2008-01-03 有難嬉悲しメモ(2008/01/03)

2008-01-02 有難嬉悲しメモ(2008/01/02)

2008-01-01 有難嬉悲しメモ(2008/01/01)

あけまして、おめでとうございます!

初っ端、有難嬉悲しメモです。


さて、今年の抱負は、以下の通りです。


アクセスして頂いた皆様、今年もよろしくお願いいたします。