2014-12-26

DynamoDBにてHash+RangeのQuery設定方法(v2対応)

久しぶりにDynamoDB触ってみたら、Hash+RangeのQuery設定方法がv2で変更になっていて、古いコードがエラーになってしまったので。。。。



GWTにてFlexTableに配置されたボタンのクリックを特定する ~IDの設定と取得~

下記の図のように、FlexTableにボタンを配置して、押されたボタンの位置(行)を特定することを考えます。

その方法は下記のようになります。
  • getElement().setIdを利用して各ボタンにidを割り振る(id=行とする)
  • クリックイベントにてevent.getSource()を呼び出し、クリックされたボタンを取り出す
  • そのボタンのidを調べる
以上の方法により、下記のような動作をします。

(一番上のボタンをクリックした場合。)


(上から3番目のボタンをクリックした場合)


コードは下記のようになります。



GWT:FlexTableを利用して動的にWidgetを張り付けながら管理する

データベースに入っている内容をそのまま表示したり修正したりするには、データをFlexTableに表示するのがベターです。しかし、その際には
  • Widgetsを動的に配置
  • 配置したWidgetsにJavaコード内で管理
という条件を満たす必要があります。その際は、表示しているWidgetを内部でも同様に管理するのがベターです。例えば下記のような方法です。ここでは、配置しているWidgetを行単位でリストに保存しています。



2014-12-25

GistのJSONデータからファイル情報を取ってくる(gson利用) ~キーがわからないJSONオブジェクトへのアクセス~

Gist APIを使ってJSON形式でGistのコードスニペットを取ってくるプログラムを書いてるんですが、filesの中身にある各スニペットの情報は、ファイル名がキーになっているので、その中身をどうやって取ってくるか?が悩みどころになります。
解決策は下記の通り。なお、JSONのアクセスにはgsonを利用してます。


2014-11-24

Amazon S3対するユーザのアクセス制限をする方法

初歩的ですが、いろいろ試行錯誤してやっとわかったので、、、これで、S3をプロジェクト毎に使い分けられます。なお、最初のルールを書いておかないと、バケット一覧が表示できません。


2014-11-21

Eclipse 4.4 (Luna)を利用する際はJDK/JREは1.7以上に

ラボのPCでGWTの環境を再構築したものの、GWTが使えないという事象が発生。Google Plugin for Eclipseのインストールには成功しているのだが、そのplug-inが有効にならない。ファイルの新規プロジェクトメニューにGoogleのカテゴリーが出てこないという、、、で、原因は
  • LunaはJDK1.7以上が要求仕様であり、PCのJDKが1.6のままであったため

ということ。正確に言えば、Lunaは正常に?起動するが、多くのplug-inが1.7ベースになっているというので、まともに動かないということのようだ。。。
Javaのバージョンは下記のように確認できる。






なお、現在のJDKは 1.8が最新版だが、GAE/Jは1.7を前提にしているので注意が必要だろう。


2014-11-17

C#にてExcelのあるファイルからあるファイルへデータをコピペする

Excelのファイルを仕事が舞い込んできたので、C#でコピペ処理を書いてみました。最初の宣言部分は書いてませんので。



2014-11-13

C#でのHTML解析はSGMLReaderがいい感じ

C#でHTMLの解析をすることになったので、何かいいライブラリがないか探していましたが見つかりました。 インストール方法は、公式サイトに書いてあるようにNuGetから設定するのがラクですね。簡単なサンプルは下記の通り。下記では、tdタグの中身を取ってきていますが、LINQ形式の検索をすることもできるようです。


2014-11-07

WPFでスタートアップウィンドウを設定する

WPFでは、最初に起動するウィンドウクラスの情報をApp.xamlに記述してます。下記はデフォルトの状態ですが、ここでStartupUriという属性があり、ここで呼び出すウィンドウのxamlファイルに書き換えることで任意のウィンドウを初期起動させることができます。



簡易HTTPサーバはnginx

ちょっと今更な記事ですが、ちょっとWindows上で動く簡易的なWebサーバが必要になったので、、、、、
HTTPサーバといえばApache!!というのは、もう昔話なんですね。今は、nginx(エンジンエックス)が流行りのようです。
が公式サイトです。ここから、Downloadに進んでStable versionをダウンロードしましょう。特にインストーラなどはありません。ファイルを展開すればそのまま実行できます。起動と停止の方法ですが、
  • 起動 ・・・ nginx.exe をダブルクリック
  • 停止 ・・・ コマンドプロンプトにて、nginx.exe -s quit と入力
をすればOK。停止方法がよくわからなくてちょっと悩みましたが、、、、噂では軽量かつ高機能なようですので、ちょっとWebサーバを動かしてみたいという場合はオススメでしょう。


2014-10-31

プロ生ちゃん #カレンダープログラミング プチコンテスト 2014に応募しました

現実逃避の一環として、表題のイベント
に応募しました。カレンダー出力するだけのプログラムが対象なのでお気軽にできるかなーというのと、久しぶりにGWTで書いてみようかということでチャレンジしましたが、意外と手こずり、3時間もかかってしまいました。GWTではCalendarクラスが使えないので、代替するクラスを調べたり自作したり、、、という余計な手間がかかったのが原因です。見栄えのところは全く手付かずで、とりあえずLabelにHTML出力しただけです。ソースコードは下記の通り。



Windows2008 Serverの時刻を合わせる

おちラボでは研究室内でWindows2008 Serverを立ち上げて、ドメインの構成をしています。ドメイン内のクライアントPCの時刻は、PDCのNTPサーバ機能(Time Server)によりPDCと同期することになっています。しかし、PDCの時間が間違っているとすべてのPCの時間がおかしくなります。ラボ内でもそういう事象になっていたので、PDCの時間を外部のNTPサーバーに同期しようとしたのですが、PDC(Windows 2008 Server)にはGUIでの設定画面がありません。
そこで、以下の手順で環境確認&設定しましょう。

現在の設定の確認
> w32tm /query /status
と入力すると、現在の時刻同期の設定が見れます。ソースの箇所で同期元が確認できます。おそらく「Free-runnnig System Clock」となっているハズです。つまり、マザーボードの時間(システム時間)と同期しています。

