zsh(やshやbash)でパス系環境変数の重複を除去する

魚へんのつく漢字は非常にたくさんあって、よく雑学問題とかになるんですが、実際のところいくつあるんでしょう。Unicodeの文字表で調べてみたところ、魚へんのつく漢字は394種類ありました。実際はもっとあるんでしょうが、すごいですね。

さて、tmuxを使っていたり、シェル設定を書き換えてsourceしたりなど、PATHやLD_LIBRARY_PATHなどのパス系環境変数の記述が重複してしまうことがよくあります。
これを解決するためのメモ。
参考はこちら。というか完全にそのまま。
zsh で環境変数 LD_LIBRARY_PATH、INCLUDE などの重複パスを除去する – キーボードをたたくとき

zshrcやzshenvに下記のような記述をすればOKです。

typeset -T LD_LIBRARY_PATH ld_library_path; typeset -U ld_library_path
typeset -T LIBRARY_PATH library_path; typeset -U library_path
typeset -T CPATH cpath; typeset -U cpath

どういう意味かは参考サイトの通りです。

また、特にPATHなどに関しては以下の記述で重複除去ができます。

typeset -U path cdpath fpath manpath

ところで、パス記述の重複ってパフォーマンスには影響するのかな。
つまり、実際のパス探索の段階で、すでに見たところをまた見に行ったりするんでしょうか。
だとすると重複除去は絶対必要ですねー。

あと、bashで同じことをしたい場合はどうすればいいんでしょう。
こんなかんじで重複除去自体はできなくはないですが、

$ PATH=c:b:c:a:b:a
$ PATH=`echo $PATH | sed "s/:/\n/g" | sort -u | paste -sd ":"`
$ echo $PATH
a:b:c

記述順が変化してしまい、実際のパス探索の順序が変わってしまい、イケてないかんじです。
力技でできないことはないけど・・・スマートにできないものか。

追記。bashやshでの重複除去を力づくでやってみたので、興味があれば続きを参照。

Continue reading

第2回 スマホUXラボ「ユーザーテストLive! 見学会~異文化コミュニケーション系Androidアプリ~」に参加しました

東京湾はあまりお魚,というイメージはないですが(特に僕のような地方出身者にとっては),「江戸前」と言って,寿司ネタとかで人気なんだそうです.そんな江戸前の中ではいまはアナゴが旬だそうですね.

さて,2014年7月4日に,株式会社InnoBetaさんの主催で,『第2回 スマホUXラボ「ユーザーテストLive! 見学会~異文化コミュニケーション系Androidアプリ~」』が開催されましたので,参加してきました.
スマフォアプリ開発をしているわけではないのですが,一般論的なユーザーテストに関しての勉強にもなると思ったので行ってみた次第です.

Continue reading

Linux上のAndroid開発で実機実行する際のudev/adb設定

お久しぶりです.今年度から名古屋のお魚さんかわって東京のお魚さんになったお魚さんです.

魚類の中で最小の種は,Paedocypris progeneticaと言い,成魚で体長7.9〜10mm程度なんだそうですね.
最小の魚類であるばかりか,最小の脊椎動物とのことです.

さて,Linux PC上でAndroidアプリ開発するとき,Android端末をPCに認識させるために設定が必要です.
ググれば出る情報ですがよく忘れるのでメモ.

やることは単純です.
(1)端末のベンダIDをudevのルールに追加
(2)adbを再起動
ついでに,アプリを端末上で実行するところまで説明します.

udev設定

Android端末をUSBでLinux PCとつなぎます.

% lsusb
...
Bus 002 Device 018: ID 0fce:619e Sony Ericsson Mobile Communications AB
...
Bus 002 Device 021: ID 0bb4:0ff9 HTC (High Tech Computer Corp.)
...

こんなかんじで,SONY EricssonのベンダIDは0fce,HTCのベンダIDは0bb4,…というかんじで見ることができます.

ベンダIDを調べたら,

SUBSYSTEM=="usb", ATTRS{idVendor}=="ここにベンダIDを入れる", MODE="0666", GROUP="plugdev"

という文字列を,以下ファイルに追記します.端末を複数お持ちならベンダごとに記述してください.
/etc/udev/rules.d/51-android.rules

