2023-10-23

C에서 C++ 함수 호출하는법

class MyClass {
public:
    void myMethod() {
        // C++ 메소드 내용
    }
}

extern "C" {
    void callMyMethod() {
        MyClass obj;
        obj.myMethod();
    }
}

// 외부에서 선언된 C++ 함수를 호출
extern void callMyMethod();

int main() {
    callMyMethod(); // C 함수를 호출하여 C++ 메소드 실행
    return 0;
}


2023-10-19

iso8601 time string

#include <chrono>

int main() {
  // 현재 시간을 가져옵니다.
  auto now = std::chrono::system_clock::now();

  // ISO 8601 포맷으로 시간을 만듭니다.
  std::string iso8601Time = std::to_string(now);

  // 시간을 출력합니다.
  std::cout << iso8601Time << std::endl;

  return 0;
}

2023-10-18

cmake binary file add.

cmake_minimum_required(VERSION 3.21)

project(example)

add_executable(main main.c)

add_executable(firmware firmware.bin)

target_link_libraries(main firmware)

# 대상의 크기를 바이트로 가져오는 함수 정의
function(get_size_of_data target)
  get_target_property(size ${target} SIZE)
  return(${size})
endfunction()

# 'firmware' 대상의 크기를 가져오고 'CMAKE_SIZE_OF_DATA' 변수에 저장
get_size_of_data(firmware)
set(CMAKE_SIZE_OF_DATA ${size})

# 'FIRMWARE_SIZE'를 킬로바이트(KB)로 변환
math(EXPR FIRMWARE_SIZE "${CMAKE_SIZE_OF_DATA} / 1024")

message("FIRMWARE_SIZE in KB: ${FIRMWARE_SIZE}")


사용법은....................................................................................
#include <stdio.h>

int main() {
  // 펌웨어 데이터를 가져옵니다.
  void *data = ((void(*)())firmware)();

  // 펌웨어 크기를 가져옵니다.
  int size = FIRMWARE_SIZE;

  // 펌웨어 데이터를 처리합니다.
  // ...

  return 0;
}

2023-09-01

[dnsmasq] 이거저거.

# 네트워크 인터페이스 설정 interface=eth1 # 상위 네트워크 인터페이스 # 하위네트워크 1에 대한 DHCP 설정 dhcp-range=192.168.1.10,192.168.1.50,12h # 하위네트워크 1의 게이트웨이 설정 dhcp-option=option:router,192.168.1.1 # 하위네트워크 1의 DNS 서버 설정 dhcp-option=option:dns-server,8.8.8.8 # 하위네트워크 2에 대한 DHCP 설정 dhcp-range=192.168.2.10,192.168.2.50,12h # 하위네트워크 2의 게이트웨이 설정 dhcp-option=option:router,192.168.2.1 # 하위네트워크 2의 DNS 서버 설정 dhcp-option=option:dns-server,8.8.4.4


DHCP 서버가 갖고 있는 DNS 서버 정보를 하위 요청에 내려주려면, dhcp-option=option:dns-server, 옵션 뒤에 DNS 서버 주소 목록을 쉼표로 구분하여 지정하면 됩니다. 예를 들어, 다음과 같이 설정할 수 있습니다.

dhcp-range=192.168.1.10,192.168.1.50,12h  dhcp-option=option:router,192.168.1.1  dhcp-option=option:dns-server,8.8.8.8,8.8.4.4  

이 설정은 상위 DHCP 서버가 8.8.8.8과 8.8.4.4 두 개의 DNS 서버를 사용하고 있으며, 이를 하위 네트워크 1의 클라이언트에게 할당한다는 것을 의미합니다.

또는, dhcp-option=option:dns-server, 옵션 뒤에 0.0.0.0을 지정하면, DHCP 서버가 사용하는 모든 DNS 서버 정보를 하위 요청에 내려줄 수 있습니다. 예를 들어, 다음과 같이 설정할 수 있습니다.

dhcp-range=192.168.1.10,192.168.1.50,12h  dhcp-option=option:router,192.168.1.1  dhcp-option=option:dns-server,0.0.0.0  

이 설정은 상위 DHCP 서버가 사용하는 모든 DNS 서버 정보를 하위 네트워크 1의 클라이언트에게 할당한다는 것을 의미합니다.

cache-size=1000 cache-ttl=3600

