非型テンプレートを使うときにソースとヘッダファイルを分ける

型テンプレートでソースコードとヘッダーを分ける話はよく見るけど、非型テンプレートでどうやるかわからなかったので書いておく。

結果、できたのだが標準仕様を読んだわけではないので環境固有だったりするかもしれない。

詳しい人がいたら教えていただければと思う。

今回試した環境は  Visual Studio 2019。

ヘッダー

template <uint32_t size>
class Base
{
public:
    Base();
    virtual void func() = 0;

protected:
    static constexpr uint32_t kSize = size;
    char data[kSize]{};
};


class Data : public Base<17>
{
public:
    Data();
    void func() final override;


};

ソースコード

template<uint32_t size>
Base<size>::Base()
{
    for (uint8_t ii = 0; ii < 10; ++ii)
    {
        data[ii] = ii;
    }
}

Data::Data()
{
    data[10] = 10;
    data[11] = 11;
}

void Data::func()
{
    for (uint32_t ii = 0; ii < kSize; ++ii)
    {
        if (ii != 0 && ii % 8 == 0U)
        {
            printf("\n");
        }
        printf("%0x ", data[ii]);

    }
}

Base<size>::Base() のように書くのがポイントなんだろうなきっと。

C++ もふんわりとしか使っていなからちゃんと理解しないといけないんだろうと思う今日この頃。

Visual Studio のいいところ

先日の飲み会帰りに先輩と雑談した時に今のうちに Visual Studio のいいと思ったところを書いておいた方が良いと言われたので書いてみる.

  • 関数のリファレンスがソースから確認できる
  • 関数呼び出しが間違っていたらコンパイルする前にわかる
  • ファイル間の移動が簡単
  • コンパイルされるソースが一発で分る

一応不便なところも書いてみる. Vim でコードを書いていた時と比較しての話.

  • Linux では動作しない
  • キーボードのみの操作はなかなか難しい

項目を上げてて気づいたけど C++ とか C を書くから不便だと思うんだよな. PHP とか書くなら今でも断然 VIm + Screen のほうが便利な気がする.

その辺やっぱり適材適所なのかな.

jetson の自動起動時の設定

jetson にマウスもキーボードも繋げたくないので自動起動の設定をした。

1. synergy クライアントを自動起動させる
/etc/profile.d/ に 以下のシェルを配置


!#/bin/sh
synergyc

2. ubuntu に自動ログインするようにする
ログインしないと上のシェルが実行されないみたい(試してないけど)なので自動ログインするように設定。
システム設定 → ユーザーアカウント → ログインオプションの自動ログイン ON に設定すれば良い

jetson で OpenCV を使ってみる

内容は↓
http://kivantium.hateblo.jp/entry/2014/11/25/230658

ゴチうさの顔認識の奴。

以下のコマンドでコンパイル
g++ main.cpp -lopencv_core -lopencv_highgui -lopencv_objdetect -lopencv_imgproc

詳細は明日追記する。
とりあえず忘れないように。

追記
詳細も何もなかった。
GPU に移植しようとしたが、うまく行かず。
detectMultiScale() が例外吐くんだよな。。。
一旦諦め。

Ubuntu に Synergy をインストールして設定する

jetson をいじるにあたりマウスとキーボードをわざわざ持ち変えるのが面倒だなと思い Synergy を導入してみた。
公式は↓
http://synergy-project.org/?hl=ja

残念ながら最新版は有料になっているので古いものを使う。
今回は 1.4 系を使用。

キーボードとマウスが接続されているものをサーバー、他をクライアントと呼ぶ。
基本それぞれの PC でサーバーとクライアントを起動すれば良い。

設定でハマったのでメモしておく。
他のサイトを見ると .conf を編集して設定していたがうまく行かず。

結局 GUI で設定。これが簡単でいい。
ターミナルから synergy を起動すれば良い。
サーバーに接続されるクライアントを設定する必要があるがこの時クライアントの PC 名を指定するのが肝。

Jetson TK1 実行バイナリが作れた

とりあえず、hello world は動作確認ができた。

結局大学時代から使っているUbuntu 12.04 はいろいろ魔改造されすぎていてクロスコンパイラが作れなかった。

KVM が入っていたからそこに Ubuntu 12.04 を入れてクロスコンパイラの作成に成功した。
いったい何が原因だったのかは不明。
まあとりあえずできたからよしとする。
いくつか詰まった点があったのでメモしておく。

1. src 以下のファイルについて
これはリポジトリには含まれていない。自前で取ってくること

2. フォルダー構成について
必ずホームディレクトリに work フォルダを作ってそこでに
clone すること。フォルダ構成が指定どおりになっていないと、script がうまく動かない。(script を変えてもいいけど。。。)

3. target 以下のファイルについて
これはターゲットボードの linux のルートファイルシステムのこと?なんか語弊のある言い方のような気もするけど語彙がないからなんて書いていいかわからない。
とりあえず使ったのは↓
https://developer.nvidia.com/linux-tegra-rel-211
これの sample file system をダウンロードして解凍して名前を変えてやればよかったはず。

次は↓
http://kivantium.hateblo.jp/entry/2014/11/25/230658
をJetson TK1 で動かしてみようかなと思う。