wgetでBasic認証付きのページをダウンロード


wget先のURLを指定する際に,basic認証のユーザ名とパスワードを以下のように設定すれば良い.

http://username:password@www.server.name/path/to/file

ここで,passwordに「@」が入っていると,それ以降がサーバ名だと解釈されてうまくいかない.

http://username:p@ssword@www.server.name/path/to/file

こういう場合,ssword@www.server.nameがサーバ名だと思われてしまう.

パスワード中の「@」を「%40」に置き換えることでこれを回避できる.

http://username:p%40ssword@www.server.name/path/to/file

Fedora 23でchainerインストール


今,Fedora 23はgccのバージョンが5.3.1なので,そのままchainerをインストールしようとすると,コンパイルエラーが発生する.

原因は,以下の2点

  • CUDAがgcc 4.9までしか対応していないこと.
  • enumの扱いが変わったこと.

CUDAのgcc対応

コードを見ると,

/usr/local/cuda/include/host_config.h

の115行目に,GCCのバージョンが4.9より大きいとエラーになるような #error が書かれている.
仕方ないので,これをコメントアウトして次のようにするとコンパイルが通るようになる.

#error -- unsupported GNU version! gcc versions later than 4.9 are not supported!
   ↓
//#error -- unsupported GNU version! gcc versions later than 4.9 are not supported!

enumの扱い

元々enumはint型として扱えていたが,それができなくなっている.なので,

typedef enum enum_etype{
    a = 1
    b = 2,
    c = 3
} Etype;

int main(){
    Etype x = 0;
}

のようなコードはコンパイルエラーになる.これを防ぐにはgccのオプションに"-fpermissive" をつければ良い.

なので,chainerをインストールする際に,

alias g++="g++ -fpermissive"
pip install chainer

としたらいけた.正しいやり方かどうかわからないけど.

evervimでリストの入れ子が出来るようにした


vimにはEvervimというプラグインがあり,Evernoteのノートをvimから直接編集できます.
しかも,markdownを使って書くことができます(要pythonのmarkdownモジュール).

が,しかし

以前使っていた時に,保存して再度開くと,書いたものが消えている,ということが何度かあったので,しばらく使っていませんでした.

今回,そのバグフィックスをしました.
調べてると幾つか問題がありましたが,その一つが,ulやolのリストを入れ子にすると,再度開いた時に,入れ子構造が壊れて,入れ子の上の階層に戻って以降が消える,というもの.

evervimのコードを見ていくと,Evernote用のXML形式であるENMLをパースしてmarkdownへと変換する関数が,入れ子に対応していなかったのを発見.
修正してプルリクエストしておきました.

LibSVMはOpenMP化して使いましょう


LIBSVMというSVM(Support Vector Machine)のライブラリがある.
SVMで学習したり認識したりするときは特徴ベクトルとサポートベクトルの演算があり,結構時間がかかる.

FAQを見ると,OpenMPで並列化させる方法が載っている.
OpenMPで並列化をすれば,CPUのコアを複数使って効率よく学習や認識ができるのでおすすめ.

これを見て知りました.
LIBSVMをマルチコア環境で速くする方法 using OpenMP+おまけ

VimRepress導入してみた


VimRepressというvimプラグインがあって,vimからwordpressに投稿できる.
今回,ブログ更新のために導入してみた.

markdownと組み合わせると,ブログ書きたくなった時に

  1. vimを起動
  2. :BlogNew
  3. ブログをMarkdownで書く
  4. :BlogSave publish

でサクッとブログ更新できるので超捗る.
今までWordPress開いて記事書いて…ってやるのが面倒でブログ記事が滞っていたけどこれなら….

色んなサイトで紹介されているので参考まで.

caffeのビルドでハマるとき


自分用メモです.

fedora22でCaffeのビルド時に,cblas関連のリンカエラーが出る場合.

