Window に入れておきたいソフトウェアメモ

Windowsマシンに入れて置きたいプログラムをメモしておきます.
尚,私の環境はwindows7です.

パッケージ管理

chocolatey

Windwos 用のパッケージ管理ソフトです.
linux におけるapt-get や yum 等と似た感じで,ソフトウェアをコマンドプロンプトからインストールすることが可能です.
(アンインストールも可能ですが,ソフトによっては個別にアンインストールする必要がある場合もあります)

インストール

chocolateyのHP https://chocolatey.org/ へ行き,そこに記載のインストールコマンドをコマンドプロンプトで打ち込みます.
具体的には,下記です.

@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin

使い方

コマンドプロンプト上で,

choco install パッケージ名

と打ち込むことで,指定したパッケージをインストールすることが可能です.
インストールしたいパッケージを探す際は,chocolatey のHP 右上にある検索ボックス(Search Packages と書いてある)でさがします.
その他の詳しい使い方は,こちらのサイトが参考になります.
http://millkeyweb.com/win-chocolatey/

Linux ライクにする系

コマンドプロンプトからLinux ライクに作業したい!という時におススメのソフトの紹介です.

Gow

たくさんのUnix系のコマンドが詰め込まれたパッケージです.
Cygwin よりも軽量なので,コマンドラインLinuxライクな操作を行いたい人は入れておくといいと思います.

インストール

choco install gow

上記コマンドでインストールした後,コマンドプロンプトを開くとls 等が使用できるようになっている・・・はず!

ConEmu

高機能なターミナルエミュレータで,コマンドラインでフォルダ移動とかファイル検索とか諸々やりたい人は,入れておくと幸せになれると思います.

インストール

choco install conemu

便利ツール

まぁ,入れておいて損はない便利なものをご紹介します.

Google Chrome

言わずと知れたブラウザですね.
そんなもんわざわざ言わずともみんな入れるやんって思うかもしれませんが,こいつもchocolatey でインストール可能なので,あえて記載しました.

インストール

choco install google-chrome-x64

Classic Shell

Windows8 のスタートメニューをwindows7風に変えてくれます.
Windows8 のメニュー操作に慣れない人(私)にとっては,非常に重宝するソフトです.

インストール

choco install classic-shell

これは流石にchocolatey にはないだろうと思ったらあった (゚д゚)!

Wireshark

ネットワークに流れるパケット情報をリアルタイムに調査できるパケット取得・プロトコル解析ソフトです.

インストール

choco install wireshark

その他便利系

Google Chrome

インストール

choco install google-chrome-x64

Google Drive

インストール

choco install googledrive

DropBox

インストール

choco install dropbox

最後に

もはや chocolatey の紹介になってますね.
chocolatey は,インストールするパッケージをスクリプトにまとめて書けるので,複数台のマシンに同一の環境を構築したい時等に,非常に便利です.
そんな状況そうそうないかもしれませんが・・・

Unity でテクスチャの画像をスクリプト上からいじる

Unity でテクスチャの画像をスクリプト上からいじる時のあれこれをメモします.

画像をスクリプトで読み込む

あらかじめ画像が用意されており,それをスクリプトから読み込む場合は,Texture2DのLoadImageを使用します.

Texture2D tex = new Texture2D(1, 1);
tex.LoadImage(File.ReadAllBytes(path)); // path は画像ファイルへのパス

LoadImage は,PNG or JPG 画像を読み込むものなので,それ以外の形式は読み込めません.
そのため,スクリプト内で画像を生成する場合は,一度それらの形式へ変更する必要があります.

画像をスクリプトで生成する

画像をスクリプトで生成する場合は,SetPixels を使用します.
以下のスクリプトは,3x3の赤い画像を生成して,texture に張り付ける処理です.

Color[] c = new Color[9];
for(int i = 0; i < 9; ++i)
{
  c[i].a = 1.0f;
  c[i].r = 1.0f;
  c[i].g = 0.0f;
  c[i].b = 0.0f;
}

Texture2D tex = new Texture2D(3, 3, TextureFormat.ARGB32, false);
tex.SetPixels(c);

Color とColor32 の違い

