Javaスレッドで異なるインスタンスでも同期するためには

Javaでスレッドで同期するにはsynchronizedを使用するが、

synchronized public void foo() {
	....
}

public void foo() {
	synchronized (this) {
		....
	}
}

とした場合、同じインスタンスでの同期となる。
スレッドが異なるインスタンスを使用して同期しなきゃいけない時は、同期用オブジェクトをsynchronizedに指定してやれば良い。例ではクラス変数を参照して同期している。

package com.foobar.console;

/**
 * スレッド同志で異なるインスタンスでも同期できるかのテスト
 */
public class Test00 {
	private static final int MAX_THREAD = 500;
	public static int counter = 0;
	public static final Object LOCK = new Object();	// 同期用オブジェクト
	
	public static void main(String[] args) {
		// スレッド生成
		MyThread[] threads0 = new MyThread[MAX_THREAD];
		MyThread[] threads1 = new MyThread[MAX_THREAD];
		for (int i = 0; i < MAX_THREAD; i++) {
			threads0[i] = new MyThread(new Counter());
			threads1[i] = new MyThread(new Counter());
			threads0[i].start();
			threads1[i].start();
		}
		// スレッドが全て終了するのを待つ
		for (int i = 0; i < MAX_THREAD; i++) {
			try {
				threads0[i].join();
				threads1[i].join();
			} catch (InterruptedException e) {
				System.out.println(e);
			}
		}
		// カウンタを表示
		System.out.println(counter);
	}
}

/**
 * スレッドクラス
 */
class MyThread extends Thread {
	private Counter counter = null;

	public MyThread(Counter counter) {
		this.counter = counter;
	}

	public void run() {
		this.counter.countUp();
	}
}

/**
 * カウンタクラス
 */
class Counter {
	public void countUp() {
		synchronized (Test00.LOCK) {
			System.out.print(".");
			int n = Test00.counter;	// カウンタ値を読み込み
			System.out.print("o");
			Test00.counter = n + 1;	// 加算してカウンタに設定
			System.out.print("O");
		}
	}
}

参考にしたのは以下のサイト。

http://www.tohoho-web.com/java/thread.htm#synchronized

はてなブログのサイドバーカスタマイズ

はてなダイアリーからはてなブログに引っ越してサイドバーを修正していたが、twitterを表示させる方法が以下のブログにあったので参考にして設置した。

http://nohack-nolife.hatenablog.com/entry/2014/11/15/170730

基本的には以下の流れ。

  1. twitterウィジェットを作成
  2. 作成してできたタグをサイドバーの「モジュールを追加」からHTMLを選択してHTMLモードでタグをpaste

はてなダイアリーでは、はてなのその他のサービスを○○モジュールという独自タグで設置できて意外に便利だったけどHTMLで出力してくれるし他サービスもHTMLで出力するわけなので、まぁ仕方ないかなっと。

はてなブログに引っ越します

2006年4月からはてなダイアリーを使用しているので今月で丸10年になります。これを一区切りとして、

http://hatenablog.com/guide/compare

から手続きして、以下のはてなブログに引っ越します。

http://kohchi.hatenablog.com/

毎月一回は更新するようにしてきて、最近は忙しくて本当に月一でしたがなんとか続けて来れました。はてなブログでも同様に続けていきたいと思っています。

Windows8からWindows10にアップグレードしたらWSDプリンタが見えなくなって困った件

MacOS XのVMware上のWindows8からホスト側ネットワーク接続されたプリンタへの設定(WSD)で設定したプリンタがWindows10にしてから見えなくなっていた。原因不明。

とりあえず、上記URL通りにWSDでプリンタ追加をしようとしたら、

とエラーとなり追加できない。何度もやってみたけど同じ。
ググってみてもいい解決方法が見つからず、またCanonのサイトからドライバをダウンロードしてインストールをしようとしてみたけど、こちらはネットワーク(同じセグメントでないとダメ)もしくはUSB接続していないとインストールできない流れ。
諦めかけてたところでWindows Updateになったのでダウンロード、インストールして後、再度プリンタドライバを確認したところ、

なんと復活していた。

