作成者別アーカイブ: ishizuka78

CDATAセクションの取り扱いについて(javax.xml.parsers.DocumentBuilderFactory)

| コメントをどうぞ

CDATAセクションの内容の取得方法がjavax.xml.parsers.DocumentBuilderFactoryに対する設定で違ってくる。
その違いのメモ。

使用したXMLドキュメントは以下の通り。

<?xml version="1.0" encoding="UTF-8"?>
<languages>
    <language name="C">
        <![CDATA[
            #include stdin.h
            int main void(0) {
                printf("Hello, world!");
                return 0;
            }
        ]]>
    </language>
</languages>

上記XMLドキュメントに対し、以下のコードでlanguageノードの内容を確認した。

${true|false}:「true」か「false」を指定する。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setCoalescing(${true|false});

Document doc = factory.newDocumentBuilder().parse(new File(FILE_PATH));
Element root = doc.getDocumentElement();

NodeList languages = root.getElementsByTagName("language");
for (int i = 0, iLen = languages.getLength(); i != iLen; i++) {

    NodeList children = languages.item(i).getChildNodes();
    for (int j = 0, jLen = children.getLength(); j != jLen; j++) {
        Node child = children.item(j);
        System.out.println("node name = " + child.getNodeName());
        System.out.println("node value = " + child.getNodeValue());
        System.out.println();
    }
}

続きを読む

org.json.JSONObjectにおけるnullの取扱い

| コメントをどうぞ

java.util.HashMapだとキー自体が存在しない場合はnullを返却してくれるのですが、org.json.JSONObjectはエラーを投げてきます。

Map<String, String> map = new HashMap<String, String>();
JSONObject json = new JSONObject();

Object mo = map.get("test");
<!--more-->

// org.json.JSONExceptionが発生(JSONObject["test"] not found.)
Object jo = json.get("test");

よって構造が不明なJSONObjectの場合、JSONObject # get()する前にキーの存在のチェック等をする必要があります。

キーの存在およびJSON値nullかどうかの判定方法を、以下の例を用いて示します。

JSONの例

{
    a : "json",
    b : 123,
    c : null
}

JSONObject # isNull()

値がnullまたはキー自体が存在しない場合はtrueを返却してくれます。

json.isNull("c") -> true
json.isNull("d") -> true

なお値がnullJSONは、JSONObject.NULLオブジェクトとして扱われます。

jo.get("c") == JSONObject.NULL -> ture

以下の方法はオブジェクトがnullかどうかの判定のため、JSON値null判定はできません。

json.get("c") == null -> false

JSONObject # has()

キーが存在する場合はtrueを返却してくれます。

json.has("c") -> true
json.has("d") -> false

JAXBによるRSSフィードの作成の略解

| コメントをどうぞ

javax.xml.bind.JAXBを使用したRSSフィードの作成方法です。

今回の期待値は次の通りです。

<rss version="バージョン">
    <channel>
        <title> タイトル </title>
        <description> 説明 </description>
        <link> URL </link>

        <item>
            <title> 記事タイトル </title>
            <description> 記事本文 </description>
        </item>
    </channel>
</rss>

続きを読む

PostgreSQL セットアップからDBの作成&削除まで

| コメントをどうぞ

いつ「ポスグレ使う」と言われてもウロタエないように少し調べてみました。
今回はインストールとDBを作成および削除する方法について分かったことを記します。
環境はCentOS 6.5です。

セットアップ

# yum postgresql-server

yumpostgresql-serverをインストールすると、依存関係であるpostgresqlpostgresql-libsもインストールされます。

  • postgresql
  • postgresql-libs
  • postgresql-server

サービスを起動しようとしたところ、以下のメッセージが表示されて起動できませんでした。

# service postgresql start
/var/lib/pgsql/data is missing. Use "service postgresql initdb" to initialize the cluster first.

初期化のため、最初にservice postgresql initdbを実行しなければならないようです。
serviceコマンドでinitdbは指定したことが無かったので、どういうことかとrcスクリプトを見てみたところ

# cat /etc/init.d/postgresql

initdb()とcase文にinitdbがありました。(startstopが規定というわけではないんですね。)
納得できたのでメッセージ通りにinitdbを実行し、サービスを起動しました。

# service postgresql initdb
# service postgresql start

ちなみにOS起動時にPostgreSQLのサービスを自動で開始したい場合はchkconfigコマンドで設定できます。

# chkconfig postgresql on

DBの作成と削除

DBの作成と削除はそれぞれ次のコマンドで可能です。

createdb ${DB名}
dropdb ${DB名}

ただし、PostgreSQLではこれらの操作はrootユーザーではできません。rootユーザーで操作しようとすると次のメッセージが表示されました。

createdb: could not connect to database postgres: FATAL:  ユーザ"root"のIdent認証に失敗しました

なのでインストール時に自動で作成されたユーザーpostgresを使用します。

su - postgres

なお、作成されたユーザーとグループは次のコマンドで確認できます。

# id postgres
uid=XX(postgres) gid=XX(postgres) groups=XX(postgres)

コマンドラインによる操作

psqlコマンドでPostgreSQLをコマンドラインで操作できます。

PostgreSQLのバージョンの表示