余談ですが,Unity には,Color とColor32 という二つのクラスがあります.
その違いは,Colorはrgba がfloat で,Color32 では,byte ということです. ただ,Color 内部で結局float から byte に変更されているので,Color32 を使用した方がパフォーマンスは高いようです.

Unity: ImageEffectのスクリプトの書き方

Unity5 からフリー版でもImageEffectが使用できるようなりましたね. というわけで,エフェクトを自分で作成する際の基本をメモしておきます.

ImageEffect による画像処理

ImageEffect ととは,cameraから出力される画像(映像)に対して,shaderを当てて処理するものです.
ImageEffect 使用するには,下記のようなスクリプトを用意し,cameraに追加します.
すると,Inspector 上の当該スクリプトの箇所にshader の設定項目がでてきますので,そこに用いたいshader を指定します.

using UnityEngine;

[ExecuteInEditMode]
public class test : ImageEffect
{
    void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        Graphics.Blit(source, destination, material);
    }
}

ここで,source: 元のテクスチャ,destination: 出力されるテクスチャです.
上記のスクリプトは,単にカメラから得たテクスチャを shader に渡し,その結果を出力・もしくは後段の処理に引き渡すものです.

出力されるテクスチャを保持する場合

例えば,最初のImageEffectで,ラプラシアンを取得し,後段のImageEffectでそのラプラシアンを使用したい場合,予めAssetにRenderTexture を用意し,そのRenderTextureに書き込むようにします.

public class test : ImageEffect
{
    public RenderTexture rt;

    void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        Graphics.Blit(source, rt, material);
    }
}

後段の処理でそのRenderTextureを使用する場合は,そいつを

material.SetTexture("shader上のtexture名", rt);

でshaderに渡してあげます.

シェーダに複数のパスを書いて,特定のパスを実行する

シェーダ内の複数のパスから特定のパスを選んで実行する場合,下記のように第四引数にパスのインデックスを指定します.

material.SetTexture(source, rt, material, 0);

ImageEffectの例

3x3 Gaussian Blur

3x3 ガウシアンブラーの例です.
シェーダ側が完全にべた書きですが,3x3 ならそんなに変わらないだろうということで・・・
考慮する近傍画素数が増えると,x 軸, y 軸を順にブラーかけた方が早いです.
まずは,C#の例から

using UnityEngine;

[ExecuteInEditMode]
public class GaussianBlur : ImageEffectBase
{

    public int _Width = 1920;
    public int _Height = 1080;

    void Start()
    {
        material.SetFloat("_OneWidth", 1.0f / _Width);
        material.SetFloat("_OneHeight", 1.0f / _Height);
    }

    void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        Graphics.Blit(source, destination, material);
    }
}

つづいて,対応するシェーダです.

Shader "Custom/GaussianBulr" 
{
    Properties 
    {
        _MainTex ("", any) = "" {} 
        _OneWidth("Width of one pixel", Float) = 0.00052083333
        _OneHeight("Height of one pixel", Float) = 0.00092592592
    }

    CGINCLUDE
    #include "UnityCG.cginc"
    
    struct v2f {
        float4 pos : SV_POSITION;
        half2 uv : TEXCOORD0;
    };
    
    sampler2D _MainTex;
    float _OneWidth;
    float _OneHeight;
    
    
    v2f vert( appdata_img v ) 
    {
        v2f o; 
        o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
        o.uv = v.texcoord;      
        return o;
    }
    
    half4 frag(v2f i) : SV_Target 
    {
        half4 color = tex2D(_MainTex, i.uv) / 4;
        color += tex2D(_MainTex, half2(i.uv.x, i.uv.y + _OneHeight)) / 8;
        color += tex2D(_MainTex, half2(i.uv.x, i.uv.y - _OneHeight)) / 8;
        color += tex2D(_MainTex, half2(i.uv.x + _OneWidth, i.uv.y)) / 8;
        color += tex2D(_MainTex, half2(i.uv.x - _OneWidth, i.uv.y)) / 8;
        color += tex2D(_MainTex, half2(i.uv.x + _OneWidth, i.uv.y + _OneHeight)) / 16;
        color += tex2D(_MainTex, half2(i.uv.x + _OneWidth, i.uv.y - _OneHeight)) / 16;
        color += tex2D(_MainTex, half2(i.uv.x - _OneWidth, i.uv.y + _OneHeight)) / 16;
        color += tex2D(_MainTex, half2(i.uv.x - _OneWidth, i.uv.y - _OneHeight)) / 16;

        return color;
    }

    
    
    ENDCG
    SubShader 
    {
         Pass {
              ZTest Always Cull Off ZWrite Off

              CGPROGRAM
              #pragma vertex vert
              #pragma fragment frag
              ENDCG
          }
    }
    Fallback off
}