終わったら,念のためにudevに設定をリロードさせます.で,adb (android debug bridge)を再起動します.

% sudo udevadm control --reload-rules
% adb kill-server
% adb start-server

ちなみにadbは,Android SDKのルートディレクトリ下のplatform-toolsにあります.
ここまでで設定は完了です.

アプリ動かすまで

ここで一旦Android端末をUSBから引っこ抜いて,また接続します.
これをしないとudevが端末を認識してくれないので.

では,実際にアプリを動かしてみましょう.
開発環境(Eclipse+SDK+ADTPlugin)については導入済みということにして,またAndroid端末のUSBデバッグモードも有効にしておいてください.

プロジェクトもすでに作ってあるとします.
EclipseのRun asボタンをクリックして,

eclipse_click_run_as

端末を選択して,
eclipse_choose_real_device

OKをクリックすると端末で動きます!
execution_result_htcj

Androidに限らず,もっとみんなLinux PCで開発すればいいのに!(マサカリ覚悟)

参考

ssh XForwardingを速くする設定

おさかなさんも先日,24歳を迎えました.もう若くはないです.
しかしキャビアで有名なチョウザメは寿命が150年〜200年にも達するそうです.

手元の環境でssh XForwardingするとき速度が遅くて困っていたのですが,ちょっと調べると高速化Tipsがあり,効果覿面でしたのでメモがてらに.
How to speed up X11 forwarding in SSH – Linux FAQ

~/.ssh/configに

Host *
    Compression yes
    CompressionLevel 9
    TCPKeepAlive yes
    Ciphers blowfish-cbc,arcfou

こんな感じの記述を追加します.

ふつう

% ssh -YC hogehoge@fugafuga

とするとX転送とCompressionが有効な状態になりますが,暗号化処理が結構重たく遅くなるようです.そこでこの設定をすると暗号化処理が軽くなりトータルでも速くなるという理屈のようです.

個人的な印象ですが,WWWブラウザとか画像ビューア(geeqie)まるごとX転送して遠隔操作するぶんには,今まで話にならなかったのがこの設定によってまぁ問題ないぐらいまで速くなった気がします.

こちらも読んでておもしろい.
OpenSSH ciphers performance benchmark | /contrib/famzah

sshのXForwardingを速くする設定と題した記事ですが,ssh全般的に速くなる設定ですねこれは.

OpenCVビルド時のCUDAのccbinの指定方法

リンネの生物階級分類において,「スズキ目」というのは脊椎動物中で最大の規模を誇る「目」なんだそうです.
スズキ目スズキ科スズキはまさに全生物中における最大勢力を束ねる王者と言えましょう.だから何.

さかな前線 » CMakeでCUDAの-ccbinの正しい指定方法の姉妹記事です.

さて,Linux上でOpenCVでCUDAサポートをONにしてビルドするとき,GCCのバージョンを指定したいことがあります.
基本的にはデフォルトGCCなんですが,4.8系などは現在のCUDAのnvccではサポートされていませんので,CUDAビルド時に限りGCC4.4や4.6を使うという設定です.

具体的には,CMakeのときに以下のように書きます

$ pwd
/home/hogehogehogehogeho/opencv-2.4.6.1/build

$ cmake -DWITH_CUDA=ON -DCUDA_HOST_COMPILER=/usr/bin/g++-4.4 ..

$ make -j40 -s; sudo make install

WITH_CUDAとともにCUDA_HOST_COMPILERを正しく設定すればいいのですが,CUDA_HOST_COMPILERに指定するgccはPATHが通っていても絶対パスで指定する必要があるようです.
CUDA_HOST_COMPILER=g++-4.4と書くと,ないよ>< って言われます.

以上です.

参考:OpenCV – Bug #2844: build with CUDA 5.0 on macosx – OpenCV DevZone

CMakeでCUDAの-ccbinの正しい指定方法

半年ぶりの更新です.
半年の間に,しらすの春の旬と秋の旬をまたぐことになりました.
っていうか,寒いよ!夏がいいよ!!><

さて,Linux上のCMakeでCUDAを使っているんですが,CUDAではたいてい最新のGCCはサポートされません.
ということで,nvccの-ccbinオプションによってCUDA関連のコンパイルのみを古いGCCにすることができます.
普段のC++コードは最新のGCCで,CUDA関連のみはサポートされたGCCでご利用いただけます.

