stage.setScene(scene);
stage.show();
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent we) {
System.out.println("Stage is closing");
}
});
2013/08/31
javaFx treeView color style
cannot use the [setStytle] methord...
because there is no such methord of treeItem
can set the style by rewrite the CellFactory
--------
treeView
.setCellFactory(new Callback<TreeView<Object>, TreeCell<Object>>() {
public TreeCell<Object> call(TreeView<Object> param) {
return new TreeCell<Object>() {
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
.......
setStyle(..........)
. ....
}
}
}
}
--------
because there is no such methord of treeItem
can set the style by rewrite the CellFactory
--------
treeView
.setCellFactory(new Callback<TreeView<Object>, TreeCell<Object>>() {
public TreeCell<Object> call(TreeView<Object> param) {
return new TreeCell<Object>() {
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
.......
setStyle(..........)
. ....
}
}
}
}
--------
2013/08/30
hibernate setparameter null
かなり不便だね。。。
=>解決方法
・Criteria=>Restrictions.eqOrIsNull("status", status)
・面倒なやり方:
String statusTerm = status==null ? "is null" : "= :status";
後で判断する
if(status!=null){
query.setParameter("status", status, Hibernate.STRING)
}
=>解決方法
・Criteria=>Restrictions.eqOrIsNull("status", status)
・面倒なやり方:
String statusTerm = status==null ? "is null" : "= :status";
後で判断する
if(status!=null){
query.setParameter("status", status, Hibernate.STRING)
}
2013/08/29
ruby xml操作 REXML
ーファイルーー
<root>
<a name="a1">
<b>bbb1</b>
<b>bbb2</b>
<b>bbb3</b>
<c>ccc1</c>
</a>
<a>
<b>bbb4</b>
<b>bbb5</b>
</a>
<a name="a3" price="100"></a>
</root>
puts doc.elements['root/a/b'].text
=>bbb1
puts doc.elements['root/a[2]/b[2]'].text
=>bbb5
doc.elements.each('root/a/b') do |element|
puts element.text
end
=>bbb1~bbb5
doc.elements.each('root/a[1]/b[2]') do |element|
puts element.previous_element.text
end
=>bbb1
doc.elements.each('root/a[1]/b[2]') do |element|
puts element.next_element.text
end
=>bbb3
doc.elements.each('root/a[1]') do |element|
puts element.name
end
=>a
doc.elements.each('root/a[2]') do |element|
puts element.elements.size
end
=>2
doc.elements.each('root/a[3]') do |element|
puts element.attributes["name"]
end
=>a3
hash = Hash.new
doc.elements.each('root/a[3]') do |element|
hash = element.attributes
end
puts hash.size #=>2
puts hash["name"] #=>a3
doc.elements.each("root/a[@name='a1']/b") do |element|
puts element.text
end
=>bbb1
bbb2
bbb3
puts doc.elements["root/a[@name='a3']"].attributes['price']
=>100
更新する
doc = Document.new File.new("guitars.xml")
elements["color"].text = "Red"
File.write("guitars.xml",doc)
rubyの古いバージョンで上記はエラーになった。
open(path, "w") {|f| f.write doc}
<root>
<a name="a1">
<b>bbb1</b>
<b>bbb2</b>
<b>bbb3</b>
<c>ccc1</c>
</a>
<a>
<b>bbb4</b>
<b>bbb5</b>
</a>
<a name="a3" price="100"></a>
</root>
puts doc.elements['root/a/b'].text
=>bbb1
puts doc.elements['root/a[2]/b[2]'].text
=>bbb5
doc.elements.each('root/a/b') do |element|
puts element.text
end
=>bbb1~bbb5
doc.elements.each('root/a[1]/b[2]') do |element|
puts element.previous_element.text
end
=>bbb1
doc.elements.each('root/a[1]/b[2]') do |element|
puts element.next_element.text
end
=>bbb3
doc.elements.each('root/a[1]') do |element|
puts element.name
end
=>a
doc.elements.each('root/a[2]') do |element|
puts element.elements.size
end
=>2
doc.elements.each('root/a[3]') do |element|
puts element.attributes["name"]
end
=>a3
hash = Hash.new
doc.elements.each('root/a[3]') do |element|
hash = element.attributes
end
puts hash.size #=>2
puts hash["name"] #=>a3
doc.elements.each("root/a[@name='a1']/b") do |element|
puts element.text
end
=>bbb1
bbb2
bbb3
puts doc.elements["root/a[@name='a3']"].attributes['price']
=>100
更新する
doc = Document.new File.new("guitars.xml")
elements["color"].text = "Red"
File.write("guitars.xml",doc)
rubyの古いバージョンで上記はエラーになった。
open(path, "w") {|f| f.write doc}
linux df 単位 sort
df [options] [file...]
主なオプション
-k キロバイト(1,024バイト)単位でサイズを表示
-m メガバイト(1,048,576バイト)単位でサイズを表示
-h サイズに合わせてキロ/メガ/ギガ単位と人が読みやすい単位で表示
-i inode の使用状況をリスト表示
sortと組み合わせて、
★linux sort
・sort -nr
-n 数値順に評価する、デフォルトはアルファベット順
-r 逆順
・sort -k3
-k ソートフィールド指定する
アルファベット順にソートし、第 1・第 2 フィールドは無視する。
3フィールドから末までが比較される。
・sort -t : -k 2,2n -k 5.3,5.4
-t フィールドSEPARATOR
第 2 フィールドの初めから第二文字まで数値的にソートし、
同じになったものを第 5 フィールドの第 3?第 4 文字で更にソートする。
フィールドの区切りとして `:' を用いる。
主なオプション
-k キロバイト(1,024バイト)単位でサイズを表示
-m メガバイト(1,048,576バイト)単位でサイズを表示
-h サイズに合わせてキロ/メガ/ギガ単位と人が読みやすい単位で表示
-i inode の使用状況をリスト表示
sortと組み合わせて、
★linux sort
・sort -nr
-n 数値順に評価する、デフォルトはアルファベット順
-r 逆順
・sort -k3
-k ソートフィールド指定する
アルファベット順にソートし、第 1・第 2 フィールドは無視する。
3フィールドから末までが比較される。
・sort -t : -k 2,2n -k 5.3,5.4
-t フィールドSEPARATOR
第 2 フィールドの初めから第二文字まで数値的にソートし、
同じになったものを第 5 フィールドの第 3?第 4 文字で更にソートする。
フィールドの区切りとして `:' を用いる。
2013/08/26
database catalog schema
いずれもも抽象的な物、名前衝突を防ぐために。。
SQL標準では
catalogー>schemaー>tables,view...
各DBの状況は違う。
SQL標準では
catalogー>schemaー>tables,view...
各DBの状況は違う。
2013/08/21
mysql_config_editor target file
mysql_config_editor の正体
ホームディレクトリしたの
.mylogin.cnf
である
mysql_config_editor print --all
ホームディレクトリしたの
.mylogin.cnf
である
mysql_config_editor print --all
mysql see binlog
=>mysqlbinlog
mysqlbinlog mysql-bin.000100 > /tmp/statement.sql
mysqlbinlog mysql-bin.000100 > /tmp/statement.sql
mysql root password 変更
sudo mysqld_safe --skip-grant-tables
mysql -u root mysql
update user set password=PASSWORD('newPassword') where user='root' and host='localhost';
FLUSH PRIVILEGES;
再起動する
mysql -u root mysql
update user set password=PASSWORD('newPassword') where user='root' and host='localhost';
FLUSH PRIVILEGES;
再起動する
2013/08/19
hibernate Envers Audited 操作履歴
名前通り、操作の履歴を残す..............
keep a record of the changes made in domain entity
@Entity
@Audited
public class MyEntity {
...
}
For each audited entity,a table will be created,
which will hold the history of changes made to the entity
・呼び出す:
AuditReader reader = AuditReaderFactory.get( entityManager );
Event firstRevision = reader.find( Event.class, 2L, 1 );
keep a record of the changes made in domain entity
@Entity
@Audited
public class MyEntity {
...
}
For each audited entity,a table will be created,
which will hold the history of changes made to the entity
・呼び出す:
AuditReader reader = AuditReaderFactory.get( entityManager );
Event firstRevision = reader.find( Event.class, 2L, 1 );
hibernate session.save視点、設定xml
=>視点:物をhibernateに渡す。
creates some new Event objects and hands them over to Hibernate for management, using the save method. Hibernate now takes responsibility to perform an INSERT on the database
★Native Hibernate APIs--->hibernate.cfg.xml
JPA APIs--->persistence.xml
★★
・Sessionとは、永続化サービスの提供を行うもの。DBから取得したオブジェクトを保持し、状態管理を行うもの。永続化サービスでは、「永続化コンテキストに対する変更がDBに反映」されます。
・HibernateのSession管理
★宣言的トランザクションを利用しているときは、org.hibernate.SessionFactory.getCurrentSession()->セッション操作->flushのみでOKです。SessionのクローズやオープンはHibernateが行なってくれます。
session = sessionFactory.getCurrentSession();
//ここにセッション操作のコードを記述
session.flush();
★プログラム内でトランザクション管理を行うとき
プログラム内でトランザクション管理を行うときには、セションのオープン、開始、操作、クローズを全てメソッド内に書かなければなりません。
session = sessionFactory.openSession();
session.beginTransaction();
//ここにセッション操作のコードを記述
session.getTransaction().commit();
session.close();
creates some new Event objects and hands them over to Hibernate for management, using the save method. Hibernate now takes responsibility to perform an INSERT on the database
★Native Hibernate APIs--->hibernate.cfg.xml
JPA APIs--->persistence.xml
★★
・Sessionとは、永続化サービスの提供を行うもの。DBから取得したオブジェクトを保持し、状態管理を行うもの。永続化サービスでは、「永続化コンテキストに対する変更がDBに反映」されます。
・HibernateのSession管理
★宣言的トランザクションを利用しているときは、org.hibernate.SessionFactory.getCurrentSession()->セッション操作->flushのみでOKです。SessionのクローズやオープンはHibernateが行なってくれます。
session = sessionFactory.getCurrentSession();
//ここにセッション操作のコードを記述
session.flush();
★プログラム内でトランザクション管理を行うとき
プログラム内でトランザクション管理を行うときには、セションのオープン、開始、操作、クローズを全てメソッド内に書かなければなりません。
session = sessionFactory.openSession();
session.beginTransaction();
//ここにセッション操作のコードを記述
session.getTransaction().commit();
session.close();
java デーモンスレッド
どんな Java スレッドでもデーモンスレッドになることができる。 デーモンスレッドは、デーモンスレッドと同じ処理を実行する他のスレッドあるいはオブジェクトのためのサービス提供者である。 例えば、HotJava ブラウザは静止画像読取りと命名されたデーモンスレッドを持つ。このデーモンスレッドは、イメージを必要とする任意のオブジェクトあるいはスレッドのために、ファイルシステムあるいはネットワークからイメージを読み込む。
デーモンスレッドは、アプリケーション内で典型的な自立したスレッドであり、同じアプリケーション内の他のオブジェクトにサービスを提供する。 デーモンスレッドの run()メソッドは、サービス要求を待つ典型的な無限ループである。
処理で唯一残っているスレッドがデーモンスレッドのときは、インタプリタは終了する。 デーモンスレッドだけが残っていても、デーモンスレッドがサービスを提供することができる他のスレッドがないので、これは道理にかなっている。
スレッドがデーモンスレッドにあることを明示するためには、真である論理型パラメータで setDaemon() メソッドを呼び出す。 スレッドがデーモンスレッドであるかどうかを判断するためには、アクセス機構メソッド isDaemon() を使用する。
デーモンスレッドは、アプリケーション内で典型的な自立したスレッドであり、同じアプリケーション内の他のオブジェクトにサービスを提供する。 デーモンスレッドの run()メソッドは、サービス要求を待つ典型的な無限ループである。
処理で唯一残っているスレッドがデーモンスレッドのときは、インタプリタは終了する。 デーモンスレッドだけが残っていても、デーモンスレッドがサービスを提供することができる他のスレッドがないので、これは道理にかなっている。
スレッドがデーモンスレッドにあることを明示するためには、真である論理型パラメータで setDaemon() メソッドを呼び出す。 スレッドがデーモンスレッドであるかどうかを判断するためには、アクセス機構メソッド isDaemon() を使用する。
2013/08/19
jave performance analyze tool(memory,thread etc..)
★スレッドダンプ
jps-->jstack->ファイルの内容--->tda-binで分析する
jstack PID
★ヒップダンプ
jmap -dump:format=b,file=** PID
Eclipse MemoryAnalyzer==>heapDumpの情報を分析する
jmap permission denied
=> cmdをアドミンで起動する
★thread info==>visualvm
jps-->jstack->ファイルの内容--->tda-binで分析する
jstack PID
★ヒップダンプ
jmap -dump:format=b,file=** PID
Eclipse MemoryAnalyzer==>heapDumpの情報を分析する
jmap permission denied
=> cmdをアドミンで起動する
★thread info==>visualvm
2013/08/19
プロセス スレッド タスク ジョブなど
・プロセスはプログラムの実行単位である.プロセスは1つ以上のスレッドと、ファイル、ヒープメモリなどのリソースで構成される.
・スレッドは CPU 利用の単位である。スレッドはそれぞれが専用のスタックと CPU レジスタのコピーを保持するが、ファイルやヒー
・プメモリは同一プロセス内の全てのスレッドで共有する。
・スレッドのさらにサブセットがファイバである。スレッドとの違いは切り替え動作にありファイバのほうが軽いというメリットがある
・これはわかりやすい
プロセスはプログラム実行のための固有のメモリ空間を持っており、最も独立性の高い実行単位である反面、起動や切り替えに時間がかかるという特性を持っている。これに対してスレッドはプロセスのサブセットとして動作し、実行に必要なメモリ空間を複数のスレッドで共有。このため起動や切り替えのオーバーヘッドが小さく、“Lightweight Process(軽量プロセス)”とも呼ばれています。ファイバとはスレッドをさらに軽量化したもの。スレッドとの違いは切り替え時の動作にあります。スレッドの切り替えにはユーザーモードからカーネルモードへの移行が必要なのに対し、ファイバではユーザーモードのまま他のファイバへ処理を切り替えることができる。このためスレッドよりもオーバーヘッドが小さく、マルチプロセッサ環境ではプロセッサ毎に同期化スケジュールが作成されるため、プロセッサ間の同期処理で発生するスピンロックも回避できる。
==>it seems that create a thread is very cheaper................
・だから、わからない。。。もやもや
タスクという言葉は曖昧である。(1) プロセスと同じ意味で使われる場合、(2) スレッドのことを指す場合、あるいは (3) プロセスよりも大きな集合として使われる場合もある。
ファイバ ∈ スレッド ∈ プロセス (= タスク)
ファイバ ∈ スレッド (= タスク) ∈ プロセス
ファイバ ∈ スレッド ∈ プロセス ∈ タスク
Linux のカーネル開発者は「スレッド」や「プロセス」というかわりに、「タスク」という言葉をよく使う点に注意。しかし、対外的なドキュメントには、プロセスという言葉を使う。
環境により違う。。ちなみに Windows では個々のアプリケーションはプロセスとして動作するが、それを確認するツールの名前はタスクマネージャーと呼ばれており非常に紛らわしい(まぎらわしい)。Linux の世界でもタスクという言葉は曖昧なようだ
組み込み系ではシステム全体が1つのプロセスであり、それに含まれるスレッドに相当するものがタスクと考えるとしっくりくる
「ジョブ」とは、プロセスと似た概念で、現在実行中のプログラムのことを指す。ジョブとプロセスの違いは、
% ls | more
のようなパイプを使った場合に現れる。ls と more はそれぞれ別のプロセスだが、ls | more はひとつのジョブである。上記の場合、ls を実行したまま more を止める、というような操作は (操作している人にとっては) あまり意味がない。操作している人の立場から見て、複数のプロセスをグループ化したものがジョブである。
スレッドとファイバーの決定的な相違は、スレッドの実行はオペレーティングシステムのスケジューラーに制御されますが、ファイバーの実行はアプリケーションが自ら制御できる点です。オペレーティングシステムは、ファイバーの実行に CPU 時間の割り当て(つまり限定)を行ないません。
見よう見真似で動くプログラムは書けたりするのですが、OS や CPU のレベルですっきりと理解するのはなかなか難しいです。特に処理系による違いまで出てくると…。
ハイパースレッディング、マルチコア、マルチCPUにより擬似的ではなく複数のスレッドが本当に同時に実行されるようになると、そのポテンシャルを出し切るためにはより深い理解が必要になってくると思う
・スレッドは CPU 利用の単位である。スレッドはそれぞれが専用のスタックと CPU レジスタのコピーを保持するが、ファイルやヒー
・プメモリは同一プロセス内の全てのスレッドで共有する。
・スレッドのさらにサブセットがファイバである。スレッドとの違いは切り替え動作にありファイバのほうが軽いというメリットがある
・これはわかりやすい
プロセスはプログラム実行のための固有のメモリ空間を持っており、最も独立性の高い実行単位である反面、起動や切り替えに時間がかかるという特性を持っている。これに対してスレッドはプロセスのサブセットとして動作し、実行に必要なメモリ空間を複数のスレッドで共有。このため起動や切り替えのオーバーヘッドが小さく、“Lightweight Process(軽量プロセス)”とも呼ばれています。ファイバとはスレッドをさらに軽量化したもの。スレッドとの違いは切り替え時の動作にあります。スレッドの切り替えにはユーザーモードからカーネルモードへの移行が必要なのに対し、ファイバではユーザーモードのまま他のファイバへ処理を切り替えることができる。このためスレッドよりもオーバーヘッドが小さく、マルチプロセッサ環境ではプロセッサ毎に同期化スケジュールが作成されるため、プロセッサ間の同期処理で発生するスピンロックも回避できる。
==>it seems that create a thread is very cheaper................
・だから、わからない。。。もやもや
タスクという言葉は曖昧である。(1) プロセスと同じ意味で使われる場合、(2) スレッドのことを指す場合、あるいは (3) プロセスよりも大きな集合として使われる場合もある。
ファイバ ∈ スレッド ∈ プロセス (= タスク)
ファイバ ∈ スレッド (= タスク) ∈ プロセス
ファイバ ∈ スレッド ∈ プロセス ∈ タスク
Linux のカーネル開発者は「スレッド」や「プロセス」というかわりに、「タスク」という言葉をよく使う点に注意。しかし、対外的なドキュメントには、プロセスという言葉を使う。
環境により違う。。ちなみに Windows では個々のアプリケーションはプロセスとして動作するが、それを確認するツールの名前はタスクマネージャーと呼ばれており非常に紛らわしい(まぎらわしい)。Linux の世界でもタスクという言葉は曖昧なようだ
組み込み系ではシステム全体が1つのプロセスであり、それに含まれるスレッドに相当するものがタスクと考えるとしっくりくる
「ジョブ」とは、プロセスと似た概念で、現在実行中のプログラムのことを指す。ジョブとプロセスの違いは、
% ls | more
のようなパイプを使った場合に現れる。ls と more はそれぞれ別のプロセスだが、ls | more はひとつのジョブである。上記の場合、ls を実行したまま more を止める、というような操作は (操作している人にとっては) あまり意味がない。操作している人の立場から見て、複数のプロセスをグループ化したものがジョブである。
スレッドとファイバーの決定的な相違は、スレッドの実行はオペレーティングシステムのスケジューラーに制御されますが、ファイバーの実行はアプリケーションが自ら制御できる点です。オペレーティングシステムは、ファイバーの実行に CPU 時間の割り当て(つまり限定)を行ないません。
見よう見真似で動くプログラムは書けたりするのですが、OS や CPU のレベルですっきりと理解するのはなかなか難しいです。特に処理系による違いまで出てくると…。
ハイパースレッディング、マルチコア、マルチCPUにより擬似的ではなく複数のスレッドが本当に同時に実行されるようになると、そのポテンシャルを出し切るためにはより深い理解が必要になってくると思う
2013/08/19
netstatの見方
netstat[ -a][ -e][ -n][ -s][ -p プロトコル][ -r][ インターバル]
オプションなし
現在の有効な接続(ESTABLISHED)のみを表示する
-a
現在のすべての接続を表示する
-e
インターフェイス・レベル(イーサネット)の統計情報を表示する
-n
出力をIPアドレスなど数値のみに抑制する(DNS逆引きを行わないなど)。ほかのオプション内容へ影響する
-s
プロトコルレベル(IP/TCP/UDP/ICMP)の統計情報を表示する
-p
プロトコルごとの接続をリストする。プロトコルにはTCPかUDPを指定する。-sとともに使用すると、そのプロトコルに関する情報のみの表示を行う
-r
ルーティング・テーブルを表示する
インターバル
この間隔で連続自動実行する。単位は秒
●linux
オプションなし
現在の有効な接続(ESTABLISHED)のみを表示する
-v
詳細モード
-n
出力をIPアドレスなど数値のみに抑制する(DNS逆引きを行わないなど)。ほかのオプション内容へ影響する
-N
インターフェイス名の解決を行う
-c
連続表示
-a
現在のすべての接続を表示する
-e
拡張表示モード。eeでさらに拡張された表示を行う(主に-rオプションと組み合わせて用いる)
-o
ネットワーク・タイマを表示する
-l
LISTEN状態の接続のみを表示する
ソケットレベル
表示するソケット種別を指定する。TCP(「-t」または「--tcp」)、UDP(「-u」または「--udp」)、そのほかRAWやICMPなど(「-w」または「--raw」)、UNIXドメイン・ソケット(「-x」または「--unix」:-sオプションでは無効)などが指定できる。省略されると表示可能なソケットすべて
-i
★★インターフェイスごとのパケット統計を表示する
-M
マスカレード接続の表示を行う==>maskCodeなどよね。。。。
-s
ネットワーク統計を表示する
-t | -u | -w
TCP(「-t」)、UDP(「-u」)、そのほかIPとICMP(「-w」)のみ表示する
-C
カーネル・キャッシュでのルーティング・テーブル情報を表示する
-F
FIB(Forwarding Information Base:Linuxにおけるルーティング・テーブルの実装方式。あて先IPアドレスをキーに経路情報を効率的に配置して、性能の向上を図っている)。テーブルからのルーティング・テーブル情報を表示する
-r
ルーティング・テーブル情報を表示する 表示される内容などはrouteコマンドとほぼ同様
-A
プロトコル種別ごとに結果を表示する。デフォルトは「inet(IPv4)」。「ipx(IPX)」「inet6(IPv6)」などが使用できる
-V
バージョン情報を表示する
-h
ヘルプを表示する
★UNIXドメインソケット(英: UNIX domain socket)や IPCソケット とは、単一のオペレーティングシステム内で実行されるプロセス間でデータを交換するためのデータ通信の終点
★アドレスが「0.0.0.0」となっている場合は、そのソケットはホストに存在するあらゆるIPアドレスとも結び付けられている
★ICMP==>TCP/IPで接続されたコンピュータやネットワーク機器間で、互いの状態を確認するために用いられる。ネットワーク診断プログラムpingが使う
★netstat -s
==>こうした統計からは、そのホストでのプロトコルごとの処理の様子、正常にネットワーク機能が動作しているかどうかをうかがうことができる
==>OS起動時からの積算値だ
Ip:
4567071 total packets received
1 with invalid addresses
0 forwarded 自身で受信したのではなく、ほかのホストのために転送したIPパケット数
0 incoming packets discarded 上位プロトコル(TCP/UDPなど)へ届けられずに破棄された受信IPパケット数
4567066 incoming packets delivered 上位プロトコル(TCP/UDPなど)へ正常に届けられた受信IPパケット数
4082404 requests sent out 下位プロトコル(イーサネットなど)へ転送できた送信IPパケット総数
16 dropped because of missing route
Tcp:
1882 active connections openings クライアントとしての動作した総数
466473 passive connection openings サーバーとしての動作した総数
11 failed connection attempts
244 connection resets received
11 connections established 現在のコネクション総数。「netstat -a」でより詳細を確認できる
4540710 segments received
5162356 segments send out
117 segments retransmited
0 bad segments received.
96 resets sent
ソケットの状態(Active Internet connectionに表示されるState)。
「ESTABLISHED」は接続が確立したソケット
「SYN_SENT」は接続を試みているソケット
「SYN_RECV」は接続要求を受信しているソケット
「FIN_WAIT1」は切断中のソケット
「FIN_WAIT2」はリモートからの切断を待っているソケット
「TIME_WAIT」はリモートからの切断が再送されるのを待っているソケット
「CLOSED」は未使用なソケット
「CLOSE_WAIT」はリモート側から切断され、ソケットがクローズされるのを待っているソケット
「LAST_ACK」はすでに切断されており、ソケットもクローズされているソケット
「LISTEN」は接続待ちのソケット
「CLOSING」はソケットが切断されているか、すべてのデータが転送されていないソケット
「UNKNOWN」は状態が不明なソケットを表す
オプションなし
現在の有効な接続(ESTABLISHED)のみを表示する
-a
現在のすべての接続を表示する
-e
インターフェイス・レベル(イーサネット)の統計情報を表示する
-n
出力をIPアドレスなど数値のみに抑制する(DNS逆引きを行わないなど)。ほかのオプション内容へ影響する
-s
プロトコルレベル(IP/TCP/UDP/ICMP)の統計情報を表示する
-p
プロトコルごとの接続をリストする。プロトコルにはTCPかUDPを指定する。-sとともに使用すると、そのプロトコルに関する情報のみの表示を行う
-r
ルーティング・テーブルを表示する
インターバル
この間隔で連続自動実行する。単位は秒
●linux
オプションなし
現在の有効な接続(ESTABLISHED)のみを表示する
-v
詳細モード
-n
出力をIPアドレスなど数値のみに抑制する(DNS逆引きを行わないなど)。ほかのオプション内容へ影響する
-N
インターフェイス名の解決を行う
-c
連続表示
-a
現在のすべての接続を表示する
-e
拡張表示モード。eeでさらに拡張された表示を行う(主に-rオプションと組み合わせて用いる)
-o
ネットワーク・タイマを表示する
-l
LISTEN状態の接続のみを表示する
ソケットレベル
表示するソケット種別を指定する。TCP(「-t」または「--tcp」)、UDP(「-u」または「--udp」)、そのほかRAWやICMPなど(「-w」または「--raw」)、UNIXドメイン・ソケット(「-x」または「--unix」:-sオプションでは無効)などが指定できる。省略されると表示可能なソケットすべて
-i
★★インターフェイスごとのパケット統計を表示する
-M
マスカレード接続の表示を行う==>maskCodeなどよね。。。。
-s
ネットワーク統計を表示する
-t | -u | -w
TCP(「-t」)、UDP(「-u」)、そのほかIPとICMP(「-w」)のみ表示する
-C
カーネル・キャッシュでのルーティング・テーブル情報を表示する
-F
FIB(Forwarding Information Base:Linuxにおけるルーティング・テーブルの実装方式。あて先IPアドレスをキーに経路情報を効率的に配置して、性能の向上を図っている)。テーブルからのルーティング・テーブル情報を表示する
-r
ルーティング・テーブル情報を表示する 表示される内容などはrouteコマンドとほぼ同様
-A
プロトコル種別ごとに結果を表示する。デフォルトは「inet(IPv4)」。「ipx(IPX)」「inet6(IPv6)」などが使用できる
-V
バージョン情報を表示する
-h
ヘルプを表示する
★UNIXドメインソケット(英: UNIX domain socket)や IPCソケット とは、単一のオペレーティングシステム内で実行されるプロセス間でデータを交換するためのデータ通信の終点
★アドレスが「0.0.0.0」となっている場合は、そのソケットはホストに存在するあらゆるIPアドレスとも結び付けられている
★ICMP==>TCP/IPで接続されたコンピュータやネットワーク機器間で、互いの状態を確認するために用いられる。ネットワーク診断プログラムpingが使う
★netstat -s
==>こうした統計からは、そのホストでのプロトコルごとの処理の様子、正常にネットワーク機能が動作しているかどうかをうかがうことができる
==>OS起動時からの積算値だ
Ip:
4567071 total packets received
1 with invalid addresses
0 forwarded 自身で受信したのではなく、ほかのホストのために転送したIPパケット数
0 incoming packets discarded 上位プロトコル(TCP/UDPなど)へ届けられずに破棄された受信IPパケット数
4567066 incoming packets delivered 上位プロトコル(TCP/UDPなど)へ正常に届けられた受信IPパケット数
4082404 requests sent out 下位プロトコル(イーサネットなど)へ転送できた送信IPパケット総数
16 dropped because of missing route
Tcp:
1882 active connections openings クライアントとしての動作した総数
466473 passive connection openings サーバーとしての動作した総数
11 failed connection attempts
244 connection resets received
11 connections established 現在のコネクション総数。「netstat -a」でより詳細を確認できる
4540710 segments received
5162356 segments send out
117 segments retransmited
0 bad segments received.
96 resets sent
ソケットの状態(Active Internet connectionに表示されるState)。
「ESTABLISHED」は接続が確立したソケット
「SYN_SENT」は接続を試みているソケット
「SYN_RECV」は接続要求を受信しているソケット
「FIN_WAIT1」は切断中のソケット
「FIN_WAIT2」はリモートからの切断を待っているソケット
「TIME_WAIT」はリモートからの切断が再送されるのを待っているソケット
「CLOSED」は未使用なソケット
「CLOSE_WAIT」はリモート側から切断され、ソケットがクローズされるのを待っているソケット
「LAST_ACK」はすでに切断されており、ソケットもクローズされているソケット
「LISTEN」は接続待ちのソケット
「CLOSING」はソケットが切断されているか、すべてのデータが転送されていないソケット
「UNKNOWN」は状態が不明なソケットを表す
2013/08/19
top 見方
top - 20:00:27 up 2 days, 2:19, 6 users, load average: 0.58, 0.56, 0.54
・20:00:27 現在時刻(20時00分27秒)
・up 2 days, 2:19 稼働時間(2日と2時間19分稼働中)
・6users ログインユーザ数(6ユーザがログイン中)
・ロードアベレージ 左から「過去1分」「過去5分」「過去15分」
==>一行目はuptimeと同じである
Tasks: 60 total, 1 running, 59 sleeping, 0 stopped, 0 zombie
=>2行目、タスクの情報 タスクで何??複数なプロセスであると思う。。job?
Cpu(s): 1.9%us, 0.9%sy, 0.0%ni, 95.3%id, 1.9%wa, 0.0%hi, 0.0%si, 0.0%st
us ユーザプロセスの使用時間
sy システムプロセスの使用時間
ni 実行優先度を変更したユーザプロセスの使用時間
id アイドル状態の時間
wa I/Oの終了待ちをしている時間
hi ハードウェア割込み要求での使用時間
si ソフトウェア割込み要求での使用時間
Mem: 4058252k total, 2060384k used, 1997868k free, 146136k buffers
freeコマンドを実行したときのような感じとなります。free -b -k -m -g
Swap: 2064380k total, 0k used, 2064380k free, 1527784k cached
6行目からは実行中のプロセス(タスク)の詳細表示になります。
PID プロセスID
USER プロセスを実行しているユーザ
PR プロセスの優先度
NI ナイス値(相対的優先度)-20(最高)~19(最低)
VIRT プロセスの仮想メモリサイズ(スワップアウトしたメモリ使用量を加えたメモリ量)
RES プロセスが使用している物理(スワップされていない)メモリサイズ
SHR プロセスが使用している共有メモリ
S プロセスの状態(Running Sleep)
%CPU CPU使用率
%MEM 実メモリ使用率
TIME+ プロセスの実行時間(秒)
COMMAND 現在実行中のコマンド名
★★ 実行中表示順
Shift+o 選択画面
・20:00:27 現在時刻(20時00分27秒)
・up 2 days, 2:19 稼働時間(2日と2時間19分稼働中)
・6users ログインユーザ数(6ユーザがログイン中)
・ロードアベレージ 左から「過去1分」「過去5分」「過去15分」
==>一行目はuptimeと同じである
Tasks: 60 total, 1 running, 59 sleeping, 0 stopped, 0 zombie
=>2行目、タスクの情報 タスクで何??複数なプロセスであると思う。。job?
Cpu(s): 1.9%us, 0.9%sy, 0.0%ni, 95.3%id, 1.9%wa, 0.0%hi, 0.0%si, 0.0%st
us ユーザプロセスの使用時間
sy システムプロセスの使用時間
ni 実行優先度を変更したユーザプロセスの使用時間
id アイドル状態の時間
wa I/Oの終了待ちをしている時間
hi ハードウェア割込み要求での使用時間
si ソフトウェア割込み要求での使用時間
Mem: 4058252k total, 2060384k used, 1997868k free, 146136k buffers
freeコマンドを実行したときのような感じとなります。free -b -k -m -g
Swap: 2064380k total, 0k used, 2064380k free, 1527784k cached
6行目からは実行中のプロセス(タスク)の詳細表示になります。
PID プロセスID
USER プロセスを実行しているユーザ
PR プロセスの優先度
NI ナイス値(相対的優先度)-20(最高)~19(最低)
VIRT プロセスの仮想メモリサイズ(スワップアウトしたメモリ使用量を加えたメモリ量)
RES プロセスが使用している物理(スワップされていない)メモリサイズ
SHR プロセスが使用している共有メモリ
S プロセスの状態(Running Sleep)
%CPU CPU使用率
%MEM 実メモリ使用率
TIME+ プロセスの実行時間(秒)
COMMAND 現在実行中のコマンド名
★★Process STAT | プロセスの状態 |
【S】スリープ状態 | |
【T】停止中 | |
【D】割り込み不可(sleep) | |
【N】ナイス値がプラスの状態 | |
【<】ナイス値がマイナスの状態 | |
【R】実行中 | |
【Z】ゾンビ状態 | |
【W】スワップアウト状態 |
★★ 実行中表示順
Shift+o 選択画面
Shift + n | プロセスID順 |
Shift + a | 新しいタスク順 |
Shift + p | CPUの使用時間率の長いもの順 |
Shift + m | メモリ使用量が多いもの順 |
Shift + t | 実行時間が長い順 |
u | 特定のユーザ権限のプロセスだけを表示 |
s | TOPコマンドの更新間隔(デフォルトでは5秒)を秒単位で指定します。 |
q | TOPコマンドを即座に終了させます。【Ctrl+c】も同様。 |
Eclipse SVN情報 カスタマイズ
★メニュー "ウィンドウ > 設定" を実行する。
設定ダイアログの "一般 > 外観 > ラベルと装飾" を選択する。
ラベル装飾で次の3つのチェックを外す。
SVN プロジェクト
SVN リソース
SVN ワーキング・セット
★SVN リソース・デコレーターをカスタマイズするには、
「チーム」>「SVN」>「ラベル装飾」と選択する
{author}==>最終修正者
設定ダイアログの "一般 > 外観 > ラベルと装飾" を選択する。
ラベル装飾で次の3つのチェックを外す。
SVN プロジェクト
SVN リソース
SVN ワーキング・セット
★SVN リソース・デコレーターをカスタマイズするには、
「チーム」>「SVN」>「ラベル装飾」と選択する
{author}==>最終修正者
2013/08/18
javafx fixed size label ect.
put it into a HBox
like the blow:
HBox nameHBox = new HBox();
nameHBox.setAlignment(Pos.CENTER_LEFT);
nameHBox.setPrefHeight(22);
nameHBox.setPrefWidth(100);
CheckBox checkBox = new CheckBox();
checkBox.setId(CHECKBOX + dto.getId());
checkBox.setMnemonicParsing(false);
checkBox.setText(dto.getName());
checkBox.setSelected(true);
nameHBox.getChildren().add(checkBox);
result.getChildren().add(nameHBox);
like the blow:
HBox nameHBox = new HBox();
nameHBox.setAlignment(Pos.CENTER_LEFT);
nameHBox.setPrefHeight(22);
nameHBox.setPrefWidth(100);
CheckBox checkBox = new CheckBox();
checkBox.setId(CHECKBOX + dto.getId());
checkBox.setMnemonicParsing(false);
checkBox.setText(dto.getName());
checkBox.setSelected(true);
nameHBox.getChildren().add(checkBox);
result.getChildren().add(nameHBox);
2013/08/17
2013/08/17
selenium server stop command line
Start and Stop Selenium Server:
- Start: (Command line)java -jar selenium-server-standalone-2.0b3.jar
- Stop: (Browser)
- http://localhost:4444/selenium-server/driver/?cmd=shutDownSeleniumServer
2013/08/16
java.util.concurrent.locks.Condition sampleなどmultithread
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
※実行中のスレッドいつ停止?
・当线程A试图去获得一个JUC锁,但这个锁却已经被另外一个线程获得,那么线程A不得不“停止”,直到这个锁被释放或者超时。
・当线程A调用了java.util.concurrent.locks.Condition的任意一个“等待”的API,线程A会停止执行,直到另外一个线程通知它或者超时。
※
多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问。要想实现线程的同步,则这些线程必须去竞争一个唯一的共享的对象锁。
=>共享的资源是必须的,要不然大家没有关系了吗,也就不会相互同步了...
.
※
虽然run()函数实现了多个线程的并行处理,但我们不能直接调用run()函数,而是通过调用start()函数来调用run()函数。在调用 start()的时候,start()函数会首先进行与多线程相关的初始化(这也是为什么不能直接调用run()函数的原因),然后再调用run()函数
※
我们只用new产生Thread对象,并没有用reference来记录所产生的Thread对象。根据垃圾回收机制,当一个对象没有被 reference引用时,它将被回收。但是垃圾回收机制对Thread对象“不成立”。因为每一个Thread都会进行注册动作,所以即使我们在产生 Thread对象时没有指定一个reference指向这个对象,实际上也会在某个地方有个指向该对象的reference,所以垃圾回收器无法回收它 们。
※
suspend()函数只是让当前线程进入停滞状态,但并不释放当前线程所获得的“锁标志”。当前对象的“锁标志”仍被线程占有。
※JAVA对象里内置了隐性的锁, 用synchronized时就使用了相关对象的锁...
※MAIN也是一个线程,通过currentThead()可以获取它,对它进行控制
★SynchronousQueue のおかげで、キューに挿入された項目を利用しようと待機しているスレッドがない限りキューに挿入することはできません.
==>要するに、怖い消費者が生産ラインで待っている。
物を生産しInsertの後、すぐ別のスレッドがそれを取り出して消費する。
容量がないQueue
★Semaphore=>スレッドの定員、その数超えたスレッドがparkingにする(WAITING) Semaphore.acquire(); Semaphore.release()
java.lang.Thread.State: WAITING (parking)=>has no right to run.
★CountDownLatch クラスは特定の条件が満たされるまですべてのスレッドを保留し、その条件が満たされると、すべてのスレッドを同時に解放
==>「よい準備、3、2、1、スタート。。」の感じだね。。CountDownLatch名前の通り。
★スレッドの新作成と再利用
=>
一部の JVM では Thread の作成は非常に面倒な作業であり、既存の Thread を再利用した方が新しい Thread を作成するよりもはるかに望ましい。
しかし他の JVM では、それがまったく逆。つまり Thread は非常に軽量であり、必要な時に new によって単純に新しい Thread を作成した方がはるかに望ましい。
==>なにこれ、困るね。。。
===>JSR-166 Expert Group (「参考文献」を参照) は、この状況をある程度想定した。Java 開発者に Thread を直接作成させる代わりに、彼らは新しいスレッドを作成するための抽象インターフェース Executor を導入し、スレッドを作成することができた
====>こいつらたちが、問題を回避したね。。。みえなくなった。。。
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
※実行中のスレッドいつ停止?
・当线程A试图去获得一个JUC锁,但这个锁却已经被另外一个线程获得,那么线程A不得不“停止”,直到这个锁被释放或者超时。
・当线程A调用了java.util.concurrent.locks.Condition的任意一个“等待”的API,线程A会停止执行,直到另外一个线程通知它或者超时。
※
多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问。要想实现线程的同步,则这些线程必须去竞争一个唯一的共享的对象锁。
=>共享的资源是必须的,要不然大家没有关系了吗,也就不会相互同步了...
.
※
虽然run()函数实现了多个线程的并行处理,但我们不能直接调用run()函数,而是通过调用start()函数来调用run()函数。在调用 start()的时候,start()函数会首先进行与多线程相关的初始化(这也是为什么不能直接调用run()函数的原因),然后再调用run()函数
※
我们只用new产生Thread对象,并没有用reference来记录所产生的Thread对象。根据垃圾回收机制,当一个对象没有被 reference引用时,它将被回收。但是垃圾回收机制对Thread对象“不成立”。因为每一个Thread都会进行注册动作,所以即使我们在产生 Thread对象时没有指定一个reference指向这个对象,实际上也会在某个地方有个指向该对象的reference,所以垃圾回收器无法回收它 们。
※
suspend()函数只是让当前线程进入停滞状态,但并不释放当前线程所获得的“锁标志”。当前对象的“锁标志”仍被线程占有。
※JAVA对象里内置了隐性的锁, 用synchronized时就使用了相关对象的锁...
※MAIN也是一个线程,通过currentThead()可以获取它,对它进行控制
★SynchronousQueue のおかげで、キューに挿入された項目を利用しようと待機しているスレッドがない限りキューに挿入することはできません.
==>要するに、怖い消費者が生産ラインで待っている。
物を生産しInsertの後、すぐ別のスレッドがそれを取り出して消費する。
容量がないQueue
★Semaphore=>スレッドの定員、その数超えたスレッドがparkingにする(WAITING) Semaphore.acquire(); Semaphore.release()
java.lang.Thread.State: WAITING (parking)=>has no right to run.
★CountDownLatch クラスは特定の条件が満たされるまですべてのスレッドを保留し、その条件が満たされると、すべてのスレッドを同時に解放
==>「よい準備、3、2、1、スタート。。」の感じだね。。CountDownLatch名前の通り。
★スレッドの新作成と再利用
=>
一部の JVM では Thread の作成は非常に面倒な作業であり、既存の Thread を再利用した方が新しい Thread を作成するよりもはるかに望ましい。
しかし他の JVM では、それがまったく逆。つまり Thread は非常に軽量であり、必要な時に new によって単純に新しい Thread を作成した方がはるかに望ましい。
==>なにこれ、困るね。。。
===>JSR-166 Expert Group (「参考文献」を参照) は、この状況をある程度想定した。Java 開発者に Thread を直接作成させる代わりに、彼らは新しいスレッドを作成するための抽象インターフェース Executor を導入し、スレッドを作成することができた
====>こいつらたちが、問題を回避したね。。。みえなくなった。。。
2013/08/14
2013/08/14
excel カタカナをひらがなに変換
PHONETIC関数
2013/08/07
linux RPMでインストールしたファイルを調べるには 場所など
rpm -qa | grep で名前を確定し
rpm -qs ....で
例:
rpm -qs MySQL-client-5.6.11-2.rhel5.x86_64
通常 /usr/bin/msql2mysql
通常 /usr/bin/mysql
通常 /usr/bin/mysql_config_editor
通常 /usr/bin/mysql_find_rows
通常 /usr/bin/mysql_waitpid
通常 /usr/bin/mysqlaccess
通常 /usr/bin/mysqlaccess.conf
通常 /usr/bin/mysqladmin
★問い合わせオプション (-q または --query):
-c, --configfiles 全ての設定ファイルを列挙します。
-d, --docfiles 全てのドキュメントファイルを列挙します。
--dump 基本的なファイル情報をダンプします。
-l, --list パッケージ中のファイルを列挙します。
--queryformat=QUERYFORMAT 以下の問い合わせフォーマットを使用します。
-s, --state 列挙したファイルの状態を表示します。
rpm -qs ....で
例:
rpm -qs MySQL-client-5.6.11-2.rhel5.x86_64
通常 /usr/bin/msql2mysql
通常 /usr/bin/mysql
通常 /usr/bin/mysql_config_editor
通常 /usr/bin/mysql_find_rows
通常 /usr/bin/mysql_waitpid
通常 /usr/bin/mysqlaccess
通常 /usr/bin/mysqlaccess.conf
通常 /usr/bin/mysqladmin
★問い合わせオプション (-q または --query):
-c, --configfiles 全ての設定ファイルを列挙します。
-d, --docfiles 全てのドキュメントファイルを列挙します。
--dump 基本的なファイル情報をダンプします。
-l, --list パッケージ中のファイルを列挙します。
--queryformat=QUERYFORMAT 以下の問い合わせフォーマットを使用します。
-s, --state 列挙したファイルの状態を表示します。
bash multiply
足し算
expr $a + 2
引き算
expr $a - 2
割り算
expr $a / 2
掛け算
expr $a * 2
ではなく、
expr $a \* 2
expr $a + 2
引き算
expr $a - 2
割り算
expr $a / 2
掛け算
expr $a * 2
ではなく、
expr $a \* 2
bash test option
・-eq → equal
・-ne → not equal
・-lt → less than
・-le → less than or equal
・-gt → greater than
・-ge → greater than or equal
-z test -z string string の文字列長が 0 ならば真となる。
-n test -n string string の文字列長が 0 より大ならば真となる。
-d test -d file file がディレクトリならば真となる。
-f test -f file file が普通のファイルならば真となる。
-s test -s file file が 0 より大きいサイズならば真となる。
-e test -e file file が存在するならば真となる。
-r test -r file file が読み取り可能ならば真となる。
-w test -w file file が書き込み可能ならば真となる。
-x test -x file file が実行可能ならば真となる。
・-ne → not equal
・-lt → less than
・-le → less than or equal
・-gt → greater than
・-ge → greater than or equal
-z test -z string string の文字列長が 0 ならば真となる。
-n test -n string string の文字列長が 0 より大ならば真となる。
-d test -d file file がディレクトリならば真となる。
-f test -f file file が普通のファイルならば真となる。
-s test -s file file が 0 より大きいサイズならば真となる。
-e test -e file file が存在するならば真となる。
-r test -r file file が読み取り可能ならば真となる。
-w test -w file file が書き込み可能ならば真となる。
-x test -x file file が実行可能ならば真となる。
2013/08/07
JPA DB更新 排他処理 ロック
★楽観的ロック
レコード毎にバージョン番号を持ち、まず最初に対象となるデータを取得しておき、更新時にDB上の対象データのバージョン番号に変化が無いか調べ、変化があれば「自分より前に、自分以外の誰かが更新した=このまま登録しては他人の変更を上書きしてしまうのでダメ」、変化がなければ「誰にも更新されていない=そのまま更新してよい=その一瞬だけロックして書き込んですぐに開放する」と判断するというのが楽観的ロック。CVS、SVNなどのリビジョン番号での管理がこれに当たる。
この楽観的ロックに関する機能がJPAには備わっているというので、
エンティティでバージョン番号を意味する列に「 @Version」アノテーションを付加するだけ!
@Entity
@Table(name="sample_entity")
public class SampleEntity implements Serializable {
@Id
@Column(unique=true, nullable=false, length=100)
private String key;
@Column(nullable=false, length=100)
private String val;
@Version
@Column(nullable=false)
private long revision;
…
このようなエンティティクラスを使用して更新処理を行った場合、エラーの無い場合(新規登録時含む)はそのまま処理が進み、排他エラーになった場合はOptimisticLockExceptionが発生する。
★悲観的ロック
操作開始から終了までずっとロックしっぱなしにして、その間は他からの更新を許さないのが悲観的ロック。
ロックをかける方法は主に以下の二つ。
検索時にロック
任意のタイミングでロック
// 検索時にロックする場合・主キー検索
SampleEntity entity1 =
em.find(SampleEntity.class, "abc",
LockModeType.PESSIMISTIC_WRITE);
// 検索時にロックする場合・複数件検索
List<SampleEntity> entities =
em.createQuery("select s from SampleEntity s")
.setLockMode(LockModeType.PESSIMISTIC_WRITE)
.getResultList();
// 任意のタイミングでロックする場合
SampleEntity entity2 = em.find(SampleEntity.class, "abc");
em.lock(entity2, LockModeType.PESSIMISTIC_WRITE);
レコード毎にバージョン番号を持ち、まず最初に対象となるデータを取得しておき、更新時にDB上の対象データのバージョン番号に変化が無いか調べ、変化があれば「自分より前に、自分以外の誰かが更新した=このまま登録しては他人の変更を上書きしてしまうのでダメ」、変化がなければ「誰にも更新されていない=そのまま更新してよい=その一瞬だけロックして書き込んですぐに開放する」と判断するというのが楽観的ロック。CVS、SVNなどのリビジョン番号での管理がこれに当たる。
この楽観的ロックに関する機能がJPAには備わっているというので、
エンティティでバージョン番号を意味する列に「 @Version」アノテーションを付加するだけ!
@Entity
@Table(name="sample_entity")
public class SampleEntity implements Serializable {
@Id
@Column(unique=true, nullable=false, length=100)
private String key;
@Column(nullable=false, length=100)
private String val;
@Version
@Column(nullable=false)
private long revision;
…
このようなエンティティクラスを使用して更新処理を行った場合、エラーの無い場合(新規登録時含む)はそのまま処理が進み、排他エラーになった場合はOptimisticLockExceptionが発生する。
★悲観的ロック
操作開始から終了までずっとロックしっぱなしにして、その間は他からの更新を許さないのが悲観的ロック。
ロックをかける方法は主に以下の二つ。
検索時にロック
任意のタイミングでロック
// 検索時にロックする場合・主キー検索
SampleEntity entity1 =
em.find(SampleEntity.class, "abc",
LockModeType.PESSIMISTIC_WRITE);
// 検索時にロックする場合・複数件検索
List<SampleEntity> entities =
em.createQuery("select s from SampleEntity s")
.setLockMode(LockModeType.PESSIMISTIC_WRITE)
.getResultList();
// 任意のタイミングでロックする場合
SampleEntity entity2 = em.find(SampleEntity.class, "abc");
em.lock(entity2, LockModeType.PESSIMISTIC_WRITE);
2013/08/06
javaFX comboBox setItem default Selected
@FXML ComboBox<String> box;
box.getItems().addAll(KeyValuePairs.MODEL_TYPE);
box.getSelectionModel().select(3);
===>OK
box.setItems(KeyValuePairs.MODEL_TYPE);
box.getSelectionModel().select(3);
==>OK
box.getItems().addAll(KeyValuePairs.MODEL_TYPE);
box.getSelectionModel().select(3);
===>OK
box.setItems(KeyValuePairs.MODEL_TYPE);
box.getSelectionModel().select(3);
==>OK
java multiply bigDecimal 桁数
new BigDecimal("1.05").multiply(new BigDecimal("9")).doubleValue();
=>9.45
new BigDecimal(1.05).multiply(new BigDecimal(9)).doubleValue();
=>9.4500000000000167
String型でよかった。。。。
とりあえずあやしい。。自然に計算できれば。。。
良くわからず。。
=>9.45
new BigDecimal(1.05).multiply(new BigDecimal(9)).doubleValue();
=>9.4500000000000167
String型でよかった。。。。
とりあえずあやしい。。自然に計算できれば。。。
良くわからず。。