Kohei Nozaki's blog 

Mavenプロジェクトにライブラリを追加してみる


Posted on Tuesday Jan 21, 2014 at 07:51AM in Technology


何をするの?

EclipseからMavenを使ってライブラリを追加してみます。

環境

  • Eclipse Kelper SR1
  • OS X 10.9.1
  • ここで作ったプロジェクトが対象

Commons Langを追加してみる

何がうれしいの

Commons Langのサイトに限らずJavaで書かれたライブラリのWebサイト等をみるとこういう表記を見かける事が有ります

ここに書かれた表記をpom.xmlに追記すれば、自動的にjarファイルをダウンロードしてきてプロジェクトの設定を更新してくれます。依存関係があったり数が多かったりすると自力でjarファイルを集めるのはとても大変なのですが、少しコピペするだけで済むのはすごくうれしい。

pom.xmlを編集する

まずEclipseでpom.xmlを開いてpom.xmlタブをクリックします

pom.xmlが表示されます

既にあるdependency要素の直後に、Commons Langのサイトに書いてあった内容を追記します(選択部分)。

保存すると右下の処理中インジケータが動き出します。処理が終わったらMaven Dependenciesを開いてみると

追加されていますね。自分でダウンロードしてゴニョゴニョとやるよりもだいぶ楽です。

参考文献


JUnitを動かしてみる


Posted on Tuesday Jan 21, 2014 at 07:48AM in Technology


何をするの?

EclipseからJUnitテストを動かしてみます

環境

  • Eclipse Kelper SR1
  • OS X 10.9.1
  • ここで作ったプロジェクトが対象

JUnitの設定

プロジェクトのプロパティを開いて、Java Build Pathを選ぶと何故かテスト用ディレクトリがおかしな事になっています。×印がついています。missingだそうです。

どうもディレクトリが無いようなので作ります。こんな感じ

作ったらプロジェクトをリフレッシュ

再度Java Build Pathを見てみましょう。×印が消えました。

テストを書いてみる

テストクラスを作る

jbatchのところで作ったクラスを対象にテストを書いてみましょう。右クリックしてNew→Otherを選びます

junitと検索すると現れるJUnit Test Caseを選んでNext

Source Folderは先ほど作ったテスト用のディレクトリに変更し、その他必要事項を入れてFinish

OK

テストクラスができました。

走らせてみる

メニューからRunを選びます

JUnit Testを選んでOKを押します

失敗なのが切ないですが動きましたね。Shift+Cmd+F11がショートカットなので使うと楽です。

参考文献


軽いUMLエディタ「Umlet」を使ってみる


Posted on Tuesday Jan 21, 2014 at 07:45AM in Technology


何をするの?

Javaで作られたUMLエディタUmletでUMLダイアグラムを書いてみます

環境

  • Umlet 12.2
  • Oracle JRE7 u51
  • OS X 10.9.1

Eclipseプラグイン版も存在するようですが、私はスタンドアロン版のumlet_12.2.zipというやつを取ってきました。

起動してみる

zipを展開してumlet.shを叩くと立ち上がります。

クラス図を描いてみる

クラスを一つ描いてみる

  1. 画面右上の部分にあるSimpleClassを画面左側にドラッグして持っていきます
  2. 右下のPropertiesの部分を編集してクラスの名前を変えたりメンバを追加していきます。編集するとリアルタイムで反映されます

他のツールと異なり非常にシンプルですがその分軽いです。

関連を描いてみる

  1. もう一つクラスを作ります

  2. 画面右上にある集約をダブルクリックします ちなみに画面左側でもダブルクリックでオブジェクトをコピーできます

  3. 画面左に新しく集約が作られます

  4. マウスで位置と長さを調節します

  5. カーディナリティを入れてみます

  6. ltの<を一つ追加してコンポジションに変えてみます

<の数で端の形が変わります。

  • 2つで継承

  • 1つで矢印

  • 0でただの線

