忍者ブログ

Javaってまだいけますか

Javaってまだいけますか

いっぱいいっぱいで無理なので学んだ事をいちいちメモっていくブログです。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

IBMとSunのJVMのリソース使用量の違いについて

のメモ。

《背景》
IBMのDB2をインストールしたサーバでJavaアプリケーションを動かす必要がありました。
DB2をインストールすると同梱のJavaが一緒にインストールされてたので、ちょうど良いと思いそっちにパスを通してアプリを起動するように設定しました。
ところが処理負荷の高い部分でOSがフリーズしたような状態になり、サーバの電源を落とすはめに。。。

《検証》
メモリ使用量などを出力するサンプルプログラムを作成し、IBMとSunの違いを見てみました。
サンプルプログラムの参考
PR

つづきはこちら

CVSからSubversionへの移行時の改行コードに関するメモ(Eclipse利用時)

開発クライアントマシンにWindowsを使用してEclipseを使っている場合のメモ。
Windowsでソースファイルやbatファイル、xmlファイルなどのテキスト形式のファイルを作成すると、改行コードはCR+LFになります。

それをCVSへコミットすると、CVSは改行コードをLFで保存します。

そのファイルをチェックアウトすると改行コードがCR+LFに変換されます。
これはEclipseの設定([チーム]→[CVS])で「プラットフォーム行終了を使用するためにテキスト・ファイルを変換」)を選択しているとそのようになります。

参考

このような動作となる為、CVS利用時は特に問題ありませんでした。

その後、cvs2svnツールでSubversionに移行しましたが、そこで問題が発生。

cvs2svnツールを実行するとき改行コードに関するオプション(--default-eol=CRLF)を指定しなかった為、改行コードLFのままSubversionへ移行されました。

そしてSubclipseプラグインをインストールしてチェックアウトするとテキスト形式のファイルの改行コードが全てLFに。。。
CVSの時のように変換してくれないんですね。

ぐぐったところ、Subversionの設定で「enable-auto-props」という設定で改行コードの変換方法を指定できることがわかりましたが、これはどうやらチェックアウト時ではなくコミット時に設定するプロパティの様子。

参考


結局移行しなおすことにしました。。。

移行時もそうですが、新規にSubversionを利用した開発を開始するときも「enable-auto-props」設定をはじめに整備する必要がありますよね…。

DB2のシステムカタログ

システムカタログ参照方法をメモ。

・テーブル一覧
SELECT TABSCHEMA, TABNAME, DEFINER, TYPE, STATUS, CREATE_TIME
FROM SYSCAT.TABLES
WHERE
TABSCHEMA = '[スキーマ名]' AND
TYPE = 'T'
ORDER BY TABNAME


・ビュー一覧
SELECT TABSCHEMA, TABNAME, DEFINER, TYPE, STATUS, CREATE_TIME
FROM SYSCAT.TABLES
WHERE
TABSCHEMA = '[スキーマ名]' AND
TYPE = 'V'
ORDER BY TABNAME


・インデックス一覧
SELECT INDSCHEMA, INDNAME, DEFINER, TABNAME, COLNAMES, UNIQUERULE, CREATE_TIME
FROM SYSCAT.INDEXES
WHERE
TABSCHEMA = '[スキーマ名]' AND
UNIQUERULE != 'P'
ORDER BY
TABNAME, INDNAME


・ファンクション一覧
SELECT FUNCSCHEMA, FUNCNAME, DEFINER, CREATE_TIME
FROM SYSCAT.FUNCTIONS
WHERE
FUNCSCHEMA = '[スキーマ名]'
ORDER BY
FUNCNAME

DB2のGRANTメモ

ロールを以下の3つに分けたと想定します。
DB_MANAGER : DB管理者(全権限)
SYSTEM_OPERATOR : システム運用保守担当者(更新可)
PUBLIC_USER : 参照専用ユーザ(参照のみ)


すると、各DBオブジェクトへのGRANTは以下のようになります。

・テーブルへのGRANT
GRANT CONTROL ON [スキーマ名].[テーブル名] TO GROUP DB_MANAGER
GRANT SELECT,INSERT,UPDATE,DELETE,REFERENCES ON [スキーマ名].[テーブル名] TO GROUP SYSTEM_OPERATOR
GRANT SELECT ON [スキーマ名].[テーブル名] TO GROUP PUBLIC_USER