CMakeにおいてこれを行うときは少しクセがあり,だいぶ格闘したのでメモ.

-ccbinの例

例えば次のソースを用意します.

// prog.cu
int main()
{
}

GCCの4.8.1を使ってnvccでコンパイルしてみると.

$ g++ --version
g++ (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ nvcc prog.cu
In file included from /usr/local/cuda/bin/../include/cuda_runtime.h:59:0,
                 from <command-line>:0:
/usr/local/cuda/bin/../include/host_config.h:82:2: error: #error -- unsupported GNU version! gcc 4.7 and up are not supported!
 #error -- unsupported GNU version! gcc 4.7 and up are not supported!
  ^

$ nvcc prog.cu -ccbin g++-4.4
$ ./a.out
(うごいた)

こうなります.
ちなみに今回はCUDA 4.2の環境.

CUDAソースによる小さいサンプル

本題.

CMakeだとnvccは自動的に実行されるので,nvccに与えるオプションはちゃんと与える必要があります.

ということで,CMakeLists.txtの最小の例.
上のprog.cuと同じディレクトリに置きます.

#A tiny example of CMakeLists.txt

cmake_minimum_required(VERSION 2.8)                     # おまじない
project(osakanacuda)                                    # プロジェクト名

set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -ccbin g++-4.4)  # GCCへのパス.PATHが通っていればこのように名前のみの指定でもOK
#list(APPEND CUDA_NVCC_FLAGS -ccbin g++-4.4)            # これでもOK

#以下はどちらもダメ.違いがわかりますか?
#set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -ccbin=g++-4.4)
#list(APPEND CUDA_NVCC_FLAGS=-ccbin g++-4.4)

find_package(CUDA)                                      # CUDA環境を見つけてくれる.やらないとダメ
cuda_add_executable(prog prog.cu)                       # progっていう実行ファイルをビルドしてくれる設定になる

こんな配置だとすると,

.
├── CMakeLists.txt
├── prog.cu
└── build/

次のようにしてビルドします.

$ ls
CMakeLists.txt prog.cu build/

$ cd build
$ cmake ..
$ make

ダメって書いてある方の指定をすると,

nvcc fatal   : redefinition of argument 'compiler-bindir'
CMake Error at prog_generated_prog.cu.o.cmake:206 (message):
  Error generating
  /hogehogehogehogheohgoehgoehoge/build/CMakeFiles/prog.dir//./prog_generated_prog.cu.o

っていう内容を含んだエラーが出ます.

理由

正しい指定と誤った指定の違いは見ての通り,”-ccbin=hogehoge”か”-ccbin hogehoge”の違いなんですが,CMakeのFindCUDAにあるrun_nvcc.cmakeを読んでみると,
“-ccbin”という文節があった場合にその指定を優先するようになっており,
ない場合はCMakeの中でのデフォルトの指定をすることになっています.

なので,”-ccbin=hogehoge”をCUDA_NVCC_FLAGSに指定すると,nvccが呼び出されるときは

nvcc ... -ccbin=hogehoge -ccbin fugafuga ...

となり,「多重指定はダメだっちゃ」と怒られます.

なんちゅー仕様.誰か修正してくださ・・・

なお今回の環境は,

  • Debian 6.0
  • CMake version 2.8.11.1
  • CUDA 4.2
  • GCC 4.8.1/4.4.5

です.

gnuplotのepslatexを使ってTeXへちゃんとした数式入りのグラフを挿入する

学会への投稿などで忙殺されてるうちに季節は春になり,鯖とかホタルイカとかが結構旬になってきましたね.
お魚が食べたいです.

さて,(少なくとも僕たちの界隈では)学会準備シーズンということで僕も日々涙目になりながらいくつかの原稿を書いてます.
そんなとき,gnuplotで生成した図の凡例やラベルに複雑かつ綺麗な数式を書いてTeX原稿に貼り付けたい!とか,グラフ中に日本語が使いたい!とかの需要は極めて多くあるんですが,やりたいことのシンプルさのわりにえっらい作業量が多くて困る.

20130319_top_bad20130319_top_good

