Windows ショートカットメモ

稀につかうショートカットのメモ.

ウィンドウの移動

Shift + Windowsキー + 矢印キー

プログラムの終了

Alt + F4

visual studio : dll, def から lib を作成

Windows において C++ で dll を使用したプログラムを作成する時,その dll と対となる lib ファイルを明示的に読み込ませる必要がありますよね.

#pragma comment(lib, "sqlite3.lib")

こんな感じに.
だがしかし,ライブラリによっては,dll しか配布されていないものもあります.
上記の sqlite3 は,データベースの一種なのですが,これもその一つになります.
ほかにも,fftw とかは,dll しか配布されていなかったような気がします.

ただ,その場合は,def ファイルなるものが配布されている場合が多く,def ファイルと dll ファイルとで,lib ファイルを生成することが可能です.

lib ファイルの生成

lib.exe というプログラムを使用し,それを行うのですが,このlib.exe は,通常のコマンドプロンプトには含まていません.
そこで,visual studio に含まれるコマンドプロンプトを使用します. スタートメニューから,「すべてのプログラム」を選択し,インストールされているvisual studio (フォルダのアイコンになっているもの)を選択します.
すると,visual studio tools というフォルダがありますので,それを開き,その中にあるコマンドプロンプトを使用します.
そのコマンドプロンプトを開き,dll と def ファイルがあるフォルダに移動後,下記のコマンドを実行すると lib ファイルが生成されます.

lib /def:sqlite3.def

sqlite3.def のところは,適宜読み替えて下さい.

python : UDP非同期受信

pythonUDP の非同期受信したいことってありませんか?
まぁ,そんなないですよね・・・
しかし,何かしらのデバイスからUDPを受け取って,それをsocket.io とかでサーバーに送りたい時なんかは,python でサクッと書くのが楽なんじゃないかなぁと.
というわけで,pythonUDP の非同期受信のコードをメモしておきます.
ネットを探しても,あまりサンプル見つからなかったけども,コード数的には少なめです.

import asyncore
import socket

class UdpServer(asyncore.dispatcher):

    def __init__(self):
        asyncore.dispatcher.__init__(self)

        # 5000 番ポートにバインド
        self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.bind(('', 5000))
        return

    # ポートにバインドされた時
    def handle_connect(self):
        print "Udp server Started..."
        return

    # データが飛んできた時
    def handle_read(self):
        data, addr = self.recvfrom(2048)

        # 特定のデータが飛んできたら終了
        if data == 終了条件
            raise asyncore.ExitNow('Server is quitting!')
        return


    def handle_write(self):
        pass


# 例外をキャッチする.サーバー終了後に,何かしらの処理をしたい用
def run():
    instance = UdpServer() 
    try:
        asyncore.loop()    # 非同期ループを開始
    except asyncore.ExitNow, e:
        print e


if __name__ == '__main__':
    run()

uGui と UniRx を組み合わせて,ドラッグできるパネルや長押し(押してる間特定の動作をする)ボタンを作成

Unity の uGui と UniRx を組み合わせてドラッグや長押しを実装してみたので,メモしておきます.
ここで言う長押しボタンは,数秒押したら反応するボタンではなく,押している間,特定の動作をするボタンのことです.
なんていえばいいのか分からないので,便宜上,長押しボタンといいます.

uGui パネルのドラッグ

下記のスクリプトを,uGui のパネルにアタッチしてやると,そのパネルをドラッグで移動させることができます.

using System;
using UniRx;
using UniRx.Triggers;
using UnityEngine;
using UnityEngine.UI;

public class DragPanel : MonoBehavior
{
    Void Start()
    {
        var et = this.gameObject.AddComponent<ObservableEventTrigger>();

        this.UpdateAsObservable()
            .SkipUntil(et.OnPointerDownAsObservable())  // ポインタが下がるまでスキップ
            .TakeUntil(et.OnPointerUpAsObservable())    // ポインタが上がると終了
            .Repeat()   // 繰り返す
            .Select( _=> Input.mousePosition )
            .Subscribe( pos =>
            {
                var rect = this.gameObject.GetComponent<RectTransform>();
                rt.anchoredPosition = new Vector2(pos.x, pos.y);
            })
            .AddTo(this);
    }
}

