読者です 読者をやめる 読者になる 読者になる

Tamflexの貯蔵庫

やる気のない備忘録

複数プロジェクトが併存できるC++用の汎用的なMakefile

language language-c++

汎用的に使えるMakefileを作ってみた
github.com

詳細はこちらから
qiita.com

anaconda3でgraph_toolを使う

IT IT-linux(ubuntu) language language-python language-python3

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

フィボナッチ数の一般項

language language-python language-python3

フィボナッチ数の一般項は以下の式で表される。
{\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

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

codeIQ 2751

contest contest-codeIQ


図形に関して, 3*7の長方形を3個つなげた対称性の高い空間だと言える.
これらの長方形をそれぞれworld 0,1,2として範囲外に出たら「奈落」/「ワープ」させる条件分岐を書けばわかりやすいかもしれない.
文字の変換についてだが, こちらもASCIIコードを駆使してあげれば綺麗に書ける.
あとは数値を'F'*数値に置き換えてfor文を回せばあとはやるだけ.

char conv(int w, int i)
{
  switch (w) {
    case 0:
      if(i<10) return '0'+i;
      else return 'a'+i-10;
    case 1:
      if(i<15) return 'l'+i;
      else return 'A'+i-15;
    case 2:
      if(i<20) return 'G'+i;
      else return '@';
    default :
      return ' ';
  }
}

int main()
{
  string s, t=""; cin >> s;
  string str = "";
  int dx[] = {1,0,-1,0,0};
  int dy[] = {0,1,0,-1,0};
  int x=0, y=0, d=0, w=0;
  REP(i,s.size())
  {
    switch(s[i])
    {
      case 'R':
        t += s[i];
        break;
      case 'L':
        t += s[i];
        break;
      default :
        REP(j,s[i]-'0') t += 'F';
        break;
    }
  }
  t += "F";
  REP(i,t.size())
  {
    if(x<0||x>6||y<0||y>2)
    {
      if(y==3&&x>=0&&x<=2)
      {
        y = x;
        x = 6;
        w = (w+2)%3;
        d = 2;
      }
      else if(x==7&&y>=0&&y<=2)
      {
        x = y;
        y = 2;
        w = (w+1)%3;
        d = 3;
      }
      else
      {
        str += "!";
        break;
      }
    }
    switch (t[i])
    {
      case 'R':
        d = (d+1)%4;
        break;
      case 'L':
        d = (d+3)%4;
        break;
      case 'F':
        str += conv(w,x*3+y);
        x += dx[d];
        y += dy[d];
        break;
      default :
        break;
    }
  }
  cout << str << endl;
}