Exportしてみる

どうやるの?

FileメニューからExport as...を選ぶと出来ます

PDF出力してみる

まあ普通ですね

日本語をPDF出力してみる

こんなのをPDFにすると

うーん何故か日本語が消えてしまいます

日本語をPNG出力してみる

PNGだと大丈夫

日本語をSVG出力してみる

SVGでもOKですね

その他

  • 矩形選択はCmd+ドラッグ
  • 折れ線は線の上の何も無いところでドラッグ

クラス図の他は?

いろいろ描けるみたいです。

参考文献


ロール、DB、権限、テーブルを定義してみる


Posted on Tuesday Jan 21, 2014 at 07:42AM in Technology


環境

  • PostgreSQL 9.2.6
  • CentOS 6.5
  • ここに書いた作業をした後

何をするの?

  • ロールの定義
  • データベースの作成
  • 権限の割当
  • テーブルの作成

ロールの定義

どんなロールが必要か?

こんなものだろうか

  1. 何でもできるスーパーユーザ
  2. データベースを作ったりは出来ないが、テーブルの読み書きとDDLも流せる人力メンテ用のユーザ
  3. テーブルの読み書きできるけどDDLは流せないアプリ用のユーザ

スーパーユーザでログインする

別に作らなくてもインストールしただけでpostgresというユーザが用意されている。こうするとログインできる

sudo -i -u postgres psql

createuserコマンドのオプション

-P
作成と同時にパスワードを設定する
-e
作成時に実行されるSQL文を表示する
-S
非スーパーユーザにする(デフォルト)。スーパーユーザにする場合は -s

人力メンテ用のユーザを作る

sudo -i -u postgres createuser -P -e -S kyle

アプリ用のユーザを作る

sudo -i -u postgres createuser -P -e -S wildfly

ユーザ一覧を見る

$ sudo -i -u postgres sh -c "psql -c 'select * from pg_shadow'"
 usename  | usesysid | usecreatedb | usesuper | usecatupd | userepl |               passwd                | valuntil | useconfig 
----------+----------+-------------+----------+-----------+---------+-------------------------------------+----------+-----------
 postgres |       10 | t           | t        | t         | t       |                                     |          | 
 kyle     |    16384 | f           | f        | f         | f       | ***                                 |          | 
 wildfly  |    16385 | f           | f        | f         | f       | ***                                 |          | 
(3 行)

$ 

テーブル単位とか細かい権限制御は別のコマンドを使うのだろう。

データベースの作成

オーナーを指定して作成する

ここでは人力メンテ用のユーザをオーナーにしてデータベースを作ってみましょう。

echo create database articles owner kyle encoding \'UTF8\' TEMPLATE template0 | sudo -i -u postgres psql 

データベース一覧を見る

sudo -i -u postgres sh -c "psql -c '\l'"

出来てますね。

$ sudo -i -u postgres sh -c "psql -c '\l'"
                                        データベース一覧
   名前    |  所有者  | エンコーディング | 照合順序 | Ctype(変換演算子) |      アクセス権       
-----------+----------+------------------+----------+-------------------+-----------------------
 articles  | kyle     | UTF8             | C        | C                 | 
 postgres  | postgres | SQL_ASCII        | C        | C                 | 
 template0 | postgres | SQL_ASCII        | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
 template1 | postgres | SQL_ASCII        | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
(4 行)

$ 

データベースを削除する

sudo -i -u postgres sh -c "psql -c 'drop database articles'"

権限の割当

いったんpublicスキーマの権限を全て剥奪する

sudo -i -u postgres sh -c "psql articles -c 'REVOKE ALL ON schema public FROM public'"

kyleはDDLを流せるようにする

sudo -i -u postgres sh -c "psql articles -c 'GRANT ALL ON schema public TO kyle'"

wildflyはCRUDのみ許可する

