windowsからsshとmakeする環境構築

自宅のメインで使ってるPCはWindowsなのだが、ここからも研究室のサーバーとかにsshしたいし、makeもしたい、その他もろもろの作業もしたい。

Cygwinを使うとCygwinの中と外で環境が別物になってしまうのが少し嫌いだった。かといってLinux仮想マシンを構築するほどでもない。そこでMinGW+msys+minttyの環境を構築することに。

以下、メモ程度に。

  • 公式ページの"Get Started"に従ってMinGWとmsysをインストール。
  • 使いやすいシェルが欲しいので、minttyをインストール

Windowsで最高のターミナルを構築する方法 - 純粋関数空間
mintty を使えるようにする | dogmap.jp
これらを参考にした。

  • minttyの設定で表示をsjisにする。
  • lsで日本語ファイル名が表示出来なかったので

msysのls.exeで日本語ファイル名を… - methaneのブログ
あたりに従って直す。

これでmakeもできるしsshもできる。いろいろできる。快適。

Pythonで型変数っぽいこと

Pythonで、インスタンスを作る時のオブジェクトの型を実行時に決めるにはどうすればいいのか、と少し悩んだ

つまり
ふつうPythonであるオブジェクトのインスタンスを作るときは、

instance = MyClass(*param)

とするけれど、ここで、どのクラスのオブジェクトを作るかを実行時に変化するような状況。

apply関数を使うのかなーと思って試したけどどうもうまくいかない。

結局、単に

var = MyClass
instance = var(*param)

でいいらしい。呆気無すぎる…

実験

class Test:
    def __init__(self,message):
        self.message=message
    def echo(self):
        print self.message

a=Test
b = a("hoge")
b.echo()

結果

hoge

うむ。あっけない。基本がなっていなかったようです。

グラフィカルラッソやってみた

けっこう前の話になるけど、
ふと思い立ったのでグラフィカルラッソのアルゴリズムを実装してみた。

入力として、なにかの分散共分散行列Sを貰った時に、
 \min_\Lambda  \mathrm{tr}\left(\Lambda S \right) -\log \Lambda S + || \Lambda ||_1
をそこそこ効率的にもとめるアルゴリズムのこと。

数理情報工学特論第一 【機械学習データマイニング

http://www.geocities.co.jp/Technopolis/5893/course_machine_learning_2010.html

にあるスライドあたりを参考にしてます。

#coding: utf-8

from numpy import *
from numpy.linalg import *

def GraphicalLasso(S,l):
    (dim,m) = S.shape

    #対角成分をまずセットする
    L = diag(diag(S)) + 2*l

    sdiag = diag(S)
    for k in xrange(dim):
        if k==0:
            continue
        print k

        beta=zeros(k)
        sk = S[k,:k]
        sdiagk = sdiag[:k]

        #列ごとの最適化。
        epsilon=1e-8
        oldbeta=beta
        import itertools
        for time in itertools.count():
            beta = (sk - dot(S[:k,:k],beta) + beta*sdiagk) / sdiagk

            #shrinkage
            gamma = 2.0 * l / sdiagk
            big = where(abs(beta)>gamma)
            small = where(abs(beta)<=gamma)
            print big
            beta[big] -= (gamma*sign(beta))[big]
            beta[small] = 0

            #収束条件は適当に。
            if norm(beta-oldbeta) < epsilon:
                break
            oldbeta[:]=beta

        Lnew = -L[k,k]*beta
        L[k,:k] = Lnew
        L[:k,k] = Lnew

    return L

これでそこそこ動いているようだ。

Cython+Numpyメモ

いろいろと必要があってCythonとNumpyを使うことになりましたが、少し嵌ったのでメモ


数値計算にはPython+Numpyを利用していましたが、(禁忌とされる)データに対して直接forループを回さなければならないような状況に陥ったので、仕方なくCythonを導入。
CythonからNumpy.arrayにアクセスしたい時は、ナイーブな方法で行うとオーバーヘッドが大きい。
そのため、配列へのアクセスを高速に行うための仕組みがCythonにあります。

Working with Numpy
http://docs.cython.org/src/tutorial/numpy.html#efficient-indexing

このあたりの公式文書を参照のこと。Pythonのオブジェクトとして扱うのではなく、きちんと型と次元を指定してやって、もっとC寄りの配列を直接いじる感じ。
さて、この機能を利用するために冒頭で

import numpy as np
cimport numpy as np

としてnumpyのCのヘッダを読みこんでやらないといけません。
これをコンパイルするために、ドキュメントを参照しながら適当にsetup.pyを作り、

$ python setup.py build_ext --inplace

としてコンパイルを実行すると、ありとあらゆるコンパイルエラーが出たあとに、

error: command 'gcc' failed with exit status 1

とのたもうて落ちる。cythonでCのコードを生成するのは問題なくできるので、Cをコンパイルする段での問題なのは明らかだったのですが、なかなか問題が解決できず詰まるなどしていました。。


結論から言うと簡単なことで、gccにnumpyにまつわるヘッダファイルの所在を教えてあげなければいけない、ということだったようです。
numpy用のインクルードパスはnumpy.get_numpy_include()で取得できるので、setup.pyを上手く書き換えてやって

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

import numpy
setup(
    name="CPWOPTcritical",
    cmdclass={"build_ext":build_ext},
    ext_modules=[Extension("hoge",["hoge.pyx"],
                 include_dirs=[numpy.get_numpy_include()]#ここでインクルードパスを指定
)]
)

としてやれば、うまくコンパイルが通りました。


もっと早く気づいていれば…

うたげのあと

また一日遅れましたが

例大祭を無事終えることができました。
みなみなさま本当にお疲れ様です。
いろんな人にお会いできました。改めて謝意を。


まだ余韻が抜けません。


今日は久々に日常に帰ってきた心地です。
明日からはまた非日常に飛び込むので、大切な中休みとなります。

例大祭

一日遅れましたが、


博麗神社例大祭 当選しました。
「て55a」です


どういう心情の変化か、
およそ5年ぶりのサークル参加ということになりました。
そのときはいろいろとアレだったので、実質初参加ですね。


秘封倶楽部の字ばっかりの本を出そうかなと思っています。


いろいろと不安要素はありますが、
これからしばらく生みの苦しみです。