레이블이 Mac인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Mac인 게시물을 표시합니다. 모든 게시물 표시

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

terminated screencapture

맥스크린 캡쳐시 저장이 안되는 경우가 발생했다. 될 때는 되고 안될때는 안되던가 수초간의 딜레이가 발생 후 저장됐다
스크린 캡쳐 관련 프로세스는 다음 2개가 있다.
screencapture: cmd+shift+3/4 로 실제로 캡처를 수행하는 프로세스
screencaptureui: cmd+shift+5 로 화면 캡처 메뉴 UI 를 보여주는 프로세스

위 2개 프로세스를 모니터링(btop 등에서 screen 이름으로 필터링) 하고
cmd+shift+4 누르면 screencapture 가 실행되고 종료되지만 캡쳐가 되지 않거나 느리게 캡쳐된다.

다음과 같은 명령으로 영역 캡쳐 테스트시 캡쳐가 안되는 경우 강제 종료가 되고 있다는것을 알았다.
screencapture -R 0,0,100,100 -t jpg z.jpg
zsh: terminated  screencapture -R 0,0,100,100 -t jpg z.jpg

cmd+shift+5 누르면 screencaptureui 가 생겼다 사라진다.(메뉴가 잠깐 보였다 사라진다)
screenshot.app 앱도 실행하면 켭쳐메뉴가 바로 종료된다.
claude-code 으로 원인 파악을 해봤다.

screencaptureui(PID: 37344) 로그를 모니터링하면
/usr/bin/log show --last 2m | grep "37344" | grep -i "exit"

launchd가 프로세스 종료 시 자동으로 기록하는 로그에 원인이 포함되어 있었다.
launchd: [gui/501/com.apple.screencaptureui.agent [37344]:] exited due to SIGTERM | sent by TouchEN_TEWeb_Agent[854], ran for 285ms

원인은 TouchEN_TEWeb_Agent(금융/보안 프로그램)이였다.
TEWebUNInstall.pkg 를 실행해서 삭제하니 잘된다.

claude-code os error 35

mac 에서 opencode, cladue-code 를 동시에 사용하고 있었는데 갑자기 터미널이 먹통이 됐다.
새로운 창도 열리지 않고, 이미 있는 다른 터미널에서 ls, ps 등의 명령을 실행하면 다음 메시지가 나오면서 실행되지 않는다.
zsh: fork failed: resource temporarily unavailable

터미널 종료 후 다시 실행하니 다음과 같은 에러가 발생하면서 실행되지 않았다.
Resource temporarily unavailable (os error 35)
⚠️  Process "/opt/homebrew/bin/zsh" in domain "local" didn't exit cleanly
Exited with code 1.
This message is shown because exit_behavior="CloseOnCleanExit"

kitty, alacritty, wezterm, iterm 터미널 에뮬레이터 모두 실행되지 않았다.
심지어 이미 실행중인 chrome 도 인터넷이 동작하지 않고, 프로세스를 상태 파악을 위한 activity monitor.app 도 실행되지 않았다.

원인 파악을 위해 opencode, claude-code 각각 먹통되기 전 질의를 다시 해보니 claude-code 에서 갑자기 pgrep 프로세스를 많이 실행하게 되면서 재현이 됐다.

이 현상은 시간이 좀 지나면 정상으로 돌아오기도 하지만 어떤 경우에는 1시간을 기다려도 정상으로 돌아오지 않아 재부팅을 해야 했다.
zellij multiplexer 때문인가 싶어 사용하지 않았는데도 발생했다.

pgrep 을 재귀적으로 계속 spawn 하는것 같고 비슷한 이슈가 버그 이슈로 등록되어 나도 커멘트를 추가했다.

위 이슈에서 해결방법을 알려줬다.
brew uninstall proctools 로 삭제하니 /opt/homebrew/bin/pgrep 도 같이 삭제된다.
which -a pgrep
/usr/bin/pgrep
이 상태에선 pgrep 무한 생성 현상이 사라졌다.

mac install in progress

맥 shutdown시 "install in progress" 프로세스로 종료가 되지 않는다.
activity moniter.app > install in progress > open files and ports 를 보면 다음과 같이 파일을 붙잡고 있다.

프로세스를 종료해도 다시 생긴다.
찾아보니 macOS 업데이트 종료되지 않아서라고 하고 다음과 같이 확인하면 macOS 업데이트가 있다.
sudo softwareupdate --list

Software Update Tool

Finding available software
Software Update found the following new or updated software:
* Label: macOS Tahoe 26.2-25C56
        Title: macOS Tahoe 26.2, Version: 26.2, Size: 8111826KiB,

macOS 를 업데이트 후 발생하지 않는다.

mac terminal network connection problem

macOS Sequoia 15.3.2 을 사용 중인데 요즘 터미널에서만 네트워크가 작동하지 않는 경우가 있다.
브라우저로는 잘 되는데 맥 기본 terminal, iterm2, kitty, alacritty 등 터미널 에뮬레이터 앱 관계없이 curl, git, brew 등 네트워크 프로그램들이 동작하지 않는다.
curl www.daum.net 을 하면 다음과 같이 도메인을 못찾는다.
curl: (6) Could not resolve host: www.daum.net

아래 처럼 git pull 도 안된다.

ping 도 도메인을 사용하면 안되고, ip 는 동작하는걸 보면 도메인 리졸브가 안되는것 같다.
ping google.com -> 동작 안함
ping 8.8.8.8 -> 동작함

