본문 바로가기

분류 전체보기894

inet_addr, inet_aton, inet_pton, inet_ntoa, inet_ntop 1. 문자열 형식의 IP 주소를 uint32_t 형식으로 변환하는 함수 :inet_addr, inet_aton, inet_pton  - inet_addr문자열 형식의 IPv4 주소를 uint32_t로 변환.반환된 값이 네트워크 바이트 순서로 저장됨.Deprecated(더 이상 권장되지 않으며, 향후 버전에서 제거될 가능성이 있으니 사용을 자제해야하는 함수) 이므로 최신 코드에서는 inet_aton 또는 inet_pton을 사용하는 것이 권장됨.#include #include #if defined(_WIN32) || defined(_WIN64)#pragma comment(lib,"ws2_32")#include #else#include #endifint main() { const char* ip_str = .. 2024. 12. 17.
배치파일에서 call 명령어 사용법 배치 파일에서 call 명령어는 크게 두 가지 경우에 사용된다. 1. 다른 배치 파일 호출 후 돌아오기2. 서브루틴 호출    1. 다른 배치 파일 호출 후 돌아오기  배치 파일에서 다른 배치 파일을 호출할 때 단순히 파일 이름만 적으면 현재 실행 중인 배치 파일은 호출된 파일로 넘어가고 다시 돌아오지 않는다. 이런 경우 call 명령어를 사용하면 호출된 배치 파일이 끝난 후 원래 배치 파일로 다시 돌아와 남은 작업을 이어서 수행할 수 있다. first.bat@echo offecho 첫 번째 배치 파일 실행 중call second.batecho 첫 번째 배치 파일로 돌아와서 마지막 작업 실행 중  second.bat@echo offecho 두 번째 배치 파일 실행 중     2. 함수 형태로 서브루틴 호.. 2024. 12. 15.
배치 파일에서 명령 인수 활용법 명령 인수(또는 매개변수)는 배치 파일을 실행할 때 외부에서 값을 전달할 수 있는 방법이다. 배치 파일 내에서 %1, %2, %3 등으로 인수에 접근할 수 있고, 여기서 각 숫자는 전달 된 인수의 순서를 의미한다.  - 사용 예시@echo off:: 인수 확인if "%1"=="" ( echo 파일 이름을 입력해 주세요. exit /b)if "%2"=="" ( echo 대상 폴더를 입력해 주세요. exit /b):: 인수로 받은 파일을 지정된 폴더로 복사set "source=%1"set "destination=%2"copy "%source%" "%destination%"echo 파일 %source%를 %destination%로 복사함.batchfile.bat test.txt C:\Ba.. 2024. 12. 13.
배치파일에서 setlocal, setlocal enabledelayedexpansion 사용법 setlocal - setlocal과 endlocal 이란?setlocal은 배치 파일 내에서 환경 변수나 코드 블록이 현재 세션에서만 적용되도록 설정하는 명령어이고 endlocal은 setlocal에 의해 생성된 지역 환경 설정을 원래 상태로 복구하는 명령어이다.  - endlocal을 생략할 수 있는 경우일반적으로 배치 파일이 끝나면서 세션이 종료되면 자동으로 endlocal이 적용되므로, 배치 파일 마지막에서 endlocal을 생략해도 큰 문제가 생기지 않는다. 하지만 배치파일 내에서 다른 배치파일을 호출하거나 연달아 여러 배치파일을 호출하는 경우 각 setlocal에 맞는 endlocal을 명시적으로 추가해주는 것이 안전하다.  - setlocal을 사용해야 하는 경우?배치 파일 내에서 다른 배치.. 2024. 12. 11.
Visual Studio ] NO Operation 코드 보통 GCC에선 코드의 특정 위치에서 아무 작업도 하지 않고 시간을 잠시 지연시키거나 디버깅 시 브레이크포인트를 목적으로 asm("nop"); 구문을 많이 사용한다.  여기서 asm은 어셈블리를 코드에 삽입할 수 있도록 해주는 GCC 확장이고 nop은 아무 작업도 수행하지 않는 어셈블리 명령어로 프로세서가 이 명령어를 만나면 한 사이클 동안 아무 작업도 하지 않고 넘어간다. asm( "nop");   Visual Studio에서 사용 가능한 NO Operation 코드 그럼 MSVC(Microsoft Visual Studio Compiler) x64 에서는 이와 유사한 방식으로 어떻게 아무 작업도 하지 않으면서 필요시 브레이크포인트를 설정할 수 있는 코드를 작성할 수 있을까? 먼저 __noop; 과 (.. 2024. 12. 9.
CCS ] .out(ELF) 파일에서 섹션 정보 파싱하기 CCS에서 프로젝트를 빌드하면 .out 확장자의 ELF 형식 실행파일이 생성된다. 해당 파일을 파싱하여 섹션 정보를 획득해보자.     CCS 폴더 경로에서 주운 elf.h 파일, 여기서 함수 원형은 무시하고 구조체 정의랑 매크로 상수만 활용하자. 근데 또 여기엔 Elf32_Phdr 정보가 없어서 다른데서 구해왔다. /* * ======== elf.h ======== */#ifndef ELF_#define ELF_ 1/* * ======== Elf32_Handle ======== */typedef struct Elf32_Object *Elf32_Handle;typedef Bits32 Elf32_Addr;typedef Bits16 Elf32_Half;typedef Bits32 Elf32_Of.. 2024. 12. 7.
Visual Studio ] 프로젝트 이름 바꾸기 1. 기존 Project 폴더를 복사/붙여넣기 하여 복사본 생성  2. 복사본 폴더명을 원하는 Project 이름으로 변경  3. 프로젝트 폴더 안 최상위 경로에 이전 프로젝트 이름으로 존재하는 파일 등을(.sln, .vcproj, .vcxproj.filter, .vcxproj.user) 새로운 프로젝트 이름으로 변경  4. .sln 파일과 .vcporj 파일을 텍스트 파일 편집기로 열어서 찾기/바꾸기 기능으로 이전 프로젝트 이름을 새 프로젝트 이름으로 모두 변경  5. .vs 폴더 삭제 (캐시 데이터가 저장된 폴더로 Visual Studio로 프로젝트를 열면 새로 생성됨)  6. 빌드 출력물이 들어있는 x64 또는 x86 폴더 삭제 (빌드하면 새로 생성됨)  7. 새로운 이름의 프로젝트를 Visual .. 2024. 12. 5.
C++ ] <random> 헤더 사용 난수 생성 C++ 헤더를 사용해 난수 생성하는 방법 1. 헤더 파일 포함#include    2. 시스템 기반 난수 시드 생성시스템에서 제공하는 하드웨어 기반 난수 시드를 가져온다.std::random_device rd;   3. 난수 생성 엔진 초기화시드를 사용해 난수 생성 엔진을 초기화한다. 보통은 Mersenne Twister 알고리즘을 사용한 std::mt19937 엔진을 많이 사용한다.std::mt19937 gen(rd()); // Mersenne Twister 엔진에 시드 할당   4. 분포 정의 (범위와 형식 설정)난수가 발생할 범위와 형식은 분포(distribution)를 통해 정의한다.  정수형 균등 분포, 범위 내의 모든 값이 동일한 확률로 선택된다.std::uniform_int_distribu.. 2024. 12. 3.
Excel에서 그림, 도형, 텍스트 박스 등의 개체 선택 쉽게 하기 홈 > 편집 > 찾기 및 선택 > 개체 선택을 누르면 이제 부터 드래그 앤 드롭 시 그림, 도형, 텍스트 박스와 같은 개체만 선택이 된다.   다시 이전 처럼 셀 선택이 되게 하려면 개체 선택을 다시 한번 눌러 비활성화 해주면 된다. 2024. 12. 1.
Line Coding (선로 부호화) 1. Line Coding (선로 부호화)이란?Line Coding은 디지털 데이터를 전기적 디지털 신호로 변환하는 과정이다. 이 과정에서 데이터를 전송 매체에 맞춰 변환함으로써 신호 왜곡을 줄이고, 오류 검출과 복구를 용이하게 하는 역할을 한다.    2. Line Code의 분류2.1 Unipolar (단극형) ( A+, 0 )Unipolar 방식은 신호를 하나의 전압 레벨로 표현한다. 즉, 데이터 비트가 1일 때는 일정한 전압(+A)을 사용하고, 비트가 0일 때는 0 전압을 사용한다. 이 방식은 단순하지만, DC 성분이 포함되기 쉽고, 클럭 동기화가 어렵기 때문에 장거리 전송에 적합하지 않다.- 대표 방식 : Unipolar RZ, Unipolar NRZ    2.2 Polar (극형) ( +A, .. 2024. 10. 30.
C++ ] CLI Loading indicator와 Progress bar 사용자에게 작업이 진행중임을 알리는 간단한 로딩 인디케이터와 프로그레스 바 만들어보기   로딩 인디케이터 #include #include using namespace std;bool running = true;void loading_indicator() { const char* states[] = {" ", ". ", ".. ", "... ", ".... ", "....."}; int index = 0; while (running) { cout      프로그레스 바 #include #include #include using namespace std;class ProgressBar {private: int barWidth; int progress;.. 2024. 10. 28.
SerDes SerDes란?   SerDes(서데스, Serializer/Deserializer)는 병렬 데이터를 직렬로 변환(Serialize)하고, 다시 직렬 데이터를 병렬로 변환(Deserialize)하는 기능을 수행하는 회로 블록을 말한다. SerDes는 칩간 고속 통신에 사용되어 여러개의 병렬 라인을 고속의 하나의 직렬 라인으로 통합하여 더욱 간단하고 안정적으로 고속 데이터 전송을 가능하게 한다.     SerDes의 기능 Serialize : 송신 측에서는 전송할 병렬 데이터를 하나의 직렬 신호로 변환한다.Deserialize : 수신 측에서는 들어온 직렬 데이터를 다시 병렬 데이터로 변환한다.Impedance matching : 고속 데이터 전송 시 발생할 수 있는 신호 반사를 줄이기 위해 임피던스 매칭.. 2024. 10. 20.
DISM을 사용하여 Windows 기능 켜기/끄기 하는 법 보통 Windows 기능을 켜고 끄는 작업은 제어판 > 프로그램 및 기능에서 할 수 있는데 DISM(Deployment Image Servicing and Management)을 사용하면 명령줄로 켜고 끌 수 있다.     예를 들어 TFTP 기능을 켜고 끄는 건 관리자 권한으로 명령 프롬프트를 실행하고 다음 명령을 입력하면 가능하다.  - Windows 기능 켜기Dism /online /Enable-Feature /FeatureName:TFTP /All  - Windows 기능 끄기Dism /online /Disable-Feature /FeatureName:TFTP  - Windows 기능 사용 여부 확인하기Dism /online /Get-FeatureInfo /FeatureName:TFTP 2024. 10. 16.
Git ] push 또는 pull 할 때 Username과 Password 묻는 경우 1. 인증 방법 Git에서 HTTPS 프로토콜을 사용해 Private Repository에 접근하려고 하는 경우 Username과 Password를 요구한다. 그런데 2021년 부터 패스워드 인증방식은 지원하지 않기 때문에 깃허브의 경우 토큰을 발급받아서 입력해주면 된다. GitHub > 우측 상단 프로필 > Settings > Developer Settings > Tokens (classic) > 토큰의 유효기간을 설정하고 access 허용 범위를 체크로 선택한 후 토큰을 생성한다.   2. 인증 정보 저장 방법이렇게 해도 매번 push/pull 할 때마다 Username과 Password를 묻기 때문에 여간 귀찮은게 아니다. 이를 해결하기위해 git에서는 인증정보를 저장해두는 credential.he.. 2024. 10. 10.
PCIe PCIe에 대해 한번 알아보자. 먼저 PCI와 PCIe는 어떻게 다를까 1. PCI vs PCIe1.1 PCI (Peripheral Component Interconnect)개념 : PCI는 1992년에 인텔이 개발한 병렬 버스 인터페이스로 CPU와 주변 장치를 연결하는데 사용되었다.동작 방식 :병렬 전송 방식 : 여러 비트의 데이터를 병렬로 동시에 전송한다.버스 아키텍처 : 여러 장치들이 동일한 버스를 공유하여 데이터를 전송하는데 한 번에 하나의 장치만 버스를 사용할 수 있다. 또한 이 버스는 제한된 대역폭(32비트 또는 64 비트 폭, 33MHz 또는 66MHz 클럭속도)을 가진다.주소 기반 메모리 접근 : CPU는 PCI장치와 직접 메모리 주소를 기반으로 통신한다.속도 : 최대 533 MB/s의 속.. 2024. 10. 8.
LDD ] printk를 활용한 디버깅 1. printk커널 공간에서는 C 표준 라이브러리를 사용할 수 없으므로 printf와 유사한 printk를 사용한다.   2. printk 사용법사용법은 printf와 거의 동일하며 단순히 printf를 printk로 대체하면 된다.단, %f, %e 등 부동소수점 형식의 포맷지정자는 지원하지 않으며, linux/Documentation/printk-formats.txt에서 사용 가능한 포맷지정자를 확인할 수 있다. ex.printk("num: %d, hex: %x\n", num, hex_num); Typeprintk format specifierint%d / %xunsigned int%u / %xlong%ld / %lxunsigned long%lu / %lxlong long%lld / %llxunsig.. 2024. 10. 6.
LDD ] 리눅스 커널 모듈 In-tree building In-tree 빌드란? In-tree 빌드는 커널 모듈을 리눅스 커널 소스 트리 안에 추가하여 커널 빌드 시스템이 커널과 함께 해당 모듈을 빌드하도록 하는 방법이다. 이 방법을 사용하면 사용자는 menuconfig 명령어를 통해 메뉴 형태로 구성된 커널 설정 화면에서 모듈을 선택하거나 선택해제할 수 있다.   In-tree building 과정 요약리눅스 커널 소스 트리 내에 모듈 추가로컬 Kconfig 파일 작성로컬 Makefile 작성상위 레벨 Kconfig 파일에 로컬 Koconfig 파일 추가상위 레벨 Makefile에 로컬 Makefile 추가커널 소스 루트 디렉토리로 이동해서 make menuconfig를 이용해 설정 (Optional)커널 소스 루트 디렉토리로 이동해서 모듈 빌드  1. 리눅.. 2024. 10. 4.
LDD ] Hello World 커널 모듈 + Makefile 작성법 가장 단순한 예시인 Hello World 모듈로 커널 모듈을 빌드하고 실행해보면서 커널 모듈 작성법을 익혀보자.   hello.c /* HEADER SECTION BEGIN */#include/* HEADER SECTION END *//* CODE SECTION BEGIN */static int __init hello_init(void){ pr_info("Hello world\n"); return 0;}static void __exit hello_exit(void){ pr_info("Goodbye world\n");}/* CODE SECTION END *//* REGISTRATION SECTION BEGIN */module_init(hello_init);module_exit(hello_e.. 2024. 10. 2.
modprobe와 insmod의 차이 1. modprobe커널 모듈을 로드하는데 사용하는 명령어로 모듈의 이름만 지정하면 /lib/modules/$(uname -r) 경로에서 해당 모듈과 모듈의 의존성을 자동으로 처리해 로드한다.(ex. modprobe e1000e) 2. insmod커널 모듈 파일을 직접 로드하는 명령어로 모듈 파일(.ko)의 경로를 지정하여 로드해야 하며 모듈의 의존성을 자동으로 처리하지 않는다.(ex. insmod /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000e.ko) 2024. 9. 30.
리눅스 커널 모듈 (Linux Kernel Module) 1. Linux Kernel Module리눅스 커널 모듈은 리눅스 커널에 동적으로 로드하거나 언로드할 수 있는 코드 조각으로 커널의 기능을 확장하거나 특정 기능을 추가할 때 사용된다. 커널 모듈은 실행 중인 커널에 동적으로 추가될 수 있어 커널을 재부팅하지 않고도 기능을 추가하거나 제거할 수 있는 장점이 있다.   2. Linux Device Driver디바이스 드라이버는 특정 하드웨어 장치를 제어하기 위해 커널에서 실행되는 소프트웨어이다. 하드웨어 장치와 커널 간의 인터페이스를 제공하여 응용 프로그램이 하드웨어를 제어할 수 있게 하는 용도로 사용되며, 대부분의 디바이스 드라이버는 커널 모듈로 구현된다. 이를 통해 사용자가 원하는 하드웨어를 커널에 동적으로 추가하거나 제거할 수 있다. 즉, 커널 모듈은 .. 2024. 9. 28.
BBB ] 커널 업데이트 Host PC 정보 : Ubuntu 16.04 LTS, 64비트  1. 커널 소스 크로스 컴파일을 위한 툴체인 설치호스트는 x86이고 타겟은 ARM 아키텍처이므로 Linaro 사이트에서 크로스 컴파일을 위한 툴체인을 특정 경로에 다운받아 놓는다. https://releases.linaro.org/components/toolchain/binaries/$wget -c https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz 압축 해제$tar xf gcc-linaro-7.5.0-2019.12-x86_64.. 2024. 9. 26.
BBB ] Internet over USB 설정 전원공급에 사용되는 USB 케이블을 통해 PC의 인터넷 연결을 공유해서 사용할 수 있는 Internet over USB 기능 활성화 방법   호스트(Linux PC) 설정/etc/sysctl.conf에 다음 문장 주석 해제하여 IP 패킷 포워딩 enable$sudo vim /etc/sysctl.confnet.ipv4.ip_forward=1  ifconfig 명령으로 인터넷과 연결된 인터페이스의 이름을 확인해 둔다.$ifconfig  그 다음은 매번 리부트 시마다 실행시켜야 하는 명령이라 다음과 같이 스크립트 파일로 만들어 두고 실행 권한을 부여한다.$vim usbnet.shsudo iptables --table nat --append POSTROUTING --out-interface [인터페이스명] -j.. 2024. 9. 24.
커널 소스 분석을 위한 ctags 사용법 1. ctags란? ctags는 소스 코드 파일을 분석하여 함수, 변수, 매크로 등과 같은 기호의 정의와 선언 위치를 저장한 태그 파일(tags)을 생성하는 명령어이다. 생성된 태그 파일을 Vim과 같은 에디터과 같이 사용하면 소스 코드 내에서 함수나 변수가 정의된 위치로 빠르게 이동할 수 있다.    2. ctags 설치 $sudo apt-get install exuberant-ctags     3. tags(태그 파일) 생성 리눅스 커널의 Makefile에는 tags를 생성하는 타겟 명령이 포함되어 있기 때문에 커널 소스가 위치한 디렉토리로 이동한 후 아래 명령어를 입력하면 tags를 생성할 수 있다. 커널 소스의 규모가 방대해서 이 과정은 몇시간 걸리니 할일 없을 때 실행시켜 놓으면 된다. $mak.. 2024. 9. 22.
Windows ] IP가 169.254.x.x로 설정되어 바뀌지 않을 때 해결 방법 169.254.x.x로 시작하는 IP는 PC에서 DHCP 서버에 IP 할당을 요청했지만 받지 못했을 때 윈도우에서 임의로 부여하는 IP이다. 만약 유동 IP를 사용하는 경우 DHCP 서버(가정집에서는 공유기)를 껐다 키거나 초기화하여 해결 시도해볼 수 있다. 아래에선 고정 IP를 사용하는 경우 윈도우의 IP 임의 부여 기능을 비활성화하는 방법이다.  1. ipconfig 명령을 통해 169.254.x.x로 설정된 인터페이스 명을 확인한다.ipconfig  2. 아래 명령으로 해당 인터페이스의 색인 번호를 확인한다.netsh interface ipv4 show inter     3. 확인한 색인번호를 사용해 아래 명령을 실행한다.netsh interface ipv4 set interface [색인번호] d.. 2024. 9. 20.
Ubuntu 16.04 ] 고정 IP 설정 + 디폴트 게이트웨이 우선순위 변경 1. ifconfig 명령어를 사용해 이더넷 인터페이스 명 확인$ifconfig   2. 네트워크 설정 파일 수정에디터를 사용해 설정 파일을 연다.$sudo vim /etc/network/interfaces 만약 lo 설정이 있다면 루프백 인터페이스니 그냥 두면된다. 그리고 설정하려는 인터페이스가 dhcp로 설정되어있으면 주석처리 해주고 아래와 같이 고정 IP 설정을 한다.auto eth0iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 :wq로 파일 저장 후 빠져나온다.  3. 네트워크를 재시작한다.$sudo systemctl restart networking.service   고정.. 2024. 9. 18.
Minicom 사용법 1. Minicom이란?미니컴은 리눅스 환경에서 사용되는 터미널 에뮬레이터이다.  2. Minicom 설치하기# Debian/Ubuntu 계열$sudo apt-get install minicom 3. 디바이스 인식 확인디바이스를 연결한 후 dmesg 명령어로 시스템로그를 확인해 디바이스가 올바르게 인식되었나 확인해보자. USB 시리얼 통신 장치의 경우 보통 /dev/ttyUSBx와 같은 이름으로 나타난다. 만약 올바르게 인식되지 않았다면 디바이스 드라이버를 설치해야 할 수도 있다.dmesg  4. Minicom 설정하기Minicom을 처음 실행하기 전에 통신 설정을 구성해야 한다. 이를 위해 -s 옵션을 사용해 설정 메뉴를 열고 설정한다.sudo minicom -sSerial port setup: 직렬 .. 2024. 9. 16.
Ubuntu ] 터미널 관련 단축키 Ctrl + Alt + T : 새로운 터미널 창 열기Ctrl + Shift + T : 현재 터미널 창에서 새로운 탭 열기Ctrl + Shift + N : 새로운 터미널 창 열기Ctrl + D : 현재 터미널 탭이나 창을 종료Ctrl + Page Up/Page Down : 터미널 탭 간 이동Alt + 숫자키 : 해당 번째 터미널 탭으로 이동 exit : 터미널 세션 종료clear : 터미널 화면 지우기reset : 터미널 리셋 Ctrl + C : 현재 명령어 중지Ctrl + Z : 현재 작업을 백그라운드로 일시 중지, fg 명령어로 다시 실행 가능 Ctrl + Shift + C : 터미널에서 텍스트 복사Ctrl + Shift + V : 터미널에 텍스트 붙여넣기 2024. 9. 14.
Ubuntu ] 화면 캡쳐(스크린샷) 단축키 전체 화면 캡쳐 : PrtScPrint Screen 키를 누르면 현재 화면 전체가 캡쳐 된다. 캡쳐된 이미지는 ~/Pictures 폴더에 저장된다.현재 활성창 캡쳐 : Alt + PrtSc현재 활성화된 창만 캡쳐된다.선택 영역 캡쳐 : Shift + PrtSc마우스로 캡쳐할 영역을 선택할 수 있다.선택 영역 캡쳐 + 캡쳐한 사진 클립보드에 복사 : Ctrl + Shift + PrtSc선택 영역 캡쳐 이후 Ctrl + V 로 붙여넣기 가능하다. 2024. 9. 12.
Ubuntu ] Num lock 키 자동 활성화 하기 Ubuntu에서 부팅 시 Num lock 키가 비활성화 되어 있어 매번 눌러줘야 하는 불편함이 있다. 이를 해결하기 위한 방법을 소개한다.    1. numlockx 설치$ sudo apt install numlockx  2. LightDM 디스플레이 매니저 구성 파일을 에디터로 열기sudo vim /usr/share/lightdm/lightdm.conf.d/50-unity-greeter.conf  3. 맨 아래 문구 추가하기greeter-setup-script = / usr / bin / numlockx on   이렇게 하면 로그인 화면에서 Num lock 키가 자동 활성화 된다. 2024. 9. 10.
ADC SNR ADC SNR (Signal to Noise Ratio) 신호와 잡음의 비율을 나타내는 SNR은 ADC 회로 상에서 발생하는 노이즈와 신호의 비율을 나타내기 위해서도 사용한다. 즉, 해당 값이 클수록 설계한 ADC 시스템이 신호에 비해 잡음이 얼마나 적고, 신호를 얼마나 정확하게 전달하는지 나타낸다. 이전 글(https://eteo.tistory.com/917)에서도 설명하였는데 SNR은 신호 수준 대 노이즈 수준의 비에 상용로그를 취한 뒤 20을 곱하여 dB 스케일로 표현한다. 단, ADC SNR을 말할 때의 '노이즈'는 양자화 오류만을 고려한 값이다. SNR은 내부 회로의 잡음이나 열 잡음, 전자기 간섭이로 인한 잡음 등 추가 잡음원을 고려하지 않고 양자화 오류만을 고려한 이상적인 값으로 ADC 시스.. 2024. 9. 8.