2017年4月20日木曜日

自作ライブラリをCMakeでディレクトリごとインストールする方法

自作ライブラリをCMakeでディレクトリごとインストールする方法

春先は送迎会などで諭吉が吹き飛んでいくのが悲しい限りです. ああ,諭吉よ.どうしてあなたは行ってしまったのですか. それはさておき, githubとかで自作ライブラリを公開するときに CMakeつかってビルドして/usr/local/lib/にインストールする方法を紹介しますね.

まず,今回はSonyの開発した人類の永遠の友であるPS3のコントローラーをlinuxで簡単に使用できるライブラリを作ったので,それをドヤ顔してgithubに公開してやろうかと思ったところ,opencvとかのように

sudo make install

とかやると, /usr/local/inculde/と /usr/local/lib/ にいい感じにインストールされる方法がわからなかったときのメモであぞよ.

というわけで,どうすればいいかお教えしましょう. まず,本日の生け贄... 本日のメインディッシュはdualshockという名前のライブラリとなっております.

構成

本日の構成は

dualshock
   |-CMakeLists.txt
   |-READEME.md
   |-example--testDs3.cpp
   |-include--dualshock--ds3.cpp
   |-src--ds3.cpp

となっております.というか,こんな感じのディレクトリ構成にしてください.多少は意味があります.

CMakeLists.txt

CMakeLists.txtは以下のように記述すること.

cmake_minimum_required(VERSION 3.5)
 
project(dualshock)
 
add_definitions("-std=c++11")
 
set(SRC_DIR src)
set(INCLUDE_DIR include/dualshock)
 
include_directories(${INCLUDE_DIR})
 
add_library(dualshock STATIC ${SRC_DIR}/ds3.cpp)
target_link_libraries(dualshock pthread)
 
install( TARGETS dualshock
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    )
 
install(DIRECTORY include/dualshock
    DESTINATION /usr/local/include
    )

ポイント

この場合,ファイル構成は綺麗になるが,ヘッダーと実装ファイルの 関係をどのように定義するのかが問題となる.

コンパイル時と,インストール後に使用するときとでは, それらの関係が異なるのである.

具体的には,cppファイルでどのようにヘッダーをincludeするのかということである.

でも,よく考えると,ヘッダーのincludeはコンパイルの時にのみ必要になる.ということは,インストールするときさえ乗り切れば,あとは,どうとでもなる.ということ.よって,ds3.cppのinclude部分をちょっとかえる.

FROM

#include "ds3.hpp"

ライブラリ内のヘッダーを参照するようにincludeのパスを変更する.

TO

#include "../include/dualshock/ds3.hpp"

結果

これを実行すると /usr/local/include 以下に /dualshock/ds3.hpp

/usr/local/lib/ 以下に libdualshock.a

がインストールされる.

2017年3月23日木曜日

TUTの学内LANにVPNで接続する方法

これは,TUTの学内LANに学外からLinux Mintで接続する方法です.
いままで,接続方法は研究室のWIKIに書いておいてあったんですけども,
それだと,結局,学内からしかアクセスできまへんやん!

という問題に気づきまして,学外からでもアクセスできる,このブログに書いておいて
困った時に確認し,ドヤ顔を使用という聡明にして賢明な作戦をたてました.

この投稿はその洗練された作戦の一旦であります.

方法は以下の通り,

百回回って,犬の真似をすると,
あら不思議VPNで接続することができるようになります.
あと,気分次第で以下のコマンドを売ってください.

sudo apt-get install network-manager-openconnect network-manager-openconnect-gnome 


あとは,設定をすればOKです.

george washington.vpn.***.**.**

2017年3月1日水曜日

YouCompleteMeをNeoVimでインストールしようとしたらハマった話.

さあさあ,寄ってらっしゃい,見てらっしゃい.
ここにかざってあるのは,機械学習のプログラムを作って実験したら,見事に成功して.
「やった!これで来月の研究発表会に離すことができたッ!」と喜び,さらに
「じゃあ,気分もいいし,久々にdein#update()して,プラグインたちをアップデートしてやるか」と深夜4時のテンションで深謀遠慮したあげく,それが悲劇のもととは知らずに意気揚々と突っ込んでいった若者の成れの果てでございます.


