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();

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

はじめてのMySQL on RHEL

初めてMySQLRHEL5.4にインストールしてみました。とりあえず入れて、動かして、テーブルつくって、リモートで繋げるようになるまでの覚え書きです。

  • ダウンロード

ここから、最新の5.5.12をダウンロードします。Platformには「Red Hat & Oracle Enterprise Linux」を選択し、MySQL-5.5.12-1.rhel5.i386.tar をゲット。

  • インストール

MySQLLinuxにインストールする際、RPMパッケージ使用が推奨らしい。
http://dev.mysql.com/doc/refman/5.5/en/linux-installation-rpm.html
以下の要領で、サーバーおよびクライアントモジュールをインストールします(要root権限)。

# rpm -ivh MySQL-server-5.5.12-1.rhel5.i386.rpm
# rpm -ivh MySQL-client-5.5.12-1.rhel5.i386.rpm

以上でインストール完了。早い!

  • 起動

インストール直後はMySQLが起動していませんので、まずはSTARTします。こちらも、インストールを実行したroot権限で実行する必要があります。

# /etc/init.d/mysql start
Starting MySQL.. [ OK ]

  • rootパスワード設定

インストール直後は、rootユーザ*1のパスワードが未設定の状態なので、何はさておきパスワードを設定する必要があります。

$ mysqladmin -u root password '新パスワード'

もしくは以下のスクリプトを流して質問に答えながら設定することもできます。

$ mysql_secure_installation

これで、MySQLへログイン可能になりました。以降はroot権限は不要です。

$ mysql -uroot -p新パスワード
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.5.12 MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

プロンプトが登場しました。

  • データベース作成

MySQLでいう「データベース」とは、テーブルの集合をあらわす論理的な単位のことです。OracleでいうところのDBスキーマが近いでしょうか。
以下のコマンドで作成します。

mysql> create database test_db;

作成されたデータベースは、show databases で確認できます。

  • 一般ユーザ作成

一般のmysqlユーザを作成します。CREATE USER.. をしなくても、いきなりGRANT文でユーザーが作れるようです。
GRANTは以下のような形式となります。
GRANT <権限> ON <データベース>.<テーブル> TO <ユーザ>@'<ホスト>' IDENTIFIED BY '<パスワード>';

mysql> grant select,insert,delete,update,create,drop on test_db.* to test_user@'%' identified by 'test_password';

このとき、<ホスト>部分は省略可能ですが、その場合 test_user@localhost として認識され、ローカルでの接続しか許可されなくなってしまいます。なので、リモートホストからの接続を想定している場合は、ワイルドカードを指定します。

作成したユーザでログインします。

$ mysql -utest_user -ptest_password

  • テーブル作成

テーブル作成前に、どのデータベースにテーブルをつくるのかを選択する必要があります。

mysql> use test_db;
Database changed

ここでCREATE TABLEを発行すれば、test_db内にテーブルが作成されることになります。以降は一般的なSQLなので、割愛します。

  • リモートからの接続

MySQLのクライアントモジュールがインストールされたリモートマシンから、以下のようにログインできることを確認します。

$ mysql -utest_user -h<ホスト> -ptest_password

以上。

*1:MySQLのrootユーザ。OSのrootユーザとは関係ない