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);
ピクセル単位透過ウィンドウ
Class	 com.sun.awt.AWTUtilities
Method	 public static void setWindowOpaque(Window window, boolean opaque);
public static boolean isWindowOpaque(Window window);
フルスクリーン画面 キオスク端末のような排他フルスクリーン画面を出す場合は GraphicsDevice の以下のメソッドを使用する。
public boolean isFullScreenSupported()
public void setFullScreenWindow(Window)
フルスクリーンがサポートされていないプラットフォームではパフォーマンスが落ちる。 範囲が限られているなら try-catch で囲ったほうが安全性が高まる。 通常は setUndecorated() でウィンドウの装飾をオフにしておいたほうが良い。 通常はウィンドウをリサイズ不可にしておいたほうが良い。 アプレットからは権限を与えてやらないとフルスクリーンにはできない。

2011-03-06(Sun) [長年日記] 編集

[Java] JVMのシャットダウンをフックする


Runtime.getRuntime().addShutdownHook( new Thread() {
    public void run() {
        System.out.println("Shutdown!!");
    }
});

関連ページ


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コマンドプロンプト

UnxUtilsNYAOSを入れているので,デフォルトの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-12(Sat) [長年日記] 編集

[Linux][openSUSE] Windowsの共有フォルダをLinux上に書き込み可能でマウントする

Windows機のIPアドレスがxx.xxx.xx.xxx,共有フォルダ名がEDrive,ログイン名がyuuだったとする.

mount -a -o username=yuu,umask=077,uid=1000,gid=100 //xx.xxx.xx.xxx/EDrive mnt/EDrive

マウント対象の権限をuidで指定したユーザにすることができる.また,umaskを指定してすることで書き込み可能とすることができる.


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通りの方法があると思う.

  1. vncを使う: 水銀室 VNC操作 -openSUSE Linuxデスクトップ環境構築-
  2. RDPを使う: XRDPでLinuxをRDPサーバーにする : アシアルブログ
  3. 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を使う

三つの方法のなかで一番使いやすいと思う.

  1. Xming\XLaunch.exeを起動.
  2. "Display settings"では好きなモードを選ぶ.Display Numberは0で.
  3. "Session type"では,Start no clientを選ぶ.
  4. "Additional parameters"はお好きに.無駄なエラーを避けるためにも,初回はClipboardはなしにしても良いかも.
  5. "Finish configuration"では,設定を保存したければ,Save configurationを押す.完了をクリックすると,Xmingが起動する.
  6. 先にXmingを起動してから,Puttyでサーバにログインする.この端末を使ってLinux側の操作をする.
  7. yast2などのGUIベースのアプリケーションをputty上で呼び出すと,Windows内のウィンドウとして立ち上がる.
立ち上がったところ

Windows上にYast2の画面が開いたところ

(2) XmingからXDMCPを使う

Linux機にログインしたデスクトップ全体が必要な時は,(1)ではなくこちらを使う.

  1. Xming\XLaunch.exeを起動.
  2. "Display settings"では"Multiple Window"以外を選ぶ.Display Numberは0で.
  3. "Session type"では,Open session via XDMCPを選ぶ.
  4. "XDMCP settings"では,Connect to hostに接続先を指定する.
  5. "Additional parameters"はお好きに.無駄なエラーを避けるためにも,初回はClipboardはなしにしても良いかも.
  6. "Finish configuration"では,設定を保存したければ,Save configurationを押す.完了をクリックすると,Xmingが起動する.
  7. ログイン画面が正常に表示された.ユーザ名とパスワードを入力したが,なぜかログインできなかった./home/usera/.xsession-errorsを見てみると,xterm Xt error: Can't open display: ::ffff:192.168.0.111:0というエラーが見つかった.IPv6が悪さをしているようだ.
  8. Re: OpenSUSE11.2 でxdmcpが動かない - opensuse-ja.opensuse.org - ArchiveOrangeを参考に, /etc/sysctl.confに以下の変更を加え,IPv6をオフにした.
    net.ipv6.conf.all.disable_ipv6 = 1
    
    もう一度,(2)の最初から行うが,やはりログイン後すすまない.今度は,.xsession-errorsには"Fatal IO error 11 (Resource temporarily unavailable) on X server"というエラーが出ていた.しかし,(2)でXmingのウィンドウを開き,その後そのウィンドウを閉じ,さらに(1)の様にStart no clientでXmingを起動すると,XDMCPでログインしたデスクトップが表示された.(1)さえ動けばやりたいことはできるから,この方法はこんなとこでいいや.
(3) Xmingから呼び出したxtermを使う

plinkの呼び出し方がよく分からないし,xtermよりputtyの方が好きなので,殆ど使わない.これを使うぐらいなら(1)を使う.

  1. 普段,Puttyごった煮版のputty.iniに設定を書き出すタイプのplinkを使っているので,Xmingのディレクトリにごった煮版のplinkとputty.iniをコピーする.Xming/putty.confに使用できるplinkが指定できそうだが不明.
  2. Xming\XLaunch.exeを起動.
  3. "Display settings"では好きなモードを選ぶ.Display Numberは0で.
  4. "Session type"では,Start a programを選ぶ.
  5. "Start program"では,Using PuTTY(plink.exe)にチェックする.接続先とログインユーザを入力する欄があるが,接続先を入れるとputtyのプロファイルが読まれる様だ.
  6. "Additional parameters"はお好きに.無駄なエラーを避けるためにも,初回はClipboardはなしにしても良いかも.
  7. "Finish configuration"では,設定を保存したければ,Save configurationを押す.完了をクリックすると,Xmingが起動する.
  8. Xmingがplinkを使って接続先のxtermを開いてくれる様だ.xming+puttyでのXの使い方マニュアルを参考にした.この方法だと接続にplinkは使うけど,puttyのコンソールは使わず,xming経由(?)で呼び出したxtermを使う事になる

参考ページ


2011-03-14(Mon) [長年日記] 編集

[Linux][command] カーネル,モジュール,デバイス回りのコマンド

関連ページ


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を起動ディスクとして起動するも,どちらの作戦も正常起動せず.やはり過去のインストールログを参考にチマチマ復元するか.

失敗原因を推測

うん,失敗して当然な気もするな.ハードウェアが変わる場合は,引っ越しは難しいな.


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-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のX11

Puttyの設定画面


トップ «前月 最新 翌月» 追記 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|