とてもつらい

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

goのxormを使ってみた

goでDBを操作する処理を作る必要があったので、orマッパーにxormを使ってみた

go自体始めて書くし、xormの日本語のドキュメントないしでくっそ辛かったのでメモ

orマッパーの比較

orマッパーに求めるものも同じ感じだったので、以下のブログを参考にした www.pospome.work

エウレカがgo使っててイケてる企業ってイメージだったので、エウレカで使ってるxormにした

使うためにやること

orマッパーでマッピングするまでに詰まったのは以下の2つ

  1. DBに接続する
  2. 構造体を作る
DBに接続する

とりあえずgithub行って、README読むとこんな感じでDBの接続周りをやってくれるらしい

engine, err := xorm.NewEngine(driverName, dataSourceName)

ここで詰まったのは、dataSourceNameのフォーマットどうなってんねんってことだった

hostとportと指定してとか細かいところまでやってくれてるサンプルを調べた結果こんなコードで動いた

engine, err := xorm.NewEngine("mysql", "user:password@tcp(localhost:3306)/test")

中に関して説明すると以下になる

{ユーザー名}:{パスワード}@{プロトコル(tcp or udp)}({ホスト名(ipでも行けるかも)}:{ポート})/{DB、スキーマ名}

設定しない項目に関してはdefault値でなにかが入るらしいがよくわからんかった

とりあえずこれで細かな設定までできるようになった

構造体を作る

次にマッピング先の構造体を作る 実際に作ったソースはこんな感じ

type User struct{
  Id int `xorm:"int 'id"`
  Name string `xorm:"varchar(256) 'name'"`

この説明が見つけられなくて、全然マッピングしてくれなかった

以下の2.4.Column definitionに書いてあった

Documentation - xorm: Simple & Powerful ORM Framework for Go Programming Language

最低限使うためには以下のように書けばマッピングしてくれる

type {テーブル名} struct
  {フィールド名(先頭は必ず大文字)} 型 `xorm:"{DB上での型} '{対応するカラム名}"`

あとはREADME通りにやればマッピングしたデータが取得できる

備考

ここに書いてあることはxormのマッパーがデフォルトの場合である

別のSameMapperとかを使ったらおそらく別の問題が生じると思うので、その時は頑張ってほしい

spring bootでエラーページを作ってハマった

spting bootでwebアプリを作ったときに、ハマったのでメモ。

症状

自分が作ったwebアプリでは、例外をキャッチしたら/errorにリダイレクトして、エラーページを表示する様にしていた。

実際にエラーが起こると次のようなメッセージが表示された。

There was an expected error (type=None, status=999)
No message available

解決方法

何に使われているかなど詳しいことは調べないとわからないが、/errorはspringですでに使われているらしく、別のurlにすれば可能になる これも詳しい調査が必要だが、デフォルトのエラーページをカスタマイズ出来るらしく、リダレクトせずにカスタマイズしても解決出来るかもしれない

最初999なんてステータスあんのかとか、No messageでノーヒントやんとか思って詰んだと思った。 Stack overflowにも何も引っかからなかったし。

フレームワーク使うときはちゃんと調べてdefalutでどうなってるか調べないとダメだね

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がそれぞれ入る。 実装するには、他の論文の関数をそのまま使ってるとこがあるので、それを読まないといけない。 解くときは、ラベルか深度のどちらかを固定して、最適化を繰り返す。