dns 캐시를 지우고 재시작해도 해결이 되지 않았다.
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

다음 네트워크 설정을 수정해보면 된다.
settings > network > vpn & filters > filters & proxies > Falcon(악성코드 탐지) 비활성화 후 활성화

터미널에서 프로그램(커맨드) 처음 실행시 수초간 늦게 실행되는 현상이 있었는데 이것도 falcon 을 재시작(비활성화 후 활성화)하니 빨라졌다.

참고로 CrowdStrike 사의 Falcon은 엔드포인트 보안 플랫폼으로, linux,windows,mac등의 엔드포인트(데스크탑)에서 에이전트가 설치되고 단순 이상한 파일만 감시하는게 아니라 네트워크,프로세스에서 발생하는 동작들을 감시하고 중앙 서버에 보내서 분석하게 된다. crowd(군중)이름을 쓴 이유가 전세계에 crowdstrike 직원?분석가?들이 24시간 분석하고 감시하고 대응한다라고 한다.

암튼 단순 ls,clear 이런것 명령 프로세스도 감시하고 수집하는 것과 과련돼 느려지는 느낌이다.

Undefined symbols for architecture arm64

# mac m1(arm64) 환경에서 my 라는 프로젝트에서 빌드를 할때
# my/include 와 my/lib 에 디렉토리에 소스로 빌드한 protobuf 등의 라이브리 결과물이 있고 
# 이를 링크하는 my 프로젝트에서 cmake > make 빌드 중 다음과 같은 에러가 발생했다.
Undefined symbols for architecture arm64:
"grpc_call_run_in_event_engine(grpc_call const*, absl::lts_20250127::AnyInvocable<void ()>)", referenced from:
... 생략 ...  "google::protobuf::internal::AssignDescriptors(google::protobuf::internal::DescriptorTable const* (*)(), absl::lts_20250127::once_flag*, google::protobuf::Metadata const&)", referenced from:
... 생략 ...

# 동적라이브러리(.dylib) 파일들 경로는 이상 없이 lib/을 링킹하고 있었다
# 해당 dylib 파일의 타입도 다음과 같이 arm64 로 빌드되어 있었다.
file /Users/ysoftman/workspace/my/lib/libprotobuf.25.6.0.dylib
/Users/ysoftman/workspace/my/lib/libprotobuf.25.6.0.dylib: Mach-O 64-bit dynamically linked shared library arm64

# protobuf 에서 AssignDescriptors() 심볼도 다음과 같이 확인하니 존재했다.
nm -gU /Users/ysoftman/workspace/my/lib/libprotobuf.25.6.0.dylib | rg AssignDescriptors
00000000000d2fa8 T __ZN6google8protobuf8internal17AssignDescriptorsEPFPKNS1_15DescriptorTableEvEPN4absl12lts_202407229once_flagERKNS0_8MetadataE
00000000000d2ff4 T __ZN6google8protobuf8internal17AssignDescriptorsEPKNS1_15DescriptorTableE

# protobuf 라이브러리에서 사용하는 dylib 를 다음과 같이 확인하니
# abseil(absl, c++ standard 에 없는 기능들이 있는 구글에서 만든 오픈소스 라이브러리) 2407 버전을 사용하게 되어 있다.(/opt/homebrew/opt.. 경로를 사용하고 있음)
# 그런데 위 에러에 보이는 absl 20250127 보다 이전이다.
otool -L  /Users/ysoftman/workspace/my/lib/libprotobuf.25.6.0.dylib
... 생략 ...
/opt/homebrew/opt/abseil/lib/libabsl_log_initialize.2407.0.0.dylib (compatibility version 2407.0.0, current version 0.0.0)
/opt/homebrew/opt/abseil/lib/libabsl_statusor.2407.0.0.dylib (compatibility version 2407.0.0, current version 0.0.0)
... 생략 ...

# my/lib/libprotobuf.25.6.0.dylib 소스 빌드시 프로젝트 absl 은 패키지(시스템 기본 설정, brew install abseil로 설치됨)를 이용하게 되어 있는게 문제였다.
# 참고로 brew uninstall abseil 하면 시스템에서 이미 mysql 등에서 사용하고 있어 디펜던시가 있다.
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX:PATH=$PREFIX \
-DCMAKE_INSTALL_LIBDIR:PATH=lib \
-DCMAKE_CXX_STANDARD=17 \
-DBUILD_SHARED_LIBS=1 \
-Dprotobuf_BUILD_TESTS=0 \
-Dprotobuf_ABSL_PROVIDER=package .

# 정리하면 abseil 버전이 다음과 같이 2개가 있는 상태다.
# 시스템에 기본 버전: /opt/homebrew/Cellar/abseil/20240722.1
# 커스텀 빌드: /Users/ysoftman/workspace/my/lib/libabsl_xxx.2501.0.0.dylib

# my/lib/ 로 설치 전 커스텀 빌드 소스들(cmake 정보등) my/abseil-cpp-20250127.0 에 있다.
# protobuf dylib 빌드시 다음 2개의 값을 설정하면 커스텀한(absl 2501버전) dylib 를 참조해 빌드할 수 있다.
# 참고로 아래 변수이름은 protobuf 소스 > cmake > abseil-cpp.cmake 를 참고해 알 수 있었다.
# protobuf cmake 에 수행시 다음과 같이 커스텀 absl 을 사용해 빌드(cmake and build)
-Dprotobuf_ABSL_PROVIDER=module \
-DABSL_ROOT_DIR="/Users/ysoftman/workspace/my/abseil-cpp-20250127.0" \

