write ahead log

ロールフォワード用

Laravel(Eloquent)で実行するSQLを確認したい

O/Rマッパーは便利なんだけどパフォーマンスとか考えると生のSQLみたい事がよくある.

というか生SQLの方がわかりやすいことも正直多い....

ということで生のSQLを出す方法を調べた.

1. toSqlを使う

ちょっと見るにはシンプルでよい.

$query = $User::where('id', false)->toSql();
dd($query);

2. enableQueryLogを使う

\DB::enableQueryLog() 以降のクエリを \DB::getQueryLog() でまとめて取得できる.

eager loadingとか考えるときには便利でよい.

\DB::enableQueryLog();

//  何かSQL実行
$user_list = $User::where('id', false)->get();

//  SQLログを取得してdump
dd(\DB::getQueryLog());

javascriptで小数の切り捨て・切り上げ・四捨五入を桁数指定で行いたい

ちょこっと使いたい時があるので.

大きな桁数などで精度の問題があるのは承知の上.

雑に書いた割にテストしてないからバグってるかも.

   /**
    * 有効桁数を指定して小数点切り捨て処理を行う
    *   val:    切り捨てる値
    *   digits: 丸めて残す桁数
    */
   function digitsFloor(val, digits) {
       const pow = Math.pow(10, digits);
       const powed = val * pow;
       const floored = Math.floor(powed);

       return floored / pow;
   }

   /**
    * 有効桁数を指定して小数点切り上げ処理を行う
    *   val:    切り上げる値
    *   digits: 丸めて残す桁数
    */
   function digitsCeil(val, digits) {
       const pow = Math.pow(10, digits);
       const powed = val * pow;
       const ceiled = Math.ceil(powed);

       return ceiled / pow;
   }

   /**
    * 有効桁数を指定して小数点四捨五入処理を行う
    *   val:    四捨五入する値
    *   digits: 丸めて残す桁数
    */
   function digitsRound(val, digits) {
       const pow = Math.pow(10, digits);
       const powed = val * pow;
       const rounded = Math.round(powed);

       return rounded / pow;
   }

Laravelのmigrationで複数列にユニークキーを指定する方法

毎回ググってる.

ユニーク制約を追加する時.

$table->unique(['列1', '列2'], '制約名');

ユニーク制約を削除する時.

$table->dropUnique('制約名');

制約追加時の制約名は任意指定のようだけど, 後で削除することを考えると指定しておいたほうがわかりやすいかも.

Laravelのmigrationで外部キーを消すときの指定方法

なんかパッとわからなかったのでメモ.

Laravel6では動いた.

多分5とかでも動く.

$table->dropForeign('[外部キーを取り除くテーブル名]_[外部キーを取り除く列名]_foreign');

Laravel6でページネーションのテストする時に困った事

メモ書き.

ハマった点は

  • assertViewHasにはpaginate()の結果を渡してやる必要がある(これはまぁそうだよね)
  • assertViewHasに渡すデータはwithでeagar loadingしたデータを渡す必要がある

それっぽいコードを書くと、以下ではダメで

// 検索結果が昇順でソートされて表示されるはず
$found_products = Product::where('name', 'search_condition')->orderBy('name')->orderBy('kana')->paginate(20);
$response->assertViewHas('products', $found_products);

以下なら思った通り動いた. (Relationshipのあるテーブルをwithでロードしてやる必要がある)

// 検索結果が昇順でソートされて表示されるはず
$found_products = Product::where('name', 'search_condition')->orderBy('name')->orderBy('kana')->with('customer', 'pic')->paginate(20);
$response->assertViewHas('products', $found_products);

どのタイミングで動的プロパティが追加されるのかよくわからないな.

メッセージ見れば想像つくけど、一応メモっとく.

clang-formatを使う

golangに慣れるとコードフォーマッタが欲しくなりますね.

C, C++でスタイルを適当に合わせたい時にはclang-formatというものがあります.

インストール

$ sudo apt install clang-format

設定ファイルを作る

.clang-formatというファイルを作っておくとそれに合わせてフォーマットしてくれます.

ベースになるスタイルは色々ありますが自動生成できます.

$ clang-format -dump-config -style=Google > .clang-format

フォーマットする

$ clang-format -i *.c

vimプラグイン

便利なプラグインがあります.

goとvueでtodoアプリを作った

コードはここ.

github.com

デモはここで動かした.Heroku最高.

https://github.com/twinbird/vue-go-todo

「低レベルプログラミング」を斜め読みして疲れたので, 「バー」っと書いて「ドーン」と動くものを触りたくなったから作った.

仕事でもいつかは使うだろうとVue.jsを触ってみた. (当分jQueryだろうが)

あと, goで認証作ったこともない気がしたのでサーバはgoにした.

goの方では

  • Gorilla/csrf
  • Gorilla/Session(のバックエンドとしてRedisを使うboj/redistore)
  • lib/pq(Postgres)

とか使った.小さいしnet/httpでいいだろ的な.

デプロイはHerokuに.

簡単だし, 無料でPostgresもRedisも使えるのでホント便利というかHeroku様様.

ただ, Redis使う時にハマった.

この記事に助けられた

参考資料

この辺を読めばとりあえず動くコードは書けた.

vuexとか試したい気もするけど, その時にはもっと大きいものを書かないとなぁ, めんどい.

goでサーバ書く時には定番っぽいけど以下が役立った.

あとはvue.jsのテンプレート構文と衝突する問題が地味にハマる.

バリデーションチェック実装の時に参考にさせてもらった.

その他

コードをもうちょっと綺麗にしたかった気もするけど, 飽きてきたのでここら辺にしておく.

なんか書こうと思ってた気がするけど, 子供泣いたからここまで.