カテゴリー別アーカイブ: プログラム

[Oracle初心者運用メモ]Oracleエラー6550

Oracleのエクスポートコマンド実行にて
下記のエラーが発生しました。

————————————————————————–
EXP-00008: Oracleエラー6550が発生しました。
ORA-06550: 行 1,  列 41:
PLS-00302: コンポーネント SET_NO_OUTLINESを宣言してください。
ORA-06550: 行 1、列 15:
PL/SQL: Statement ignored
EXP-00000: エラーが発生したためエクスポートを終了します。
————————————————————————–

調べてみたところ、Oracle11gクライアントからOracle10gサーバに対して
接続しコマンド発行していたことが原因のようでした。

上位バージョンから下位バージョンに対して
接続してエクスポートを行うとこはできないようです。

 

 

OpenCV 3.0.0 正式版リリース

しばらく使ってないうちに、OpenCV 3.0.0の正式版がリリースされてましたので、調査してみました。

OpenCVがどんなものか知りたい人はこちらのサイトから。

OpenCVとは? 最新3.0の新機能概要とモジュール構成 – Build Insider

オープンソースなのに特許権を持つ特徴量検出アルゴリズムSURF、SIFTがリポジトリから外れ、代わりにライセンス的に使用しやすい『AKAZE』『KAZE』が追加されるという素晴らしいアップデートが行われております。

試してみました。

base1

base2

base3

 

被写体のアングルを変えた3枚の画像から特徴点のマッチングを行ってみます。

result1

result2

多少の誤認識はありますが、かなりの高精度でマッチングできてます。

感覚的にはSURFと同等くらいに実感しました。

その他詳しいベンチマーク・比較結果は以下のサイトで検証されてます。

OpenCV3でAKAZE特徴量を検出する

AKAZE特徴量の紹介と他特徴量との比較

ライセンス関係が緩くなってきたことから、OpenCV界隈でもかなり盛り上がってきているようなので、今後の動向が楽しみです。

[Oracle初心者運用メモ]SQLServerへのデータ移行

今回は、Oracleというより
SQLServerの技術情報になります。

客先のシステムでOracleを使っていましたが、
Windows Server 2003のサポート終了に伴いDBサーバを新しくすることになり
新サーバのOSに対応したバージョンのOracleを購入するか
SQL Serverに移行するかの検討を行い、
DBの規模がそこまで大きくなかったため、SQL Serverに移行することになりました。

プログラムの方は、Oracle独自のSQL構文を修正、
データ移行は、SQL Server Management Studioの「データのインポート」機能を
使用して移行を行いました。

■データのインポート
コピー元(Oracle側)の指定は
データソースの選択で「.Net Framework Data Provider for Oracle」を選択
ユーザID、Password、Data Sourceを指定します。

インポート

後は、通常のSQL Server間でインポートする時と同様の方法
となりますが、
OracleとSQL Serverでデータ型が異なる項目については
「コピー元のテーブルおよびビューの選択」画面で
テーブル毎に「マッピングの編集」で変換先の型を指定する必要があります。

今回、変換先の型を指定したものは次になります。
<Oracle> DATE ⇒ <SQL Server> datetime
<Oracle> VARCHAR2 ⇒ <SQL Server> varchar ※1バイト文字コードのみ項目の場合

 

テーブル毎に「マッピングに編集」を設定する作業が多少面倒ではありましたが
比較的簡単にデータ移行を行うことができました。

SQL Server移行後のシステムでのデータアクセス速度も
Oracleの時と同じくらいの速度で動作しており安心しました。

 

[Oracle初心者運用メモ]現在のセッション数を確認

客先のシステムで使用しているOracle11gにて
下記のエラーが出るようになりました。
「ORA-12516: TNS: リスナーは、一致するプロトコル・スタックが使用可能な
ハンドラを検出できませんでした」

エラーコードで検索してみたところ
接続中のセッション・プロセス数が上限値を超えた場合に
このエラーが出るとのことでした。

たしかに、DBを導入した当初に比べると、同DBを使用するシステムが
どんどん増えてきています。

エラーを回避するための1つの対策として
プロセス数上限値(デフォルトは150)を増やすことが書いてありましたが
増やすことによって負荷がかかる可能性もあるため
とりあえずは、上記のエラーが出た際の接続状況を取得してみることにしました。

■セッション・プロセスの現在数と上限を取得
SELECT
RESOURCE_NAME リソース名,
CURRENT_UTILIZATION 現在数,
MAX_UTILIZATION 最大数,
LIMIT_VALUE 上限
FROM
V$RESOURCE_LIMIT
WHERE
RESOURCE_NAME IN (‘processes’,’sessions’);

■セッションの詳細を取得
SELECT
S.machine,
TO_CHAR(S.LOGON_TIME, ‘YYYY/MM/DD HH24:MI:SS’) LOGON_TIME,
S.sid,
S.serial#,
P.PID ORACLE_PID,
P.SPID OS_PID,
S.STATUS,
S.USERNAME ORACLE_USER,
S.OSUSER OS_USER,
S.TERMINAL,
S.PROGRAM
FROM
V$PROCESS P
LEFT OUTER JOIN V$SESSION S
ON P.ADDR = S.PADDR
WHERE
P.BACKGROUND IS NULL  AND
P.PID > 1
ORDER BY
TO_CHAR(S.LOGON_TIME, ‘YYYY/MM/DD HH24:MI:SS’),
S.machine;

このエラーは、接続数が減っていくと自然に解消されるため、
ユーザ側には「ただいま大変混み合っております。」のエラーメッセージを
表示することにし、
プロセス数上限値を増やすかどうかは、サーバ側の性能も考慮して
検討することにしました。

 

[Oracle初心者運用メモ]テーブルの閲覧権限ユーザ作成

客先のシステムで使用しているOracle11gのあるテーブルを
別システムからも参照したいということで
更新はできない閲覧権限ユーザを作成することになりました。

別ユーザを作成した場合、スキーマも別になってしまうため
下記のような参照となってしまいます。

「masterA」テーブル作成ユーザ・・・aaa
閲覧権限を与えた別ユーザ・・・bbb

bbbが「masterA」を参照するには下記のように、
スキーマ名.テーブル名で参照する必要がある。

SELECT * FROM aaa.masterA;
別ユーザからもスキーマ名なしで参照できるようシノニムを作成し
下記の手順で閲覧権限ユーザを作成しました。

1.シノニムをつくる
CREATE PUBLIC SYNONYM masterA FOR aaa.masterA;

2.テーブルにpublicでselect権限を付与する
GRANT SELECT ON masterA TO PUBLIC;

3.ユーザを作成する
CREATE USER bbb(ユーザ名)
IDENTIFIED BY パスワード
DEFAULT TABLESPACE ユーザ領域名
TEMPORARY TABLESPACE 一時領域名;

4.ユーザに権限を付与する
GRANT CONNECT, RESOURCE TO bbb;
⇒接続とcreate系のロール(RESOURCE)を付与する

GRANT SELECT ANY TABLE TO bbb;
⇒select権限を付与する