JAVA DataSouceオブジェクトをBasicDataSourceへキャストする

DataSouceオブジェクトというのはJNDIでコンテキストファイルからDBの接続情報を参照してきてその情報をセットするものでこんな感じで私は使っている。

		try {
			InitialContext ictx = new InitialContext();
			DataSource ds = (DataSource) ictx.lookup("java:comp/env/jdbc/connect-db");
			con = ds.getConnection(); 
		} catch (Exception e) {
			throw new Exception(CLASS_NAME + "/getDBConnection() failure:"
					+ e.getMessage());
		}

このlookupしてきた情報はDataSourceオブジェクトの型で取得することになるが、これをDBCPのBasicDataSourceオブジェクト型で取得するには、コンテキストファイルのResourceの情報にfactoryの属性を追加するとできるようになる。

	<Context path="/my-proj" reloadable="true" docBase="C:\eclipse\workspace\my-proj" workDir="C:\eclipse\workspace\my-proj\work">

    	<Resource name="jdbc/connect-db"
                auth="Container"
                type="javax.sql.DataSource"
                driverClassName="com.mysql.jdbc.Driver"
                url="jdbc:mysql://my-address:3306/db?autoReconnect=true"
                username="user"
                password="pass"
		validationQuery="select 1"
                maxActive="100"
		factory="org.apache.commons.dbcp.BasicDataSourceFactory"
                maxIdle="100" />

	</Context>

上の記述のfactoryのところがポイント。で、下記のような感じでキャストしてBasicDataSourceオブジェクトとして使えるようになる。


	public static Connection testConnection() throws Exception {
		Connection con = null;
		try {
			InitialContext ictx = new InitialContext();
			BasicDataSource bds =  (BasicDataSource) ictx.lookup("java:comp/env/jdbc/connect-db");
			con = bds.getConnection(); //
			
		} catch (Exception e) {
			throw new Exception(CLASS_NAME + "/getDBConnection() failure:"
					+ e.getMessage());
		}
		return con;
	}

コンテキストファイルからJNDIで接続情報を取得してきてBasicDataSourceオブジェクトとして使えるのならコードに接続情報直書きよりかは便利かなと。Common DBCPを使ってみたかったのもあってコネクションのプールとか性能が今までより(?)上がってるといいのだけれど。

この実行テスト環境はJAVA 1.6、tomcat5.5、common-DBCP 1.4 といった感じ。

JAVAサーブレットクラスの初期化

JAVAサーブレットのクラスを初期化するときの方法について何種類かあるので迷ったので覚書き。
かんたんなサーブレットクラスを作ってテストしてみた。

public class InitTest extends HttpServlet{
	
	static{
		System.out.println("static medhod called");
	}
	
	public void init() throws ServletException{
		System.out.println("init medhod called");
	}
	
	public InitTest(){
		System.out.println("class constructor called");
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("http doGet called");
	}
	
}

1番めはstaticメソッド。initilizerとも呼ばれる。staticなinitilizerで呼ばれるタイミングは一番早い。
2番めはinitメソッドでインスタンス作成後に一度だけ呼び出されるらしい。
3番めはコンストラクタでインスタンス作成したときに呼び出される。

で、上記クラスをTomcatで実行してhttpでアクセスしてみたら

static medhod called
class constructor called
init medhod called
http doGet called

という順番で呼び出された。staticメソッドとクラスのコンストラクタのどちらを使おうかと迷っていたらクラスのinit()メソッドというのも存在していて余計にややこしくなった。init()メソッドは今まで使ってこなくても何の問題もなかったのでJAVAサーブレットで開発をしている上では無視しておいてもいいんじゃないだろうか(適当)
JAVAサーブレット自体がクラスのインスタンスを1つしか作成しないようになっていていくつもインスタンスを作るようなものだったらstaticメソッドを使うかコンストラクタを使うかとか迷わないんだが。

