jckim1988의 등록된 링크

 jckim1988로 등록된 네이버 블로그 포스트 수는 45건입니다.

c-언어 strcpy, strncpy 차이점과 사용상 주의 [내부링크]

변수에 문자열을 복사할 때 가장 많이 사용하는 함수가 strcpy이다. "str"로 시작하는 함수들은 문자열을 처리한다고 보면 되고, NULL 값이 마지막 종료점이 된다는 것을 기억하자. 문자열 복사에 사용되는 두 함수의 원형 타입은 다음과 같다. #include <string.h> char *strcpy(char *dest, const char *src); char *strncpy(char *dest, const char *src, size_t n); strcpy는 src 주소에 있는 string 값을 dest 주소에 NULL 문자까지 복사하고, dest의 주소를 반환해 주는 함수이다. dest의 메모리가 src에 NULL이 나올 때까지의 크기 보다 커야 한다. dest의 크기를 체크하는 부분이 없으므로 메모리 overrun을 조심하여야 한다. strcpy 함수는 아래와 같이 아주 간단하게 구현을 할 수 있다. char *strcpy(char *dest, const char *sr

c-언어 메모리 값 비교하기 - strcmp, memcmp [내부링크]

프로그램 작성을 할 때는 man page나 API 문서를 읽어 두는 것이 도움이 된다. 프로그램은 메모리에 대한 처리라고 보면 되기 때문에, 메모리 data에 대한 비교 함수들은 어떤 것이 있는지 알아 두는 것이 좋다. 문자열 관련된 함수는 str로 시작하는 함수를 사용한다는 것을 기억하고, 범위가 지정되지 않는다면 NULL 문자가 종료 조건이라는 것을 기억하자. strcmp는 종료 조건이 있기 때문에, 비교할 size를 매개변수로 넣지 않는다. 특정 영역까지의 비교에는 다른 함수인 strncmp 제공한다. 물론 size가 매개 변수로 사용된다. linux man page에 제공된 기본형이다. NAME strcmp, strncmp - compare two strings SYNOPSIS #include <string.h> int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size

c-언어 동적 메모리 사용 - malloc, free [내부링크]

프로그램 작성 시 메모리에 관련된 내용들은 잘 숙지하고 사용하여야 한다. 동적 메모리라고 필요에 따라 메모리를 할당받아 사용하는 방법을 알아보자. 특히 임베디드 시스템의 경우 stack 메모리 크기를 컴파일 시 fix 하기 때문에 함수에 큰 변수 선언 시에는 메모리 crack이 발생할 수 있기 때문에, 큰 메모리의 경우에는 할당 후 사용 반납하는 것이 유리하다. 동적 메모리의 경우에는 프로그램 동작 중에 필요한 만큼 할당받아 사용할 수 있다. 동적 메모리 할당에 기본적인 함수들이다. 사용을 위하여 할당받는 것과, 사용 후 반납하는 함수이다. malloc의 size 만큼의 메모리가 확보가 되면 해당 주소를 return 해 준다. 반환 값이 void * 형이므로 어떠한 포인터에 할당을 하여도 된다. 주의할 점은 할당받은 메모리의 값은 쓰레기 값이라는 것을 기억하자. 초기화를 위하여서는 memset이나 bzero를 사용하면 된다. 아래는 가장 간단한 프로그램이다. #include <std

제네시스 키 종류 및 사용 방법(스마트키, 스마트카드 키, 카드 키, 비상 키, 디지털키) [내부링크]

제네시스 차량을 보면 옛날과 다르게 사용할 수 있는 키 종류가 많이 있습니다. 어떻게 사용하는지 언제 사용하는지에 대해서 정리해 두는 것도 좋을 것 같네요. 1. 스마트키 가장 보편적으로 사용되는 키이며, 기본입니다. 차량의 원격 주차를 위하여서는 꼭 소지하여야 하지만, 그 외에는 주머니에만 있죠. 덩치가 있어 수류탄이라도 하죠. 2. 스마트카드 키 버튼을 제외하면 스마트키와 사용법은 동일합니다. 작아서 휴대하기가 편하죠. 원격 주차 기능을 사용하지 않는다면 최상입니다. 추가 구매와 가격, 등록 방법은 아래 링크 참조하시면 됩니다. 등록은 블루핸즈 가셔야 하고, 등록 시 요금 지불하여야 합니다. (스마트카드 키 등록 26,400원 지불했습니다.) 에디토리얼 커머스 제네시스 부티크 고객의 일상 가까이서 제네시스가 지향하는 삶의 방식을 공유하고 가치 있는 것들을 발굴하여 고객에게 전달하는 온라인 편집숍입니다. shop.genesis.com 3. 카드 키 핸드폰의 디지털키를 사용하지 못하

Jesus Loves Me - Whitney Houston [내부링크]

오래전 영화죠. 보디가드라는 영화에서 휘트니 휴스턴이 불렀었죠. 케빈 코스트너가 멋지게 나왔었죠. 영화 속에서 부른 노래가 인상에 많은 남은 곡입니다. Yes Jesus loves me 날 사랑하심 For the Bible tells me so 성경에 써있네 (Tells me so) 써있네 So (Tells me so) 써있네 Jesus loves me! This I know 날 사랑하심 For the Bible tells me so 성경에 써있네 Little ones to Him belong 예수님의 자녀 They are weak but He is strong. 우리들은 약하나 그는 강하도다. Yes, Jesus loves me! 날 사랑하심 Oh, Yes, Jesus loves me! 날 사랑하심 Yes, Jesus loves me! 날 사랑하심 For the Bible tells me so 성경에 써있네 (Tells me so) So glad It does. 기쁘게 하시네. P

(제네시스) 카드 키 등록 하기 [내부링크]

