2023-11-22

[vscode] arm or x64 launch

// tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "checkCrossCompile",
      "command": "bash",
      "args": ["-c", "if [ -n \"$CROSS_COMPILE\" ]; then echo 'true'; else echo 'false'; fi"],
      "type": "shell",
      "options": {
        "env": {
          "IS_CROSS_COMPILE": "${command:checkCrossCompile}"
        }
      }
    }
  ]
}

// launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C++ Launch (x64)",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build_x64/executable",
      "env": {
        "IS_CROSS_COMPILE": "false"
      }
    },
    {
      "name": "C++ Launch (ARM)",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build_arm/executable",
      "env": {
        "IS_CROSS_COMPILE": "true"
      }
    }
  ]
}

2023-11-21

yocto devshell menuconfig 을 위해 설치해야할것.

sudo apt install tmux

sudo apt install libncurses-dev

원격이든 컨테이너 attach든, vscode의 콘솔이든
menuconfig과 devshell시 새로 뜨는 창을 현재창에 대신띄워준다.

^^ 맞나?

2023-11-20

100개 생성 스크립트 for docker-compose


#!/bin/bash

# docker-compose.yaml 파일 생성
echo "version: '3'" > docker-compose.yaml
echo "services:" >> docker-compose.yaml

# macvlan 네트워크 설정
echo "networks:" >> docker-compose.yaml
echo "  macvlan:" >> docker-compose.yaml
echo "    driver: macvlan" >> docker-compose.yaml
echo "    driver_opts:" >> docker-compose.yaml
echo "      parent: eth0" >> docker-compose.yaml  # 호스트에서 사용 중인 네트워크 인터페이스 이름으로 변경

# 1부터 100까지의 컨테이너에 대한 설정을 파일에 추가
for i in {1..100}
do
    MAC_ADDRESS=$(printf "12:34:56:78:90:%02x" $i)  # MAC 주소 생성
    echo "  container$i:" >> docker-compose.yaml
    echo "    image: your_image_name:latest" >> docker-compose.yaml
    echo "    networks:" >> docker-compose.yaml
    echo "      - macvlan" >> docker-compose.yaml
    echo "    mac_address: $MAC_ADDRESS" >> docker-compose.yaml
    echo "    volumes:" >> docker-compose.yaml
    echo "      - /path/to/host/directory$i:/path/in/container" >> docker-compose.yaml
done

공유 디랙토리 접근 그룹 설정

리눅스는 본인디렉토리를 벗어나면 여러가지 권한문제가 있음.
그래서 필요한.............

/ 루트에 폴더를 만들고, 그 폴더를 여러 사용자가 접근하도록 한다.
여러 사용자의 기준은 shared라는 그룹을 만들고 그 그룹의 멤버를 의미함.

접근할 그룹을 만들고
sudo groupadd shared_users

사용자를 그룹에 추가하고
sudo usermod -aG shared_users happycpu

소유권을 일반 유저로 바꿔야 한다. 필수.sudo chown -R happycpu:shared_users /srv/shared_directory

다른 유저(그룹에 속하지않은)의 접근을 차단하는 770으로 바꿈.
sudo chmod -R 770 /srv/shared_directory


2023-11-17

git 버전 안맞을때.

이러한 메시지는 `git pull` 명령을 실행할 때, 현재의 브랜치와 원격 저장소의 브랜치가 다르게 변경되어 있는 경우 발생합니다. 이러한 상황을 해결하려면 다음 중 하나의 방법을 선택할 수 있습니다.

### 1. 변경사항을 로컬 브랜치에 합치기 (Merge):

```bash
git pull origin <branch-name>
```

여기서 `<branch-name>`은 원격 저장소의 브랜치 이름입니다. 이 명령은 로컬 브랜치를 업데이트하고, 자동으로 로컬 브랜치와 원격 브랜치를 병합합니다.

### 2. 리베이스를 사용하여 변경사항 합치기 (Rebase):

```bash
git pull --rebase origin <branch-name>
```

이 명령은 로컬 브랜치의 변경사항을 커밋 단위로 원격 브랜치에 리베이스합니다. 리베이스를 사용하면 커밋 히스토리가 선형적으로 유지되며, 보다 깔끔한 히스토리를 유지할 수 있습니다.

### 3. 명시적으로 머지 또는 리베이스 설정:

만약에 `git pull` 명령을 실행할 때마다 이러한 선택을 물어보는 것이 번거로우면, 다음과 같이 설정할 수 있습니다.

```bash
# 머지 사용
git config pull.rebase false

# 리베이스 사용
git config pull.rebase true

# fast-forward only 사용
git config pull.ff only
```

위 설정 중 하나를 선택하여 기본 동작을 설정할 수 있습니다. 설정한 이후에는 `git pull` 명령만 사용해도 자동으로 설정한 방식으로 동작합니다.

아래처럼 global 설정을 사용하면 모든 저장소에 대해 동일한 설정이 적용됩니다.

```bash
# 전역 설정에서 머지 사용
git config --global pull.rebase false

# 전역 설정에서 리베이스 사용
git config --global pull.rebase true

# 전역 설정에서 fast-forward only 사용
git config --global pull.ff only
```

이렇게 설정한 후에는 `git pull` 명령만 사용하여 변경사항을 가져올 수 있습니다.

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"

암호화 + base64 하고 쉘스크립트.

 #!/bin/bash # IV와 UserKey를 설정합니다 (아스키 문자열을 그대로 사용). IV="0123456789abcdef"  UserKey="0123456789abcdef" # IV와 UserKey를 16...