# grpc 도 에러나 발생하니 수정
# grpc 빌드는 absl protobuf re2 cares 다음과 같이 빌드(cmake and bulid)
# 참고로 아래 변수이름은 gproc 소스 > cmake > xxx.cmake 를 참고해 알 수 있었다.
-DgRPC_ABSL_PROVIDER=module \
-DABSL_ROOT_DIR="/Users/ysoftman/workspace/my/abseil-cpp-20250127.0" \
-DgRPC_PROTOBUF_PROVIDER=module \
-DPROTOBUF_ROOT_DIR="/Users/ysoftman/workspace/my/protobuf-25.6" \
-DgRPC_RE2_PROVIDER=module \
-DRE2_ROOT_DIR="/Users/ysoftman/workspace/my/re2-2024-07-02" \
-DgRPC_CARES_PROVIDER=module \
-DCARES_ROOT_DIR="/Users/ysoftman/workspace/my/c-ares-1.34.4" \

# 또는 PROVIDER=package 로 둔 상태에서 CMAKE_PREFIX_PATH(include,header경로)를 설정해도 된다.
-DCMAKE_PREFIX_PATH="/Users/ysoftman/workspace/my"

# 위와 같은 커스텀 dylib 를 생성하려면 
# absl, re2 --> protobuf
# absl, re2, protobuf --> grpc
# 로 관련된 모든 ~/Users/ysoftman/workspace/my...의 커스텀 경로를 해줘야해서 복잡하고 불편한다.
# 그리고 my 프로젝트에서 빌드시 커스텀 라이브러리 사용으로 또 다른 에러가 발생했다.
# 그냥 다음 패키지(라이브러리)들은 소스 빌드를 하지 않고 설치하고 -DxxxPROVIDER=package 로 원복
# 커스텀 라이브러리들 목록에서 제외(my/{include,lib}에 생성되지 않아)하면 my 프로젝트도 다음 시스템 패키지를 사용해 문제 없이 빌드됐다.
brew install abseil re2 protobuf grpc

build gRPC on mac

# mac m1(arm64) 에서 grpc 소스 빌드를 해보는데 다음 에러가 발생했다.
/Users/ysoftman/workspace/grpc-1.70.1/src/core/lib/promise/pipe.h:118:5: error: use of undeclared identifier 'VLOG'
  118 |     GRPC_TRACE_VLOG(promise_primitives, 2)
      |     ^
/Users/ysoftman/workspace/grpc-1.70.1/src/core/lib/debug/trace_impl.h:95:40: note: expanded from macro 'GRPC_TRACE_VLOG'
   95 |   if (GRPC_TRACE_FLAG_ENABLED(tracer)) VLOG(level)

# grpc 빌드에 protobuf, absl, c-ares, re2, ssl, zlib 등이 라이브러리가 필요하고
# cmake 실행시 다음과 같이 package(시스템 패키지)가 사용되도록 했다.
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX=/Users/ysoftman/workspace/ysoftman-build-grpc \
-DBUILD_SHARED_LIBS=1 \
-DgRPC_CARES_PROVIDER=package \
-DgRPC_ABSL_PROVIDER=package \
-DgRPC_PROTOBUF_PROVIDER=package \
-DgRPC_RE2_PROVIDER=package \
-DgRPC_SSL_PROVIDER=package \
-DgRPC_ZLIB_PROVIDER=package \
-DgRPC_DOWNLOAD_ARCHIVES=0 \
-DgRPC_BUILD_GRPC_CSHARP_PLUGIN=0 \
-DgRPC_BUILD_GRPC_NODE_PLUGIN=0 \
-DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=0 \
-DgRPC_BUILD_GRPC_PHP_PLUGIN=0 \
-DgRPC_BUILD_GRPC_RUBY_PLUGIN=0 .

# cmake 수행후 설정들이 어떻게 생성됐는지 확인해 보면
# re2 만 (x86_64)/usr/local/lib/cmake/re2 경로를 사용하고 있었다.
cmake -L ./grpc-1.70.1
... 생략 ...
Protobuf_DIR:PATH=/opt/homebrew/lib/cmake/protobuf
absl_DIR:PATH=/opt/homebrew/lib/cmake/absl
c-ares_DIR:PATH=/opt/homebrew/lib/cmake/c-ares
gRPC_ABSL_PROVIDER:STRING=package
gRPC_BUILD_CODEGEN:BOOL=ON
gRPC_BUILD_GRPCPP_OTEL_PLUGIN:BOOL=OFF
gRPC_BUILD_GRPC_CPP_PLUGIN:BOOL=ON
gRPC_BUILD_GRPC_CSHARP_PLUGIN:BOOL=0
gRPC_BUILD_GRPC_NODE_PLUGIN:BOOL=0
gRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN:BOOL=0
gRPC_BUILD_GRPC_PHP_PLUGIN:BOOL=0
gRPC_BUILD_GRPC_PYTHON_PLUGIN:BOOL=ON
gRPC_BUILD_GRPC_RUBY_PLUGIN:BOOL=0
gRPC_BUILD_MSVC_MP_COUNT:STRING=0
gRPC_BUILD_TESTS:BOOL=OFF
gRPC_CARES_PROVIDER:STRING=package
gRPC_DOWNLOAD_ARCHIVES:BOOL=0
gRPC_INSTALL:BOOL=ON
gRPC_INSTALL_BINDIR:STRING=bin
gRPC_INSTALL_CMAKEDIR:STRING=lib/cmake/grpc
gRPC_INSTALL_INCLUDEDIR:STRING=include
gRPC_INSTALL_LIBDIR:STRING=lib
gRPC_INSTALL_SHAREDIR:STRING=share/grpc
gRPC_PROTOBUF_PROVIDER:STRING=package
gRPC_RE2_PROVIDER:STRING=package
gRPC_SSL_PROVIDER:STRING=package
gRPC_USE_PROTO_LITE:BOOL=OFF
gRPC_ZLIB_PROVIDER:STRING=package
re2_DIR:PATH=/usr/local/lib/cmake/re2

