goのxormを使ってみた
goでDBを操作する処理を作る必要があったので、orマッパーにxormを使ってみた
go自体始めて書くし、xormの日本語のドキュメントないしでくっそ辛かったのでメモ
orマッパーの比較
orマッパーに求めるものも同じ感じだったので、以下のブログを参考にした www.pospome.work
エウレカがgo使っててイケてる企業ってイメージだったので、エウレカで使ってるxormにした
使うためにやること
orマッパーでマッピングするまでに詰まったのは以下の2つ
- DBに接続する
- 構造体を作る
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)
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がそれぞれ入る。 実装するには、他の論文の関数をそのまま使ってるとこがあるので、それを読まないといけない。 解くときは、ラベルか深度のどちらかを固定して、最適化を繰り返す。