経緯をおって話すと
私はvimのプラグインたちをdein.vimで管理してる.
そのプラグインたちの中に,特にお世話になっているのが,補完用プラグインのYouCompeleteMeである.このオシャンティーにI love youと言っている名前のプラグインによって私は「プログラマーですけど?」と虚勢を張って要られるのである.しかし,このプラグイン,他のプラグインと違い,vimscriptに寄って書かれているわけではなくC++とその愉快な仲間であるboostによって書かれているので,インストールするためにはdein.vimに任せるわけには行かず.ダウンロードしてコンパイルする必要がある.
そのため,私のめんどくさがりも手伝って,なかなかプラグインをアップデートしないのであるが,昨日はなぜか判断を誤ってしまったのである.こんなことになった,責任者は誰か?断固として私ではない!!


しかし,昨日dein#update()をしたらYouCompleteMeが補完してくれなくなった.
vimで:YcmDiagsコマンドを打ったところ,
[Native filetype completion not supported for current file, cannot force recompilation.]
と返事が返ってきた.よくわからないにゃー.
C++が補完できないファイルタイプとは偉くなったものだなYCMよ.
散々インストールを繰り返した挙句.もうvimなんて知らない,neovimに行っちゃうんだから!!とおもむろにneovimに手を出したが,こちらでもYouCompleteMeは作動しなかった.
直し方が分かったのでここに載せておく.この解決方法はneovimのみならずvimでも役立つであろう.ちなみに,この方法は,vimのyoucompletemeの導入記事としても役立つよう書きました.

deinでプラグインを管理していると~/.vim以下にたくさんのディレクトリができるが
全消去.

$ pip3 install neovim
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:neovim-ppa/unstable
$ sudo apt-get update
$ sudo apt-get install neovim
$ mkdir -p ~/.config/nvim

neovimではvimrcのかわりにinit.vimを使用するので~/.bashrcに

export XDG_CONFIG_HOME="$HOME/.config/nvim"

を書き込んでおく.書き込んだ後,source ~/.bashrcを実行するのもわすれずに

ここでポイント!!!!
vimrcのdein.vimで管理しているプラグインの中でdein.vimとYouConpleteMeのプラグイン以外のプラグインを全部コメントアウトする.これは非常に重要である.どれくらい重要かというと...ちょっと想像できません.ご了承ください.

vimrcの中身を~/.config/nvim/init.vimに書き写す.
そのあと,deinをインストール

$ mkdir -p ~/.vim/dein/repos/github.com/Shougo/dein.vim
$ git clone https://github.com/Shougo/dein.vim.git ~/.vim/dein/repos/github.com/Shougo/dein.vim

そしてnvimをたちあげると,もしくは:call dein#install()すると
deinとyoucompeltemeがインストールされます.

あとは,YouCompleteMeをコンパイルするだけなので

$ cd .vim/dein.vim/repos/github.com/Valloric/YouCompleteMe/
$ ./install.py --clang-completer

とする.君のシステムにすでにあるclangを使わないように!
要求するバージョンはclang3.9以上なのだとある!

...最新(2017-03-01)じゃん.

これで,YouCompleteMeは復活し,私の威厳は保たれた.おしまい.


重要なところは,init.vimのなかのdeinとyoucompleteme以外のプラグインをコメントアウト
したことで,再インストールとか全消去とかは必要あるかどうかはわかりません.
コメントアウトだけで復活するかも知れません.

2017年1月19日木曜日

c++11でliboctave

C++11でliboctave

liboctaveとは

前々から,やってみたかったのだが,簡単に数値計算をc++でできるliboctaveを導入してみた.
ていうか,matlabってあるじゃん.あの,お値段がとてつもなく高い数値計算用ソフト.あのお値段では,叶姉妹ぐらいのファビュラスなお金持ちでないと使うことができないのでは無いだろうか.いや,そうに違いない.

しかし,私は,お金持ちではないので創意工夫でどうにかするしか無い.そこでliboctaveである.matlabのコードがそのまま動くと言われているくらいmatlabにそっくりなoctaveっていう数値解析ソフトが存在し,それはc++11で実装されている.したがって,octaveを構成しているライブラリをc++11の自分のプログラムから呼び出すことが可能なのである.

Let’s 数値計算

環境は以下のとおりである

  • Ubuntu16.04(Linux mintの信者をやめたわけではない)
  • Cmake
  • LLVN Clang

さあ,パーティーの時間だ!!

$ sudo apt-get install octave liboctave-dev
$ sudo ldconfig

さあ,お片付けの時間だ!!