外部NTPサーバの利用
> w32tm /config /manualpeerlist:ntp.nict.jp,0x8 /syncfromflags:manual /reliable:yes /update
と入力すると、設定できます。上記ではNICTのNTPサーバに接続しています。コマンドが正しく完了されたら、もう一度上記のコマンドで設定を確認しましょう。NICTのサーバになっていると思います。

これで、研究室のPCの時刻も正しく時を刻むようになりました。本記事は下記のサイトを参考にしました。ありがとうございます。


2014-10-30

C#にて「InitializeComponent は現在のコンテキスト内に存在しません」というエラーが出た場合

表題にあるようなエラーメッセージが出てしまった場合は、
  • Namespaceの情報に齟齬が起きている
というケースがほとんどです。よくあるのが、書籍やネットのサンプルプログラムを書き写した時に、Namespaceの記述まで書きなおしてしまったという事例です。Namespaceのことを理解していない初心者にありがちなミスです。プロジェクトのデフォルトのNamespaceに戻しましょう。


2014-10-23

WPFにてウィンドウを透明化する

透明なウィンドウを実現するには、Xaml側のファイルにてプロパティを下記のように書けばOK。
  • WindowStyle="None" 
  • AllowsTransparency="True" 
  • Background="Transparent"
ウィンドウの上に何も載せないと実行時に何も見えないので注意。また、透明化するとクリックイベントも拾ってくれなくなるのでこれも注意。


2014-10-15

相互運用型 'Shell32.ShellClass' を埋め込むことができません

表題のようなエラーが出た時は、Shell32プロパティにて、
  • 「相互運用機能型の埋め込み」をFalse
にすることで解決します。

2014-10-14

WriteableBitmap を使用する場合の参照の追加について

独自作成のクラスライブラリ等でWriteableBitmap(System.Windows.Media.Imaging)を使うときは、
  • PresentationCore
という.NETコンポーネントを参照に追加しましょう。


2014-10-10

KinectにてColorFrameに対応するDepthFrameのPlayer情報を入手する方法

KinectではDepthカメラとColorカメラに座標のズレが有るため、v1.6から下記の座標変換系のメソッドがあります。(Kinect.CoordinateMapperクラスより)
  • MapColorFrameToDepthFrame 
  • MapColorFrameToSkeletonFrame 
  • MapDepthFrameToColorFrame 
  • MapDepthFrameToSkeletonFrame
  • MapDepthPointToColorPoint 
  • MapDepthPointToSkeletonPoint  
  • MapSkeletonPointToColorPoint 
  • MapSkeletonPointToDepthPoint
しかしこれはよく見ると、ColorPointから変換するメソッドがありません。つまり、Colorイメージのある座標をとることができない?実は、MapColorFrameToDepthFrameを利用すれば変換できるんですが、このメソッドで出力されるDepthImagePointについては、
  •  DepthImagePointクラスではPlayerIndexがとれない。(Depthはとれる)
という訳の分からない仕様になっています。ですので、一般的にはPlayer情報を取ってくるには、DepthImageのループから該当する箇所のColorImage座標を取ってくるという手法が取られてます。しかし、逆のことがしたいことってあるはずです。

解決策は、前記事にヒントがあります
つまり、ColorImageに合わせたマスクをあらかじめ作っておくことで、任意の座標からPlayer情報の有無を呼び出すことが可能です。実は前記事は、画像のマスクとした扱えるように2値化してますが、もっとシンプルな形式で保存しても構わないと思います。


Kinectにてユーザ領域のマスク(WriteableBitmap)を生成する

よくあるテキスト等で書かれている処理ですが、ユーザ領域のマスクを作っておくと、後々便利なことがあったりしますので、、、、


2014-10-06

OpenCVSharpにてMatを利用してピクセルのRGB値を変更する(ポインタ利用編)

以前の記事で
というのを書きましたが、あれはダメですね。遅すぎです。C#でもポインタは使えますので、下記のように書けばOKです。



2014-09-25

GoogleSiteにGistコードを埋め込む方法(正解編)

GoogleサイトにはGistのコード埋め込みスクリプトを直接埋め込むことができない、、、という問題があり、以前、
という試みをしましたが、そんな面倒なことをしなくてもいいということがわかりました。

Googleガジェット経由で直接呼ぶ
もともとは、
にあるように、fork元のコードを利用しようとしたのですが、フォントサイズとかの変更がうまく行かず、独自に作るしかない、、、と勘違いしてしまったわけです。

しかしながら、フォント設定を可能にするスクリプトがGistに公開されており、
のような記述により、フォントサイズ等を設定できるGoogleガジェットを利用可能となりました(元ソースは fork元を参照)。

使い方
  1. 挿入→ その他のガジェット → URLを指定してガジェットを追加
  2. https://gist.githubusercontent.com/ochilab/11a718344aca679711f0/raw/ を指定
  3. Gist IDを指定
という手順により、ページに合ったフォントサイズでGistのコードスニペットを挿入できます。

これで、どんどんGistにコードを流して、サイトにガンガン埋め込んでいくという夢のコンテンツ作成体制が実現できます。


2014-09-23

OpenCVSharpにてMatを利用してピクセルのRGB値を変更する

OpenCVSharpにて、Matを利用してピクセル操作する例です。



OpenCvSharpExtern.dll' を読み込めないためにMatが利用できない場合の対処法

OpenCVは、歴史的経緯よりIplImageクラスからMatクラスへと利用する流れになっています。Matはピクセル単位のデータアクセスが容易なため、個人的にも積極的に使っていこうと考えています。

Matクラスが使えない場合がある?
先日、OpenCVSharpが使えている環境で、Matクラスを利用すると(インスタンスを生成するだけで)プログラムが
Invokeエラー:OpenCvSharpExtern.dll' を読み込めない(見つからない)
といったエラーを起こしてしまうという事象が起きました。
おさらいですが、OpenCVSharpを使うには、母体であるOpenCVに対して
  • プラットフォーム(32 or 64 bit)を共通にする
  • バージョンを共通にする
といった注意点があるのは周知の事実です。さらに、OpenCvSharpExtern.dllについては

  • プロパティの「出力ディレクトリにコピーをする」

という設定が必要です。

