Memo Life

ビギナーSEのメモ書き

2014/01/18タスク整理

タスクの整理

  1. Kinectプログラミング(C#)→開発ターゲットなし(Developer Toolkitのサンプルコードビュー)
  2. jQuery-mobileによるUIの作成→3画面ほど作成予定
  3. C#プログラミングスキル→目標設定が曖昧(Unityさわるか、OpenCVSharp試してみるか・・・)
  4. RPGツクールVX aceによるゲーム作成→未着手

リファレンスと国語・英語辞書を両手に、C#で何かができるまで005

OpenCV Sharpを利用してみる

OpenCV自体さわったことがないが・・・

using OpenCvSharp;
using OpenCvSharp.Extensions;

// ......

IplImage redImg = new IplImage(new CvSize(640, 480), BitDepth.U8, 3);
redImg.DrawRect(new CvRect(0, 0, 640, 480), new CvScalar(0, 0, 255));
Cv.ShowImage("red image", redImg);


...

(続)PhoneGapコマンドでAndroidネイティブを実行するときの実行時エラー

昨日の続き

http://nata-water.hatenablog.com/entry/2014/01/15/071906

ANDROID_HOMEを設定する

ANDROID_HOME
C:\Users\[ユーザー名]\android-sdks

AVDの設定・・・をしてもエラーが発生するので

自分のスマートフォンデバッグモードで接続。

phonegap run android

無事にインストール完了。

AVDのやり方についてはまた調査して別途。

PhoneGapコマンドでAndroidネイティブを実行するときの実行時エラー

PhoneGapさんのインストール&アプリ作成

npm install -g phonegap
phonegap create hoge
cd hoge
phonegap run android

PhoneGapさんからの熱いメッセージ

Error: ERROR : executing command 'ant', make sure you have ant installed and add ed to your path.

antが必要だ!パスに入れてね!

antは、androidプロジェクトのビルドをコマンドラインから実施するために必要なものらしい。

npmを利用して、antをインストール

npm install -g ant

以下のディレクトリを見ると、antが入ってきている。
%APPDATA%\npm\node_modules


Antのパスを設定

システム環境変数を作成
変数名:ANT_HOME
変数値:C:\Users\[ユーザー名]\AppData\Roaming\npm\node_modules\ant\ant

システム環境変数Pathに対して、以下の値を追記
;%ANT_HOME%\bin

Android SDKのパスを設定

システム環境変数Pathに対して、以下の値を追記
;C:\Users\[ユーザー名]\android-sdks\platform-tools;C:\Users\[ユーザー名]\android-sdks\tools;

リラン

phonegap run android

再びPhoneGapさんよりエラー

JDKのパスが環境変数%JAVA_HOME%に見つからない ようなメッセージ。

JAVA_HOMEを設定

システム環境変数を作成
変数名:JAVA_HOME
変数値:(JDKのbinフォルダ)


リラン そして エラーへ

An error occurred while emulating/deploying the android project.

どうやら、以下のサイトを見た感じだと、ANDROID_HOMEという環境変数が必要みたいだ。

http://stackoverflow.com/questions/19278072/phonegap-3-android-deploy-install-error

You need to create a new Environment Variable called "ANDROID_HOME".

The value for this variable is your sdk location. In my case, I put: "C:\Users\Jesualdo\Desktop\sdk\sdk\tools".

もう出勤時間が来てしまったので、仕事から帰ってから続きを書くこととする。

リファレンスと国語・英語辞書を両手に、C#で何かができるまで004

Kinect for Windowsで取得できるデータの整理

RGBカメラ
 ColorImageStreamから、あるタイミングでのColorImageFrameをピックアップ
・Depthカメラ
 DepthStreamから、あるタイミングでのDepthImageFrameをピックアップ

※あるタイミング:fpsにより、変わる
 →fps=30ならば1秒間に30回。

リファレンスと国語・英語辞書を両手に、C#で何かができるまで003

データバインドって何でしょう

Kinect for Windows Developer Toolkitの中で、
FaceTrackingBasics-WPF(MainWindow.xaml.cs)を読んでいたときにふと思った。

var faceTrackingViewerBinding = new Binding("Kinect")
{ 
    Source = sensorChooser 
};
faceTrackingViewer.SetBinding(
    FaceTrackingViewer.KinectProperty, 
    faceTrackingViewerBinding
);

データバインディングを利用すると、データ表示や操作を簡単に行うことができる。
データ表示(UI)とデータ(オブジェクト)の管理は分離されているが、UIとオブジェクトの接続(バインド)を確立することで、データがその間を簡単に移動できるようになる。
http://msdn.microsoft.com/ja-jp/library/windows/apps/hh758320.aspx


上記の例でいくと、
System.Controls.UserControlクラスを継承したFaceTrackingViewerをMainWindow.xamlのビューとして利用している。

<local:FaceTrackingViewer x:Name="faceTrackingViewer" />

つまり、KinectSensorChooserがデータ(ソース)であり、その内容をfaceTrackingViewerオブジェクト内で参照するための接続(バインド)を行っているようだ。

ちなみに、FaceTrackingViewer内には以下のようなソースが書かれている。

public static readonly DependencyProperty KinectProperty = DependencyProperty.Register(
    "Kinect",
    typeof(KinectSensor),
    typeof(FaceTrackingViewer),
    new PropertyMetadata(
        null, (o, args) => ((FaceTrackingViewer)o).OnSensorChanged((KinectSensor)args.
OldValue, (KinectSensor)args.NewValue));

DependencyProperty.Register メソッド
入力パラメーターにしたがって、パラメーター化したプロパティを持つDependencyPropertyクラスの新しいインスタンスを作成する。
http://msdn.microsoft.com/ja-jp/library/ms605349(v=vs.100).aspx

public static DependencyProperty Register(
    string name,
    Type propertyType,
    Type ownerType,
    PropertyMetadata defaultMetadata
);
/*
引数:name
 DependencyPropertyの名前

引数:propertyType
 プロパティに含めることのできる値のType

引数:ownerType
 依存プロパティのオーナーのType

引数:defaultMetadata
 追加のプロパティオプション 
 上記例でいくと、PropertyMetadataインスタンス生成時に自クラス内のOnSensorChangedをコールバック(PropertyChangedCallback)とするラムダ式を指定している。
*/

Kinect for Windows関係の単語整理

連番(続き) 単語 意味
7 dependence 依存 DependencyProperty
8 supress 抑圧する,鎮圧する GC.SuppressFinalize(this)
9 context 背景,状況 DrawingContext
10 virtual 仮想メソッド protected virtual void Dispose(bool disposing){}
11 enumrate 列挙する,数え上げる private EnumIndexableCollection facePoints;
12 geomerty 幾何学 GeomertyGroup


日本語の整理(念のため)

連番 用語 意味
1 修飾 美しくつくろい飾ること
ある語句で他のごくの意味を限定すること
virtualキーワードはプロパティ、メソッド、
インデクサー等の宣言を修飾する


本日のMFS(My Favorite Sourcecode)

// WPFでDrawingVisualに描画した画像や文字をRenderTargetBitmapとして格納し、BitmapEncoderでファイル出力する
DrawingVisual drawVisual = new DrawingVisual();

DrawingContext drawContext = drawVisual.RenderOpen();

drawContext.DrawImage(
    new WriteableBitmap(50, 50, 96, 96, PixelFormats.Bgr32, null),
    new Rect(0, 0, 50, 50)
);

// 日付文字列の作成
DateTime date = DateTime.Now;
string dStr = d.Year + "/" + d.Month + "/" + d.Day + " " + d.Hour + ":" + d.Minute + ":" + d.Second + "." + d.Millisecond;

// 日付の埋め込み
drawContext.DrawText(new FormattedText(dStr, System.Globalization.CultureInfo.CurrentUICulture, 
FlowDirection.LeftToRight, new Typeface("Verdana"), 10, Brushes.MediumSprintGreen), new System.Windows.Point(10, 10));

drawContext.Close();

// 空のRenderTargetBitmapを用意。
RenderTargetBitmap targetBmp = new RenderTargetBitmap(50, 50, 96.0, 96.0, PixelFormats.Pbgra32);
targetBmp.Render(drawVisual);

BitmapEncoder enc = new JpegBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(targetBmp));

using(FileStream stream = new System.IO.FileStream(ANY_DIR + ".jpg", FileMode.Create))
{
    enc.Save(stream);
}

リファレンスと国語・英語辞書を両手に、C#で何かができるまで002

問題意識

ソースを書いていて、よく思うことがある。

クラス、ライブラリの利用等、プログラミング時には英単語を少なからず読むのだが、それぞれ単語が示す本来の意味、役割を理解できているのだろうか。

例えばC#で画面作ってて思うのがこれ(ContextMenuStrip)

え、Context?何それ?
といった形で、意味をよく理解しないまま、クラスを利用していることが頻繁にある。

dic:Context
(事件,行動などの)背景、事情

仮説を立ててみる

不明な単語があった場合に、調査して自らの知恵にできた場合、ソースコードが読みやすくなるのではないだろうか

実践してみる。Kinect for Windows関係の単語整理

連番 単語 意味
1 component 構成している
2 depth 深さ
3 stride またぐ、ひとまたぎ
4 rect(Rectangle) 長方形
5 stream 流れ
6 frame


①component
WPFアプリケーションのInitializeComponentで必ず見かける単語。
構成の初期化といった意味が適切。

②depth

// import略
KinectSensor kinect = KinectSensors.FirstOrDefault(x => x.Status == KinectSensor.connected);
kinect.DepthStream.Enable();

深度関係の値を取得する際によく利用する単語。
英語辞書では、「深さ」と記載があった。


③stride

// フレーム横幅 * 1バイトあたりのピクセル数
int screenStride = kinect.DepthStream.FrameWidth * kinect.ColorStream.BytesPerPixel;

strideは、またぐ、ひとまたぎといった記載。

④rect

Int32Rect rectanble = new Int32Rect(0, 0, (int)Math.Ceiling(_bmp.Width), (int)Math.Ceiling(_bmp.Height));

rectangleは長方形

⑤stream

kinect.SkeletonStream.Enable();

流れを意味する。
データを取得する際の個人的なイメージとしては、流れる水をバケツですくうようなイメージを持っている。

⑥frame

using(ColorImageFrame colorFrame = e.OpenImageFrame()) {
 //...
}

枠を意味する。

結果

①意外とコードがスラスラ頭に入ってくる
②続けてみないと何ともいえない