회사 통계 시스템에서 이상한 이슈가 등록된 적이 있다. 같은 화면을 새로고침하는데 일정 확률로 다른 값이 나온다는 제보였다.처음에는 프런트엔드에서 데이터 취합을 잘못하는 줄 알았다. 그런데 백엔드에서 같은 쿼리를 반복해서 돌려보니 결과값이 실제로 달라졌다.의심했던 것들리드 레플리카를 여러 대 쓰는데 복제 지연으로 싱크가 안 맞는 문제쿼리 자체의 문제캐시나 기타 문제원인: paginate에 ORDER BY가 없었다결론부터 말하면 paginate를 쓸 때는 order by를 반드시 해줘야 한다.SQL 표준상 ORDER BY가 없는 SELECT는 행 순서를 보장하지 않는다. 이건 버그가 아니라 명세다. DB는 가장 빠르게 가져올 수 있는 순서로 반환할 자유가 있다.그런데 paginate()는 내부적으로 LIM..
개발을 몇 년 하다 보면 오히려 기초를 대충 넘어가게 된다. HTML 태그도 그렇다. 화면에 똑같이 보이니까 아무거나 쓰게 되는데, 사실 각각 의미가 다르다.예전에 정리해뒀던 메모를 다시 꺼내 보충한다.이탤릭체: em vs i : 강조하고 싶은 부분을 이탤릭체로 표시 : 단순히 이탤릭체로 표시둘 다 화면에서는 기울어져 보인다. 차이는 의미가 있느냐다.은 emphasis, 즉 문장에서 강세를 두어 읽어야 할 부분이다. 스크린 리더는 이 부분의 억양을 실제로 다르게 읽는다. "나는 오늘 간다"와 "나는 오늘 간다"는 의미가 다른데, 그 차이를 마크업으로 표현하는 것이다.는 강조가 아니라 결이 다른 텍스트를 나타낸다. 학명, 외국어 단어, 배 이름, 생각을 나타내는 문장 같은 것이다.<!-- 강조: 읽을..
Flutter GetX 패키지를 사용하고 있는데, 그중에 모듈을 자동으로 생성해주는 get_cli를 잘 사용하고 있다.그런데 어느 날 갑자기 아래와 같은 에러가 나왔다.Synchronous waiting using dart:cli waitFor and C API Dart_WaitForEventis deprecated and disabled by default. This feature will be fully removedin Dart 3.4 release. You can currently still enable it by passing--enable_deprecated_wait_for to the Dart VM.See https://dartbug.com/52121원인Dart가 동기 대기(waitFor) ..
DeepL이라는 번역 서비스가 있다. 우리에게는 구글 번역과 파파고가 익숙하지만, 번역 품질만 놓고 보면 DeepL이 최강자라고 생각한다.그동안 DeepL은 한국어 번역은 지원하면서도 개발용 API에서는 한국어를 제공하지 않았다. 그러다 한국어 개발 API가 정식 오픈했고, 그 김에 젯브레인의 번역 플러그인으로 유명한 Translation에 기여를 하게 됐다.별로 한 것도 없는데 기여자 목록에 이름이 표시되니 기분이 좋더라.Translation 플러그인이란JetBrains IDE(IntelliJ, PhpStorm, WebStorm 등)에서 쓰는 번역 플러그인이다. 코드 안에서 단어나 문장을 선택하고 단축키를 누르면 바로 번역이 뜬다.변수명·함수명을 지을 때 적절한 영단어 찾기영문 라이브러리 문서나 주석을..
레거시 시스템에서 넘어온 CSV 수백 개를 열었더니 한글이 전부 깨져 있었다. euc-kr(정확히는 cp949)로 저장된 파일을 utf-8 환경에서 열었을 때 나오는 전형적인 증상이다.파일이 한두 개면 에디터로 열어서 다시 저장하면 되지만, 수백 개는 그렇게 못 한다. iconv와 셸 스크립트로 한 번에 처리한다.기본 스크립트#!/bin/bash# csv 파일 목록을 가져온다csv_files=`ls -1 *.csv`# 변환 결과를 담을 디렉터리mkdir -p utf8for csv_file in $csv_files; do iconv -c -f euc-kr -t utf-8 "$csv_file" > "utf8/$csv_file"done옵션 의미는 이렇다.-f euc-kr : 원본 인코딩-t utf-8 : 변..
IntelliJ 혹은 Android Studio에서 freezed나 drift 같은 패키지를 쓰면 같은 이름으로 확장자가 다르게 여러 파일이 나온다.user.dartuser.freezed.dartuser.g.dart사실 직접 눌러서 볼 일이 거의 없기 때문에, 합쳐서 깔끔하게 보고 싶을 때 쓰는 방법이다.설정 방법IntelliJ 혹은 Android Studio에서 만능찾기인 Shift 연속 2번을 누르고 nest를 검색하면 File Nesting...이 나온다.해당 항목을 선택하여 같은 확장자끼리 묶어주면 하나의 파일로 합쳐져서 나온다.Parent file suffix: .dartChild file suffix: .g.dart; .freezed.dart; .config.dart; .gr.dart이제 하나..