・ビューへのGRANT(全部SELECT権限を付与)
GRANT SELECT ON [スキーマ名].[ビュー名] TO GROUP DB_MANAGER
GRANT SELECT ON [スキーマ名].[ビュー名] TO GROUP SYSTEM_OPERATOR
GRANT SELECT ON [スキーマ名].[ビュー名] TO GROUP PUBLIC_USER

・ファンクションへのGRANT(全部EXECUTE権限を付与)
GRANT EXECUTE ON FUNCTION [スキーマ名].[ファンクション名] TO GROUP DB_MANAGER
GRANT EXECUTE ON FUNCTION [スキーマ名].[ファンクション名] TO GROUP SYSTEM_OPERATOR
GRANT EXECUTE ON FUNCTION [スキーマ名].[ファンクション名] TO GROUP PUBLIC_USER

・プロシージャ(全部EXECUTE権限を付与)
GRANT EXECUTE ON PROCEDURE [スキーマ名].[プロシージャ名] TO GROUP DB_MANAGER
GRANT EXECUTE ON PROCEDURE [スキーマ名].[プロシージャ名] TO GROUP SYSTEM_OPERATOR
GRANT EXECUTE ON PROCEDURE [スキーマ名].[プロシージャ名] TO GROUP PUBLIC_USER

参考

LDAP検索

LDAPサーバへ検索条件を指定して検索を実行する場合のメモ。
基本的には、

(属性名=条件値)

のような形式でフィルタ条件を指定します。

・AND検索
(&(objectClass=Person)(cn=Babs*))


・OR検索
(|(objectClass=Person)(cn=Babs*))


・NOT検索
(!(objectClass=Person))


条件値に特殊文字を含む場合はエスケープする必要があります。
public String escape(String str) {

if(str == null) {
return "\\00";
}

// 最初に\をエスケープ
if(str.indexOf("\\") >= 0) {
str = StringUtils.replace(str, "\\", "\\5C");
}

if(str.indexOf("*") >= 0) {
str = StringUtils.replace(str, "*", "\\2A");
}
if(str.indexOf("(") >= 0) {
str = StringUtils.replace(str, "(", "\\28");
}
if(str.indexOf(")") >= 0) {
str = StringUtils.replace(str, ")", "\\29");
}
return str;
}


サンプル。
public void search(String cn) {
String filter = "(cn=*" + escape(cn) + ")";

SearchControls ctls = new SearchControls();
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);

Hashtable env = getEnv();
DirContext dirContext = new InitialDirContext(env);

try {
NamingEnumeration entries = dirContext.search([baseDn], filter, ctls);

while (entries.hasMore()) {
javax.naming.directory.SearchResult entry = (javax.naming.directory.SearchResult) entries.next();

// 省略
}

} finally {
dirContext.close();
}
}

public Hashtable getEnv() {
Hashtable env = new Hashtable();
env.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory");
env.put("java.naming.provider.url", "ldap://" + [LDAPサーバホスト名] + ":" + [LDAPサーバポート番号] + "/");
env.put("java.naming.security.authentication", "simple");
env.put("java.naming.security.principal", "");
env.put("java.naming.security.credentials", "");
return env;
}

参考

HTMLのnameとidの話

id … そのドキュメントで一意。inputタグ以外にもtdやdivなどにも付与できる。
name … そのドキュメントで一意である必要は無い。form、input、buttonタグなどでのみ指定できる。

ということで、以下の通り要素の取得方法が異なります。
・idで要素を指定
var value = document.getElementById('[id]').value;


・nameで要素を指定
var value = document.getElementsByName('[name]').item(0).value;


参考

Accordionのグループラベルのスタイル指定

Accordionのグループラベルのフォントサイズなどを変える場合のスタイル指定方法をメモ。
Accordion {
headerStyleName: labelTextStyle;
}

.labelTextStyle {
font-size: 14;
}

VBAで基数変換(36進とか)

VBAで基数変換を作ったのでメモ。

'基数変換(10進数からN進数へ変換)'
'@param value 変換元10進数'
'@param radix 変換先基数'
Public Function RadixConversion(value As Long, radix As Integer)

Dim remainder As Integer '剰余'
Dim work As Double
Dim result As String

work = CDbl(value)