eclipseのプロジェクトのソースファイルが全部消えた

eclipseで普通にデバッグ作業していただけなのにいきなりワークスペースのプロジェクトのフォルダ内のファイルが全部消えた。今までこんなことは経験がなかったので焦った。

消えるきっかけとなった原因

jdbcのドライバを間違って接続しようとしたときに発生したような気がするが、定かではない。具体的にはmysqlのDBに対してmariadbのドライバで接続しようとしたら、その結果は当然接続はできないわけだけれど、特にそれに関するエラー表示もなくいきなり全消しになった。ぷよぷよかよ。そんなことでソースファイルが消えるはずがないと思うが他に思い当たることがない。

幸い、ソースファイルは復元することができた。eclipseのパッケージエクスプローラから中身が全部消えてしまったプロジェクトを右クリックして、ローカルヒストリーからの復元を選択すると以前のソースファイルが残っていてなんとか復元することができた。(速攻でバックアップとったけれども)

で、復元したプロジェクトでもう一回同じこと(mariadbのドライバでmysqlDBに接続)してみたらまた消えた。まさか再現できるとは思わなかった。バックアップとっていたので今度は楽に復旧できたが、さすがにもう一回やる気にはならない。古いバージョンのeclipseを使っているせいかもしれないがjdbcドライバーでDBに接続しようとしてそこでエラーとかソースのリロードとかがあったらこの全消しが発生するような気がする。mariadbのドライバとmysqlのドライバを併用して切り替えて接続するとかいうのはeclipse的に何かまずいのかもしれない。

mariadbのポートを変更する

mariadbのコンフィグファイルであるmy.cnfにポートの設定を追加する。mysqldセクションとportを下記のように追加して再起動する。そしてmysqlにログインして show variables like ‘port’; を実行して反映されているか確認。

# nano /etc/mysql/my.cnf

# The MariaDB configuration file
#
# The MariaDB/MySQL tools read configuration files in the following order:
# 1. “/etc/mysql/mariadb.cnf” (this file) to set global defaults,
# 2. “/etc/mysql/conf.d/*.cnf” to set global options.
# 3. “/etc/mysql/mariadb.conf.d/*.cnf” to set MariaDB-only options.
# 4. “~/.my.cnf” to set user-specific options.
#
# If the same option is defined multiple times, the last one will apply.
#
# One can use all long options that the program supports.
# Run program with –help to get a list of available options and with
# –print-defaults to see which it would actually understand and use.

#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[mysqld]
port=10456

[client-server]

# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/

シンプルな家計簿(仮) バージョン0.940公開

シンプルな家計簿 バージョン0.940はこちらから
https://www.crossdrive.net/wp/software/cdn-01

バージョン0.940の変更点は主にホームタブ画面の再構成です。総資産額を折れ線グラフで累積表示化、費目を棒グラフでグループ表示化、収支一覧表の省略化、概要のデザイン調整などなど。左上のカレンダーで日付を選択するとそれぞれ表示内容が変わります。

今後の予定は
バージョン0.950 → 入力画面の再構成
バージョン0.960 → 抽出タブ・予算タブのグラフ再構成
バージョン1.000 → やることなくなったら

繰り返し入力機能について

機能として実装は多分可能ですが、仕様がやや複雑にならざるをえないので最善な方法が見つかるまで保留します。

例えば、繰り返し入力のデータは即時反映させるか、当該月に入ってから反映させるか、キューとして保持しておくか、いつでも確認できる形で未来のレコードとして反映させるかなどなど。

シンプルな家計簿 バージョン0.930を公開しました

シンプルな家計簿 バージョン0.930はこちらから
https://www.crossdrive.net/wp/software/cdn-01

