frog.raindrop.jp

.knowledge
::December 2003

SUN MON TUE WED THU FRI SAT
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

B L O G T I M E S

Prev: November 2003

Next: January 2004

Last Modified
November 19, 2009 10:39 AM

Search



あわせて読みたいブログパーツ
RSS feed meter for http://frog.raindrop.jp/
counter
< November 2003 | January 2004 >

December 25, 2003

レコードセット→XML→HTMLなレシピ

時間なし。ソースのみ。

<%
Dim strSQL
Dim strCon
Dim adoRec
Dim xmlDocXml
Dim xmlDocXsl

	'接続文字列
	strCon	= "Provider=SQLOLEDB;"
	strCon	= strCon & "Data Source=(local);"
	strCon	= strCon & "User ID=sa;"
	strCon	= strCon & "Password=pass;"
	strCon	= strCon & "Initial Catalog=Master;"
	
	'SQLを実行
	strSQL	= "SELECT * FROM MYTABLE"
	Set adoRec		= Server.CreateObject("ADODB.Recordset")
	adoRec.CursorLocation	= adUseClient
	Call adoRec.Open(strSQL, strCon, adOpenForwardOnly, adLockReadOnly, adCmdText)
	Set adoRec.ActiveConnection	= Nothing
	
	'xml作成
	Set xmlDocXml		= Server.CreateObject("MSXML2.DOMDocument")
	xmlDocXml.async		= False
	Call adoRec.Save(xmlDocXml, adPersistXML)
	Call adoRec.Close()
	
	'xsl読み込み
	Set xmlDocXsl	= Server.CreateObject("MSXML2.DOMDocument")
	xmlDocXsl.async	= False
	Call xmlDocXsl.load("template.xsl")

	'出力する
	Call Response.Write(xmlDocXml.transformNode(xmlDocXsl))
%>

December 19, 2003

文字列を折り返す・・・とか

「New Comment Posted to の文字化けをなおす。」でみた、Movable Typeのメールの本文作成するとこ

require Text::Wrap;
$Text::Wrap::cols = 72;
$body = Text::Wrap::wrap('', '', $body) . "\n$link_url\n\n" .
	$app->translate('IP Address:') . ' ' . $comment->ip . "\n" .
	$app->translate('Name:') . ' ' . $comment->author . "\n" .
	$app->translate('Email Address:') . ' ' . $comment->email . "\n" .
	$app->translate('URL:') . ' ' . $comment->url . "\n\n" .
	$app->translate('Comments:') . "\n\n" . $comment->text . "\n";

$body	 = jcode( $body )->jfold(( 72, "\n" ));
$body	.= "\n$link_url\n\n" .
	$app->translate('IP Address:') . ' ' . $comment->ip . "\n" .
	$app->translate('Name:') . ' ' . $comment->author . "\n" .
	$app->translate('Email Address:') . ' ' . $comment->email . "\n" .
	$app->translate('URL:') . ' ' . $comment->url . "\n\n" .
	$app->translate('Comments:') . "\n\n" . $comment->text . "\n";

のがよさげか?

名前付き引数をサクッとハッシュ化する

Perlで名前つき引数ってこんな感じに書く。サブルーチン内では省略されたときの初期値をエレガントに設定する。

sub mySub {
	%args	= (
		PARAM1		=> '', 
		PARAM2		=> 5, 
		PARAM3		=> '', 
		@_
	);
	return \%args;
}
# 呼び出す
$ret	= mySub( PARAM1	=> 'foo', 
				PARAM2	=> 123, 
				PARAM3	=> 'bar');

でも、VBな私は引数名の大文字小文字の区別がないようにしたい。さらに、ハッシュのキーをすべて大文字にしたい。したがってこう。

sub mySub {
	my %args	= @_;
	%args	= (
		PARAM1		=> '', 
		PARAM2		=> 5, 
		PARAM3		=> '', 
		( map { uc( $_ ) => $args{$_} } keys( %args ) )
	);
	return \%args;
}
# 呼び出す
$ret	= mySub( Param1	=> 'foo', 
				pArAm2	=> 123, 
				param3	=> 'bar');

New Comment Posted to の文字化けをなおす。

[raindrop::diary] New Comment Posted toの件を、取り急ぎなおしてみた。全体をちゃんと見たわけじゃないので、適当。だけどちゃんと直った。

# MT::App::Comments
# From Line 349
# <<< MODIFY
#            my $charset = $app->{cfg}->PublishCharset || 'iso-8859-1';
            my $charset = 'iso-2022-jp';