# re2(regular expression library) 를 설치하면 /opt/homebrew/lib/cmake/re2 가 생된다.
brew install re2

# 이제 cmake 를 실행하고 설정 내용을 보면 re2 경로가 다음으로 변경된다.
re2_DIR:PATH=/opt/homebrew/lib/cmake/re2

# 다시 빌드 수행 중 다음 에러가 발생했다.
ld: warning: ignoring file '/usr/local/Cellar/openssl@3/3.2.0_1/lib/libssl.3.dylib': found architecture 'x86_64', required architecture 'arm64'
ld: warning: ignoring file '/usr/local/Cellar/openssl@3/3.2.0_1/lib/libcrypto.3.dylib': found architecture 'x86_64', required architecture 'arm64'
Undefined symbols for architecture arm64:

# export OPENSSL_ROOT_DIR=/usr/local/opt/openssl 환경변수 설정이 문제였다.
# openssl 을 설치하고
brew install openssl
# 다음과 같이 환경변수를 설정 또는 OPENSSL_ROOT_DIR 설정을 안하면 기본 /opt/homebrew/opt/openssl 을 사용한다.
export OPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl

# 다시 cmake > make 하면 빌드 성공~

keycastr

# 맥환경에서 찍은 영상들을 보면 가끔 키보드 타이핑 내용이 그대로 표시는데, keycastr 앱을 사용한다.
# 설치
brew install --cask keycastr

# 설정화면

# ctrl-cmd-alt-k 로 사용(casting) 여부를 토글 한다.
# 키 입력 표시는 마우스로 원하는 위치로 이동할 수 있다.

blueutil

# 가끔 맥북 스피커 대신 외부 bluetooth 로 연결해 음악을 듣는데, 매번 마우스로 메뉴의 블루투스 아이콘 클릭해서 장치를 켜는게 귀찮다.
# blueutil 커맨드를 사용하자
# 설치
brew install blueutil

# 블루투스 페이링(연결) 상태
blueutil --paired

# 장지 연결/해제
blueutil --connect "Philips SPA 20"
blueutil --disconnect "Philips SPA 20"

git repository not found error

# git clone 시 다음과 같은 에러 발생했다.
# 사설 github 은 되지만 github.com 만 클론되지 않았다.
remote: Repository not found.
fatal: repository 'https://github.com/ysoftman/test_code.git/' not found

# 해결 방법
# 참고로 system 메뉴에서는 삭제가 안되니 default keychains > login 에서 삭제해야 한다.
keychain Access.app > login 메뉴에서 github.com 이름의 키체인을 삭제