やってみたかったこととして表の配色パターンを変更するという機能を実装しました。デフォルトの配色は万人向けの飽きの来なさそうな無難なカラーにしたつもりですが、このソフトも開発開始から10年以上経過(はじめの1年だけ開発してその後ほったらかしですが)したのでさすがに飽きる。というわけで家計簿をつけるモチベを少しでも上げるために見た目を変えることをできるようにしました。

バージョン0.930からiniファイルでアプリの設定を読み込むようにしています。起動時のバージョン確認の有無と終了時のウインドウのサイズと位置、そして表の配色設定を保存するようにしています。表の配色はRGB値で指定しており、iniファイル内の記述を変更すれば自分好みの配色にすることもできます。配色はデフォルトを含む数パターンだけ実装しているのでそれを参考にカスタマイズしてもらえればと思います。iniファイルをいじって動作がおかしくなったりしたら、iniファイルを削除してから起動すれば初期設定で起動できます。

追記

バージョン0.930は口座一覧と概要に口座の初期残高が加算されていないという致命的な不具合が存在します。バージョン0.940にて当該の仕様変更を再考します。

VB.NETの駄目な所

10年ぶりぐらいにvb.netのソースコードを手直ししたのだけれど、あらためてvb.netってよくわからない仕様になっているなと。特に配列とFor文。

配列を宣言すると+1の要素数で作成される

Dim array(4) As Integer

と配列を宣言すると要素数5の配列ができあがる。ちょっと意味がわからない。

For文の比較演算子がひとつだけ

For i = 0 To 10
Console.Write(i)
Next

上記の出力結果は0,1,2,3,4,5,6,7,8,9,10 となり11回出力される。このToという独特な演算子のせいでfor文でループ処理するときに-1を加えるという余計な記述をしなければならなくなる。コード見たときなんで-1してんの?って真剣に悩んだ。

配列の要素は0から始まるが宣言したら指定数+1の要素数で作成されるし、For文は終了条件となる数値から-1しないといけない。別言語で開発をしばらくやってたからこの辺は違和感がものすごい感じる。

.NET Frameworkの良し悪し

.NET(以下略)コンポーネントに微妙なバグというか些細な意図しない動作をするものがちらほら存在する。そのせいで想定外の表示がされたりというストレスもなかなか開発していて感じる。だが、このミドルウェアの後方互換性は素晴らしいと思う。.net2.0環境で10年以上前にWinXP向けに作成したアプリケーションがWin10環境でも普通に起動して使うことができた。

シンプルな家計簿(仮) バージョン0.914をリリースしました

シンプルな家計簿(仮) バージョン0.914をリリースしました。
詳しくはこちらのページへ https://www.crossdrive.net/wp/software/cdn-01

主な修正内容はバグ修正のみです。10年ぶりにソースコードをいじりましたがなぜ今更こんなバグが・・・。
やる気が残っていれば処理がもう少し早くなるような修正をしてみます。(早くなるかどうかは不明)見た目や基本的な操作系の変更は利用者のストレスになるだけの気がするのでいじらないようにします。それにしてもどこがシンプルな家計簿なのかと。

ジオンの系譜 デラーズ・フリート編

ギレンの野望 ジオンの系譜のデラーズ・フリート編を久しぶりにやってみたのでプレイした要点をメモ。デラーズ・フリート編の特徴は自軍パイロットの少なさと敵軍パイロットとユニットの強力さがある。

序盤

序盤の方針は宇宙エリア制圧を進めることにした。開始5ターンは敵が攻め込んで来ないのでその間にソロモンとア・バオア・クーへと宇宙の戦力の大半を進軍させる。地上のユニットはキリマンジャロに集結させて放置。

