2024-05-21

ActiveSupportpresence_in

https://api.rubyonrails.org/classes/Object.html#method-i-presence_in

params[:bucket_type].presence_in %w( project calendar )

レシーバが引数の中に含まれていればそれを返す。含まれていなければ nil を返す。引数は include? に応答できるものであれば良い

||= 自己代入演算子

Ruby の ||= 演算子とは? - スタック・オーバーフロー

a || (a = b) の短絡評価。これに代入する値を真偽値にしてしまうとバグの元になるかも

# hoge は未定義
hoge ||= false
# 最初の評価。hoge には false が入る
hoge == false
# 2回目の評価。hoge が評価され false なのでまた false が入る
# 3回目の評価。hoge が評価され false なのでまた false が入る
# 永遠に false が入り続けるのでは

こちらの例がいいかも

https://techracho.bpsinc.jp/hachi8833/2020_06_25/74938

# bad - enabledがfalseだった場合にもtrueに設定されてしまう
enabled ||= true

# good
enabled = true if enabled.nil?

「あと気をつけないといけないのは、nilが入ってくる可能性のあるオブジェクトには||=のメモ化が効かないということ: nilが入っていると結局毎回読み込みが実行されちゃうので最適化されない」

後から見て変だと思ったら || の部分がテーブルとして扱われてしまうのか?
とりあえず文章のほうを `` で囲っておいた

git-filter-repo

Motivation

ProTypeScript_MySampleCode という、TypeScript 学習用のリポジトリを使用していたのだが、til (Today I Learned) というリポジトリの配下に移したいな、とふと思った
しかしこれまでのコミット履歴は無くしたくない。というわけで git-filter-repo というものを使った

clone する
cf. https://qiita.com/shimamura_io/items/5f0dd5346dd22edc06ad

Specifying –no-local will override the default when /path/to/repo is given, using the regular Git transport instead.

うーん --no-local はよく分からんかった

❯ git clone ProTypeScript_MySampleCode til --no-local
❯ cd til

# docker を使う
# cf. https://andrewlock.net/rewriting-git-history-simply-with-git-filter-repo/

❯ docker run --rm -it -v ${PWD}:/app -w /app python:3 /bin/bash
root@9501828989f4:/app# apt-get update
Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:4 http://deb.debian.org/debian bookworm/main arm64 Packages [8685 kB]
Get:5 http://deb.debian.org/debian bookworm-updates/main arm64 Packages [13.7 kB]
Get:6 http://deb.debian.org/debian-security bookworm-security/main arm64 Packages [153 kB]
Fetched 9106 kB in 4s (2104 kB/s)
Reading package lists... Done
# install
root@9501828989f4:/app# apt install git-filter-repo
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  git-filter-repo
  0 upgraded, 1 newly installed, 0 to remove and 11 not upgraded.
  Need to get 103 kB of archives.
  After this operation, 350 kB of additional disk space will be used.
  Get:1 http://deb.debian.org/debian bookworm/main arm64 git-filter-repo all 2.38.0-1 [103 kB]
  Fetched 103 kB in 0s (1001 kB/s)
  debconf: delaying package configuration, since apt-utils is not installed
  Selecting previously unselected package git-filter-repo.
  (Reading database ... 23986 files and directories currently installed.)
  Preparing to unpack .../git-filter-repo_2.38.0-1_all.deb ...
  Unpacking git-filter-repo (2.38.0-1) ...
  Setting up git-filter-repo (2.38.0-1) ...

root@9501828989f4:/app#
# 内容物が .git を除いて ProTypeScript_MySampleCode というサブディレクトリに移動する
root@9501828989f4:/app# git filter-repo --replace-refs delete-no-add --to-subdirectory-filter ProTypeScript_MySampleCode
Parsed 107 commits
New history written in 0.09 seconds; now repacking/cleaning...
Repacking your repo and cleaning out old unneeded objects
HEAD is now at f3a8f44 コラム29 ! を用いて null と undefined を無視する
Enumerating objects: 758, done.
Counting objects: 100% (758/758), done.
Delta compression using up to 8 threads
Compressing objects: 100% (380/380), done.
Writing objects: 100% (758/758), done.
Total 758 (delta 331), reused 758 (delta 331), pack-reused 0
Completely finished after 0.21 seconds.

root@9501828989f4:/app# ls
ProTypeScript_MySampleCode

root@9501828989f4:/app# git log --stat
# コンテナ内で見るとパスがおかしくなっている部分があった
# `...` がパスの先頭についてしまっているのが多かった
# しかしホスト側で見ると問題なかった
# on Host
git log --stat
commit f3a8f44e7399c3f2a77ae7c75953d1c1d540ad97 (HEAD -> main)
Author: noriyotcp <noriyo.akita@gmail.com>
Date:   Sat May 4 18:09:51 2024 +0900

    コラム29 ! を用いて null と undefined を無視する

 ProTypeScript_MySampleCode/src/6.5 as による型アサーション/column-29.ts | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

commit c29a0d47242b76b10c759e7fd2678b8c67704839
Author: noriyotcp <noriyo.akita@gmail.com>
Date:   Sat May 4 18:02:01 2024 +0900

    src/6.5 as による型アサーション/6.5.1

 ProTypeScript_MySampleCode/src/6.5 as による型アサーション/6.5.1.ts | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

https://dev.to/hamajyotan/routing-definition-using-only-the-actions-generated-by-resources-l9g

カスタムアクションを作らない。サブリソースを名詞で表現しそれに見合うコントローラーを作る