# 이제 push, pull 할때 맥에서 키체인 등록을 위한 사용자 암호를 입력하면 등록된다.
# 참고로 다음과 같이 수동으로 등록할 수도 있다.(마지막에 엔터 2번입력해야 반영된다.)
git credential-osxkeychain store
host=github.com
protocol=https
username=ysoftman
password={깃헙 PAT(personal access token}

#####

# 특정 저장소에서 git push 하면 다음과 같이 권한이 없다는 에러가 발생한다.
remote: Write access to repository not granted.
fatal: unable to access 'https://github.ysoftmancom/test/test/': The requested URL returned error: 403

# 원인은 ~/.git-credentials 에 같은 호스트에 2개의 계정을 설정했는데
# 첫번째줄이 우선 적용되어 실제 권한이 있는 ysoftman 대신 foobar 계정이 키체인으로 등록돼 발생한 것이다.
# 다음과 같이 ysoftman 계정을 첫번째줄로 설정하면 ysoftman 이 키체인에 등록되어 해결된다.
https://ysoftman:ghp_bbb222@github.ysoftman.com
https://foobar:ghp_aaa111@github.ysoftman.com

karabiner

# karabiner 로 mac 에 키보드 맵핑하기
# https://github.com/pqrs-org/Karabiner-Elements
# 설치
brew install --cask karabiner-element

# 설치 후 mac system setting > privacy & security > karabiner 앱들을 허용해야 한다.
# Karabiner-Elements.app 를 실행
# 키보드별 맵핑을 위해 devices > 맵핑할 키보의 modify events 를 활성화 한다.
# 활성화(추가)된 키보드에만 맵핑이 적용된다.
# 이제 simple modification > 외부 키보드 선택 후 맵핑를 하면 된다.

# 유선, 블루투스 연결에 따라 키보드가 인식이 다르게 되고 여러 키보드를 사용하다 보니
# For all devices 로 한번에 적용하는 것이 편하다.
# right_control(키보드에 키가 없으면 안보인다.)를 mac fn 로 맵핑

# FEKER IK65 키보드는 FN+left_shift+escape 이 ~(tilde) 라 불편하다.
# Karabiner-Elements > Complex Modifications > Add your own rule 에 아래처럼 left_shift+escape 로 ~ 설정할 수 있다.
# 그리고 cmd+esc -> cmd+`(맥에서 동일 앱간의 창전환 및 cmd+tab 앱전환시 역방향 순회)로 맵핑
{
  "description": "change keys",
  "manipulators": [
    {
      "from": {
        "key_code": "escape",
        "modifiers": {
          "mandatory": ["left_shift"],
          "optional": ["any"]
        }
      },
      "to": [
        {
          "key_code": "grave_accent_and_tilde",
          "modifiers": ["left_shift"]
        }
      ],
      "type": "basic"
    },
    {
      "from": {
        "key_code": "escape",
        "modifiers": {
          "mandatory": ["command"],
          "optional": ["any"]
        }
      },
      "to": [
        {
          "key_code": "grave_accent_and_tilde",
          "modifiers": ["command"]
        }
      ],
      "type": "basic"
    }
  ]
}

# Karabiner-EventViewer.app 를 실행하면 아래와 같이 키입력 이벤트를 확인할 수 있다.

shebang bash version

# mac 에서 .sh 실행시 local -A (delclare -A) 옵션에서 다음과 에러가 발생한다.
line 5: declare: -A: invalid option
declare: usage: declare [-afFirtx] [-p] [name[=value] ...]

# 원인은 .sh 에서 shebang 으로 #!/bin/bash 를 사용하는데 bash 버전이 너무 옛날거라 local -A 옵션이 지원되지 않는다.
# bash 실행시 /opt/homebrew/bin/bash 가 실행되지만 
# 일반적으로 .sh 에서는 #!/bin/bash 으로 많이 사용한다.
type -a bash
bash is /opt/homebrew/bin/bash
bash is /usr/local/bin/bash
bash is /bin/bash

# 두 bash 버전차이가 있었다.
/bin/bash --version; echo "-----"; /opt/homebrew/bin/bash --version

# /bin/bash 는 brew 로 업그레이드 되지 않는다.
# 그리고 /bin/bash 는 x86_64, arm64 환경에서 동작하는 바이너리다. 
file /bin/bash
/bin/bash: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
/bin/bash (for architecture x86_64):    Mach-O 64-bit executable x86_64
/bin/bash (for architecture arm64e):    Mach-O 64-bit executable arm64e

# shebang 으로 다음과 같이 명시하면 현재 환경에 맞은 bash 로 실행할 수 있다.
#!/usr/bin/env bash

mac paste and match style

지금까지 맥에서 서식없이 붙여넣기(붙여넣고 스타일 일치시키기)는 cmd+shift+v 로 알고 있었는데 찾아보니 요렇다.
cmd+shift+option+v

붙여넣고 스타일 일치시키기 단축키가 chrome 과 safari 가 다르다.


google docs 에 정리된 jira url 을 (atlassian)wiki 에 복붙하면 jira 아이콘(링크)가 안되 길래 브라우저 주소표시줄에서 복사하고 다시 붙여넣고 있었다.

크롬에서는 cmd+shift+v 로 하면 서식없이 붙여넣기가 된다.
하지만 wiki 에서는 cmd+shift+option+v 를 사용해야 서식없이 붙이기가 되는것 같다.

ipad is not charging

ipad가 더러워져 흐르는 물에 잠깐 씻은 후 잘 말렸다.
그런데 usb-c 충전이 되지 않는다.
usb-c 케이블을 연결해도 충전표시, 메시지등 아무런 변화가 없다.

OS: 17.1.2
모델명: ipad pro 11(4세대)
해결 시도:
1. 강제 종료(전원+볼륨 버튼) 후 시작 -> 안됨
2. 설정 > ipad 재설정 > 재설정 후 시작 -> 어쩌다 됨, usb-c 를 분리했다 다시 연결하면안됨
3. (mac 에 ipad 백업하고) 설정 > 모든 콘텐츠 및 설정 지우기 > 재설정 후 시작 -> 충전 성공

결국 ipad 전제 리셋(3번방법)으로 하니 정상 충전된다.

replace intel app to apple app

mac intel -> M1(apple silicon)으로 마이그레이션 후
intel kind의 프로세서들은 rosetta2 에뮬레이터가 변환해서 apple silicon 에서도 동작한다.
하지만 변환과정으로 비효율적이다.
activity Monitor.app > kind 로 intel 프로세스를 확인할 수 있다.

아직 apple silicon(arm64) 바이너리가 많이 없지만 있다면 대체해보자.

# file 명령으로 바이너리가 어떤 환경에서 실행 되는지 알 수 있다.
file /bin/sh

# bin/zsh 는 arm64, x86_64 둘다 지원하는 universal binary 다.
file /bin/zsh

# intel 용으로 zsh 를 실행하기
arch -x86_64 /bin/zsh

# arm64 용으로 zsh 를 실행하기
arch -arm64 /bin/zsh

# 그런데 /usr/local/bin/zsh 는 x86_64 바이너리다.
file /usr/local/bin/zsh

# 아래 사이트에서 brew 설치 스크립트를 실행하면
# apple silicon 용(/opt/Homebrew/bin 에 설치) homebrew 로 설치 된다.
# 설후 설정을 보면 HOMEBREW_PREFIX: /opt/Homebrew 로 되어 있다.
brew config

# apple silicon 용 brew 등의 바이너리를 우선 실행할 수 있도록 한다.
export PATH=/opt/Homebrew/bin:$PATH

# 이제 쉘을 재시작하고 zsh 설치해 보자.
# bash 도 arm64 으로 설치하자.
brew install zsh bash

# 새로 설치된 zsh 는 arm64 버전이다.
which zsh
/opt/Homebrew/bin/zsh
file /opt/Homebrew/bin/zsh
/opt/Homebrew/bin/zsh: Mach-O 64-bit executable arm64

# 이제 brew 로 arm64 버전의 프로그램을 설치 할 수 있다.
brew install vim fzf git lsd wegt dog 등등

# 참고로 x86_64 용(/usr/local/bin 에 설치) brew 를 사용하려면
# x86_64 용(/usr/local/bin 에 설치) homebrew 설치하고
arch --x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/
install/HEAD/install.sh)"