敵軍は連邦とティターンズ(ジャミトフ)の二つなのでどちらから攻略をすべきか序盤のうちにはまだ決めていなかった。エリア制圧の状況しだいで臨機応変にとぼんやりと。連邦の本拠地は地上のジャブローでティターンズ本拠地は宇宙のグリプス2なので進行的にはティターンを倒してから連邦という流れが自然なのかなとは思う。初期のデラーズ・フリートのユニット的に宇宙の方がエリア進行をやりやすいというのもある。地上をエリア進行しようとするなら水中適性のズゴッグやハイゴッグ、ザンジバルや索敵用のルッグンなどのユニットを揃える必要があるが資金資源不足で戦力を整えるまでに時間がかかる。だから宇宙を制圧していってグリプス2以外を掌握した状況を作ってから地球に降下して最短でティターンズ重要拠点を制圧→最後にグリプス2という流れが自然な攻略になるのではないだろうか。

戦力の構築

敵エリアに侵攻にはパイロットはともかくそれなりに強力なユニットがなければ話にならないが初期配備のユニットで頼りになるのはゲルググ/SGとグワジンとヴァルヴァロぐらいしかない。開発レベル上げて生産しようにもやはり資金不足で時間がかかるためユニットの調達は外交の敵軍需産業からの協力要請でまれに手に入るユニットを当てにすることにした。親密レベルまで上げたときに手に入る機体は、序盤のうちはプロトタイプガンダムやガンダム、G-3ガンダム、グレイファントムなどが手に入れることができ、中盤になってくるとギャプランやガルバルディβなども候補に上がってくる。デラーズ軍なのに(デラーズ軍だからこそとも言える?)連邦ユニットばかり使うのはどうかとも思うが生産するより外交で手に入る機体の方が強いので仕方がない。

50ターンイベント

ターン数が50ターンを経過するとガンダム2号機奪取のイベントが発生する。YESを選択して実行してみたら、ケリィ・レズナーが負傷中となってしまってその後永遠に戦線離脱状態になってしまった。これはジオンの系譜の初期版ディスクにある特有のバグらしい。後期版なら修正されて発生しないらしいが初期版と後期版の見分け方はなにやらキャラクター辞典の文言が違うとかそれぐらいしかないため後期版を購入しようにも狙って手に入れることができない。ケリィ・レズナーを失うぐらいだったらガンダム2号機イベントは見送った方がよかった。GP-02は1機は手に入ったがさらに量産しようとするならそれなりに技術レベルが必要になってくるので時間がかかるうえにケリィまで失ってしまって結局このイベントを発生させたことでその後の展開が苦しくなった。

地上のティターンズを駆逐

宇宙の制圧(グリプス2とその隣接エリア以外)が終わったら地上のティターンズが制圧している重要拠点を順に制圧していく。この時点でティターンズが制圧している地上の重要エリアはペキン、マドラス、オデッサ、ベルファスト、ハワイの5つ。キリマンジャロはユニットを集結させていたので攻め込まれることなく維持できていた。オデッサとペキンは宇宙の上空エリアからグレイファントムやザンジバルの突入で直接対象エリアに進入できるので手早く進入できる。マドラスは降下したエリアから南下して進入ワザを使って攻め込む。ハワイはペキン制圧後に日本を占領してから進入するというルートをとった。最後はベルファスト。

ティターンズのエリア侵攻をしている間にも連邦軍は攻め込んでくる。特にジャブローの上空エリアP-ジャブローに打ち上げでユニットをどんどん送ってくるのでそれに対処するための戦力をおいて置かなければならない。G-3やアレックス・ステイメンに乗ったアムロやセイラが強敵であるため物資切れをおこさせるための大量のガトルも準備しておかなければならない。(まともに殴り合ったら壊滅的な被害を受けるので)
アレックスに乗ったBランクアムロはガルバルディα3ユニットでかかれば撃退することは可能だろうと思う。先手を取られたら負ける可能性もある。なので常時それ以上の性能のユニットを配備しておかなければならない。Sランクアムロだったらもうガトルで物資切れを起こさせるしかない。

ベルファスト攻略が最難関

