Ubuntu에 Docker Engine 설치 후 설정

Docker Engine을 설치하고 나면 바로 몇 가지 불편과 위험이 드러난다. 일반 계정으로 docker ps를 치면 권한 오류가 나고, 컨테이너 로그는 기본 설정에서 크기 제한 없이 디스크를 채운다. Docker 데몬을 재시작하면…

Continue ReadingUbuntu에 Docker Engine 설치 후 설정

Ubuntu 24.04 하드 디스크 마운트하기

서버에 데이터용 디스크를 새로 붙이면 lsblk에는 보이지만 파티션도 파일시스템도 없어 바로 쓸 수 없다. 마운트 후 재부팅하면 사라지고, /etc/fstab에 잘못 등록하면 부팅이 멈추기도 한다. 이 글에서는 Ubuntu 24.04에서 새 디스크…

Continue ReadingUbuntu 24.04 하드 디스크 마운트하기

WSL 배포판을 다른 드라이브에 설치하기

wsl --install로 배포판을 설치하면 디스크 이미지(ext4.vhdx)가 C:\Users\<사용자>\AppData\Local\... 아래에 만들어진다. 개발 도구와 Docker 이미지를 쌓다 보면 이 파일이 수십 GB로 불어나 C: 드라이브를 압박한다. 이 글에서는 처음부터 다른 드라이브에 설치하는 --location,…

Continue ReadingWSL 배포판을 다른 드라이브에 설치하기

C++ 예제로 배우는 소프트웨어 설계 기법 (9) — 메뉴 이벤트 처리(Menu Event)

8편에서 만든 메뉴 시스템은 항목을 선택하면 command()가 불리는 데서 끝났다. 실제 프로그램에서는 "Save를 선택하면 문서를 저장한다"처럼 메뉴 항목과 애플리케이션의 동작을 연결해야 한다. 그런데 메뉴는 라이브러리 쪽 코드이고 문서는 애플리케이션 쪽…

Continue ReadingC++ 예제로 배우는 소프트웨어 설계 기법 (9) — 메뉴 이벤트 처리(Menu Event)

C++ 예제로 배우는 소프트웨어 설계 기법 (10) — 컨테이너 설계(Container)

스택이나 리스트 같은 컨테이너는 원소 타입과 무관하게 같은 알고리즘을 쓴다. 문제는 "아무 타입이나 담는다"를 어떻게 표현하느냐다. C는 void*, Java는 모든 클래스의 공통 기반 Object, C++은 템플릿을 쓴다. 방식마다 타입 안전성,…

Continue ReadingC++ 예제로 배우는 소프트웨어 설계 기법 (10) — 컨테이너 설계(Container)

C++ 예제로 배우는 소프트웨어 설계 기법 (11) — 반복자(Iterator)

10편의 컨테이너들은 원소를 담는 방식이 저마다 다르다. 연결 리스트는 노드 포인터를 따라가고 배열은 인덱스를 늘려 가므로, 내부 구조를 그대로 공개하면 컨테이너를 바꿀 때마다 순회 코드도 고쳐야 한다. 반복자(Iterator) 패턴은 내부…

Continue ReadingC++ 예제로 배우는 소프트웨어 설계 기법 (11) — 반복자(Iterator)

C++ 예제로 배우는 소프트웨어 설계 기법 (13) — 플러그인(Plug-in)

5편의 자기 등록 팩토리는 새 도형 파일을 추가해도 기존 코드를 고치지 않았지만, 프로그램은 다시 빌드해야 했다. 플러그인(Plug-in)은 여기서 한 걸음 더 나아가 이미 배포된 호스트 프로그램에 공유 라이브러리(.so)를 실행 중에…

Continue ReadingC++ 예제로 배우는 소프트웨어 설계 기법 (13) — 플러그인(Plug-in)

C++ 예제로 배우는 소프트웨어 설계 기법 (12) — 애플리케이션 프레임워크(Application Framework)

작은 도구를 여러 개 만들다 보면 main마다 설정 읽기, 로그 초기화, 종료 정리 같은 코드가 똑같이 반복된다. 애플리케이션 프레임워크(Application Framework)는 이 뼈대와 main을 프레임워크 쪽이 가져가고, 사용자는 클래스 하나를 상속해…

Continue ReadingC++ 예제로 배우는 소프트웨어 설계 기법 (12) — 애플리케이션 프레임워크(Application Framework)

C++ 예제로 배우는 소프트웨어 설계 기법 (14) — 알림 센터(NotificationCenter)

9편의 리스너와 핸들러는 메뉴 항목처럼 이벤트를 보내는 객체에 직접 등록해야 했다. 배터리 부족이나 테마 변경처럼 발신자가 하나로 정해지지 않거나, 수신자가 발신자 객체에 접근할 수 없는 이벤트에는 맞지 않는다. iOS·macOS의 NSNotificationCenter는…

Continue ReadingC++ 예제로 배우는 소프트웨어 설계 기법 (14) — 알림 센터(NotificationCenter)