2023-11-29

u-boot가 이해하는 스크립트 한 문장

'gpio input GPIOB1; retval=$?; if test -e ${devtype} ${devnum}:${distro_bootpart} /overlays/overlays.txt; then env set fdt_addr ${fdt_addr_r}; if load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr} ${fdtfile} && fdt addr ${fdt_addr} && fdt resize && setexpr fdtovaddr ${fdt_addr} + C0000 && load ${devtype} ${devnum}:${distro_bootpart} ${fdtovaddr} /overlays/overlays.txt && env import -t ${fdtovaddr} ${filesize} && test -n ${overlay}; then echo loaded overlay.txt: ${overlay}; for ov in ${overlay}; do if test "${ov}" = "lan9303_phy" && test ${retval} -eq 0; then load ${devtype} ${devnum}:${distro_bootpart} ${fdtovaddr} /overlays/${ov}.dtbo && fdt apply ${fdtovaddr}; else echo "DSA mode .. overlay skip"; fi; done; fi; fi
'

gpio명령으로 핀상태를 읽는다면,
첫회는 리턴값($?) 이 핀의 상태를 표시하고 반복 호출시 항상0이 된다.
즉, 핀상태가 1이라면, 한번은 1을 표시하고, 다음부터는0을 표시함.

무슨말이냐. -_-;;;

add lte interface

nmcli con add type ethernet ifname lte0 con-name lte0 ipv4.method auto ipv6.method disabled ipv4.never-default false

```bash
#!/bin/sh

# 사용법 표시 함수
usage() {
    echo "Usage: $0 -p PORT -f OUTPUT_FILE"
    exit 1
}

# 옵션 초기화
PORT=""
OUTPUT_FILE=""

# 옵션 파싱
while getopts "p:f:" opt; do
    case $opt in
        p)
            PORT="$OPTARG"
            ;;
        f)
            OUTPUT_FILE="$OPTARG"
            ;;
        \?)
            usage
            ;;
    esac
done

# 필수 옵션 확인
if [ -z "$PORT" ] || [ -z "$OUTPUT_FILE" ]; then
    usage
fi

# TCP 서버 실행
while true; do
    nc -l -p "$PORT" | while read -r line; do
        # 현재 시간을 포맷에 맞춰서 가져옴
        current_time=$(date "+%Y-%m-%d %H:%M:%S")

        # 수신한 패킷과 시간 정보를 출력
        echo "$current_time - $line"

        # 파일에 저장 (append 모드)
        echo "$current_time - $line" >> "$OUTPUT_FILE"
    done
done
```

이 스크립트는 무한 루프를 통해 계속해서 클라이언트의 연결을 수락하고, 연결이 끊어지면 다시 대기하여 새로운 연결을 수락합니다. 계속해서 수신된 패킷과 시간 정보를 출력하고 지정된 파일에 저장합니다. 이렇게 하면 `-k` 옵션을 사용할 수 없는 `nc`에서도 동작할 것입니다.

2023-11-28

overlays

env set scan_overlays 'if test -e ${devtype} ${devnum}:${distro_bootpart} /overlays/overlays.txt; then env set fdt_addr ${fdt_addr_r}; if load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr} ${fdtfile}; then fdt addr ${fdt_addr}; fdt resize; setexpr fdtovaddr ${fdt_addr} + C0000; if load ${devtype} ${devnum}:${distro_bootpart} ${fdtovaddr} /overlays/overlays.txt && env import -t ${fdtovaddr} ${filesize} && test -n ${overlay}; then echo loaded overlay.txt: ${overlay}; for ov in ${overlay}; do if test "${ov}" = "lan9303_phy" && gpio input GPIOB1; then echo "Skipping load and apply for ${ov} because GPIOD10 is 1"; else echo overlaying ${ov}...; load ${devtype} ${devnum}:${distro_bootpart} ${fdtovaddr} /overlays/${ov}.dtbo && fdt apply ${fdtovaddr}; fi; done; fi; fi; fi;'

2023-11-27

[autopsy] java관련 의존성 설치.

파일시스템 분석툴 설치시 문제.

sudo dpkg -i sleuthkit-java_4.12.1-1_amd64.deb
의존성문제 발생