sudo -i -u postgres sh -c "psql articles -c 'GRANT USAGE ON schema public TO wildfly'"
sudo -i -u postgres sh -c "psql articles -c 'grant select, insert, update, delete on all tables in schema public to wildfly'"
sudo -i -u postgres sh -c "psql articles -c 'GRANT SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA public TO wildfly'"

テーブルの作成

psqlコマンドでログインしてみる

psql articles

テーブル一覧を見る

\d

テーブルを作る

CREATE TABLE test_table (
    id          bigint                                 NOT NULL,
    description character varying(128)                 NOT NULL,
    name        character varying(128)          UNIQUE NOT NULL,
    seq         integer                         UNIQUE NOT NULL,
    created     timestamp without time zone            NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated     timestamp without time zone            NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
);

テーブル定義を見る

\d test_table

その他

DDLのダンプ

sudo -i -u postgres sh -c "pg_dump --schema-only articles" > dumped.sql

アプリ用ユーザからログインしてみる

sudo -i -u wildfly psql articles

psql実行中にデータベースを切り替える

\c hogedb
\c hogedb hogeuser

ユーザをスーパーユーザにする

ALTER ROLE kyle WITH CREATEROLE SUPERUSER

やってみる

kyle-no-MacBook:~ kyle$ psql -U postgres
Password for user postgres: 
psql (9.2.4)
Type "help" for help.

postgres=# ALTER ROLE kyle WITH CREATEROLE SUPERUSER;
ALTER ROLE
kyle-no-MacBook:~ kyle$ psql
Password: 
psql (9.2.4)
Type "help" for help.

kyle=# 

プロンプトが変わった。

ユーザを非スーパーユーザにする

kyle-no-MacBook:~ kyle$ psql
Password: 
psql (9.2.4)
Type "help" for help.

kyle=# ALTER ROLE kyle WITH CREATEROLE NOSUPERUSER;
ALTER ROLE
kyle=# \q
kyle-no-MacBook:~ kyle$ psql
Password: 
psql (9.2.4)
Type "help" for help.

kyle=> 

プロンプトが元に戻った。

参考文献


ProjectStageをJNDIで設定する


Posted on Tuesday Jan 21, 2014 at 07:39AM in Technology


環境

  • WildFly 8.0.0CR1

何をするの?

JSFのProjectStageをJNDIから取得するように設定してみます。このProjectStageというのはJSFエンジンに与えるパラメータの一種で、値としてはPRODUCTION(本番稼働フェーズ)、DEVELOPMENT(開発フェーズ)などが定義されています。開発フェーズではDEVELOPMENTにしておくと、問題発生時にデバッグのための情報が多く吐き出されたり、本番稼働フェーズではPRODUCTIONにしておくと、パフォーマンスが向上したりします。

基本的にはweb.xmlに定義するのですが、web.xmlに直接書いてしまうと本番稼働時にPRODUCTIONに変更したい、となったときに若干面倒です。そこでこの値をJNDIから取得するようにしてみます。

JNDIの設定

jboss-cliを起動

wildflyのbinディレクトリ内に存在するCLIの管理コンソールです。GlassFishのasadminに相当すると思われます。Windowsではjboss-cli.bat、Unix系ではjboss-cli.shを使って起動します。起動するとこんな感じになります

$ ./jboss-cli.sh
You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands.
[disconnected /] 

接続

connect とコマンドを打つとAPサーバに接続するようです

[disconnected /] connect
[standalone@localhost:9990 /] 

JNDIエントリを新規作成

新たにJNDIエントリを追加するときはこれ。java:/env/jsf/ProjectStageがキー、Developmentが値になります

/subsystem=naming/binding=java\:\/env\/jsf\/ProjectStage/:add(binding-type=simple,value=Development,class=java.lang.String)

こういう感じにsuccessと出ればOK

