MB blog

こちらは主に自分用のメモです。

DOM ドキュメントから XML 形式 String に変換する

Jdk1.4 では SOAPBody.toString() で全体が xml 形式で取得できていたのが、6ではルートエレメントしかとれなくなったという事象を確認。回避策として。

Document doc = soapBody.extractContentAsDocument();
StringWriter sw = new StringWriter();
TransformerFactory tfac = TransformerFactory.newInstance();
Transformer transformer = tfac.newTransformer();
transformer.transform( new DOMSource(doc), new StreamResult(sw) );
String xml = sw.toString();
System.out.println( xml );

追記 - SOAPBody.extractContentAsDocument についての注意点

SOAPBody.extractContentAsDocument メソッドを実行することで DOM Document として SOAPBody の全内容は取得できるのですが、これを実施すると大本の SOAPBody の中身が抜き出されてしまいます。
http://java.sun.com/javase/ja/6/docs/ja/api/javax/xml/soap/SOAPBody.htm
ので、xml として出力したあとは、SOAPBody.addDocument を使用して SOAPBody に DOM Document の中身を戻してあげる必要があります。しかし、こうも変換変換を繰り返さないといかんのは心配ですね。どうしてこういう仕様になってるのかな。

AWRレポート作成方法

  • スナップショットの取得

任意のタイミングで、以下のsqlを実行(要 SELECT ANY DICTIONARY システム権限)。

SQL> EXECUTE DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
  • レポート作成

以下のコマンドを実行(要SYSDBA)。

@?/rdbms/admin/awrrpt.sql

レポートの出力形式を問われるので、入力。

Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Would you like an HTML report, or a plain text report?
Enter 'html' for an HTML report, or 'text' for plain text
Defaults to 'html'

Enter value for report_type: text

レポート対象となるスナップショットの候補日の出力日数を問われるので、入力。

Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed.  Pressing <return> without
specifying a number lists all completed snapshots.

Enter value for num_days: 1

指定した日数分の有効なスナップショットの一覧が出力されるので、レポートの開始に使いたいものの Snap Id を指定。

Instance     DB Name        Snap Id    Snap Started    Level
------------ ------------ --------- ------------------ -----
orcl         ORCL             18142 23 Apr 2012 00:00      1
                              18160 23 Apr 2012 18:00      1
                              18161 23 Apr 2012 18:21      1
                              18162 23 Apr 2012 18:22      1



Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Enter value for begin_snap: Enter value for begin_snap: 18160

レポートの終了に使用する Snap Id を指定。

Enter value for end_snap: 18162

レポートの名称を指定。

Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is awrrpt_1_18150_18151.txt.  To use this name,
press <return> to continue, otherwise enter an alternative.

Enter value for report_name: hoge_awr_report 

以上でレポートが出力される。

Linuxで無線LANを使ってみる

RHEL をインストールした ThinkPad X61 で、実験用に複数のLANを使い分けたくなったのですが、PCカード型のNICが手に入らなかったので、内蔵のワイヤレス用インタフェースを無理やり使ってみることにしました。

まず、/etc/sysconfig/network-scripts/ 以下を見ると、ifcfg-wlan0 というのがいるので、NICそのものはRHELにも認識されているようです。
だけど、これを起動しようとしてもエラーになってしまいます。どうやら、NICファームウェア(Linux用)が必要らしい。

そこで /sbin/lspci でデバイス一覧を表示させてみると、

03:00.0 Network controller: Intel Corporation PRO/Wireless 4965 AG or AGN [Kedron] Network Connection (rev 61)

これが wlan0 にあたるNICのようです。
http://intellinuxwireless.org/?n=downloads
上記サイトから、さきほどのWireless NICに対応するぽいファイル "iwlwifi-4965-ucode-228.61.2.24.tgz" をダウンロードして、/lib/firmware 以下に配置。

マシンを再起動して、ifcfg-wlan0 をしかるべく書き換えてネットワーク再起動したところ、無事無線に繋がりました。
(さもすんなり成功したかのような書き方をしていますが、実際は ThinkPad の外部のwifi切替スイッチがずっとOFFになっていることに気づかずに、2時間ぐらいifupが通らず悩んでいました。こういう馬鹿なところをなんとかしたい)

バイト配列の中身を16進数として表示する

何度必要に駆られても、覚えられずにそのたびにぐぐっている(そしてそのたびに過去の自分のメモに引っかかりorzとなる)定石的な手順を、改めて記録しておきます。

public class ByteArrayToHexString {

    public static void main( String args[] ){

        // 適当なバイト配列を用意
        byte[] byteArray = "Michigan".getBytes();

        // 結果を入れるためのバッファを用意
        StringBuffer sb = new StringBuffer();

        System.out.println( "byteArray: " + byteArray );


        int i;
        for ( byte b : byteArray ){

        	// バイトを自然数に変換... するときは注意が必要
        	// もし b が負数の場合を考慮して、0xFFとの論理積をとり下位8bitの値だけをみるように
        	i = 0xFF & (int)b;

        	// これを、16進数で表現
              String str = Integer.toHexString( i );

            // バッファに追加
            sb.append(str);
        }

        System.out.println( sb.toString() );
        // 出力結果 : 4d6963686967616e
    }
}

多分独学でJavaで遊んでいても、こんなふうにbyteの操作をしようとなかなか思わないはずなので、必要に迫られながら新しいことを学べるという点で、仕事って素敵ですよねぇ・・・?

char1文字をStringに変換する

Stringのコンストラクタには、char[] は引数に取れるんですが、1文字の char はとれないという、衝撃の事実が発覚。
強引に String に変換したいとき、以下のような目に遭わせてやるとよいでしょう。

char c = 0;
String str1 = new Character (c).toString();

でも、もっといい方法があるに違いないですね。