내 기기는 DHCP 서버와 DNS 캐시 역할만 하고 게이트웨이는 192.168.1.1 장치가 별도로 있으며 DNS 캐싱도 하고, 내 IP는 192.168.1.2인 경우의 dnsmasq 설정은 다음과 같습니다.

interface=eth0  dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,12h  dhcp-option=3,192.168.1.1  gateway=192.168.1.1  domain-name=example.com  dns-cache=on  

이 설정은 다음과 같은 기능을 수행합니다.

  • DHCP 서버를 활성화합니다.
  • 192.168.1.100에서 192.168.1.200까지의 IP 주소를 DHCP 서버에서 할당합니다.
  • DHCP 임대 기간을 12시간으로 설정합니다.
  • 게이트웨이 IP 주소를 192.168.1.1로 설정합니다.
  • 도메인 이름을 example.com으로 설정합니다.
  • DNS 캐시를 켭니다.
  • DHCP 클라이언트에 192.168.1.1을 게이트웨이로 설정합니다.

내 IP 주소는 192.168.1.2이므로, DHCP 클라이언트의 IP 주소는 192.168.1.2로 설정됩니다. 따라서, gateway 설정을 지정하지 않으면, dnsmasq는 DHCP 클라이언트의 IP 주소를 게이트웨이로 사용합니다. 따라서, gateway 설정을 지정하지 않으면, dnsmasq는 DHCP 클라이언트의 IP 주소를 게이트웨이로 사용하게 됩니다.

dns-server 설정을 지정하지 않으면, dnsmasq는 기본적으로 다음과 같은 DNS 서버를 사용합니다.

  • 1.1.1.1
  • 1.0.0.1

이 DNS 서버는 Google에서 제공하는 DNS 서버로, 빠르고 안정적입니다. 따라서, 네트워크에 별도의 DNS 서버가 없거나, 기존 DNS 서버가 느리거나 불안정하다면, dnsmasq가 기본적으로 제공하는 DNS 서버를 사용하는 것이 좋습니다.

dns-server를 지정하지 않으면, dnsmasq는 DHCP 클라이언트의 DHCP 서버 설정을 사용하여 DNS 서버를 결정합니다. 따라서, DHCP 클라이언트의 DHCP 서버 설정에 DNS 서버가 지정되어 있으면, dnsmasq는 해당 DNS 서버를 사용하게 됩니다.

이 경우, DNS 캐시를 활성화하여 DNS 쿼리의 응답 시간을 단축할 수 있습니다. DNS 캐시를 활성화하려면 dns-cache 설정을 추가합니다. dns-cache 설정의 값은 다음과 같습니다.

  • on: DNS 캐시를 켭니다.
  • off: DNS 캐시를 끕니다.

따라서, DNS 캐시를 켜는 설정은 다음과 같습니다.

interface=eth0  dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,12h  dhcp-option=3,192.168.1.1  gateway=192.168.1.1  domain-name=example.com  dns-cache=on  

이 설정은 DNS 캐시를 활성화하여 DNS 쿼리의 응답 시간을 단축하고, DHCP 클라이언트에 192.168.1.1을 게이트웨이로 설정합니다.


domain-name은 DHCP 클라이언트가 DNS 쿼리를 수행할 때 사용할 도메인 이름을 지정하는 옵션입니다.

DHCP 클라이언트는 DNS 쿼리를 수행할 때 도메인 이름을 지정해야 합니다. 도메인 이름을 지정하지 않으면, DNS 서버는 클라이언트의 IP 주소를 기준으로 도메인 이름을 추론하려고 시도합니다. 그러나, 도메인 이름을 추론하는 것은 항상 정확하지는 않습니다.

domain-name 옵션을 사용하면 DHCP 클라이언트가 DNS 쿼리를 수행할 때 사용할 도메인 이름을 정확하게 지정할 수 있습니다. 이렇게 하면 DNS 쿼리의 응답 시간을 단축하고, DNS 쿼리의 정확성을 높일 수 있습니다.

domain-name 옵션의 값은 도메인 이름을 지정합니다. 도메인 이름은 FQDN(Fully Qualified Domain Name)을 지정해야 합니다. FQDN은 도메인 이름의 전체 이름을 나타냅니다. 예를 들어, example.com은 FQDN입니다.

domain-name 옵션은 다음과 같이 사용됩니다.

dhcp-option=15,example.com  

이 설정은 DHCP 클라이언트가 DNS 쿼리를 수행할 때 사용할 도메인 이름을 example.com으로 설정합니다.


[dnsmasq] tftp, dhcp, pxe-serivice