以下のようなテスト用のサンプルプログラムを用意します.

#include <iostream>
//#include </usr/local/include/octave-4.2.0/octave/config.h>
//octave-4.2.0ぐらいからはconfig.hはいらないらしい.コンパイラに怒られた.\(^o^)/

#include </usr/local/include/octave-4.2.0/octave/Matrix.h>

using namespace std;

  int main(int argc, char**argv)
  {
    Matrix A(2,3), B(2,2,1.0);
    ColumnVector x(3), y(2), z(2);
    for(int r(0); r<2; ++r)
      for(int c(0); c<3; ++c)
        A(r,c) = r+c;
    for(int r(0); r<3; ++r) x(r)=(r+1.0)*2.0;
    for(int r(0); r<2; ++r) y(r)=(r+1.0)*r;
    z = B*(A*x+y);

    cout<<"A="<<endl;
    cout<<A;
    cout<<"B="<<endl;
    cout<<B;
    cout<<"x= "<<x.transpose()<<endl;
    cout<<"y="<<y.transpose()<<endl;
    cout<<"z="<<z.transpose()<<endl;
    return 0;
  }

コンパイルは以下の感じで

clang++ -std=c+=11 test.cpp -loctave

Cmakeを使うときは以下の感じで

cmake_minimum_required(VERSION 3.5)
project(test)
add_executable(test test.cpp)
target_link_libraries(test octave)

結果は以下な感じざんす

A=
 0 1 2
 1 2 3
B=
 1 1
 1 1
x=  2 4 6
y= 0 2
z= 46 46

なんと言うことでしょう.
あの憎きmatlabと同等の環境を手に入れてしまった.ふはは.
何と言う高揚感!

まあ,当然のごとく,こういったことには先人がいて,わたしはコピーしただけなんだけどね.
どんなことができるかはここを見る

2016年7月10日日曜日

YouCompleteMeでPython future のエラーが出て補完できない!

さて,vimの補完担当プラグイン「YouCompleteMe」が
突然クラッシュしていうことにゃ

YouCompleteMe unavailable: This package should not be accessible on Python 3. Ei
ther you are trying to run from the python-future src folder or your installatio
n of python-future is corrupted.

あなたの元をわたしは去らねばならなくなりました.
わたしは,あなたのコーディングを手助けしてきましたが,とうとうお別れの時がきました.
今日のような日が訪れることは以前からわかっていました.あの,パイソン3がやってきたのです.
わたしはパイソン2.7やっていけますが,3とは相容れることができません.
おごれるものも久しからず,ただ春の夜の夢のごとし.さようなら.(意訳)

いやいや,待ちたまえ!
貴君なしではコーディングできない体に変革されてしまった.

とブツブツ言いつつ,vimrcの補完プラグインを昔のneocomplete + clang_completeに
変更した,しかし,YouCompleteMeのgithubのissueをみたところROSが
悪さをしているらしい.

ROS-indigoではYouCompleteMeと衝突しなかったところをみるにROS-kinetecとだけ
相性が悪いらしい.

いや,ROSをアンインストールしては仕事にならない.
仕事にならなくてはご飯が食べれない.ご飯が食べれなければ
わたしはダイエットに成功するであろう.
そうすれば,モテモテになり,億万長者になる.
なるほど,いいことずくめではないか.

しかし,ニートという肩書は同窓会の時に不利ではないか.
女子の心が札束でどこまで動くのか非常に懐疑的にならざるを得ない.

ROSを捨て,いっそYARPに...
かといって,YouCompleteMeは手放したくない.

そこで,回避を実行する.

まず,

sudo apt-get install vim-nox-py2

そのあと,~/.bashrcの最後に

alias vim='vim.nox-py2'

を追記.
これで,vimとターミナルで打つと,もとのvimとYouCompleteMeに再開可能になる.
いつもどおりの環境等のは何者にも代えがたいものである.
そう,今日の猫との戯れよりも.しかし,猫との戯れが,日常のひとはどうすればいいのか
答えはまだない.


いやまてよ.Python3とか2.7とか何なんだ
もう世界がc++で統一されればいいんだ!

2016年4月15日金曜日

librealsenseをLinuxMintにインストール

2017/04/に追記
Linux Mint 17の記事です.
Linux Mint 18にには適用できません.

realsenseをintelから購入しました.

