홈서버나 개인 프로젝트에 도커 컨테이너를 여러 개 띄워두면 이미지 업데이트를 챙기는 게 일이 된다. docker pull 하고 컨테이너 지우고 다시 띄우는 걸 컨테이너 수만큼 반복해야 한다.이걸 자동으로 해주는 게 Watchtower다.실행docker run -d \ --name=watchtower \ -e TZ=Asia/Seoul \ -v /var/run/docker.sock:/var/run/docker.sock \ --restart=always \ containrrr/watchtower --cleanup각 옵션의 의미는 이렇다.-v /var/run/docker.sock:/var/run/docker.sock : 호스트의 도커 소켓을 마운트해서 다른 컨테이너를 제어할 수 있게 한다. Watcht..
PhpStorm이나 IntelliJ에서 한글 언어팩을 켰는데 UI가 그대로 영어인 경우가 있다. 캐시를 지워도, IDE를 재시작해도 안 바뀐다.원인은 단순한데 찾기가 어렵다. 언어팩을 enable 하는 것과, 실제로 사용할 언어를 고르는 것이 별개가 됐기 때문이다.무엇이 바뀌었나예전에는 한글 언어팩이 마켓플레이스에서 설치하는 플러그인이었다. 설치하면 곧바로 적용됐다.그런데 언어팩이 IDE에 기본 번들로 들어오면서 설치/삭제가 아니라 enable / disable 방식으로 바뀌었다. 여기서 함정이 생긴다. enable은 "이 언어팩을 쓸 수 있게 해달라"는 뜻이지 "이 언어로 바꿔달라"는 뜻이 아니다.해결 순서1. 언어팩을 enable 한다Settings (Preferences) > Plugins > In..
스캔한 옛날 사진이나, 카메라 시계가 잘못 맞춰진 상태로 찍은 사진들의 메타데이터를 한 번에 고쳐야 할 때가 있다. ExifTool을 쓰면 명령 한 줄로 끝난다.설치brew install exiftool명령어위치만 변경exiftool -gpslatitude=37.6534 -gpslongitude=126.8321 \ -gpslatituderef=N -gpslongituderef=E \ -overwrite_original /경로/사진_폴더/*.jpg날짜만 변경exiftool "-AllDates=2024:08:24 12:34:56" \ -overwrite_original /경로/사진_폴더/*.jpg둘 다 변경exiftool "-AllDates=2024:08:24 12:34:56" \ -gpslatitu..
오늘도 구글이 나에게 시련을 준다. 단순 경고이지만, 무시해도 될것 같은데 신경이 너무 쓰인다.구글링을 해보았더니, 아래의 경로를 압축해서 업로드하면 된다고한다.[project_root]/build/app/intermediates/merged_native_libs/release/out/lib위의 3개 폴더 (현재 시점으로는 3개인데 나중에는 몇개가 될지 모르겠다.) 를 압축한다. 파일명은 상관없다.압축된 파일은App Bundle 탐색기로 가서 경고를 띄운 업로드중인 혹은 업로드 된 버전을 선택후 다운로드 > 네이티브 디버그 기호에 업로드해주면된다. 그럼 윈도우라면 아주 깔끔하게 그냥 처리되겠지만, 우린 하필 맥유저이기에 The native debug symbols contain an invalid di..
평화로운 개발 인생에 또 구글이 정기적으로 시련을 준다. "앱이 Android 14(API 수준 34) 이상을 타겟팅해야 함"이라는 경고 메일이다.구글 플레이는 매년 새 앱과 업데이트에 대해 타겟 API 레벨 최소 요구치를 올린다. 대응하지 않으면 업데이트 자체를 올릴 수 없다.기본적으로 손봐야 할 코드수정할 위치는 android/app/build.gradle 이다.compileSdkVersion : xxxtargetSdkVersion : xxxAndroid 14 대응이라면 이렇게 변경되어야 한다.compileSdkVersion : 34targetSdkVersion : 34두 가지 선택지여기서 우리는 2가지 선택을 해야 한다.1. build.gradle 파일을 직접 수정할 것인가?2. 거기에 박혀 있..
회사 통계 시스템에서 이상한 이슈가 등록된 적이 있다. 같은 화면을 새로고침하는데 일정 확률로 다른 값이 나온다는 제보였다.처음에는 프런트엔드에서 데이터 취합을 잘못하는 줄 알았다. 그런데 백엔드에서 같은 쿼리를 반복해서 돌려보니 결과값이 실제로 달라졌다.의심했던 것들리드 레플리카를 여러 대 쓰는데 복제 지연으로 싱크가 안 맞는 문제쿼리 자체의 문제캐시나 기타 문제원인: paginate에 ORDER BY가 없었다결론부터 말하면 paginate를 쓸 때는 order by를 반드시 해줘야 한다.SQL 표준상 ORDER BY가 없는 SELECT는 행 순서를 보장하지 않는다. 이건 버그가 아니라 명세다. DB는 가장 빠르게 가져올 수 있는 순서로 반환할 자유가 있다.그런데 paginate()는 내부적으로 LIM..