enable-tftp
tftp-root=/srv/tftpboot
port=0
pxe-service=0,"pxeboot"

2023-06-30

GPT에게 효과적인 질문하는 법: 블로그에서 SEO 최적화 팁과 함께

서문:
안녕하세요! 이번 글에서는 GPT와의 대화에서 효과적인 질문을 하는 방법에 대해 알아보려고 합니다. GPT는 강력한 언어 모델이지만, 올바른 질문을 통해 더 나은 답변을 얻을 수 있습니다. 이 글에서는 SEO 최적화를 고려한 블로그 글 형식으로 GPT에게 효과적인 질문을 하는 방법을 소개하겠습니다.


### 1. 명확하고 구체적인 질문을 사용하세요

GPT에게 효과적인 질문을 하기 위해서는 명확하고 구체적인 질문을 사용해야 합니다. 이는 GPT가 질문의 의도를 파악하고 정확한 답변을 제공하는 데 도움이 됩니다. 예를 들어, "파리 여행을 위한 최고의 호텔은 무엇인가요?"와 같이 구체적인 질문을 사용하는 것이 좋습니다.

### 2. 짧고 간결한 문장을 사용하세요

GPT는 짧고 간결한 문장을 처리하는 데 더 효과적입니다. 따라서, 질문을 간결하고 직관적으로 작성하는 것이 좋습니다. 긴 문장보다는 짧은 문장을 사용하여 질문을 명확하고 이해하기 쉽게 만드세요.

### 3. 필요한 문맥 정보를 제공하세요

GPT는 문맥을 이해하여 정확한 답변을 제공할 수 있습니다. 따라서, 질문하기 전에 필요한 문맥 정보를 제공하여 GPT가 더 정확하고 유용한 답변을 제공할 수 있도록 도와주세요. 예를 들어, "최신 iPhone 모델에 대해 알려주세요"라는 질문을 할 때, "iPhone 13"이라는 문맥 정보를 함께 제공하면 더 구체적인 답변을 얻을 수 있습니다.

### 4. 질문을 구조화하세요

긴 복잡한 질문을 한 번에 던지는 대신, 여러 개의 짧은 질문으로 나누어 구조화하는 것이 좋습니다. 이렇게 하면 GPT가 각각의 질문에 더 명확하게 답변할 수 있습니다. 예를 들어, "파리 여행을 계획할 때 고려해야 할 항목은 무엇인가요? 예산, 숙소, 관광지  등에 대해 알려주세요"와 같이 질문을 구조화해보세요.

### 5. 관련 키워드를 활용하세요

SEO 최적화를 고려하여 질문에 관련 키워드를 포함시키는 것이 중요합니다. 이렇게 하면 검색 엔진에서 블로그 글이 노출되기 쉬워져 더 많은 독자에게 접근할 수 있습니다. 예를 들어, "효과적인 머신러닝 학습 방법은 무엇인가요? (머신러닝, 학습 방법)"와 같이 질문에 관련 키워드를 추가하세요.

### 6. 친근하고 읽기 쉬운 언어를 사용하세요

GPT와의 대화는 독자들과의 대화와 유사한 경험을 제공해야 합니다. 따라서, 블로그에서는 친근하고 읽기 쉬운 언어를 사용하여 질문을 작성하세요. 이는 독자들이 쉽게 이해하고 GPT가 더 정확한 답변을 제공할 수 있도록 돕습니다.

이러한 팁들을 활용하여 GPT에게 효과적인 질문을 하여 블로그의 SEO 최적화와 독자들에게 유용한 정보를 제공하세요. 효과적인 질문은 대화의 품질을 높이고 독자들의 관심을 끌 수 있습니다.

야식 줄이기: 건강한 식습관으로 더 나은 삶을 즐기는 방법



안녕하세요! 건강한 식습관을 가지고 더 나은 삶을 즐길 수 있는 방법에 대해 알아보려고 합니다. 특히, 야식을 줄이는 방법에 대해 알려드리겠습니다. 야식은 우리의 신체에 부정적인 영향을 미칠 수 있고, 건강에 문제를 일으킬 수 있습니다. 따라서, 건강한 습관으로 야식을 줄이는 방법을 소개하겠습니다.



1. 규칙적인 식사 시간을 유지하세요:
   식사 시간을 규칙적으로 유지하는 것은 야식을 줄이는 첫 번째 단계입니다. 정해진 시간에 식사를 하면 신체 시계가 조절되고, 배고픔을 조절하는 데 도움이 됩니다. 규칙적인 식사 시간을 지키면 야식을 감소시키는 데 큰 도움이 될 것입니다.