その中でもよく使われるのがpsfragで,epsをTeXソース貼り付けてコンパイルするとき,強引にeps中の特定文字列をTeXの記述に置換してコンパイルすることで・・・というかなり強引なやり方です.

これで普通にうまくいくならそれでOKなのですが,手元の環境でうまくいったことがない・・・後述するTeX Liveとの相性なんだと思いますが.

ということで,psfragを使わないepslatexによる方法を解説します.
この方法はpsfragのように追加のスタイルが必要ないこと,また記述の柔軟性がかなり高いという大きなメリットがあります.

一方,psfragのメリットは使えるフィールドがgnuplotに限られないことが大きいです.psfragなら例えばtgifで描いた図のラベルを数式に出来たりします.
あと作業量はやっぱりpsfragの方が少なくて済むので,手元の環境で動けばpsfragで構わないだろうとは思います.適切に使い分けてください.

Continue reading

root権限の無い哀れな子魚ちゃんたちのためのgcc野良インストール(Linux)

僕の専門は画像パターン認識でして,魚画像からの種類判別とかいつかやっていみたいなぁとか思ってるんですがなかなかこれは問題として難しそうです.ここ(PDF注意)とかにそういう文献が出てるんですがこれは何の本なんでしょう?知ってる方いたら教えて欲しいです.使われてる技術を見ると2000年代以降のものではないなという印象.それより昔のことは体系的には知りません・・・w

さて,常に最新のgccが使いたいという人のためのにgccを野良ビルドしてインストールする手順を以前さかな前線 » GCC 4.6.2が出たので手動インストール方法メモ(Linux)に書きました.

一方で,共用計算機などではroot権限がなく勝手にプログラムをインストールできないことがよくあります.
そんなときでも,自分の領域が割り当てられていればそこに野良ビルドしてインストールして使うことは可能です.
そういう構成を可能にするためのgccのビルド方法をメモっときました.
今回はGCC 4.7.2を64bit版Linuxに入れることを考えています.

基本的にはさかな前線 » GCC 4.6.2が出たので手動インストール方法メモ(Linux)と同じです.
ただし一部,gcc4.6.2の手動インストールメモ – N_Nao’s logを参考にしています.

Continue reading

C++11のstd::discrete_distributionでノンパラメトリックな分布の乱数生成

おさかなおさかなって言ってたらリアルにお魚好きになってしまったって話は前もしたと思うんですが,そのせいでホントに魚が食べたい今日このごろです.調理法としては,お刺身の次点くらいで焼き魚と酒蒸しが好きです.お刺身はそのままスーパーで買ってくればいいし(美味しいかと言われると微妙ですが),焼き魚も買ってきてグリルで焼くだけなので気軽にできるんですが,酒蒸しはちょっと自宅ではできなくて食卓が寂しいです.

さて,C++11では乱数関連のライブラリについてもboost由来の大幅強化がされまして,ホントに強力なものになっています.
まず乱数エンジンでは,よりよい擬似乱数アルゴリズムが豊富に取り揃えられており,さらにはハードウェアを利用した真の乱数も扱えます.
また生成される乱数の分布の点でも,通常の一様分布や各種の確率分布(GaussianやPoissonなど)が利用できます.

今日お話するのは分布の中でも,出力される各値の確率をユーザが指定できるノンパラメトリックな分布を実現するstd::discrete_distributionのお話.

なおboost::randomからstd::randomへは大きな設計変更がありましたけれども,今回の話に関しては普通にstd::discreted_distributionをboost::random::discrete_distributionとそのまま読み替えてもらっても大丈夫です.

Continue reading

Intel製CPU内蔵GPU使用時にLinuxホスト上のVMWareのゲストの3Dアクセラレーションが有効化できない場合の対処

先週金曜日(2013/1/25)から猛烈な寒波が全国を襲ったらしいのですが今日辺りからやっとゆるんで,名古屋の最低気温も0度越えでした.
もう晩冬になりますね.晩冬と言えば,綺麗なプロポーションで個人的に好きなお魚であるサヨリが旬ということでぜひ楽しんでみたいです.

さて,ホストをLinuxとしてVMWare上でWindowsゲストを動かす場合などで,GPUがIntel製である(HD Graphics 3000とかである)場合に,ゲストの3Dアクセラレーションが有効にできないようです.

Continue reading