2023-11-22

fallocate

#include <fcntl.h>
#include <unistd.h>

int main() {
  // 파일 이름
  const std::string filename = "/path/to/file.bin";

  // 파일 크기
  const int filesize = 256 * 1024 * 1024;

  // 파일 핸들
  int fd = open(filename, O_CREAT | O_RDWR, 0644);

  // 파일의 크기를 지정하여 파일을 생성
  fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, filesize);

  // 파일 핸들을 닫음
  close(fd);

  return 0;
}

[vscode] tasks.json launch.json


### 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"      },      {        "label": "setCrossCompileEnv",        "dependsOn": ["checkCrossCompile"],        "command": "echo 'IS_CROSS_COMPILE=${checkCrossCompile.result}' > .vscode/env.txt",        "type": "shell"      }    ]  }    ### launch.json    {    "version": "0.2.0",    "configurations": [      {        "name": "C++ Launch (x64)",        "type": "cppdbg",        "request": "launch",        "program": "${workspaceFolder}/build_x64/executable",        "envFile": "${workspaceFolder}/.vscode/env.txt"      },      {        "name": "C++ Launch (ARM)",        "type": "cppdbg",        "request": "launch",        "program": "${workspaceFolder}/build_arm/executable",        "envFile": "${workspaceFolder}/.vscode/env.txt"      }    ]  }  

tasks.json 파일은 checkCrossCompile 작업과 setCrossCompileEnv 작업을 정의합니다. checkCrossCompile 작업은 CROSS_COMPILE 환경 변수가 설정되어 있는지 확인하고, setCrossCompileEnv 작업은 IS_CROSS_COMPILE 변수의 값을 checkCrossCompile 작업의 결과에 따라 설정합니다.

launch.json 파일은 C++ Launch (x64)C++ Launch (ARM)이라는 두 가지 디버깅 구성을 정의합니다. 두 구성 모두 envFile 속성을 사용하여 .vscode/env.txt 파일에서 환경 변수를 가져옵니다.

이 구성을 사용하면 디버깅 세션을 시작할 때 다음과 같은 일이 발생합니다.

  1. checkCrossCompile 작업이 실행되어 CROSS_COMPILE 환경 변수가 설정되어 있는지 확인합니다.
  2. CROSS_COMPILE 환경 변수가 설정되어 있으면 IS_CROSS_COMPILE 변수가 true로 설정됩니다.
  3. CROSS_COMPILE 환경 변수가 설정되어 있지 않으면 IS_CROSS_COMPILE 변수가 false로 설정됩니다.
  4. .vscode/env.txt 파일에 IS_CROSS_COMPILE 변수의 값이 기록됩니다.
  5. C++ Launch (x64) 또는 C++ Launch (ARM) 구성을 사용하여 디버깅 세션을 시작합니다.

디버깅 세션을 시작하면 envFile 속성에 지정된 파일에서 환경 변수를 읽습니다. 이 경우 .vscode/env.txt 파일에서 IS_CROSS_COMPILE 변수의 값을 읽습니다.

따라서 IS_CROSS_COMPILE 환경 변수의 값은 디버깅 세션에 따라 true 또는 false가 됩니다.

[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;
}

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

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