Github Pagesでbuild failureがでる

12/8にGithub Pagesのupdateがあり、今までと仕様がいくつか変わっている。

Publishing with GitHub Pages, now as easy as 1, 2, 3

大きな変更点は、repositoryのmarkdown fileが全てbuildの対象になったという点。 今までは、ヘッダーに---を記載したMdファイルだけがbuildの対象だったが、デフォルトで全てのmarkdownファイルがBuildの対象となったため、jekyllでbuildが通らないmdファイルなどをおいておくとエラーで落ちる。

今まで公開してなかったファイルを非公開にするには、_config.ymlファイルをrepositoryのトップにおき、以下を記載する。

exclude: [directory, file]
  • directoryはbuildに含めないディレクト
  • fileはbuildに含めないファイル
  • 複数指定可

hubでpull-request: Unprocessable Entity (HTTP 422) Invalid value for "head"とでる

ReferenceにあるようにError Messageが適切でない場合があるので、下記の方法で必ずしも解決するかは不明。 github上にbranchがないのにpull-requestを作っているのが問題 --pushで、今いるbranchをpushしてpull requestを作ってくれる。

hub pull-request --push

Reference

boost::numeric::ublas::matrixのiterator

boostのublas::matrixにはbegin1とbegin2のiteratorがある。 どういうものか記載がなかったのでメモ。

答えは、行列の1行目と1列目のitetator

    namespace ublas = boost::numeric::ublas;
    ublas::matrix<double> m(3, 3);
    m(0, 0) = 0.0; m(0, 1) = 1.0; m(0, 2) = 2.0;
    m(1, 0) = 3.0; m(1, 1) = 4.0; m(1, 2) = 5.0;
    m(2, 0) = 6.0; m(2, 1) = 7.0; m(2, 2) = 8.0;

    for (auto e = m.begin1(); e != m.end1(); ++e) {
        std::cout << *e << std::endl;
    }
    //0
    //3
    //6

    for (auto e = m.begin2(); e != m.end2(); ++e) {
        std::cout << *e << std::endl;
    }
    //0
    //1
    //2

    for (auto e = m.rbegin1(); e != m.rend1(); ++e) {
        std::cout << *e << std::endl;
    }
    //6
    //3
    //0

    for (auto e = m.rbegin2(); e != m.rend2(); ++e) {
        std::cout << *e << std::endl;
    }
    //2
    //1
    //0

boostでdemangleする

boost/coreにはいくつかのutility系の機能がある。 boost/core/demangle.hppはdemangleを提供する。

使い方

#include <boost/core/demangle.hpp>
#include <typeinfo>
#include <iostream>

template<class T> struct X
{
};

int main()
{
    char const * name = typeid( X<int> ).name();

    std::cout << name << std::endl; // 出力は処理系による
    std::cout << boost::core::demangle( name ) << std::endl; //出力はX<int>
}

参考

demangle - master

Aligntaでvimで行末のコメントを揃える

vimで行末のコメントを揃えるときの話。 矩型選択などを利用して揃えるものはあるが、プラグインを使った解説をしているものがなかったのでメモ。

準備

Aligntaを入れる。 Alingtaは、文章整形用のvim plugin。 同様のツールにAlignがあるが、Aligntaの方が高機能? markdownのテーブルの整形などにも使えるので、入れておいて損はない。

vim-alignta

インストール

NeoBundleの場合は下記でOK。

NeoBundle 'h1mesuke/vim-alignta'

やり方

下記のコードを例にする。

int a; // hoge
const int b = 1; // fuga
const double c = 2.0; // hage

揃えたい行を全て選択する。 :を押して、下記コマンドを入力する。

:'<,'>Alignta <- //

下記のように揃う。

int a;                // hoge
const int b = 1;      // fuga
const double c = 2.0; // hage

コマンドの意味

