2008年02月29日

ことの葉ひらひら その19

「神は運命を与えたもう、けれど選択するのは人間です。」

〜森の魔女〜


大切なのは、「選択」すること。そして、その「選択」の結果に責任を持つことだと思うのです。猫
posted by 台北猫々 at 21:58| Comment(0) | TrackBack(0) | ことの葉

2008年02月28日

フラッシュバックドロップ!

なんか、プロレスの技みたいですが、違います。

ついに、Oracle10gになってDROPしてしまったテーブルを復活できるようになりました。(フラッシュリカバリの進化形ですね)

間違って「SAMPLE」テーブルをDROPしてしまったとします。

DBA権限を持つユーザ(SYSTEMとか)で以下のSQL実行します。
↓のSQLはOracleの「ゴミ箱」を表示します。(NLSSORT関数のくだりは、大文字/小文字を無視する指定です)
select original_name, type, ts_name, droptime, dropscn, object_name, owner
from dba_recyclebin
where NLSSORT(owner, 'NLS_SORT=BINARY_CI') = NLSSORT('taipei_neko', 'NLS_SORT=BINARY_CI')


original_nametypets_namedroptimedropscnobject_nameowner
SAMPLETABLEUSERS2008-02-23:18:29:03629095BIN$TxcezCXaS4iFz2XLZVvS5Q==$0TAIPEI_NEKO


ゴミ箱に残っています。
では、これを復活します。「TAIPEI_NEKO」ユーザで以下のSQLを実行します。

flashback table sample to before drop

もう一度↓を実行しても、先ほど表示されたSAMPLEテーブルのデータは表示されません。
SAMPLEテーブルは復活しました。
select original_name, type, ts_name, droptime, dropscn, object_name, owner
from dba_recyclebin
where NLSSORT(owner, 'NLS_SORT=BINARY_CI') = NLSSORT('taipei_neko', 'NLS_SORT=BINARY_CI')


ただし、SYSTEM表領域のテーブル、ローカル表領域以外のテーブル、ファイングレイン監査・
仮想プライベートデータベース(VPD)が使用されているテーブルは対象外です。
posted by 台北猫々 at 22:42| Comment(0) | TrackBack(1) | 技術メモ(Oracle)

公開しました(FileUtilクラス)。

新たに公開したのは、↓です。
■FileUtilクラス(C/C++)Windows,Linux共用
ファイル操作の補助的なメソッドを提供します。

/**
* ファイルの存在チェックを行います。
* @param filepath ファイルパス名
* @return 存在している:true していない:false
*/

static bool Exist(const char* filepath)

/**
* ファイルの移動を行います。
* @param src 移動元ファイルパス名
* @param dst 移動先ファイルパス名
* @return 成功:true 失敗:false
*/

static bool Move(const char* src, const char* dst)

/**
* ファイルの削除を行います。
* @param fileName ファイルパス名
* @return 成功:true 失敗:false
*/

static bool Delete(const char* fileName)

/**
* ファイルのコピーを行います。
* @param src コピー元ファイルパス名
* @param dst コピー先ファイルパス名
* @return 成功:true 失敗:false
*/

static bool CopyFile(const char* src, const char* dst)

/**
* 渡されたファイル名の拡張子を変更して返却します。
* @param filepath ファイルパス名(IN/OUT)
* @param new_ext 新拡張子
*/

static void exchangeExt(string& filepath, string new_ext)



公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 21:39| Comment(0) | TrackBack(1) | 日記

2008年02月27日

更新しました(DirListクラス)

BSDライセンスに変更しました。


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 22:03| Comment(0) | TrackBack(0) | 日記

2008年02月26日

Ext2.0化進行中〜「Window + Tab」

DHTML&Ajaxの超リッチクライアントのフレームワークのExt2.0技術情報公開ページ C/C++への試験導入が進行中です。一度、ご覧あれ。

各クラスの詳細ページに「Window + Tab」のフローティングレイヤーを導入しました。

それにより、Ext2.0を試してみました。で作成した"ext.js"では、足りなくなったので、再び↓のページで、
Core - Components(Needed for widgets)
Core - Utitility
Core - Drag and Drop
Layout ※Optional Features/Dependenciesは無し
Menu Widgets ※Optional Features/Dependenciesは無し
Data - Core
Data - JSON Support
Data - Simple Store
Grid - Core ※Optional Features/Dependenciesは、Drag and Drop Column Reader, Column Resizing, Grouping Support