# >>> MODIFY
            $head{'Content-Type'} = qq(text/plain; charset="$charset");
            my $body = $app->translate(
                'A new comment has been posted on your blog [_1], on entry #[_2] ([_3]).',
                $blog->name, $entry->id, $entry->title);
            require Text::Wrap;
            $Text::Wrap::cols = 72;
            $body = Text::Wrap::wrap('', '', $body) . "\n$link_url\n\n" .
              $app->translate('IP Address:') . ' ' . $comment->ip . "\n" .
              $app->translate('Name:') . ' ' . $comment->author . "\n" .
              $app->translate('Email Address:') . ' ' . $comment->email . "\n" .
              $app->translate('URL:') . ' ' . $comment->url . "\n\n" .
              $app->translate('Comments:') . "\n\n" . $comment->text . "\n";
# <<< ADD
			require Jcode;
			$body = new Jcode( $body )->jis();
# >>> ADD

あとは、extlibにJcodeをいれる。こんだけ。

December 17, 2003

Perlを秀○強調表示する

某 秀○エディタ(伏字なんだか何なんだか)用の強調表示とカラー表示定義です。
Download file

URLエンコード/デコード

覚え書き的ですが

# エンコード
$value	=~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;

# デコード
$value	=~ tr/+/ /;
$value	=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

December 15, 2003

@INC

Movable Typeの場合、@INC(ライブラリ検索パス)にユーザ定義パスを追加する処理はこんな感じで実現している。

my($MT_DIR);
BEGIN {
    if ($0 =~ m!(.*[/\\])!) {
        $MT_DIR = $1;
    } else {
        $MT_DIR = './';
    }
    unshift @INC, $MT_DIR . 'lib';
    unshift @INC, $MT_DIR . 'extlib';
}

私もそれに倣ってずっとunshiftで押し込んでたんだけど、実はプラグマが存在することを最近知った。これだと、モジュール内でユーザ定義ライブラリ内のモジュール'hoge.pm'を参照するときも、requierでなく、useで書くことができる。

use lib qw(./lib ./extlib);
use hoge;

December 10, 2003

このページにはセキュリティ保護された項目と保護されていない項目が含まれています。

DBの検索条件を指定して、検索結果を表示する、こんなフレームページを作成しました

<!-- フレームドキュメントのフレーム定義部分 -->
<frameset rows="*,60">
	<!-- 検索結果を表示するフレーム -->
	<frame id="frame_main" name="frame_main" frameborder="0" />
	<!-- 検索条件のフォーム -->
	<frame id="frame_menu" name="frame_form" frameborder="0" src="form.asp" />
	<noframes>
		(省略)
	</noframes>
</frameset>
<!-- 
実際にはこんな感じ
┏━━━━━━━┓
┃frame_main    ┃
┃              ┃
┃              ┃
┠───────┨
┃frame_form    ┃
┗━━━━━━━┛
-->

ページの初期表示に検索結果を表示するため、form.aspのbody.onloadにフォームをサブミットするコードを書いておいたのですが、httpsでアクセスすると、表示時に、'このページにはセキュリティ保護された項目と保護されていない項目が含まれています。 保護されていない項目を表示しますか?'が表示されてしまいます。frame_mainに表示するものがないため、UAが'about:blank'を表示しようとして起こるみたいです。ダミーのドキュメントを作成して、frameタグのsrcに指定しておくと解決します。

December 8, 2003

Oracle クライアントとネットワーク コンポーネントが見つかりません。

UDLファイルを作成して、Microsoft OLE DB Provider for Oracleを使用してOracleに接続するテストを行い、成功することを確認したのですが・・・ASPより接続すると以下のエラー

-2147467259(Microsoft OLE DB Provider for Oracle)
Oracle クライアントとネットワーク コンポーネントが見つかりません。これらのコンポーネントは Oracle Corporation から提供され、Oracle Version 7.3.3 (またはそれ以降) のクライアント ソフトウェアの一部としてインストールされます。
プロバイダは、これらのコンポーネントがインストールされるまで機能しません。

原因は、c:\oracle\ora92 ディレクトリに、Administrators, Authenticated Users, SYSTEMのみアクセス許可になっていたためでした。IUSR_(コンピュータ名)を追加すると、接続可能になりました。

