メニュー
プロフィール
最近の記事
カテゴリ分類
記事一覧
FOR ENGINEERS

RedHat Enterprisze Linux 5サーバーにOracle 11g を搭載している。
このOracle DBのPL/SQLプロシージャーを使って
テキストファイルを作成する処理で、問題があったので記述しておく。

以下のような、テキストファイルを作成するためのプロシージャを作成する。
PROCEDURE DATAFILE_MAKE
(
P_FILENAME IN CHAR
) IS
V_DN VARCHAR2(128);
V_FP UTL_FILE.FILE_TYPE;
BEGIN

V_DD := '/tmp';
V_FP := UTL_FILE.FOPEN(V_DN, P_FILENAME, 'W');
/*
DATA_TBLの「DATA_ID」「DATA_01」「DATA_02」のフィールド値を
右詰・固定長のテキストファイルとして出力する
*/
FOR
REC IN
(
SELECT
DATA_ID
,NVL(DATA_01, ' ')
,NVL(DATA_02, ' ')
FROM
DATA_TBL
ORDER BY
DATA_ID
)
LOOP
UTL_FILE.PUT(V_FP, SUBSTR(' ' || REC.DATA_ID, -6));
UTL_FILE.PUT(V_FP, SUBSTR(' ' || REC.DATA_01, -8));
UTL_FILE.PUT(V_FP, SUBSTR(' ' || REC.DATA_02, -8));
UTL_FILE.NEW_LINE(V_FP, 1);
END LOOP;
UTL_FILE.FCLOSE(V_FP);

END DATAFILE_MAKE;
上記↑のようなプロシージャを作成し、
exec DATAFILE_MAKE('data_01.txt');
のように実行して、
/tmp/data_01.txt
という固定長のテキスト・ファイルを作成する。
※ちなみにORACLEのサーバー・パラメータに以下を追加しておく。
UTL_FILE_DIR='*'

この時に以下のような問題に遭遇した。

1. ファイルの書込み権限が無いので、削除できない
2. 改行コードが"LF"となってしまう。

■ファイルの書込み権限が無いので、削除できない
●内容
 作成されるファイル「/tmp/data_01.txt」のオーナーが「oracle」ユーザーで、ファイルのパーミッションが「rw-r--r--」(644)となっているため、ファイル作成後に、他のユーザーで削除できない事が判明した。

●解決策
 「~oracle/.bash_profile」を編集、
 「umask 022」⇒ 「umask 000」 に変更する。
 変更後、Oracle DBサーバーを再起動する。

●概要
 オラクルDBのサーバー・プロセスを実行しているユーザーは「oracle」である。
 この「oracle」ユーザーのログインスクリプト(ホームディレクトリ配下の「.bash_profile」)を見てみると、UMASKが0200となっている。
 そのため、oracleユーザーで作成するファイルは、デフォルトのパーミッションが0644となってしまい、他のユーザーには書き込み権限が与えられない。
 従って、デフォルトのパーミッションが「0666」となるよう
umask 000
としておく。


■改行コードが"LF"となってしまう。
●内容
 テキストファイルの改行コードが"LF"となってしまっているため、
Windowsでこのファイルを操作する時に、不整合が生じた。

●解決策
 外部コマンドを使って"LF"を"CRLF"に変更する事にした。
・nkfを使う(文字コードをSHIFT-JISとする)
# nkf -cws $org > $file

・perlを使う方法でもOK
# perl -pe 's/\n/\r\n/' $org > $file

※注意:変換前のファイルの改行コードが既に"CRLF"だった場合
 nkfの場合、変換後のファイルは"CRLF"のままなので問題ないのだが、Perlの場合には、変換後のファイルは「"CRCRLF"」となってしまう。
 もう少し複雑なスクリプトにすれば、Perlでも変換できますが・・・。

●概要
 根本的な解決策が分からなかったので、上記のような方法を使った。
 本来は「ファイルを作成する時点で"CRLF"となる」という方法が本筋とは思うのだが・・・。


| IT-ソフトウェア関連::Oracle | 08:43 PM | comments (0) | trackback (1) |
 BlognPlus を使っているのだが、気がつくと apache の error_log に結構な量のメッセージが記録されている。

 BlognPlus 自体の動作がおかしいという訳ではないが、このエラーメッセージがたくさん出力されると、他のログが見えにくくなってしまう。
 そのためなるべく解消しておく。

■tag_bottom.gifファイルが無いエラー
File does not exist: /.../blognplus/images/tab_bottom.gif, referer: http://.../blogn/admin.css
 「tab_bottom.gif」というイメージ・ファイルが無いために発生するエラー、配布ファイルにも含まれていないらしい。
 そのため、tab_bottom.gifを使わないようにするしかない。
 admin.cssの61行目を以下のようにコメントアウトする。
background: url(./images/tab_bottom.gif) repeat-x top;
   ↓変更する
/*background: url(./images/tab_bottom.gif) repeat-x top;*/

■mktime()エラー
...PHP Warning: mktime() expects parameter 6 to be long, string given in /......./common.php on line 378, referer: ...
mktime()の引数が不正というPHPのエラー。
 調べてみると blognに存在しない記事IDが呼び出された時に発生していた。
 存在しない記事IDなので投稿日も不明、しかし内部処理で日付の差異を