:'<,'>Alignta <- //
  • '<,'>は選択範囲を表すvimのコマンド。
  • AligntaはAligntaのコマンド。
  • <-はAligntaの整形用のオプションで、揃える文字(この場合//)の左側(ソースコード部分)は変更しないということ。
  • //は揃える文字の先頭。

補足

行末コメントを揃えるのはメンテナンス性が悪いので、googleのcoding guidelineなどでは使用しないように記載されている場合もあるが、Cの場合はマクロを見やすくするために¥を行末にいれることがしばしばある。

python coding guideline

pythonのpackagesのimportまとめ

pythonのpackagesのimportの仕方と使いかたのメモ。 pythonディレクトリ内に__init__.pyを置いておくと、ディレクトリはpackagesとして認識される。 __init__.pyはpackagesの初期化処理を記述し、なければ空で良い。

まとめ

  • packages内のフォルダ名及びファイル名はC++などでいうところの名前空間のような役割。
  • 単純にimportする場合は、その名前空間を利用可能にするだけで、省略はできない
  • packages名などの省略をしたい場合はfrom packages import subなどを利用する。

テストファイル

ディレクトリ構成は以下。

├── main.py
└── packages
    ├── __init__.py
    ├── egg.py
    └── sub
        ├── __init__.py
        └── sub_egg.py

main.py

import sys #to get function name.

def test0():
  print sys._getframe().f_code.co_name
  print "  ",
  #packages.egg.egg() error

def test1():
  print sys._getframe().f_code.co_name
  print "  ",
  import packages.egg
  packages.egg.egg()
  
def test2():
  print sys._getframe().f_code.co_name
  print "  ",
  from packages import egg
  egg.egg()
  #packages.egg.egg() error

def test3():
  print sys._getframe().f_code.co_name
  print "  ",
  import packages
  from packages import egg
  packages.egg.egg()
  
def test4():
  print sys._getframe().f_code.co_name
  print "  ",
  import packages.sub.sub_egg
  packages.sub.sub_egg.sub_egg()
  #sub_egg() error

def test5():
  print sys._getframe().f_code.co_name
  print "  ",
  from packages.sub import sub_egg
  sub_egg.sub_egg()

def test6():
  print sys._getframe().f_code.co_name
  print "  ",
  from packages.sub.sub_egg import sub_egg
  sub_egg()

def test7():
  print sys._getframe().f_code.co_name
  print "  ",
  import packages
  packages.sub.sub_egg.sub_egg()

if __name__ == '__main__':
  test0()
  test1()
  test2()
  test3()
  test4()
  test5()
  test6()
  test7()

packages/egg.py

def egg():
  print "packages.egg"

packages/sub/sub_egg.py

def sub_egg():
  print "packages.sub.sub_egg"

実行結果

packages.egg
packages.egg
packages.egg
packages.sub.sub_egg
packages.sub.sub_egg
packages.sub.sub_egg
packages.sub.sub_egg

ublasのouter_prodの計算式

boostのublasにはouter_prodというベクトルとベクトルの転置の積を計算する関数が存在する。 どちらのベクトルが転置されているかちゃんと書いたものがなかったのでメモ。 直積の演算としては直感通りの式。 $$ x = \left( \begin{array}{c} x_{1} \\ x_{2} \\ \end{array} \right), y = \left( \begin{array}{c} y_{1} \\ y_{2} \\ \end{array} \right) $$ $$ \mathrm{outer\_prod}(x, y) = xy^{T} = \left( \begin{array}{cc} x_{1}y_{1} & x_{1}y_{2} \\ x_{2}y_{1} & x_{2}y_{2} \\ \end{array} \right) $$

#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>

namespace ublas = boost::numeric::ublas;
int main(int argc, char const* argv[])
{
    ublas::vector<double> x(2);
    x(0) = 1.0;
    x(1) = 2.0;
    ublas::vector<double> y(2);
    y(0) = 3.0;
    y(1) = 4.0;

    ublas::matrix<double> A = ublas::outer_prod(x, y);
    std::cout << A(0, 0) << ", " << A(0, 1) << std::endl;//3, 4
    std::cout << A(1, 0) << ", " << A(1, 1) << std::endl;//6, 8

    return 0;
}