2. 건강한 간식을 선택하세요:
   야식을 감소시키기 위해서는 건강한 간식을 선택하는 것이 중요합니다. 과일, 채소 스틱, 견과류, 요구르트 등 영양가 있는 간식을 섭취해보세요. 이러한 간식은 포만감을 주며, 영양소를 제공하여 야식을 대체하는 데 도움이 됩니다.

3. 식사 중심의 다양한 영양소를 섭취하세요:
   균형 잡힌 식단을 구성하는 것은 야식을 줄이는 핵심입니다. 식사 중심으로 단백질, 식이섬유, 미네랄, 비타민 등 다양한 영양소를 포함한 식단을 섭취해야 합니다. 이렇게 하면 식사 중에 포만감을 유지하고 야식을 더 이상 필요로하지 않을 것입니다.

4. 스트레스 관리를 위한 대안을 찾으세요:
   많은 사람들이 스트레스를 이유로 야식을 하곤 합니다. 하지만 야식은 스트레스를 해소해주지 않을 뿐만 아니라 건강에도 해로울 수 있습니다. 대신, 스트레스 관리를 위해 운동, 명상,

 읽기, 취미 활동 등의 대안을 찾아보세요. 이렇게 하면 스트레스를 효과적으로 관리하고 야식을 줄일 수 있습니다.

5. 건강한 수면 습관을 유지하세요:
   충분한 수면을 취하는 것은 식욕과 관련된 호르몬을 균형있게 조절하는 데 도움이 됩니다. 일정한 수면 패턴을 유지하고, 편안한 잠을 취하기 위해 환경을 조성하세요. 충분한 수면을 취하면 야식을 감소시키는 데 도움이 될 것입니다.

건강한 식습관은 우리의 삶의 질을 향상시키고, 야식을 줄여 건강을 유지하는 데 도움이 됩니다. 규칙적인 식사 시간, 건강한 간식 선택, 균형 잡힌 식단, 스트레스 관리, 충분한 수면 등을 고려하여 야식을 줄이는 노력을 하세요. 이러한 습관을 가지면 더 건강한 삶을 즐길 수 있을 것입니다.

이 블로그 글은 야식을 줄이는 방법에 초점을 맞추어 작성되었으며, SEO 최적화를 위해 다양한 키워드와 관련된 내용을 포함하였습니다. 이를 통해 검색 엔진에서 상위에 노출되어 더 많은 독자들에게 도달할 수 있을 것입니다.

2023-05-16

소스코드 붙이기 연습

 소스코드 붙이기 연습

1
2
3
4
5
6
7
EchoServer::~EchoServer() {
    m_running = false;
    close(m_server_socket);
    for (auto& thread : m_client_threads) {
        thread.join();
    }
}

2023-04-26

[JSON] 순서보장없는 json파일간 비교를위해 dict 정렬하여 해쉬만드는 예제.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>
#include <cjson/cJSON.h>

#define BUFFER_SIZE 1024

// SHA256 해시값을 생성하는 함수
void sha256_hash(unsigned char *input, size_t input_len, unsigned char *hash)
{
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, input, input_len);
    SHA256_Final(hash, &sha256);
}

// 딕셔너리 정렬 함수
cJSON* sort_dict(cJSON *json)
{
    cJSON *sorted = cJSON_CreateObject();

    // 딕셔너리의 키를 저장할 배열 생성
    const char *keys[cJSON_GetArraySize(json)];
    int i = 0;
    cJSON *child;
    cJSON_ArrayForEach(child, json) {
        keys[i] = child->string;
        i++;
    }

    // 키를 알파벳순으로 정렬
    qsort(keys, cJSON_GetArraySize(json), sizeof(const char*), strcmp);

    // 정렬된 키로 딕셔너리 재구성
    for (i = 0; i < cJSON_GetArraySize(json); i++) {
        child = cJSON_GetObjectItemCaseSensitive(json, keys[i]);
        cJSON_AddItemToObject(sorted, keys[i], cJSON_Duplicate(child, 1));
    }

    return sorted;
}

