homebrew disabled the alacritty cask

brew install alacritty 를 해도 안되고
 alacritty (disabled)

brew install --cask alacritty 를 해도 다음과 같이 mac gatekeeper 를 통과하지 못해 설치를 못한다고 한다.
Error: alacritty: Cask 'alacritty' has been disabled because it does not pass the macOS Gatekeeper check! It was disabled on 2026-09-01.

homebrew gatekeeper(맥에 내장된 기본 보안 기능으로 인터넷이나 외부 경로로 다운로드한 응용프로그램이 안전한지 검증하고 신뢰할 수 없으면 실행을 차단) 통과 필수 적용
- 5.0.0 릴리스 공지에서 gatekeeper 를 통과하는 패키지만 설치 가능
- cask 비활성화 사유를 unsigned에서 fails_gatekeeper_check로 바꾼 PR
- alacritty cask disable 처리
- alacritty 같이 .app을 빌드하는 formula는 받지 않는다는 규정

alacritty 대응
- 공증(gatekeepe 통과를 위한 서명) 논의https://github.com/alacritty/alacritty/issues/8749

공증을 받으려면 apple developer 계정이 필요하고 연 $99 비용이 든다.
메인테이너(chrisduerr)는 이를 "scam", "ransom" 이라고 거부하고 비용을 대신 내겠다는 댓글도 스팸으로 보겠다고 한다.
homebrew 가 소스를 받아 직접 빌드하고 서명해서 배포해야 한다고 주장하지만 homebrew는 .app을 빌드하는 formula를 받지 않고 있다.
homebrew 쪽에서 alacritty 전용 tap(외부 저장소, tap 있다면 brew install 가능하고, 맥에서 실행시 인증되지 않은 프로그램 허용하면 실행까지 된다.)을 만들라고 제안했지만 alacritty 는 만들지 않고 있다.

흠, 그냥 cargo 로 설치하자.
cargo install alacritty

mysql for update deadlock

mysql db 를 사용하는 api server(golang) 에서 2개의 insert 요청 발생중 deadlock 이 발생했다.
Error 1213 (40001): Deadlock found when trying to get lock

InnoDB 인덱스는 행 사이에는 gap 이라는 빈 구간이 있다.
a행 - (gap) - b행 - (gap) - c행

다음과 같은 A,B 양쪽에서 insert 하기전 존재 여부를 판단하기 위해 for update 로 gap lock 을 획득하려고 했다. 
A: SELECT d FOR UPDATE -> 없음 -> gap lock 획득 
B: SELECT e FOR UPDATE -> 없음 -> gap lock 획득 (gap lock 끼리는 공존)
A: INSERT or UPDATE d -> B 의 gap lock 에 막혀 대기
B: INSERT or UPDATE e -> A 의 gap lock 에 막혀 대기
서로를 기다리는 데드락 상태가 된다.
InnoDB 기본설정에 innodb_deadlock_detect=ON 있어 데드락을 감지하고 한쪽을 롤백시킨다.

User (부모 테이블) - UserResource (자식 테이블)  있다고 했을때

// 있으면 update 없으면 insert
func saveUserResource(tx *gorm.DB, userID uint64, val int64) error {
        // 수정 전 - 자식 테이블에 아직 없는 행을 잠그면 데드락 발생할 수 있다.
        // var userRC entity.UserResource
        // err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).Where("`user_id`=?", userID).Take(&userRC).Error

        // 수정 후
        // 항상 존재하는 부모 users 행을 PK 로 잠가 같은 사용자의 저장을 줄 세운다 (record lock).
        if err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).
                Model(&entity.User{}).
                Select("`id`").
                Where("`id`=?", userID).
                Take(&entity.User{}).Error; err != nil {
                return err // 부모가 없으면 ErrRecordNotFound
        }
        // 자식 행은 잠금 없이 조회한다. 부모 잠금 덕분에 같은 사용자의 다른 저장은 여기 들어오지 못하고 기다린다.
        var userRC entity.UserResource
        err := tx.Where("`user_id`=?", userID).Take(&userRC).Error
        if errors.Is(err, gorm.ErrRecordNotFound) {
                return tx.Create(&entity.UserResource{UserID: userID, Val: val}).Error
        } else if err != nil {
                return err
        }
        return tx.Model(&userRC).Update("val", val).Error
}

jcode profile error

언제부턴가 어떤 앱을 사용중에도 cmd+; 또는 cmd+' 를 누르면 사용하다 갑자기 다음과 같은 터미널 에러 창이 뜬다.

Last login: Wed Oct 21 16:16:42 on ttys002
[ysoftman] load /etc/profile
ysoftman - ~/.profile loaded
bash: line 0: exec: env: not found

Ghostty failed to launch the requested command:
/usr/bin/login -flp ysoftman
  Runtime: 59 ms

Press any key to close the window.

https://jcode.sh/ (rust 로 만든 수십개 에이전트를 병렬로 돌려도 느려지지 않는 coding agent tool) 를 설치하고 잊고 있었다.
jcode 를 설치하면 아마 자동으로 jcode 가 실행되도록 단축키 설정(~/.jcode/config.toml)을 한것으로 보인다.

# 단축 변경 적용하기
# jcode setup-hotkey
[launch_hotkeys]
enabled = true

[[launch_hotkeys.entries]]
chord = "cmd+;"
dir = "/Users/ysoftman/workspace/myenv"
label = "myenv"
self_dev = false

[[launch_hotkeys.entries]]
chord = "cmd+'"
dir = "$HOME"
label = "home"
self_dev = false

jcode 실행이 login -l 옵션으로 ~/.profile 을 읽었는데 PATH 변수가 이전 $PATH 보전을 하지 않고 다음과 같이 설정돼 /usr/bin/env 를 찾지 못하고 있었다.
~/.vector 를 보니 2023년에 생성된 예전 흔적으로 다음 줄을 삭제하니 에러없이 jcode 가 실행된다.
export PATH=/Library/Apple/usr/bin:/Users/ysoftman/.vector/bin

Prev