# 다음과 같이 사용한다.
arch --x86_64 /usr/local/Homebrew/bin/brew install {패키지이름}

#####

arm64 zellij (/opt/Homebrew/bin/zellij) 0.39.1 을 사용하면 status-bar 등의 코드에서 에러가 발생한다.
SSE2 명령셋등 intel cpu 종속적인 코드가 있어 보인다.

# 당분간은 x86_64 zellij 사용하기 위해 arm64 로 설치된 zellij 는 제거한다.
brew uninstall zellij

# 몇주 후 0.39.2 버전이 나왔고 설치하니 해결되었다.
arch -arm64 brew install zellij

# 버전확인
/opt/homebrew/bin/zellij --version
zellij 0.39.2

# arm64 바이너리 확인
file /opt/homebrew/bin/zellij
/opt/homebrew/bin/zellij: Mach-O 64-bit executable arm64

#####

# 마이그레이션 후 파이썬 설치시
brew install python

# 또는 uname -m 이 x86_64 라면
arch -arm64 brew install python

# 다음과 같은 에러가 발생했다.
Error: An exception occurred within a child process:
  FormulaUnavailableError: No available formula with the name "/opt/Homebrew/Library/Taps/homebrew/homebrew-core/Aliases/python".

# 확인해보니 다음 경로 자체가 없었다.
/opt/Homebrew/Library/Taps/homebrew/homebrew-core

# homebrew/core 를 다시 구성후 설치하면 된다.
# 구성에 시간이 좀 걸린다.
brew tap homebrew/core

# 만약 /opt/Homebrew/Library/Taps/homebrew/homebrew-core 경로가 있는 상태에서도 안되면 삭제후 시도해보자.
rm -rf /opt/Homebrew/Library/Taps/homebrew/homebrew-core

#####

# 마이그레이션 후 
# pyenv 로 python 설치하면 다음과 같은 이유로 실패 한다.
pyenv install -v 3.12
ld: warning: duplicate -rpath '/Users/ysoftman/.pyenv/versions/3.12.0/lib' ignored
ld: warning: duplicate -rpath '/opt/homebrew/lib' ignored
ld: warning: search path '/Users/ysoftman/.pyenv/versions/3.12.0/lib' not found
ld: warning: search path '/Users/ysoftman/.pyenv/versions/3.12.0/lib' not found
ld: Undefined symbols:
ld: Undefined symbols:
  _libintl_bindtextdomain, referenced from:
      __locale_bindtextdomain in _localemodule.o
      __locale_bindtextdomain in _localemodule.o
  _libintl_dcgettext, referenced from:
      __locale_dcgettext in _localemodule.o
  _libintl_dgettext, referenced from:
      __locale_dgettext in _localemodule.o
  _libintl_gettext, referenced from:
      __locale_gettext in _localemodule.o
  _libintl_setlocale, referenced from:
      __locale_setlocale in _localemodule.o
      __locale_setlocale in _localemodule.o
      __locale_localeconv in _localemodule.o
      __locale_localeconv in _localemodule.o
      __locale_localeconv in _localemodule.o
      __locale_localeconv in _localemodule.o
  _libintl_textdomain, referenced from:
      __locale_textdomain in _localemodule.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Programs/_freeze_module] Error 1
make: *** Waiting for unfinished jobs....

# libintl.a 라이브러리에 있는 심볼들이 보인다.
# /opt/homebrew/lib/libintl.a 를 참조하지 않는게 문제 같다.
nm /opt/homebrew/lib/libintl.a | rg  "_libintl_(bindtextdomain|dcgettext|dgettext|gettext|setlocale)$"

# 구글링으로 여러 방법들을 시도...
# gettext library 를 찾지 못한다고 해서 다시 설치했지만 안된다.
brew reinstall gettext

# arm64 library 을 찾도록 LDFLAG 를 설정해도 안된다.
export LDFLAGS="-L/opt/homebrew/lib"
export CPPFLAGS="-I/opt/homebrew/include"

# 기존 x86_64 라이브러를 우선 참조하게 되는것 같아 해당 path 를 강제 삭제해도 안된다.
rm -rf /usr/local/Cellar/{gettext,readline}

# arm64 용으로 make gcc 등 컴파일러 최신으로 설치해도 안된다.
arch -arm64 brew install cmake make gcc

