Oracle NVARCHAR2を文字列連結するときの注意

検索したい該当カラムがNVARCHAR2でも連結すると暗黙変換でVARCHAR2となるらしく、4000byte以上はエラーとあるため、以下のようにTO_CLOB('')を連結しとく必要がある。

SQL> select col1 from foo_table where (TO_CLOB('') || col1 || col2) like '%検索%';

確認したOracleのバージョンは11.2

MacOS Xのはがきデザインキットが起動しない件

日本郵政の年賀状ソフトウェア「はがきデザインキット」を2015年の年末に使っていたのに2016年になってからなぜか使えなくなっていた。
ダブルクリックしてもソフトウェアが起動しない。コマンドラインから起動してみたら以下のようになる。

$ cd /Applications/
$ open -a はがきデザインキット
LSOpenURLsWithRole() failed for the application /Applications/はがきデザインキット.app with error -10810.
$

これだとわからないのでコンソール.appを起動して見てみた。

2016/01/17 10:00:11.423 はがきデザインキット[2427]: renaming failed with this error: Error Domain=NSCocoaErrorDomain Code=513 "“MacOS”へのアクセス権がないため、“はがきデザインキット”を移動できませんでした。" UserInfo=0x21a800 {NSSourceFilePathErrorKey=/Applications/はがきデザインキット.app/Contents/MacOS/はがきデザインキット, NSUserStringVariant=(
Move
), NSFilePath=/Applications/はがきデザインキット.app/Contents/MacOS/はがきデザインキット, NSDestinationFilePath=/Applications/はがきデザインキット.app/Contents/MacOS/はがきデザインキット_32, NSUnderlyingError=0x218b60 "操作を完了できませんでした。
アクセス権がありません"}

なんかパーミッションがないみたいなので以下を実行

$ cd はがきデザインキット.app/
$ cd Contents/
$ ls -l
total 16
-rwxr-xr-x@ 1 root  wheel  1926 11 29 14:44 Info.plist
drwxr-xr-x@ 3 root  wheel   102 11 29 14:44 MacOS
-rwxr-xr-x@ 1 root  wheel     8 10 28  2014 PkgInfo
drwxr-xr-x  8 root  wheel   272 11 29 14:44 Resources
$ ls -alF MacOS
total 72
drwxr-xr-x@ 3 root  wheel    102 11 29 14:44 ./
drwxr-xr-x@ 6 root  wheel    204 11 29 14:44 ../
-rwxr-xr-x@ 1 root  wheel  34604 10 28  2014 はがきデザインキット*
$ sudo chmod 777 MacOS
Password:
$

この後、ダブルクリックしてみたところ起動成功。OSバージョンアップしたわけでもソフトウェアをバージョンアップしたわけでもないのでこうなってしまった原因は不明。

で、起動成功後、バージョンアップを促される。なのでバージョンアップした。
バージョンアップした後、変更したディレクトリパーミッションだとまずいので見てみたところ、

$ pwd
/Applications/はがきデザインキット.app/Contents
$ ls -alF
total 16
drwxr-xr-x@ 6 root  wheel   204  1 17 10:06 ./
drwxr-xr-x  3 root  wheel   102  1 17 10:06 ../
-rwxr-xr-x@ 1 root  wheel  1926  1 17 10:06 Info.plist*
drwxr-xr-x@ 3 root  wheel   102  1 17 10:06 MacOS/
-rwxr-xr-x@ 1 root  wheel     8 11 22 16:08 PkgInfo*
drwxr-xr-x  8 root  wheel   272  1 17 10:06 Resources/
$ ls -alF MacOS
total 64
drwxr-xr-x@ 3 root  wheel    102  1 17 10:06 ./
drwxr-xr-x@ 6 root  wheel    204  1 17 10:06 ../
-rwxr-xr-x@ 1 root  wheel  31252 11 22 16:08 はがきデザインキット*
$

ディレクトリのパーミッションは元どおりになっている。これで起動できないのかと思っていたけど普通に起動できる。
エラーメッセージでは"_32"(32bitかよ)にリネームしようとしてパーミッションがないとか言っているんで、実はまずいバージョンを掴まされてただけ?

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にしているのでそこそこ使えるんだけどなぁ。