とてもつらい

プログラミングと本のメモ

Spring Securityでハマった話

いろいろあってSpringで開発をすることになった。 自分の担当箇所はlogin周りだったので、いろいろ調べた結果Spring Securityを使えば良さそうだとわかった。 そこまではよかったが、loginの結果によってビューを表示させるときにはまった。

ハマった問題は、リンク(CSSやJSの読み込むも含む)を持つページを表示する際に、思ったURLとは違うページに飛ばされるという問題だった。 このやり方がいいのかは、Springを使い始めたばかりなのでわからないが、@ConfigurationをつけたJavaConfigで以下様に設定をした。

protected void configure(HttpSecurity http) throws Exception {
    http.
        authorizeRequests().
        anyRequest().
        authenticated();
    http.
        formLogin().
        loginPage("/login");
    http.
        logout().
        logoutUrl("/logout").
        logoutSuccessUrl("/login");
}

この設定だと、ログインが成功すると/にリダイレクトを行う。 しかし、この時リダイレクト先のビューがリンクを持つページだった場合、リンクに飛ばされてしまっていた。

実際の細かな処理はわからないが、この問題はリンクを書く時は、テンプレートエンジンの埋め込みを使うことで解決した。

lpicの勉強した

色々あってlpicの勉強を始めた。 研究でlinuxを使っていたので、序盤があまりにも学びが少なく時間が無駄になってる気がする。 せめてやってる感でも出したいのでメモ。

tailの便利な使い方

ファイルの最後の数行だけを表示するコマンドのtail。

tail -f log.txt

とかやるとlog.txtが更新されるたびに、表示が更新されるらしくログの監視等に便利とのこと。 自分の環境では確認出来なかったが、出来るらしい。

killの意味

プロセスを殺すkill。 殺すしか出来ないと思っていたけど、プロセスにシグナルを送るコマンドだった。 ファイルの再読み込みとかのシグナルを送ると色々便利らしい。

ゴミ捨て場/dev/null

自分のホームディレクトリ以下でfindしたときに権限がありませんとか警告が出てきてうざいのを解消する時に使える。

find / -name hoge 2> /dev/null

とかで、いらん警告の出力を表示させなく出来る。

Linuxの基礎の基礎みたいなところ勉強した感じだと、これくらいしか新しい発見がなかった。 あとは、いつもググってたところで「あーあれね。そういえばこんな感じだったわ」みたいなのが多かった。 多分ローカルで使う分には困らない程度にLinuxは知ってたんだと思う。 pingとかdigとかのネットワーク系とか全然知らないので、そこら辺に入ったらいっぱい学びがあると信じてる。

brewで入れたmysqlがERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

brewmysql入れてつまずいて辛かった。

mysqlを叩くと

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

って怒られた。

ちゃんとbrewのlogみたらまずコマンド叩けよって書いてあったからちゃんとbrew読もうな。

バックグラウンドで動いててもいいなら

brew services start mysql

バックグラウンドで動かす必要ないならなんか書いてあったけど忘れたので確認してください。

これで治らなかったら自分の時ときは違う問題なので、各自頑張ってください。

Symfony3.2でのCSS,JSの扱い方について読んだ

作りたいものが出来たので、なんとなくSymfony3.2を選んだ。 今まで、railsで書いてきたのでとりあえず公式読んで、適当にメモって行く。 今回はtwig周り。Symfony特有のとこだけ書く。 最初から入っているテンプレートと同様、テンプレートの中に、javascript block、css blockがあることを想定している。

ディレクト

基本的にBundleの中にそれ用のディレクトリ(Resourceとか)を作ってそれ以下か、web以下に入れておく。

JavaScript,Cssの読み込み

AppBundle/Resource/js以下にあるjsを読み込むには以下のコードでできる。

{% block javascripts %}
    {% javascripts '@AppBundle/Resources/js/*' %}
        <script src="{{ asset_url }}"></script>
    {% endjavascripts %}
{% endblock %}

複数のディレクトリから読み込む場合は、

{% block javascripts %}
    {% javascripts '@AppBundle1/Resources/js/*' 
                   '@AppBundle2/Resources/js/*'%}
        <script src="{{ asset_url }}"></script>
    {% endjavascripts %}
{% endblock %}

でできる。

web以下で管理している場合は、

{% block javascripts %}
    {% javascripts '@AppBundle/Resources/js/*' %}
        <script src="{{ asset("web以下のパス") }}"></script>
    {% endjavascripts %}
{% endblock %}