地形的にベルファストが最も攻略に手間がかかる。宇宙から直接降下して行くわけに行かないので攻略するには北米かオデッサ周辺を制圧してからでないと進入することができない。また周辺を海に囲われているためザンジバルなどの戦艦や水中機体を揃える必要がある。ベルファスト周辺エリアを制圧してようやく重要拠点ベルファストへと攻め込んだときには70機ものユニットが配備されていた。内訳は半分がジム・キャノン2やジムクウェルなどの陸上ユニットでもう半分は水中型ガンダムやアクアジム、潜水艦、デフロッグなどの航空ユニットだった。地形的にすべてのユニットがいきなり襲いかかってくるというわけではないので、まずは弱い航空ユニットやアクアジムなどを倒してから本土上陸という流れになるためパイロットと機体が精鋭なら少数でもなんとかなる。このときに連れて行ったユニットはG-3ガンダムプロトタイプガンダム3機、ギャプラン2機、グレイファントム1機、ズゴックとズゴックEとゴッグなど10機ぐらい、ルッグン3機、サイサリス1機、他ゲルググなど使える機体数機。パイロットはデラーズ以外全員。

ティターンズ滅亡まで

105ターンぐらいかかってようやくグリプス2制圧してティターンズを滅亡させることに成功した。攻略に連れて行ったユニットはビグ・ザム10機ぐらいとその補給用にドロス、ガルバルディアルファ6ユニット、サイサリス1機、ガトル10機ほど、グワジン2機、グレイファントム1機、ギャプラン2機、G-3ガンダム1機、あとは量産型ゲルググなど。グリプス2に開戦を仕掛けるといつものように大量の敵ユニットが配備されているのでこれを一掃するためにビグ・ザムの砲撃を利用することにした。ビグザム5機を横一列に並べて敵が近づいてきたら次のターンで一斉に砲撃して敵ユニットの数を速攻で減らす。ビグ・ザム10機連れて行ったので5機が物資切れになったら後ろに下がって次の5機がまた砲撃をするというまるで信長の鉄砲3段撃ちのような作戦で被害を最小限で攻略することが出来た。グリプス2攻略で損失した戦力はグワジン1機とビグ・ザム1機、ガトル多数と量産機数機といった感じ。ヤザンが乗っているバウンドドックやシロッコが乗っているアレックスに落とされてしまった。

あとは地球の連邦軍だけ

ティターンズを滅亡させて宇宙のエリアを全て制圧したので、残るは地上の連邦軍を攻めるのみ。だが、あとは同じ作業を繰り返すだけでもう勝ち確定の未来しか見えないので急にモチベーションが下がった(´Д`;)

猫が背中に乗ってくる理由

決して自分からはあまり寄ってこない飼い猫が、私がうつ伏せで寝ているときに限って背中に乗ってくる。膝の上に乗ってきたりはあまりしないし、仰向けで寝ているときに乗ってきたりはしないのだが、うつ伏せで寝ているときはなぜか乗ってくる。不思議だ

うちの猫の特徴

嫌い

  • 抱きかかえられること
  • 見つめられること
  • 膝の上に乗せられること
  • 体を撫でられること

好む

  • 飼い主を見張ること
  • 飼い主の近くで寝ること
  • 自分から飼い主の膝の上に乗るのはOK
  • 飼い主の背中の上に乗って寝ること

猫が飼い主の背中に乗るということは

飼い主のことをそれだけ信頼しているとも言えるかもしれないが、うちの猫の場合はそこが快適だからというのが理由だと思う。なぜなら飼い主の背中に乗ると、

  • 一方的に見張ることができる
  • 手が届かないので撫でられることがない
  • 寝ているときに突然撫でられて起こされることがない
  • 飼い主の視線が届かない
  • 暖かい

といったメリットがいくつかある。普段スキンシップが嫌いなのにうつ伏せになったとたん背中に乗ってくるという行動をする猫は、人間の特徴を理解して快適に過ごす場所を知っている非常に賢い猫だと言える。