本年もお世話になりました。
2014年もよろしくお願いいたします。
よいお年をお迎えください。
2013年12月31日火曜日
2013年12月18日水曜日
PHPメモー12月18日
PHPメモ
func_get_args 関数の引数リストを配列として返す http://www.php.net/manual/ja/function.func-get-args.php
array_shift array の最初の値を取り出して返します。配列 array は、要素一つ分だけ短くなり、全ての要素は前にずれます。 数値添字の配列のキーはゼロから順に新たに振りなおされますが、 リテラルのキーはそのままになります。 http://phpspot.net/php/man/php/function.array-shift.html
$this 疑似変数 $this は、呼び出し元オブジェクト (通常は、メソッドが属するオブジェクトですが、 メソッドが第二のオブジェクトのオブジェクトの コンテキストから スタティックに コールされる場合には、別のオブジェクトとなる場合もあります) への参照です http://www.php.net/manual/ja/language.oop5.basic.php
openlog システムのロガーへの接続をオープンする http://php.net/manual/ja/function.openlog.php
func_get_args 関数の引数リストを配列として返す http://www.php.net/manual/ja/function.func-get-args.php
array_shift array の最初の値を取り出して返します。配列 array は、要素一つ分だけ短くなり、全ての要素は前にずれます。 数値添字の配列のキーはゼロから順に新たに振りなおされますが、 リテラルのキーはそのままになります。 http://phpspot.net/php/man/php/function.array-shift.html
$this 疑似変数 $this は、呼び出し元オブジェクト (通常は、メソッドが属するオブジェクトですが、 メソッドが第二のオブジェクトのオブジェクトの コンテキストから スタティックに コールされる場合には、別のオブジェクトとなる場合もあります) への参照です http://www.php.net/manual/ja/language.oop5.basic.php
openlog システムのロガーへの接続をオープンする http://php.net/manual/ja/function.openlog.php
2013年12月10日火曜日
Virtual Box 2
Linux環境の構築の2回目
ネットワーク構築について
NATのデフォルト設定は10.0.2.0です
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=xxxx
TYPE=Ethernet
UUID=xxxx
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
BROADCAST=10.0.2.155
IPADDR=10.0.2.10
NETMASK=255.255.255.0
NETWORK=10.0.2.0
GATEWAY=10.0.2.2
#ifdown eth0
#ifup eth0
これで外部接続は可能
ホストオンリーのデフォルト設定は192.168.56.0です
#vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
HWADDR=xxxxxxxxxxxxx
IPADDR=192.168.56.10
NETMASK=255.255.255.0
NETWORK=192.168.56.0
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=yes
#ifdown eth1
#ifup eth1
これでホストとゲスト環境が接続可能
次回はLinux環境について
ネットワーク構築について
NATのデフォルト設定は10.0.2.0です
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=xxxx
TYPE=Ethernet
UUID=xxxx
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
BROADCAST=10.0.2.155
IPADDR=10.0.2.10
NETMASK=255.255.255.0
NETWORK=10.0.2.0
GATEWAY=10.0.2.2
#ifdown eth0
#ifup eth0
これで外部接続は可能
ホストオンリーのデフォルト設定は192.168.56.0です
#vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
HWADDR=xxxxxxxxxxxxx
IPADDR=192.168.56.10
NETMASK=255.255.255.0
NETWORK=192.168.56.0
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=yes
#ifdown eth1
#ifup eth1
これでホストとゲスト環境が接続可能
次回はLinux環境について
2013年12月9日月曜日
VirtualBox 1
OracleのVirtualBoxでWindows上でLinux環境の構築ついて
1.ソースの入手
①VirtualBoxの入手
http://dlc.sun.com.edgesuite.net/virtualbox/4.3.2/VirtualBox-4.3.2-90405-OSX.dmg
②エクステションファイルの入手
http://download.virtualbox.org/virtualbox/4.3.2/Oracle_VM_VirtualBox_Extension_Pack-4.3.2-90405.vbox-extpack
③CENTOSの入手
http://ftp.usf.edu/pub/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-minimal.iso
2.VirtualBoxのインストール
3.エクステションの実行
4..virtualboxネットワーク環境の構築
アダプタ-1:NAT
アダプター2:ホストオンリーアダプタ
5.ゲストサーバの構築
新規 Linux RedHat(64)
設定後 ネットワーク設定
アダプター1の割当をNAT
アダプター2の割り当てはホストオンリーアダプタ
DVDの設定で ダウンロードしたCentOS-6.4-x86_64-minimal.isoを指定
とする
6..osのインストール
次回はネットワークの設定について述べる
1.ソースの入手
①VirtualBoxの入手
http://dlc.sun.com.edgesuite.net/virtualbox/4.3.2/VirtualBox-4.3.2-90405-OSX.dmg
②エクステションファイルの入手
http://download.virtualbox.org/virtualbox/4.3.2/Oracle_VM_VirtualBox_Extension_Pack-4.3.2-90405.vbox-extpack
③CENTOSの入手
http://ftp.usf.edu/pub/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-minimal.iso
2.VirtualBoxのインストール
3.エクステションの実行
4..virtualboxネットワーク環境の構築
アダプタ-1:NAT
アダプター2:ホストオンリーアダプタ
5.ゲストサーバの構築
新規 Linux RedHat(64)
設定後 ネットワーク設定
アダプター1の割当をNAT
アダプター2の割り当てはホストオンリーアダプタ
DVDの設定で ダウンロードしたCentOS-6.4-x86_64-minimal.isoを指定
とする
6..osのインストール
次回はネットワークの設定について述べる
2013年12月1日日曜日
コミュニケーション不足は何が原因
コミュニケーションの不足はなぜ起きるのかを考えてみます。
【要因1:核家族化とフラット化した家族】
子供は子供部屋を小さいころから与えられ、家族との断絶している。マンガの本を読んでいたり、PCまたは携帯端末のゲームをしていてもわからない親が多い。
また子供のゲームなどを理解しているわけではない。
ゆえに人間は小さいころから隔絶した個人として扱われ、コミュニケーションをとる場がない
【要因2:学校は階級社会】
フラット化した家族から、階級社会の学校に移ると、どうなるでしょう。
急に先輩が登場したりして、階級が生じる。すべて先輩の言うことが正しいことになり、自分の意見が通らない。混乱を生じ、いじめの温床にもなる。
階級社会の中でどう生き延びるのかと言えば・・・素直にいうことを聞くしかない。
処世術ということでしょう。
ここで処世術を学んだものは、コミュニケーションはよくなり、
処世術を学べないものは、コミュニケーションの不足になる
【要因3:フラット化した社会生活に見えるが実は階級社会】
社会に出れば、要因2で処世術を学んでいない人はどうなるでしょう?
フラット化した社会と思う職業は実は階級社会、混乱するでしょうね。
処世術を知らないものは、携帯端末に頼り、すべて、文字に預ける。
何が正しいかも判断性を失う、そして、現実世界では精神的に追い詰められることになります。
コミュニケーションをどうするのか、課題です・・・
【要因1:核家族化とフラット化した家族】
子供は子供部屋を小さいころから与えられ、家族との断絶している。マンガの本を読んでいたり、PCまたは携帯端末のゲームをしていてもわからない親が多い。
また子供のゲームなどを理解しているわけではない。
ゆえに人間は小さいころから隔絶した個人として扱われ、コミュニケーションをとる場がない
【要因2:学校は階級社会】
フラット化した家族から、階級社会の学校に移ると、どうなるでしょう。
急に先輩が登場したりして、階級が生じる。すべて先輩の言うことが正しいことになり、自分の意見が通らない。混乱を生じ、いじめの温床にもなる。
階級社会の中でどう生き延びるのかと言えば・・・素直にいうことを聞くしかない。
処世術ということでしょう。
ここで処世術を学んだものは、コミュニケーションはよくなり、
処世術を学べないものは、コミュニケーションの不足になる
【要因3:フラット化した社会生活に見えるが実は階級社会】
社会に出れば、要因2で処世術を学んでいない人はどうなるでしょう?
フラット化した社会と思う職業は実は階級社会、混乱するでしょうね。
処世術を知らないものは、携帯端末に頼り、すべて、文字に預ける。
何が正しいかも判断性を失う、そして、現実世界では精神的に追い詰められることになります。
コミュニケーションをどうするのか、課題です・・・
2013年11月5日火曜日
memcached
memcached は,LiveJournal を運営していたDanga Interactive 社で,Brad Fitzpatrick 氏が中心となって開発されたソフトウェアです。
現在では、さまざまなサービスでWeb アプリケーションのスケーラビリティを向上させる重要な要素になっています。
多くのWeb アプリケーションは,RDBMS にデータを格納し,アプリケーションサーバでそのデータを引き出してブラウザ等に表示させています。しかしデータが大量になったり,アクセスが集中すると,RDBMSの負荷があがり,データベースのレスポンスが悪化し,Web サイトの表示が遅延するなど大きな影響がでてしまいます。
そこでmemcached は高性能な分散メモリキャッシュサーバです。通常,データベースへの問い合わせ結果を一時的にキャッシュすることで,データベースへのアクセス回数を減らし,動的なウェブアプリケーションの高速化やスケーラビリティの向上のために利用されている。
メモリ Slab Allocation
イベントハンドラ libevent
現在では、さまざまなサービスでWeb アプリケーションのスケーラビリティを向上させる重要な要素になっています。
多くのWeb アプリケーションは,RDBMS にデータを格納し,アプリケーションサーバでそのデータを引き出してブラウザ等に表示させています。しかしデータが大量になったり,アクセスが集中すると,RDBMSの負荷があがり,データベースのレスポンスが悪化し,Web サイトの表示が遅延するなど大きな影響がでてしまいます。
そこでmemcached は高性能な分散メモリキャッシュサーバです。通常,データベースへの問い合わせ結果を一時的にキャッシュすることで,データベースへのアクセス回数を減らし,動的なウェブアプリケーションの高速化やスケーラビリティの向上のために利用されている。
メモリ Slab Allocation
イベントハンドラ libevent
2013年10月30日水曜日
就職活動について
多くの人が就職活動でいろいろな情報を集めています。
対策本などがたくさん出回っています。
読んでおこくことも必要ですが、自分の言葉に置き換えて話すことを心がけましょう。
棒読みでは気持ちが通じません。
また自己アピールについても同様。単なるコピーではいけません。
なぜでしょう?
採用を担当する人もまた対策本を読んでいるし、人事コンサルタントが会社側にいます。
となると、上記の対策本などで明確な回答を持っていない人は、書類審査や面接で厳しく落とされます。
①責任を持つことが必要
今は、責任なしの仕事はありません
②長短期の展望を述べること
1年~3年の方向性、自分の指針を述べる
腰掛の会社ということを述べる人がいますが、このような人はすべて排除されます
③相談するときは専門家としてください。
入社している人の意見はあてになりません
④自己研鑽を忘れない
やりたいことがあっても何もしていない人は、断られます
初心者でできることは新入社員を採用となります。
⑤矛盾のない履歴などにすること
何でも書いている人がいますが、方向性などが矛盾をしてしまい、書類審査でおとされます。
対策本などがたくさん出回っています。
読んでおこくことも必要ですが、自分の言葉に置き換えて話すことを心がけましょう。
棒読みでは気持ちが通じません。
また自己アピールについても同様。単なるコピーではいけません。
なぜでしょう?
採用を担当する人もまた対策本を読んでいるし、人事コンサルタントが会社側にいます。
となると、上記の対策本などで明確な回答を持っていない人は、書類審査や面接で厳しく落とされます。
①責任を持つことが必要
今は、責任なしの仕事はありません
②長短期の展望を述べること
1年~3年の方向性、自分の指針を述べる
腰掛の会社ということを述べる人がいますが、このような人はすべて排除されます
③相談するときは専門家としてください。
入社している人の意見はあてになりません
④自己研鑽を忘れない
やりたいことがあっても何もしていない人は、断られます
初心者でできることは新入社員を採用となります。
⑤矛盾のない履歴などにすること
何でも書いている人がいますが、方向性などが矛盾をしてしまい、書類審査でおとされます。
2013年10月29日火曜日
企業体質について
みずほ銀行、阪神阪急ホテルの一連のことについて考えました。
①組織が縦社会
②組織を守るが他の組織に対しては責任がない
③誰のための組織または企業なのかを考えていない
④エリート意識が強い
管理は一流であっても、大組織の中で養われものであって、何かをできるわけではない
結局、組織の中で人間がどう動くかである。
要は、組織の判断である。
法の判断ではなく、組織の暗黙の了解のもとに動いてしまうのが大企業の組織の愚かさ。
人が多いからということでは片付けられないのであるが・・・
どうすれば、直るのか。
大組織の問題点、そして、今後の日本の組織論について問い直される時期になっています。
①組織が縦社会
②組織を守るが他の組織に対しては責任がない
③誰のための組織または企業なのかを考えていない
④エリート意識が強い
管理は一流であっても、大組織の中で養われものであって、何かをできるわけではない
結局、組織の中で人間がどう動くかである。
要は、組織の判断である。
法の判断ではなく、組織の暗黙の了解のもとに動いてしまうのが大企業の組織の愚かさ。
人が多いからということでは片付けられないのであるが・・・
どうすれば、直るのか。
大組織の問題点、そして、今後の日本の組織論について問い直される時期になっています。
2013年10月22日火曜日
netsupportのバージョンアップのたびにひどい
NetSupport、バージョンアップをすると、PCがおかしくなる。
なぜ、?
全く検証が行われていないということか?
割安で使いやすいと思ったが全く役に立たない。
それに利用していると、変な動きをし、Windowsなどの構成ファイルに影響を及ぼす。
セキュリティ上、利用価値は無いように思えてきた。
なぜ、?
全く検証が行われていないということか?
割安で使いやすいと思ったが全く役に立たない。
それに利用していると、変な動きをし、Windowsなどの構成ファイルに影響を及ぼす。
セキュリティ上、利用価値は無いように思えてきた。
2013年10月10日木曜日
Andorid-01
コンポーネントには、以下の4種類があります。
①Activity
一つの視覚的なユーザインターフェイス(UI)を表します。
アプリケーションは一つの Activity で構成することも、複数で構成することもできます。
各 Activity には、それを表示するためのデフォルトウィンドウが割り当てられます。
ウィンドウの視覚的コンテンツは、ビュー(View)として提供されます。
Activity.setContentView() メソッドによって、Activity のウィンドウ内にビューを配置します。
これが Root View となります。
Activity は常にフォアグラウンドで動きます。
他の Activity が有効になったとき、今まで動いていた Activity は停止します。
Activity をバックグラウンドで動かすことはできません。
②Service
UI を持たず、バックグラウンドで実行されます。
Activity と違い、いくつもの Service をバックグラウンドで動かすことができます。
③Broadcast Receiver
あらゆるブロードキャスト(イベント)を受信して、それに対処します。
写真撮影、電池の残量が少なくなった、など様々なブロードキャストがあります。
イベント受信コンポーネントと考えれば、わかりやすいでしょう。
④Content Provider
アプリケーションのデータを、他のアプリケーションから利用できるようにするコンポーネントです。
ファイルや SQLite など、一般的なデータが使用できます。
2013年10月9日水曜日
PHP:決済サーバとの接続について
PHPにおける決済サーバとの接続について
// POSTフォームの構成
$context =
'http' => array(
'method' => 'POST',
'header' => implode("\r\n", array(
'Content-Type: application/x-www-form-urlencoded',
)),
//パラメータ(決済情報に送るデータの設定
'content' => http_build_query(array(
'SETL_CLASS' => XXXX, // 取引種別
・・・・・
))));
// 決済サーバのURL
$url = NNNN; //httpsでも可能
// 決済
if (($ret_raw = file_get_contents($url, false, $context)) === FALSE) {
if (is_null($http_response_header)) {
die("サーバまたはクライアントエラー");
}
$list = split(' ', $http_response_header[0]);
echo ("サーバエラーコード:") . $list[1]; //ステータスコード出力
} else {
//正常系
//ダンプ出力
//var_dump($http_response_header) . "
";
//応答電文の分解
$raw = split("\r\n", $ret_raw);
//ダンプ出力
//var_dump($raw) . "
";
for ($i = 0; $i < count($raw); $i++) {
$temp = split("=", $raw[$i]);
//echo $temp[0] . " = " . $temp[1]. "
";
$result[$temp[0]] = $temp[1];
}
}
?>
// POSTフォームの構成
$context =
'http' => array(
'method' => 'POST',
'header' => implode("\r\n", array(
'Content-Type: application/x-www-form-urlencoded',
)),
//パラメータ(決済情報に送るデータの設定
'content' => http_build_query(array(
'SETL_CLASS' => XXXX, // 取引種別
・・・・・
))));
// 決済サーバのURL
$url = NNNN; //httpsでも可能
// 決済
if (($ret_raw = file_get_contents($url, false, $context)) === FALSE) {
if (is_null($http_response_header)) {
die("サーバまたはクライアントエラー");
}
$list = split(' ', $http_response_header[0]);
echo ("サーバエラーコード:") . $list[1]; //ステータスコード出力
} else {
//正常系
//ダンプ出力
//var_dump($http_response_header) . "
";
//応答電文の分解
$raw = split("\r\n", $ret_raw);
//ダンプ出力
//var_dump($raw) . "
";
for ($i = 0; $i < count($raw); $i++) {
$temp = split("=", $raw[$i]);
//echo $temp[0] . " = " . $temp[1]. "
";
$result[$temp[0]] = $temp[1];
}
}
?>
2013年8月28日水曜日
NetSupport
久々に簡単なツールがあったので紹介します。
PCの運用など、また、PC管理に手間がかかる会社にはNetSupportが便利。
利用すると、様々な利用ができる。
①リモートコントロールができるのアプリケーションを構築する場合には利用できる
②学校用の教育にも利用できる
③簡易なスクリプトがあり、アプリケーションとともに構築が可能。
2013年8月27日火曜日
2013年6月18日火曜日
ksh
kshサンプルスクリプト ファイル読み込み ********************************************
#!/bin/ksh
#入力ファイル名
INPUTFILE="./input.txt"
#入力ファイルの区切り文字
IFS=",";
#ファイル読み込み
while read line ;
do if [[ "$line" != "" ]]
then
set $line echo "[$1][$2]"
fi
done < ${INPUTFILE} *
*******************************************
カンマ区切りファイルを読み込むの場合は、
IFS=",";
カンマまたは、セミコロン、
タブ区切りファイルの場合は、
IFS=",; ";
※セミコロンの後に、タブを入力。
#!/bin/ksh
#入力ファイル名
INPUTFILE="./input.txt"
#入力ファイルの区切り文字
IFS=",";
#ファイル読み込み
while read line ;
do if [[ "$line" != "" ]]
then
set $line echo "[$1][$2]"
fi
done < ${INPUTFILE} *
*******************************************
カンマ区切りファイルを読み込むの場合は、
IFS=",";
カンマまたは、セミコロン、
タブ区切りファイルの場合は、
IFS=",; ";
※セミコロンの後に、タブを入力。
2013年6月9日日曜日
2013年5月29日水曜日
JUnit DBUnit - 5
JUnit3.8 | JUnit4.x | |
---|---|---|
ライブラリのインポート | TestCaseクラスをインポートする。 | Assertクラスの各メソッドをstaticインポートする。 Testアノテーション等をインポートする。 |
テストクラスの定義 | TestCaseを継承する必要がある。 | 特になし。 |
テストメソッドの定義 | 「public void test~() 」testで始まる名前で、public voidで引数なしのメソッドが実行対象。 | 「@Test public void ~() 」@Testアノテーションを付けたpublic voidで引数なしのメソッドが実行対象。 |
テストメソッド実行前後 | setUp() tearDown()が 各テストメソッドの実行前後に呼ばれる。 | @Before @Afterを付けたメソッドが、 各テストメソッドの実行前後に呼ばれる。 |
全テストの実行前後 | なし。 | @BeforeClass @AfterClassを付けたメソッドが、 全テストの実行前後に呼ばれる。 |
等値の確認 | TestCase#assertEquals() を使用。(TestCaseを継承しているので「 assertEquals() 」で使用可能) | Assert.assertEquals() を使用。(static importすれば「 assertEquals() 」で使用可能) |
例外発生の確認 | Exceptionをcatchし、catchできなかったらfail()を呼ぶ。 | @Testアノテーションの 引数expectedに発生すべき例外クラスを指定。 |
実装例 | JUnit3.8 | JUnit4.x |
import junit.framework.TestCase; public class SampleTest extends TestCase { public void testNormal() { 対象クラス obj = new 対象クラス(); int r = obj.試験対象メソッド(); assertEquals(123, r); assertEquals(456, obj.get内部状態()); }
public void testException() {
try {
試験対象実行();
fail("例外が発生するはず");
} catch(発生すべき例外 e) {
// success
assertEquals("文言", e.getMessage());
}
//試験の続き~
}
} | import static org.junit.Assert.*; import org.junit.Test; public class SampleTest { @Test public void normal() { 対象クラス obj = new 対象クラス(); int r = obj.試験対象メソッド(); assertEquals(123, r); assertEquals(456, obj.get内部状態()); } @Test(expected=発生すべき例外.class)
public void testException() {
試験対象実行();
//文言の確認は無理そう?
//別の試験を続けるのは無理そう?
}
} |
2013年5月28日火曜日
JUnit DBUnit - 4
DbUnitでexcelファイルを読み込み、DBへ登録する初期値やテスト結果の期待値を取得します。それにはorg.dbunit.dataset.excel.XlsDataSetを使います。
このXlsDataSetはコンストラクタでjava.io.Fileかjava.io,InputStreamを渡します。
DbUnitを拡張して独自にテストフレームワークを作成する
クラスローダを利用
ClassLoader#getResourceAsStream()を呼び出し、InputStreamを取得
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("excelファイルのフルパス");
このXlsDataSetはコンストラクタでjava.io.Fileかjava.io,InputStreamを渡します。
DbUnitを拡張して独自にテストフレームワークを作成する
クラスローダを利用
ClassLoader#getResourceAsStream()を呼び出し、InputStreamを取得
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("excelファイルのフルパス");
JUnit DBUnit - 3
DaoBaseTestCaseは、テストデータExcelファイル(xxx_prepare.xls)からIDataSetオブジェクトを生成し、テストデータとして使用します。テストの実行前にこのテストデータが自動的にデータベースに反映されることになります。
事前処理の元データを退避し、テストデータを投入する機能や事後処理の元データを復元する機能、またはデータベースに登録されているデータを取得する機能などを、あらかじめ基底クラスに用意しておけば、基底クラスを継承して作成する各テストクラス作業が大変楽になります。
getConnectionは、DBコネクションを取得するメソッドです。getActualTableは、データベースに登録されているデータを取得するメソッドとなります。
getExpectedTableは、テスト結果として期待されるデータを取得するメソッドです。getTableRowCountは、データベースに登録されているデータ件数を取得するメソッドとなります。
assertTableは、期待値とデータベースに登録されているデータの比較をするメソッドです。isSkipColumnは、assertTableメソッド実行時に、比較をスキップするカラム名を指定するメソッドとなります。
assertEntityは、期待値とEntityデータの比較をするメソッドです。getTestFileNameは、テストデータExcelファイルの名前を取得するメソッドとなります。
getExpectedTableは、期待値データを取得するメソッドです。getSubClassは、サブクラスの実行時クラスを取得するメソッドとなります。
テストケース作成手順
①まず、テストクラスには基底クラスのDaoBaseTestCaseを継承させます(リスト1)。
②次に、DaoBaseTestCaseで宣言されている抽象メソッド「getTestFileName」「getTestFileName」「getSubClass」を実装します(リスト2)。
getTestFileNameは、テストデータExcelファイルの名称を指定します。getExpectedTableは、テスト結果として期待されるデータを取得します。getSubClassは、自分自身の実行時クラスを指定します。
登録(更新)系のテストで、期待値とデータベースに登録されているデータの比較をする際、期待値を予測できないカラム(例:「更新日時」など現在日時が設定されるカラム)が存在する場合は、DaoBaseTestCaseクラスのisSkipColumnメソッドをオーバーライドし、比較しない(スキップする)カラムを指定します(リスト3)。
スキップするカラムが存在しない場合、isSkipColumnメソッドはオーバーライドする必要はありません。
最後にテストアセットを作成し、テストコードを記述します。
登録(更新)系は、登録(更新)後のテーブルの値とExcelシートのデータを比較します(リスト4)。検索系は検索結果が正しいかどうかをEntityとExcelシートで比較します(リスト5)。
package dbunit_sample;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.Date;
import junit.framework.TestCase;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.Column;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.ReplacementDataSet;
import org.dbunit.dataset.excel.XlsDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
/**
* DAOテストの基底クラス.
*/
public abstract class DaoBaseTestCase extends TestCase {
/**
* 全テーブル名.
*/
protected static final String[] TABLE_NAME_ALL;
/**
* テーブル数.
*/
private static final int TABLE_SIZE = 1;
/**
* テーブル名.
*/
private static final String TABLE_NAME = "syohin";
/**
* 元データ退避用一時ファイル.
*/
private File file;
/**
* データベースコネクション.
*/
private IDatabaseConnection connection;
/**
* テーブル名を取得する.
*/
static {
TABLE_NAME_ALL = new String[TABLE_SIZE];
for (int i = 0; i < TABLE_NAME_ALL.length; i++) {
String tableName = TABLE_NAME + (i + 1);
if (null == tableName) {
break;
}
TABLE_NAME_ALL[i] = tableName;
}
}
/**
* コンストラクタ.
*
* @param arg0 パラメータ
*/
public DaoBaseTestCase(String arg0) {
super(arg0);
}
/**
* 事前処理.
* 元データを退避し、テストデータを投入する。
*
* @throws Exception 事前処理中にエラーが発生した
*/
protected void setUp() throws Exception {
super.setUp();
try {
connection = this.getConnection();
QueryDataSet queryDataSet = new QueryDataSet(connection);
for (int i = 0; i < TABLE_NAME_ALL.length; i++) {
queryDataSet.addTable(TABLE_NAME_ALL[i]);
}
this.file = File.createTempFile("tmp", ".xml");
FlatXmlDataSet.write(queryDataSet, new FileOutputStream(this.file));
DatabaseOperation.CLEAN_INSERT.execute(connection, this
.getDataSet(getTestFileName()));
} catch (Exception e) {
if (connection != null) {
connection.close();
}
throw e;
}
}
/**
* 事後処理.
* 元データを復元する。
*
* @throws Exception 事後処理中にエラーが発生した
*/
protected void tearDown() throws Exception {
super.tearDown();
try {
DatabaseOperation.CLEAN_INSERT.execute(connection,
new FlatXmlDataSet(this.file));
} catch (Exception e) {
throw e;
} finally {
if (connection != null) {
connection.close();
}
}
}
/**
* DBコネクションを取得する.
*
* @return DBコネクション
*/
protected IDatabaseConnection getConnection() {
return ConnectionManager.getConnection();
}
/**
* データベースに登録されているデータを取得する.
*
* @param tableName テーブル名
* @return データベースに登録されているデータ
* @throws SQLException データベースに登録されているデータの
* 取得中にエラーが発生した
*/
protected ITable getActualTable(String tableName) throws Exception {
IDatabaseConnection connection = null;
try {
connection = getConnection();
return connection.createDataSet().getTable(tableName);
} catch (Exception e) {
throw e;
} finally {
if (connection != null) {
connection.close();
}
}
}
/**
* テスト結果として期待されるデータを取得する.
*
* @param tableName テーブル名
* @param fileName テストファイル名
* @return テスト結果として期待されるデータ
* @throws Exception データの取得中にエラーが発生した
*/
protected ITable getExpectedTable(String tableName, String fileName)
throws Exception {
return this.getDataSet(fileName).getTable(tableName);
}
/**
* データベースに登録されているデータ件数を取得する.
*
* @param tableName テーブル名
* @return データ件数
* @throws Exception データ件数の取得中にエラーが発生した
*/
protected int getTableRowCount(String tableName) throws Exception {
IDatabaseConnection connection = null;
try {
connection = getConnection();
return connection.createDataSet().getTable(tableName).getRowCount();
} finally {
if (connection != null) {
connection.close();
}
}
}
/**
* 期待値とデータベースに登録されているデータの比較をする.
*
* @param expectedTable 期待値データ
* @param actualTable データベースに登録されているデータ
* @throws DataSetException データの比較中にエラーが発生した
*/
protected void assertEquals(ITable expectedTable, ITable actualTable)
throws DataSetException {
for (int i = 0; i < expectedTable.getRowCount(); i++) {
for (int j = 0; j < expectedTable.getTableMetaData().getColumns().length; j++) {
Column[] columns = expectedTable.getTableMetaData()
.getColumns();
String columnName = columns[j].getColumnName();
if (this.isSkipColumn(columnName)) {
continue;
}
assertEquals("Line:" + (i + 1) + " Column:" + columnName,
convertData(expectedTable.getValue(i, columnName)),
convertData(actualTable.getValue(i, columnName)));
}
}
}
/**
* assertTableメソッド実行時、比較をスキップするカラム名を指定する.
*
* @param columnName カラム名
* @return true:スキップ、false:スキップなし
*
*/
protected boolean isSkipColumn(String columnName) {
return false;
}
/**
* 期待値とEntityデータの比較をする.
*
* @param expectedTable 期待値データ
* @param actuals 実際のデータ
* @throws Exception 期待値とEntityデータの比較中にエラーが発生した
*/
protected void assertEquals(ITable expectedTable, Object actuals)
throws Exception {
this.assertEquals(expectedTable, new Object[] { actuals });
}
/**
* 期待値とEntityデータの比較をする.
*
* @param expectedTable 期待値データ
* @param actuals 実際のデータ
* @throws Exception 期待値とEntityデータの比較中にエラーが発生した
*/
protected void assertEquals(ITable expectedTable, Object[] actuals)
throws Exception {
for (int i = 0; i < expectedTable.getRowCount(); i++) {
for (int j = 0; j < expectedTable.getTableMetaData().getColumns().length; j++) {
Column[] columns = expectedTable.getTableMetaData()
.getColumns();
String columnName = columns[j].getColumnName();
String getterName = this.buildGetterName(columnName);
Object actual = actuals[i];
Class[] paramClass = new Class[0];
Object[] paramValue = new Object[0];
Method method = actual.getClass().getDeclaredMethod(getterName,
paramClass);
assertEquals("Line:" + (i + 1) + " Column:" + columnName,
String.valueOf(expectedTable.getValue(i, columnName))
.trim(), String.valueOf(
method.invoke(actual, paramValue)).trim());
}
}
}
/**
* テストデータExcelファイルの名前を取得する.
*
* @return テストデータExcelファイル名称
*/
protected abstract String getTestFileName();
/**
* 期待値データを取得する.
*
* @param index インデックス番号
* @return 期待値データ
* @throws Exception 期待値データの取得中にエラーが発生した
*/
protected abstract ITable getExpectedTable(String index) throws Exception;
/**
* サブクラスの実行時クラスを取得する.
*
* @return 実行時クラス
*/
protected abstract Class getSubClass();
/**
* ファイル名を指定してデータセットを取得する.
*
* @param fileName ファイル名
* @return データセット
* @throws Exception データセットの取得中にエラーが発生した
*/
private IDataSet getDataSet(String fileName) throws Exception {
ReplacementDataSet expectedDataSet = new ReplacementDataSet(
new XlsDataSet(getSubClass().getResourceAsStream(fileName)));
expectedDataSet.addReplacementObject("[SYSDATE]", new Date(System
.currentTimeMillis()));
expectedDataSet.addReplacementObject("[NULL]", null);
return expectedDataSet;
}
/**
* カラム名を指定してgetterメソッド名を取得する.
*
* @param columnName カラム名
* @return getterメソッド名
*/
private String buildGetterName(String columnName) {
String getterName = "get";
String temp = columnName;
while (true) {
int index = temp.indexOf("_");
if (index == -1) {
getterName += temp.substring(0, 1).toUpperCase();
getterName += temp.substring(1).toLowerCase();
break;
}
getterName += temp.substring(0, 1).toUpperCase();
getterName += temp.substring(1, index).toLowerCase();
temp = temp.substring(index + 1);
}
return getterName;
}
/**
* データを変換する.
*
* @param data データ
* @return 変換後データ
*/
private Object convertData(Object data) {
if (data instanceof String) {
String dataStr = ((String) data).trim();
if ("true".equalsIgnoreCase(dataStr)) {
return Boolean.TRUE;
} else if ("false".equalsIgnoreCase(dataStr)) {
return Boolean.FALSE;
}
return dataStr;
} else if (data instanceof BigDecimal) {
return new Integer(((BigDecimal) data).intValue());
} else {
return data;
}
}
}
========================----sample package dbunit_sample;
import org.dbunit.dataset.ITable;
/**
* SampleDaoImplクラスのテスト.
*/
public class SampleDaoImplTest extends DaoBaseTestCase {
private static final String TABLE_NAME = TABLE_NAME_ALL[1];
private SampleDao sampleDao;
public static void main(String[] args) {
junit.textui.TestRunner.run(SampleDaoImplTest.class);
}
public SampleDaoImplTest(String arg0) {
super(arg0);
}
protected void setUp() throws Exception {
super.setUp();
this.sampleDao = new SampleDaoImpl(getConnection().getConnection());
}
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* getDataメソッドの動作確認.
* データが取得されていることを確認する。
* @throws Exception
*
*/
public void testGetData() throws Exception {
assertEquals(getExpectedTable("1"), sampleDao.getData());
}
/**
* Insertメソッドの動作確認.
* データが登録されていることを確認する。
*
*/
public void testInsert() {
try {
Syohin syohin = new Syohin();
syohin.setId("5");
syohin.setName("syohin5");
syohin.setPrice(new Integer(5000));
// ロジックの実行
sampleDao.insert(syohin);
assertEquals(5, getTableRowCount(TABLE_NAME));
// 期待値とデータの比較
assertEquals(getExpectedTable("1"), getActualTable(TABLE_NAME));
} catch (Throwable e) {
fail(e.getMessage());
}
}
/**
* テストデータExcelファイルの名前を取得する.
*
* @return テストデータExcelファイル名称
*/
protected String getTestFileName() {
return "TestSampleDaoImpl_prepare.xls";
}
/**
* 期待値データを取得する.
*
* @param index インデックス番号
* @return 期待値データ
* @throws Exception 期待値データの取得中にエラーが発生した
*/
protected ITable getExpectedTable(String index) throws Exception {
return getExpectedTable(TABLE_NAME_ALL[1] + index,
"TestSampleDaoImpl_expected.xls");
}
/**
* サブクラスの実行時クラスを取得する.
*
* @return 実行時クラス
*/
protected Class getSubClass() {
return this.getClass();
}
}
事前処理の元データを退避し、テストデータを投入する機能や事後処理の元データを復元する機能、またはデータベースに登録されているデータを取得する機能などを、あらかじめ基底クラスに用意しておけば、基底クラスを継承して作成する各テストクラス作業が大変楽になります。
getConnectionは、DBコネクションを取得するメソッドです。getActualTableは、データベースに登録されているデータを取得するメソッドとなります。
getExpectedTableは、テスト結果として期待されるデータを取得するメソッドです。getTableRowCountは、データベースに登録されているデータ件数を取得するメソッドとなります。
assertTableは、期待値とデータベースに登録されているデータの比較をするメソッドです。isSkipColumnは、assertTableメソッド実行時に、比較をスキップするカラム名を指定するメソッドとなります。
assertEntityは、期待値とEntityデータの比較をするメソッドです。getTestFileNameは、テストデータExcelファイルの名前を取得するメソッドとなります。
getExpectedTableは、期待値データを取得するメソッドです。getSubClassは、サブクラスの実行時クラスを取得するメソッドとなります。
テストケース作成手順
①まず、テストクラスには基底クラスのDaoBaseTestCaseを継承させます(リスト1)。
②次に、DaoBaseTestCaseで宣言されている抽象メソッド「getTestFileName」「getTestFileName」「getSubClass」を実装します(リスト2)。
getTestFileNameは、テストデータExcelファイルの名称を指定します。getExpectedTableは、テスト結果として期待されるデータを取得します。getSubClassは、自分自身の実行時クラスを指定します。
登録(更新)系のテストで、期待値とデータベースに登録されているデータの比較をする際、期待値を予測できないカラム(例:「更新日時」など現在日時が設定されるカラム)が存在する場合は、DaoBaseTestCaseクラスのisSkipColumnメソッドをオーバーライドし、比較しない(スキップする)カラムを指定します(リスト3)。
スキップするカラムが存在しない場合、isSkipColumnメソッドはオーバーライドする必要はありません。
最後にテストアセットを作成し、テストコードを記述します。
登録(更新)系は、登録(更新)後のテーブルの値とExcelシートのデータを比較します(リスト4)。検索系は検索結果が正しいかどうかをEntityとExcelシートで比較します(リスト5)。
package dbunit_sample;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.Date;
import junit.framework.TestCase;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.Column;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.ReplacementDataSet;
import org.dbunit.dataset.excel.XlsDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
/**
* DAOテストの基底クラス.
*/
public abstract class DaoBaseTestCase extends TestCase {
/**
* 全テーブル名.
*/
protected static final String[] TABLE_NAME_ALL;
/**
* テーブル数.
*/
private static final int TABLE_SIZE = 1;
/**
* テーブル名.
*/
private static final String TABLE_NAME = "syohin";
/**
* 元データ退避用一時ファイル.
*/
private File file;
/**
* データベースコネクション.
*/
private IDatabaseConnection connection;
/**
* テーブル名を取得する.
*/
static {
TABLE_NAME_ALL = new String[TABLE_SIZE];
for (int i = 0; i < TABLE_NAME_ALL.length; i++) {
String tableName = TABLE_NAME + (i + 1);
if (null == tableName) {
break;
}
TABLE_NAME_ALL[i] = tableName;
}
}
/**
* コンストラクタ.
*
* @param arg0 パラメータ
*/
public DaoBaseTestCase(String arg0) {
super(arg0);
}
/**
* 事前処理.
* 元データを退避し、テストデータを投入する。
*
* @throws Exception 事前処理中にエラーが発生した
*/
protected void setUp() throws Exception {
super.setUp();
try {
connection = this.getConnection();
QueryDataSet queryDataSet = new QueryDataSet(connection);
for (int i = 0; i < TABLE_NAME_ALL.length; i++) {
queryDataSet.addTable(TABLE_NAME_ALL[i]);
}
this.file = File.createTempFile("tmp", ".xml");
FlatXmlDataSet.write(queryDataSet, new FileOutputStream(this.file));
DatabaseOperation.CLEAN_INSERT.execute(connection, this
.getDataSet(getTestFileName()));
} catch (Exception e) {
if (connection != null) {
connection.close();
}
throw e;
}
}
/**
* 事後処理.
* 元データを復元する。
*
* @throws Exception 事後処理中にエラーが発生した
*/
protected void tearDown() throws Exception {
super.tearDown();
try {
DatabaseOperation.CLEAN_INSERT.execute(connection,
new FlatXmlDataSet(this.file));
} catch (Exception e) {
throw e;
} finally {
if (connection != null) {
connection.close();
}
}
}
/**
* DBコネクションを取得する.
*
* @return DBコネクション
*/
protected IDatabaseConnection getConnection() {
return ConnectionManager.getConnection();
}
/**
* データベースに登録されているデータを取得する.
*
* @param tableName テーブル名
* @return データベースに登録されているデータ
* @throws SQLException データベースに登録されているデータの
* 取得中にエラーが発生した
*/
protected ITable getActualTable(String tableName) throws Exception {
IDatabaseConnection connection = null;
try {
connection = getConnection();
return connection.createDataSet().getTable(tableName);
} catch (Exception e) {
throw e;
} finally {
if (connection != null) {
connection.close();
}
}
}
/**
* テスト結果として期待されるデータを取得する.
*
* @param tableName テーブル名
* @param fileName テストファイル名
* @return テスト結果として期待されるデータ
* @throws Exception データの取得中にエラーが発生した
*/
protected ITable getExpectedTable(String tableName, String fileName)
throws Exception {
return this.getDataSet(fileName).getTable(tableName);
}
/**
* データベースに登録されているデータ件数を取得する.
*
* @param tableName テーブル名
* @return データ件数
* @throws Exception データ件数の取得中にエラーが発生した
*/
protected int getTableRowCount(String tableName) throws Exception {
IDatabaseConnection connection = null;
try {
connection = getConnection();
return connection.createDataSet().getTable(tableName).getRowCount();
} finally {
if (connection != null) {
connection.close();
}
}
}
/**
* 期待値とデータベースに登録されているデータの比較をする.
*
* @param expectedTable 期待値データ
* @param actualTable データベースに登録されているデータ
* @throws DataSetException データの比較中にエラーが発生した
*/
protected void assertEquals(ITable expectedTable, ITable actualTable)
throws DataSetException {
for (int i = 0; i < expectedTable.getRowCount(); i++) {
for (int j = 0; j < expectedTable.getTableMetaData().getColumns().length; j++) {
Column[] columns = expectedTable.getTableMetaData()
.getColumns();
String columnName = columns[j].getColumnName();
if (this.isSkipColumn(columnName)) {
continue;
}
assertEquals("Line:" + (i + 1) + " Column:" + columnName,
convertData(expectedTable.getValue(i, columnName)),
convertData(actualTable.getValue(i, columnName)));
}
}
}
/**
* assertTableメソッド実行時、比較をスキップするカラム名を指定する.
*
* @param columnName カラム名
* @return true:スキップ、false:スキップなし
*
*/
protected boolean isSkipColumn(String columnName) {
return false;
}
/**
* 期待値とEntityデータの比較をする.
*
* @param expectedTable 期待値データ
* @param actuals 実際のデータ
* @throws Exception 期待値とEntityデータの比較中にエラーが発生した
*/
protected void assertEquals(ITable expectedTable, Object actuals)
throws Exception {
this.assertEquals(expectedTable, new Object[] { actuals });
}
/**
* 期待値とEntityデータの比較をする.
*
* @param expectedTable 期待値データ
* @param actuals 実際のデータ
* @throws Exception 期待値とEntityデータの比較中にエラーが発生した
*/
protected void assertEquals(ITable expectedTable, Object[] actuals)
throws Exception {
for (int i = 0; i < expectedTable.getRowCount(); i++) {
for (int j = 0; j < expectedTable.getTableMetaData().getColumns().length; j++) {
Column[] columns = expectedTable.getTableMetaData()
.getColumns();
String columnName = columns[j].getColumnName();
String getterName = this.buildGetterName(columnName);
Object actual = actuals[i];
Class[] paramClass = new Class[0];
Object[] paramValue = new Object[0];
Method method = actual.getClass().getDeclaredMethod(getterName,
paramClass);
assertEquals("Line:" + (i + 1) + " Column:" + columnName,
String.valueOf(expectedTable.getValue(i, columnName))
.trim(), String.valueOf(
method.invoke(actual, paramValue)).trim());
}
}
}
/**
* テストデータExcelファイルの名前を取得する.
*
* @return テストデータExcelファイル名称
*/
protected abstract String getTestFileName();
/**
* 期待値データを取得する.
*
* @param index インデックス番号
* @return 期待値データ
* @throws Exception 期待値データの取得中にエラーが発生した
*/
protected abstract ITable getExpectedTable(String index) throws Exception;
/**
* サブクラスの実行時クラスを取得する.
*
* @return 実行時クラス
*/
protected abstract Class getSubClass();
/**
* ファイル名を指定してデータセットを取得する.
*
* @param fileName ファイル名
* @return データセット
* @throws Exception データセットの取得中にエラーが発生した
*/
private IDataSet getDataSet(String fileName) throws Exception {
ReplacementDataSet expectedDataSet = new ReplacementDataSet(
new XlsDataSet(getSubClass().getResourceAsStream(fileName)));
expectedDataSet.addReplacementObject("[SYSDATE]", new Date(System
.currentTimeMillis()));
expectedDataSet.addReplacementObject("[NULL]", null);
return expectedDataSet;
}
/**
* カラム名を指定してgetterメソッド名を取得する.
*
* @param columnName カラム名
* @return getterメソッド名
*/
private String buildGetterName(String columnName) {
String getterName = "get";
String temp = columnName;
while (true) {
int index = temp.indexOf("_");
if (index == -1) {
getterName += temp.substring(0, 1).toUpperCase();
getterName += temp.substring(1).toLowerCase();
break;
}
getterName += temp.substring(0, 1).toUpperCase();
getterName += temp.substring(1, index).toLowerCase();
temp = temp.substring(index + 1);
}
return getterName;
}
/**
* データを変換する.
*
* @param data データ
* @return 変換後データ
*/
private Object convertData(Object data) {
if (data instanceof String) {
String dataStr = ((String) data).trim();
if ("true".equalsIgnoreCase(dataStr)) {
return Boolean.TRUE;
} else if ("false".equalsIgnoreCase(dataStr)) {
return Boolean.FALSE;
}
return dataStr;
} else if (data instanceof BigDecimal) {
return new Integer(((BigDecimal) data).intValue());
} else {
return data;
}
}
}
========================----sample package dbunit_sample;
import org.dbunit.dataset.ITable;
/**
* SampleDaoImplクラスのテスト.
*/
public class SampleDaoImplTest extends DaoBaseTestCase {
private static final String TABLE_NAME = TABLE_NAME_ALL[1];
private SampleDao sampleDao;
public static void main(String[] args) {
junit.textui.TestRunner.run(SampleDaoImplTest.class);
}
public SampleDaoImplTest(String arg0) {
super(arg0);
}
protected void setUp() throws Exception {
super.setUp();
this.sampleDao = new SampleDaoImpl(getConnection().getConnection());
}
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* getDataメソッドの動作確認.
* データが取得されていることを確認する。
* @throws Exception
*
*/
public void testGetData() throws Exception {
assertEquals(getExpectedTable("1"), sampleDao.getData());
}
/**
* Insertメソッドの動作確認.
* データが登録されていることを確認する。
*
*/
public void testInsert() {
try {
Syohin syohin = new Syohin();
syohin.setId("5");
syohin.setName("syohin5");
syohin.setPrice(new Integer(5000));
// ロジックの実行
sampleDao.insert(syohin);
assertEquals(5, getTableRowCount(TABLE_NAME));
// 期待値とデータの比較
assertEquals(getExpectedTable("1"), getActualTable(TABLE_NAME));
} catch (Throwable e) {
fail(e.getMessage());
}
}
/**
* テストデータExcelファイルの名前を取得する.
*
* @return テストデータExcelファイル名称
*/
protected String getTestFileName() {
return "TestSampleDaoImpl_prepare.xls";
}
/**
* 期待値データを取得する.
*
* @param index インデックス番号
* @return 期待値データ
* @throws Exception 期待値データの取得中にエラーが発生した
*/
protected ITable getExpectedTable(String index) throws Exception {
return getExpectedTable(TABLE_NAME_ALL[1] + index,
"TestSampleDaoImpl_expected.xls");
}
/**
* サブクラスの実行時クラスを取得する.
*
* @return 実行時クラス
*/
protected Class getSubClass() {
return this.getClass();
}
}
JUnit DBUnit - 2
データはXML形式
テスト対象ソース AcceptOrderBean.java
import java.sql.*;
import java.util.ArrayList;
public class AcceptOrderBean {
private String o_num;
private String c_num;
private String p_num;
private int dc_rate;
private int option_price;
private String employee;
private Date accept_date;
public String getO_num() {
return o_num;
}
public String getC_num() {
return c_num;
}
public String getP_num() {
return p_num;
}
public int getDc_rate() {
return dc_rate;
}
public int getOption_price() {
return option_price;
}
public String getEmployee() {
return employee;
}
public Date getAccept_date() {
return accept_date;
}
public void setO_num(String o_num) {
this.o_num = o_num;
}
public void setC_num(String c_num) {
this.c_num = c_num;
}
public void setP_num(String p_num) {
this.p_num = p_num;
}
public void setDc_rate(int dc_rate) {
this.dc_rate = dc_rate;
}
public void setOption_price(int option_price) {
this.option_price = option_price;
}
public void setEmployee(String employee) {
this.employee = employee;
}
public void setAccept_date(Date date) {
this.accept_date = date;
}
private static Connection getConnection() throws Exception {
Class.forName(""com.mysql.jdbc.Driver"");
Connection connection = null;
// connection = DriverManager.getConnection(
// ""jdbc:mysql://localhost:3306/dbunit"", ""root"", """");
connection = DriverManager.getConnection(
""jdbc:mysql:///dbunit?useUnicode=true&charcterEncoding=UTF-8"",
""root"", """");
connection.setAutoCommit(false);
return connection;
}
public void loadByO_num(String o_num) throws Exception {
Connection connection = null;
try {
connection = getConnection();
connection.setAutoCommit(true);
String sql = ""select * from Accept_Order where o_num=?"";
PreparedStatement stat = connection.prepareStatement(sql);
stat.setString(1, o_num);
ResultSet result = stat.executeQuery();
if (result.next()) {
this.o_num = o_num;
this.c_num = result.getString(""c_num"");
this.p_num = result.getString(""p_num"");
this.dc_rate = result.getInt(""dc_rate"");
this.option_price = result.getInt(""option_price"");
this.employee = result.getString(""employee"");
this.accept_date = result.getDate(""accept_date"");
}
} finally {
if (connection != null)
connection.close();
}
}
public static AcceptOrderBean[] findByEmployee(String employee)
throws Exception {
Connection connection = null;
try {
connection = getConnection();
String sql = ""select * from Accept_Order where employee=?"";
PreparedStatement stat = connection.prepareStatement(sql);
stat.setString(1, employee);
ResultSet result = stat.executeQuery();
ArrayList list = new ArrayList();
while (result.next()) {
AcceptOrderBean accept = new AcceptOrderBean();
accept.o_num = result.getString(""o_num"");
accept.c_num = result.getString(""c_num"");
accept.p_num = result.getString(""p_num"");
accept.dc_rate = result.getInt(""dc_rate"");
accept.option_price = result.getInt(""option_price"");
accept.employee = result.getString(""employee"");
accept.accept_date = result.getDate(""accept_date"");
list.add(accept);
}
return (AcceptOrderBean[]) list.toArray(new AcceptOrderBean[list
.size()]);
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
}
}
}
public void store() throws Exception {
Connection connection = null;
try {
connection = getConnection();
String sql = ""insert into Accept_Order values(?,?,?,?,?,?,?)"";
PreparedStatement stat = connection.prepareStatement(sql);
stat.setString(1, this.o_num);
stat.setString(2, this.c_num);
stat.setString(3, this.p_num);
stat.setInt(4, this.dc_rate);
stat.setInt(5, this.option_price);
stat.setString(6, this.employee);
stat.setDate(7, this.accept_date);
stat.executeUpdate();
connection.commit();
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
}
}
}
public void delete() throws Exception {
Connection connection = null;
try {
connection = getConnection();
String sql = ""delete from Accept_Order where o_num=?"";
PreparedStatement stat = connection.prepareStatement(sql);
stat.setString(1, this.o_num);
stat.executeUpdate();
connection.commit();
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
}
}
}
}
テストケース AcceptOrderBeanTest.java
import static org.junit.Assert.*;
import org.dbunit.Assertion;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Date;
import java.sql.DriverManager;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class AcceptOrderBeanTest extends AcceptOrderBean {
private File file;
private static Connection getConnection() throws Exception {
Class.forName(""com.mysql.jdbc.Driver"");
Connection connection = null;
// connection = DriverManager.getConnection(
// ""jdbc:mysql://localhost:3306/dbunit"", ""root"", """");
connection = DriverManager.getConnection(
""jdbc:mysql:///dbunit?useUnicode=true&charcterEncoding=UTF-8"",
""root"", """");
// テストソースではコミット宣言はデフォルトのままでよい。
// connection.setAutoCommit(false);
return connection;
}
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@SuppressWarnings(""deprecation"")
@Before
public void setUp() throws Exception {
IDatabaseConnection connection = null;
try {
Connection conn = getConnection();
connection = new DatabaseConnection(conn);
// 現状のバックアップを取得
QueryDataSet partialDataSet = new QueryDataSet(connection);
partialDataSet.addTable(""ACCEPT_ORDER"");
file = File.createTempFile(""accept"", "".xml"");
FlatXmlDataSet.write(partialDataSet, new FileOutputStream(file));
// テストデータを投入する
IDataSet dataSet = new FlatXmlDataSet(new FileInputStream(
""C:/pleiades/workspace/dbtest/src/accept_order_data.xml""));
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (connection != null)
connection.close();
} catch (SQLException e) {
}
}
}
@SuppressWarnings(""deprecation"")
@After
public void tearDown() throws Exception {
IDatabaseConnection connection = null;
try {
Connection conn = getConnection();
connection = new DatabaseConnection(conn);
IDataSet dataSet = new FlatXmlDataSet(file);
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (connection != null)
connection.close();
} catch (SQLException e) {
}
}
}
@Test
public void testLoadByO_num() throws Exception {
// loadByO_numメソッドを実行
AcceptOrderBean order = new AcceptOrderBean();
order.loadByO_num(""5001"");
// 実行結果を確認
// 取得したAcceptOrderBeanの配列は「文字列」で比較する。
assertEquals(""accept_date=2004-01-01"",
""accept_date="" + order.getAccept_date());
assertEquals(""c_num=1000"", ""c_num="" + order.getC_num());
assertEquals(""dc_rate=5"", ""dc_rate="" + order.getDc_rate());
assertEquals(""employee=101"", ""employee="" + order.getEmployee());
assertEquals(""o_num=5001"", ""o_num="" + order.getO_num());
assertEquals(""option_price=30"",
""option_price="" + order.getOption_price());
assertEquals(""p_num=501"", ""p_num="" + order.getP_num());
}
@SuppressWarnings(""deprecation"")
@Test
public void testDelete() throws Exception {
// deleteメソッドを実行
AcceptOrderBean order = new AcceptOrderBean();
order.setO_num(""5003"");
order.delete();
// 実行結果を確認
IDatabaseConnection connection = null;
try {
// accept_orderテーブルの状態を確認
Connection conn = getConnection();
connection = new DatabaseConnection(conn);
IDataSet databaseDataSet = connection.createDataSet();
ITable actualTable = databaseDataSet.getTable(""accept_order"");
// あるべき姿を確認
IDataSet expectedDataSet = new FlatXmlDataSet(new FileInputStream(
""C:/pleiades/workspace/dbtest/src/accept_order_data3.xml""));
ITable expectedTable = expectedDataSet.getTable(""accept_order"");
// 比較する
Assertion.assertEquals(expectedTable, actualTable);
} finally {
if (connection != null)
connection.close();
}
}
@SuppressWarnings(""deprecation"")
@Test
public void testStore() throws Exception {
// storeメソッドの実行
AcceptOrderBean order = new AcceptOrderBean();
order.setO_num(""5004"");
order.setC_num(""1004"");
order.setP_num(""501"");
order.setDc_rate(20);
order.setOption_price(400);
order.setEmployee(""101"");
order.setAccept_date(Date.valueOf(""2004-01-03""));
order.store();
// 実行結果を検証する
IDatabaseConnection connection = null;
try {
// accept_orderテーブルの状態を確認
Connection conn = getConnection();
connection = new DatabaseConnection(conn);
IDataSet databaseDataSet = connection.createDataSet();
ITable actualTable = databaseDataSet.getTable(""accept_order"");
// 期待されるデータを取得
IDataSet expectedDataSet = new FlatXmlDataSet(new FileInputStream(
""C:/pleiades/workspace/dbtest/src/accept_order_data2.xml""));
ITable expectedTable = expectedDataSet.getTable(""accept_order"");
// 比較する
Assertion.assertEquals(expectedTable, actualTable);
} finally {
if (connection != null)
connection.close();
}
}
// @Test
public final void test() {
}
}
データ
テスト対象ソース AcceptOrderBean.java
import java.sql.*;
import java.util.ArrayList;
public class AcceptOrderBean {
private String o_num;
private String c_num;
private String p_num;
private int dc_rate;
private int option_price;
private String employee;
private Date accept_date;
public String getO_num() {
return o_num;
}
public String getC_num() {
return c_num;
}
public String getP_num() {
return p_num;
}
public int getDc_rate() {
return dc_rate;
}
public int getOption_price() {
return option_price;
}
public String getEmployee() {
return employee;
}
public Date getAccept_date() {
return accept_date;
}
public void setO_num(String o_num) {
this.o_num = o_num;
}
public void setC_num(String c_num) {
this.c_num = c_num;
}
public void setP_num(String p_num) {
this.p_num = p_num;
}
public void setDc_rate(int dc_rate) {
this.dc_rate = dc_rate;
}
public void setOption_price(int option_price) {
this.option_price = option_price;
}
public void setEmployee(String employee) {
this.employee = employee;
}
public void setAccept_date(Date date) {
this.accept_date = date;
}
private static Connection getConnection() throws Exception {
Class.forName(""com.mysql.jdbc.Driver"");
Connection connection = null;
// connection = DriverManager.getConnection(
// ""jdbc:mysql://localhost:3306/dbunit"", ""root"", """");
connection = DriverManager.getConnection(
""jdbc:mysql:///dbunit?useUnicode=true&charcterEncoding=UTF-8"",
""root"", """");
connection.setAutoCommit(false);
return connection;
}
public void loadByO_num(String o_num) throws Exception {
Connection connection = null;
try {
connection = getConnection();
connection.setAutoCommit(true);
String sql = ""select * from Accept_Order where o_num=?"";
PreparedStatement stat = connection.prepareStatement(sql);
stat.setString(1, o_num);
ResultSet result = stat.executeQuery();
if (result.next()) {
this.o_num = o_num;
this.c_num = result.getString(""c_num"");
this.p_num = result.getString(""p_num"");
this.dc_rate = result.getInt(""dc_rate"");
this.option_price = result.getInt(""option_price"");
this.employee = result.getString(""employee"");
this.accept_date = result.getDate(""accept_date"");
}
} finally {
if (connection != null)
connection.close();
}
}
public static AcceptOrderBean[] findByEmployee(String employee)
throws Exception {
Connection connection = null;
try {
connection = getConnection();
String sql = ""select * from Accept_Order where employee=?"";
PreparedStatement stat = connection.prepareStatement(sql);
stat.setString(1, employee);
ResultSet result = stat.executeQuery();
ArrayList
while (result.next()) {
AcceptOrderBean accept = new AcceptOrderBean();
accept.o_num = result.getString(""o_num"");
accept.c_num = result.getString(""c_num"");
accept.p_num = result.getString(""p_num"");
accept.dc_rate = result.getInt(""dc_rate"");
accept.option_price = result.getInt(""option_price"");
accept.employee = result.getString(""employee"");
accept.accept_date = result.getDate(""accept_date"");
list.add(accept);
}
return (AcceptOrderBean[]) list.toArray(new AcceptOrderBean[list
.size()]);
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
}
}
}
public void store() throws Exception {
Connection connection = null;
try {
connection = getConnection();
String sql = ""insert into Accept_Order values(?,?,?,?,?,?,?)"";
PreparedStatement stat = connection.prepareStatement(sql);
stat.setString(1, this.o_num);
stat.setString(2, this.c_num);
stat.setString(3, this.p_num);
stat.setInt(4, this.dc_rate);
stat.setInt(5, this.option_price);
stat.setString(6, this.employee);
stat.setDate(7, this.accept_date);
stat.executeUpdate();
connection.commit();
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
}
}
}
public void delete() throws Exception {
Connection connection = null;
try {
connection = getConnection();
String sql = ""delete from Accept_Order where o_num=?"";
PreparedStatement stat = connection.prepareStatement(sql);
stat.setString(1, this.o_num);
stat.executeUpdate();
connection.commit();
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
}
}
}
}
テストケース AcceptOrderBeanTest.java
import static org.junit.Assert.*;
import org.dbunit.Assertion;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Date;
import java.sql.DriverManager;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class AcceptOrderBeanTest extends AcceptOrderBean {
private File file;
private static Connection getConnection() throws Exception {
Class.forName(""com.mysql.jdbc.Driver"");
Connection connection = null;
// connection = DriverManager.getConnection(
// ""jdbc:mysql://localhost:3306/dbunit"", ""root"", """");
connection = DriverManager.getConnection(
""jdbc:mysql:///dbunit?useUnicode=true&charcterEncoding=UTF-8"",
""root"", """");
// テストソースではコミット宣言はデフォルトのままでよい。
// connection.setAutoCommit(false);
return connection;
}
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@SuppressWarnings(""deprecation"")
@Before
public void setUp() throws Exception {
IDatabaseConnection connection = null;
try {
Connection conn = getConnection();
connection = new DatabaseConnection(conn);
// 現状のバックアップを取得
QueryDataSet partialDataSet = new QueryDataSet(connection);
partialDataSet.addTable(""ACCEPT_ORDER"");
file = File.createTempFile(""accept"", "".xml"");
FlatXmlDataSet.write(partialDataSet, new FileOutputStream(file));
// テストデータを投入する
IDataSet dataSet = new FlatXmlDataSet(new FileInputStream(
""C:/pleiades/workspace/dbtest/src/accept_order_data.xml""));
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (connection != null)
connection.close();
} catch (SQLException e) {
}
}
}
@SuppressWarnings(""deprecation"")
@After
public void tearDown() throws Exception {
IDatabaseConnection connection = null;
try {
Connection conn = getConnection();
connection = new DatabaseConnection(conn);
IDataSet dataSet = new FlatXmlDataSet(file);
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (connection != null)
connection.close();
} catch (SQLException e) {
}
}
}
@Test
public void testLoadByO_num() throws Exception {
// loadByO_numメソッドを実行
AcceptOrderBean order = new AcceptOrderBean();
order.loadByO_num(""5001"");
// 実行結果を確認
// 取得したAcceptOrderBeanの配列は「文字列」で比較する。
assertEquals(""accept_date=2004-01-01"",
""accept_date="" + order.getAccept_date());
assertEquals(""c_num=1000"", ""c_num="" + order.getC_num());
assertEquals(""dc_rate=5"", ""dc_rate="" + order.getDc_rate());
assertEquals(""employee=101"", ""employee="" + order.getEmployee());
assertEquals(""o_num=5001"", ""o_num="" + order.getO_num());
assertEquals(""option_price=30"",
""option_price="" + order.getOption_price());
assertEquals(""p_num=501"", ""p_num="" + order.getP_num());
}
@SuppressWarnings(""deprecation"")
@Test
public void testDelete() throws Exception {
// deleteメソッドを実行
AcceptOrderBean order = new AcceptOrderBean();
order.setO_num(""5003"");
order.delete();
// 実行結果を確認
IDatabaseConnection connection = null;
try {
// accept_orderテーブルの状態を確認
Connection conn = getConnection();
connection = new DatabaseConnection(conn);
IDataSet databaseDataSet = connection.createDataSet();
ITable actualTable = databaseDataSet.getTable(""accept_order"");
// あるべき姿を確認
IDataSet expectedDataSet = new FlatXmlDataSet(new FileInputStream(
""C:/pleiades/workspace/dbtest/src/accept_order_data3.xml""));
ITable expectedTable = expectedDataSet.getTable(""accept_order"");
// 比較する
Assertion.assertEquals(expectedTable, actualTable);
} finally {
if (connection != null)
connection.close();
}
}
@SuppressWarnings(""deprecation"")
@Test
public void testStore() throws Exception {
// storeメソッドの実行
AcceptOrderBean order = new AcceptOrderBean();
order.setO_num(""5004"");
order.setC_num(""1004"");
order.setP_num(""501"");
order.setDc_rate(20);
order.setOption_price(400);
order.setEmployee(""101"");
order.setAccept_date(Date.valueOf(""2004-01-03""));
order.store();
// 実行結果を検証する
IDatabaseConnection connection = null;
try {
// accept_orderテーブルの状態を確認
Connection conn = getConnection();
connection = new DatabaseConnection(conn);
IDataSet databaseDataSet = connection.createDataSet();
ITable actualTable = databaseDataSet.getTable(""accept_order"");
// 期待されるデータを取得
IDataSet expectedDataSet = new FlatXmlDataSet(new FileInputStream(
""C:/pleiades/workspace/dbtest/src/accept_order_data2.xml""));
ITable expectedTable = expectedDataSet.getTable(""accept_order"");
// 比較する
Assertion.assertEquals(expectedTable, actualTable);
} finally {
if (connection != null)
connection.close();
}
}
// @Test
public final void test() {
}
}
データ
<?xml version='1.0' encoding="UTF-8"?>
<dataset>
<ACCEPT_ORDER o_num="5001" c_num="1000" p_num="501" dc_rate="5"
option_price="30" employee="101" accept_date="2004-01-01" />
<ACCEPT_ORDER o_num="5002" c_num="1001" p_num="502" dc_rate="10"
option_price="20" employee="104"
accept_date="2004-02-02" />
<ACCEPT_ORDER o_num="5003" c_num="1002" p_num="503" dc_rate="15"
option_price="10" employee="101" accept_date="2004-01-31" />
</dataset>
<?xml version='1.0' encoding="UTF-8"?>
<dataset>
<ACCEPT_ORDER o_num="5001" c_num="1000" p_num="501" dc_rate="5"
option_price="30" employee="101" accept_date="2004-01-01" />
<ACCEPT_ORDER o_num="5002" c_num="1001" p_num="502" dc_rate="10"
option_price="20" employee="104"
accept_date="2004-02-02" />
<ACCEPT_ORDER o_num="5003" c_num="1002" p_num="503" dc_rate="15"
option_price="10" employee="101" accept_date="2004-01-31" />
<ACCEPT_ORDER o_num="5004" c_num="1004" p_num="501" dc_rate="20"
option_price="400" employee="101" accept_date="2004-01-03" />
</dataset>
<?xml version='1.0' encoding="UTF-8"?> <dataset> <ACCEPT_ORDER o_num="5001" c_num="1000" p_num="501" dc_rate="5" option_price="30" employee="101" accept_date="2004-01-01" /> <ACCEPT_ORDER o_num="5002" c_num="1001" p_num="502" dc_rate="10" option_price="20" employee="104" accept_date="2004-02-02" /> </dataset>
JUnit DBUnit - 1
◆必要なライブラリ
dbunit-2.4.9.jar
junit-4.10.jar
log4j-1.2.15.jar
slf4j-api-1.7.5.jar
slf4j-ext-1.7.5.jar
slf4j-log4j12-1.7.5.jar
slf4j-migrator-1.7.5.jar
◆ロギングがないとエラーが発生します。
「java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory」
◆LOG4Jのダウンロード先
http://logging.apache.org/log4j/1.2/
dbunit-2.4.9.jar
junit-4.10.jar
log4j-1.2.15.jar
slf4j-api-1.7.5.jar
slf4j-ext-1.7.5.jar
slf4j-log4j12-1.7.5.jar
slf4j-migrator-1.7.5.jar
◆ロギングがないとエラーが発生します。
「java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory」
◆LOG4Jのダウンロード先
http://logging.apache.org/log4j/1.2/
2013年5月24日金曜日
ファイルシステムとディレクトリ
■ファイルシステムの基礎
通常OSを操作する上において、データを操作するということはファイルを操作することとほぼ同等の意味と解釈されます。
このため通常はデータが物理的にどのように格納されているかを意識する必要もなく、逆に意識できない作りになっています。
これはOSの機能であるデータの抽象化によってもたらされる結果です。
実際に物理的な記憶装置に格納されているデータを素で扱おうとすると、HDDのどこのセクタのどの部分とどの部分を取り出して、データをメモリ上に読み込み、メモリに格納できないものは後からまた読む・・・といった大変面倒なことをする必要があります。
現在のHDDの容量を考えてみると、テラ単位・・・という巨大なデータを格納できるような物体です。その中に入っている何かのデータを自力で探しだし、利用することは人間が行う作業として成立しないものだともいえます。このような物体に存在するデータを人間にわかりやすいファイルというものに抽象化、可視化し、データを永続的に管理しやすくするという役目を持つのがファイルシステムの基本的な考え方です。
ファイルシステムにはほかにもキャッシュメモリを利用して効果的にHDDなどの二次記憶装置を使うという機能も含まれており、Linuxではこの機能によって大きなファイルでも高速にアクセスすることが可能になっています。このようにファイルシステムは単にデータを扱いやすく管理するだけではなくH/Wリソースを効率よく利用するための機能も含まれています。
■VFS(Virtual File System)
Linuxでは全てをファイルとして扱うようになっています。これは通常のデータファイルだけではなく、HDD、CD-ROM、マウスなど様々なデバイスもファイルとして扱う仕組みになっています。
この仕組みを提供するのがVFSという仮想的なファイルシステムです。VFSは下位の物理的な媒体を抽象化し、データ、デバイスを含む全てのコンピュータリソースに対して統一的なファイルアクセスという入出力インターフェイスを提供します。これによりリソースの差異を気にすることなく、様々な対象に対して統一のアクセスを行うことができます。
さらにVFSにはファイルシステムの抽象化という役割もあり、これによってことなる複数のファイルシステムに対して透過的にアクセスすることが可能になっており、ファイルシステムの種類を意識せずに利用することができます。VFSは、プログラムからのファイルシステムの操作を固有のファイルシステムの操作に変換します。このためユーザが実行するプログラムはファイルシステムの差異を意識する必要がなく、統一的なアクセス方法で実際にはことなるファイルシステムにアクセスできます。
■マウント
通常LinuxではHDDを複数のパーティションに分割して、それぞれにファイルシステムを作成します。そして各ファイルシステムをディレクトリツリーの/(ルート)以下にマウントすることで利用できるようにしますが、このマウントという考え方は重要でファイルシステムを利用するときには必ず行わなければならない操作でもあります。
Linuxのファイルシステムはツリー構造になっていますがこの構造を木の根にたとえると、その木の根に接ぎ木をする行為がマウントになります。つまりOSから対象となるH/WをS/W的に接続する行為がマウントになります。
例えばHDDを物理的に追加したことを想定してみます。
基本的にLinuxではストレージのH/Wが認識されても、それだけではファイルシステムとして利用することができません。つまりファイルを保存したりするなどの行為ができないのです。Linux上ではH/Wの認識とファイルシステムとして利用可能であるかは別の問題であり、ファイルシステムとして利用可能にするためには任意であれ、自動であれマウントすることが必要不可欠です。
※最近ではデスクトップ環境などに自動マウント機能を活用する仕組みが導入されているので、USBメモリなどのストレージも挿せば認識、マウントが自動的に行われるためあまり意識はしなくなっているかもしれません。
このため手順としては以下のようなフローでHDDを追加することになります。
・HDDの物理フォーマット、パーティションを切るなどの作業
・各パーティションにファイルシステムを構築し、フォーマットする
・マウントポイントを指定し、ディレクトリツリーのどこかにマウントを行う
マウントできるデバイスターゲットはブロックデバイスといわれる、HDD、CD-ROMなどのストレージと呼ばれるディスクドライブです。またマウントしたデバイスの物理的接続解除を行うためには、アンマウントというS/W的接続解除の手続きを行って、物理的接続解除を行う必要があります。アンマウントを行わずに強引に物理的に接続解除をするとデータを破損する危険があります。
このようにLinuxにはWindowsなどとは異なるファイルシステムの概念があり、このシステムによってデータを効率よく管理することができるようになっています。OSの基本操作であるファイル操作は頻度の高い操作系ですが、OSごとのファイル管理の概念に沿って操作が行われます。このため通常は意識しないような仕組みの部分を知ることによって、ファイル操作の考え方をより深く理解することができます。
備考:ディレクトリ
ファイル以外のデータ管理の単位としてディレクトリがあります。ディレクトリはファイルをまとめる存在ですが、物理的なデータとしてディレクトリが存在しているわけではありません。ディレクトリはOSがファイルをまとめるために利用する論理的な存在で、様々な情報から成り立つファイル情報の集合体だといえます。このためファイル操作にはディレクトリ内にある情報が不可欠で、lsなどのファイル一覧表示機能もディレクトリの情報を利用しています。Linuxのディレクトリツリーの頂点が/(ルート)であることからも、ファイルは全て各階層のディレクトリによって管理されていることがわかります。
通常OSを操作する上において、データを操作するということはファイルを操作することとほぼ同等の意味と解釈されます。
このため通常はデータが物理的にどのように格納されているかを意識する必要もなく、逆に意識できない作りになっています。
これはOSの機能であるデータの抽象化によってもたらされる結果です。
実際に物理的な記憶装置に格納されているデータを素で扱おうとすると、HDDのどこのセクタのどの部分とどの部分を取り出して、データをメモリ上に読み込み、メモリに格納できないものは後からまた読む・・・といった大変面倒なことをする必要があります。
現在のHDDの容量を考えてみると、テラ単位・・・という巨大なデータを格納できるような物体です。その中に入っている何かのデータを自力で探しだし、利用することは人間が行う作業として成立しないものだともいえます。このような物体に存在するデータを人間にわかりやすいファイルというものに抽象化、可視化し、データを永続的に管理しやすくするという役目を持つのがファイルシステムの基本的な考え方です。
ファイルシステムにはほかにもキャッシュメモリを利用して効果的にHDDなどの二次記憶装置を使うという機能も含まれており、Linuxではこの機能によって大きなファイルでも高速にアクセスすることが可能になっています。このようにファイルシステムは単にデータを扱いやすく管理するだけではなくH/Wリソースを効率よく利用するための機能も含まれています。
■VFS(Virtual File System)
Linuxでは全てをファイルとして扱うようになっています。これは通常のデータファイルだけではなく、HDD、CD-ROM、マウスなど様々なデバイスもファイルとして扱う仕組みになっています。
この仕組みを提供するのがVFSという仮想的なファイルシステムです。VFSは下位の物理的な媒体を抽象化し、データ、デバイスを含む全てのコンピュータリソースに対して統一的なファイルアクセスという入出力インターフェイスを提供します。これによりリソースの差異を気にすることなく、様々な対象に対して統一のアクセスを行うことができます。
さらにVFSにはファイルシステムの抽象化という役割もあり、これによってことなる複数のファイルシステムに対して透過的にアクセスすることが可能になっており、ファイルシステムの種類を意識せずに利用することができます。VFSは、プログラムからのファイルシステムの操作を固有のファイルシステムの操作に変換します。このためユーザが実行するプログラムはファイルシステムの差異を意識する必要がなく、統一的なアクセス方法で実際にはことなるファイルシステムにアクセスできます。
■マウント
通常LinuxではHDDを複数のパーティションに分割して、それぞれにファイルシステムを作成します。そして各ファイルシステムをディレクトリツリーの/(ルート)以下にマウントすることで利用できるようにしますが、このマウントという考え方は重要でファイルシステムを利用するときには必ず行わなければならない操作でもあります。
Linuxのファイルシステムはツリー構造になっていますがこの構造を木の根にたとえると、その木の根に接ぎ木をする行為がマウントになります。つまりOSから対象となるH/WをS/W的に接続する行為がマウントになります。
例えばHDDを物理的に追加したことを想定してみます。
基本的にLinuxではストレージのH/Wが認識されても、それだけではファイルシステムとして利用することができません。つまりファイルを保存したりするなどの行為ができないのです。Linux上ではH/Wの認識とファイルシステムとして利用可能であるかは別の問題であり、ファイルシステムとして利用可能にするためには任意であれ、自動であれマウントすることが必要不可欠です。
※最近ではデスクトップ環境などに自動マウント機能を活用する仕組みが導入されているので、USBメモリなどのストレージも挿せば認識、マウントが自動的に行われるためあまり意識はしなくなっているかもしれません。
このため手順としては以下のようなフローでHDDを追加することになります。
・HDDの物理フォーマット、パーティションを切るなどの作業
・各パーティションにファイルシステムを構築し、フォーマットする
・マウントポイントを指定し、ディレクトリツリーのどこかにマウントを行う
マウントできるデバイスターゲットはブロックデバイスといわれる、HDD、CD-ROMなどのストレージと呼ばれるディスクドライブです。またマウントしたデバイスの物理的接続解除を行うためには、アンマウントというS/W的接続解除の手続きを行って、物理的接続解除を行う必要があります。アンマウントを行わずに強引に物理的に接続解除をするとデータを破損する危険があります。
このようにLinuxにはWindowsなどとは異なるファイルシステムの概念があり、このシステムによってデータを効率よく管理することができるようになっています。OSの基本操作であるファイル操作は頻度の高い操作系ですが、OSごとのファイル管理の概念に沿って操作が行われます。このため通常は意識しないような仕組みの部分を知ることによって、ファイル操作の考え方をより深く理解することができます。
備考:ディレクトリ
ファイル以外のデータ管理の単位としてディレクトリがあります。ディレクトリはファイルをまとめる存在ですが、物理的なデータとしてディレクトリが存在しているわけではありません。ディレクトリはOSがファイルをまとめるために利用する論理的な存在で、様々な情報から成り立つファイル情報の集合体だといえます。このためファイル操作にはディレクトリ内にある情報が不可欠で、lsなどのファイル一覧表示機能もディレクトリの情報を利用しています。Linuxのディレクトリツリーの頂点が/(ルート)であることからも、ファイルは全て各階層のディレクトリによって管理されていることがわかります。
2013年5月23日木曜日
WebSphere Application Server for Developers V8.0 導入手順
参考となるURL
http://www.ibm.com/developerworks/jp/websphere/library/was/was8_dev/
【手順の概要】
オフライン環境のための導入は、次の手順で行います。
準備の作業はオンライン環境で行ないます。
•準備
1.インターネットに接続できる環境でインストレーション・マネジャー、パッケージング・ユーティリティをダウンロードします。
2.パッケージング・ユーティリティを導入し、WAS V8.0開発者版導入リポジトリーをダウンロードします。
3.リポジトリーとインストレーション・マネジャーをDVDなどにコピーします。
•導入
1.インストレーション・マネジャーを導入します。
2.インストレーション・マネジャーで導入元のリポジトリーを設定します。
3.WAS V8.0開発者番を導入します。
オンラインであれば、インストレーション・マネジャーをダウンロードし、セットアップすることによって、Websphereを導入することができる。
下記は いずれもIBMから提供されている無料の開発用、Websphereである。
WebSphere Application Server for Developers V8.5
WebSphere Application Server for Developers V8.0
インストレーション・マネジャーで、1.5GB近くをダウンロードすることになるので、ネット環境は重要である。
IBM WebSphere Application Server Developer Tools for Eclipseは、
Eclipse Marketplace (「ヘルプ」 > 「Eclipse Marketplace」) からインストールできます。
このタスクについて
Eclipse Marketplace からは、最新バージョンの IBM WebSphere Application Server Developer Tools for Eclipse のみが入手できます。
最新バージョンの IBM WebSphere Application Server Developer Tools for Eclipse のインストール手順については、
下記のURLを参照
http://publib.boulder.ibm.com/infocenter/radhelp/v8r5/index.jsp?topic=%2Fcom.ibm.rad.install.doc%2Ftopics%2Ft_install_wdt_eclipse.html
http://www.ibm.com/developerworks/jp/websphere/library/was/was8_dev/
【手順の概要】
オフライン環境のための導入は、次の手順で行います。
準備の作業はオンライン環境で行ないます。
•準備
1.インターネットに接続できる環境でインストレーション・マネジャー、パッケージング・ユーティリティをダウンロードします。
2.パッケージング・ユーティリティを導入し、WAS V8.0開発者版導入リポジトリーをダウンロードします。
3.リポジトリーとインストレーション・マネジャーをDVDなどにコピーします。
•導入
1.インストレーション・マネジャーを導入します。
2.インストレーション・マネジャーで導入元のリポジトリーを設定します。
3.WAS V8.0開発者番を導入します。
オンラインであれば、インストレーション・マネジャーをダウンロードし、セットアップすることによって、Websphereを導入することができる。
下記は いずれもIBMから提供されている無料の開発用、Websphereである。
WebSphere Application Server for Developers V8.5
WebSphere Application Server for Developers V8.0
インストレーション・マネジャーで、1.5GB近くをダウンロードすることになるので、ネット環境は重要である。
IBM WebSphere Application Server Developer Tools for Eclipseは、
Eclipse Marketplace (「ヘルプ」 > 「Eclipse Marketplace」) からインストールできます。
このタスクについて
Eclipse Marketplace からは、最新バージョンの IBM WebSphere Application Server Developer Tools for Eclipse のみが入手できます。
最新バージョンの IBM WebSphere Application Server Developer Tools for Eclipse のインストール手順については、
下記のURLを参照
http://publib.boulder.ibm.com/infocenter/radhelp/v8r5/index.jsp?topic=%2Fcom.ibm.rad.install.doc%2Ftopics%2Ft_install_wdt_eclipse.html
2013年5月18日土曜日
備考
http://dream.mods.jp/servlet500gokui/
http://aoyama-systems.blogspot.jp/
ttp://java.keicode.com/lang/variables.php
http://www.javadrive.jp/
http://www.javaroad.jp/index.htm
http://www.techscore.com/
http://www-06.ibm.com/software/jp/websphere/apptransaction/
http://www.techscore.com/tech/Java/ApacheJakarta/Maven/4/
http://www.java-kuche.org/ryukyu-u/framework.html#i17
http://si.comp.ae.keio.ac.jp/web_app_dev_material/list.html
http://aoyamasys.jimdo.com
http://aoyama-systems.blogspot.jp/
ttp://java.keicode.com/lang/variables.php
http://www.javadrive.jp/
http://www.javaroad.jp/index.htm
http://www.techscore.com/
http://www-06.ibm.com/software/jp/websphere/apptransaction/
http://www.techscore.com/tech/Java/ApacheJakarta/Maven/4/
http://www.java-kuche.org/ryukyu-u/framework.html#i17
http://si.comp.ae.keio.ac.jp/web_app_dev_material/list.html
http://aoyamasys.jimdo.com
2013年5月12日日曜日
websphere 起動方法
ミドルウェアの起動順序・停止順序は、ミドルウェア間やプロセス間の依存関係に基づいて決定します。連携している一連のミ
ドルウェアの起動作業は、バックエンド・システムから実施することが一般的です。ミドルウェアの停止作業はその逆となり、
フロントエンド・システムから実施することが一般的です。
例えば、WASからDB2やWebSphere MQを参照している場合、起動順序はDB2やWebSphere MQを起動した上でIHSとWASを起動
する流れにし、停止順序はIHSとWASを停止した上でDB2やWebSphere MQを停止する流れにします。
上記ではIHSとWASを一括りにしましたが、IHS、WASは以下のような複数のプロセスで構成されており、これらのプロセスの起
動順序・停止順序についても考慮が必要になります。
• IHSプロセス
• (IHS管理サーバー・プロセス)
• アプリケーション・サーバー・プロセス
• デプロイメント・マネージャー・プロセス
• ノード・エージェント・プロセス IHS、WASを構成するプロセスの起動は、管理する側から管理される側という順序で実施することが一般的です。停止はその逆
となり、管理される側から管理する側という順序で実施することが一般的です。
IHS、WASの起動 IHSプロセス:
起動コマンド
UNIX/Linux環境:/bin/apachectl start
Windows環境:\bin\httpd.exe -k start -n
停止コマンド
UNIX/Linux環境:/bin/apachectl stop
Windows環境:\bin\httpd.exe -k stop -n
IHS管理サーバーは、IHSをデプロイメント・マネージャーの管理対象として統合する構成において、IHSをノード・エージェント経由で管理しない場合に必要になります。主にIHSとWASを共存させない構成で使用します。
IHS管理サーバー・プロセスの起動・停止には、
UNIX/Linux環境ではadminctlコマンド、
Windows環境ではhttpd.exeコマンド(Windowsサービス)
を使用します。
IHS管理サーバー・プロセス:
起動コマンド
UNIX/Linux環境:/bin/adminctl start
Windows環境:\bin\httpd.exe -k start -n
停止コマンド
UNIX/Linux環境:/bin/adminctl stop
Windows環境:\bin\httpd.exe -k stop -n
WASプロセスの起動・停止
WASの主なプロセスには、デプロイメント・マネージャー・プロセス、ノード・エージェント・プロセス、アプリケーション・サーバー・プロセスがあります。各プロセスの起動・停止にはWASコマンド行ツールを使用します。なお、管理セキュリティー機能を有効化している環境では、各プロセスを停止する際に認証のための管理ユーザー名とパスワードが必要になります。
デプロイメント・マネージャー・プロセスとノード・エージェント・プロセスが起動している状態であれば、WAS管理コンソールからアプリケーション・サーバー・プロセスの起動・停止を行うことも可能です。
デプロイメント・マネージャー・プロセス:
起動コマンド
UNIX/Linux環境:/bin/startManager.sh
Windows環境:\bin\startManager.bat
停止コマンド
UNIX/Linux環境:/bin/stopManager.sh [ -user <管理ユーザー名> -password <パスワード> ]
Windows環境:\bin\stopManager.bat [ -user <管理ユーザー名> -password <パスワード> ]
ノード・エージェント・プロセス:
起動コマンド
UNIX/Linux環境:/bin/startNode.sh
Windows環境:\bin\startNode.bat
停止コマンド
UNIX/Linux環境:/bin/stopNode.sh [ -user <管理ユーザー名> -password <パスワード> ]
Windows環境:\bin\stopNode.bat [ -user <管理ユーザー名> -password <パスワード> ]
アプリケーション・サーバー・プロセス:
起動コマンド
UNIX/Linux環境:/bin/startServer.sh <サーバー名>
Windows環境:\bin\startServer.bat <サーバー名>
停止コマンド
UNIX/Linux環境:/bin/stopServer.sh <サーバー名> [ -user <管理ユーザー名> -password <パスワード> ]
Windows環境:\bin\stopServer.bat <サーバー名> [ -user <管理ユーザー名> -password <パスワード> ]
Windows環境では、Windowsサービスを使用してデプロイメント・マネージャー・プロセスの起動・停止、ノード・エージェント・プロセスの起動・停止を行うように設定することも可能です。Windowsサービスへの登録にはWASService.exeコマンドを使用します。
ドルウェアの起動作業は、バックエンド・システムから実施することが一般的です。ミドルウェアの停止作業はその逆となり、
フロントエンド・システムから実施することが一般的です。
例えば、WASからDB2やWebSphere MQを参照している場合、起動順序はDB2やWebSphere MQを起動した上でIHSとWASを起動
する流れにし、停止順序はIHSとWASを停止した上でDB2やWebSphere MQを停止する流れにします。
上記ではIHSとWASを一括りにしましたが、IHS、WASは以下のような複数のプロセスで構成されており、これらのプロセスの起
動順序・停止順序についても考慮が必要になります。
• IHSプロセス
• (IHS管理サーバー・プロセス)
• アプリケーション・サーバー・プロセス
• デプロイメント・マネージャー・プロセス
• ノード・エージェント・プロセス IHS、WASを構成するプロセスの起動は、管理する側から管理される側という順序で実施することが一般的です。停止はその逆
となり、管理される側から管理する側という順序で実施することが一般的です。
IHS、WASの起動 IHSプロセス:
起動コマンド
UNIX/Linux環境:
Windows環境:
停止コマンド
UNIX/Linux環境:
Windows環境:
IHS管理サーバーは、IHSをデプロイメント・マネージャーの管理対象として統合する構成において、IHSをノード・エージェント経由で管理しない場合に必要になります。主にIHSとWASを共存させない構成で使用します。
IHS管理サーバー・プロセスの起動・停止には、
UNIX/Linux環境ではadminctlコマンド、
Windows環境ではhttpd.exeコマンド(Windowsサービス)
を使用します。
IHS管理サーバー・プロセス:
起動コマンド
UNIX/Linux環境:
Windows環境:
停止コマンド
UNIX/Linux環境:
Windows環境:
WASプロセスの起動・停止
WASの主なプロセスには、デプロイメント・マネージャー・プロセス、ノード・エージェント・プロセス、アプリケーション・サーバー・プロセスがあります。各プロセスの起動・停止にはWASコマンド行ツールを使用します。なお、管理セキュリティー機能を有効化している環境では、各プロセスを停止する際に認証のための管理ユーザー名とパスワードが必要になります。
デプロイメント・マネージャー・プロセスとノード・エージェント・プロセスが起動している状態であれば、WAS管理コンソールからアプリケーション・サーバー・プロセスの起動・停止を行うことも可能です。
デプロイメント・マネージャー・プロセス:
起動コマンド
UNIX/Linux環境:
Windows環境:
停止コマンド
UNIX/Linux環境:
Windows環境:
ノード・エージェント・プロセス:
起動コマンド
UNIX/Linux環境:
Windows環境:
停止コマンド
UNIX/Linux環境:
Windows環境:
アプリケーション・サーバー・プロセス:
起動コマンド
UNIX/Linux環境:
Windows環境:
停止コマンド
UNIX/Linux環境:
Windows環境:
Windows環境では、Windowsサービスを使用してデプロイメント・マネージャー・プロセスの起動・停止、ノード・エージェント・プロセスの起動・停止を行うように設定することも可能です。Windowsサービスへの登録にはWASService.exeコマンドを使用します。
2013年4月18日木曜日
2013年3月28日木曜日
資料
JP1関係
http://www.hitachi.co.jp/Prod/comp/soft1/manual/common/jp1/v10/index.html
AIX関係
http://www-06.ibm.com/systems/jp/power/techinfo/aix/introduction.html
DB2関係
V9.5
https://www.ibm.com/developerworks/mydeveloperworks/wikis/home?lang=en#/wiki/Information%20Management%20Wiki%20-%20Japan/page/DB2%209.5%20%E6%8A%80%E8%A1%93%E8%B3%87%E6%96%99%E3%80%80%E5%B0%8E%E5%85%A5%E3%81%A8%E7%AE%A1%E7%90%86%E6%A9%9F%E8%83%BD%E3%81%AE%E5%BC%B7%E5%8C%96
http://www-06.ibm.com/software/jp/data/db2/support/
http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/index.jsp
サーバ情報
http://teqinfo.blush.jp/teq/
http://www.hitachi.co.jp/Prod/comp/soft1/manual/common/jp1/v10/index.html
AIX関係
http://www-06.ibm.com/systems/jp/power/techinfo/aix/introduction.html
DB2関係
V9.5
https://www.ibm.com/developerworks/mydeveloperworks/wikis/home?lang=en#/wiki/Information%20Management%20Wiki%20-%20Japan/page/DB2%209.5%20%E6%8A%80%E8%A1%93%E8%B3%87%E6%96%99%E3%80%80%E5%B0%8E%E5%85%A5%E3%81%A8%E7%AE%A1%E7%90%86%E6%A9%9F%E8%83%BD%E3%81%AE%E5%BC%B7%E5%8C%96
http://www-06.ibm.com/software/jp/data/db2/support/
http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/index.jsp
サーバ情報
http://teqinfo.blush.jp/teq/
2013年3月12日火曜日
DBAの仕事とは
データベース管理者(DBA)には3つの基本的な業務がある
●重要な順に、データの保護、データの保護、そしてデータの保護。
【一般的な業務 】
①インストール、設定、更新、移行
・一般に、個々のサーバのハードウェアとOSに責任を負っているのはシステム管理者だが、データベースソフトウェアのインストールは通常はDBAの責任だ。この業務には、効果的なデータベースサーバに必要とされるハードウェア要件の知識と、それらの要件をシステム管理者に伝えることが必要とされる。
・次にDBAはデータベースソフトウェアをインストールし、製品のさまざまなオプションを選択して、そのデータベースの目的に合致するよう設定する。新しいバージョンやパッチが開発されれば、どれをインストールするのが適切かを判断するのもDBAの仕事となる。サーバが既存のものの置き換えであれば、古いサーバから新しいサーバにデータを移行することもDBAの仕事だ。
②バックアップと復旧
・DBAには管理しているデータベースのバックアップ計画と復旧計画を整備し、実装し、定期的にテストする責任がある。各システム管理者がサーバーのバックアップを行っている大企業の場合でも、DBAはバックアップをスケジュール通り行い、バックアップに障害が起こった場合にデータベースの復旧に必要なすべてのファイルが含まれていることを確実にすることに最終的な責任を負う。DBAは障害が起こった場合に、コミットされたトランザクションを1つも失わずに、バックアップを用いて可能な限り速やかにデータベースを運用状態に復旧する方法を知っていなければならない。データベースの障害にはいくつかの形が考えられるが、DBAはすべての障害の形態について復旧のための戦略を持っている必要がある。ビジネスの観点からは、バックアップのための費用についても考慮が必要で、DBAはさまざまなバックアップ手段の費用とリスクのトレードオフについて意識して管理しなくてはならない。
③データベースセキュリティ
・データベースはデータのストレージを集中させたものであるため、ハッカーや好奇心の強い従業員には魅力的な標的だ。DBAはデータベースが採用しているセキュリティモデルと、それを効果的に使ってデータへのアクセスを制御する手段を知る必要がある。
・セキュリティに関する3つの基本的な仕事は、
認証(データベースへのログインを管理するためのユーザーアカウントを設定する)、
権限付与(データベースのさまざまな部分に対するアクセス許可を設定する)、
そして監査(データベースに対して誰が何をしたかを記録する)だ。
監査の仕事は特に重要になってきている。これは、SOX法やHIPAAなどの法令が求める報告のための要件を満たす必要があるためだ。
④ストレージおよび容量の計画
・データベースの主な目的はデータの蓄積と読み出しであるため、どれだけのディスクストレージが必要とされるかを計画し、利用可能なディスク空間をモニタリングすることは、DBAの重要な責任だ。長期的な容量計画を立てる際にアドバイスできるよう、ディスク使用量の伸びの動向を調べておくことが重要となる。
⑤性能のモニタリングとチューニング
・DBAはデータベースサーバーを定期的にモニタリングし、ボトルネック(システムの中の処理を遅らせている部分)を特定し、それを修正する責任がある。データベースサーバのチューニングは、複数のレベルで行われる。サーバのハードウェアの能力やOSの設定が制約要因になる可能性がある一方、データベースソフトウェアの設定が問題になる可能性もある。データベースがディスクドライブに物理的にどうマップされているかや、選択したインデックスの種類なども影響を及ぼす。データベースに対するクエリーをどうコード化するかは、結果が返ってくる速度を劇的に変える。DBAはこれらの各レベルで利用できるモニタリングツールと、それらを使ってシステムをチューニングする方法を理解していなくてはならない。積極的なチューニングとは、問題が生じて初めて修正するのではなく、最初からアプリケーションに性能についても設計に織り込む方針のことだ。そのためには、データベースを利用するアプリケーションの開発者と緊密に連携を取り、よい性能が得られるよう確実にベストプラクティスに従うようにする必要がある。
⑥トラブルシューティング
・DBAは、データベースサーバに問題が生じた場合に、素早く問題を突き止め、データを失ったり状況を悪化させずにその問題を解決する方法を知っている必要がある。
【特別な環境】
①高い可用性
・インターネットの登場によって、日中にのみ利用されていたデータベースの多くに、1日に24時間、1週間に7日利用可能である必要が出てきた。ウェブサイトは静的であらかじめ決められたコンテンツから、動的に生成されるコンテンツになり、ページが要求された時点でデータベースを使ってページレイアウトが作成されるようになった。ウェブサイトが24時間、週7日利用できなくてはならないなら、その下位にあるデータベースも同じだ。
この環境でデータベースを運用するためには、オンライン(ユーザーにデータベースが提供されている状態)のままデータベースを管理する方法の種類と、データベースがシャットダウンされる場合のメンテナンスのスケジュールについて理解する必要がある。また、冗長性を持たせたハードウェア、ソフトウェアを計画し、1つに障害が起きても他のものは全体としてユーザーが利用可能な状態を維持できるようにする必要がある。DBAが高い可用性を確保するのに使われるツールには、オンラインバックアップ、クラスタリング、複製、スタンバイデータベースなどがある。
②大規模データベース(VLDB)
・企業はデータベース技術を活用する方法を次々に見つけており、より多くのデータを保存するようになってきている。また、データベースに保存されるデータの種類も変わってきており、以前は定められた行列に収まった構造化されたデータが主流だったのが、文書、画像、音声ファイルから指紋データに至るまでのさまざまな非構造化データが多くなってきている。どちらの動向も、大規模データベースという同じ結果を生む。VLDBの管理は、DBAに特別なスキルを要求する。表のコピーといった単純な操作にも必要な時間は大きくなり、正しく行わない限り禁止しなければならなくなる場合もある。DBAはテーブル分割(Oracle)、連合データベース(SQL Server)、レプリケーション(MySQL)などの、データベースを大規模に適用しながら管理可能にするための技術を理解する必要がある。
③データの抽出・変換・挿入(ETL)
・データウェアハウス環境では、データウェアハウスにデータを効率的に読み込んだり、複数の既存の生産システムから大量のデータを抽出しデータマートすることが重要な業務となる。これらの生産システムは、データウェアハウスで標準として定義しているものとは異なるフォーマットを持っていることが多いため、データをロードする前には変換(あるいはクレンジング)しなくてはならない。データの抽出がDBAの責任であるかどうかは企業によって異なるが、何が抽出されるかは確実にしておいた方がよく、DBAはチームの重要な役割だ。
●重要な順に、データの保護、データの保護、そしてデータの保護。
【一般的な業務 】
①インストール、設定、更新、移行
・一般に、個々のサーバのハードウェアとOSに責任を負っているのはシステム管理者だが、データベースソフトウェアのインストールは通常はDBAの責任だ。この業務には、効果的なデータベースサーバに必要とされるハードウェア要件の知識と、それらの要件をシステム管理者に伝えることが必要とされる。
・次にDBAはデータベースソフトウェアをインストールし、製品のさまざまなオプションを選択して、そのデータベースの目的に合致するよう設定する。新しいバージョンやパッチが開発されれば、どれをインストールするのが適切かを判断するのもDBAの仕事となる。サーバが既存のものの置き換えであれば、古いサーバから新しいサーバにデータを移行することもDBAの仕事だ。
②バックアップと復旧
・DBAには管理しているデータベースのバックアップ計画と復旧計画を整備し、実装し、定期的にテストする責任がある。各システム管理者がサーバーのバックアップを行っている大企業の場合でも、DBAはバックアップをスケジュール通り行い、バックアップに障害が起こった場合にデータベースの復旧に必要なすべてのファイルが含まれていることを確実にすることに最終的な責任を負う。DBAは障害が起こった場合に、コミットされたトランザクションを1つも失わずに、バックアップを用いて可能な限り速やかにデータベースを運用状態に復旧する方法を知っていなければならない。データベースの障害にはいくつかの形が考えられるが、DBAはすべての障害の形態について復旧のための戦略を持っている必要がある。ビジネスの観点からは、バックアップのための費用についても考慮が必要で、DBAはさまざまなバックアップ手段の費用とリスクのトレードオフについて意識して管理しなくてはならない。
③データベースセキュリティ
・データベースはデータのストレージを集中させたものであるため、ハッカーや好奇心の強い従業員には魅力的な標的だ。DBAはデータベースが採用しているセキュリティモデルと、それを効果的に使ってデータへのアクセスを制御する手段を知る必要がある。
・セキュリティに関する3つの基本的な仕事は、
認証(データベースへのログインを管理するためのユーザーアカウントを設定する)、
権限付与(データベースのさまざまな部分に対するアクセス許可を設定する)、
そして監査(データベースに対して誰が何をしたかを記録する)だ。
監査の仕事は特に重要になってきている。これは、SOX法やHIPAAなどの法令が求める報告のための要件を満たす必要があるためだ。
④ストレージおよび容量の計画
・データベースの主な目的はデータの蓄積と読み出しであるため、どれだけのディスクストレージが必要とされるかを計画し、利用可能なディスク空間をモニタリングすることは、DBAの重要な責任だ。長期的な容量計画を立てる際にアドバイスできるよう、ディスク使用量の伸びの動向を調べておくことが重要となる。
⑤性能のモニタリングとチューニング
・DBAはデータベースサーバーを定期的にモニタリングし、ボトルネック(システムの中の処理を遅らせている部分)を特定し、それを修正する責任がある。データベースサーバのチューニングは、複数のレベルで行われる。サーバのハードウェアの能力やOSの設定が制約要因になる可能性がある一方、データベースソフトウェアの設定が問題になる可能性もある。データベースがディスクドライブに物理的にどうマップされているかや、選択したインデックスの種類なども影響を及ぼす。データベースに対するクエリーをどうコード化するかは、結果が返ってくる速度を劇的に変える。DBAはこれらの各レベルで利用できるモニタリングツールと、それらを使ってシステムをチューニングする方法を理解していなくてはならない。積極的なチューニングとは、問題が生じて初めて修正するのではなく、最初からアプリケーションに性能についても設計に織り込む方針のことだ。そのためには、データベースを利用するアプリケーションの開発者と緊密に連携を取り、よい性能が得られるよう確実にベストプラクティスに従うようにする必要がある。
⑥トラブルシューティング
・DBAは、データベースサーバに問題が生じた場合に、素早く問題を突き止め、データを失ったり状況を悪化させずにその問題を解決する方法を知っている必要がある。
【特別な環境】
①高い可用性
・インターネットの登場によって、日中にのみ利用されていたデータベースの多くに、1日に24時間、1週間に7日利用可能である必要が出てきた。ウェブサイトは静的であらかじめ決められたコンテンツから、動的に生成されるコンテンツになり、ページが要求された時点でデータベースを使ってページレイアウトが作成されるようになった。ウェブサイトが24時間、週7日利用できなくてはならないなら、その下位にあるデータベースも同じだ。
この環境でデータベースを運用するためには、オンライン(ユーザーにデータベースが提供されている状態)のままデータベースを管理する方法の種類と、データベースがシャットダウンされる場合のメンテナンスのスケジュールについて理解する必要がある。また、冗長性を持たせたハードウェア、ソフトウェアを計画し、1つに障害が起きても他のものは全体としてユーザーが利用可能な状態を維持できるようにする必要がある。DBAが高い可用性を確保するのに使われるツールには、オンラインバックアップ、クラスタリング、複製、スタンバイデータベースなどがある。
②大規模データベース(VLDB)
・企業はデータベース技術を活用する方法を次々に見つけており、より多くのデータを保存するようになってきている。また、データベースに保存されるデータの種類も変わってきており、以前は定められた行列に収まった構造化されたデータが主流だったのが、文書、画像、音声ファイルから指紋データに至るまでのさまざまな非構造化データが多くなってきている。どちらの動向も、大規模データベースという同じ結果を生む。VLDBの管理は、DBAに特別なスキルを要求する。表のコピーといった単純な操作にも必要な時間は大きくなり、正しく行わない限り禁止しなければならなくなる場合もある。DBAはテーブル分割(Oracle)、連合データベース(SQL Server)、レプリケーション(MySQL)などの、データベースを大規模に適用しながら管理可能にするための技術を理解する必要がある。
③データの抽出・変換・挿入(ETL)
・データウェアハウス環境では、データウェアハウスにデータを効率的に読み込んだり、複数の既存の生産システムから大量のデータを抽出しデータマートすることが重要な業務となる。これらの生産システムは、データウェアハウスで標準として定義しているものとは異なるフォーマットを持っていることが多いため、データをロードする前には変換(あるいはクレンジング)しなくてはならない。データの抽出がDBAの責任であるかどうかは企業によって異なるが、何が抽出されるかは確実にしておいた方がよく、DBAはチームの重要な役割だ。
2013年3月5日火曜日
動画のフォーマット変換
動画のファイル形式の変更について
Free Video Converter
が、使いやすく、便利でした。
紹介ページ
http://donkichirou.blog27.fc2.com/blog-entry-138.html#p8
これに出会って、MOVファイルをWindows軽視のファイル変換にとてもよい。
Free Video Converter
が、使いやすく、便利でした。
紹介ページ
http://donkichirou.blog27.fc2.com/blog-entry-138.html#p8
これに出会って、MOVファイルをWindows軽視のファイル変換にとてもよい。
2013年2月16日土曜日
プルダウンの値によって活性・非活性をするには
プルダウンの値によって活性・非活性をするには
やりたいことは以下の通りです。
「OS」の値をWindowsと選択
「Windowsのバージョン」→活性化
「Windowsのサービスパック」→活性化
「OS」の値にWindows以外を選択
「Windowsのバージョン」→非活性化
「Windowsのサービスパック」→非活性化
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head><title>test</title>
<style type="text/css">
label { margin-right:1.5em; }
</style>
<script type="text/javascript"><!--
function check(sel) {
var v = sel.value, frm = sel.form;
flg = (v=='Windows' || v=='')?false:true;
frm.elements['IDVersion'].disabled = flg;
frm.elements['Pack'].disabled = flg;
}
--></script>
</head>
<body>
<form>
<label>OS:
<select id="IDOS" onchange="check(this)">
<option value="">-</option>
<option value="Windows">Windows</option>
<option value="Mac">Mac</option>
<option value="Linux">Linux</option>
</select>
</label>
<label>
Windowsのバージョン:
<select id="IDVersion">
<option value="XP">XP</option>
<option value="Vista">Vista</option>
<option value="7">7</option>
</select>
</label>
<label>
Windowsのサービスパック:
<input type="text" name="Pack" value="" size="30">
</label>
</form>
</body>
</html>
2013年2月12日火曜日
2013年2月3日日曜日
WindowsXPが重い:wuauclt.exeがメモリーを異常に消費
WindowsXP以外に
Windows Vista/7でも効果アリ(ファイル名はDatastore.edb)
Automatic Updates(自動更新)サービスを停止します。
1. Windows の [スタート] メニューをクリックします。
2. [ファイル名を指定して実行] をクリックします。.
3. [名前] ボックスに「services.msc」と入力します。
4. [OK] をクリックします。
5. [Automatic Updates] (自動更新)サービスを右クリックします。
6. [停止] をクリックします。
DataStore フォルダの内容を削除します。
1. Windows の [スタート] メニューをクリックします。
2. [ファイル名を指定して実行] をクリックします。
3. [名前] ボックスに「%windir%\SoftwareDistribution」と入力します。
4. [OK] をクリックします。
5. DataStore フォルダを開きます。
6. DataStore フォルダのすべての内容を削除します。
7. ウィンドウを閉じます。
Automatic Updates(自動更新)サービスを開始します。
1. Windows の [スタート] メニューをクリックします。
2. [ファイル名を指定して実行] をクリックします。
3. [名前] ボックスに「services.msc」と入力します。
4. [OK] をクリックします。
5. [Automatic Updates] (自動更新)サービスを右クリックします。
6. [開始] をクリックします。
Windows Vista/7でも効果アリ(ファイル名はDatastore.edb)
Automatic Updates(自動更新)サービスを停止します。
1. Windows の [スタート] メニューをクリックします。
2. [ファイル名を指定して実行] をクリックします。.
3. [名前] ボックスに「services.msc」と入力します。
4. [OK] をクリックします。
5. [Automatic Updates] (自動更新)サービスを右クリックします。
6. [停止] をクリックします。
DataStore フォルダの内容を削除します。
1. Windows の [スタート] メニューをクリックします。
2. [ファイル名を指定して実行] をクリックします。
3. [名前] ボックスに「%windir%\SoftwareDistribution」と入力します。
4. [OK] をクリックします。
5. DataStore フォルダを開きます。
6. DataStore フォルダのすべての内容を削除します。
7. ウィンドウを閉じます。
Automatic Updates(自動更新)サービスを開始します。
1. Windows の [スタート] メニューをクリックします。
2. [ファイル名を指定して実行] をクリックします。
3. [名前] ボックスに「services.msc」と入力します。
4. [OK] をクリックします。
5. [Automatic Updates] (自動更新)サービスを右クリックします。
6. [開始] をクリックします。
2013年2月1日金曜日
指導について
体罰問題について、
①言ってはいけない言葉
②暴力
③上目線から指導
上記のことは禁止である。
言葉の暴力はいけないし、また手を相手に出すことはもちろん禁止。
日本では精神論や体罰について寛容性があるため、埋もれている事実が多い。
情熱論などで片付けてもらっては困る。
教育熱心?
それは教育者の指導性がないということであるから現場を去ってほしい。
国際的な指導者
①指導方法を説明し、それに伴い、教えられているものに理解させ行動させる
②相手方が嫌がることはしない
③精神論ではなく、心のケアが上手である
④相手を批判しない。
教育される側は思い込みが激しい場合がある。
⑤暴力は禁止。
冗談などの言葉でも気をつける
パワハラ、セクハラなどの言葉などを参考にする
⑥指導者は運営に追加ての管理であり、教育されるものは道具ではない
道具と同様な考え方持つ人が多いので気をつけてほしい。
①言ってはいけない言葉
②暴力
③上目線から指導
上記のことは禁止である。
言葉の暴力はいけないし、また手を相手に出すことはもちろん禁止。
日本では精神論や体罰について寛容性があるため、埋もれている事実が多い。
情熱論などで片付けてもらっては困る。
教育熱心?
それは教育者の指導性がないということであるから現場を去ってほしい。
国際的な指導者
①指導方法を説明し、それに伴い、教えられているものに理解させ行動させる
②相手方が嫌がることはしない
③精神論ではなく、心のケアが上手である
④相手を批判しない。
教育される側は思い込みが激しい場合がある。
⑤暴力は禁止。
冗談などの言葉でも気をつける
パワハラ、セクハラなどの言葉などを参考にする
⑥指導者は運営に追加ての管理であり、教育されるものは道具ではない
道具と同様な考え方持つ人が多いので気をつけてほしい。
2013年1月26日土曜日
2013年1月22日火曜日
2013年1月18日金曜日
2013年1月17日木曜日
CEP
下記は引用文
情報システムが分析処理をする場合、いったんデータをデータベースに格納してから、再度必要に応じて命令(クエリー)で参照して抽出する内部処理を行うのが一般的です。1回の処理は0.1秒で済むとしても、多数の人が繰り返し利用する状況では、数秒単位で処理が遅延。
これに対して、刻々と収集される市場データをより短時間で処理できる方式として注目されつつあるのがCEP(複合イベント処理)です。例えば株のアルゴリズム売買を行うシステムのように、「直前の5分間で株式Aの価格が1%上昇し、株式Bの価格が0.5%下落した時、すぐに株式Cを買う」といった処理に適した手法です。この場合にCEPでは、直前5分間の値動きのデータをメモリー上に保持しておいて、すぐに簡易な処理を実行します。データベースにいったん格納するやり方に比べて数十~数百倍のスピードで情報をさばきます。データをいったん格納・抽出せずに、逐次処理するという点では、「コンピュータ版カンバン方式」とも言えるでしょう。
金融以外の業務システムでも、生産ラインから営業・物流までの全体を見渡せば、金融市場並みに多数のイベントが起きます。これらを組み合わせて処理するSOA(サービス指向アーキテクチャー)に関連して、CEPの応用が進んでいます。
CEPのオープンソースとしては
Esper for Java
リンク先
http://esper.codehaus.org/about/esper/esper.html
情報システムが分析処理をする場合、いったんデータをデータベースに格納してから、再度必要に応じて命令(クエリー)で参照して抽出する内部処理を行うのが一般的です。1回の処理は0.1秒で済むとしても、多数の人が繰り返し利用する状況では、数秒単位で処理が遅延。
これに対して、刻々と収集される市場データをより短時間で処理できる方式として注目されつつあるのがCEP(複合イベント処理)です。例えば株のアルゴリズム売買を行うシステムのように、「直前の5分間で株式Aの価格が1%上昇し、株式Bの価格が0.5%下落した時、すぐに株式Cを買う」といった処理に適した手法です。この場合にCEPでは、直前5分間の値動きのデータをメモリー上に保持しておいて、すぐに簡易な処理を実行します。データベースにいったん格納するやり方に比べて数十~数百倍のスピードで情報をさばきます。データをいったん格納・抽出せずに、逐次処理するという点では、「コンピュータ版カンバン方式」とも言えるでしょう。
金融以外の業務システムでも、生産ラインから営業・物流までの全体を見渡せば、金融市場並みに多数のイベントが起きます。これらを組み合わせて処理するSOA(サービス指向アーキテクチャー)に関連して、CEPの応用が進んでいます。
CEPのオープンソースとしては
Esper for Java
リンク先
http://esper.codehaus.org/about/esper/esper.html
2013年1月16日水曜日
2013年1月15日火曜日
コイン・ポイントの取り扱い-1
コインやポイントは現状、ゲームやショッピングに使用されている。
現状に必要なことや問題点、課題について、今後取り上げる。
①ポイント(コイン)が発生したとき
②ポイント(コイン)の交換
③ポイント(コイン)システムにおける売上・経費の計算について
上記3個のことが重要であるので次回から説明する。
現状に必要なことや問題点、課題について、今後取り上げる。
①ポイント(コイン)が発生したとき
②ポイント(コイン)の交換
③ポイント(コイン)システムにおける売上・経費の計算について
上記3個のことが重要であるので次回から説明する。
2013年1月12日土曜日
JavaScriptメモ―2
プログラム、つまりブラウザに何をすべきかを記述する手順です。プログラムは日本語などの言語と同じく、書式があります。
教科書24ページ~34ページは基本的事項ですので、覚えてください。
スクリプトコードは外部化したほうが保守性などに利便性があります。
注意点
スクリプトコードを外部化すると、ファイルサイズが大きくなるという欠点が指摘されています。 わかりやすいコードという点では不便になりますが、スクリプトを簡単に書きます。 学習がありますので、わかりやすく、JavaScriptのソースを書きますので実際と違います。
変数
・変数はデータの入れ物といいますと難しいですが、日本語でいいかえれば代名詞の「これ」、「それ」と考えてください。
・重要事項
識別子の命名規則
データ型
・データの種類のこと 人間は数字や文字などを識別できますが、コンピュータは定義をしないと理解ができません。 つまり数字は数字であるという定義が必要ということです。
・リテラルでデータを表現できます(教科書の40~46ページ)
・基本型と参照型
基本型は実際の数字や文字など
参照型は式など
スクリプトコードを外部化すると、ファイルサイズが大きくなるという欠点が指摘されています。 わかりやすいコードという点では不便になりますが、スクリプトを簡単に書きます。 学習がありますので、わかりやすく、JavaScriptのソースを書きますので実際と違います。
変数
・変数はデータの入れ物といいますと難しいですが、日本語でいいかえれば代名詞の「これ」、「それ」と考えてください。
・重要事項
識別子の命名規則
データ型
・データの種類のこと 人間は数字や文字などを識別できますが、コンピュータは定義をしないと理解ができません。 つまり数字は数字であるという定義が必要ということです。
・リテラルでデータを表現できます(教科書の40~46ページ)
・基本型と参照型
基本型は実際の数字や文字など
参照型は式など
2013年1月11日金曜日
JavaScriptメモ―1
JavaScriptは、ブラウザ向けスクリプト言語
・現在、Ajax(Asynchrous javascript + Xml)やjQueryで多用されている
・スクリプト言語:簡易である言語 ただしオブジェクト指向性もあり、再利用性/保守性がある
・インタプリタ言語 コンパイルがなく、逐一解析し、コンピュータは翻訳しながら実行
派生言語が多い
・WindowsではJscriptなど
・Flash PlayerではActionScript
・エラーを確認できるようにブラウザを設定
教科書の11ページより22ページにわたり記述されています。
ブラウザのバーションは現在さらに進んでいますが、基本的設定は同じです
・現在、Ajax(Asynchrous javascript + Xml)やjQueryで多用されている
・スクリプト言語:簡易である言語 ただしオブジェクト指向性もあり、再利用性/保守性がある
・インタプリタ言語 コンパイルがなく、逐一解析し、コンピュータは翻訳しながら実行
派生言語が多い
・WindowsではJscriptなど
・Flash PlayerではActionScript
・エラーを確認できるようにブラウザを設定
教科書の11ページより22ページにわたり記述されています。
ブラウザのバーションは現在さらに進んでいますが、基本的設定は同じです
2013年1月10日木曜日
2013年1月9日水曜日
悩むことは・・・
大いに悩み、考えることはいいことだ。
しかし、人によっては答えが見いだせず、悶々とする人が見受けられる。
悩みすぎる人にたいしては
①無理な答えを出すことはない
②答えは1個ではない
③答えがないものもある
数学的思考で考えると答えを1個となると、悶々と考えるとどうなるか?
悩みすぎて自信を喪失する
悩みすぎはいけないが、いろいろと考えよう。
答えが出ても反対のことを考えよう。
さらなる自分を発見できることがある。
しかし、人によっては答えが見いだせず、悶々とする人が見受けられる。
悩みすぎる人にたいしては
①無理な答えを出すことはない
②答えは1個ではない
③答えがないものもある
数学的思考で考えると答えを1個となると、悶々と考えるとどうなるか?
悩みすぎて自信を喪失する
悩みすぎはいけないが、いろいろと考えよう。
答えが出ても反対のことを考えよう。
さらなる自分を発見できることがある。
2013年1月8日火曜日
人とはよわい
ビジネスの中で人間の弱さはよく見える。
所詮、人間は動物であり、自信を失うことが多い
最近、考えたこと
正義とは何か
正義とは多数のものが同意する事項である。
ゆえに正義は時代によって変わる。
宗教は、弱者が集まることが多い。
集まることによって大きな力となる。なぜ弱者が集まるのか?
自分自身を救うことができないので神様などに救いや願いを求める。
弱者は一人では、何もできないのではないのか?
強者をみてみると、弱者の正反対であることに気づく。
所詮、人間は動物であり、自信を失うことが多い
最近、考えたこと
正義とは何か
正義とは多数のものが同意する事項である。
ゆえに正義は時代によって変わる。
宗教は、弱者が集まることが多い。
集まることによって大きな力となる。なぜ弱者が集まるのか?
自分自身を救うことができないので神様などに救いや願いを求める。
弱者は一人では、何もできないのではないのか?
強者をみてみると、弱者の正反対であることに気づく。
2013年1月2日水曜日
2013年1月1日火曜日
登録:
投稿 (Atom)