Do While work > 0
remainder = work Mod radix
result = Mid("0123456789abcdefghijklmnopqrstuvwxyz", remainder + 1, 1) + result
work = WorksheetFunction.Floor(work / radix, 1)
Loop

RadixConversion = result
End Function

使い方。
'9000を36進数に変換'
RadixConversion(9000, 36)


ちなみに16進まではExcel標準の関数でありますね。

SQLServerの小数点第7位の切捨て問題

SQLServer2005で、小数点第7位の切捨て問題回避策についてメモ。

以下のSQLを実行すると、3.666666という結果になります。
select 11 / 3.0


つまり、小数点第7位以下は切捨てになっています。
(四捨五入なら3.666667)

これが会計系のシステムで配賦計算などを行なう際に誤差を大きくする原因となったりしました。

その時とった回避策は以下の通り。

1.一旦計算対象の値を10倍します。⇒ 上の例だと、11×10=110
2.その値に対して計算処理を実施します。⇒ 110÷3=36.666666
3.計算結果を小数点題6位で四捨五入します。⇒ ROUND(36.666666, 5)=36.666670
4.それを最初にかけた値で割ります。⇒ 36.666670÷10=3.666667

これで小数点第7位を切り捨てではなくて四捨五入として扱えます。
上記の例だと10倍して最後に10で割りましたが、もっと小さな値を扱う場合は1000倍とかして計算するともっと精度が上がります。

DB2で制約/Identity有りのテーブルのエクスポート/インポート

外部キー制約やIdentity列がある場合にいろいろ面倒だったのでメモ。

◆エクスポート
db2 connect to [インスタンス名]

db2 export to [エクスポートファイル名] of IXF select * from [スキーマ名].[テーブル名]

db2 terminate

◆インポート
db2 connect to [インスタンス名]

rem 制約オフ
db2 set integrity for [スキーマ名].[テーブル名] off

rem ロード
db2 load client from [エクスポートファイル名] of ixf REPLACE INTO [スキーマ名].[テーブル名] copy yes to nul

rem 制約オン
db2 set integrity for [スキーマ名].[テーブル名] immediate checked

db2 terminate

◆インポート(Identity列がある場合)
db2 connect to [インスタンス名]

rem 制約オフ
db2 set integrity for [スキーマ名].[テーブル名] off

rem ロード
db2 load client from [エクスポートファイル名] of ixf MODIFIED BY identityoverride REPLACE INTO [スキーマ名].[テーブル名] copy yes to nul

rem 制約オン
db2 set integrity for [スキーマ名].[テーブル名] immediate checked

rem シーケンス開始値設定
db2 ALTER TABLE [スキーマ名].[テーブル名] ALTER COLUMN [Identity列名] RESTART WITH [最大値+1]

db2 terminate

[最大値+1]は事前に
SELECT MAX(Identity列名) + 1 FROM [スキーマ名].[テーブル名]
で取得しておきます。
ちなにみシーケンスオブジェクトを使ってPKを採番している場合は、
alter sequence [スキーマ名].[シーケンスオブジェクト名] restart with [最大値+1]
となります。

また、制約オフ、オンは外部キー制約の親テーブルから実行する必要があります。
あと、ロードコマンドの“copy yes to nul”をしないと、ロード完了後にテーブルがバックアップペンディング状態になります。

実際の仕事では親表から順にリストして各コマンドを生成するExcelを作って対応しました。
結構面倒ですよねぇ。

追記:
最初に制約をDROPしてインポート後に制約CREATEという方法もあるみたいです。
ERDツールでFKのDROPを生成するものもあるようですね。
こちらのブログ記事が参考になりました。

Navigation

Copyright ©  Javaってまだいけますか  All Rights Reserved.
  • 忍者ブログ
  • [PR]

menu

ブログ内検索

カテゴリー

カウンター

忍者アド

リンク

最新CM

[07/17 セバ]
[12/27 NONAME]

最新記事

(10/15)
(10/01)
(08/12)
(08/12)
(08/11)

プロフィール

HN:
takacy.k
年齢:
44
性別:
男性
誕生日:
1979/08/13
趣味:
自己紹介:
個人的なメモですので、投稿内容について真偽を保証するものではありません。また、当ブログの内容をご利用になったことによる(以下略)

最新TB

RSS

アーカイブ

アクセス解析