sudo apt --fix-broken install
의존성 맞게 다운로드하여 설치

sudo dpkg -i sleuthkit-java_4.12.1-1_amd64.deb
잘 설치되었다고 나옴.

끝.


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

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)







2023-04-19

도커설치 docker install

새 리눅스 컴퓨터에 도커설치하는 한방
긁어 붙여주세요.

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
sudo docker run hello-world
sudo systemctl status docker


2023-03-28

[GPT] 쓰지않는 ipv6 다 지워버리기.

필요없는 ipv6주소가 자꾸 중복되어 거슬린다. 
삭제해버리자.

#!/bin/bash
for interface in $(ifconfig | grep '^[a-zA-Z0-9]' | awk '{print $1}')
do
    ip -6 addr flush dev $interface
done

스크립트만들고 sudo로 실행.

2023-03-23

u-boot menuconfig 보는곳.

~/work/wrlinux/lts-21/build/tmp-glibc/work/stm32mp153d_ssonic-wrs-linux-gnueabi/u-boot-stm32mp/2020.10.r1-r0/build/stm32mp153d-ssonic_trusted_defconfig# make menuconfig

2023-03-10

인터넷연결 확인방법

단순히 인터넷이 되는지만 확인하고자 한다면,

DNS서버에 접속만 확인한다.

PING은 지연시간까지 표시해주지만 필요없다. 복잡도도 상당하다.

8.8.8.8 주소, 53번포트에 connect만 하여 성공실패여부만 확인하고 끝.

소스는 리눅스에서는 바로되고, 필요한만큼만, 수정해서 쓰자.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <hostname> <port>\n", argv[0]);
exit(1);
}

char *hostname = argv[1];
char *port = argv[2];
struct addrinfo hints, *res;
int status, sock;

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;

if ((status = getaddrinfo(hostname, port, &hints, &res)) != 0) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}

sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

if (connect(sock, res->ai_addr, res->ai_addrlen) == 0) {
printf("Success\n");
} else {
printf("Failed\n");
}

close(sock);
freeaddrinfo(res);
return 0;
}


2023-03-08

[tcp] multicast reciever

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MULTICAST_ADDR "239.0.0.1"
#define PORT 8888
#define BUFSIZE 1024

int main(int argc, char** argv) {
int sock;
struct sockaddr_in addr;
char buf[BUFSIZE];
int recv_len;
struct ip_mreq mreq;
int enable = 1;

// 멀티캐스트 소켓 생성
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("Failed to create socket");
exit(EXIT_FAILURE);
}

// 멀티캐스트 TTL 설정
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &enable, sizeof(enable));

// 멀티캐스트 그룹에 참여
mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_ADDR);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

// 소켓 주소 설정
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(PORT);

// 소켓 바인드
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
perror("Failed to bind socket");
exit(EXIT_FAILURE);
}

// 데이터 수신 및 출력
while (1) {
memset(buf, 0, BUFSIZE);
recv_len = recv(sock, buf, BUFSIZE, 0);
if (recv_len < 0) {
perror("Failed to receive data");
exit(EXIT_FAILURE);
}
printf("Received data: %s\n", buf);
}

// 소켓 닫기
close(sock);

return 0;
}

[udp] multicast send

//// sender
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MULTICAST_ADDR "239.0.0.1"
#define PORT 8888
#define FILENAME "test.txt"

int main(int argc, char **argv)
{
int sock;
struct sockaddr_in addr;
char buf[1024];
int read_len, send_len, total_len;
FILE *fp;
struct ip_mreq mreq;
int enable = 1;

// 파일 열기
fp = fopen(FILENAME, "r");
if (fp == NULL)
{
perror("Failed to open file");
exit(EXIT_FAILURE);
}

// 멀티캐스트 소켓 생성
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
{
perror("Failed to create socket");
exit(EXIT_FAILURE);
}

// 멀티캐스트 TTL 설정
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &enable, sizeof(enable));

// 멀티캐스트 그룹에 참여
mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_ADDR);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

// 소켓 주소 설정
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(MULTICAST_ADDR);
addr.sin_port = htons(PORT);