このスクリプトは,アタッチされたパネル上でマウスポインタを押している間,そのマウスポインタの位置をパネルの位置に置き換えています.

uGui 長押しボタン

また,このスクリプトをButton にアタッチして,Subscribe の中身を書き換えてやれば,ボタンを押している間,特定の動作を行うボタンになります.

ちなみに,uGuiではないGameObject をドラッグで移動したい場合は,下記の記事をご参照下さい.

rinor.hatenablog.com

python: csv を読み込んで,ヒートマップを表示

ヒートマップとは,データ行列の個々の要素をその大きさに応じて色分けし,可視化したグラフのことです.
例えば,共分散行列を可視化したりできます.

というわけで,csv ファイルに格納されたデータ行列を読み込み,ヒートマップとして出力するところまでをメモしておきます.

import numpy as np
from matplotlib import pyplot as plt

data = np.loadtxt("data.csv", delimiter=",")
plt.imshow(data, aspect="auto", interpolation = "none")
plt.colorbar()
plt.show()

はい.これだけです.
軸の設定とか何もしていませんが,とりあえずデータの傾向とか見るだけなら十分かと.
まぁ,gnuplot でもそんなに難しくないけど

Windows 64bit で python を chocolatey でインストール

タイトルそのままです.
Chocolatey を使用して,pythonWindows にインストールしてみたいと思います.
Chocolatey ってなんじゃらほい?と思われる方は,下記のリンク先を参照して下さい.

rinor.hatenablog.com

python のインストール

では,さっそくインストールしてみたいと思います.
今回インストールする python のバージョンは2系のものです. また,私の環境は,Windows8.1 64bit を Mac の bootcamp で動かしています. ですが,まぁ,普通に64bit の Windows 環境と変わりません. むしろ,問題になってくるのは,64bit というほうでして・・・
そのあたりは後述するとして,まずは python のインストールです.
コマンドプロンプトを管理者権限(じゃなくてもいいかも)で起動し,下記のコマンドを実行します.

choco install python2

以上です.
勝手に 64bit 版がインストールされます.
コマンドプロンプトを起動し,python と打ち込んでみて下さい.
python のシェルが起動しますので,試しにいろいろ打ち込んでみて,動いていることを確認してください.

$ python 
>>> 1+2
3
>>> exit()

とか.

pip をインストール

まぁ,このままでは,python のうまみを享受できているとはいいがたいので,いろいろ便利なパッケージを入れていきたいところです.
というわけで,パッケージのインストールを楽にしてくれる pip を続いてインストールしたいと思います. pip とは,python 用のパッケージ管理システムで,pip を使用することで,コマンドプロンプト上でパッケージをインストール,管理することが可能になります.

choco install pip

