ChaichanPapa-World !

燈明日記(2007/09

◆ インデックス

◆ 2007年9月

■ 2007-09-30 Microsoft SQL Server 2000でDB更新時に文字列データ中に引用符が含まれていたら

SQLでは、文字列データは引用符で囲み列項目に代入します。

Update xxTBL Set Name = 'hirohito'

しかし、文字列『hirohito』が『hiro'hito』のように、引用符が含まれていたらエラーになります。

このような時は、引用符を2つ重ねて『hiro''hito』とします。

■ 2007-09-29 IEで『警告:ページの有効期限切れ』メッセージが出たら

IEからファイルのアップロードをした後に、元のページに戻ろうして戻るボタンを押すと、このメッセージが表示される場合があります。

これは、CGIでアップロードの処理後、『アップロード出来ました』ページを標準出力すると発生する現象です。

この現象は、IEのバクではなく仕様とのことらしいです(ネットでのうわさでは)。


CGI作成で、この現象を回避するには、『アップロード出来ました』ページを標準出力するのでなく、一旦、HTMLファイル(tmp.html)に出力し、それを httpのLocationで飛ばします。

print "Location:tmp.html\n\n";

尚、CGIと同フォルダにファイル出力(tmp.html)をすると、上記の様にパス指定(http://...)なしのファイル名のみ指定でいけます。

また、当然、CGIからの書き込み権がそのファルダに必要です。

■ 2007-09-28 binmode関数とは

今回は、ファイルOpen後、よく見かけるbinmode関数です。

binmode関数は、バイナリファイルのI/O時に使用します。


バイナリファイルをOpen後、必ず、そのハンドルをbinmode関数でバイナリモードにします。

必ずと言いましたが、実は、UNIX系のプラットフォームでは、何の効果もありません。


しかし、プラットフォームに関わらず、バイナリファイルに対しては、binmode関数を使います。

そして、テキストファイルに対しては、binmode関数を使ってはいけません。


要は、プラットフォームに依存するロジックにはしないということが推奨とのことです。

ちなみに、バイナリファイルをbinmode関数なしで読み込むと、テキストファイルでの改行あたるコードの扱いに問題が起こります。

■ 2007-09-27 日と曰く

日は、太陽の形の象形文字です。

一方、曰くは、日とよく似ていますが、実は祝詞(のりと)を入れるサイ(口)の蓋が少し開いている形なのです。

少し開いたそこには、神のお告げの反応があらわれると思われていました。

そのことから、神のお告げこと、神の仰せのことを『曰く』という。

■ 2007-09-26 ループ制御文 next,last,redo,goto

今日は、ループ制御文です。


サンプル
L01:for ($j = 0; $j < 4; $j++) {
    $i = 0; 
    while ($i < 4) {
         $i++;
         if ($i == 2 and $j == 2) {
             last L01;
             #next L01;
             #redo L01; # 条件を変えないと永久ループになる
         }
         print "\$j = $j \$i = $i", "\n";
    } 
}
print "\$j = $j \$i = $i", "\n";

■ 2007-09-25 品格とは

品格の品は、すでに何度もご紹介している通り、祝詞を入れるサイ(口)を3つ重ねたものです。

つまり、神に対して多くの祈りを合わせて行うことを品といいます。


ちなみに、これを隠された場所で行うことを區(区)といい、大きな声で祈ることを歐(欧)いう。

また、祈る大きな声そのものを謳(うたう)といい、祈りの実現を強く願いサイを打つことを毆(殴)いう。


一方、格は、夂と口と木が組み合わさって出来た字で、夂は下ってくる足の象形、口はサイで、木は枝のある木の象形。

祝詞を入れるサイ(口)の前で神の降下を祈ることから「いたる」の意味があり、神が「いたる」ことを来格いう。


また、来格した神は、神意によってことを「ただす」ので、戒めのことばを格言という。

ただした「正しい」ことには、抵抗が多く、からまれるので「からむ」の意味もある。


そして、「からむ」ことから絡み合って争うことを格闘といい。

木の枝も「からむ」ことから、骨組みを形つくるので、骨格という。

■ 2007-09-24 ハッシュキーは引用符で囲むべきか?

以下の5通りは、すべて正常に動作します。

use strict;
my %aaa;
my $xxx = "xxx";

$aaa{xxx} = 111;
print "-1- " . $aaa{xxx},     "\n"; #1

$aaa{'xxx'} = 111;
print "-2- " . $aaa{'xxx'},   "\n"; #2

$aaa{"xxx"} = 111;
print "-3- " . $aaa{"xxx"},   "\n"; #3

$aaa{"$xxx"} = 111;
print "-4- " . $aaa{"$xxx"},  "\n"; #4

$aaa{$xxx} = 111;
print "-5- " . $aaa{$xxx},    "\n"; #5

つまり、ハッシュキーに引用符があってもなくてもOKなのです。

仕様的には、どうかとググッテみましたが、わかりませんでした。

ただ、PHPでは、引用符がないとダメとのことでした。


個人的には、中括弧でハッシュキーを明示しているので、引用符は不要かなと思うのですが…。

個人の好みでいいんですか? 誰にともなく…。

■ 2007-09-23 漢字とコリア語

コリア語とは、朝鮮語、或いは韓国語のことです。

実は、朝鮮語と韓国語は、同じ言語で、昔は朝鮮語と呼ばれていましたが、今では韓国語と呼ぶ場合が多いとのことです。

しかし、いろいろあって、コリア語と呼ぶのが無難ということです。


コリアとは、もともと昔の朝鮮半島の高麗(コウライ)の発音が西洋社会に伝わって世界的にコリアと呼ばれるようになりました。

日本でいえば、『ニッポン』が『ジャパン』になったのと同じです。


で、コリア語と言えばハングルのことのように思われていますが、実は、もともとは、ほとんど漢字なのです。

ハングルは、単なる表音文字で、漢字の発音を表す記号のことなのです。

ハングルは、漢字1文字単位にその発音を、母音や子音の記号を組み合わせて表現します。

日本語に譬えると、漢字1文字の発音を、読みのカタカナが合体して、合体カタカナ1文字が漢字1文字を表す感じです。


ということで、コリア語の漢字と日本語の漢字は、同じ漢字なので意味はほとんど同じで、発音も非常に似ています。

しかし、表現がハングルなので意味が全くわからないのです。

逆にいうと、ハングルの発音から漢字がわかれば、日本人なら意味が理解できるのです。


そう、ハングルの発音から漢字に変換する訓練をすればいいわけです。語順も日本語と同じだそうです。

ちなみに、中国語の語順は、英語に近いとのことです。

ある意味、コリア語は、日本人にとって一番習得しやすい外国語と言えるかもしれません。

外国語(英語、中国語、コリア語)は、毎晩11時過ぎのNHK教育番組で勉強しないと……。

■ 2007-09-22 Perlでのシステム関数&サブルーチン呼び出しの書き方

同名(たとえば、time)のシステム関数とサブルーチンをいろいろな呼び出し方でテストをしてみました。

テストソース
print "1---", time,     "\n";
print "2---", time(),   "\n";
print "3---", &time(),  "\n";
print "4---", &time,    "\n";
#print "5---", timex,   "\n";
print "6---", timex(),  "\n";
print "7---", &timex(), "\n";
print "8---", &timex,   "\n";
sub time {
    return "--ローカルtime--";
}
sub timex {
    return "--ローカルtimex--";
}
実行結果
1---1190439953
2---1190439953
3-----ローカルtime--
4-----ローカルtime--
6-----ローカルtimex--
7-----ローカルtimex--
8-----ローカルtimex--
まとめ

よって、システム関数は括弧付きが良く、サブルーチンは『&』付きが良いと思います。

■ 2007-09-21 MS-SQLサーバー2000で日付入力のデリミタ

クエリアナライザで日付型データを入力するときに、デリミタが『/』はダメで『-』にするとOKです。

ちなみに、エンタープライズマネージャは『/』なんだよね。


2007/09/20 --> 2007-09-20

■ 2007-09-21 ifの反対はunless

ifは、日本語訳では、『もしxxであるならばyy』です。

unlessは、ifの反対で『もしxxでないならばyy』です。


Perlでも同様です。

Perlでは、xxが条件文で、yyが実行文になります。


以下の実行文の2行は、等価になります。
$b = 2 if ($a != 1);
$b = 2 unless ($a == 1);

■ 2007-09-20 Perlで and, &&, or, || の違いと便利な使い道

これらは、論理演算子で、普通、if文で使用します。

今回は、andと&&等の違いやif文以外の便利な使い道などを紹介します。

違い

andと&&、orと|| は、各々同じものですが、演算子の優先順位が異なります。

Perl5から導入された、優先順位の低い andと orを使う方が推奨とのことです。

(優先順位の低い方が、他の演算子との影響が小さいため)


便利な使い道

or論理演算子は、A or Bで、どちらか一方が真ならば真となります。

Aが真であれば、Bの真偽に関係なく真となるため、Bの評価は行わないです。

これを利用して、Aが偽のときにBを行うのに、orが使われます。

# ファイルを開く。開けなければメッセージを出して終了。
open (IN, "file.txt") or die "Cannot open the file\n";

and論理演算子は、A and Bで、両方とも真でなければ真にならないです。

Aが偽であれば、Bの真偽に関係なく偽となるため、Bの評価は行わないです。

これを利用して、Aが真のときにBを行うのに、andが使われます。

# ファイルを開く。開ければ1レコードを$dataに読み込む。
open (IN, "file.txt") and $data = <IN>;

■ 2007-09-19 Perlでフルパスを分解して配列へ

フルパスのファイル名を、ファイル名のみ、パス名、拡張子名に各々分解するには、fileparse関数を利用します。

use strict;
use File::Basename;
my $file = 'd:\mydir\test\filex.html';
my @fileparse = fileparse($file, '\.[^\.]+');
print '$fileparse[0]: ' . $fileparse[0] . ""\n"";
print '$fileparse[1]: ' . $fileparse[1] . ""\n"";
print '$fileparse[2]: ' . $fileparse[2] . ""\n"";

尚、fileparse関数の第二引数は、拡張子(ポツを含む)の正規表現を指定します。

ちなみに、その \.[^\.]+ は、拡張子の1文字目がポツで、2文字目以降はポツ以外の1回以上の繰り返し。

■ 2007-09-18 IEテキストボックス入力で、キーボードレイアウトが英語になったら

メモ帳などでは、正常に入力できるのに、なぜが、IEテキストボックス入力で『@』を入力しているの『[』になったりすることがあります。

原因不明ですが、対処法は以下です。

reg addコマンドで一発で直すこともできます。

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000411" /v "Layout File" /d "KBDJPN.DLL" /t REG_SZ /f

http://okwave.jp/qa822225.html

尚、レジストリ操作なので、あくまでもご自分の責任でお願いします。

コマンド内容に関しては、以下を参考のこと

■ 2007-09-17 秋のお彼岸会

法華経ブログ更新(秋のお彼岸会)

■ 2007-09-17 Perlでの時間の計算処理

時間の計算は、一旦、経過秒数にしてから計算し、リストして編集する。

そう、上記の3つの関数を駆使すれば、大体の時間計算処理は、できるはずなのです。

■ 2007-09-17 MS-SQLサーバー2000で長い文字列を使用する時の留意点

text型に長い文字列が入っている場合、クエリアナライザだとすべて表示されない。(騙された罠…実際はちゃんと入っている)

ちなみに、エンタープライズマネージャでは、すべて表示されます。

■ 2007-09-16 VB-TIPSメモ更新

VB-TIPSメモは、HTMLファイルのサイズが大きくなりすぎたので、1TIPS1ページに変更しました。

■ 2007-09-16 CGIで重たい処理をするには?

CGIで重たい処理をする時は、タイムアウトになってしまうので、fork等で重たい処理を切り離せばいいわけです。

UNIX系では、fork後、標準出力をクローズすると切り離せます。

しかし、WINDOWS系では、クローズしても切り離せないのです。

そこで、WINDOWS系では、ATコマンドで重たい処理を切り離します。


($sec, $min, $hour) = localtime(time + 60); #1分後にATコマンドから起動するため
my $rc = system "c:\\windows\\system32\\at.exe $hour:$min c:\\Inetpub\\wwwroot\\cmd_omotai.bat";

尚、CGIからATコマンドを発行できる権限がat.exeに必要です。

■ 2007-09-15 IISインストールメモ

IISはインターネットインフォメーションサービスで、主にWEBサーバーやFTPサーバーの機能のことです。

WINDOWS-XPでは、コントロールパネルの『プログラムの追加と削除』の『WINDOWSコンポーネント追加と削除』で簡単にインストールすることが出来ます。

インストール後は、運が普通ならHTMLやASPは、設定なしで動きます。

しかし、すでにApacheがインストールされていたり、PerlでCGIをするとか、WEBからEXCELを制御するとかだといろいろと大変なことになるのです…たぶん。

以下は、その大変だった時のメモです。何かの参考になれば幸いです。

■ 2007-09-14 EXCEL(2003 SP2)で長い文字列をセルに格納するときの留意点

シート全体をコピーし、別ブックのシートにペーストすると、長い文字列が格納されているセルは、データが切り捨てられる。(具体的には、476バイト以降が切り捨てられる)


また、EXCELデータをCSVデータに落とした時に、476バイト以上のセルは、『##########……』になってしまう。

■ 2007-09-13 PerlでMS-SQLサーバーDB上のNULLを判断するには?

Selectした項目データに、NULLが入っているか、いないかは、defined関数で判断ができる。


@AoAにDB読み込みデータが2次元(行列)で入っているとして。

if (!defined($AoA[0][0])) {
    print "NULLデータ", "\n";
}

■ 2007-09-12 EXCELからCSVデータを落とすときのカンマの数

EXCELからCSVにデータを落とすと、行によってカンマの数が異なる場合がありませんか?

原因は、たぶん以下です。

Excel では CSV 形式を含め、テキストファイルを扱う際に、16 行のデータを 1 つの単位とします。テキスト ファイルはまず、16 行ごとに区切られ、各区分内の最大の列数(1 行あたりの区切り数)に統一されます。

  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
http://support.microsoft.com/kb/400253/ja

とりあえず、EXCEL 2003 SP3では、発生していません。

■ 2007-09-11 捨てると拾う

捨の舎は、旧字では舍になっています。

下の口は、祝詞(のりと)を入れるサイ(口)です。

上のは、取ってのついた長い針(舍)です。

それを、手(手偏)でもって、サイを上から突き刺し、祝詞の祈りの効果を捨てさせることを捨という。


一方、拾は、祝詞(のりと)を入れるサイ(口)に蓋をして合わせることをいいます。

そのように取り揃えることを拾という。

そこから、拾の字は、混乱した状態をうまく取りまとめることの、収拾にあてられる。

■ 2007-09-10 CSVデータからXLSデータにするときのセル属性を制御する

プログラムからCSVデータをセルに代入すると、データの種類によってEXCELが自動変換をしてしまい、思わぬ結果になる場合があります。特に%系のデータなど。


そのような時は、すべてセルの属性を文字列とします。

ただし、文字列にすると、不要なスペース等が表面化する場合があるので、それを調整(削除等)します。


具体的には、セル毎のNumberFormatLocalプロパティに『@』を代入し、代入文字列の前後のスペースを削除します。

尚、NumberFormatLocalは、Perlではハッシュのキー値になります。

■ 2007-09-09 8月分更新パート2

以下のページへ8月分を更新しました。

■ 2007-09-09 文字という漢字の意味

文字の『文』は、昔は紋様の紋と同じ意味で、刺青や絵などのことをいいました。

一方、『字』は、ウ冠は廟(ミタマヤ)で、そこに子供が生まれたことを報告する儀礼のことをいいました。

そして、両方で一つの単語として文字となったのです。


また、漢字も当然文字に含まれます。

漢字の作り方は、6通り(六書)あるといわれています。

象形と指事は、形や絵の紋様のことで、すでに説明した通り『文』に相当します。

会意と形声は、象形と指事の親から生まれた子で、すでに説明した通り『字』です。

尚、転注と仮借は、文字を作る観点からは、単に使用範囲を広げただけものです。


ということで、はじめに紋様や絵があり(文)、それらを組み合わせて生まれた(字)、漢字等の文字が出来てきたのです。

■ 2007-09-08 法華経ブログ更新

法華経に出てくる仏さま達

実は、調べるのに結構時間が掛かりました。

■ 2007-09-07 WINDOWSサービスのOnStartをデバッグするには

はじめ、簡単なプロトタイプ(プログラム)のWINDOWSサービスを作成後実行し、そのプロセスにアタッチしてデバッグし、プログラムを仕上げます。


しかし、OnStart時のロジックをデバックする時には、アタッチで、すでにOnStart時を過ぎてしまっていて、デバックのタイミングがありません。


そんな時は、OnStart時のロジックへ暫定的に sleep を入れれば、sleep中にアタッチを行い、sleepの後にブレイクポイントを置けば、そこに制御が来るのです。

■ 2007-09-06 正規表現の量指定子の『*』と『+』の違い

/ab*c/ は、ac、abc、abbbbc などにマッチ

/ab+c/ は、abc、abbbbbbbbc などにマッチ


ちなみに、

$_ = "abbbbbbc";
print "-1-\n" if /ab*c/;     # ac、abc、abbbbc などにマッチ
print "-2-\n" if /ab+c/;     # abc、abbbbc などにマッチ
print "-3-\n" if /ab?c/;     # ac、abc にマッチ
print "-4-\n" if /ab{5}c/;   # abbbbbc にマッチ
print "-5-\n" if /ab{5,}c/;  # abbbbbbbbc などにマッチ
print "-6-\n" if /ab{5,7}c/; # abbbbbc、abbbbbbc、abbbbbbbc などにマッチ

■ 2007-09-06 8月分更新パート1

以下のページを更新しました。

■ 2007-09-05 EXCELで任意のセルから最終行セルを一気に選択するのは

任意のセル(隣接複数セルでも可だし、行指定でも可)を選択後、『Ctrl Shift ↓』キーを同時に押す。

すると、最終行セルまで一気に選択ができる。


尚、この状態で、任意の文字を入力し、『Ctrl Enter』キーを同時に押すと、選択されているすべてのセルに入力文字が反映される。

■ 2007-09-04 s/// と tr/// の違い

s/// は置換で、 tr/// は変換。

詳しくは、以下で!

http://www.rfs.jp/sb/perl/02/09.html

■ 2007-09-04 s/// と m// での oオプション とは

oオプションは、対象となるパターンが変数を含んでいても、その変数は一回しか評価しない。

これによって、実行時のパターンの再評価を避けるころができる。(再評価しないためスピードアップ)


次の例では、$s =~ /$arg/o の$argの内容展開をループで毎回評価せず、はじめの一回だけ評価する。

$arg = "abc";
open(FH, "xyz.txt");
while($s = <FH>) {
    if ($s =~ /$arg/o) {
        print $s, "\n";
    }
}

■ 2007-09-04 tr/// のいろいろな使い方メモ

$w = 'BOOK@RFS.JP';
$w =~ tr/A-Z/a-z/; # 小文字に正規化
print $w,"\n";
> book@rfs.jp 

$cnt = $w =~ tr/././; # $w に含まれる . の数を数える
print $cnt,"\n";
> 1

$w =~ tr/a-zA-Z/ /cs;  # 英字以外をスペースに変換
print $w,"\n";
> book rfs jp

$w =~ tr/a-zA-Z//s; # 連続した単語をひとつにまとめる
print $w,"\n";
> bok rfs jp 
http://www.rfs.jp/sb/perl/02/09.html

■ 2007-09-03 MS-SQLサーバーでのIdentity列の初期化

たとえば、Identity列は、すべてのレコード削除(データクリア)後、新たにデータを追加しても、前回値からシーケンス番号が振られます。

これを『1』から振り直したい場合は、データクリア後、クエリアナライザ等で以下のコマンドを発行します。

DBCC CHECKIDENT([テーブル名],RESEED, 0)

■ 2007-09-02 SMTPモジュールでの複数アドレスメールToの罠

SMTPモジュールで、送信先メールアドレスを設定する箇所は、メールヘッダーとtoメソッドで最低2箇所があります。

つぎに、その2箇所の送信先メールアドレスへ複数のアドレスを設定する場合、以下の注意が必要なのです。


my $mailto = 'aaa@bbb.co.jp, xxx@yyy.co.jp; # 複数のアドレスを、文字列内リストで表現
my @mailto = split(',', $mailto);           # 複数のアドレスを、配列変数リストで表現
#メールヘッダー設定
my $header = << "MAILHEADER";
To: $mailto
Subject: $subject
:
:
#メール送信
my $smtp = Net::SMTP->new('mailhost');
$smtp->to(@mailto);
:
:

で、何が罠かというとメールヘッダーの「To: $mailto」は文字列内がリストで、

toメソッドの「$smtp->to(@mailto);」は、配列変数リストというところ。


つまり、文字列内リストの「$smtp->to($mailto);」だといくらやってもメール送信されない…(罠)。

■ 2007-09-01 EXCELで『#N/A』とは

#N/A とは、値がない(Not Available value)という意味。


参考:Excel エラー値一覧

http://www.relief.jp/itnote/archives/000012.php