2013年9月27日金曜日

C#:Bitmap画像の扱う際にはピクセル形式に注意する

Bitmap画像といっても内部的に色情報を扱う方法は様々です。この事を無視してプログラミングをすると、思わぬエラーに遭遇する時があります。ラボでもOpenCVを利用したテンプレートマッチングをしている時に、意味不明のエラーが出てうまく動かない事象がおきました。これは、異なるピクセル形式の画像をマッチングしようとしたからです。画像を内部的に変換するときに、ピクセル形式が変更されることがあるので注意が必要です。例えば、下記のような違いがあります。
  • Format24bppRgb ・・・1ピクセル当たり、赤、青、緑の各色8ビット、合計24ビット
  • Format32bppPArgb ・・・1ピクセル当たり赤、青、緑の各色8ビットと、8ビットのアルファ・チャネル
  • Format32bppRgb ・・・1ピクセル当たり、赤、青、緑の各色8ビット、合計24ビット。残りの8ビットは使わない。
Bitmapクラスのインスタンスを生成する時にはコンストラクタでピクセル形式を指定することができます。C#のPixelFormat列挙型には、たくさんの種類のピクセル形式が定義されています。確認してみましょう。


C#:BackGroundWorkerコンポーネントを利用したマルチスレッド処理

C#には、マルチスレッドを実現する方法として、BackGroundWorkerというコンポーネントが用意されています。このコンポーネントをフォームに貼り付けることで、容易にマルチスレッドなプログラムを実現できます。以下、サンプルコードを載せますが、ポイントを挙げておきます。

1.フォームにBackGroundWorkerを貼り付ける
タイマーコントロールと同じような感覚で貼りつけてください。1つのコントロールで1スレッドです。

2.開始と終了
  • 開始 ・・・ RunWorkerAsync()
  • 終了 ・・・ CancelAsync();
のメソッドを呼ぶだけです。

3.スレッド関数
コンポーネント変数名_DoWorkで終わる関数が実行されます。CancellationPendingの値を条件としたスレッドループを記述するのがベターなやり方でしょう。

4.途中と終了の処理
_RunWorkerCompletedと_ProgressChangedというメソッドが用意されていて、それぞれ終了時と途中の任意のタイミングで呼び出されます。呼び出しは明示的にしないとダメです。ReportProgressメソッドは引数がint型で進行状態を表す数値を渡すことが正しい使い方です(下記サンプルは違います)。なお、これらのメソッドを使えるようにするには、これらの処理を有効(true)にしておく必要があります。デフォルトはfalseなので注意して下さい。

InvokerとDelegate
マルチスレッドプログラムにおいては、プロセス間のデータの授受が厄介な問題となります。BackGroundWorkerを利用する方法でも、この問題を避ける事ができません。具体的に言うと、異なるプロセス間の変数には直接アクセスすることができないということです。下記の例では、別スレッドでカウントしている値をラベルコンポーネントに表示する際に、直接ラベルに値を代入できないということです。メソッドを用意してそれをDelegateに渡し、Delegateを介してInvoke(起動)する必要があります。(もっとよい方法が見つかりましたので、くわしくは続編を!



2013年9月25日水曜日

GWTClientUtilリリースしました

GWTClientUtilリリースしました。名前が少し大きいですが、とりあえず作ったのは、GWT-RPCを逐次的に呼び出すためのクラスです。
今後、色々便利なクラスを公開したいと考えています。


GWTで呼び出し可能なライブラリの作成方法

GWTでは外部のライブラリを利用する時には、~.gwt.xmlファイルに inheritsタグにより追記(定義)が必要であるということはGWTの基本中の基本ですね。
では、自分で作成したGWT用のライブラリを第3者にも使えるようにするにはどうすればいいのでしょうか?実は、1点だけ注意点が必要です。

inheritsタグとは何なのか?
inheritsタグには、自分が作成したクラスのクラス名(パッケージ名含む)をかけばいいというものではありません。実はこのタグは、そこに記述されたGWTモジュールを呼びだそうとします。つまり、inheritsタグはクラスを呼び出しているのではなく、GWTモジュール(~gwt.xmlファイル)を呼び出しているのです。

~.gwt.xmlファイルを用意する
自作したライブラリに、.gwt.xmlファイルを用意しましょう。
このファイルを下記のようにおきます。


上記の例では、org.ochilab.gwt.client.util パッケージに SRMC.gwt.xmlというファイルを置いてます。これにより、呼び出し元のGWTモジュールにおいては、
< inherits name='org.ochilab.gwt.client.util.Gwttool'/>
というように呼び出すことができます。

2013年9月20日金曜日

OSimpleMapperCS リリースしました

AWSが提供するデータベースの1つであるSimpleDBのO/Rマッパーもどきのライブラリ(C#版)として
をGitHubにリリースしました。おちラボでは、Javaアプリケーション開発においてSimpleDBの利用を進めていましたが、本ライブラリを利用することでC#アプリケーションからのSimpleDB利用が容易になるかと思います。


2013年9月13日金曜日

Scientific LinuxにGlassfishサーバをインストールする

久しぶり?にGlassfishサーバを立ち上げることにしたのでそのメモ書き。サーバOSはScientific Linuxです。以下、作業メモ。

0. JDKのインストール
JDKは入っていることが前提ですので、、、、ここでは省略します。

1.GlassFishのダウンロード
からダウンロードします。Opensource Editionが自由に使えてフリーです。通常はこれでいいと思います。

2.インストール
解凍して、任意の場所に移動させるだけです。

3.起動と初期設定
管理者権限で、起動させます。ドメイン名はなんでもいいと思います。最初は、管理者パスワードを設定しておく必要があります。

4.管理画面にアクセス
設定をし、再起動したら管理画面にアクセスしましょう。ブラウザから
  • localhost:4848
  • XXX.XXX.XXX.XXX:4848
とアクセスすれば反応があるはずです。もし反応がない場合、Linuxのファイアウォール設定を確認しましょう。閉じられている可能性がるのでアクセスを許可します。なお、最初にアクセスした時はログイン後に時間がかかることがあります。気長に待ってみましょう。

5.サーバにアクセス
通常のアクセスのポートは8080 です。他のアプリケーションと重複している可能性があるので、確認し、重複していれば管理画面で変更します。なお、ここでもファイアウォール設定には注意しましょう。