갑자기 카드 키가 동작을 하지 않아, 다시 재설정을 하여야 하는데 주의 사항을 정확히 인지 하지 못해 고생했네요. 아이폰 사용자는 카드 키 등록을 할 수 없습니다. 현재 G80은 디지털 키 1만 지원하고 있어 사용 하실 수 없습니다. 카드 키는 스마트폰 키가 설정된 이후 설정이 가능합니다. 2. 안드로이드 핸드폰을 준비 하셔야 합니다. 차량 소유자 명의로 가입된 핸드폰으로 진행합니다. 3. MY GENESIS 앱을 설치 하시고 차량 등록을 합니다. 저는 아이폰 사용자라 USIM을 안드로이드폰에 장착하여 진행을 했습니다. 4. MY GENESIS앱에 차량 등록. 안드로이드폰 설정에서 NFC 검색 후 기본 모드 선택 5. 디지털 키 - 스마트폰 등록 차량 탑승 후 시동을 걸고 등록합니다. MY GENESIS앱 -> [디지털키 메뉴] -> 등록 시작 -> 무선충전 패드에 올려주세요. 차량의 인포테인먼트 화면에서 [설정] -> [차량] -> [디지털 키] -> [스마트폰 키] -> [등록]

2024년 자동차세 연납 할인율 및 계산법 [내부링크]

2024년 1월도 중순이 지났네요. 자동차세 연납 고지서가 집으로 왔는데, 올해는 할인율이 많이 낮아졌네요. 연납은 6월, 12월에 부과되는 자동차세(16일 ~ 31일 납부)를 미리 낸 경우 할인을 해 주는 제도입니다. 올해 할인율과 신청 가능한 달 그리고 할인율 정리 1월 연납 신청 납부 (1월 16일 ~ 1월 31일) 4.6% 3월 연납 신청 납부 (3월 16일 ~ 3월 31일) 3.8% 6월 연납 신청 납부 (6월 16일 ~ 6월 31일) 2.5% 9월 연납 신청 납부 (9월 16일 ~ 9월 30일) 1.3% 납부해야 할 자동차세 계산법은 다음과 같습니다. 납부하고자 하는 차의 최초 등록일과 배기량을 기준으로 계산이 이루어집니다. 먼저 자동차 연령을 계산하는 법을 알려 드리겠습니다. 최초 등록일은 차량등록증에 보면 제일 위 부분에 있습니다. 차량등록증의 제원을 보시면 배기량이 나옵니다. 차량 연령의 기준은 최초 등록일 기준입니다. 상반기 (1 ~6월), 하반기 (7 ~ 12월)

(c-언어) if else에서 else 먼저 처리하고 return 문 사용하기 [내부링크]

