Tamflexの備忘録

Tamflexの貯蔵庫

やる気のない備忘録

anaconda3でgraph_toolを使う

ubuntuでgraph_tool(graph-tool: Efficent network analysis with python)を使うときには、以下のリンクに従ってレポジトリを登録したあと、以下のコマンドで簡単にインストールできる。

sudo apt install python-graph-tool # python2 version
sudo apt install python3-graph-tool # python3 version

git.skewed.de

けれどもanaconda3で使うときはパスが通っていないためimport graph_toolが使えなくて困る。
で無理やりgraph_toolが入っているパスを以下のように通してあげると…

import sys
sys.path.append('/usr/lib/python3/dist-packages')

以下のようなエラーが出てきてしまう。

ImportError: /path/to/file/anaconda3/bin/../lib/libgomp.so.1: version `GOMP_4.0' not found (required by /usr/lib/python3/dist-packages/graph_tool/libgraph_tool_core.so)

どうやら共有ライブラリlibgomp.so.1のバージョンが違うらしい。だったら共有ファイルを無理やりシステムのものを使うようにリンクを通してあげれば良い。

cd /path/to/file/anaconda3/lib
mv libgomp.so.1 libgomp.so.1.bak
ln -s /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0 libgomp.so.1

同様に共有ファイルlibstdc++.soについても同じように以下のようなエラーが出る

ImportError: /path/to/file/anaconda3/lib/python3.5/site-packages/scipy/special/../../../../libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /usr/lib/python3/dist-packages/graph_tool/libgraph_tool_core.so)

だから同じようにリンクを作る。

mv libstdc++.so libstdc++.so.bak
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22 libstdc++.so
mv libstdc++.so.6 libstdc++.so.6.bak
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22 libstdc++.so.6

自分の環境ではこれでエラーが出なくなり正常にimportされるようになった。
あとはpthファイルを以下のように作れば冒頭のように一々import sysをしなくて済む。

cd /path/to/file/anaconda3/lib/python3.5/site-packages
touch graph_tool.pth
echo /usr/lib/python3/dist-packages > graph_tool.pth

無理数を使わないでフィボナッチ数の一般項を表現する

フィボナッチ数の一般項は以下の式で表される。
{\displaystyle
a_n = \frac{1}{\sqrt{5}}\left(\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n\right)
}

これを展開して、無理数をなくしてあげると以下のようになる。
{\displaystyle
a_n = \frac{1}{2^{n-1}}\sum_{i=0}^{\lfloor \frac{n}{2} \rfloor}\binom{n}{2i+1}~5^i
}

計算量は{O(n^2)}である。例えばpython3で実装すれば以下のようになる。

import scipy.misc as scm
import math

fib = lambda n : int(sum([scm.comb(n,2*i+1,1)*(5**i) for i in range(math.floor((n-1)/2)+1)])/2**(n-1))

print(fib(1000))

ssh設定の備忘録

よく設定する癖によく忘れるので備忘録を書きます

クライアント側設定

鍵の作成

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

鍵にかかっているパスワードの変更

$ ssh-keygen -p
Enter file in which the key is (/home/user/.ssh/id_rsa): [PATH/TO/YOUR/KEY]

サーバ側設定

基本設定

$ sudo vi /etc/ssh/sshd_config

で最終的には

PasswordAuthentication no # パスワードでのログイン
PermitRootLogin no # rootでのログイン
PermitEmptyPassword no # 空パスワードでのログイン

を最終的に設定させればいいと思われます。

公開鍵の登録

$ scp id_rsa.pub user@remote:~/

で公開鍵を登録した後、リモートにログインして

$ cat id_rsa.pub >> .ssh/authorized_keys

で登録すればok

$ ssh-add /PATH/TO/KEY

をするか再起動すればたいていうまくいきます。

【c++11】warning: deleting object of polymorphic class type ‘Derived’ which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]

自作クラスでdeleteでデストラクタを呼ぼうとしたら以下のような警告が出た。

warning: deleting object of polymorphic class type ‘Derived’ which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]
delete v;

ここに対処方法が書いてあった。

またここに警告の意味が書いてあった。
VerboseDiagnostics - GCC Wiki

どうやら基底クラスか派生クラスのどちらかのデストラクタを仮想化すれば解決するらしい。
すなわち

class Base {
 ~Base(); // Non-virtual destructor.
};

class Derived : public Base {
 virtual ~Derived(); // Virtual destructor.
};

とするか

class Base {
 virtual ~Base();
};

class Derived : public Base {
 ~Derived();
};

とすれば解決する。