Software development of explosion! -夢の破片(カケラ)たちの日々-

ソフトウェア開発を中心としたコンピューター関連のネタを扱ったブログです

Software development is passion and explosion!

OpenFileManagerIt公開中止

先日公開させていただいたOpenFileManagerItですが、代わりの…もっと高機能なpluginがあったため、メンテナンスしないものは公開しない!ということで、公開を中止しました。

代わりのpluginは「StartExplorer」です。Eclipse Market Place見ていたらみつけたので、紹介させていただきます。

Open File Manager It

新年あけましておめでとうございます。。。というには、随分と時間が経ってしまっていますが、
こちらでは今年初投稿ということで、よろしくお願いします。

さて、タイトルからして何だろう?って記事のタイトルにしていますが、
遂に!生まれて初めて、Eclipseプラグインを作成しました。

その名も「Open File Manager It」です。

名前の通り、Package Explorerで選択したファイルのコンテキストメニューに表示されて、
選択すると、ファイルマネージャーで開く(昔あったOpen Externalとほぼ同じ)ようなプラグインです。

他でも似たようなものがありそうですが、作ってみました。

ライセンスなどなどのファイルを用意したり出来ていません。
あと、一応、Macも対応させているつもりですが、動作未確認です。
(時間の都合上出来ていないだけ)

ライセンスはApache License 2.0ということで、ご自由にお使い下さい。

https://code.google.com/p/ofmi/downloads/list

因みに、コメントもロクに書いていない恥ずかしいソースはこちら

Windows 8

早速、入れてみました。
当たり前のことながら、タッチスクリーンなどは持っていませんので、
画面をタッチしたところで指紋が付くだけですが(笑)

