write ahead log

ロールフォワード用

Powershellでmdbファイルを開いてテーブルの一覧を得る

2020年にもなってMDBファイルを触ることになるとは思わなかった.

PowerShellは便利だ.

使うときにはこの辺のコンポーネントが必要だと思う.

Microsoft Access Database Engine 2016 Redistributable

#######################################################################
# 概要
#   mdbファイルを開いてテーブルの一覧を出力する
# 書式
#   table-list.ps1 [mdbファイルへの相対パス] [mdbファイルパスワード]
#######################################################################

Param($filename, $password)

# MDBファイルのファイルパスを組み立てる
$filepath = join-path $PSScriptRoot $filename

$connection_string = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = ${filepath};"

# パスワード指定の場合にはパスワードをConnectionStringへ加える
if($password -ne '') {
    $connection_string += "Jet OLEDB:Database Password = ${password};"
}

$catalog = New-Object -ComObject "ADOX.Catalog"
$conn = New-Object -ComObject "ADODB.Connection"

$conn.Open($connection_string)
$catalog.ActiveConnection = $conn

foreach($tbl in $catalog.Tables) {
    #Write-Output $tbl
    #テーブル名だけほしい時はこっち
    Write-Output $tbl.name
}

$conn.Close()

OpenSSHを使ってSFTPの設定をする

OpenSSHさえ入っていれば設定だけでSFTPサーバも兼ねる事ができる.

お手軽で良いのだけど, 設定をたまにしかしないので忘れるのでメモ.

よくある設定

CentOS7では

/etc/ssh/sshd_config

に以下の様な内容を追記してやる.

#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp

Match User 【ユーザ名】
ChrootDirectory 【初期ディレクトリの1つ上】
ForceCommand internal-sftp -d 【初期ディレクトリ】
# パスワード認証の場合以下
#PasswordAuthentication yes

chrootを使ったjailができるのだけど, 注意が必要なのは

  • ChrootDirectoryは所有権がroot:rootでなければならない
  • ChrootDirectoryはroot以外が書き込み権限を持ってはならない

というところだと思う.

後はForceCommandのdオプションで初期ディレクトリへ移動するようにできたけど, WindowsのFTPソフトなんかだとうまく動作しなかったりした.

この辺は仕組みをちゃんと理解してないのであかんなぁという感じ.

Laravelでフォームのチェックボックスを作るときにoldを使いたい時

なんかいつも忘れるというかハマるんだよね.

is_doneはDB上はbooleanとして.

<input type="hidden" name="is_done" value="0">
<input type="checkbox" name="is_done" value="1" id="is_done"
@if (old('is_done', $production_plan->is_done ? '1' : '0') === "1")
checked
@endif
>
<label for="is_done">完了 </label>

テーブルみたいな明細構造でも同じ考え方で大丈夫.(当たり前だけど)

ここでは$loop->index使った例.

<input type="hidden" name="is_done[{{ $loop->index }}]" value="0">
<input type="checkbox" name="is_done[{{ $loop->index}}]" value="1"
    @if (old('is_done.' . $loop->index, $plan->is_done ? '1' : '0') === '1')
        checked
    @endif
>

追記.

いちいちhidden入れるのも面倒だし, でもデフォルトでtrueにしたいチェックボックスの場合どうしようかなぁと思ってたんだけど, $errorsを使うというやり方があった.

<input type="checkbox" name="is_done" {{ old('is_done.' $loop->index) || !$errors->any() ? 'checked' : '' }}>

Laravelのリクエストバリデーションで除外IDを指定する

unique使うと更新時に問題になるんだけど, ignoreというメソッドがいつの間にか追加されている.

これを使えば「更新対象レコードのidを除外してuniqueチェック」ができるけど, 更新対象レコードのidをフォームリクエスト内でどうやって取得するのかわからなかった.

結論的にはルートパラメータの値を指定すれば良いらしい.

こんなルートがある場合には

Route::post('/products/{product}', 'ProductsController@store')->name('products.store');

こんな風に指定できる

Rule::unique('products')
    ->ignore($this->product)
    ->where('first_name', $this->first_name)
    ->where('last_name', $this->last_name),

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('制約名');

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