Window + Tabの分で、
Tabs
Button Widget ※Optional Features/Dependenciesは無し
Resizable
LayoutのOptional Features/Dependenciesで、「All Layouts」と「Window」
を追加して"ext.js"を再作成しました。

段々慣れてきました猫

posted by 台北猫々 at 21:57| Comment(0) | TrackBack(0) | 技術メモ(JavaScript)

Ext2.0を試してみました。ぱ〜と2

またまた、DHTML&Ajaxの超リッチクライアントのフレームワークのExt2.0技術情報公開ページ C/C++に試験導入してみました。

今度は、更新情報をExt.Panelで実装してみました。なんかページが見た目綺麗になりました。

はじめ、難解だったExt2.0も頑張って調べていると、何気に良く整理されたオブジェクト指向で実装されているので、慣れてくると読みやすくなります。猫

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 01:00| Comment(0) | TrackBack(0) | 技術メモ(JavaScript)

2008年02月25日

ちなみにポリシーを削除するのは、

BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => 'user1',
object_name => 'emp',
policy_name => 'emp_policy',
function_schema => 'user1',
policy_function => 'policy_func',
sec_relevant_cols => 'sal, comm');
END;
/

で作成したものを削除するには、


BEGIN
DBMS_RLS.DROP_POLICY (
object_schema => 'user1',
object_name => 'emp',
policy_name => 'emp_policy');
END;
/


です。猫


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 20:50| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

では、「ファイングレインアクセスコントロール(FGAC)」やってみよう

以下のように、EMP表があるとして、SAL,COMM列に制限をかけて、
SAL,COMM列にアクセスした場合は、自分以外の行は見れないようにします。
NOENAMESALCOMM
10YAMADA1000 
11KUMA5000500
12SASAKI20000
13SUZUKI4000 


(1)先ずは、ポリシーファンクションの登録

CREATE OR REPLACE FUNCTION policy_func (
obj_schema VARCHAR2,
obj_name VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
IF obj_schema = SYS_CONTEXT('USERENV', 'SESSION_USER') THEN
RETURN '1=1';
ELSE
RETURN 'ename = SYS_CONTEXT(''USERENV'', ''SESSION_USER'')';
END IF;
END policy_func;
/


SYS_CONTEXT('USERENV', 'SESSION_USER')は、SQLの実行ユーザ名を返却しますので、
"obj_schema = SYS_CONTEXT('USERENV', 'SESSION_USER')"は、実行ユーザがオブジェクトの所有者であるかを判断しています。

そして、
"'ename = SYS_CONTEXT(''USERENV'', ''SESSION_USER'')'"は、ename列の値が、実行ユーザ名であるかを判断しています。

(2)次に、ポリシーの登録

BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => (EMPの所有ユーザ名),
object_name => 'emp',
policy_name => 'emp_policy',
function_schema => ('policy_func'の所有ユーザ名),
policy_function => 'policy_func',
sec_relevant_cols => 'sal, comm');
END;
/


sec_relevant_cols => 'sal, comm');で、アクセスコントロールする列リストを指定します(Oracle10gから複数の列を指定できるようになりました。)

これで、設定完了です。

"YAMADA"ユーザで以下ような'sal' or 'comm'列にアクセスするSQLを実行すると、ポリシーが働き、
SELECT * FROM (EMPの所有ユーザ名).EMP;

NOENAMESALCOMM
10YAMADA1000 


というようENAMEが自分以外のレコードは見えなくなります。
posted by 台北猫々 at 20:44| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

ファイングレインアクセスコントロール(FGAC)の前準備

この機能は、使ったことはないのですが、DWHなどでは便利なのでしょうか?

「ファイングレインアクセスコントロール(FGAC)」と「アプリケーションコンテキスト」を使用して表の行データへのアクセスを制御できるようです。