# 이번에는 실제 파이썬 소스를 다운받아 다음과 같이 빌드하면 잘된다.
# 아래처럼 configure 로 Makefile 이 생성하면 CC=gcc CXX=g++ 로 설정되어 있다.
git clone https://github.com/python/cpython
cd cpython; ./configure && make -j10

# pyenv 빌드시 clang (Apple clang version 15.0.0) 대신 
# 컴파일러를 gcc(없다면 설치 brew install gcc)로 변경하니 된다.
CC=/opt/homebrew/bin/gcc-13 pyenv install -v 3.12

# 몇달 후 zellij, /opt/homebrew 패키지들을 arm64 로 다시 설치등의 변화가 있었는데,
# 별도 CC 설정없이 clang (Apple clang version 15.0.0) 로도 됐다.
pyenv install -v 3.12

######

2026년 현재 macOS 27 Golden Gate는 로제타 2를 온전하게 지원하는 마지막 버전이고,
내년에 나올 차기 버전인 macOS 28부터는 인텔 전용 앱 지원이 대폭 축소되거나 본격적으로 제거될 예정이라고 한다.

intel 맥 -> apple sillicon 맥으로 마이그레이션 후 intel 환경에서 사용하던 brew 프로그램들(/usr/local/{bin,opt}등)올 제거하는 스크립트가 추가됐다.(2024-05-24)
curl -fsSLO https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh
/bin/bash uninstall.sh --path /usr/local

추가로 예전 intel 맥에서 쓰던 pip, npm 패키지들도 삭제
/usr/local/anaconda3
/usr/local/lib/python2.7 ~ python3.12
/usr/local/lib/node_modules

mac input source icon

# mac sonoma 로 업그레이드 하니 terminal, spotlight 등 입력커서가 포커스된 상태에서
# 언어 전환을 하면 다음과 같이 변경된 언어로 표시하는 아이콘이 나타났다 사라진다.
# 매번 한영 전환을 하면 화면 중앙에 변환 인디케이터로 표시된다.
# 참고로 입력 언어 변환은 ctrl+space 대신 alt+space 로 사용하고 있는데, alt+space 후 alt 를 잡고 있어는 한/영이 둘다 표시된다.
# 이렇게 현재 작업중인 커서에 바로 한영이 표시돼 좋은것 같다.

# 그런데 이게 불편한 사람들도 꽤 있어 보인다.
# 커서에서 한영 아이콘을 비활성화 하려면
# 다음 명령줄을 실행하고 재시작한다.
sudo defaults delete /Library/Preferences/FeatureFlags/Domain/UIKit.plist redesigned_text_cursor

# 그리고 아래 명령줄로 바로 비활성할 수 있다.
defaults write kCFPreferencesAnyApplication TSMLanguageIndicatorEnabled 0

delete leftover data on mac

# 맥용량이 부족할 땐 임시,캐시 파일들을 삭제해보자.

# diskonaut 로 보니 이미 삭제된 vscode 관련 데이터가 크게 남아 있었다.
# 앱 캐시와 앱에서 사용하는 데이터 위치다.
/Users/ysoftman/Library/Caches
/Users/ysoftman/Library/Application Support

# 각각 10G 정도의 데이터가 남아 있어서 다음과 같이 삭제했다.
rm -rf /Users/ysoftman/Library/Caches/Code
rm -rf "/Users/ysoftman/Library/Application Support/vscode-cpptools"

# go mod pkgs 캐시 크기가 꽤된다. 
go clean -modcache