これらを注意し、IplImageを利用したサンプルプログラムの動作を確認しても、Matを使う時にはダメ、、、という意味不明な事象。エラーはInvoke関係のエラーで、エラーメッセージの注意書きにあるように
  • OpenCVのパス確認
  • Visual C++ Redistributable Package(再頒布可能パッケージ)のインストール
  • プラットフォームの一致(32bit or 64bit)
と点に不備があると発生するようです。

Visual C++ 再頒布可能パッケージに罠があった!
で、今回のエラーでは上記条件は全てクリアしており、原因究明に試行錯誤していたのですが、原因はVisual C++ Redistributable Package(再頒布可能パッケージ)にありました。
今回の開発環境はVisual Studio 2010ですので、Visual studio 2010の再頒布可能パッケージをインストールすればいいと思っておりました。。。が、Dependency Walkerで依存ファイルを見てみると
msvcr110.dllがない
ということが発覚。これは、Visual Studio 2012の再頒布可能パッケージに付随するものです。つまり、Visual studio 2010を使っているから2010用の再頒布可能パッケージがあればいいのではないということ。これは盲点でした。早速、、Visual Studio 2012の再頒布可能パッケージをインストールして解決したわけです。

なお、OpenCVSharp系のエラーはDependency Walkerで原因究明しろと作者も述べているのでインストールしておくとよいでしょう。


2014-09-17

Linux: NTPで時刻の自動設定をする

NTPとは時刻同期のためのプロトコルで、これを利用することで正確な時刻にすることができます。下記はLinuxでの設定メモ書きです。なお、ntpのパッケージは入っていることを前提とします。

(1)/etc/ntp.confに下記を追記。
server ntp.nict.jp
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
該当箇所のほかは消しておいて下さい。サーバは、nict以外でもOK。 

(2)tcpとudpの123番ポートを開けておく

(3)強制同期。下記のコマンドを入力
ntpdate ntp.nict.jp
(4)サービスとして起動
/etc/rc.d/init.d/ntpd start


2014-08-26

COFF への変換中に障害が発生しましたというエラーへの対処法

Visual C++ においてコンパイル時に
COFF への変換中に障害が発生しました。ファイルが無効であるか、または壊れています
というエラーが発生することがあります。もし、Visual Studio2010を使っていてこのエラーが起きるのであれば、
  • Visual Studio 2010 のSP1をインストールする
ということで解決するでしょう。


2014-08-20

C#にてDirectXのAudioVideoPlaybackを利用したサウンドの同時再生。

C#でサウンドを再生するには、通常PlaySoundクラスを利用しますが、このクラスは音声ファイルの同時再生ができません。片方がなっている状況で別のファイルを再生をすると、片方が止まって新たしく別のサウンドが再生します。ゲームなどでは不便ですね。BackgroundWorkerを利用してマルチスレッド化を行っても、1つの再生プロセスを共有しているようで、PlaySoundクラスを利用したサウンドの同時再生は実質不可能なようです。