とりあえず、試してみるかということで、ポリシーを登録しようとしたところ以下のようなエラーが・・・
DBMS_RLS.ADD_POLICY (
*
行2でエラーが発生しました。:
ORA-06550: 行2、列1:
PLS-00201: 識別子DBMS_RLSを宣言してください。
ORA-06550: 行2、列1:
PL/SQL: Statement ignored

そういえば、
SQL> @(ORACLE_HOME)/rdbms/admin/catalog.sql
SQL> @(ORACLE_HOME)/rdbms/admin/catproc.sql

を実行していなかった。と思って実行してから、ポリシーを登録しようとしても状況変わらず・・・
というか、DBMSパッケージの実行権限を与えないと駄目じゃん!ということに気づいて、SYSユーザで以下のコマンドを実行。
GRANT EXECUTE ON DBMS_RLS TO ユーザ名
とりあえず、問題はクリアできました。猫

posted by 台北猫々 at 19:03| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

2008年02月24日

道化師匠

ふと気づくと、

サーカスの綱渡りの足場(出発する高い所)にいました。
隣を見ると、不機嫌そうな全身黄色のピエロがいました。

ピエロは、私に早く綱渡りしろと促します。
しかし、渡る先の方を見ると綱が結ばれているわけではなく、ただ引っ掛けてあるだけなのです。とても、渡ることができません。私が逡巡していると、

ピエロが「どうしたん?早く渡らんかい」と言います。

私は「綱の先、引っ掛けているだけですやん。一歩で落ちますよ。危険です。」と言いますと、

ピエロは「昨日は、直径15cmの火の輪くぐりをノリノリでやったやんか」と言います。

私がそんなことを・・・全然知らない。ていうか、どうやったんだ・・・?

ともあれ、この綱は絶対渡れないと思いましたので、

私は「それでも、これは無理です。」と言いますと、

ピエロは「はい。出ました。最近の若手は、やりもせずにすぐに『無理』や。」と理不尽なことを言い出しました。

私は「そういうことでは、ないですやん。これは確実に落ちますやん!」と言うと、

ピエロは「きた!逆切れや。切れやすい若者や。」などと言い出す始末です。

しかたなく、私は綱を渡り始めましたが案の定・・・。


良かったらクリックお願いします→banner_01.gif

posted by 台北猫々 at 07:40| Comment(0) | TrackBack(0) | 夢日記

Oracle10gにおけるMERGE文の拡張

MERGE文のUPDATE句とINSERT句でWHERE句の使用ができるようになったそうです。

例えば、商品マスタがあって↓
20080224MST_SHOHIN.jpg

これに対して、差分商品マスタ↓
20080224SABUN_SHOHIN.jpg

の内容をマージしたい場合で、ただし、当テーブルにはマージ処理からは除外したいレコードが含まれる(DEL列が'Y'のレコードはマージ対象外)ような場合、以下のようなSQL文を作成します。


MERGE INTO MST_SHOHIN ms
USING SABUN_SHOHIN ss ON (ms.id = ss.id)
WHEN MATCHED THEN
UPDATE SET name = ss.name, price = ss.price, upd_date = SYSDATE
WHERE ss.del = 'N'
WHEN NOT MATCHED THEN
INSERT VALUES(ss.id, ss.name, ss.price, NULL);


結果は↓になります。
20080224RESULT_SHOHIN.jpg

商品Cのレコードは、更新されていないことがわかります。

posted by 台北猫々 at 00:10| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

2008年02月23日

ユーザ作成

2年というブランクは、ユーザ作成の仕方すら忘れさせてしまうには十分の時間だったようです。ショックです猫

とりあえずメモしておこう。。。

================================================
CREATE USER ユーザ名
IDENTIFIED BY パスワード
[DEFAULT TABLESPACE デフォルト表領域名]
[TEMPORARY TABLESPACE テンポラリ表領域名]
[PROFILE DEFAULT]
/
GRANT CONNECT TO ユーザ名
/
GRANT RESOURCE TO ユーザ名
/
GRANT UNLIMITED TABLESPACE TO ユーザ名
/
================================================



デフォルト表領域名は、"USERS"
テンポラリ表領域名は、"TEMP"
にデフォルトでDBを構築しているとなりますね。

GRANT UNLIMITED TABLESPACE TO ユーザ名は、本番ユーザであれば容量制限するべきでしょうが、まあ勉強用なのでいいかなと。

posted by 台北猫々 at 20:08| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

いきなりですか?

OracleMaster 10g Goldへの移行試験の勉強を開始しようと思いまして、とりあえずOracle10gを家のマシンにインストールしました。インストールは特に問題無くできまして、さあデータベースを作成しようとしたところ、

20080223OracleDBCAError.jpg

出ました・・・Oracle恒例の意味不明エラー。。。EM(EnterpriseManager)の構成に失敗しているようですね。

指定のログファイルを見ると、
============================
設定: Stack Trace:
oracle.sysman.emSDK.conf.TargetAdditionException: ターゲット・リストをC:\usr\local\oracle\sysman\emd\targets.xmlへ保存中にエラーが発生しました :: Malformed \uxxxx encoding.
at oracle.sysman.emSDK.conf.TargetInstaller.addTargetInt(TargetInstaller.java:1143)
at oracle.sysman.emSDK.conf.TargetInstaller.addTarget(TargetInstaller.java:983)
at oracle.sysman.emSDK.conf.TargetInstaller.addTarget(TargetInstaller.java:943)
at oracle.sysman.emcp.EMAgentConfig.updateTargets(EMAgentConfig.java:2730)
at oracle.sysman.emcp.EMAgentConfig.updateAgentConfigFiles(EMAgentConfig.java:2544)
at oracle.sysman.emcp.EMAgentConfig.performConfiguration(EMAgentConfig.java:1166)
at oracle.sysman.emcp.EMAgentConfig.invoke(EMAgentConfig.java:207)
at oracle.sysman.emcp.EMAgentConfig.invoke(EMAgentConfig.java:185)
at oracle.sysman.emcp.EMConfig.perform(EMConfig.java:146)
at oracle.sysman.assistants.util.em.EMConfiguration.run(EMConfiguration.java:430)
at java.lang.Thread.run(Thread.java:534)
============================
と、どうしたらいいか良くわからないエラーが出ていました。

約2年ぶりにOracleを扱いましたが、こういうところ変わってないですね(^^;

と思いましたが、WindowsXP Home Editionはサポート対象外なんですね。うっかりしていました。猫

一応強引にEMを構成しようと思いましたが、ちょっと難しそう。
とりあえず、データベース機能本体は動作しているようなので、まあ、いいかなと。技術的には、コマンドベースで覚えた方が身に付きますしね。
posted by 台北猫々 at 14:47| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

公開しました(RESTClientクラス)。

新たに公開したのは、↓です。
■RESTClientクラス(C/C++)Windows,Linux共用
WebサービスのRESTタイプのクライアント処理を行います。

返却オブジェクトとして↓のXMLParserのXMLNodeを使用させていただいています。
http://www.applied-mathematics.net/tools/xmlParser.html

【↑のURLでも説明がありますが、以下にxmlParserの簡単な使用方法を示します。】

<?xml version="1.0" encoding="UTF-8"?>
<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" pgr="478070">
<Result>
<Title>Projet de loi de finances pour 2006</Title>
<Cache>
<Url>http://wrs.search.yahoo.co.jp/l=WS5/R=1/;</Url>
<Size>1137508</Size>
</Cache>
</Result>
<Result>
<Title>Projet de loi de finances pour 9999</Title>
<Cache>
<Url>http://wrs.search.yahoo.co.jp/l=WS5/R=1/;</Url>
<Size>1137508</Size>
</Cache>
</Result>
</ResultSet>

↑のXMLデータがレスポンスで返却されるとして、Resultタグのリストを表示したいなら、以下のように処理します。

RESTClient rest("http://xxx.search.xxx.co.jp/WebSearchService/V1/webSearch");
rest.SetParam("appid", "XXXDemo");
rest.SetParam("query", "finances");
rest.Get();
XMLNode main = rest.GetResponseXML();

//ルートのタグとなるResultSetタグのXMLNodeを取得します。
XMLNode root = main.getChildNode("ResultSet");

//Resultタグの数を取得します。
int n = root.nChildNode("Result");

int i,iterator=0;
for (i=0; i<n; i++) {
//Resultタグを順次的に処理します。
XMLNode xResult = root.getChildNode("Result",&iterator);

//Resultタグの子ノードであるTitleタグを取得します。
string str = xResult.getChildNode("Title").getText();
printf("Title %i=%s\n",i+1, str.c_str());
}

また、ResultSetタグの"pgr"属性の値を取得したいなら以下のようにアクセス
します。

main.getChildNode("ResultSet").getAttribute("pgr") → 478070

簡単ですが以上です。


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 09:30| Comment(0) | TrackBack(0) | 日記

2008年02月22日

Ext2.0を試してみました。

DHTML&Ajaxの超リッチクライアントのフレームワークのExt2.0技術情報公開ページ C/C++に試験導入してみました。

といっても、グリッドテーブルを1個追加しただけですが。
ところで、Ext2.0って、難しいですね・・・フレームワーク同梱のexamplesにあったものを改造したのですが、初め訳分からなかったです。

プロトタイプ型のオブジェクト指向をフルスロットルという感じで、なかなか難易度高いです。

それと、フレームワークの全jsファイルを固めたext_all.jsというファイルは500KBもあるし、どうしたものかと。

ただ、Ext2.0は用途別にjsファイルを抽出して固めるサービス↓
http://extjs.com/download/build
がありました。例えば、今回追加した[Grouping Grid]だけを使いのであれば、
・Core - Components(Needed for widgets)
・Core - Utitility
・Core - Drag and Drop
・Layout ※Optional Features/Dependenciesは無し
・Menu Widgets ※Optional Features/Dependenciesは無し
・Data - Core
・Data - JSON Support
・Data - Simple Store
・Grid - Core ※Optional Features/Dependenciesは、Drag and Drop Column Reader, Column Resizing, Grouping Support
を選んでBUILDすると、"ext.js"というファイルを生成してダウンロードできます(これで大体280KBぐらい)。

それでも、大きいですが・・・ブロードバンドか、イントラネットが前提ということなんでしょうね。

ただ、Ext2.0はクオリティは高いですね。使いこなせるようになれば、すごいと思います猫


posted by 台北猫々 at 22:03| Comment(0) | TrackBack(0) | 技術メモ(JavaScript)

更新しました(HttpURLConnectionクラス)

リクエストヘッダのパラメータを追加しました。

1.Get、Postメソッド更新
リクエストパラメータに"User-Agent"と"Accept"を追加しました。
サイトによっては、当パラメータが無いと、
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
のような、エラーを返される場合があるため。

2.SetUserAgentメソッド追加
デフォルトでは、FireFox2.0のふりをしますが(^^;、一応変更できるようにしました。

3.ParseUrlメソッド変更
"http://www.yahoo.co.jp"のように渡された時に自動的に末尾に"/"を付加してリクエストするように変更しました。IEなどのブラウザに動作を合わせました。"http://www.yahoo.co.jp"のままだとレスポンス待ちでブロッキングしっぱなしになるため。



公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:07| Comment(0) | TrackBack(0) | 日記

2008年02月21日

更新しました(StdUtilクラス)

細かい追加ですが・・・↓を追加しました。

/**
* 文字列が、指定された接頭辞で始まるかどうかを判定します。
* @param src 文字列
* @param start 比較文字列
* @return 一致:true 不一致:false
*/

static bool StartsWith(string& src, const char* start) {

/**
* 文字列が、指定された接尾辞で終わるかどうかを判定します。
* @param src 文字列
* @param start 比較文字列
* @return 一致:true 不一致:false
*/

static bool EndsWith(string& src, const char* end) {

公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:51| Comment(0) | TrackBack(0) | 日記

2008年02月20日

暗黒の銀

今日は自転車通勤しまして、その帰り道のこと。

街灯の全然無い田んぼの間の道を走っていたのですが、ふと気づくと妙に周りが明るい事に気づきました。

自転車のライトもいらないぐらいです。
今日が満月(に近い)だったからですね。

月の光に照らされて、暗黒に浮かぶ銀色の風景というのは、何か幻想的な感じがしますね。ちょっと見とれてしまいました。猫
posted by 台北猫々 at 22:48| Comment(0) | TrackBack(0) | 日記

ちょっとAjaxしました。

技術情報公開ページ(http://winter-tail.sakura.ne.jp)の方を少し見やすくなるように工夫しようと思いました。C/C++クラスでクラス定義をすぐ見れなかったので、何とかしようと。

「prototype window」
http://prototype-window.xilinus.com/index.html
で公開されているJavaScriptライブラリを使わせていただいて、Ajaxしました。


20080220.jpg

一度、ご覧くだされば幸いです。↓
http://winter-tail.sakura.ne.jp/sub5.html


良かったらクリックお願いします→banner_01.gif


posted by 台北猫々 at 21:30| Comment(0) | TrackBack(0) | 日記

2008年02月19日

公開しました(CodeChangerクラス)。

新たに公開したのは、↓です。
■CodeChangerクラス(C/C++)Windows,Linux共用
UTF8←→SJIS/EUCの文字コード変換を行います。内部ではIBM ICUライブラリを使用しています(つまり、ただのラッパーです猫)。

現在、作成中のRESTクライアントの補助クラスとして作りました。

使用するための条件は、ReadMe.txtに記載しています。


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:17| Comment(0) | TrackBack(0) | 日記