Visual studio code 편집기 폰트 설정하기 본 글에서는 Visual studio code(VScode) 편집기에서 사용되는 폰트를 변경하는 방법에 대해 설명한다. 본 글에서 사용된 환경은 다음과 같다. 윈도우즈 10 프로 Visual studio code(VScode) 1.41.1 Visual studio code(VScode) 에서 "File" → "Preferences" → "Settings" 메뉴를 선택하여 설정 창을 연다. 설정 창 내 좌측 메뉴에서 "Text Editor" → "Font" 메뉴를 선택하여 폰트 설정 구역으로 이동한다. Font Family, Font Ligatures, Font Size, Font Weight 항목을 설정할 수 있다. Font Family 설정 본 항..
텔레그램 다운로드 경로(폴더) 및 자동 다운로드 기능 설정 본 글에서는 텔레그램 메신저 상에서 파일, 사진 등의 다운로드 경로를 변경하는 방법과 자동 다운로드 기능을 끄거나 켜는 방법을 소개한다. 사용된 환경은 다음과 같다. 윈도우즈 10 프로 윈도우즈용 텔레그램 데스크탑 2.1.1 버전 텔레그램은 기본 설정 상, 대화방에서 상대방이 파일이나 사진을 업로드하면 해당 파일 및 사진이 내가 클릭하지 않아도 기본 다운로드 폴더에 자동으로 다운로드 된다. 텔레그램을 설치하면 기본 다운로드 폴더는 C:\Users\{사용자 이름}\Downloads\Telegram Desktop으로 설정되며, 자동 다운로드 기능이 기본적으로 활성화 되어 있다. 다운로드 경로(폴더) 변경 1. 텔레그램 메신저 창의 좌측 상단의 메뉴 ..
도커(Docker) : 포트 포워딩 설정(포트 맵핑)하기 본 글에서는 도커 컨테이너 내부에서 동작하는 서버로 컨테이너 외부에서 접속할 수 있도록 포트 포워딩(Port forwarding) 설정 또는 포트 맵핑(Port mapping)하는 방법을 소개한다. NAT가 적용되는 도커 컨테이너 도커 컨테이너를 실행하면 기본적으로 NAT(Network Address Translation) 환경이 적용된다. 도커 컨테이너가 실행되는 호스트 시스템에 NAT 기능이 구동되며, 도커 컨테이너는 네트워킹을 위해 NAT 내부 망 IP 주소를 할당받게 된다. 다음 화면은 도커 컨테이너에서 네트워크 인터페이스의 정보를 확인한 화면이다. root@5f26874d8117:/workspace# ifconfig eth0 Link en..
본 글에서는 구글맵을 이용하여 특정 지점의 GPS 좌표(경도, 위도)를 확인하거나, 특정 GPS 좌표를 갖는 지점을 지도 상에서 확인하는 방법을 소개한다. 구글맵 상 특정 지점의 좌표(위도, 경도) 확인하기 구글맵 상에서 특정 지점의 좌표를 확인하는 방법은 매우 간단하다. 웹 브라우저 상에서 구글맵 사이트(https://www.google.co.kr/maps)에 접속한 다음, 좌표를 알고 싶은 지점을 지도 상에서 클릭한다. 지도 상에서 원하는 지점을 클릭하면 화면 하단에 네모난 팝업 창이 생성되며, 해당 창에 간략한 주소와 위도(Latitude), 경도(Longitude) 값이 출력된다. 다음 그림은 구글맵에서 태평역을 클릭한 화면이다. 화면 하단 팝업창에 좌표 값이 표시된 것을 확인할 수 있다. 구글맵..
리눅스에 CMake 설치하기 본 글에서는 리눅스에 CMake를 설치하는 방법을 소개한다. Ubuntu 리눅스에서 CMake를 설치하는 방법은 다음과 같은 두가지 방법이 있으며, 본 글에서는 아래 두가지 방법을 설명한다. apt 와 같은 패키지 업데이트 유틸리티를 사용하는 방법 소스코드를 다운로드하여 직접 설치하는 방법 본 글에서 사용된 실행 환경은 다음과 같다. Ubuntu 리눅스 버전 : 18.04.2 LTS 64비트 1. apt 를 이용한 CMake 설치 다음과 같이 apt install cmake 명령을 이용하여 설치하면 3.10.2 버전이 설치된다. $ sudo apt install cmake .... .. .. $ cmake --version cmake version 3.10.2 CMake su..
본 글에서는 윈도우즈 10(프로)에서 방화벽의 설정을 변경하여 특정 포트로 수신되는 네트워크 트래픽을 허용하는 방법에 대해 설명하고자 합니다. 1. 윈도우 키 + "I" 키를 눌러 "설정" 창을 띄운 후, "네트워크 및 인터넷"을 선택합니다. 2. "네트워크 및 인터넷" 창에서 "Windows 방화벽"을 선택합니다. 3. "방화벽 및 네트워크 보호" 창에서 "고급 설정"을 선택합니다. 4. "고급 보안이 포함된 Windows Defender 방화벽" 창의 좌측 메뉴 중 "인바운드 규칙"을 클릭합니다. 5. 우측 작업 영역에서 "새 규칙..."을 클릭하면 "새 인바운드 규칙 마법사" 창이 실행됩니다. 6. "새 인바운드 규칙 마법사" 창에서 "포트" 라디오 버튼에 체크 후 "다음" 버튼을 클릭합니다. 7...
도커(Docker) : 공유 디렉토리(폴더) 연결하기 본 글에서는 도커 컨테이너를 구동하는 로컬 호스트 시스템과 도커 컨테이너 간에 공유 디렉토리(폴더)를 연결(마운트)하는 방법을 설명한다. 기본적으로, 도커 컨테이너가 종료되면 그 동안 발생한 컨테이너 내부의 변경사항이 모두 손실된다(도커 이미지로 커밋하지 않는 이상). 따라서, 변경사항이 저장될 수 있도록 로컬 호스트 시스템의 디렉터리를 도커 컨테이너 내부에 마운트한 공유 디렉토리 상에서 작업을 수행하는 경우가 많다. 다음과 같이 "-v" 또는 "--volume" 옵션을 추가하여 도커 컨테이너를 실행하면 공유 디렉터리를 연결할 수 있다. host system directory : 공유하고자 하는 호스트 시스템 디렉토리 절대 경로 container di..
본 글에서는 VScode(Visual Studio code)에서 행 단위가 아닌 열 단위로 편집 영역을 선택하는 방법을 설명한다. 본 글에서 사용된 VScode의 버전은 다음과 같다. VScode 1.41.1 (2019-12-18) (Windows) 일반적으로 VScode와 같은 편집기에서 마우스 좌클릭 후 드래그를 하면 편집 영역이 행 단위로 선택된다. 일반적으로 사용되는 행 단위 편집 영역 선택 하지만 경우에 따라 행 단위가 아닌 열 단위로 영역을 선택하여 편집하고 싶은 경우가 있다. 프로그래밍을 하다 보면 여러 행에 걸쳐 작성된 동일한 내용을 열 단위로 선택하여 한 번에 수정하는 것이 훨씬 편리한 경우가 있기 때문이다. 여러 행에 걸쳐 작성된 일부 영역을 열 단위로 한번에 수정 VScode에서는 다..
CLion은 IDE 창 내에서 사용할 수 있는 터미널 기능을 제공한다. 아래와 같이 편집창 하부에 터미널 창을 열어서 각종 작업을 수행할 수 있다. (창의 위치는 변경 가능하며, 편집창과 동일하게 독립적인 창으로 분리할 수도 있다) 현재 진행 중인 프로젝트에서는, CLion을 이용해서 코드를 작성하고 터미널 창(리눅스 도커 실행)에서 빌드를 수행하고 있다. 종종 스크립트를 수정하기 위해 vi 에디터를 사용하는데, 편집 후 저장을 하고 vi 에디터를 빠져 나오려면 Escape(ESC) 키를 눌러야 한다. 그런데, CLion의 터미널 창은 기본적으로 Escape(ESC) 키가 편집창으로 포커스를 전환하는 기능에 대한 키로 지정되어 있어, 터미널에서 실행중인 쉘에 ESC 키 입력이 전달되지 않는다. 즉, vi..
리눅스 프로그램에서 시그널(인터럽트) 처리 방식이 아닌 쓰레드 방식의 타이머를 사용할 수 있다. 쓰레드 방식의 타이머를 사용할 경우, 타이머 만기 시에 해당 이벤트를 처리할 수 있는 쓰레드가 생성되므로, 해당 쓰레드(=타이머 만기 처리루틴) 내에서 뮤텍스 등 프로세스 컨텍스트에서만 허용되는 지연 발생 동작을 수행할 수 있다는 장점이 있다. 타이머를 생성하기 위해 timer_create() 호출 시, 인자로 전달하는 sigevent 구조체의 sigeve_notify 변수의 값을 SIGEV_THREAD로 설정함으로써 쓰레드 기반의 타이머를 사용할 수 있다. 이 경우 타이머 만기 시마다, sigevent 구조체의 sigeve_notify_function 변수에 연결된 쓰레드 함수를 수행하는 쓰레드가 생성되며,..
리눅스에서 타이머 파일 디스크립터를 이용하여 쓰레드 기반의 타이머 이벤트 처리 기능을 구현할 수 있다. 타이머에 대한 파일 디스크립터를 생성한 후, 해당 파일 디스크립터를 읽거나 폴링함으로써 타이머 이벤트를 획득하여 처리할 수 있다. 사용되는 함수는 timerfd_create(), timerfd_settime(), read()이다. 대략적인 절차는 다음과 같다. 1. timerfd_create() 함수를 호출하여 타이머 파일 디스크립터를 생성한다. 2. timerfd_settime() 함수를 호출하여 타이머 만기 주기를 설정한다. 3. 루프를 돌면서 read() 함수를 호출하여 타이머 이벤트를 처리한다. read() 함수 호출 시 블록되며, 타이머 만기 시점이 되면 리턴된다. 타이머를 설정할 때, 최초 ..
어플리케이션을 개발하다 보면, 어플리케이션의 실행을 반복하면서(실행과 종료를 반복) 테스트하고 싶은 경우가 있다. 리눅스에서 이러한 작업이 필요하여, 다음과 같은 두 개의 스크립트 파일을 만들어 테스트를 진행해 보았다. 어플리케이션 실행용 쉘 스크립트 : 주기적으로 어플리케이션이 실행 중인지 여부를 확인하여 실행 중이 아닐 경우 어플리케이션을 실행한다. 어플리케이션 종료용 쉘 스크립트 : 주기적으로 어플리케이션이 실행 중인지 여부를 확인하여 실행 중일 경우 어플리케이션을 종료한다. 어플리케이션 실행용 쉘 스크립트는 다음과 같이 만들었다. 루프를 돌면서 2초마다 my_app이라는 어플리케이션이 실행 중인지를 확인하여, 실행 중이 아니면 실행한다. #!/bin/sh while : do echo "Check ..
Git에서 브랜치를 변경하려고 git checkout 명령을 입력하였더니 아래와 같은 에러가 발생하였다. error: packfile .git/objects/pack/pack-7765263443e82381c8090bcc3f4132f0e62fe895.pack claims to have 679 objects while index indicates 769 objects 해당 브랜치에서 아직 commit 하지 않고 Stash 해 놓은 변경 코드가 있었기 때문에, 공포를 느꼈다... 다행히 구글링을 통해 다음과 같이 해결하였다. 1. 일단 프로젝트 디렉토리를 백업한다. (다른 경로에 복사해 놓는다) → 최악의 상황을 방지하기 위해. 2. 에러가 출력된 각 pack 파일들에 대해 다음 명령을 실행한다. mv .gi..
본 글에서는 구글 번역 싸이트를 이용해서 문서 파일(docx, pdf, pptx, xlsx 파일)을 번역하는 방법을 설명한다. 구글 검색에서 "구글 번역"으로 검색한다. 검색된 Google 번역 싸이트로 이동한다. "문서" 버튼을 클릭하여 문서 번역 화면으로 이동한다. "컴퓨터에서 찾아보기" 버튼을 클릭하고 번역할 문서를 선택한다. 파일의 업로드가 완료되면 "번역" 버튼을 클릭한다. 번역이 시작되면 다음과 같이 "번역 중"으로 표시된다. 번역이 완료되면 "번역 다운로드" 버튼이 생성된다. "번역 다운로드" 버튼을 클릭하여 파일을 다운로드한다. 다음과 같이 번역된 것을 확인할 수 있다.
nanosleep()은 특정 시간 동안 프로세스/쓰레드를 재우는데(동작을 멈추는데) 사용된다. 개인적으로는 지금까지 마이크로초 단위의 함수인 usleep()을 많이 사용했는데(sleep() 함수가 초단위라서 너무 긴 경우에), 이번 기회에 nanosleep()으로 변경하게 되었다. 찾아보니, usleep() 대신 nanosleep()을 쓰는게 좋은 듯 하고 특히 nanosleep()은 POSIX 함수라고 한다. 인자로 단순히 마이크로초 단위의 시간값을 전달해 주는 usleep() 함수에 비해 nanosleep() 함수의 사용법이 아주 조금 더 복잡하긴 하지만, 사용하기 어려운 수준은 아닌 듯 하다. nanosleep()의 함수 원형은 다음과 같다. #include int nanosleep(const st..
CMake에서 링커 옵션을 지정해 주고자 할 경우 target_link_options() 커맨드를 사용할 수 있다. 특정 링커 옵션을 지정하고자 할 경우, 해당 링커 옵션을 다음과 같이 target_link_options() 커맨드 내에 그대로 적어주면 된다. target_link_options( [linker option]) 다음은 hello.c 파일을 빌드할 때 "-Wl,--hash-style=gnu -Wl,--as-needed"라는 링커 옵션을 주는 CMakeLists.txt 파일의 예시이다. set(TARGET_APP hello) add_executable(${TARGET_APP} hello.c) target_link_libraries(${TARGET_APP} PRIVATE pthread) tar..