うーん、印刷できるけど、原因不明、気持ち良くない。

MacOSのfirefoxでgooglemapを見ると画面が乱れる件

OS MacOS 10.7.5(Lion)
Software firefox 44.0.2(現在最新)

でgooglemapやPDF、javascriptで画像を入れ替えてたりすると画像が乱れるという現象に遭遇。firefoxがここ最近バージョンアップしてから(確証ないけど44になった辺りかと思うが)この現象に遭遇し、まったくもってgooglemapが見えないし気持ちも悪い。

いろいろ試してみて解決したのでログを残す。

OS

好きでMacOS 10.7.5(Lion)を使っているわけでなく、Late2008のポリカーボネートMacBookなのでもうアップグレードができない。

肝心のGoogleMap

以下のように超キモい。GoogleMapにアクセスした最初は表示されるんだけど、きっとすべて読み込み完了後(jqueryでいえば$(document).ready()後のようなタイミング)にこんな感じになる。

firefoxの設定

「環境設定」の「詳細」の「一般」にある、「ハードウェアアクセラレーション機能を使用する (可能な場合)」をオフにし、firefoxを再起動。

これで無事にgooglemapが表示された。

それにしても、firefoxもこんな状態だし、google chromeももうアップグレードできないって言ってきているんで、もうLionは捨てなのか。メモリ増設&SSDにしているのでそこそこ使えるんだけどなぁ。

Mapの値(value)の中身でソート

自身で作成したクラスのインスタンスの中身でソートさせたい場合おおよそ以下のようにする。

  1. Map.EntryセットをListに突っ込む。
  2. ListをCollectionを使ってソート。ここで自身で作成したクラスのインスタンスの値を使って比較する。

MyClass.java

$ cat MyClass.java
public class MyClass {
	private String name;
	private String value;

	public MyClass(String n, String v) {
		this.name = n;
		this.value = v;
	}

	public void setName(String n) {
		this.name = n;
	}
	public String getName() {
		return name;
	}

	public void setValue(String v) {
		this.value = v;
	}
	public String getValue() {
		return value;
	}
}

MySort.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class MySort {
    public static void main(String[] args) {
        // LinkedHashMap 生成
        Map<String, MyClass> map = new LinkedHashMap<String, MyClass>();
        map.put("a", new MyClass("aa", "0004"));
        map.put("b", new MyClass("bb", "0003"));
        map.put("c", new MyClass("cc", "0002"));
        map.put("d", new MyClass("dd", "0001"));

        // generate ArrayList for sorting
        List<Map.Entry<String,MyClass>> entries = 
              new ArrayList<Map.Entry<String,MyClass>>(map.entrySet());
	// find it out later
	Entry target = entries.get(2);
	// sort by value of MyClass using Collection
        Collections.sort(entries, new Comparator<Map.Entry<String,MyClass>>() {
 
            @Override
            public int compare(
                  Entry<String,MyClass> entry1, Entry<String,MyClass> entry2) {
                return entry1.getValue().getValue().compareTo(entry2.getValue().getValue());
            }
        });
         
        // result
        for (Entry<String,MyClass> s : entries) {
            System.out.println("Key = " + s.getKey() +
                    " [MyClassName = " + s.getValue().getName() +
                    " MyClassValue = " + .getValue().getValue() + "]");
        }
        System.out.println("index = " + entries.indexOf(target));
    }
}

確認

$ ls
MyClass.java   MySort.java
$ javac MySort.java
$ java MySort
Key = d [MyClassName = dd MyClassValue = 0001]
Key = c [MyClassName = cc MyClassValue = 0002]
Key = b [MyClassName = bb MyClassValue = 0003]
Key = a [MyClassName = aa MyClassValue = 0004]
index = 1

参考にしたのは以下のサイト。

http://papiroidsensei.com/memo/java_map_sort.html

VMware FusionのUbuntu14.04にVMwareToolsをインストールしてみた件の続き

VMware FusionのUbuntu14.04にVMwareToolsをインストールしてみた件id:ytooyamaさんからコメントをいただいた。

