set -euo pipefail로 안전한 Bash 스크립트 작성하기
Bash 기본 동작은 명령 하나가 실패해도 스크립트가 멈추지 않고 다음 줄로 넘어간다. mkdir가 실패했는데 그다음 cd와 rm -rf *가 엉뚱한 디렉터리에서 실행되는 식의 사고가 여기서 나온다. set -euo pipefail은 이…
Bash 기본 동작은 명령 하나가 실패해도 스크립트가 멈추지 않고 다음 줄로 넘어간다. mkdir가 실패했는데 그다음 cd와 rm -rf *가 엉뚱한 디렉터리에서 실행되는 식의 사고가 여기서 나온다. set -euo pipefail은 이…
쉘 스크립트에서 $1, $2를 순서대로 읽는 방식은 옵션이 두세 개만 넘어가도 순서를 착각하기 쉽고, 필수 옵션 누락 같은 실수를 걸러낼 방법이 없다. 공백으로 이어붙인 문자열을 IFS로 잘라 쓰는 방식도 값…
터미널에서 API 응답이나 로그의 JSON을 다루다 보면 grep/sed는 중첩된 배열/객체 구조 앞에서 금방 한계에 부딪힌다. 이 프로젝트의 output/post_index.json도 400개 넘는 포스트 정보가 { "159": {...}, "348": {...} } 형태로 중첩돼…
보안 패치는 CVE가 뜬 순간이 아니라 담당자가 apt를 돌리는 순간에야 적용된다. 서버가 몇 대만 넘어가도 관리가 안 되고, 휴가나 주말 사이에 터진 취약점은 며칠씩 방치되기 쉽다. Ubuntu는 매일 자동으로 보안…
QEMU/KVM 게스트의 기본 에뮬레이트 NIC(e1000, rtl8139 등)은 물리 NIC 레지스터를 소프트웨어로 그대로 흉내 내, 패킷 하나마다 MMIO/PIO 접근이 VM Exit로 호스트에 트랩된다. 이 트랩 비용 때문에 처리량이 물리 NIC 대비…
파일 크기가 물리 메모리를 넘어서면 open().read()로 통째로 읽는 순간 프로세스 메모리가 그만큼 늘어나 OOM killer에 걸릴 수 있다. Python 표준 라이브러리 mmap은 파일을 프로세스의 가상 주소 공간에 매핑해서, 실제로 접근한…
NEON은 레지스터 폭이 128비트로 고정돼 있어 배열 길이가 4의 배수가 아니면 스칼라 tail 루프를 따로 짜야 하고, 128비트부터 2048비트까지 벡터 폭이 다양한 ARM 생태계에서도 컴파일 타임에 고정된 128비트씩만 처리한다 —…
커널이 패닉 없이 그냥 멈추거나, 특정 syscall 경로에서만 간헐적으로 이상 동작을 보이는 경우 printk만으로는 원인을 좁히기 어렵다. dmesg에 로그를 더 찍고 재현하고 다시 빌드하는 사이클은 타이밍에 민감한 버그일수록 무력해진다. 이럴…
라즈베리파이에서 ADC나 LED 매트릭스처럼 빠른 응답과 큰 데이터 전송량이 필요한 주변장치를 다룰 때 I2C(배선 2개, 수백 kHz, 슬레이브 주소 기반)는 속도와 주소 충돌 면에서 답답하다. SPI(Serial Peripheral Interface)는 MOSI/MISO를 따로…
pthread_mutex 하나로도 충분히 락을 걸 수 있는데 왜 futex를 직접 만져야 할까. 사실 glibc의 pthread_mutex_lock 자체가 내부적으로 futex(2) syscall 위에 구현되어 있다 — 경쟁이 없을 때는 유저스페이스의 atomic CAS(compare-and-swap) 한…