yuu_nkjm blog
2011-03-05(Sat) [長年日記] 編集
[Java][Swing] Javaで半透明表示をするときにはまったことのメモ
Javaで半透明表示をするときにはまったことのメモ.
塗りつぶし
背景色にアルファ値を設定して透過性を持たせた場合,描画を繰り返すとすると黒く塗りつぶされていってしまう.以下の様なコードを書くことで防げるそうだが,透過に透過を重ねている場合,これを全てに書くのは大変だし,意図通り動作するのか分からなかった..
JTableの背景色にアルファ値を設定して透過性を持たせた場合、デフォルトのBooleanRendererでは色が濃くなる(二重に描画される?)ので、paintComponentメソッドを以下のようにオーバーライドしています。
@Override protected void paintComponent(Graphics g) {
if(!isOpaque()) {
g.setColor(getBackground());
g.fillRect(0,0,getWidth(),getHeight());
}
super.paintComponent(g);
}
JScrollPane
JScrollPaneで透過をするには,JScrollPaneに貼り付けるコンポーネントだけでなく,ViewportのOpaqueの設定をを忘れずに.
scrollPane.getViewport().setOpaque(false)
JDesktopPaneやJFrame
ピクセル単位透過ウィンドウ
ピクセル透過は setWindowOpaque() の opaque に false を指定することで有効にする事が出来ます (この時点で完全な透明になります)。この機能が利用できるウィンドウの条件は以下の通りです。
- ピクセル単位透過をサポートするグラフィック構成を使用しているウィンドウ。つまりウィンドウに設定されている GraphicsConfiguration に対して isTranslucencyCapable() が true を返す必要があります。
- タイトルバーやウィンドウ境界を持たないウィンドウ。JFrame などを使用する場合は setUndecorated(true) でウィンドウ装飾を無効にしておく必要があります (このためウィンドウのクローズや移動は自分で実装する必要があります)。ピクセル透過が有効なウィンドウに対して undecorated に false を指定するとピクセル透過も無効になります。
- フルスクリーンでないウィンドウ。ピクセル透過を有効にしたウィンドウをフルスクリーンにしようとすると IllegalArgumentException が発生します。
ピクセル単位透過ウィンドウを使うにはsetUndecorated(true)をする必要がある.これは,JFrame.setDefaultLookAndFeelDecorated(true)を呼ぶことによっても呼べる.
透過とは直接関係ないが,JDesktopPaneのタイトルバーはJInternalFrameのタイトルバーな気がする.これもsetUndecorated(true)でオフに出来るのか?
AWTUtilitiesまとめ
単純透過ウィンドウピクセル単位透過ウィンドウ
Class com.sun.awt.AWTUtilities Method public static void setWindowOpacity(Window window, float opacity) throws UnsupportedOperationException; public static float getWindowOpacity(Window window);フルスクリーン画面 キオスク端末のような排他フルスクリーン画面を出す場合は GraphicsDevice の以下のメソッドを使用する。
Class com.sun.awt.AWTUtilities Method public static void setWindowOpaque(Window window, boolean opaque); public static boolean isWindowOpaque(Window window);フルスクリーンがサポートされていないプラットフォームではパフォーマンスが落ちる。 範囲が限られているなら try-catch で囲ったほうが安全性が高まる。 通常は setUndecorated() でウィンドウの装飾をオフにしておいたほうが良い。 通常はウィンドウをリサイズ不可にしておいたほうが良い。 アプレットからは権限を与えてやらないとフルスクリーンにはできない。
public boolean isFullScreenSupported() public void setFullScreenWindow(Window)
2011-03-06(Sun) [長年日記] 編集
[Java] JVMのシャットダウンをフックする
Runtime.getRuntime().addShutdownHook( new Thread() {
public void run() {
System.out.println("Shutdown!!");
}
});
関連ページ
- Runtime#addShutdownHook() - うなの日記
-
ちょっと気になったので確認。System.exit()だとfinallyブロックもスルーされるんだったよね!
2011-03-07(Mon) [長年日記] 編集
[Java] JVMの実行環境のOSを判定
System (Java 2 Platform SE 5.0)を使えば,OS名が取れる.
System.getProperty("os.name");
もしくは,SystemUtils (Commons Lang 2.6 API)を使う.
if(SystemUtils.IS_OS_WINDOWS ){
System.out.println("WINDOWS");
}
2011-03-08(Tue) [長年日記] 編集
[Java][Ant] antで複数のjarにクラスパスを通す
**を用いると再帰的な検索によるファイルの指定ができる.
<fileset dir="lib">
<include name="**/*.jar">
</fileset>
lib/hoge/hoge0.jar lib/hoge/hoge1.jar lib/fuga/fuga.jar
というような階層を持った形でjarファイルを管理している場合,一つ一つのディレクトリを指定する必要がなくなり,便利.詳細は@IT:現場に活かすJakarta Project 第2回の最後の方を参照のこと.
関連ページ
ANT覚え書き - Object Design Blog <fileset>によるコピー元ファイルの指定 - Copyタスク(コピー) - Apache Antの使い方 Antメモ(Hishidama's Ant Memo)2011-03-09(Wed) [長年日記] 編集
[Java][B4課題] Javaで桁揃えをして出力
数字を桁揃えして文字列出力をする際,Cの課題で手書きさせられたからか,Javaでも自前の実装をする人がいる.DecimalFormatを使えば簡単.
System.out.println(new java.text.DecimalFormat("000").format(5));
// 005と出力される
2011-03-10(Thu) [長年日記] 編集
[Windows][bash][nyaos] Windowsコマンドプロンプトやbashにおける繰り返し処理
Windows7コマンドプロンプト
UnxUtilsやNYAOSを入れているので,デフォルトのWindows7で動くかは良く分からん.Windows上で実用に耐えうるbashクローンはないものか.
// コマンドプロンプトで直接動かす場合
for %A in (1 2 3)do echo %A
// batファイルに書く場合は,パーセントを二つ重ねる.
for %%A in (1 2 3)do echo %%A
// nyaosだけ…と思ったら,コマンドプロンプトでも動いた.
foreach i 0 1 2 3 4 5 6 7 8 9 ; echo $i ; end
Linux (bash)
for i in 0 1 2 3 4 5 6 7 8 9 ; do echo $i ; done
for i in {0..9}; do echo $i ; done;
for i in `seq 0 1 9` ; do echo $i ; done
関連ページ
2011-03-11(Fri) [長年日記] 編集
[SoftwareDevelopment][技術書] Domain Driven Design(ドメイン駆動設計) Quickly 日本語版PDFの無料ダウンロード
InfoQ: Domain Driven Design(ドメイン駆動設計) Quickly 日本語版からPDFをダウンロードできます.ありがたやありがたや.
Domain-Driven Design: Tackling Complexity in the Heart of Software: Eric Evansの日本語版として, エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践): エリック・エヴァンス, 今関 剛, 和智 右桂, 牧野 祐子がでているけど,お金も時間もないし,本は重いしなーという場合にはちょうど良いかも.
2011-03-13(Sun) [長年日記] 編集
[Xming][Linux][openSUSE][Windows] Linux上の画面(X11)をWindows上で表示し,操作する
はじめに
本記事で紹介する内容は,Xの転送元と転送先が同一ネットワーク内にある場合に使える.しかし,SSH X11 フォワーディングでXmingにリモートのXを転送する - yuu_nkjm blog(2011-03-20)で紹介する方法はXの転送元と転送先の配置を気にせず使えるので,まずはそちらを試すのがオススメ.
リモートコントロールについて
LinuxをリモートからGUIで操作する場合は,主に3通りの方法があると思う.
- vncを使う: 水銀室 VNC操作 -openSUSE Linuxデスクトップ環境構築-
- RDPを使う: XRDPでLinuxをRDPサーバーにする : アシアルブログ
- X11を使う: xming+puttyでのXの使い方マニュアル
1番目のvncを使う方法は,低速だが一番簡単だった記憶がある.しかし,水銀室 VNC操作 -openSUSE Linuxデスクトップ環境構築-を参考にやってみたが,うまくいかなかった.2番目は,suseのデフォルトのレポジトリにはxrdpが入っていなかったので止めた.以下では,3番目の方法をとる.
Linux側の設定
Linux機には,openSUSE11.2がインストールされている.
yastでの設定
「yast→ネットワークサービス→リモート管理(VNC)」より「リモート管理を許可する」を選択する.
[yast→システム→"/etc/sysconfigエディタ」を選ぶ.ツリーから Desktop → Display manager → DISPLAYMANAGER_REMOTE_ACCESS を選択して,"yes" を選択する.同様に DISPLAYMANAGER_XSERVER_TCP_PORT_6000_OPEN を選択して,"yes" を選択する.
gdmの設定
/etc/gdm/custom.confの以下の項目がtrueになっているか確認する.
[xdmcp] Enable=true
xhostの設定
xhostまたはxauthコマンドでXサーバへのアクセスの許可・不許可を設定する.Windows機のXサーバ(Xming)を使うので,この設定は必要ないかも.
デフォルトでは,ローカルホスト以外からは X サーバにアクセスすることはできない.
xhost +10.200.30.11:0.0として,10.200.30.11:0.0からのアクセスを許可する.
DISPLAY環境変数の設定
操作対象となるLinuxマシンのDISPLAYを"Windows機のIPアドレス:0"とするように.bashrcなどに書く.
export DISPLAY=10.200.30.11:0.0
Windows側の設定
Windows機には,Windows 7がインストールされている.
Xmingのインストール
Xmingをダウンロードし,インストールする.Portable SSH Clientにチェックをする.Xmingをインストールしたディレクトリを覗くと,X0.hostsというファイルがある.この中に,接続を許可するIPアドレスを書いてやる必要がある.0はディスプレイ番号に応じて変更する.
(1)~(3)のいずれかの方法で,Linux機に接続する.
Xmingを使用する
(1) Puttyを使う
三つの方法のなかで一番使いやすいと思う.
- Xming\XLaunch.exeを起動.
- "Display settings"では好きなモードを選ぶ.Display Numberは0で.
- "Session type"では,Start no clientを選ぶ.
- "Additional parameters"はお好きに.無駄なエラーを避けるためにも,初回はClipboardはなしにしても良いかも.
- "Finish configuration"では,設定を保存したければ,Save configurationを押す.完了をクリックすると,Xmingが起動する.
- 先にXmingを起動してから,Puttyでサーバにログインする.この端末を使ってLinux側の操作をする.
- yast2などのGUIベースのアプリケーションをputty上で呼び出すと,Windows内のウィンドウとして立ち上がる.
Windows上にYast2の画面が開いたところ
(2) XmingからXDMCPを使う
Linux機にログインしたデスクトップ全体が必要な時は,(1)ではなくこちらを使う.
- Xming\XLaunch.exeを起動.
- "Display settings"では"Multiple Window"以外を選ぶ.Display Numberは0で.
- "Session type"では,Open session via XDMCPを選ぶ.
- "XDMCP settings"では,Connect to hostに接続先を指定する.
- "Additional parameters"はお好きに.無駄なエラーを避けるためにも,初回はClipboardはなしにしても良いかも.
- "Finish configuration"では,設定を保存したければ,Save configurationを押す.完了をクリックすると,Xmingが起動する.
- ログイン画面が正常に表示された.ユーザ名とパスワードを入力したが,なぜかログインできなかった./home/usera/.xsession-errorsを見てみると,xterm Xt error: Can't open display: ::ffff:192.168.0.111:0というエラーが見つかった.IPv6が悪さをしているようだ.
-
Re: OpenSUSE11.2 でxdmcpが動かない - opensuse-ja.opensuse.org - ArchiveOrangeを参考に, /etc/sysctl.confに以下の変更を加え,IPv6をオフにした.
もう一度,(2)の最初から行うが,やはりログイン後すすまない.今度は,.xsession-errorsには"Fatal IO error 11 (Resource temporarily unavailable) on X server"というエラーが出ていた.しかし,(2)でXmingのウィンドウを開き,その後そのウィンドウを閉じ,さらに(1)の様にStart no clientでXmingを起動すると,XDMCPでログインしたデスクトップが表示された.(1)さえ動けばやりたいことはできるから,この方法はこんなとこでいいや.net.ipv6.conf.all.disable_ipv6 = 1
(3) Xmingから呼び出したxtermを使う
plinkの呼び出し方がよく分からないし,xtermよりputtyの方が好きなので,殆ど使わない.これを使うぐらいなら(1)を使う.
- 普段,Puttyごった煮版のputty.iniに設定を書き出すタイプのplinkを使っているので,Xmingのディレクトリにごった煮版のplinkとputty.iniをコピーする.Xming/putty.confに使用できるplinkが指定できそうだが不明.
- Xming\XLaunch.exeを起動.
- "Display settings"では好きなモードを選ぶ.Display Numberは0で.
- "Session type"では,Start a programを選ぶ.
- "Start program"では,Using PuTTY(plink.exe)にチェックする.接続先とログインユーザを入力する欄があるが,接続先を入れるとputtyのプロファイルが読まれる様だ.
- "Additional parameters"はお好きに.無駄なエラーを避けるためにも,初回はClipboardはなしにしても良いかも.
- "Finish configuration"では,設定を保存したければ,Save configurationを押す.完了をクリックすると,Xmingが起動する.
- Xmingがplinkを使って接続先のxtermを開いてくれる様だ.xming+puttyでのXの使い方マニュアルを参考にした.この方法だと接続にplinkは使うけど,puttyのコンソールは使わず,xming経由(?)で呼び出したxtermを使う事になる
参考ページ
2011-03-14(Mon) [長年日記] 編集
[Linux][command] カーネル,モジュール,デバイス回りのコマンド
- lsmod: ロードされているモジュールの一覧を表示する./proc/modulesを見るのと同じ.Manpage of LSMOD
- lspci: PCIバス上にあるデバイス情報を見る./proc/pciを見るのと同じ.ITmedia エンタープライズ:Linuxハードウェア認識の基礎 (2/3)
- depmod: ローダブルカーネルモジュールの依存関係の記述を扱う.Manpage of DEPMOD
関連ページ
2011-03-15(Tue) [長年日記] 編集
[VirtualBox][Linux][Windows][openSUSE] coLinuxからVirtualBoxへの引っ越し(失敗)
coLinuxではopenSUSE11.2(32bit)を動かしていた.VirtualBoxにはopenSUSE11.4(64bit)をインストールしたい.何とかcoLinux上の設定をVirtualBox上に引っ越すことを試みたが失敗に終わったorz
手順
- virtualboxSUSE.vdiにopenSUSE11.4(64bit)をインストールする.
- virtualboxSUSE.vdiをcopyVirtualboxSUSE.vdiとしてコピーする.
-
Raw形式のcoLinux用仮想HDDをVirtualBoxで読み込める形式に変換する(coLinuxSUSE.vdi).
VirtualBox\VBoxManage.exe convertfromraw --format VDI C:\coLinux\openSUSE-11_2.img C:/VirtualBox/coLinuxSUSE.vdi
- virtualboxSUSE.vdiを起動ディスクとする.copyVirtualboxSUSE.vdiを/mnt/moveto,coLinuxSUSE.vdiを/mnt/coLinuxにマウントする./mnt/movetoを引っ越し先とする作戦.
- coLinuxから引っ越す.
- まるっとコピー作戦
cd /mnt/coLinux cp -a etc home bin sbin usr etc lib media opt root var /mnt/moveto
- etcだけコピー作戦
cd /mnt/coLinux cp -a etc /mnt/moveto
- まるっとコピー作戦
- copyVirtualboxSUSE.vdiを起動ディスクとして起動するも,どちらの作戦も正常起動せず.やはり過去のインストールログを参考にチマチマ復元するか.
失敗原因を推測
- coLinuxは独自のカーネルを使っているから.
- 引っ越し元が32bitだったのに,引っ越し先が64bitだったから.
- 設定にMACアドレスやUUIDが書き込まれているから.(参考:Re: [opensuse-ja] openSU SE 11.3でのNIC追加そして削除し たときの注意点)
うん,失敗して当然な気もするな.ハードウェアが変わる場合は,引っ越しは難しいな.
2011-03-16(Wed) [長年日記] 編集
[VirtualBox][Linux][Windows][openSUSE] Window 7 (64bit)上のVirtualBoxにopenSUSE 11.4 (64bit)をインストール
coLinuxの64bit版はしばらく出なそうなので,VirtualBoxに乗り換えてみる.VMWareも検討したけど,VirtualBoxの方が手軽そうだった.
仮想マシンの作成
- VirtualBoxをダウンロードしてインストールする.
- バーチャルマシンを作成する.割り当てメモリは後で変更できるので適当に.インストールするゲストOSはopenSUSE64bitにした.
- 仮想HDDの容量を後で変えるのは面倒.仮想HDDを新しく追加するのは簡単.
- VirtualBox用に作成した仮想HDDにはUUIDが割り振られる.このUUIDがVirtualBox上(一つのVMではなくVirtualBox全体)で衝突するとエラーが出る.仮想HDDを移動したりコピーしたりするとエラーが起こる.これに関しては,仮想HDDのコピーを参照.
- ホストOSのネットワークにゲストOSが接続しているようにしたい.そこで,ブリッジ接続を行う.まず,Windowsのネットワークの設定でブリッジを作成する.VirtualBoxでのネットワークアダプタの設定をNATからブリッジに変え,ネットワークブリッジ(MAC Bridge Miniport)を対象のアダプタとして選ぶ.ちょこっとメモ: VirtualBox内のFedoraをホストのVistaからWebアクセスする
openSUSEの設定
- coLinux上で動いていたopenSUSEを全コピーして動かそうとしたが,うまく動かなかった.
- …ということで,新規インストールをする.openSUSE11.4 64bitのisoイメージをダウンロードする.VirtualCloneDriveをインストールし,ダウンロードしたisoイメージをマウントする.
- 日本語: キーボードが日本語になって欲しいし,他にも日本語対応モジュールがあるかもしれないので.
- KDEデスクトップ
- パーティションベース
- boot from MBR is diseabled
- boot from / partition is enabled
- Firewallだけ無効: 自前のファイヤーウォールを使うので.
サービス化
coLinuxの様にWindowsのサービスとして動かしたい場合は,VBoxVmServiceを使うのが良さそうだ.VirtualBoxをWindowsのサービスとして動かす - yuu_nkjm blog(2011-03-17)
2011-03-17(Thu) [長年日記] 編集
[VirtualBox][Windows 7 (64bit)] VirtualBoxをWindowsのサービスとして動かす
VirtualBoxを(coLinuxの様に)Windowsのサービスとして動かしたいなら,VBoxVmService - run your VirtualBox VMs from a native Windows serviceを使う.Windows 7 (64bit),VirtualBox 4.0.4,VBoxVmService 2.2で動作を確認した.
VirtualBoxをサーバ機の様に使う場合,SSHで接続するので,仮想コンソールは要らない.また,VirtualBoxの起動をGUIでするのも面倒なので,サービス化することにした.Windows上のdaemon(デーモン)としてLinuxが動作するイメージ.
2011-12-28 追記
VBoxVmService - Browse /vboxvmservice at SourceForge.netから実行ファイルをダウンロードできる.3.x系,2.x系とあるが,以下の説明は2.x系である.2.x系の方が,簡単に使い始められる様だ.3.x系には今のところ差し替えていない.
設定
vms\VBoxVmService.iniにVBoxVmServiceの設定を書く.vms\doc\Howto.txtを見れば簡単に書ける.一応サンプル.
[Settings] ServiceName=VBoxVmService VBOX_USER_HOME=C:\Users\hoge\.VirtualBox PauseShutdown=5000 [Vm0] VmName=openSUSE-64bit WorkingDir=E:\ProgramFiles\vms ShutdownMethod=savestate VrdePort=3001
インストールと起動
VBoxVmServiceを使ったサービスのインストールと開始の方法は以下の通りである.
E:\VmServiceControl>VmServiceControl.exe -i
Broadcasting registry change to all of your processes.
Service VBoxVmService installed
E:\VmServiceControl>VmServiceControl.exe -s
Service started successfully
オプション一覧.
VBoxVmSerice control utility usage: VmServiceControl [options] -i Install VBoxVmService service -u Uninstall VBoxVmService service -s Start VBoxVmService service -k Stop VBoxVmService service -b Restart VBoxVmService service -e Print service environment -su n Startup VM with index n -sd n Shutdown VM with index n -st n Show status for VM with index n -sp n Show guest properties if Guest Additions are installed
プログラム名がVBoxVmServiceなのに,コマンド名がVmServiceControl.exeだったり,ディレクトリ名がVmServiceControlだったりしていて,微妙に検索しづらい.
2011-03-18(Fri) [長年日記] 編集
Javaの参照の値渡しと参照渡し
値渡しと参照渡し,参照とポインタ,直接参照と間接参照 - yuu_nkjm blog(2012-02-10)に統合2011-03-19(Sat) [長年日記] 編集
[VirtualBox] UUIDが衝突しないように仮想HDDをコピーしたり移動したりする
VirtualBox用に作成した仮想HDDにはUUIDが割り振られる.このUUIDがVirtualBox上(一つのVMではなくVirtualBox全体)で衝突するとエラーが出る.つまり,仮想HDDをOS上でコピーしても同じVirtualBox上で使う事は出来ない.
同じVirtualBox上で使える様に仮想HDDをコピーするには,vboxmanageコマンドを使う(VirtualBoxで仮想ハードディスクの複製を作成する方法).
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" clonevdi from.vdi to.vdi
仮想HDDを除去してリネームして再度追加したり,仮想HDDを移動したりした時にも,UUID重複のエラーが出る時がある.この場合は,「メニュー → 仮想メディアマネージャ」から,不要になった仮想HDDを除去するとよい.
関連ページ
2011-03-20(Sun) [長年日記] 編集
[Xming][X11][Linux][openSUSE][Windows] SSH X11 フォワーディングでXmingにリモートのXを転送する
Xの転送元(リモート側)
- /etc/ssh/sshd_configに以下を設定する.
X11Forwarding yes X11DisplayOffset 10 X11UseLocalhost yes
- .bashrcなどで設定しているDISPLAYの設定を外す.SSHで接続すると適当な値が割り振られるのでそれを使う.(多分)sshdがX11の転送先をDISPLAY変数に割り当ててくれるので,DISPLAY変数を手動で割り当ててはいけない!
- DISPLAY変数に値がうまく割り当てられないときは,X11フォーワディングをしようとしたとき,DISPLAY変数に値が設定されない - yuu_nkjm blog(2011-08-01)をやってみる.
- xhost, xauthに関しては考えなくて良い.
Xの転送先(ローカル側,Windows上でXmingが動いている側)
- PuTTYの設定をする.「接続->SSH->X11」と選び「X11フォワーディング:有効」「Xディスプレイの場所:空欄(もしくはlocalhost:0)」とする.
- Xmingの設定をする.WindowsからXmingを使ってLinuxへリモート接続 - yuu_nkjm blog(2011-03-13)の「Xmingのインストール」を参照.XmingのインストールフォルダのX0.hostsファイルにlocalhostからのX表示依頼を受け付けるように書けば良い.
- Xmingを使用する.WindowsからXmingを使ってLinuxへリモート接続 - yuu_nkjm blog(2011-03-13)の「Xmingを使用する(1)」と同じ方法で接続する.
Puttyの設定画面