で読み込める。
CSSの場合も同様に読み込める。

{% block stylesheets %}
    {% stylesheets 'AppBundle/Resources/css/*' filter='cssrewrite' %}
        <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}
{% endblock %}

filter='csswrite'は、書いてあるとcssのパスが変わった時によしなになおしてくれるらしい。
プロジェクト全体でよく使うようなもの(jqueryとかbootstrapとか)を別のとこに保存しておいて読み込みたい場合は、config.ymlに

# app/config/config.yml
assetic:
    assets:
        jquery_and_ui:
            inputs:
                - '@AppBundle/Resources/thirdparty/jquery.js'
                - '@AppBundle/Resources/thirdparty/jquery.ui.js'

と書き、

{% block javascripts %}
    {% javascripts '@jquery_and_ui' %}
        <script src="{{ asset_url }}"></script>
    {% endjavascripts %}
{% endblock %}

で読み込むと便利。
filterについても書いてあったけどよくわからなかったから困ったら読む。

Towards Unifieid Depth and Sematic Prediction from a Signle Image

読んだメモ。

概要

大域的な深度推定と領域分割を行うCNNと、局所的な深度推定するCNNの出力結果と局所的な領域分割を、Hierarchical CRFによって情報を合わせて、 領域分割と深度推定を行う。

実際には、同じ年の同じ学会に出たEigenの論文が圧勝してるので、そんなに読む必要もないと思う。

Global CNN

大域的な深度推定と領域分割を行うCNN。

RGB画像を入力として、領域された画像と深度画像が出力となる。

誤差関数は、論文参照。ネットワーク構造は、EigenのNIPS2014のやつ。

Local CNN

局所的な深度推定をするCNN。

直接深度を求めるのではなく、ラベルごとに正則化された深度画像のテンプレートがあり、最もそれらしいテンプレートを選択するCNNを作る。

誤差関数は、論文参照。

局所的な領域分割は、Global CNNの結果の多数決できめる。 局所的な深度は、テンプレートの中心の深度と、テンプレートのスケールを求めることで決まる。これは、HCRGで決まる。 テンプレートは、データセットから切り取ったものとする。

HCRF

論文の式1を最小化すると局所的な情報と大域的な情報をいい感じに合わせてくれる。 式1に含まれるデータ項には、Global CNNの出力と、式9がそれぞれ入る。 実装するには、他の論文の関数をそのまま使ってるとこがあるので、それを読まないといけない。 解くときは、ラベルか深度のどちらかを固定して、最適化を繰り返す。

3D ShapeNets: Adeep Representation for Volumetric Shapes

研究で読んだので適当にまとめ。

目的

あるオブジェクトの深度画像を入力として、オブジェクトの分類と、オブジェクトの形の推定をConvolutional Deep Belief Network(CDBN)を使って行う。

CDBN

有向グラフを持ったグラフグラフ確率モデルを何層か重ねたもので、RBMを何層か重ねたものを初期値として学習し、その後教師データを使って逆伝播で学習するモデル。

概要

見えてる範囲で、ボクセル表現のオブジェクトを作り、不明な部分をネットワークによって獲得する。わからなかった場合も考えて、次にこの視点があったらいいってのを得ることもできる。

感想

ボクセル表現で3Dの扱うってことが面白そうだったので、アイディアとして使って行きたい。メモリが足りれば。

pythonのPoolを使って並列化するときにメモリを食いつぶした問題

python2系で大きいデータを並列処理しようとした時に、メモリを食いつぶしてしまったので、メモ。 以下のような処理をしたら、Poolで並列化したプロセスが処理が終わったあとも死なずに残りプロセスが増えすぎてメモリを食いつぶしてしまった。

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)              
    print pool.map(f, range(100000))  

いろいろ調べた結果以下の記事が参考になった。

http://qiita.com/tnarihi/items/a0dfb43fa989c3c8fc55

原因は、Poolは、処理が全部終わるまで、プロセスが死なず、新しいプロセスを生み続けるようになっていることっぽかった。 これは、Processで書き直すで解決した。 Processを使う場合は、Process一個につき、一つのデータしか処理できないので、ちょっと工夫が必要。 大きいデータの時は、Processで書いて、小さいデータの時は、実装コストを減らすために、Poolでとか使い分けるのがいいのかな。