CaffeのデフォルトのBLASライブラリはAtlasですが,何故かうまくいかないので,OpenBLASを使うように変更する.
やり方は,cmakeの時にBLASをAtlasからOpenに切り替える.

Matlabきらい


Matlabとの戦い.特に最近使っているのが Piotr's matlab toolbox.人物検出をやるには必須のライブラリっぽい.

というのも,Piotr DollarさんはPietro Perona先生と人物検出のサーベイや検出手法の論文を書いている人.今はFacebook のAI Researchにいる…のかな?人物検出の精度評価のデファクトスタンダードと言えるプログラムを作って公開しています.それが前述の pietor's matlab toolbox


 

最近研究室による遅くまで残ってることが多い….今日も戸締まりして帰りました.

 

10ヶ月ぶりの更新


ずっと放置してたけど
久しぶりに再開してみよう.


新しい職場では定期的にテニスの会がある.

というわけで,
ラケット買いました


MatlabのmatファイルをC/C++から読み書きするライブラリのmatioというものを教えてもらい,ちょっといじってみた.

近いうちにブログにまとめたい.

 

Pythonでbool値の引数をargparse


引数にTrue/Falseの値を渡してargparseでパースして使いたい.
ということでメモ.

ぐぐったらこういうやり方が出てきた.

def parse():
    parser = argparse.ArgumentParser(description='Argparseのテスト')
    parser.add_argument('--version', action='version', version='%(prog)s 1.0')

    parser.add_argument('--force', dest='force', action='store_true')
    parser.add_argument('--no-force', dest='force', action='store_false')
    parser.set_defaults(force=False)

    params = parser.parse_args()

    return vars(params)

この --force/--no-force の指定で force の値が True/False になる.デフォルトはFalse.

ただ,これだと

python hoge.py --force --no-force

みたいに両方指定することも可能なのでまずい.

そこで,mutually_exclusive_groupを使って,

def parse():
    parser = argparse.ArgumentParser(description='Argparseのテスト')
    parser.add_argument('--version', action='version', version='%(prog)s 1.0')

    group = parser.add_mutually_exclusive_group()
    group.add_argument('--force', action='store_true')
    group.add_argument('--no-force', action='store_false')
    parser.set_defaults(force=False)

    params = parser.parse_args()

    return vars(params)

とすることで,両方指定した時にエラーを出すことが出来る.

OpenCV 3.0.0-alphaで特徴点検出 c++11


前回SURFを無事有効化できたので,特徴点検出をしてみた.
c++11のコードを貼っておく.

#include <opencv2/opencv.hpp>

int main(){
        cv::VideoCapture cam(0);

        // 特徴量を選ぶ
        auto featureDetector = cv::FeatureDetector::create(SURF);
        //auto featureDetector = cv::FeatureDetector::create(ORB);
        //auto featureDetector = cv::FeatureDetector::create(BRISK);
        //auto featureDetector = cv::FeatureDetector::create(SIFT);
        std::cout << featureDetector->name() << std::endl;
//      auto descriptorExtractor = cv::DescriptorExtractor::create(SURF);

        while(true){
                cv::Mat img;
                cv::Mat gimg;
                cv::Mat result;
                std::vector<cv::KeyPoint> keypoints;
                std::vector<float> descriptors;

                cam >> img;
                if(img.empty()) break;

                // グレースケール化
                cv::cvtColor(img, gimg, cv::COLOR_BGR2GRAY);

                // 特徴点検出
                featureDetector->detect(gimg, keypoints, cv::Mat());
//              // 特徴量を抽出
//              descriptorExtractor->compute(gimg, keypoints, descriptors);

                // 特徴点の描画
                cv::drawKeypoints(img, keypoints, result);

                char key = cv::waitKey(1);
                cv::imshow(img, img);
                cv::imshow(gimg, gimg);
                cv::imshow(keypoints, result);
                if(key == 'q') break;
        }

        return 0;
}

コンパイルするときは,

g++ -std=c++11 -o detect sample.cpp `pkg-config --cflags --libs opencv`