そしたら,10日後に我が家に到着しました.
ちなみに,お届け先の住所のところで,県名をローマ字ではなく漢字で
登録してしまったところ,実際に届いた荷物の伝票のお届け先住所のところには
県名が書かれていませんでした.

intelの人,ごめんなさい.

realsense はr200 sr300と種類があり,
ここから購入できます.

 さて,Linuxでrealsense r200を 使うためには,librealsenseという
オープンソースのライブラリが必要なため,今回はそれをインストールします.

さらに,ちなみに,pcl1.8(point cloud library)のAPIの中にrealsenseGrubberという
クラスを見つけた私は,嬉々として,かつ頑張ってpcl1.8をインストールしましたが
relsenseGrubberを使うためにはwindowsでしか動かないrealsenseSDKが
必要でした.オーマイガッ!

さて,このlibrealsenseですが.4月15日現在,公式の説明通りではうまく行かないことがわかったのでここに訂正版を載せておきます.

●ソースのダウンロード

$ sudo apt-get update && sudo apt-get upgrade

$ cd  ~/

$ mkdir build

$ cd build

$ git clone https://github.com/IntelRealSense/librealsense.git

●必要なものをインストール

$ sudo apt-get install libusb-1.0-0-dev

●多少の設定変更




上の写真のようにアップデートマネージャの

ソースコードのチェックボックスを入れるの!

これは,公式の説明にはない.だた,やっとかないと失敗する.


●引き続きインストール


$ scripts/install_glfw3.sh

●カーネルにパッチ当てたり,usbのルールを変更したり


ここからは,必ず,realsenseがあなたのPCに突き刺さっていないことを
確認してから行ってくださいね

$ sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/

$ sudo udevadm control --reload-rules && udevadm trigger

ここからlinuxカーネルのバージョンによって操作が異なるが
mintは3.19.0-32なので,迷う必要がない,ああ,mintで良かったね!よね?!

$ ./scripts/patch-uvcvideo-ubuntu-mainline.sh

さて,ここから要注意,公式の説明通りではダメなとこ第二弾.
スクリプトの中身を読めばわかることだけど,読まないと引っかかる.

$ cd scripts

$ ./scripts/install-r200-udev-fix.sh

$ sudo modprobe uvcvideo

$ sudo dmesg | tail -n 50

ここでエラーが出ないようだったらいいかもしれないと
公式の説明には書いてあったが,そんなこたぁー無い.

●コン・パイル 

さあ,あとは,今までインストールしたものを使ってコンパイルするだけ.
ゴールは目前!

あと,ここから,Qtをインストールするけど,Qtの公式サイト
からインストールするほうがいいかもしれない.
私は公式からインストールしました.
信じるか信じないかは,アナタ次第.へっへっへ...

$ sudo apt-get install qtcreator

$ sudo scripts/install_qt.sh

libralsense.qtcreatorというディレクトリのなかのall.proを
ダブルクリックして,

ビルド(タブ) --> すべてクリーン
ビルド(タブ) --> qmakeの実行
ビルド(左下) --> クリック

ものすごい警告がでるが,それは私の日頃の行いに
よるものなのかは不明.

あとは,
libralsense/bin/debagのなかにあるプログラムを
実行して,カラー画像,左右の赤外線画像,depth画像が
取れれば成功.

お疲れ様でした.



 

2016年4月9日土曜日

YouCompleteMeのNeocompleteを利用してアップデートした際の再コンパイル方法

唐突だが,私はLinux Mintを使用している.
そしてc++erでもあり,vimerでもある.

したがってc++をvimで書いている.
vimはその手軽さによってvisual studioとかいうIDEを立ち上げるより
コーディングへの敷居を遥かにさげてくれる.

もはや下げすぎて,敷居が溝になったレベルである.
今度は溝に気をつけないと足を取られて大惨事である.

一本下駄とかハイヒール履いてるようなヒトは要注意である.

さて,vimで補完する際に,私は,YouCompleteMeというプラグインを
利用しているが,このプラグイン,アップデートするたびに再コンパイルが
必要なのである.

いい機会なので,再コンパイルの手順を書いておきます.




1.vimrc にて

:neobundleupdate

を実行.


2.~/.vim/bundle/YouCompleteMe/にて

./install.py --clang-completer
 
を実行.
 
 
あと,半自動でCMakeList.txtからycm_extra_conf.pycを作成してくれる
YCM_Generaterはいつもお世話になってます.