# vagrant box 이미지
rm -rf ~/.vagrant.d/boxes/*

# app cache 확인
cd ~/Library/Containers
fd -t d Caches | dust -d1

# app cache 삭제
fd -t d Caches --exec rm -rf {} \;

mac photos export to external disk

# mac photos.app 에서 NTFS 의 외장 하드로 사진을 export(unmodified originals)을 하려는데 write 가 되지 않는다.
# 찾아보니 mac 에서는 NTFS 는 기본적으로 read 만 할 수 있다고 한다.
# /etc/fstab 파일을 다음과 같이 설정하면 write 된다고 하는데 내 경우는 동작하지 않았다.
LABEL=외장하드이름 none ntfs rw,auto,nobrowse

# write 할 수 있는 마운트 프로그램중 무료인 mounty 를 설치하면 된다.
# install
brew install gromgit/fuse/mounty

# mounty app 을 실행하고 remount 하면 NTFS 외장하드에 write 할 수 있다.
# 단점은 속도가 느려서 photos 에서 export 하니 하루종일 걸렸다.
# 참고로 mounty 로 리마운트하면 /Volumes 가 아닌 ~/.mounty/외장하드이름으로 마운트가 된다.

# NTFS 외장 하드의 한곳에 export 된 사진 파일들을 날짜별 디렉토리에 옮기려고 하는데
# 10,000 장이 넘는 파일이 한곳에 있다보니 파일 리스트 파악도 잘 안된다.
# finder 에서 리스트 파악 후 drag&drop 동작도 느려서 이동이 안된다.
# 이경우 fd 커맨드로 다음과 같이 오래된 날짜부터 파악해서 이동하는 명령을 사용하는것이 좋다.
# mkdir -p ../{2021,2022,2023}
fd --changed-before '2021-12-31 23:59:59' | mv -v "../2021"
fd --changed-before '2022-12-31 23:59:59' | mv -v "../2022"
fd --changed-before '2023-12-31 23:59:59' | mv -v "../2023"

brew warning

# brew 설치/삭제 시 다음과 같이 openjdk 에러 발생한다.
Warning: Calling the `appcast` stanza is deprecated! Use the `livecheck` stanza instead.
Please report this issue to the adoptopenjdk/openjdk tap (not Homebrew/brew or Homebrew/homebrew-core),
or even better, submit a PR to fix it:
  /usr/local/Homebrew/Library/Taps/adoptopenjdk/homebrew-openjdk/Casks/adoptopenjdk11.rb:9

# openjdk 저장소를 강제로 untap 후 openjdk 를 삭제해야 한다. 
brew untap --force adoptopenjdk/openjdk
brew uninstall adoptopenjdk11 adoptopenjdk12

# brew doctor 로 발견된 warning 해결하기
brew doctor

#####

Warning: A newer Command Line Tools release is available.
Update them from Software Update in System Preferences.

If that doesn't show you any updates, run:
  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select --install

Alternatively, manually download them from:
  https://developer.apple.com/download/all/.
You should download the Command Line Tools for Xcode 14.2.

# 해결방법
sudo rm -rf /Library/Developer/CommandLineTools
sudo xcode-select --install

#####

Warning: Some installed kegs have no formulae!
This means they were either deleted or installed manually.
You should find replacements for the following formulae:
  python@2
  ccze
  erlang@19
  spdylay
  boost-python

# 해결방법
brew uninstall --ignore-dependencies python@2 ccze erlang@19 spdylay boost-python

#####

Warning: You have the following deprecated, cask taps tapped:
  caskroom/versions
Untap them with `brew untap`.

# 해결방법
brew untap caskroom/versions

#####

Warning: Some installed formulae are deprecated or disabled.
You should find replacements for the following formulae:
  cronolog
  delta
  dosbox
  gcal
  glide
  ilmbase
  lua@5.1
  octant
  sdl_net
  sdl_sound
  sshfs
  xml2

# 해결방법
brew uninstall --ignore-dependencies cronolog delta dosbox gcal glide ilmbase lua@5.1 octant sdl_net sdl_sound sshfs xml2

#####

Warning: Unbrewed dylibs were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected dylibs:
  /usr/local/lib/libDSToolkitV30-v3.4.2.20.dylib
  /usr/local/lib/libevent-1.4.2.1.3.dylib
  /usr/local/lib/libevent_core-1.4.2.1.3.dylib
  /usr/local/lib/libevent_extra-1.4.2.1.3.dylib
  /usr/local/lib/libldap.dylib

# 해결방법
rm -rf  /usr/local/lib/libDSToolkitV30-v3.4.2.20.dylib
rm -rf  /usr/local/lib/libevent-1.4.2.1.3.dylib
rm -rf  /usr/local/lib/libevent_core-1.4.2.1.3.dylib
rm -rf  /usr/local/lib/libevent_extra-1.4.2.1.3.dylib
rm -rf  /usr/local/lib/libldap.dylib

#####

Warning: Unbrewed header files were found in /usr/local/include.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected header files:
  /usr/local/include/evdns.h
  /usr/local/include/event-config.h
  /usr/local/include/event.h
  /usr/local/include/evhttp.h
  /usr/local/include/evrpc.h
  /usr/local/include/evutil.h
  /usr/local/include/memcached/protocol_binary.h
  /usr/local/include/python3.7m/greenlet/greenlet.h

# 해결방법
rm -rf /usr/local/include/evdns.h
rm -rf /usr/local/include/event-config.h
rm -rf /usr/local/include/event.h
rm -rf /usr/local/include/evhttp.h
rm -rf /usr/local/include/evrpc.h
rm -rf /usr/local/include/evutil.h
rm -rf /usr/local/include/memcached/protocol_binary.h
rm -rf /usr/local/include/python3.7m/greenlet/greenlet.h

#####

Warning: Unbrewed '.la' files were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected '.la' files:
  /usr/local/lib/libevent.la
  /usr/local/lib/libevent_core.la
  /usr/local/lib/libevent_extra.la

# 해결방법
rm -rf  /usr/local/lib/libevent.la
rm -rf  /usr/local/lib/libevent_core.la
rm -rf  /usr/local/lib/libevent_extra.la

#####

Warning: Unbrewed static libraries were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected static libraries:
  /usr/local/lib/libevent.a
  /usr/local/lib/libevent_core.a
  /usr/local/lib/libevent_extra.a

# 해결방법
rm -rf  /usr/local/lib/libevent.la
rm -rf  /usr/local/lib/libevent_core.la
rm -rf  /usr/local/lib/libevent_extra.la

#####

Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause formulae that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  python-certifi
  midnight-commander
  docker-credential-helper-ecr
  docker
  thefuck
  pygments
  docutils
  redis
  python-tabulate
  numpy
  macvim
  tcl-tk
  pyyaml
  python-typing-extensions
  libevent
  six
  black
  wireshark

# 해결방법
brew link --overwrite python-certifi midnight-commander docker-credential-helper-ecr docker thefuck pygments docutils redis python-tabulate numpy macvim tcl-tk pyyaml python-typing-extensions libevent six black wireshark

mac cpu temperature

# mac cpu/gpu 온도 파악하기
sudo powermetrics | grep -i temperature

Prev