# psql --version

コマンドのヘルプの表示

# psql --help

DBの一覧

# psql --list

DBへの接続

#psql ${DB名}

接続が成功するとプロンプトが${DB名}=#になり、テーブルの作成や削除、CRUDの実行が可能になります。
以下にDBに接続している状態で使用可能なコマンドの一部を記します。

テーブルの一覧

=# \d

指定したテーブル情報の一覧

=# \d ${テーブル名}

DBからの切断と終了

=# \q

AWS CloudFormationテンプレートの書き方

| コメントをどうぞ

AWS CloudFormationについて調査する機会がありましたので、今回作成したテンプレートを元に書き方をまとめました。

テンプレートはJSON形式で記述します。ファイル拡張子は「.template」です。
大体の項目は以下の通りです。

{
    "AWSTemplateFormatVersion" : ${string},
    "Description" : ${string},
    "Parameters" : ${object},
    "Resources" : ${object},
    "Outputs" : ${object}
}

ちなみに今回は省きましたが「Mappings」というのも使用頻度は高そうです。

AWSTemplateFormatVersion

テンプレートのフォーマットのバージョンを記述します。
データタイプは文字列です。
Test Driveで公開されているテンプレートやWebの情報を見る限り、現在は「2010-09-09」を記述すればよさそうです。

"AWSTemplateFormatVersion" : "2010-09-09"

Description

テンプレートの説明を記述します。
データタイプは文字列です。

"Description" : "infoScoop Cloud Enterprise V3.4.0"

Resources

デプロイしたいAWSリソース(EC2、S3など)およびそのAWSリソースの設定をここに記します。
データタイプはオブジェクトです。
AWSリソースのデプロイ順はここの記述順ではなくCloudFormationに委ねられます。
なのでデプロイ順をユーザーが指定することはできません。

次の例では「TestServer」と命名したEC2インスタンスと、「TestServerEip」と命名したEIPをAWSリソースとしています。

"Resources" : {
    "TestServer" : {
        "Type" : "AWS::EC2::Instance",
        "Properties" : ${object}
    },
    "TestServerEip" : {
        "Type" : "AWS::EC2::EIP",
        "Properties" : ${object}
    }
}

「Properties」はAWSリソースの種類ごとに記述する項目が異なります。
「”Type” : “AWS::EC2::Instance”」だったら以下のようになります。

"Resources" : {
    "TestServer" : {
        "Type" : "AWS::EC2::Instance",
        "Properties" : {
            "ImageId" : "ami-XXXXXXXX",
            "InstanceType" : "t1.micro"
            "SecurityGroupIds" : [ "sg-XXXX", "sg-XXXX" ],
        }
    }
}

参照:AWS Resource Types Reference

Parameters

可変なデータをユーザーに入力してもらってテンプレート内で参照したい、ということに使えます。
データタイプはオブジェクトです。

次の例では、AWSのコンソールで確認すると「KeyName」と「Hoge」というラベルで入力フォームが表示されます。

"Parameters" : {
    "KeyName" : {
        "Description" : "ssh secret key name.",
        "Type" : "String"
    },
    "Hoge" : {
        "Description" : "Hoge hoge fuga fuga.",
        "Type" : "Number"
    }
}

上記の例では「Type」と「Description」だけですが、他にも入力値のフォーマットについてなどの設定ができそうです。

参照:Parameters Declaration

Outputs

スタック作成後に出力したい項目をここに記述します。
データタイプはオブジェクトです。

次の例ではAWSのコンソールで「ServerUrl」と「Message」という項目がスタック作成後の出力されることが確認できます。

"Outputs" : {
    "ServerUrl" : {
        "Description" : "Access this page.",
        "Value" : { "Ref" : "TestServerEip" }
    },
    "Message" : {
        "Description" : "Test value",
        "Value" : "Hoge hoge fuga fuga."
    }
}

Ref関数

「Parameters」に指定したユーザーによる入力値や「Resources」に指定したAWSリソースについて参照する関数です。

ちなみにRef関数以外にも色々な関数があります。
参照:Intrinsic Function Reference

パラメーターの参照

以下は、「TestServer」リソースがユーザーが入力した「KeyName」項目の値を参照しています。

"Parameters" : {
    "KeyName" : {
        "Description" : "ssh secret key name.",
        "Type" : "String"
    }
},
"Resources" : {
    "TestServer" : {
        "Type" : "AWS::EC2::Instance",
        "Properties" : {
            "KeyName" : { "Ref" : "KeyName" }
        }
    }
}

AWSリソースの参照

AWSリソースに対してのRefは、AWSリソースの種類によって参照できる値が異なります。
AWSリソースのタイプが「AWS::EC2::Instance」の場合はインスタンスのID、「AWS::EC2::EIP」の場合はパブリックIPになります。
参照:Ref

"Resources" : {
    "TestServer" : {
        "Type" : "AWS::EC2::Instance"
    },
    "TestServerEip" : {
        "Type" : "AWS::EC2::Instance",
        "Properties" : {
            "InstanceId" : { "Ref" : "TestServer" }
        }
    }
},
"Outputs" : {
    "ServerUlrl" : {
        "Value" : { "Ref" : "TestServerEip" }
    }
}