int main(int argc, char *argv[])
{
    char buffer[BUFFER_SIZE];
    size_t nread;
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;

    // JSON 파일 열기
    FILE *fp = fopen(argv[1], "r");
    if (!fp) {
        fprintf(stderr, "파일 열기 실패\n");
        exit(1);
    }

    // JSON 파일 읽기
    nread = fread(buffer, 1, BUFFER_SIZE, fp);
    fclose(fp);

    // JSON 파싱
    cJSON *json = cJSON_Parse(buffer);

    // 딕셔너리 정렬
    cJSON *sorted_json = sort_dict(json);

    // JSON 문자열로 변환
    char *sorted_str = cJSON_Print(sorted_json);

    // SHA256 해시값 생성
    sha256_hash((unsigned char*)sorted_str, strlen(sorted_str), hash);

    // 해시값 출력
    for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
        printf("%02x", hash[i]);
    }
    printf("\n");

    // 메모리 해제
    cJSON_Delete(json);
    cJSON_Delete(sorted_json);
    free(sorted_str);

    return 0;
}
//==========================================================================
위의 소스중 cJSON을 쓰지않고 json-c를 사용하는 소스

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>
#include <json-c/json.h>

#define BUFFER_SIZE 1024

// SHA256 해시값을 생성하는 함수
void sha256_hash(unsigned char *input, size_t input_len, unsigned char *hash)
{
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, input, input_len);
    SHA256_Final(hash, &sha256);
}

// 딕셔너리 정렬 함수
int cmp(const void *a, const void *b) 
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(*ia, *ib);
}

json_object* sort_dict(json_object *json)
{
    json_object *sorted = json_object_new_object();

    // 딕셔너리의 키를 저장할 배열 생성
    const char *keys[json_object_object_length(json)];
    int i = 0;
    json_object_object_foreach(json, key, val) {
        keys[i] = key;
        i++;
    }

    // 키를 알파벳순으로 정렬
    qsort(keys, json_object_object_length(json), sizeof(const char*), cmp);

    // 정렬된 키로 딕셔너리 재구성
    for (i = 0; i < json_object_object_length(json); i++) {
        json_object *child = json_object_object_get(json, keys[i]);
        json_object_object_add(sorted, keys[i], json_object_get(child));
    }

    return sorted;
}

int main(int argc, char *argv[])
{
    char buffer[BUFFER_SIZE];
    size_t nread;
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;

    // JSON 파일 열기
    FILE *fp = fopen(argv[1], "r");
    if (!fp) {
        fprintf(stderr, "파일 열기 실패\n");
        exit(1);
    }

    // JSON 파일 읽기
    nread = fread(buffer, 1, BUFFER_SIZE, fp);
    fclose(fp);

    // JSON 파싱
    json_object *json = json_tokener_parse(buffer);

    // 딕셔너리 정렬
    json_object *sorted_json = sort_dict(json);

    // JSON 문자열로 변환
    char *sorted_str = json_object_to_json_string(sorted_json);

    // SHA256 해시값 생성
    sha256_hash((unsigned char*)sorted_str, strlen(sorted_str), hash);

    // 해시값 출력
    for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
        printf("%02x", hash[i]);
    }
    printf("\n");

    // 메모리 해제
    json_object_put(json);
    json_object_put(sorted_json);
    free(sorted_str);

    return 0;
}







2023-04-24

[UNITY] TESTCASE 구조 프로젝트 만드는법

project/
├── CMakeLists.txt
├── app/
│   ├── CMakeLists.txt
│   └── myfunc.c
├── include/
│   ├── myfunc.h
│   └── unity.h
├── test/
│   ├── CMakeLists.txt
│   └── test_myfunc.c
└── unity/
    ├── unity.c
    └── unity.h


project/CMakeLists.txt

cmake_minimum_required(VERSION 3.16)

# Set project name and version
project(my_project VERSION 1.0)

# Add app and test subdirectories
add_subdirectory(app)
add_subdirectory(test)


project/test/CMakeLists.txt

# Add executable target
add_executable(my_test test_myfunc.c)

# Add include directories
target_include_directories(my_test PRIVATE ${PROJECT_SOURCE_DIR}/include)

# Link with Unity and app libraries
target_link_libraries(my_test PRIVATE unity my_app)







구글드라이브 wget 다운받는 명령어

구글드라이브의 파일을 링크가있는사람 무조건받기로 해서 공유링크를 복사하여 아래의 "구글드라이브공유링크"에 붙여넣는다. 원하는파일명은적절히 써준다.  주의: 실행속성은 추가로 변경해주어야한다. chmod a+x 파일명 GDRIVE_LI...