프로그램을 구현하다 보면 indentation이 한없이 들여 쓰게 되는 경우가 많이 발생을 한다. 모니터가 커지고 해상도가 높아지고, 또한 편집기도 좋아져서 한눈에 보기에 어렵지 않지만, 가능하면 보기 좋고 읽기 편한 코드를 만드는 것이 디버깅하기에도 편하다. 아래는 공개된 소스 중 일부를 발췌한 것이다. NRF SDK의 mqtt_decoder.c 파일의 일부다. uint32_t unpack_uint16(uint16_t * p_val, uint32_t buffer_len, uint8_t * const buffer, uint32_t * const p_offset) { uint32_t err_code = NRF_ERROR_DATA_SIZE; if (buffer_len > (*p_offset)) { const uint32_t available_len = buffer_len - (*p_offset); MQTT_TRC(">> %s BL:%08x, B:%p, O:%08x A:%08x", __f

(c-언어) switch case 범위 지정하여 사용하기 [내부링크]

C언어에서는 표준적으로 switch 문에서는 case label에 정수 상수만 사용할 수 있습니다. 그러나 GCC(GNU Compiler Collection)에서 제공하는 확장 기능을 사용하면 범위를 지정하여 사용을 할 수 있습니다. GCC 확장 문법은 아래와 같이 case low ... high: 형식을 사용합니다. GCC Extension을 사용한 switch case 문 범위 지정 예제 GCC Extension을 사용하여 16진수 변환을 위한 문자를 돌려주는 함수를 구현해 보겠습니다. #include <stdio.h> char int2hex_char(int val) { switch (val) { case 0 ... 9: return (val + '0'); case 10 ... 16: return (val - 10 + 'A'); default: printf("value error\n"); return 0; } } int main(int argc, char **argv) { int

nRF52 개발 환경 Segger Studio pre build 등록 방법 [내부링크]

Nordic nRF52계열 칩은 저전력으로 동작하는 칩으로, 참 매력적인 칩이다. 해당 칩을 이용하여 개발을 하려면 통합 환경은 Seffer Studio를 사용하게 된다. Segger Studio에서 제공하여 주는 Pre-Build Command에 대하여 알아보려고 한다. 현재 상황은 다음과 같은 기능을 구현하려고 한다. 1. 필요 목적 생성된 바이너리의 이력 관리. 2. 이력 관리 방법 특정 파일에 빌드가 되면 자동으로 시간 정보를 저장하는 변수 선언 및 값 설정 3. 항상 빌드 될 수 있도록 하기 위하여. 해당 파일의 object을 빌드 하기 전에 삭제 4. Segger Studio -> Project -> Options 선택 5. Code -> User Build Step 선택 항목에 대한 자세한 내용은 다음 링크에서 User Build Step을 확인하면 된다. Embedded Studio Code Options - SEGGER Wiki Embedded Studio Code

수원 스타필드 오픈런 주차, 핫플레이스, 음식점 정보 [내부링크]

최근에 오픈한 수원 스타필드 다녀왔습니다. 첫 주말이라 교통 혼잡을 감수하고 오픈런을 하였는데 다녀온 내용 올립니다. 1. 주차 정보, 주변 교통 통제 확인 네이버 위성 사진이 옛날 것 밖에 없네요. 방향감만 잡으시기 바랍니다. 주차요금 6시간 무료, 6시간 초과 시 10분당 500원 하루 최대 18,000원 화살표 방향으로 진입을 하였습니다. 오픈런이라 교통통제하는 사거리부터 막히기 시작합니다. 주의) 차가 잘 빠지는 1차로로 주행하시면 공사 구간 왼편으로 빠져 다시 U턴해서 돌아와야 하는 사태가 발생합니다. 조금 더디더라도 인도에 가까운 2개 차로로 진행을 하십시오. 저는 제일 가 쪽 차선으로 주행을 하여, 정문 주차장으로 진입을 하였습니다. 정문 주차장은 B5 ~ B8층으로 바로 내려갑니다. 팁) 빈자리 개수 파악하셔서 내려가시고 엘리베이터 가까운 곳에 주차 가능 대수가 많은 곳은 피하시기 바랍니다. 장애인, 경차 주차 구간이라 자리가 없습니다. 저는 한 바퀴 돌았습니다. 2.

(c-언어) 메모리 덤프(memory dump) 구현 [내부링크]

특정 메모리나 값을 화면에 출력하고 싶을 때가 있다. 아래와 같은 형태로 출력하는 함수를 구현해 보자. 1. 출력 형식을 정한다 ADDR 8Bytes 출력 구분자(|) 8 Bytes 출력 구분자(|) 스트링 출력 ADDR 16진수 배수로 되는 주소 출력 8Bytes 출력 Address에 맞게 출력 구분자 (|) 8Bytes 구분을 위하여 표시 8Bytes 출력 뒷부분 주소에 맞게 출력 구분자 (|) hex 출력과 string 출력 구분 스트링 출력 출력 가능한 스트링 문자 출력 출력이 불가한 경우 . 으로 표시한다. 2. 다음 API 형식으로 입력을 받는다. void make_hex_str(int start, int end, char *data, char *hex, char *str) start : 16진수 주소의 시작 주소 end : 16진수 주소의 종료 주소 data: 출력할 data의 pointer hex : hex 값으로 출력을 저장할 buffer (8bytes + 구분자 +

106853c3ca134b7aa3a9e7da479f6b0c [내부링크]

네이버 글은 구글에서 검색이 되지 않는다. keyzard라는 사이트가 있는데, 해당 사이트를 통해 우회하여 글을 등록하여야 한다. 회원 가입을 하면 아래와 같이 네이버 블로그 등록 조회를 등록할 수 있다. 네이버 블로그 구글 검색 등록을 선택하면 연동 id를 위한 글을 등록하라고 다음과 같은 안내 창이 뜬다. 이 글의 제목처럼 연동코드로 제목을 정하고 공개로 등록 후, 글의 주소를 입력하면 된다. 구글에서도 글이 조회될 수 있도록 설정하여 보자.

When I'm gone (Cup song) - Anna Kendrick [내부링크]

2012년에 개봉된 피치 퍼펙트(Pitch Perfect) 영화에 삽입된 곡으로 전 세계에서 따라 한다고 유명했던 노래죠 일명 Cup Song으로도 유명하죠. 주인공인 Ana Kendrick이 노래한 것입니다. 유튜브에 Cup song으로 검색하시면 많이 영상이 나옵니다. 노래를 감상하시려면 1분 10분 이후로 이동하시면 됩니다. I got my ticket for the long way 'round 긴 여정을 위한 표를 구했어 Two bottle o' whiskey for the way 두병의 위스키도 가져가고 And I sure would like some sweet company 좋은 친구들도 있을 거라 확신해 And I'm leavin' tomorrow, what do you say? 내일 떠날 예정이야. 너 어때? When I'm gone 내가 사라지면 When I'm gone 내가 사라지면 You're gonna miss me when I'm gone 내가 사라지면 내가

(제네시스) MY GENESIS 앱 팁 부활한 기능 - 일자별 주행 정보 확인 [내부링크]

작년에 제네시스 앱이 신규로 MY GENESIS로 되면서 기존 앱에서 지원했었던 기능이 빠진 것이 있었습니다. 그중 유용하게 사용하였던 것이 일자별 주행 정보였었죠. 기존 앱이 사용 불가가 되기 전에는 2개의 앱을 사용하였었습니다. 저 기능때문에... 신규 앱이 론칭된 이후 애플스토어에 해당 기능을 요청하는 글이 올라왔었죠. 아직도 앱 사용 가이드의 미리보기를 보면 아래와 같이 등록이 되어 있습니다. 월별 주행거리만 나오는 화면으로 등록되어 있는 것이죠. 최근 MY GENESIS 앱에서는 변화가 있는 것을 확인할 수 있습니다. 인사이트 -> 주행리포트로 이동을 하면. 주행거리 옆에 보시면 달력 모양의 아이콘이 생겼습니다. 해당 아이콘을 클릭하면 달력이 나옵니다. 상단에 보면 해당 달의 주행요약 정보가 나옵니다. 날짜 밑에 점 표시가 있는 곳은 주행한 날이라는 뜻인데, 3일 날 주행기록을 확인하려면 날짜를 탭 하면 아래에 주행한 시간대별로 목록이 나타나는 것을 확인할 수 있습니다. 원

c-언어 배열과 포인터 차이점과 사용하기 [내부링크]

c 언어에서 배열과 포인터는 뗄 수 없는 상관관계가 있습니다. 배열과 포인터를 이해하는데 가장 핵심이 되는 것은.. 배열은 상수이고 포인터는 변수라는 것입니다. 맨 아랫부분까지 보시면 재미있는 내용이 있습니다. 2가지 방법으로 확인을 해 보겠습니다. 1. 먼저, 대입입니다. 상수는 값을 담을 수 없고 변수는 값을 담을 수 있습니다. #include <stdio.h> int main(int argc, char **argv) { char arr[10]; char *p; p = arr; arr = p; } 컴파일을 해 보면 아래와 같이 에러가 발생합니다. 2. 해당 값을 출력해 보는 것입니다. 상수는 주소 연산자를 사용하더라도 값이 변하지 않습니다. 변수의 경우에는 주소와 변숫값이 다릅니다. #include <stdio.h> int main(int argc, char **argv) { char arr[10]; char *p; p = (char *)0x100; printf("\n\n" "t

(제네시스) 무료 제공 서비스 알아보기 [내부링크]

제네시스 차량의 경우 구매 후 무료로 제공되는 서비스들이 많이 존재한다. 서비스의 경우 차량의 출고 연식과 주행거리로 보장이 되니, 꼭 확인을 해 보아야 모든 것을 누릴 수 있다. 커넥티드 서비스의 경우에는 출고부터 5년이 보장되니 꼭 가입하셔서 사용하시기 바랍니다. 내비게이션의 음성 인식이 커넥티드 서비스가 되지 않으면 불가능하기 때문에 거의 모든 사람들이 차량 인도 후 가입하셔서 사용하고 계실 것으로 압니다. 소모품 관련하여 놓치기 쉬운 부분이 있으니 꼭 확인하셔서 모두 다 서비스를 받으시기 바랍니다. 저는 놓친 게 많네요.. ㅠㅠ 먼저 소모품 관련하여서는 기간과 주행거리 2가지 모두 만족하여야 합니다. 3년 이내 주행거리 6만 Km 이내 일 때 제공합니다. 혹 프로모션에 따라 다를 수도 있으니 꼭 홈페이지에서 확인하시기 바랍니다. 다음과 같은 순서로 확인을 하시면 됩니다. 1. 제네시스 공식 웹사이트 접속 후 사람 아이콘을 선택한다. 제네시스(GENESIS) 공식 웹사이트 |

함수 포인터 사용하기 [내부링크]

포인터는 C 언어에 있어 가장 매력적인 부분이다. 물론 모든 예외는 여기서 다 발생하고, 가독성을 떨어뜨리는 부분이기도 하다. 하지만 포인터에 매력에 빠지면 이것 없이는 작업을 할 수 없는 묘한 놈이기도 하다. 함수 포인터는 의외로 많이 힘들어하는 부분이기도 하다. 함수 포인터 선언에 있어 먼저 type이라는 것을 이해해야 한다. 일반적으로 함수는 다음과 같이 이루어진다. (retrun type) + (함수 이름) + (매개변수) 함수 이름은 함수가 시작하는 주소를 가져야 하므로 pointer type으로 생각하여야 한다. 아래는 return 값이 없고 매개변수가 없는 함수에 대한 사용이다. 해당 함수의 type은 void (*)(void) 가 된다. #include <stdio.h> void func_void(void) { printf("void func\n"); } int main() { void (*p)(void); p = func_void; p(); } 함수 포인터 사용이 어

For All My Days - Mary Hopkin [내부링크]

Mary Hopkin의 노래입니다. 날씨가 무지 추운데 오늘 같은 날 이 노래가 생각나는지 모르겠네요. Gospel Song입니다. 가사를 보면 은혜가 됩니다. FOR ALL MY DAYS For all my days in many ways 많은 일들에서 나의 날들을 보면 I'll think of all I've lived to see 살면서 보아 왔던 것들에 대해서 생각해 봅니다 The mountains high, clouds in the sky 산의 높음과 하늘에 있는 구름들.. I thank the Lord for sharing them with me 이 모든 것을 나눠주신 하나님께 감사합니다. The summer's glow, the winter's snow 여름날의 강렬한 빛, 한 겨울의 눈 Are not to me just scenery 나에게 단지 풍경이 아니었습니다. When tree tops sway I long to say 나무 꼭대기가 흔들리는 순가 나는 말하고

알리익스프레스 USB 2TB 메모리의 실상 [내부링크]

알리익스프레스가 대대적인 선전으로 많은 사람들이 물건을 사고 있습니다. 알리익스프레스에서 절대 사지 말아야 할 물건은 USB 2TB 메모리입니다. USB 2TB 메모리로 검색하면 아주 싼 가격에 무지 많이 나옵니다. 배송받아 Windows에서 용량 체크를 해 보면 그 용량만큼 나옵니다. 이건 SCSI Command에 반응하는 용량을 2TB 넘겨주도록 USB Firmware를 수정한 것입니다. 내부 파일 시스템도 2TB로 관리하도록 프로그램 되어 있습니다. 그러나!!!! 실재 물리적 용량은 아주 작아요.. 제가 시험한 메모리는 64GB의 물리 메모리가 있네요. 진짜 물리적 메모리가 2TB 인지 test 프로그램으로 확인을 해 보았습니다. 결과는 다음과 같습니다. 무려 121시간 동안 Copy를 하는데 속도가 겨우 4MB/sec 밖에 안 나옵니다. 마지막으로 write 한 59.8GB 만 정상적입니다. 나머지 4.2GB는 파일시스템 관리용으로 사용된 듯합니다. 64GB가 어디냐고 생각하

WSL 설치 후 SSH 접속 프로그램 사용하기 [내부링크]

가상 머신 사용은 이전까지는 대부분 VirtualBox나 VMWare를 사용하였다. MicroSoft 사에서 적극적으로 Windows의 소스를 Open 해 준 덕분에 WSL이라는 가상 머신을 사용할 수 있게 되었다. windows terminal 형태의 창에서의 작업이 익숙하지 않아, 대중적으로 사용하는 terminal을 사용하고자 한다. WSL ubuntu를 설치하였는데, sshd이 install 되어 있지 않다. sshd를 설치해 보자. 먼저 openssh를 설치하자. sudo apt install openssh-server install이 끝났다면 config 파일을 수정하자 PasswordAuthentication만 yes로 수정하였다. sshd을 재시작 하자 sudo service ssh --full-restart ssh 접속을 위한 WSL 서버의 주소를 확인하자. 현재 WSL 주소는 172.31.52.50으로 되어 있다. MobaXterm을 사용하고 있는데 ssh 접속을

(제네시스) 하부 세차, 노브러쉬 세차 가능한 곳 [내부링크]

겨울철이라 눈이 오니 차량이 생각보다 많이 지저분해지네요. 용인 동백에 있는 하부 세차 및 노브러쉬 세차가 가능한 곳이 있습니다. 흠집이 걱정되시는 분이라면 추천드립니다. 컴인워시 용인 동백점이고 위치는 링크 참조하세요. 네이버 지도 컴인워시 용인동백점 map.naver.com 최근 가격은 꼭 링크에서 확인하시기 바랍니다. 12월 30일 기준 아래와 같습니다. 왼쪽 라인을 따라 올라가셔서 빈 대기선으로 진입하시면 됩니다. 동백점은 3대가 동시에 세차가 가능합니다. 셔터가 있어 얼지 않아 24시간 운영합니다. 진입을 하면 키오스크로 코스 설정과 결재가 가능합니다. 선택하시고 세차 룸이 빌 때까지 대기하시면 됩니다. 겨울이라 셔터가 내려져 있고 앞차가 세차가 완료되면 셔터가 개방됩니다. 하부 세차도 해야 하니 들어가실 때 꼭 천천히 진입하시기 바랍니다. 세차가 완료되면 앞에 또 다른 셔터가 개방이 됩니다. 천천히 따라서 나오시면 들어간 입구 앞을 통과하여 드라이존으로 가실 수 있습니다.

(c-언어) 배열에 String 추가하기 [내부링크]

프로그램을 하다 보면, 배열에 추가적으로 문자열을 이어 붙여야 하는 경우가 많이 생긴다. 기본적으로 string 관련 함수인 strlen, strcat 을 이용한다. 단순 문자일 경우에는 쉽게 strcat을 이용하면 되지만 정형화된 형식으로 추가하고자 한다면 어려워 보이기도 한다. C API에서는 string 출력을 해 주는 sprintf 함수가 있다, 이를 이용하면 간단하게 formatted된 내용을 이어 붙이기 쉬울 것이다. 먼저 man page에서 sprintf를 보면 stdio.h 파일에 원형이 선언되어 있으며, return 값은 int 형식으로 현재 출력된 string의 size를 return 해 준다. (NULL 제외 크기) #include <stdio.h> int sprintf(char *str, const char *format, ...); RETURN VALUE Upon successful return, these functions return the number o

WSL 하드 디스크 추가하기 [내부링크]

wsl은 기본적으로 c driver에 install 된다. 저장용량 전체를 C 드라이브로 할당을 하였다면 별문제가 없으나, 저와 같이 c에는 OS와 프로그램용으로 사용하고 data는 D:, E:로 나누어 사용한다면 wsl 사용이 부담이 될 것이다. WSL은 windows 용 디스크를 mount 하여 사용할 수 있도록 해 주고는 있다. df로 상태를 보면 D:, E: 도 mount 되어 있어 사용이 가능하다. 하지만 해당 디렉터리를 개발 용도로 사용을 한다면 컴파일 시 파일 접근 속도 때문에 속도 저감을 상당히 많이 감수하여야 한다. linux는 개발 용도로 사용하는데 너무 느리면 답이 없다. 속도와 저장 용량을 위하여 linux에서 바로 접근하여 사용할 수 있는 가상 하드 디스크를 만들어 연결해서 사용해 보자. 먼저 windows에 있는 "컴퓨터 관리"를 열어 보자. 돋보기에서 컴퓨터 관리라고 입력하면 바로 실행이 가능하다. 오른쪽에 있는 "디스크 관리" -> "VHD 만들기"를 찾

500 miles - 존바에즈 (Joan Baez) [내부링크]

존 바에즈(Joan Baez)라는 가수를 처음 접한 건, The River in the pines라는 노래로 접했죠. 목소리를 어떻게 형언할 수 없지만, 너무 구슬프고 감미로웠죠. 500 miles라는 노래도 원곡자 보다, 존바에즈(joan baez)가 부른 노래를 듣고 좀 더 좋아하게 되었죠. 가사도 어렵지 않고, 듣기 편한 노래입니다. Joan Baez가 BBC에서 공연한 부분 중에서 발췌되어 나오는 부분입니다. If you missed the train I'm on You will know that I am gone You can hear the whistle blow a hundred miles A hundred miles, a hundred miles A hundred miles, a hundred miles You can hear the whistle blow a hundred miles Lord, I'm one, Lord, I'm two Lord, I'm three, L

WSL 저장 공간 windows에서 Samba 연결하기 (smb) [내부링크]

앞에서 WSL에 하드 디스크를 추가해 주었다. 아래 링크를 참조 하여 하드 디스크를 추가 하시면 된다. WSL 하드 디스크 추가하기 wsl은 기본적으로 c driver에 install 된다. 저장용량 전체를 C 드라이브로 할당을 하였다면 별문제가 없... blog.naver.com 이제 WSL의 저장 공간을 windows에서 볼 수 있도록 하자. WSL에 현재 Ubutu를 install 해 두었으므로 일반적인 samba 공유라고 보면 된다. Ubuntu에서 smbd 설치하는 것과 같은 순서로 진행을 한다. 먼저 smb가 설치되어 있는지 확인을 한다. 설치되어 있지 않으면 아래 명령어로 설치를 한다. sudo apt-get install samba 설치가 완료되면 smb를 접근할 수 있는 계정을 추가한다. 접근이 필요한 계정 설정을 위하여 /etc/samba/smb.conf 파일에 다음을 추가한다. 현재는 /home/jckim 디렉터리를 추가하였다. 하드디스크 추가를 하고 사용을 위하

2진수 출력 함수 with C Program [내부링크]

C 언어의 printf 함수는 현재 2진수 형태로 출력해 주는 format이 존재하지 않는다. Bit 연산 처리를 하다 보면 2진수로 변환이 필요할 때가 많은데 간단하게 작성하여 사용해 보도록 하자. 먼저 해당 bit 값이 1 인지 확인을 하여야 한다. 이를 위하여서는 bit 연산과 shift 연산이 필요하다. 일단 char형의 8bit로 보면 최상위 bit는 1000 0000 (0x80)이고 (입력값) & (0x80) 이 참이면 최상위 bit 값이 1인 되는 것이다. 해당 bit 값에 대응되는 mask값을 차례로 구할 수 있는 함수를 먼저 구현하여야 한다. 간단히 shift 연산자를 이용하여 구현할 수 있다. #include <stdio.h> void test_shift(void) { int i; unsigned char mask; unsigned char shift = 7; for (i = 0; i < 8; i++) { mask = 1 << shift; printf("%d : 0

ntohf, htonf 함수 구현 [내부링크]

tcp/ip의 network endian은 big endian으로 전송할 것을 요구한다. linux system에서는 float 관련 network order 변환 함수를 제공하지 않는다. 전송 data에 float 변수가 있을 때 다음을 활용할 수 있다. float 변수의 경우 4bytes 크기를 가지고 있다. #include <stdio.h> int main(int argc, char **argv) { printf("size of float %ld\n", sizeof(float)); } jckim $ ./ntohf size of float 4 4bytes order를 지원하는 network 변환 함수는 ntohl, htonl 이 있다. 하지만 해당 함수는 int형 값을 이용하기 때문에 소수점 아래 값이 사라진다. float형 값을 int형의 값을 취할 수 있도록 하고 해당 함수를 사용하면 변환이 용이할 것이다. 같은 4bytes 변수를 형만 바꾸어 사용할 수 있는 방법으로 poi

Makefile 작성 - 기본 rule [내부링크]

프로그램 작성 시 파일이 많아지면 command로 컴파일 하기가 어려워진다. 간단한 Makefile을 사고 성하여 컴파일을 쉽게 할 수 있도록 하자. 먼저 Makefile 파일의 가장 간단한 형태를 정의를 알고 가자. GNU make에 대한 내용이 정리되어 있는 곳이니 참조하자. Rule Syntax (GNU make) Next: Types of Prerequisites , Previous: Rule Example , Up: Writing Rules [ Contents ][ Index ] 4.2 Rule Syntax In general, a rule looks like this: targets : prerequisites recipe … or like this: targets : prerequisites ; recipe recipe … The targets are file names, separated by spaces. Wildcard ch... www.gnu.org targets

Makefile 작성 - pattern rule [내부링크]

make의 기본 rule을 보았는데, 이제 target이 되는 object 파일 생성을 위한 rule 정의를 어떻게 할지를 살펴보도록 하자. 기존에는 SUFFIX rule을 사용하였는데, 이제 pattern rule 방식을 사용하도록 권고하고 있다. SUFFIX rule도 사용이 가능하지만 과거에 작성한 makefile을 위하여 지원해 주고는 있다. c언어를 사용하는 입장에서는 . c .o .h 확장자에 대한 rule 정의가 필요하게 된다. .o 파일 생성에 . c 파일을 이용하여 생성하므로 pattern rule로 정의해 보자 %.o: %.c $echo "Add compile rule for c" main.c, func_a.c, func_b.c로 이루어진 run 프로그램을 만드는 makefile을 작성해 보자. jckim $ ls * func_a.c func_b.c main.c Makefile jckim $ cat main.c void func_a(void); void func_b

Makefile 작성 - 함수 사용(wildcard, patsubst..) [내부링크]

makefile을 컴파일 용도로 많이 사용한다. 프로그램을 작성하다 보면 하나의 파일로 모든 것을 해결하는 사람은 극히 드물 것이다. 가능하면 작성한 함수들이 재사용하기 쉽도록 따로 파일로 모아 두는 것이 편할 때가 많다. 프로그램을 작성하다 보면 파일이 늘어나는데 이때마다 Makefile 파일에 object를 추가해야 한다면 귀찮은 부분이 많이 생긴다. 작성하고 있는 파일들을 바로 Makefile 파일에 적용될 수 있도록 구현해 보자. 먼저 파일 목록을 쉽게 가지고 올 수 있는 방법을 찾아보자 make rule에는 함수 wildcard라는 것이 있다. 사용법은 아래 링크에 있다. Wildcard Function (GNU make) Previous: Pitfalls of Using Wildcards , Up: Using Wildcard Characters in File Names [ Contents ][ Index ] 4.4.3 The Function wildcard Wildcard

Makefile 작성 최종 - 함수 사용(foreach, info, notdir, vpath, addprefix) [내부링크]

작은 프로젝트를 수행할 수 있는 Makefile을 이번 포스팅에서 마무리하도록 하겠다. 이전 포스팅에서 현재 디렉터리에 있는 파일들을 object에 추가하여 수행하는 것을 보았다. API를 작성하다 보면 필연적으로 파일이 많아지게 된다. 분류를 위하여서는 디렉터리를 만들게 되는데, 디렉터리를 지정하면 해당 파일들을 object로 가져와서 컴파일 되도록 해 보자. make rule에는 반복을 위하여 foreach라는 함수를 제공한다. 해당 함수를 사용하여 내가 지정한 디렉터리에 있는 파일들을 가지고 오도록 해보자. make에서는 출력을 위한 함수들을 제공하는데 여기서는 info를 사용한다. info를 사용하면 Makefile이 실행될 때 특정 라인에서 결괏값을 볼 수 있다. SRCPATHS=. dir_a SRCS=$(foreach dir, $(SRCPATHS), $(wildcard $(dir)/*.c)) $(info SRCS = $(SRCS)) all: 실행의 결과를 보면 현재 디렉터

CSV 데이터 파싱 [내부링크]

excel 파일과 연계를 위하여 data 저장을 CSV 형식으로 저장을 많이 한다. CSV라는 것은 Comma-Separated Values의 약자로 콤마로 분리되어 있는 값들을 의미한다. 따라서 각 필드의 값은 comma를 기준으로 분리를 하면 된다. comma가 연속적으로 나오면 해당 필드의 값은 존재하지 않는 것이다. 함수 원형을 다음과 같은 형식으로 정의하자. int csv_make_data_pos(char *p, short *csv_data_pos) Parameter 의미 p : char형 String data의 끝은 NULL 또는 LF (line feed 0x0A). csv_data_pos : comma 다음 value 값이 위치하는 offset을 저장할 array. 해당 필드에 value가 없을 경우 -1을 대입한다. return : csv 필드 count. 주의) 입력으로 들어온 data의 값이 변경된다. comma 가 NULL로 대체됨. 먼저 comma가 있는 곳의

log level 지정하여 출력하기 [내부링크]

개발을 하다 보면 피치 못하게 많은 정보를 출력하게 된다. 필요 없는 부분을 전부 #define 으로 묶어 제거를 하면, 향후 상용으로 출시 된 이후 문제점 분석에 어려움을 겪게 된다. 따라서 내부적으로 로그 레벨을 저장해 두고 출시시에는 레벨을 올려 두고, 문제 발생시 해당 레벨 값만 조정하여 출력을 할 수 있어야 할 필요가 있다. 이를 위하여 먼저 로그 레벨을 정의하자. 필요에 따라 더 세분화 하여도 된다. typedef enum { LOG_DEV = 0, LOG_VERVOSE, LOG_INFO, LOG_DEBUG, LOG_ERROR, LOG_NONE } log_level_e; 로그를 출력하는 MACRO를 만들어 보자. 출력을 위하여서는 stdout, stderr있는데 이 2가지는 내부 buffer 사용과 출력 속도에서 차이가 있어 장단점이 있다. stdout : 내부 buffer가 있어 실시간으로 출력이 되지 않지만 프로그램의 부하를 덜 준다. 일반적인 출력으로 사용하면 된다.

(제네시스) 커넥티드카 보험 할인 혜택받는 법 [내부링크]

자동차 보험 가입 특약 중 커넥티드카 보험 할인이라는 신규 항목이 생겼다. DB 다이렉트 보험에 아래와 같이 소개가 되어 있다. (다른 보험사들도 가능하다) 제네시스의 경우 5년 무상으로 커넥티드 서비스가 제공이 되어 가입이 가능한데, 보험사와의 연계가 되어 있지 않아 가입을 하려고 하면 전화를 여러 번 해야 하는 경우가 발생을 한다. 제네시스의 경우 먼저 MY GENESIS라는 앱을 설치하고 가입을 하자. MY GENESIS 앱에서 내가 보험 가입하고자 하는 차를 등록하자. 보험 가입을 하다 보면 보험사에서 개인정보 제3자 제공 동의 가 되어 있지 않다는 이야기를 듣게 된다. 전화로 해결하려다 보면 시간이 많이 지체하게 된다. 다음 순서로 처리하면 된다. 1. 먼저 MY GENESIS 앱을 실행하여 인사이트를 선택한다. 2. 나의 드라이빙 테이터 확인하기 선택 3. 보험 할인 선택 4. 가입하고자 하는 자동차 보험사 선택 (DB 다이렉트로 하자) 5. 개인정보 동의 후 가입이라는

struct timeval 을 이용 경과 시간 구하기 [내부링크]

특정 함수의 동작 시간을 측정하기 위하여서는 짧은 시간을 측정할 수 있어야 한다. 일반적으로 사용하는 time() 함수는 time_t type으로 초 단위의 값을 return 해 준다. 1970년 1월 1일 0시 0분 0초를 기준으로 현재까지 경과한 시간을 초 단위로 저장한 것이다. 주로 달력 시간을 구하거나 긴 시간 측정을 위하여 사용하여 진다. struct tm 구조체로 변환하여 현재 시간을 구하는 용도로 사용된다. 현재 시간을 출력하는 함수는 아래와 같다. #include <stdio.h> #include <time.h> static void print_cur_time(void) { time_t epoch; struct tm r_tm; struct tm *tm; epoch = time(0); tm = localtime_r(&epoch, &r_tm); printf("%04d.%02d.%02d %02d:%02d:%02d\n", tm->tm_year + 1900, tm->tm_mon

VirtualBox에서 VMware 생성 image 사용하기 [내부링크]

개발 환경의 특이성 때문에 가끔 남이 생성해둔 이미지를 사용해야 할 때가 있다. VMware에서 생성한 virtual machine을 VirtualBox에서 사용해 보자. VirtualBox에서 추가로써는 사용이 불가하다. 다음과 같은 차례로 진행한다. 1. VMware에서 생성된 이미지를 특정 디렉터리에 복사한다. 2. VirtualBox에서 새로 만들기를 클릭한다. 3. VMware에서 사용된 종류를 선택한다. 현재 ubuntu 이미지이다. 4. CPU와 메모리는 현재 내 시스템에서 할당하고 싶은 자원을 입력한다. 5. 하드 디스크에 Use an Existing Virtual Hard Disk File을 선택하고 오른쪽 아이콘을 클릭한다. 6. 하드 디스크 선택기가 나오면 추가 버튼을 클릭한다. 7. 처음에 복사해둔 VMware 이지에서 vmdk 확장자 파일을 찾아서 선택한다. 8. 다음과 같이 ubutu 이미지가 생성이 된다. 9. 실행 후 게스트 확장 CD 이미지 삽입 후 실

아이워크 무선 블루투스 이어폰 BTA003 설명서 [내부링크]

IWALK BTA003 무선 블루투스 사용 설명서입니다. 포장은 아래와 같습니다. 제품 구성과 스펙과 간단한 설명. 터치 동작에 따르는 동작 설명. 주변 소리 모드로 전환 시에는 세 번 터치 이후 복귀도 세 번 터치. 가끔 발생하는 쌍방 페어링이 끊어지는 경우 다시 재설정이 난감함. 아래와 같은 방식으로 다시 초기화할 수 있음. BTA003 무선 이어폰 초기화하기 오른쪽/왼쪽 무선이어폰이 서로 연결되지 않고 무선 이어폰 동작 오류가 있을 때 연결된 기기 정보를 모두 지우고자 할 때 1. 오른쪽 /왼쪽 무선 이어폰을 모두 충전 케이스에서 꺼냅니다. 2. 무선 이어폰 좌, 우 터치 컨트롤을 위 그림 1과 같이 8초간 누릅니다. 3. 초기화 모드로 진입하면 무선이어폰 상태 표시등이 화이트로 깜박입니다.(그림 2) 4. 무선 이어폰과 연결되었던 기기의 무선 이어폰 등록을 삭제하시기 바랍니다. 5. 초기화된 무선 이어폰을 충전 케이스에 넣어 활성화 후 블루투스 설정을 하시기 바랍니다.

로봇청소기 앤커 로보백 G10 사용 설명서 [내부링크]

로봇청소기 앤커 로보백 G10 입니다. 포장되어온 박스 이미지입니다. 앤커 로보백 G10을 빨리 사용하고 싶은 사람을 위한 빠른 시작 가이드 입니다. 간단한 팁들을 모아 놓은 것입니다. 앤커 로보백 G10 에 포함되어온 사용 설명서 입니다. 처음 설치 하고 난 이후 다시 설정이 필요 할 때 사용 설명서를 찾지 못해 애를 먹는 경우가 많아 이렇게 올려 두었습니다.

Serial Port 정보 확인 및 변경 [내부링크]

linux 계열 command line에서 terminal 정보 확인 방법 정리. linux에서는 명령어 사용 방법을 모를 경우 man page를 이용하여 먼저 확인을 한다. 명령어 입력창에 다음을 입력한다. man stty stty는 terminal에 대한 정보를 출력하는 것으로 device 명을 주기 않으면 현재 접속되어 있는 console의 정보를 출력한다. terminal의 모든 정보를 보기 위하여 stty -a를 입력하면 현재 접속되어 있는 console의 정보를 표시해 준다. android, cygwin, linux 등은 tty들은 /dev 디렉터리에 연결 파일들이 있으므로 먼저 해당 디렉터리에 생성되어 있는 tty 중 현재 연결되어 사용 중인 파일은 무엇인지 확인한다. 현재 usb to serial로 디바이스와 연결한 링크가 /dev/ttyS2인데 해당 정보를 확인하는 방법은 아래와 같다. stty -a -F /dev/ttyS2 stty -a < /dev/ttyS2 현재

Serial Port Program (C 언어) [내부링크]

C언어로 작성한 serial port 제어 프로그램이다. 먼저 serial port를 구성에 맞는 형식으로 open 을 하여야 한다. 매개 변수로는 디바이스의 파일 링크와 serial port의 속도를 전달한다. #include <termios.h> #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> int open_serial_device(char *path, int baudrate) { int fd; int ret; speed_t speed; /* Check Baudrate */ { speed = get_baudrate(baudrate); if (speed == INVALID_BAUD) { printf("Invalid baudrate %d\n", baudrate); return -1; } } /* open seri

Multi Thread 생성 [내부링크]

Serial device의 경우 속도가 느려 해당 device의 내용을 읽고 쓰다 보면 process가 전체적으로 속도가 느려지게 된다. Serial device의 read, write는 가능하면 thread에 할당 하여 처리 하는 것이 좋다. 간단한 multi thread 생성 방법과 컴파일 방법을 알아 본다. multi thread는 posix thread 방식으로 생성하는 것이 여러 시스템에 사용하기에 용이 하다. thread 생성의 기본 함수는 다음과 같다. int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); linux 시스템에서는 항상 함수에 대하여 정보가 필요할 경우 man page를 참고 하기를 권한다. man pthread_create man page 를 보면 친절하게 include 하여야 할 header file도 같이 보

내부 IPC를 위한 socketpair 함수 사용 법 [내부링크]

이전 글에서 multi Thread 생성에 대하여 이야기를 하였는데, 해당 함수는 thread 생성에만 초점을 맞춘 내용이었다. Multi Thread 생성 Serial device의 경우 속도가 느려 해당 device의 내용을 읽고 쓰다 보면 process가 전체적으로 속도가 느... blog.naver.com 실제적으로 동작 확인을 위하여 각 thread 별로 현재 시간을 출력하도록 해 보자. 현재 시간을 출력하는 함수는 다음과 같이 구현할 수 있다. misc.c 파일로 저장하자. 시간을 다시 사용하기 가능하도록 buf에 값을 넣어 줄 수 있도록 구현한다. #include <stdio.h> #include <time.h> #include <sys/time.h> void print_cur_time(char *buf, char newline) { time_t epoch; struct timeval tv; struct tm r_tm; struct tm *tm; epoch = time(

BIT 추출 MACRO [내부링크]

MCU 작업을 하다 보면 메모리 절약을 위하여 byte를 나누어서 사용하여야 할 경우가 많이 생긴다. 이때 bit 작업을 해야 하는 경우를 위하여 간단한 macro를 사용하는 것이 편리하다. 물론 struct에 bit 단위로 선언을 하여 작업하는 것도 하나의 방법이다. 차량용 CAN Protocol 작업 시에는 비트 operation이 필수 불가하다. 먼저 data에서 특정 bit 값만 추출하는 경우부터 시작하자. Data 의 특정 비트 bit 값을 추출한다고 보면 bit 순서 7654 3210 특정 값) 1001 0101 에서 3 ~ 5번째 bit 값을 추출하려면 - 3번째 앞까지는 필요 없으니 shift 3을 하면 나머지 부분이 사라진다. data >> 3 ==> 0001 0010 된다. - 이후 3자리만(3,4,5 bit) 필요하니 0000 0111 로 mask 를 수행한다 (data >> 3) & (0000 0111) ==> 010 이 되는 것이다. 이를 MACRO로 표현을

BIT 값 대입 MACRO [내부링크]

특정 BITS 에 값을 셋팅 하는 것은, 추출 하는 것 보다 조금 더 작업이 필요하다. 기존 data에 해당 bits에만 값을 설정하여야 하고, 다른 bits 값들은 유지를 하여야 한다. origin = 1001 0001 (0x91) 3 ~ 5 번째 bits에 101 (0x5) 를 설정한다고 하자. 결과적으로 다음과 같은 값이 나와야 한다. ==> 1010 1001 이 값을 구하기 위하여 순서대로 처리를 하면 1. 해당 3 ~ 5 bits를 나타내는 mask 값을 구한다. (3 ~ 5번째 bits만 1로 셋팅) 0011 1000 2. origin에서 3 ~ 5 번째 값을 0으로 초기화를 한다. 1001 0001 & 1100 0111 ==> origin & ~mask 3. 해당 bits에만 설정되도록 값을 구한다. 0010 1000 ==> (0x5 << 3) & mask 4. 2에서 구한 값에 3의 값을 설정한다. 1010 1001 ==> (2.결과 값) | (3.결과 값) (1001