open-vm-toolsをいれたのであればVMware Toolsは入れる必要はありません。
open-vm-toolsはそれぞれのOSでパッケージ管理されており、アップデートが容易なためです。
混じっていると面倒なので一度入れ直したほうがいいかもしれません。
https://www.climb.co.jp/blog_vmware/vmware-6346

なるほど、そんなことになっていたんだ。
このご指摘にあったURLにアクセスして内容を確認。さらにそこに書いてあったURL

http://partnerweb.vmware.com/GOSIG/Ubuntu_14_04.html#Tools

を見ると、

ドラッグ&ドロップしたければvmhgfsドライバをいれろ。
このドライバはOSになく、ドライバインストールは他のVMwareドライバやOpen VMware Toolsを邪魔しないから、
ドライバインストールは、
1. Open VMware Toolsを入れろ。
2. VMware(WorkstationまたはFution)についてくるTARボールを入れろ。
だ。

と書いている。

そうなら手順的には正しいのかもしれない(lsmodでみたらちゃんとvmhgfsがあったし)。でもせっかくなんで実験もかねてWVware Toolsを入れ直してみた。

TARでインストールしたVMware Toolsの削除

TARボールに含まれているbin/vm-uninstall-tools.plを実行。

kohchi@ubuntu13:~/$ zcat VMwareTools-10.0.1-3160059.tar.gz | tar xf -
kohchi@ubuntu13:~/$ cd vmware-tools-distrib/bin
kohchi@ubuntu13:~/vmware-tools-distrib/bin$ sudo ./vmware-uninstall-tools.pl 
[sudo] password for kohchi: 
Uninstalling the tar installation of VMware Tools.

Stopping services for vmware-tools

vmware-tools stop/waiting
Stopping services for vmware-tools-thinprint

vmware-tools-thinprint stop/waiting
The removal of VMware Tools 10.0.1 build-3160059 for Linux completed 
successfully.  Thank you for having tried this software.

kohchi@ubuntu13:~/vmware-tools-distrib/bin$ 

open-vm-tools-desktopの削除

apt-getのremove(設定ファイルを削除したければpurge)を実行。

kohchi@ubuntu13:~/vmware-tools-distrib/bin$ sudo apt-get remove open-vm-tools-desktop
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libmpdec2 libpostproc52 libupstart1 linux-headers-3.13.0-24
  linux-headers-3.13.0-24-generic linux-image-3.13.0-24-generic
  linux-image-3.8.0-31-generic linux-image-extra-3.13.0-24-generic
  linux-image-extra-3.8.0-31-generic
これを削除するには 'apt-get autoremove' を利用してください。
以下のパッケージは「削除」されます:
  open-vm-tools-desktop
アップグレード: 0 個、新規インストール: 0 個、削除: 1 個、保留: 14 個。
この操作後に 447 kB のディスク容量が解放されます。
続行しますか? [Y/n] y
(データベースを読み込んでいます ... 現在 290572 個のファイルとディレクトリがインストールされています。)
open-vm-tools-desktop (2:9.4.0-1280544-5ubuntu6.2) を削除しています ...
kohchi@ubuntu13:~/vmware-tools-distrib/bin$ 

open-vm-toolsの削除

open-vm-tools-desktopと同様。

kohchi@ubuntu13:~/vmware-tools-distrib/bin$ sudo apt-get remove open-vm-tools
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libdumbnet1 libmpdec2 libpostproc52 libupstart1 linux-headers-3.13.0-24
  linux-headers-3.13.0-24-generic linux-image-3.13.0-24-generic
  linux-image-3.8.0-31-generic linux-image-extra-3.13.0-24-generic
  linux-image-extra-3.8.0-31-generic zerofree
これを削除するには 'apt-get autoremove' を利用してください。
以下のパッケージは「削除」されます:
  open-vm-tools
アップグレード: 0 個、新規インストール: 0 個、削除: 1 個、保留: 14 個。
この操作後に 2,344 kB のディスク容量が解放されます。
続行しますか? [Y/n] y
(データベースを読み込んでいます ... 現在 290564 個のファイルとディレクトリがインストールされています。)
open-vm-tools (2:9.4.0-1280544-5ubuntu6.2) を削除しています ...
 * Stopping open-vm guest daemon vmtoolsd                                [ OK ] 