計算しており、その時に不正な記事IDなので日付も異常値になっており、
これを元にmktime()を実行しようとしてエラーが発生している、という事らしい。
取り急ぎPHPソースを以下のように修正しておく。
...
// common.php: 378行目修正前
    $date1 = mktime($date1_hour, $date1_minutes, $date1_seconds, ...

// common.php: ↓修正後
    if (strlen($date1)>=14) {
      $date1 = mktime($date1_hour, $date1_minutes, $date1_seconds, ...
    } else {
      return 0;
    }
    ...
※ちなみに、どうして存在しない記事IDが呼び出されるかというと、
BLOGNを移植した時に記事IDがリセットされてしまったためらしい。
 即ち、サーバーを移植(再構築)するために、BLOGNのデータをエクスポートし
構築先でインポートする作業をしたのだが、インポートの時に記事IDがリセット
されてしまったため…という事のようである。


| ネット関連::ブログ | 09:03 AM | comments (0) | trackback (1) |
 C++で作成したWin32プログラムから、OLE経由でMircosoft Excel 2000のワークシートに値をセットしているのだが、あるセルに少し長めの文字列をセットしたら、「#####...」のように表示されてしまう↓(下図はExcel 2003での状態)。
Excelで####と表示される

 もちろん、通常通りに表示される場合もあるので、「####...」と表示される場合と、通常通りに表示される場合とで、文字列の値などを調整しながら調べたら256文字が区切りである事が分かった。

 即ち、1セル内に256文字を超える文字列をセットした場合で、セルの書式を「文字列」などとしている場合に「#####...」と表示されてしまうのだが、256バイトを超える場合でも、セルの書式を「標準」などに設定すると、正常に表示される↓。
Excelで####と表示される

 従って、今回は「セルの書式を標準とする」として対応した。

 ちなみに、Microsoft Excel 2003 でも同じ、今回プログラミングしていて、初めて分かったという次第。

| IT-ソフトウェア関連::Windows | 03:35 PM | comments (0) | trackback (0) |
 Windows Xp 端末でワーム(WORM_RBOT.ERA)に感染している事が分かった。
 このWindows端末にはノートンやウィルスバスターなどのウィルス対策ソフトをインストールしていない。そのため、実は感染してからかなりの時間が経ってからようやく気がついた?のかもしれない、という状態。

 どうして気がついたかというと「レジストリ・エディタ」を使おとして、
「スタート」ボタン
 →「ファイル名を指定して実行」
 → regedit
と実行したら「このファイルはほかのプログラムで使われています」とエラーメッセージが表示され、レジストリエディタを起動できない事に気がつく。

 あれ?変だなぁと思いながら色々調べていたら、ワームが見つかった、という次第。

goo 教えて!goo」などを参照しながら、
TREND MICRO ウィルスデータベース」を確認して「レジストリ」を削除するなど、対応する。
※↓p2pnetworking.exe というモジュールがスタートアップに登録されている。


※↓ファイルの実体は、prefetch フォルダ内に潜んでいる


※↓レジストリにも登録されてしまっている。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices

 しかし、上記の対応を実行してWinowsを再起動したのだが、症状は変らない。相変わらず「レジストリ・エディタ」は使えないし、「タスク・マネージャ」も使えない。

 上の↑ p2pnetworking.exe というモジュールが、スタートアップからちゃんと消えているはずだし…などと思いながら「msconfig」を使ってスタートアップに登録されている内容を確認していると、あれ?何故か「taskmgr(タスクマネージャ)」が登録されている事に気がつく。しかも登録されているEXEのパスは、
C:\Windows\system32\taskmgr.exe
 ではなく
C:\Documents and Settings\All Users\スタートメニュー
 \プログラム\スタートアップ\taskmgr.exe

となっている。ファイルを確認してみると、このEXEは「ショートカット」ではなく「EXEそのもの」です。とっても怪しげ

 「お助けPC パソコン修理 参考」を参考にしながら
  ●「msconfig」を使って、スタートアップから tskmgr.exe を削除。
  ●「スタートアップ・フォルダ」の tskmgr.exe を削除。
 その後、再起動したら、レジストリ・エディタも使えるし、タスク・マネージャも使えるようになった。

 ちなみに、削除する前にEXEファイルのプロパティを確認してみた。
■本物のタスクマネージャ「tskmgr.exe」のプロパティ
タスクマネージャのプロパティ1タスクマネージャのプロパティ2

■偽者のモジュール「tskmgr.exe」のプロパティ
タスクマネージャのプロパティ1タスクマネージャのプロパティ2

 ちなみに、↑よーく見てみると、ファイル名も「tskmgr.exe」⇔「taskmgr.exe」と同じではありません。

| IT-ソフトウェア関連::Windows | 02:36 PM | comments (0) | trackback (1) |
 Windows 2003 サーバーでOracle10gR2 を搭載して開発している。

 この Windows 2003 サーバーで、気がついたら「データ実行防止(DEP)」に関する perl の警告メッセージが表示されていた。
データ実行防止

 あれ?いつの間に表示されたのだろうか、と思いつつ「設定の変更」を実行し、「次に選択するものを除くすべてのプログラムおよびサービスについて DEP を有効にする」 をチェックし、「perl」 にチェックして「OK」とする。
データ実行防止
 これで、Windows を再起動したら警告は表示されなくなった。
 DEPに関する警告を見たのは今回初めてで、「ギクッ」としたのでした。

| IT-ソフトウェア関連::Windows | 11:34 PM | comments (0) | trackback (0) |
パソコンのメモリ買うならT・ZONE!安心の相性保証あります。
PAGE TOP ↑