ベクトルに対する重回帰分析(各次元独立な時)

何かとあると便利な重回帰分析.
今日はそれを実装してみたいと思います.
matlab とか R とか使えばいいんじゃないのとか言わない.

重回帰分析とは

重回帰分析って,複数の入力から1つの出力を推定するのものですよね.
式で書くと以下のような感じ.

{ \displaystyle
y = \sum_{n=0}^{N-1}a_n x_n + b
}

ここで,{ \displaystyle y}は出力,{ \displaystyle x_n}が入力,{ \displaystyle a_n}が重み,{ \displaystyle b}がバイアスです.
重みとバイアスさえ上手く学習できれば,入力から出力を推定し放題 (∩´∀`)∩ワーイ

で,どない学習したらええねん!   ( ゚Д゚)⊃ 最小二乗法
の説明はウィキペディア先生に任せるとして,{ \displaystyle y} がベクトルの場合を考えたいと思います!

式で書くとこんな感じ.
{ \displaystyle
\mathbf{y} = {\bf Ax} + {\bf b}
}

小文字はベクトル,大文字は行列です.

ここで,
{ \displaystyle
\mathbf{y} = \left[ y_1, y_2, \cdots, y_d, \cdots, y_D \right]^{\mathrm{T}}
} , { \displaystyle
\mathbf{x} = \left[ x_1, x_2, \cdots, x_n, \cdots, x_N \right]^{\mathrm{T}}
} ,

Aは,D×Nの行列,bはD次元のベクトルとなります. すなわち,N次元のベクトルxからD次元のベクトルyへの行列Aとベクトルbを用いて,回帰するという意味の式になります.

それでは,観測データから行列Aとベクトルbを求めていきます.

今,入力データとそれに対応する出力データがそれぞれM個観測されたとします.

その観測されたデータを,入力,出力それぞれにおいて横に並べて,行列にすると・・・

{ \displaystyle
\begin{align}
{\bf Y} = \left[ {\bf y_1, y_2, \cdots, y_m, \cdots, y_M} \right],
{\bf X} = \left[ {\bf x_1, x_2, \cdots, x_m, \cdots, x_M} \right]
\end{align}
}

{ \displaystyle
{\bf Y} = {\bf AX + b}
}

となります.

この式を元に,

{ \displaystyle
\left({\bf Y - (AX + b)}\right)^{\mathrm{T}}\left({\bf Y - (AX + b)}\right)
}

を最小にするAをもめてやります.
ただし,このままでは計算し難いので,Aとbを結合し, { \displaystyle
{\bf A}' = \left[{\bf A, b} \right]
} としてやります.
それに伴い,入力データの各サンプルを { \displaystyle
{\bf x}'_m =  \left[ x_1, x_2, \cdots, x_n, \cdots, x_N, 1 \right]^{\mathrm{T}}
} のような形式にした上で結合し,行列X'を生成します.
そうすることで,
{ \displaystyle
{\bf Y} = {\bf A'X'}
}
と簡略して表すことができます.

後は, { \displaystyle
\left({\bf Y - (A'X')}\right)^{\mathrm{T}}\left({\bf Y - (A'X')}\right)
} のA'に対する微分が=0 になるA'を求めてあげればいい.

結果として,以下の式を実装すれば,重回帰分析が行えます.

{ \displaystyle
{\bf A'} = {\bf Y\left(X'X'^{\mathrm{T}}\right)^{-1}}
}

c# でシングルトン

C#でシングルトンを書くことがままあるのですが,何かその都度調べてる気がするので,φ(`д´)メモメモ...メモ