開発環境がFAT32、実機がNTFSだったのが敗因でした:-(

December 6, 2003

OLE DB プロバイダ 'MSDAORA.1' のインターフェイスを作成できませんでした

実機セットアップのため、Windows 2000 Serverに、新たにMSDEとOracle Clientをインストールして、MSDEにデータベースを作成し、Oracleのリンクサーバを作成しました。

そして、MSDEから使用するためOracleの表をビューとして作成しようとするとこんなエラーが。

1>SELECT * FROM DB_SVR..USER_FOO.TABLE_BAR
2>GO
メッセージ 7302、レベル 16、状態 1、サーバー TESTSRV、行 1
OLE DB プロバイダ 'MSDAORA.1' のインターフェイスを作成できませんでした。
1>

インターフェースと言う言葉から想像するに、COM回りのエラーであろうと想像は付くのですが(OLE DBってCOMですから)MDACの再インストールを行っても、MSDEの再インストールを行っても解決しませんでした。

一応、
280106 - [HOWTO] SQL Server で Oracle へのリンク サーバーのセットアップおよびトラブルシューティングを行う方法[support.microsoft.com]
に情報がありますが、REGSVR32で確認する前にMDACの再インストールをしたので、あまり有用な情報とは思えませんでした。

だいぶん長いこと試したのですが、結局は、

  1. コントロールパネル→管理ツール→コンポーネント サービス を開く
  2. ツリーの コンポーネント サービス>コンピュータ>マイ コンピュータ を右クリックして、プロパティを表示する
  3. 規定のセキュリティ タブの、規定のアクセス許可 で、規定値の編集 を押下しレジストリ値のアクセス許可 ウインドウを表示する
    ちなみにWindows Xpでは、ここではディレクトリセキュリティを編集するみたいな画面が出てきた記憶があるが、2000系はちょっと違うらしい。
  4. 追加 を押下し、ユーザーとグループの追加 ダイアログでEveryoneを選択して追加を押下し、OKする

で、ビューが作成できるようになりました。Everyoneでなく、MSDEサービスがどのユーザの権限で実行されるのか調べて設定し直さなくてはいけないのですが、それはまたあとで。とりあえず原因は権限不足、だったみたいです。

2003.12.08 追記
SYSTEMアカウントに対し、権限を追加すればOKです。

December 4, 2003

クライアントスクリプトで複数ページで同じ初期化処理を行う

複数ページの<body onload="....">に同じクライアントスクリプトの初期化処理を記述するのはメンテナンスが大変、というあなたに朗報です!

...というほどのものではないのですが、まあ、こんな感じで、このスクリプトを読み込むすべてのページで、同じ初期化処理を行うことができます。

// init.js
window.onload	= function () {
	// 初期化処理を記述します...
	return true;
}

そして、それぞれのページのhead要素内に

<script type="text/javascript" src="./init.js"></script>

と記述します。

ここでは関数を代入していますが、

// init.js
window.onload	= 'init(this);'

などと、スクリプトを文字列で指定しても動きそうな気もします。(確認していません)

また、もちろんonload以外でも、たとえば

window.onblur	= function () {
	window.focus();
}

なども動きます。

December 3, 2003

COALESCEの読み方

しょーもないことですが、SQL関数のCOALESCEって、いつもちょっと読み方に困ってました。
gooの英和辞典で発音を調べてみると「コアレス」てな感じみたいです。

December 2, 2003

SQL*Plusで'&'は使えない?

HTMLに出力することを考えて、NULL項目は'&nbsp;'と出力させようとしたSQLをテストしようとSQL*Plusで実行したのですが

SQL> SELECT NVL(emp_cd, '&nbsp;') AS emp_cd
  2  FROM emp_tbl
  3  /
nbspに値を入力してください:

&は変数として扱われるの?そんなん知りませんでした。これはSQL*Plusの置換変数と言って、実行時に値を聞いてきます。ちなみに、&&var、と言うように&を2つ重ねると、そのSQL文内の後続の&varすべてを置換します。

で、置換変数を無効にするにはこうするそうです。

SQL> SET DEFINE OFF

December 1, 2003

そういや、Oracleといえば、

こういうのもありましたね・・・

SQL> SELECT NVL(TRIM('   '), 'null!') FROM DUAL
  2  /

NVL(T
-----
null!

(周)年は-4713と+9999の間で指定しなければなりませんが、0であってはなりません。

オラクルで、CHAR(8)で年月日の区切りなしで日付を格納してる列を、TO_DATE, TO_CHARでSELECTすると、こんなエラーが出ました。

ORA-01841: (周)年は-4713と+9999の間で指定してください。0であってはなりません。

エラーメッセージを見てもさっぱりわけがわからないのですがたまたまデータが空白の行でした。そりゃあそうですね。

こんな感じで実行すると、同じエラーになりました。

CREATE TABLE SAMPLE_TABLE(
	CHAR_DATE	CHAR(8)
	)
/
INSERT INTO SAMPLE_TABLE
	VALUES('        ')
/
SELECT 
	TO_CHAR(TO_DATE(CHAR_DATE, 'YYYYMMDD'), 'YYYY/MM/DD')	AS FORMATED_DATE
FROM SAMPLE_TABLE
/

このエラーのわけがわからなくて、Web上の情報をあさったところ、面白い事例がありました。