// 파일 읽어서 멀티캐스트로 전송
while ((read_len = fread(buf, 1, sizeof(buf), fp)) > 0)
{
total_len = 0;
while (total_len < read_len)
{
send_len = sendto(sock, buf + total_len, read_len - total_len, 0,
(struct sockaddr *)&addr, sizeof(addr));
if (send_len < 0)
{
perror("Failed to send data");
exit(EXIT_FAILURE);
}
total_len += send_len;
}
}

// 파일과 소켓 닫기
fclose(fp);
close(sock);

return 0;
}

2023-03-01

[nmcli] mac ip match

sudo nmcli connection modify eth0 ipv4.method shared
sudo nmcli connection modify eth0 ipv4.dhcp-client-id "my_client_id"
sudo nmcli connection modify eth0 ipv4.dhcp-timeout 120
sudo nmcli connection modify eth0 ipv4.dhcp-hostname "my_hostname"
sudo nmcli connection modify eth0 ipv4.dhcp-lease-time 3600
sudo nmcli connection modify eth0 ipv4.dhcp-send-hostname yes
sudo nmcli connection modify eth0 ipv4.dhcp-send-client-id yes
sudo nmcli connection modify eth0 ipv4.dhcp-hostname "my_hostname"
sudo nmcli connection modify eth0 +ipv4.dhcp-hostname-mac 00:11:22:33:44:55,192.168.1.50
sudo nmcli connection modify eth0 +ipv4.dhcp-hostname-mac 00:AA:BB:CC:DD:EE,192.168.1.51

2023-02-28

[docker] portainer

$ docker volume create portainer_data
$ docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /data/portainer:/data portainer/portainer-ce:latest

2023-02-27

[docker] maclvan

1. macvlan을 생성한다.
MACVLAN_PARENT_INTERFACE=enx047bcb5e8b20
MACVLAN_SUBNET=192.168.25.0/24
MACVLAN_GATEWAY=192.168.25.1
docker network create -d macvlan   --subnet=$MACVLAN_SUBNET   --gateway=$MACVLAN_GATEWAY   -o parent=$MACVLAN_PARENT_INTERFACE   macvlan_network

#고정IP
docker run -itd --name=macvlan_container --network=macvlan_network --ip=192.168.25.100 --mac-address=00:11:22:33:44:55 hello:0.1

#자동IP
docker run -it --name=macvlan_container --network=macvlan_network --mac-address=00:11:22:33:44:55 hello:0.1


[BLE] 다이소 ble모듈 리눅스에 연결시... 해결법.

[46864.573210] usb 3-3.4.3.4.3: new full-speed USB device number 15 using xhci_hcd
[46864.682163] usb 3-3.4.3.4.3: New USB device found, idVendor=0bda, idProduct=8771, bcdDevice= 2.00
[46864.682171] usb 3-3.4.3.4.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[46864.682173] usb 3-3.4.3.4.3: Product: Bluetooth Radio
[46864.682174] usb 3-3.4.3.4.3: Manufacturer: Realtek
[46864.682176] usb 3-3.4.3.4.3: SerialNumber: 00E04C239987
[46864.692638] Bluetooth: hci1: RTL: examining hci_ver=0a hci_rev=000b lmp_ver=0a lmp_subver=8761
[46864.693653] Bluetooth: hci1: RTL: rom_version status=0 version=1
[46864.693660] Bluetooth: hci1: RTL: loading rtl_bt/rtl8761bu_fw.bin
[46864.703096] bluetooth hci1: Direct firmware load for rtl_bt/rtl8761bu_fw.bin failed with error -2
[46864.703106] Bluetooth: hci1: RTL: firmware file rtl_bt/rtl8761bu_fw.bin not found


$ cd /usr/lib/firmware/rtl_bt $ sudo ln -s rtl8761b_fw.bin rtl8761bu_fw.bin


2023-02-17

[팁] ssh접속시 다 보내기.

#접속만 하고싶다. sshpass -p 'P@ssw0rd' ssh -o StrictHostKeyChecking=no root@1.2.3.4 #파일복사 하고싶다. sshpass -p 'P@ssw0rd' scp -o StrictHostKeyChecking=no * root@remotsvr.local:/usr/local/fw/ [원문] https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_sshpass_%EC%82%AC%EC%9A%A9%EB%B2%95 

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

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