シングルトン (singleton) って何じゃらほい?

シングルトンとは,そのクラスのインスタンスが一つしか存在しないことを保障するデザインパターンです.
つまり,プログラムの中でそのクラスの実体が一つしかないため,他のいろんなクラスで同じものを利用することができるのです.
一見,すごく便利そうに思えるのですが,ガベージコレクションでひっかかったり,テストが書きにくかったりといろいろ落とし穴があったりします.
シングルトンのメリットデメリットに関しては,こちらのサイトが参考になります.

qiita.com

いつ使うの?

今でしょ!!!
という冗談はさて置き,私が使う場面としては,UDPTCPで何かしらのデータを受ける際の窓口クラスとしてです.
一旦,シングルトンで作成したクラスに受診したデータを保管し,その他の様々なクラスから,そのデータを参照するといった形です.
これが正しい方法なのかは,いまいち自信ないですが…

コードメモ

私がC#でシングルトンを使用する時,多くの場合で,明示的にメモリの解放も行いたかったりするので,そのあたりを合わせたコードを記載します.

using System;

public class Singleton : IDisposable
{


    private static Singleton _instance = new Singleton ();

    private Singleton (){} // コンストラクタをprivateで定義して,外部からアクセスさせない

  // 唯一のインスタンスの受け渡し口
    public static MessageContainer GetInstance()
    {
        return _instance;
    }



    ~Singleton ()
    {
        Dispose();
    }

    private Boolean _isDisposed = false;

    public void Dispose()
    {
        Dispose(true);

    // Dispose() が明示的に呼ばれた時に,ガベージコレクションでFinalize()呼び出しをしない
        GC.SuppressFinalize(this);
    }


    private void Dispose(bool disposing)
    {
        if (_isDisposed)
            return;

        if (disposing)
        {
            // 明示的に解放する必要のあるメンバ変数の解放処理をここに記載する
       }
         _isDisposed = true;
     }
}

以上,メモでした.

C#実践開発手法 ?デザインパターンとSOLID原則によるアジャイルなコーディング (マイクロソフト公式解説書)

Unityでdllを2重に呼び出す

portaudioをunityで使いたくて,

MrMatthias/Portaudio-Unity · GitHub こことか

atsushieno/portaudio-sharp · GitHub こことかを参考にかいてたんですが,コールバックの登録まではうまく行くものの,いざstartすると落ちる. たぶんメモリリークとか起きてるんだろうなぁと思いつつも,それを直す手段が分からない.

というわけで,portaudioをラップするc++のdllを作って,そいつを読み込ませることにしました.

んで,やってみると・・・

DllNotFound!!!

どうやら,作成したdllから呼び出すportaudio.dllが読み込めてないご様子. 両方とも,Plugins以下においてあるんですが・・・.

解決策:システム環境変数にportaudio.dllのフォルダへのパスを追加する.

portauidoに限らず,dllを二重に読み込むときは,この方法で何とかなりそう.

ただ,もっとスマートな方法はないだろうか・・・

追記:

こことか見ると,プロジェクトの直下におけばいいって書いてある気がする. FFTW for C# DLLNotFoundExeption - Unity Answers

ここの記事にあるportaudioのC#のコールバックの書き方で,Unityからも呼び出せた. terurou.hateblo.jp

Unity mecanim でボーンを取得

Unity の mecanim を使用し,モデルを動かす時,モデルがHumanoidとして読み込まれていれば,ボーンの構造がある程度企画化されている.

そして,Animator.GetBoneTransform を使用すれば,企画化されたボーン名からそのTransformを取得することができる.

つまり,kinectやleapmotion等のモーションを取得するデバイスの情報を反映させたい場合,Animator.GetBoneTransformで取得したTransformにデータを流し込んでやればいい.

public Animator anime; // Animator がアタッチされている3Dモデル(ゲームオブジェクト)を突っ込む

void Start()
{
    Transform neck = anime.GetBoneTransform(HumanBodyBones.Neck);

  neck.localRotation = new Quaternion( , , ,); // こんな感じで操作する
}