[standalone@localhost:9990 /] /subsystem=naming/binding=java\:\/env\/jsf\/ProjectStage/:add(binding-type=simple,value=Development,class=java.lang.String)
{"outcome" => "success"}
[standalone@localhost:9990 /]

JNDIエントリを更新

既に作ったエントリを更新する場合はこんな感じ。java:/env/jsf/ProjectStageをUnitTestに変更する例はこちら

/subsystem=naming/binding=java\:\/env\/jsf\/ProjectStage/:write-attribute(name=value,value=UnitTest)

JNDIエントリを確認

こんな感じ。一番右側のvalueというところに設定した値が出ています

[standalone@localhost:9990 /] ls /subsystem=naming/binding=java\:\/env\/jsf\/ProjectStage
binding-type=simple     cache=undefined         class=java.lang.String  environment=undefined   lookup=undefined        module=undefined        type=undefined          value=UnitTest          
[standalone@localhost:9990 /] 

JNDIエントリの一覧

[standalone@localhost:9990 /] ls /subsystem=naming/binding
java:/env/jsf/ProjectStage  
[standalone@localhost:9990 /] 

まだ1つだけしか無いようですね

JNDIエントリを参照するJSFアプリを作ってみる

プロジェクトを作る

ここまでに述べた通りJNDIエントリは作成してあるものとします。ここに書いたのと同じ要領で空っぽのJavaEE7プロジェクトを作ります。プロジェクトの設定でCDIを有効にしておきます。これをやると空のbeans.xmlが作成されます。

web.xmlを作る

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.xhtml</url-pattern>
	</servlet-mapping>
	<resource-ref>
		<res-ref-name>jsf/ProjectStage</res-ref-name>
		<res-type>java.lang.String</res-type>
	</resource-ref>
</web-app>

jboss-web.xmlを作る

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
	<resource-ref>
		<res-ref-name>jsf/ProjectStage</res-ref-name>
		<res-type>java.lang.String</res-type>
		<jndi-name>java:/env/jsf/ProjectStage</jndi-name>
	</resource-ref>
</jboss-web>

CDI管理Beanを作る

package psjndi;

import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;

@Named
@RequestScoped
public class TestBean {

	public String getProjectStage() {
		return FacesContext.getCurrentInstance().getApplication().getProjectStage().toString();
	}
}

XHTMLを作る

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:head></h:head> 
<body> 
#{testBean.projectStage}
</body> 
</html>

資源の配置場所を確認

上記の資源たちの配置はこんな感じになります。beans.xmlも存在する事を確認してください。

確認したらデプロイしてみます。

アクセスしてみる

JNDIに設定した通りDevelopmentと表示されます。

ProjectStageを変更してみる

jboss-cliから変更してみる

UnitTestに変更してみます。

[standalone@localhost:9990 /] /subsystem=naming/binding=java\:\/env\/jsf\/ProjectStage/:write-attribute(name=value,value=UnitTest)
{
    "outcome" => "success",
    "response-headers" => {
        "operation-requires-reload" => true,
        "process-state" => "reload-required"
    }
}
[standalone@localhost:9990 /] 

アプリにアクセスしてみる

これだけやってブラウザをリロードしてもDevelopmentのままです。まあoperation-requires-reloadとか言っているので再起動なりの作業が必要なのでしょう。そこで再起動かけてみます。Servers窓からWildFlyの右クリックメニューを表示してRestartを選びます。再起動したら再度リロードしてみます。 アプリの資源を一切触る事無く変更することができました。

ProjectStage一覧

  1. Development
  2. UnitTest
  3. SystemTest
  4. Production

Productionに近づくほど例外とかの詳細度が低くなっていきパフォーマンスが向上するらしい。うろ覚えですが、速くなる他にも、キャッシュとかの挙動が変わったりJSFが自動で用意するJavaScriptが差し替えられていたりしたような記憶が有ります。おそらくDevelopmentではデバッグしやすいJavaScriptが送られたりするのでしょう。

参考文献