自作のデスクトップにアップグレードインストールしたところ、すんなりインストール出来てしまい、ネタにもならないためMacBook Pro(Early 2011 '15 inch)のBootCampにインストールしてみました。
因みに、2012/10/27時点では正式対応していませんので、インストールされる際はご注意ください。

で、MacBook Proのほうはというと、何故か時間がかかりましたが、普通にインストール出来ました。
ただ、当然のことながら(?)ドライバーが未対応のものがいくつかありまして、

Touchpad
FaceTime HD Camera
ATI Catalyst Control Center(これはドライバーというよりはアプリに近いですが、ドライバー付属アプリという意味でドライバーとします)

f:id:poad1010:20121027223146p:plain

意外と少ないですが、TouchPadが使えませんので、MagicMouseなど、
マウスなどのポインティングデバイスをお持ちでない場合は、インストールしたら使いものにならなくなると思いますので、特にご注意ください。

というわけで、実のところ、デスクトップよりインストールが遅かったために、
インストール途中で一旦、強制終了したら、自動的にWindows 7に復元してくれた程度で、
特にトラブルもなくアップグレードインストール出来ました。

まぁ、トラブって7を再インストールするような羽目にならずに済んだからいいのですが、
つまらないなぁ(ぉぃぉぃ)

Windows 7インストール手順

パソコンを引き取って下さった方へのフォロー記事です。

  1. を参考に、Windows 7をインストールします。
  2. 一旦、LANケーブルを抜きます。
  3. 同封の付属品のGIGABYTE の印字のあるDVDをBD-ROMドライブへ挿入します。
  4. デバイスドライバーをインストールします。(マニュアルまたは画面の説明から判断してください。※ 再起動を求められたら、再起動して下さい。
  5. ATIの印字のあるDVDを挿入し、先ほどと同様にグラフィックドライバーをインストールします。
  6. 再起動後に、セキュリティソフト(Norton)をインストールします。
  7. LANケーブルを挿入し、Windows Updateします。
  8. Windows のライセンス認証を行います。

これで、一通りのOS関連の設定は終わりです。

使用されるソフトなどをインストールして下さい。タブレットや、その他のドライバーは、グラフィックドライバーのインストール直前以降であれば問題ありません

余剰パソコンと余剰パーツ

パソコン自作ユーザーのあるあるネタの1つ、気付いたら新しいのが生えていた!状態です。しかも、2つも(笑)

そんな余りものたちを、パーツ含めてご紹介致します。
【CPU】
Intel Core i7 860

【メモリー】
CFDのPC3-12800 2GB×4

【マザー】
GIGABYTE GA-P55A-UD4

【グラフィック】
ATI Radeon HD 5850(PowerColor)
DVI-D×2、HDMI、DisplayPort?

【電源】
AQTIS 550W(?)

【光学式ドライブ】
LGのスーパーマルチドライブ

【DISK】
多分、2.5inchのWD320…今ある3.5inchマウンタがハマらないと、3.5inchのSeagate Barracuda 7200.8 250GBになる(
動くのか?これ…)

【ケース】
Antec Threehundred

                                          • -

【CPU】
intel Core2Quad Q9550s

【メモリー】
DDR2 2GB×…4枚だったかな?

【マザー】
ASUS P5Q-EM

【グラフィック】
オンボード

【電源】
ENARMAX ECO80+ 500W

【光学式ドライブ】
忘れた(多分、どっかのスーパーマルチドライブだったと思う)

【DISK】
どっかの3.5inch HDD(起動しないと分からない~)

【ケース】
Antec SOLO(だったはず、P180じゃなかったはず…調べりゃわかる)

                                          • -

余りパーツ
【CPU】
Intel Core i5 2500s

【マザー】
GIGABYTE GA-Z68X-UD4-B3

【光学式ドライブ】
LGのBDドライブ(BDは読み込み専用、DVDはスーパーマルチに扱える子)

SSD
OCZ Vertex (初代) 128GB×2

その他、2.5インチHDDが複数

とまぁ、こんな感じ。
CPU、マザー、光学式ドライブを余りパーツのに交換も出来る…けど、部屋の大掃除中でスペースが無いのと、面倒くさいのでやりたくない(マザー入れ替えるのは面倒くさいよねぇ。ケースのコネクター繋ぎ直したりとか)

JMeterを使ってRedisの性能テストをする方法(JMeter TCP SamplerからCRLFで終わるリクエストを送る

Redisが使えるか(うちのシステム的にって意味で)検証するため、JMeter使って性能を検証しましょうってことで環境構築しました。
まぁ、仕事でやってることなので、検証結果とかは公開できませんが、
とりあえず、JMeter TCP Samplerを使って、Redisと通信するための方法を自分の備忘録も兼ねて残しておきます。

JMeterを使ってRedisと通信するには、JMeter TCP Smplerを使います。
JMeter 2.7 r1342401には標準でTCP Samplerが付属しているので、
Apache JMeter - Downloads落としてきて、適当なところに展開するだけで使えます。

このTCP Sampler日本語での解説サイトが少ないので、ちょっとだけ細かく記述します。
スレッドグループやコントローラー配下に、追加→サンプラー→TCPサンプラーを選択して追加します。
すると、名前以外の欄が空の状態のTCPサンプラーの画面が表示されます。
f:id:poad1010:20120728221330p:image

TCPClient classnameには、org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClientを実装したクラスを指定します。
JMeter 2.7 r1342401には標準でorg.apache.jmeter.protocol.tcp.sampler.TCPClientImpl
org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImplなどが付属しており、TCPClient classnameに何も入力しないと、jmeter.propertiesのtcp.handlerで指定されているクラスが使われるようです。
(コメントアウトされているが、TCPClientImplが使われるようです)
他の欄は。。。まぁ、そのままの内容なので説明は割愛します。

Redisの場合、標準設定ではポート6379を使うので、ポート番号には「6379」を入力します。
今回は解説ということもあって、Windows版のRedisをDownloads · dmajkic/redis · GitHubから落として来て使いますので、サーバ名またはIPには、「localhost」を指定しています。
f:id:poad1010:20120728215543p:image

先ずはTCPClientImplを使ってみます。
Redisのプロトコルはプロトコル仕様 — redis 2.0.3 documentationにあるように、UTF-8のテキストをコマンドとして送受信しますので、
送信するテキストには「PING」コマンドを送信するように「PING<改行>」を入力します。
これでRedisサーバーを起動すればテスト実施準備が終わります。

テストを実行してみると分るのですが、このままだとテストが終わりません。(タイムアウトを指定している場合はReadExceptionでタイムアウトします)
ログを見てみると、デフォルトでキャラクターセットは「Windows-31j」となっています。
が、コマンド自体はASCII文字だけなので、SETコマンドやLPUSHコマンドのキー名やデータ部分に非ASCII文字を送らない限りは問題はないでしょうから、
とりあえずこのままでいきます。
そもそも、PuttyからRaw接続で繋いでmonitorコマンドを入力して監視しても、Redis側には何も送られていないように見えます。

設定ファイルを弄っても変わらないので、Redisサーバーを終了して、Scalaで試しにポート6379に送られてくる内容を標準出力にダンプしてみました。

DummyServer.scala

/**
 *
 */
package tv.dyndns.poad
import java.nio.channels.ServerSocketChannel
import java.net.InetSocketAddress
import scala.actors.Actor
import java.nio.channels.SocketChannel
import java.nio.ByteBuffer
import java.nio.charset.Charset

/**
 * @author Ken
 *
 */
class DummyServer(host : String, port : Int) extends Actor {
	private val channel = ServerSocketChannel.open();
	def act : Unit = {
		try {
			channel.socket().bind(new InetSocketAddress(host, port))
			println("start server " + host + ":" + port)
			while (true) {
				new Acceptor(channel.accept()).start()
			}
		} finally {
			channel.close()
		}
	}
	def close() : Unit = {
		if (channel.isOpen()) {
			channel.close()
		}
	}
}

class Acceptor(channel : SocketChannel) extends Actor {
	def act : Unit = {
		val buf = ByteBuffer.allocate(4096 * 2)
		loop {
			if (channel.read(buf) < 0) {
				exit
			}
			buf.flip()
			val decoded = Charset.forName("UTF-8").decode(buf).toString()
			println(decoded)
			decoded.getBytes().foreach { e => print("0x%02X ".format(e)) }
			println()

			buf.clear()
			buf.put("+OK".getBytes())
			channel.close()
			exit
		}
	}
}

DummyServerMain.scala

package tv.dyndns.poad
import scala.io.Source

object DummyServerMain extends App {
	val server = new DummyServer("localhost", 6379)
	try {
		server.start()
		while(true) {
			val line = readLine()
			if (line == "exit") {
				exit
			}
		}
	} finally {
		server.close()
	}
}

出力結果はこんな感じ。

start server localhost:6379
PING

0x50 0x49 0x4E 0x47 0x0A

JMeterが送っている内容を見てみると、改行文字として<LF>しか送ってません。
Redisは>CRLF<なので、正しいコマンドとして認識しておらず応答してくれなかったようです。
そこで、BinaryTCPClientImplを使ってデータを送ってみます。
BinaryTCPClientImplでは、送信データにはHEX文字列を入力する必要があるそうです。
f:id:poad1010:20120728231911p:image

これでテストを流してみると、Redis側はちゃんと応答するようになります。
ですが、テストが通りません。応答は返ってきているのですが、タイムアウトとなります。
原因は、JMeter側での応答データ終了の検出設定にあります。

jmeter.propertiesにtcp.BinaryTCPClient.eomByte=10を追記します。
※ データ終了を表す値(1byte)を10進数表記で記述します。

すると、見事にテストが通りました。

まとめ

  • TCPClientImplは終了文字としてLFしか送らない
  • バイナリーデータを送るにはBinaryTCPClientImplを使う
  • BinaryTCPClientで送るデータはHEX文字列を設定する
  • BinaryTCPClientの応答データの終了検出はjmeter.propertiesにtcp.BinaryTCPClient.eomByteとして10進数表記で応答データの最終1byteの値を設定する

HornetQ…

HornetQを検証で使っているのだけども、Consumerが居るQueueにQueueBrowserでアクセスしても、キューイングされてるメッセージが拾えない。

推測だけど、マルチスレッドで動いたときに、QueueBrowserの結果が保証出来なくなるのだろう。
なので、java.util.Queue#peek()みたいなことをやるのであれば、createQueueSession(true, Session.TRANSACTED)にしておいて、consumerで一旦receiveしたら、rollbackするくらいしか手がない。

ActiveMQならこんなことないんだけどね。

そもそも、何をやりたいかというと、複数のproducerがQueueにメッセージを送ると、ルーティングして、複数のconsumerが居るQueueに送られる。
そして、その複数のconsumerは、それぞれが別々のメッセージをQueueから受信(このときはQueueからは削除されない)して、別のQueue(ワーキング)に投げ込んでおく。
ワーキングに投げ込めたら、元のQueueからは捨てる(本来のMQ的な受信)。

そんなことがしたいわけです。
ルーティングがHornetQだと簡単に使えるってことなので、HornetQで行こうと思ったんだけど、上述したQueueから削除せずに受信ってのが出来ないわけですよ。
交互にQueueBrowserを開いて閉じてConsumerを開いて閉じてをやって、シングルスレッドなら出来る確認はしてはいるけど、そもそもがそんな使い方すべきじゃないしね。
JMSは使い辛いです。

Kestrelというのを試そうかとも思うけど、ルーティング出来るのかねぇ?ルーティングルールも問題だけど、落ちたときに永続化されてる必要があるのもまた厄介なところ。

まぁ、最悪、Cassandraという最終手段が...本当に最終手段だけど

ってことで、色々と検証してはいるものの、なかなかもって、いい手だてがない。

頑張りますか…

iPhoneから送信