以上です. ・・・とは行かないかもしれません.
私の環境だと,エラーで止まりました.
その場合でも,コマンドプロンプトを起動し直し,再度同じコマンドを実行すると問題なくインストールされます.
pip をインストールする前に,関係するパッケージもインストールされるみたいなんですが,おそらくそいつがインストールされた時点で,コマンドプロンプトの再起動が必要なんじゃないかなぁと(勘
インストールが終わったらとりあえず,pip を最新版にしておきましょう.

pip install --upgrade pip

入れておきたい python パッケージ

何はともあれ,これで 下準備は整いました.
続いて,python を使う上で入れておきたいパッケージの紹介をします.

ipython notebook

ipython とは python のリッチなインタラクティブシェルで,オリジナルの python よりも使い勝手がいいです.
さらに,そんなipython をブラウザ上で扱え,作図までできてしまうのが ipython notebook です.
これは入れておいて損はないと思います.

pip install ipython
pip install ipython[notebook]

で,ipython notebook に必要なパッケージをすべて入れてくれるはず・・・.たぶん. しかしながら,これだけではグラフを書いたりすることができません.
というわけで,必要なパッケージを入れていきます.

matplotlib

二次元グラフィック用の python パッケージです.
こいつでグラフを書くわけですね.

pip install matoplotlib

で,さくっとインストールできると思いきや,「error: Microsoft Visual C++ 9.0 is required」というエラーメッセージが・・・
というわけで,

Download Microsoft Visual C++ Compiler for Python 2.7 from Official Microsoft Download Center からVC++コンパイラをダウンロードしてインストールします.

numpy

多次元配列や行列をサポートしてくれる数学関数パッケージです. 行列演算するにしても,それをもとにグラフを描画するにしてもこいつがなくてははじまりません.

pip install numpy

scipy

高水準の科学技術計算パッケージです.
機械学習等を行うのであれば,やはりこいつがなくては(略
これも今まで通り,pip でインストールできるかと思いきや,そうは問屋が卸しません.
scipy をインストールするのに必要なライブラリが Windows に存在しないため,pip ではインストールできないんです.
なので,公式のインストーラを使いましょう!
まぁ,公式だと 32bit 版のインストーラしかないので,無理なんですがね.
というわけで, http://www.lfd.uci.edu/~gohlke/pythonlibs/ こちらで公開されている 64bit 版のものを使用します. scipy-0.16.0rc1-cp27-none-win_amd64.whl をダウンロードしてください.
この whl という拡張子は,python パッケージの形式の一つでして,

pip instal wheel

とすることで,扱えるようになります. wheel をインストールした後は,

pip install scipy-0.16.0rc1-cp27-none-win_amd64.whl

で scipy をインストールします.  

ipython notebook を使ってみる

ipython notebook --pylab inline

で起動させます. 「Support for specifying --pylab on the command line has been removed.」
とか言われた場合は,--pylab inline は無しで起動します.

ブラウザが起動しますので,右上のNEWからpython ファイルを作成し,その中で,以下のように打ち込んでください.

import numpy as np
from matplotlib import pyplot as plt

mean = 0
var = 1
x = np.arange(-5., 5., 0.001)
y = (1./np.sqrt(2 * np.pi * var) * np.exp(-(x - mean)**2 / 2 / var))

plt.plot(x, y)

plt.show()

平均0,分散1のガウス分布が表示されれば成功です.

visual studio 2013 で openframeworks をビルド

openframeworks を visual studio 2013 でビルドする際のメモ.
現状だと openframeworks は,vs2012 しかサポートしていないのに,なぜ vs2013 でビルドしようとするのか・・・
それは,Rx.cpp を使いたいからです!!
Rx.cpp って何じゃらほい?ってところは,おいておいて,そんなわけで,vs2013 でビルドしたいと思います.

vs2013 用のパッケージをダウンロード

冒頭でも触れたとおり,公式HPからダウンロードできる openframeworks は vs2012 用です.
ただ,github で,vs2013 用のソースコードを公開してくださっている方がおられるので,そこからダウンロードしたものを使用します.

liquidzym/openFrameworks at VS2013 · GitHub

上記 github から VS2013 ブランチをクローンしてきます.
ブランチを指定して,クローンしてくる方法は下記です.

git clone -b ブランチ名 リポジトリアドレス

ビルド

ビルドの前に

openFrameworks\libs\openFrameworksCompiled\project\vs フォルダに移動し,そこにある openframeworks.sln を開いてビルドするわけですが,そのままではプロジェクトが読み込めません.
なんやかんやしてたら,こんなエラーが出てきました.

f:id:rinor:20150702024332p:plain

どうやら kinect 関連のプロジェクトが読み込めていないみたいです.
なので,同フォルダにある openframeworks.vcxproj をテキストエディタTerapad etc.) で開き,kinect 関連の記述を削除します.
Kinect で検索してヒットした箇所を削除したら大丈夫です・・・たぶん.
Kinect 使いたい人は,vs2012 でビルドするか,自前で実装するか,unity に乗り換えましょう.

やっとこさビルド

したらエラーが出るんだな!これが!!
エラーの箇所は,ofVbo.cpp の

if(!vaoChecked){
        supportVAOs = ofGetGLProgrammableRenderer();// || glewIsSupported("GL_ARB_vertex_array_object"); <- this should work but has false positives on some cards like emulation in vm's
        vaoChecked = true;
    }

ここ. ここをまるっとコメントアウトしてやると,エラーは消えてビルドが通ります.
エラーの箇所がシェーダまわりくさいので,ちょっと不安が残りますが,まぁ,ヴィジュアル的にそこまでこったことはしないので,まぁいいか.
というわけで,あとは,apps/myApps 以下にプロジェクトを作っていけば,vs2013 & openframeworks で,開発することができます.

これで,Rx.cpp が試せる!!