김성일 작가님께서 개발하신 은퇴생활비 계산기에 대한 유투브와 블로그 링크를 공유합니다. https://www.youtube.com/watch?v=bHL2XSc5-tY https://m.blog.naver.com/ksi0428/223658953592 은퇴생활비 계산기 (무료. 엑셀제공) 2024.11.13요즘 명예퇴직이나 권고사직 하는 회사들이 많이 보입니다. 아무런 준비없이 갑작스런 은퇴로 생활비를 어...blog.naver.com
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..