この問題には、DirectXを利用することで解決できます。事前に下記の設定をしたうえで、サンプルのように書けばOKです。このサンプルではボタンを押すと、他方のサウンド再生に関係なく、サウンドが再生します。なお、サンプルのように毎回インスタンスを生成しないと思ったように再生されません。
  • C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.AudioVideoPlayback.dllを参照に追加
  • app.configに<startup uselegacyv2runtimeactivationpolicy="true">を追加


  • 【デバッグ】→【例外】→「【Managed Debugging Assistants】→【LoaderLock】の「スローされるとき」のチェックを解除


  • 以上の設定をした上で下記のコードのように書けばOK。

    参考サイト

    2014-07-25

    OpenCVSharpにて、IplImageからHSV情報を取ってくる

    Matに変換するとIplImageから容易にHSVの情報が取ってこれます。。



    OpenCVSharpでのIplImage -> Mat 変換

    OpenCVでは内部の画像フォーマットとして、従来はIplImageが主流でしたが、現在はMat形式を利用する流れになっています。で、当然、IplImageとMatへの変換についてはOpenCVSharpでも対応しており、
    • Mat mat = new Mat(srcImage);
    というように、matのインスタンス生成時に IplImageを渡せば自動変換してくれます。

    OpenCVSharpExtern.dllの設定に注意
    Matクラスを利用するには、OpenCvSharp.CPlusPlus のパッケージを利用することになるのですが、このクラスは、OpenCVSharpExtern.dll を利用しているもよう。このdllは、参照設定では登録できないので、プロジェクトディレクトリに置かなければいけません。さらに、このファイルはプロパティにて
    • 出力ディレクトリにコピー:新しい場合はコピーする(または、常にコピーする)
    という設定をしなければいけません。この設定を忘れると、上述のような変換の記述を実行すると、
    • TypeInitializationException が発生しました
    というエラーが起きてしまいます。実はこのことに気づかず、Matへの変換ができなくて、何でかなーとかなり悩んでました。OpenCVのライブラリが動かなければすぐに気づいたのですが、通常の処理で問題なく実行できてましたので、まさか、初歩的な設定を忘れていたとは、、、

    これで、ラボでも本格的にMatベースの記述に移行することができそうです。



    Kinect for Windows v2センサー(オープンベータ)を入手しました

    事実上の製品版であろうKinect2 のオープンベータを入手しました。アルファ版との外見的な違いをざっと報告。

    本体は同じ
    アルファ版には悪趣味なシールが貼ってある点を除いて、同じと思われます。ベータ版にはKINECTの刻印があります。おそらく、アルファ版ではネーミングが未定だったのでシールを貼っていたのだと思われます。



    付属ケーブルが小型化
    アルファ版では、大げさなデカイ変換器だったのですが、以下の写真のように小型化されました。



    ただ、初代はこういったものがなかったわけですから、ちょっと残念なところです。初代からアダプターが増えている理由は、
    • 本体への電力供給量の増加
    が一番の要因と予測できます。TOFでリアルタイムにレーザで奥行きをとるわけですから、より大きな電力が必要になったのでしょう。現状ではこれ以上の小型化は期待できないですね。

    というわけで、ボチボチとうちのゼミでもKinect2に移行していきます。


    2014-06-27

    OpenCVSharpでクリックイベントを設定する(IplImage対応)

    OpenCVを利用する際には、その処理の確認をするためにOpenCVの持っているUI系メソッドを利用したほうが、デバッグが手早くできることがあります。OpenCVSharpでも当然それ系のメソッドは使えるのですが、クリックメソッドの設定の仕方に手間取ったのでメモ書きです。コードは下記のようになりますが、コールバックされるメソッドの引数についてはちょっと怪しい(よくわかってない)です。(もちろん動作は確認してます)



    2014-06-17

    C#のジェネリックデリゲートの使い分け

    C#ではデリゲートを利用することで、いわゆる関数ポインタ的な変数を利用できます。(最近はラムダ式を組み合わせるのが流行ってますが)。これには以下の3つの種類があります。使い分けに注意してください。
    • Action<> ・・・戻り値がvoidの場合
    • Func<> ・・・ 任意の戻り値を指定(最後の形名で)
    • Predivate<> ・・・ 戻り値がbool の場合
    Funcを利用して戻り値がvoidのものを受け取ろうとして、Funcみたいに書いたらエラーが出たので、、、その際は、ActionでOKなわけです。


    2014-06-06

    GoogleサイトにGistコードをはりつけるガジェットを試作しています ~GistGadget~

    面白いガジェット?を開発中なのでとりあえず紹介。。。

    このBLOGでは、掲載するソースコードについてはGistから埋め込むようにしています。これはとても便利なのですが、残念なことにラボのサイト(Googleサイト)では、仕様上、Gistのスクリプタグを貼り付けることができませんでした。

    で、今回試作したのがGistGadgetです。GoogleガジェットとGAEを利用して、任意のGistコードに対してリアルタイムにコードをとってきて表示しています。
    現在の機能は単純ですが、とりあえずは自分のサイトで活用して時期をみて公開します。


    2014-05-30

    Dynamic Data Displayはじめの一歩

    Dynamic Data Displayの使い方です。

    (1)DLLを参照設定に割り当てる
    ”DynamicDataDisplay.dll”というのが必須ですので、これを参照に追加します。

    (2)XAMLに直接記述する
    下記のように記述します。NameSpaceの設定を忘れないようにしてください。下記の例は、LineChartを利用するためのコンテナになる部分になります。

    (3)C#コードを書く
    あとは、コード内でplotterというのを呼び出すことができますので、これに対して操作をしていきます。

    Dynamic Data DisplayでWPF版グラフ処理

    WPFではFormアプリケーションと比べるとライブラリの数が少ない傾向があります。グラフ作成に関して、FormアプリケーションではChart コンポーネントが標準であるのですが、WPFでは今だに標準では用意されていない状況です。とりあえず以下の3つを使うのが一般的なようです。各ライブラリの細かい説明は省きますが、だいたい次の特徴があります。
    (1)WPF Toolkit
    Chartコンポーネントの実装がunstableになっているなど、一部不安定。更新もされていない。後継に、Extended WPF Toolというのがある?
    (2)Dynamic Data Display
    動的な変化に強い。更新はされてない
    (3)Metoro Chart
    Windows8のメトロUI向け。最近更新されている。

    本ラボでは、動的なLineChartのグラフ更新をしたかったので(2)を選択しました。(1)も試してみたんですが、unstableな状態のせいか、だんだん速度が遅くなって最終的に動作が停止してしまうんです。同じような使い方で(2)では問題なくサクサク更新してくれました。(3)については将来的に使うようになるかもしれません。


    2014-05-19

    スレッド外にあるImageクラス(WPF)にWritableBitmapを割り当てる

    WindowsのUIクラスは、基本的にメインのスレッドで動いており、他のスレッドから操作することはできないようになっています。例えば、他のスレッドからカメラの映像をリアルタイムで取り出し、それをImageクラス(WPF)に表示するという記述は原則できません。
    もちろん、これを解決する策はあり、Invokerを経由すれば可能です。一番簡単な方法は、下記のサンプルソースに示すようにラムダ式を利用することで簡潔に表現できます。

    なお、このケースでの注意点はもう1つあります。それは、Imageクラスに描画するためのWritableBitmapもスレッド外から操作できるように、Freezeしておく必要があります。実はここが一番の悩みどころだったりしました。



    Byte[]に入っているJPEGデータをBitmapImageに変換する

    Byte[]に格納されているデータをWritableBitmapに変換するためには、

    MemoryStream を経由してBitmapImageのStreamSourceに設定する 
    のがよいらしいです。ただし、BeginInitとEndInitが必要です。これがないとダメです。


    2014-05-17

    Byte[]に入っているJPEGデータをWritableBitmapに変換する

    Byte[]に格納されているデータをWritableBitmapに変換するためには、
    MemoryStream -> BitmapFrame -> WritableBitmap
    という流れでやるとよいらしいです。下記のサンプルでは、MemoryStreamへの変換を2回やってますが、1回でいいかもしれません。


    2014-05-16

    WPFでChartを利用するには、Silverlight/WPF Data Visualization Developmentを使えばよい

    C#のデスクトップアプリでグラフ(Chart)を利用するには、Windows Formプロジェクトであれば、
    System.Windows.Forms.DataVisualization.Charting
    を利用すればいいわけですが、WPFプロジェクトであればそう簡単にはいきません。なんと標準ではChart系のGUIコンポーネントがないという信じられない状況。
    で、どうやら
    というのをダウンロードするといいようです。

    使い方
    次のいずれかの方法で使えます。
    • ダウンロードしたプロジェクトを参照する
    • \Binaries\WPF4にあるSystem.Windows.Controls.DataVisualization.Toolkit.dll を参照に追加
    とりあえず、Visual Studio2010でデスクトップアプリ(WPFプロジェクト)で動作確認しました。ネットの資料が少なそうですが、WPF ToolKitと同じ流れにあるようなので、その関連資料をみれば使い方がわかるのではないでしょうか?



    2014-05-14

    C#:WritableBitmap とIplImageの相互変換

    前記事で、KinectではWPFのWritableBitmapを利用することをオススメしました。しかし現実には、Kinectの画像をただ表示するだけでなく、OpenCVで加工するなども処理も必要になります。この辺りの対応については心配なところですが、当然できています。下記のコードに示す通り、WritableBitmapクラスやIplImageクラスが相互変換するためのメソッドを実装しています。

    ここで注意点は、2番めと3番目の処理の違いです。いずれもIplImageからWritableBitmapへの変換をしているわけですが、2番めはごっそり入れ替わる事になります。具体的に言えば、WPFのImageクラスのSourceにWritableBitmapを割り当てていた場合、2番めの処理をするとSourceに割り当てていた領域とは違うメモリ領域(アドレス)が割り当てられてしまい、以後、Imageの描画が反映されなくなります。後者の場合は、Sourceに割り当てたWritableBitmapの中身だけを書き換えるので、以後もImageの描画が反映されます。



    Kinectプログラミングをする時は、WPFプロジェクト がお勧めです

    Windowsプログラミング(.NETフレームワーク)において、GUIアプリの開発アプローチとしては、歴史的に
    • Formアプリケーション
    • WPFアプリケーション
    の2つに分けられます。前者は従来のWindowsGUIプログラムの流れです。後者はVista以降に標準搭載された.NETフレームワーク3.0に最適化されたもので、GUI定義がXAMLと呼ばれるXMLで書かれたファイルで表現されるだけでなく、2Dや3Dを含めた各種GUI処理を統一的に扱えるフレームワークを持つという特徴があります。

    ラボでは過去の実装ノウハウを活かすこととWPFに関する資料が少なかったことから、現在まで原則前者を使ってきており、Kinect のプログラミングでもそうしてました。しかし、画面描画処理のパフォーマンスをあげるなら、WPFの方が良いということに今更気づいたのと、さすがにWPFを無視することができなくなりましたので、以後、KinectプログラミングについてはWPFに乗り換えることにします。

    WritableBitmapを利用するのがポイント
    KinectのColorFrameをWPFで表示する際は、
    • PictureBoxクラスではなくImageクラスに表示
    • BitmapではなくBitmapSourceを割り当てるのが基本
    • WritableBitmapを割り当てると表示処理が高速化
    という点が変わります。ポイントは3つめです。下記のサンプルを見てもらえばわかりますが、WritableBitmapを作成しImageクラスのSourceに1度だけ割り当てるだけで、あとはWritableBitmapの内容を更新するだけで更新されます。Formでは各フレーム画像ごとに毎回Bitmap変換して貼り付けていましたから、プログラムのスッキリしますし速度の向上も期待できます。



    2014-05-11

    反転授業用ビデオ作成にOffice Mixが面白そう


    Microsoftから Office Mixというツールが登場しています。これは、
    オンラインレッスンを簡単に作る
    というコンセプトの元で作られたパワーポイントのアドインソフトウェアです。このソフトを利用するには、
    1. Office2013 with ServicePack1のインストール
    2. Offece Mixのサイトからプラグインをダウンロード&インストール
    という手順が必要です。インストールが成功すると、パワーポイントにMixというリボンができています。


    使い方の詳細はここでは書きませんが、基本的に、
    • パワーポイントスライドまたはデスクトップの画面をベースにする
    • スライドを任意のタイミングで進行させながらスライドへの書き込みが可能
    • 書き込みと同時に、ビデオ、音声の埋め込みが可能。
    というシンプルな操作で直感的に理解できるでしょう。

    下の画面は、Khan Academy っぽく、パワーポイントのスライドを黒地にしてそれに書き込んでみました。試してみるとわかりますが、ペンタブレットで書くのって意外と難しいですね。慣れが必要です。


    まだまだPreview版ということで
    • 書き込みの削除不可
    • 音声、ビデオの編集不可
    というように機能としては不十分ですが、これからどんどん改善されると思います。反転授業用のビデオ教材作成に使えないかなとちょっと思ってます。


    2014-05-09

    Funcデリゲートを使って実行内容を柔軟に変更する

    C#には、デリゲートと呼ばれる枠組みがあります。C言語でいう「関数ポインタ」みたいな位置づけと思えばいいです。.NET Framework3.5から採用されています。抽象メソッドに似てますが、違うところは、
    抽象メソッドはメソッド名まで定義されているが、デリゲートでは引数と戻り値だけが定義。名前は自由。
    というところでしょうか。使い方は下記の通りです。抽象メソッドよりも何かクールな気がしませんか?


    2014-04-25

    GAS: HTML出力時のハイパーリンクの埋め込み方

    しょうもないネタですけど、ちょっとハマったのでメモ書き。

    GASを動的なHTML出力をする時には、doGetメソッド内でcreateHTMLを利用すればいいのですが、ハイパーリンクを利用するときには注意が必要です。createHTMMLの中にアンカータグを入れてもダメです。無視されます。ハイパーリンク(アンカータグ)を追加したいときは、createAnchorを使います。


    2014-04-22

    PuttyGenでTeraTerm用秘密鍵を作成する際の注意事項

    ちょっと手間取ったのでメモ書き。SSH等のセキュアな接続のために秘密鍵/公開鍵をWindowsで生成するには、
    を利用するのが、一般的かと思います。しかし、Teratermで秘密鍵を読み込ませると、
    SSH2 秘密鍵の読み込みに失敗しました。error:pem_read_bio no start line
    というエラーが出ます。これは、 秘密鍵ファイルの形式が異なっている可能性があります。メニューから、【Conversions】→Export OpenSSH key】と保存しなおしましょう。


    これでログインが行えるはずです。



    2014-04-20

    GoogleサイトでのApp スクリプト呼び込み時にUserPrefを設定する方法

    久しぶりのGAS(Google App Script)ネタです。

    Google サイトでもGASは利用可能
    ほとんどの人が知っていると思いますが、GASはGoogleサイトに埋め込みが可能です。Googleサイトは、JavaScriptの利用に関していろいろ制約がありますが、GASを利用することでちょっとした動的なページ生成が自然にできるという利点があります。その埋め込み方ですが、Googleサイトではデフォルトで埋め込みができるようにウィザードが用意されています。


    Google Gadget用のXMLスクリプトを書かなくてもいいというのは便利ですね。

    UserPrefの設定ができない
    しかし、その便利さが欠点を生み出しています。それは、UserPrefを独自設定できないということ。XMLを書かなくてもいいということはカスタマイズできないというわけです。UserPrefを利用できれば、Gadgetの埋め込み時に初期パラメーターを任意に設定できるようになるので、URLパラメーターとしてGASに渡すことで、汎用的な使い方ができるという利点があります。そこで標準のウィザードに頼らず、GoogleGadgetのXML記述を自分で用意してiFrameの形式で呼び出せば、、と試みたんですが、どうもうまくいなかい。私のミスの可能性もありますが、少なくともiframeではなぜかGASを呼び出せないという結論になりました。

    解決策:自作GadgetからスクリプトGadgetを呼ぶ
    とりあえず試行して成功したのは、自作のGadgetXMLファイル内でiframeを介してスクリプトGadgetを呼ぶという荒業です。手順を以下に示します。
    1.標準のApp スクリプトGadgetを利用して、対象のスクリプトを呼びページに埋め込む
     まずは、対象のAppスクリプトを標準のウィザードで呼び出しページに埋め込みましょう。
    2.ページをHTMLモードで表示し、App スクリプトGadgetのURLを見つける
     Gadgetの中でdata-origsrcというのがGadgetURLの設定パラメーターのようですので、そのURLをメモします。


    3. 自作のGadgetXMLファイル内でuserprefとiframeタグを記述する。
     iframeタグで先ほどメモしたApp スクリプトGadgetのURLを指定します。UserprefのパラメーターをURLパラメーターに渡すことはもちろん可能です。


    これで、GAS+Googleサイトを利用したちょっとした面白いアプリができそうです。

    2014-04-06

    Googleドライブでビデオ教材を公開する

    今日は、講義運用系ネタです。昨今、オンラインでビデオ教材を公開するのがあたり前になってきており、個人的にも何かやってみたいとは考えているのですが、実際に運用する際に気になるのはサーバをどうするかです。一昔前であれば自前でサーバ用意してましたが、ビデオ配信となるとそれなりの帯域も使いますし、マシンスペックも必要となります。またユーザ管理とかサーバー自体のメンテナンスも負担になってきます。

    Googleのサービスを利用する
    上記の問題に対する解決策として、Googleのサービスを利用することにしました。Googleで動画を公開するには2つのアプローチがあります。
    • Youtubeで公開する
    • Googleドライブで公開する
    おそらくYoutubeを使うというのが一番メジャーだと思われますが、ここではあえてGoogleドライブを勧めます。その理由は
    • Youtubeにすると、学生がついついYoutubeの他のページを見てしまう可能性がある
    • ユーザ制限をするなら断然Googleドライブ
    という点です。特に後者が重要。youtubeの限定公開はURLがわかるとだれでもアクセス可能なのが要注意です。Googleドライブではユーザ単位(Googleアカウント)で制限できます。

    ゼミ生向けの動画コンテンツをアップ
    試しに、ゼミ生向けの卒研テーマの説明資料を、音声付きスライド動画資料としてアップしてみました。今は就活で皆が一斉に集まりにくい時期なので、卒研テーマの説明を音声をつけて配信することで、より詳しく意図が伝わるのではないかという狙いです。下記は、再生時のスクリーンショットです。


    再生時の見た目はほとんどyoutubeと同じ。wmv形式のファイルをアップしましたが、ストリーミング配信が可能な形に自動で変換してくれます。バックがおそらくyoutubeとほぼ同じと思われます。ただ、youtubeにアップした時と比べ、ストリーミング変換にちょっと時間がかかるため、アップした直後はGoogleドライブ上では再生できません。もちろん、ゼミ生以外は閲覧することは不可能です。

    ビデオ教材配信を検討している方の参考になれば幸いです。

    2014-03-23

    H25年度卒業生、修了生を送り出して



    卒業・修了おめでとうございます。週末にかけて、大学院修了式と大学の卒業式がありました。本年度は、学部9名、修士5名が巣立ちました。今年は例年になく人数が多く、細かいところまで指導がいき渡らなかったなぁ、、、という思いをもっているわけですが、とりあえず今年も、各授与式等であった各先生方の式辞の内容をネタにしながら、個人的にアレンジした贈る言葉を書いてみようかと思います。

    まず、個人的に思っていることですが、、、

    仕事を偽らない人であってほしい
    いま、某研究の偽装疑惑がニュースに上がっていますね。このニュースの真偽はともかく、「認められたい「怒られたくない」、「悪い結果を出したくない」といった動機で、仕事や結果を偽るような人にはならないで欲しいです。学校での勉強は基本的に個人の問題です。それに嘘や偽りがあれば個人の問題の範囲で終わることが多いでしょう。しかし、仕事はそうではありません。仕事はいろんな人が絡んできます。偽ったことで生じる問題は、仕事に関わる人々や会社の信用問題につながります。仕事の偽りは他人の人生や命に関わってくることを意識してもらいたいです。

    次に大学院の専攻長の先生の話のネタからは次の2点を。。。

    知っていることと知らないことを区別する
    言い換えれば、「仕事において問題・課題を切り分けていく」という視点。例えば、自分の仕事においてできることをできないことを明確にするだけでなく、それが自分のスキルの問題なのか技術的な問題なのか?どこまでは可能でどこからが不可能なのか?そこを見極めてフィードバックしていくことが仕事を円滑にこなしてくうえで大切なことです。また、上述の話にもつながりますが、「できないこと」を「できる」と偽らないこと。もちろん仕事の上では、「できる」と大風呂敷を広げないといけないもあるでしょうけど、何も見極めないまま「できる」と無責任に言わないようにしてほしいです。なお、その見極めには「知識」と「経験」が必要です。卒論・修論での研究過程では、少なからずともできるかどうかわからない事に取り組んだハズです。それがどのレベルだったのか?思い返しながら、今後の人生に活かしてください。

    幸せは自分で掴むもの
    幸せというのは自然にやってくるものではありません。そして、幸せの形も人それぞれであり、他人と比較して決めるようなものではないです。「幸せになりたい」という向上心は生きる上で大切なことですが、変に拘っていると、身の回りに存在しているいろいろな幸せに気づかなくなります。幸せを感じない人生はつまらないものですが、感じるかどうかは自分次第なのです。

    学科同窓会会長の話からは次の2点。。。

    受け身ではダメ、ホウレンソウを忘れずに
    これは私も日々言っていることですが、残念ながら年を追う毎に守れない傾向が強いですね。卒論・修論は個人的な要素が強かったからかもしれませんが、卒業後、はやくこの重要性を気づいて欲しいですね。ホウレンソウがない部下ほど使いづらいものはないですよ。

    3年間は勤める
    会長さんは3年といいましたが、仕事がわかってくるのは5年はかかるんじゃないかなという気がします。というより、最初から自分がやりたい仕事をさせてもらえるのは稀だと思います。まずは、泥臭い下の仕事をやりながら、会社の仕事を理解させていくことが多いかと思います。もちろん、その際もただ淡々とこなすだけでなく、やっている仕事の位置づけとか、課題とか、全体を見据えるような意識が必要でしょう。

    続いて学科長の話からは次の2点

    心身ともに健康であれ
    まさに、まずは健康第一だと思います。私も後輩や教え子が病気になったという話を聞くこともありますし、仕事と健康のどちらかが大切か、、、もちろん、仕事は適当でいいというわけでもないですが、「健康を害するまでするべき仕事」というものはないと思います。

    他人はあなたを見ています
    本当に使える人材であるかどうか、会社の人は見ていますよということ。上述の3年勤めるという話にもありましたが、最初の3年や5年というのは、仕事を覚えていく過程の中でどういう人材か見られているということですね。

    最後に、学科では3名の退職される先生の式辞がありましたが、その中から1つ。。

    がんばらない、心身ともに疲れていてはダメ
    まさに退職されている先生ならではのアドバイス。上述の「健康であれ」という話とも共通しますが、心身ともに疲れていては仕事のパフォーマンスも上がらないでしょうし。。。ただ、がんばらないで適当にやってればいいというわけではありません。それだと仕事のパフォーマンスが上がりませんから。個人的に1つだけ付け加えるとしたら、「最初は全力でがんばれ」ということかな。例えば、はじめて水泳の練習をした時のことを思い出して下さい。最初は緊張して全身に力が入っていたかと思います。だから、25m泳いだらもうクタクタ。。。でも練習して経験を積んでいると、だんだんといい感じに力が抜けてきます。そして、いつのまにか25mが楽に泳げるようになり、次は50m、100mと泳げる距離が伸びていったかと思います。「がんばらない(がんばらなくていい)」というのは、長年経験した人だからこそ言えること。最初は、特に若い時は仕事のパフォーマンスを上げるよう頑張ってみてください。そして、徐々に手を抜く勘所を見つけていく。。。そうしれば、がんばらなくても高いパフォーマンスを発揮できる人材に慣れると思います。

    ちょっと長くなってしまいましたが、以上、贈る言葉です。最後に重ねて、卒業・修了おめでとうございます。


    2014-03-07

    BackGroundWorkerを利用してKinectのイベントを別スレッドで実装する

    ~ 一部間違いがありましたので訂正します(2014/3/7) ~

    Kinectのプログラミングが進んでくると、データ処理部分が肥大化してきます。それは仕方がないことですが、システム全体のパフォーマンスが落ちることになるので、マルチスレッドにより処理する必要が出てきます。この際のマルチスレッド化ですが、具体的には
    • Kinectから得たデータの処理を別スレッドに回す
    • KinectのReady系イベントを別スレッドに回す
    という2つのアプローチがあります。前者はよくされていると思いますが、後者は意外に知られてないかもしれません。確かに、普通はKinectの各種イベントはFormスレッド内に記述することが多いと思いますが、UI周りの処理が複雑化するとシステム全体のパフォーマンスが落ちる可能性があるのでしょう。

    BackgroudWorkerを利用してみる
    某サイト(最下部参照)にそのことが書かれていたのですが、そのサイトはThreadクラスを使って検証していたようなので、今回はBackgroudWorkerとの合わせ技で別プロセスでの処理が可能かどうか検証してみました。BackgroundWorkerの利便性は前記事で述べたとおりです(C#:BackGroundWorkerコンポーネントを利用したマルチスレッド処理)。

    で、結論から言えば成功です。実装のポイントは
    • DoWorkイベント内で初期設定からstart()までを記述する(EventHandlerの登録処理は必須)
    • スレッドを維持する必要はなし(ループ処理は不要)
    • UIコンポーネントへの操作も普通にできる(ProgressChangedイベントさえ不要)
    • ColorFrameReadyでのPictureBoxへの描画は普通に可能
    という感じです。UIコンポーネントへの操作はいつものようにFrameReady系のメソッドで書けばいいので、従来との互換性も高いです。 

    (訂正です)UIへの操作について、Labelの値を変えようとしたらエラーになってしまいました。すべてのUIが操作可能というわけではないようですね。とりあえずInvokerで操作はできます。

    本当に別スレッドなのか?
    しかし、本当に別スレッドになってるのかどうか、すこし心配になったので、
    • System.Threading.Thread.CurrentThread.ManagedThreadId
    を各イベント内でコールして確認してみました。具体的には
    • Form_Load()
    • backgroundWorker1_DoWork()
    • kinect_ColorFrameReady()
    • kinect_SkeltonFrameReady()
    • Button_Click()
    の4つのイベント系関数でコールして、従来の手法と今回の手法で、IDに違いがでてくるのかを確認しました。結論を言うと上記イベントでの各IDを横に並べてみると
    • 従来: 9,10,9,9,9
    • 今回:9,10,11,11,9
    という感じになりました(数字はIDの例で、数字自体に意味はありません)。つまり、従来の方法だとFormのスレッドとKinectのスレッドは同じスレッドで動いていたことがわかります。今回の手法だと、Formのスレッドとは異なり、またBackgroundWorkerのスレッドとも異なるスレッドで処理されているようです。
    このことから言えるのは、従来の方法だとFormの描画もUIのイベント(例えばボタンクリック)もKinectの処理もすべてシングルスレッドで処理していたことになりますので、本手法の効果は大きいと思います。

    Ready系イベントをそれぞれ独立にスレッド化はできない
    もしかして、Ready系の各イベントを別スレッド化するってこともできるんじゃないか?と思い、BackgroundWorkerを増やして試してましたが、残念ながらそれは無理でした。これらのイベントは1つのスレッドで処理されるようです。

    以上、プログラムが肥大化した人は参考にしてください。

    参考サイト
    Kinect SDK C# FrameReady系イベントの実行スレッドについて



    2014-03-05

    AWS SDK2.0 からのSimpleDBクライアントの呼び出し変更について

    AWSのSDKのバージョンを上げたら動かなくなったので、、、、過去のソースが動かなくなるので注意です。



    2014-03-01

    GitHub:authentication failed のメッセージが出てsyncできなくなった場合の対処法




    ちょっと躓いたのでメモ書きです。普段、GitHub for Windowsを利用してGitHubにコードをアップするのですが、数日前より冒頭の図のようなメッセージが出てsyncができなくなりました。特にネットで話題になっているわけでもなく、バグとかサーバートラブルではない模様。調べてみて、
    • GitHub for Windowsを入れなおす
    • パスワードを変える
    • SSHKeyを作り直す(これは GitHub for Windowsなら不要?)
    と試行錯誤をしつつも動かず。。。で、結局、
    • <ホームディレクト>\Appdata\Local\Temp
    にあるファイルを全て消すということで、解決しました。メッセージを見る限り、認証関係のファイルが古くなっているので、それを最新にすればいいのですが、上述3つの方法では反映されないようで、であれば、どこかの古いファイルを見にいってるんだから。。。ということで、この方法をとりました。根本的な原因はわかりませんけど、とりあえずこれでよしとします。


    2014-02-09

    OpenCVSharp:ラベリング処理の記述が変更

    OpenCV周りのバージョンをあげてC# から呼び出したらエラーが。メソッドの引数が合わないとか、、、実は、OpenCVSharpの方でメソッド仕様の変更があったらしい。
    OpenCvSharpをつかう その18(ラベリング・改)
    詳細は上記の作者BLOGを参照のこと。(これ、意外と影響大きい気がします。。)

    書き方は、下記のようになります。以前は、IplImageクラスでラベリング情報をかんりしていましたが、CvBlobsクラスで管理できるようになったということですね。コメントアウトしているのが以前の書き方です。



    2014-01-29

    Kinect: Facetrackerを利用する際の初期設定

    KinectのFacetrackingの初期設定でちょっとハマったのでメモ書き。

    要求スペック
    • Kinect SDK 1.5以上
    • Kinect Developer Toolkit 1.5以上
    • Kinect for Windows本体(XBOX360版でも可。ただし、nearモードが使えない点に注意)

    SDK類はバージョンに注意。特に、Developer Toolkitは忘れないように。

    利用する(参照する)ライブラリ
    • Microsoft.Kinect
    • Microsoft.Kinect.Toolkit.FaceTracking
    • Microsoft.Kinect.Toolkit
    この3つだけでOK。最初のライブラリはKinectSDKのものです。残りの2つはToolkitのディレクトリに入っていますが、下記に紹介するように各ライブラリはコンパイルして作成し直すことをオススメします。

    ライブラリのプラットフォームに注意
    Visual Studioで開発する際には
    • x86(32bit)
    • v64(64bit)
    • Any CPU
    というようにビルド時のターゲットが選べます。ここで問題になってくるのは、利用するライブラリがどのターゲットでコンパイルされているかです。Kinectのサンプルプログラムの場合、この当たりがちょっと不明で、適当に選んだりすると、
    ということになります。

    ライブラリの再コンパイルと実行の手順
    詳細は書きませんが、だいたい以下のようになります。

    (1)Developer Tool Kitから各ライブラリのプロジェクトをインストール
    • スタートメニューからKinect for Windows Developer Toolkitの画面を起動
    • Componentsを選択
    • Microsoft.Kinect.Toolkit.FaceTrackingとMicrosoft.Kinect.Toolkitをインストール(Visual Studioのプロジェクトが保存されます)


    (2)現在開発しているソリューションに保存した各プロジェクトを追加



    (3)プラットフォームを共通にする
    各プロジェクトのプロパティ→ビルドで x86 または x64にしてください。どちらが良いかは、他に利用するライブラリによっても変わってきます。



    (4)参照設定にてプロジェクトを追加


    これで動くはずです。Facetrackingのクラスが呼び出せないのは、まずプラットフォーム(x86,x64,anyCPU)の違いであると考えていいと思います。


    2014-01-21

    AWS:SimpleDBのクエリーで order by する際の注意事項

    ちょっとしたメモ書き。SimpleDBのクエリーでは、RDBのSQLと同様にorder byを利用したソーティングができます。
    • 降順: order by XXXX desc 
    • 昇順: order by XXXX asc 
    となります(XXXXはソートするAttribute名)。ただしソート対がnullを含んではいけないというのがあり、これはクエリーで明示的に書いておく必要があります。具体的には、以下のようにwhere句でnullがないように明示しておく必要があります。
    where XXXX is not null order by XXXX desc
    ご注意を。

    2014-01-15

    ちょっと大きい数の数値計算にMaximaを使ってみました

    講義の資料としてMod(モジュロ)表を自作しようとしたのですが、ちょっとハマったので、、、

    演算桁には限界がある
    コンピュータのことを知っていれば当然の話ですが、コンピュータの演算桁には限界があります。講義資料用に、ab (mod 33)の表を作成しようとしたのですが、Excel でmod関数を使ったら、ちょっと計算しただけで(10乗当たりで)限界になりました。mod関数を使わなかったといても、12乗当たりで限界に。C言語でunsigned long long型を使ってみましたが、ほぼ同様な結果に。

    Maximaというソフト
    よくネットにアップされているMod表はどうやって作られているのか?通常の数値型を使わずに配列などを用いるなど、工夫をしてプログラムを書けばCでもできるのでしょうけど、ちょっとめんどくさい。
    数値計算用のソフトやライブラリを使えば手っ取り早い。代表的なソフトにはMathmaticaがありますが、今回、フリーソフトのMaximaというのがあるので、これを試してみました。ちなみに、Maximaでabのmod表を出力するコードは以下の通りです。
    Maxmaでコードを書くのは当然初めてなのでいろいろ試行錯誤しましたが、とりあえずこんな感じでいいかと思います。
    個人的にはこういった数値計算ソフトを使うのは初めてでしたが、今度は、CやJavaで数値計算ライブラリを使って試してみようかと思います。