man-db (2.6.7.1-1ubuntu1) のトリガを処理しています ...
libc-bin (2.19-0ubuntu6.6) のトリガを処理しています ...
kohchi@ubuntu13:~/vmware-tools-distrib/bin$

open-vm-tools/open-vm-tools-desktopのインストール

apt-getのinstallを実行。

kohchi@ubuntu13:~$ sudo apt-get install open-vm-tools
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libmpdec2 libpostproc52 libupstart1 linux-headers-3.13.0-24
  linux-headers-3.13.0-24-generic linux-image-3.13.0-24-generic
  linux-image-3.8.0-31-generic linux-image-extra-3.13.0-24-generic
  linux-image-extra-3.8.0-31-generic
これを削除するには 'apt-get autoremove' を利用してください。
提案パッケージ:
  open-vm-tools-desktop
以下のパッケージが新たにインストールされます:
  open-vm-tools
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 14 個。
456 kB のアーカイブを取得する必要があります。
この操作後に追加で 2,344 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu/ trusty-updates/main open-vm-tools i386 2:9.4.0-1280544-5ubuntu6.2 [456 kB]
456 kB を 0秒 で取得しました (972 kB/s)
以前に未選択のパッケージ open-vm-tools を選択しています。
(データベースを読み込んでいます ... 現在 290499 個のファイルとディレクトリがインストールされています。)
.../open-vm-tools_2%3a9.4.0-1280544-5ubuntu6.2_i386.deb を展開する準備をしています ...
open-vm-tools (2:9.4.0-1280544-5ubuntu6.2) を展開しています...
man-db (2.6.7.1-1ubuntu1) のトリガを処理しています ...
ureadahead (0.100.0-16) のトリガを処理しています ...
ureadahead will be reprofiled on next reboot
open-vm-tools (2:9.4.0-1280544-5ubuntu6.2) を設定しています ...
 * Starting open-vm daemon vmtoolsd                                      [ OK ] 
libc-bin (2.19-0ubuntu6.6) のトリガを処理しています ...
kohchi@ubuntu13:~$ 
kohchi@ubuntu13:~$ sudo apt-get install open-vm-tools-desktop
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libmpdec2 libpostproc52 libupstart1 linux-headers-3.13.0-24
  linux-headers-3.13.0-24-generic linux-image-3.13.0-24-generic
  linux-image-3.8.0-31-generic linux-image-extra-3.13.0-24-generic
  linux-image-extra-3.8.0-31-generic
これを削除するには 'apt-get autoremove' を利用してください。
以下のパッケージが新たにインストールされます:
  open-vm-tools-desktop
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 14 個。
120 kB のアーカイブを取得する必要があります。
この操作後に追加で 447 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu/ trusty-updates/main open-vm-tools-desktop i386 2:9.4.0-1280544-5ubuntu6.2 [120 kB]
120 kB を 0秒 で取得しました (431 kB/s)   
以前に未選択のパッケージ open-vm-tools-desktop を選択しています。
(データベースを読み込んでいます ... 現在 290565 個のファイルとディレクトリがインストールされています。)
.../open-vm-tools-desktop_2%3a9.4.0-1280544-5ubuntu6.2_i386.deb を展開する準備をしています ...
open-vm-tools-desktop (2:9.4.0-1280544-5ubuntu6.2) を展開しています...
open-vm-tools-desktop (2:9.4.0-1280544-5ubuntu6.2) を設定しています ...
kohchi@ubuntu13:~$ lsmod | grep vm
vmw_balloon            13191  0 
vmwgfx                149294  3 
ttm                    85079  1 vmwgfx
drm                   244037  4 ttm,vmwgfx
vmw_vmci               60731  0 
kohchi@ubuntu13:~$ 

結果

open-vm-tools/open-vm-tools-desktopで文字列のコピペはなんら問題がなかった。
ファイルのドラッグ&ドロップはvmhgfsがなくても最初失敗するが「再試行」するとできるという状態なんだけど、VMware-Toolsを入れていたときも同じ状態だったので入れ直しによって起きた問題でない。この調査は後回しとする。