라벨이 개발인 게시물 표시

ESP32 S3 아두이노 디버깅.

보스 셋팅(보드 옵션, 파티션 등), 라이브러리 로깅 등의 정보가 필요할 때 사용합니다. - 보드 옵션. DebugLevel=verbose  사용한 보드가 DebugLevel 옵션을 지원하는지 체크하는 명령어.  arduino-cli --config-file arduino-cli.yaml board details -b esp32:esp32:esp32s3 esp32:esp32:esp32s3 는 사용할 보드로 변경합니다. 컴파일, sketch.yaml 에 fqbn 부분에 DebugLevel=verbose 을 추가하면 됩니다. fqbn: esp32:esp32:esp32s3:USBMode=hwcdc,CDCOnBoot=cdc,DebugLevel=verbose 아래처럼 상세한 보드 정보가 나오고, 사용하는 라이브러리의 로그도 보입니다. [2025-11-06 20:48:02] =========== Before Setup Start =========== [2025-11-06 20:48:02] Chip Info: [2025-11-06 20:48:02] ------------------------------------------ [2025-11-06 20:48:02]   Model             : ESP32-S3 [2025-11-06 20:48:02]   Package           : 0 [2025-11-06 20:48:02]   Revision          : 0.02 [2025-11-06 20:48:02]   Cores             : 2 [2025-11-06 20:48:02]   CPU Frequency...

Arduino CLI ESP32-S3-WROOM-1 N16N8 ota update 파티션 설정하는 방법.

파티션 설정 방법. 파티션 테이블 확인 방법. ================================== 파티션 설정 방법. ================================== esp32의 오프셋 규칙이 있어, 맞춰서 설정해야 함. ESP32-S3-WROOM-1 N16N8 ota update  app는 5m, nvs는 512KB 로 설정함. 저는 필요성이 있어 nvs를 많이 크게 잡았습니다.  partitions.csv # Name,   Type, SubType, Offset,     Size,       Flags otadata,  data, ota,     0x9000,     0x2000, app0,     app,  ota_0,   0x10000,    0x500000, app1,     app,  ota_1,   0x510000,   0x500000, nvs,      data, nvs,     0xA10000,   0x80000, spiffs,   data, spiffs,  0xA90000,   0x570000, partitions.csv 파일을 프로젝트 폴더의 filename.ino 와 같은 폴더에 위치 합니다. 이러기만 해도 다른 설정을 무시하고 자동으로 적용되는 거 같습니다. 하지만 더 정확히 하기 위해 sketch.yaml 의 설정을 다음과 같이 합니다. fqbn: esp32:esp32:esp32s3:PartitionScheme=custom,FlashSize=16M (예제를 위해 다른 설정을 지웠습니다.)  ...

Arduino CLI 윈도우에서 포터블로 사용하기.

arduino-ide_2.3.6_Windows_64bit 기준으로 작성 했습니다. 이 문서는 다음 항목으로 구성 됩니다. 설치. 자주 사용하는 명령어. 사용법. 명령어. ======================================= 설치. ======================================= - Arduino CLI 다운로드. https://www.arduino.cc/en/software/ 에서 arduino-cli_#.#.#_Windows_64bit.zip 을 다운로드 받아 압축을 풉니다. #는 버전번호로 최신버전을 받으면 됩니다. - 이 다음부터는 아래 폴더구조라고 가정합니다.  폴더는 아래 설정에 따라 설치 중에 자동으로 만들어 집니다.  D:\Tools\ArduinoCLI\   ├─ arduino-cli.exe        ← ZIP에서 꺼낸 실행 파일   ├─ arduino-cli.yaml       ← 포터블 설정 파일(직접 만듦)   ├─ data\                  ← 코어/툴/캐시(Arduino15 대체)   ├─ user\            ← 스케치/라이브러리   └─ libraries\               ← 실행용 배치파일(선택) - arduino-cli.yaml 파일 생성. arduino-cli.exe config init --config-file .\arduino-cli.yaml - arduino-cli.yaml 편집.  아래와 같이 편집해 주세요. 자세한 설명은 URL을 참조하세요. https://docs.arduino.cc/arduino-cli...

c언어 int, unsigned long, int32_t, uint32_t 차이

int 크기(비트)가 플랫폼에 따라 다름. (최소 16비트) ESP32, 윈도우, 리눅스, macOS (32/64비트) 등 대부분의 최신 시스템에서는 32비트 (4바이트)입니다. 부호 지원. int i = -10; unsigned long 크기(비트)가 플랫폼에 따라 다름. (최소 32비트) ESP32 32비트, 윈도우 x64 32비트 (4바이트), 64비트 리눅스/macOS에서는 64비트 (8바이트)입니다. 부호 지원되지 않아 양의 수만 가능. uint32_t u = unsigned, int = integer, 32 = 32 bits, _t = type 크기(비트)가 항상 32비트 (4바이트) 부호 지원되지 않아 양의 수만 가능. 이 타입을 사용하기 위해서는 <stdint.h> (C) 또는 <cstdint> (C++) 헤더 파일을 포함해야 합니다. 크기가 명확해야 할 때 사용함. int32_t uint32_t 와 부호만 다름. 부호 지원. int32_t i = -10;

c언어 const, constexpr 차이

  const 이 변수는 초기화된 후에는 절대 변경할 수 없다. 이 값은 런타임에 결정될 수도 있습니다. 파일에 있는 설정 값을 읽어와 초기화 하는 경우. int getUserInput() {     int input;     std::cin >> input;     return input; } // 런타임에 값을 받아 const 변수 초기화 const int MAX_VALUE = getUserInput();  constexpr 이 변수는 컴파일 타임에 값이 결정되며, 절대 변경할 수 없다. 이 값은 반드시 컴파일 시점에 알아야 합니다. 컴파일 할 때 이미 그 값을 숫자로 대체할 수 있어 최적화에 유리 합니다. constexpr int x = 100;

아두이노 프로젝트 폴더 설명.

 v. Arduino IDE 2.3.6 ------ 추가. 라이브러리를 프로젝트 폴더에 추가하려면 src, libraries 폴더에 있는 라이브러리를 include 하기 위해서는 전체 경로를 써줘야 합니다. #include "src/MyLibrary/src/MyLibrary.h"  뭔가 오락가락 하는거 같습니다. https://github.com/arduino/Arduino/issues/5186 ------ 폴더 이름 주 사용 위치 IDE/빌드 시스템 동작 주 용도 src 스케치 / 라이브러리 컴파일 대상에 포함 핵심 소스 코드 (.h, .cpp) utility 라이브러리 컴파일 대상에 포함 라이브러리 내부 보조 코드. 권장하지 않음. data 스케치 파일 시스템에 업로드 (컴파일 X) 웹페이지, 설정 파일 (.html, .json) examples 라이브러리 IDE '예제' 메뉴에 표시 라이브러리 사용 예제 (.ino) docs 스케치 / 라이브러리 무시 (인식 안 함) 프로젝트 문서 (Markdown, PDF) tests 스케치 / 라이브러리 무시 (인식 안 함) 유닛 테스트 코드 extras 기타 무시 (인식 안 함) 기타 자료 (데이터시트, 3D 모델) schematics 스케치 / 라이브러리 무시 (인식 안 함) 하드웨어 회로도 assets 스케치 / 라이브러리 무시 (상황에 따라 다름) 리소스 파일 (이미지, 폰트 원본) 1. 아두이노 IDE가 특별하게 인식하는 폴더. 이 폴더들은 아두이노 IDE가 컴파일하거나 메뉴에 표시하는 등 특별한 기능을 수행합니다. - src 아두이노의 공식 스펙은 src를 표준으로 권장합니다. 이 폴더 안의 모든 .c, .cpp 파일은 스케치와 함께 자동으로 컴파일됩니다.  .ino 파일이 너무 길어질 때 코드를 기능 별로 분리하거나, 해당 스케치에서만 사용할 라이브러리를 넣을 때 사용합니다. 하위 폴더를 자유롭게 둘 수 있고, 아키텍처별 코드를 src/arch/avr, src/arch/e...

pdf 분할하는 파이썬 스크립트.

import os import tkinter import tkinter . filedialog import tkinter . messagebox # pip install PyPDF2 from PyPDF2 import PdfReader, PdfWriter # pdf 파일 경로 print ( "Select PDF File." ) pdf_path = tkinter . filedialog . askopenfile () # 출력 폴더 print ( "Select Save Folder." ) pdf_path_dest = tkinter . filedialog . askdirectory () # PDF 파일 읽기 reader = PdfReader( pdf_path . name ) chapter_ranges = {     "제01장" : ( 13 , 22 ),     "제02장" : ( 23 , 37 ),     "제03장" : ( 39 , 54 ),     "제04장" : ( 55 , 74 ),     "제05장" : ( 75 , 90 ),     "제06장" : ( 91 , 113 ),     "제07장" : ( 115 , 137 ), } # 분할된 파일 저장 경로 output_files = {} for chapter , ( start , end ) in chapter_ranges . items ():     writer = PdfWriter()     for page_num in range ( start - 1 , end ):   # 페이지 인덱스는 0부터 시작         writer .add_page( reader .pages[ page_num ])     output_path = f " { pdf_...

Godot 에서 해상도 화면 비율 유지하는 방법.

화면 비율 설정. 화면 비율을 유지한채 윈도우 창 사이즈를 변경하는 방법.  아래 예의 해상도는 FHD 1920 1080. - Project Settings에서 다음 항목들을 설정합니다. Display > Window > Viewport Width: 1920 Display > Window > Viewport Height: 1080 Display > Window > Mode: "windowed" Display > Window > Stretch Mode: "viewport" Display > Window > Stretch Aspect: "keep" - 윈도우를 마우스로 사이즈 조절할때 비율을 유지하는 코드. var window_size = Vector2i(1920, 1080)  # 초기 해상도 설정 func _process(_delta):     if DisplayServer.window_get_size() != window_size:         var window_w = DisplayServer.window_get_size().x         var window_h = window_w / 16.0 * 9.0                  DisplayServer.window_set_size(Vector2i(window_w, window_h))         window_size = DisplayServer.window_get_size()

git 오류 수정 - fatal: detected dubious ownership in repository at

- 에러 메세지. fatal: detected dubious ownership in repository at <PATH> - 해결. 저장소마다 safe.directory로 지정해야 함. git config --global --add safe.directory P:\_git\path 저장소 폴더를 통채로 지정할 수도 있음. git config --system --add safe.directory P:\_git\* 컴퓨터를 혼자 사용할 경우 아래와 같이 모두 풀어도 무방함. git config --global --add safe.directory '*' 설정은 다음 경로의 파일에 있음. C:\Users\<NAME>\.gitconfig or C:/Program Files/Git/etc/gitconfig - 원인. git 저장소는 한 사용자만 사용해야 함. 한 컴퓨터를 여러 명이 사용하거나, 공유 폴더에 놓고 사용할 경우 다른 유저가 접근할 수 있어 문제가 생김. 그래서 사용자가 다를 경우 접근하지 못하도록 막았음. safe.directory 옵션을 만들어 다른 컴퓨터에서 복사해 오거나 등의 경우 사용할 수 있도록 했음. - 참고. https://stackoverflow.com/questions/71849415/i-cannot-add-the-parent-directory-to-safe-directory-in-git https://github.com/git/git/commit/8959555cee7ec045958f9b6dd62e541affb7e7d9

Dart 3 ready (flutter) 소식.

https://pub.dev/ 의 라이브러리에 'Dart 3 ready' 마크를 보고 찾아 봤습니다. 개발자 입장에서 꼭 체크해야 할 부분은  - null safe 강제 입니다. Dart 2 버전까지는 컴파일 옵션으로 null safe를 끌 수 있었습니다. 하지만 Dart 3 부터는 null safe를 끌 수 없습니다. 이외에  - Dart 언어에 추가되는 언어 스펙이 있습니다. - 커맨트 라인 툴 들이 통합됩니다.  예) dartfmt 가 dart format 으로. 즉 앞으로는 dart format 형식으로 만들어야 합니다. - 2023년 봄에 Dart 3 베타 버전 출시를 계획하고 있습니다. 직접 작성한 코드와 외부 라이브러리도 null safe를 사용했다면 크게 손 볼 곳은 없을 거 같습니다. 하지만 버전업 초기의 혼란은 있을 수 있으니 가급적 Dart 3 출시 일정은 피하는 게 좋을 거 같습니다. - 출처. https://medium.com/dartlang/dart-3-alpha-f1458fb9d232 https://medium.com/dartlang/the-road-to-dart-3-afdd580fbefa https://github.com/dart-lang/sdk/issues/46100 https://github.com/dart-lang/language/blob/master/accepted/future-releases/0546-patterns/feature-specification.md

dart (flutter) 문법 - import, show, hide, as

import 문법에 대해 살펴 봅니다. import 문은  현재 dart파일에서  다른 dart 파일이나 외부 라이브러리의  클래스, 함수, 변수 등의 것을 가져다 쓸 때 사용합니다. import 할 때 옵션을 줄 수 있습니다. 아래에 설명과 코드를 보면 됩니다. // import 만 사용하면 다음과 같이 사용할 수 있습니다. import 'dart:io' ; Directory directory = Directory ( "path" ); // as는 라이브러리에 접두사를 지정합니다. // 주로 다른 라이브러리와 충돌을 피하기 위해 사용합니다. import 'dart:io' as MyIO ; MyIO . Directory directory = MyIO . Directory ( "path" ); // dart:io에서 Directory만 가져옵니다. import 'dart:io' show Directory ; // dart:io에서 Directory를 제외한 나머지를 가져옵니다. import 'dart:io' hide Directory ; // 지연된 로딩을 지원하는데 JavaScript에서만 지원합니다. import 'package:greetings/hello.dart' deferred as hello ; Future < void > greet () async {   await hello .loadLibrary();   hello .printGreeting(); } - 참고. https://dart.dev/guides/language/language-tour

유튜브 아카이브.

* 설명.  - 유튜브 채널 동영상을 보관.  - 설명도 같이 보관해 줌.  - 동영상에 직접 작성한 노트를 달 수 있음. * 단점.   - 자막은 지원되지 않음. * 프로젝트 사이트.   - https://github.com/Owez/yark * 준비.   - Python 3.9+ 설치되어 있어야 함. * 설치.   - pip3 install yark     + 설치 로그에 보면 설치 위치가 나옴.     + 내 설치 위치는 C:\Users\<유저이름>\AppData\Roaming\Python\Python311\Scripts * 사용.   - 저장소 생성.     + yark new foobar https://www.youtube.com/channel/dasjfl3423sdkjf     + yark new foobar https://www.youtube.com/@name     + 저장소를 생성할 뿐 다운로드 받지 않음.     + @name, fsjlfj234 두 가지 채널 형식 지원.   - 다운 받기.      + yark refresh foobar      + 이전에 다운 받은 폴더라면 이후 갱신 된 내용만 받음.   - 보기.      + yark view foobar      + 실행하면 브라우저를 열어 보여줌.      + 폴더에서 동영상을 직접 보는 건 불편함.

오픈 소스 사회적 자산.

SQLite의 알려지지 않은 이야기 https://news.hada.io/topic?id=4558   위 글을 읽다 보니 몇 가지 생각나서 적어 봅니다. - 모질라 재단의 Mitchell Backer가 이걸 어디선가 듣고 전화를 걸어옴 - 그때쯤에 항공전자공학(Avionics) 회사인 Rockwell Collins와 일을 하고 있었는데, 그들이 DO-178B [2] 개념을 소개해줬음. 전 세계에 오픈 소스 프로젝트들이 있지만  개인 개발에서 벗어나  지속적으로 유지 보수 발전 되는 건 미국 쪽이 압도적인데 이런 이유가 있던 거 같습니다. 아이디어와 능력이 있고 어느 정도 실적을 내면 더 발전할 수 있도록 지원해 줄 수 있는 시스템이 있습니다.  각종 오픈소스 재단들. 재정, 법적, 운영에 대한 지원을 해주는 거 같습니다. https://www.gnu.org/gnu/thegnuproject.ko.html https://www.linuxfoundation.org/ https://www.mozilla.org/ko/ -2001~2002년 사이, 모토로라가 자신들의 새로운 전화 OS에 SQLite를 넣겠다고 전화가 옴. 필요한 기능을 지원해주면 비용을 내겠다는 것. -  https://www.linuxfoundation.org/about/members 기업체가 사용하고 비용 지원까지 해주는 문화. 최근엔 조금 나아졌지만 한국 경영자들은 기능 요구만 하거나 베끼라고 하거나 훔쳐 쓰거나 오픈소스에 전혀 기여하지 않을 거 같습니다. 한국에도 오픈소스 개발자들이 있었으나 대부분 나가 떨어졌습니다. 생업에 바쁜 나머지 돈 안되는 오픈소스를 유지하기 힘듭니다. 거기에 오픈 소스 사용하면서 기여는 하나도 안 하면서 화내고 욕하는 덜 떨어진 것들도 많죠. 한국은 MP3 기기에 대한 특허를 가졌던 회사를 박살 낸 사례가 있습니다. 사회적인 시스템이 약육강식, 약탈적 이죠. 미국 리눅스 재단을 보면 국내 회사도 있습니다. 미국 문화에서...

git upgrade - windows

* 터미널이나 명령 프롬프트를 열어 실행한다. * 어차피 설치 파일 다운 받아 실행해주는데 손으로 하는 거보다는 빠르다. * 버전 확인. git -v * 업그레이드. git update-git-for-windows

python 가상환경 사용법. venv.

  /////////////////////////////////////////////// // 가상환경 생성 및 사용. * 생성. 가상환경을 만들고 싶은 폴더에서 아래 명령을 실행한다. python -m venv test python 특정 버전을 지정할 때는 아래와 같이 하면 된다. C:\Program Files\Python311\python.exe -m venv test * 활성화. cd test Scripts\activate.bat  -실행. (example) D:\temp\test> -커맨드 창에 이렇게 표시되면 성공. - PowerShell 에서는 아래 파일 실행. .\Scripts\Activate.ps1 * 비활성화. deactivate * python 스크립트 사용. 위의 활성화(activate)한 커맨드에서  python test.py /////////////////////////////////////////////// // 가상환경 package list 사용. * 가상 환경을 활성화한(activate) 커맨드에서 package를 설치하면 아래 폴더에 설치된다. test\Lib\site-packages - 가상환경에서 사용하는 package를 리스트로 만들어 편하게 사용할 수 있다. 물론 가상환경을 사용하지 않는 곳에서도 사용할 수 있다. * 생성. pip freeze > requirements.txt * 설치. pip install -r requirements.txt * 삭제. pip uninstall -r requirements.txt -y /////////////////////////////////////////////// // 가상환경 주의. * 가상환경 설정이 절대경로로 되어 있어 폴더를 옮기면 가상환경이 실행되지 않는다. D:\temp\test\Scripts 의  activate.bat, Activate.ps1, activate 파일 안의  VIRTUAL_ENV 의 폴더를 변경해야 ...

python package list 간단 사용법. requirements.txt

python에서  requirements.txt를 만들어  package list 설치를 쉽게 할 수 있다. * 생성. pip freeze > requirements.txt * 설치. pip install -r requirements.txt * 삭제. pip uninstall -r requirements.txt -y

vscode 디버깅 할 때 arguments 넣는 방법.

vs code에서 Ctrl + Shift + d 를 누르고 "launch.json" 파일을 열거나 만듭니다. 아래 "args": ["arg1", "art2"] 형태로 arguments를 넣을 수 있습니다. 구성을 여러 개 만들어 구성에 따라 arguments를 다르게 설정해서 디버깅 할 수 있습니다.     "configurations" : [         {             "name" : "test" ,             "request" : "launch" ,             "type" : "dart" ,             "args" : [ "arg1" , "art2" ]         },         {             "name" : "test2" ,             "request" : "launch" ,             "type" : "dart" ,             "args" : [ "333" , "555" ]         }     ]

dart 프로젝트 생성, 실행, 컴파일.

* 커맨드 창에서 실행 가능 합니다. 프로그램 만드는데 필요한 몇 가지 명령어를 정리 합니다. * 프로젝트 생성.   - dart create -t console test * 실행.   - dart run * 컴파일.   - dart compile exe bin/test.dart * 라이브러리 명령어.   - dart pub get * vscode에서 몇 가지 명령어를 사용할 수 있습니다.   - Ctrl + Shift + p 단축키 다음 dart 를 치면 실행할 수 있는 명령어가 보입니다. * 참고.   - Get started https://dart.dev/tutorials/server/get-started     - dart create https://dart.dev/tools/dart-create     - dart compile https://dart.dev/tools/dart-compile     - dart pub https://dart.dev/tools/pub/cmd     - dart run https://dart.dev/tools/dart-run  

flutter 폴더에서 File List 가져오기. 안드로이드.

* 안드로이드에서 파일 목록을 가져오는 방법.   - 안드로이드의 파일 관련 권한과 Storage Access Framework (SAF) 때문에 기본 API가 동작하지 않습니다. 그래서 아래 라이브러리를 사용 했습니다.   - 안드로이드 13(sdk 33)에서는 Uri 형태로 폴더를 넘기고 파일을 받아야 접근이 됩니다.  Uri 예) content://com.android.externalstorage.documents/tree/primary https://pub.dev/packages/shared_storage   // 폴더 선택 방법. final Uri ? dirUri = await openDocumentTree (); // 파일 리스트 함수 사용.   var audioList = await getFileList ( dirUri , ".(mp3|wav)" );   Future < List < DocumentFile >> getFileList ( String audioPath , String regex ) async {     const List < DocumentFileColumn > columns = < DocumentFileColumn >[       DocumentFileColumn . displayName ,       DocumentFileColumn . id ,       DocumentFileColumn . mimeType ,     ];     final List < DocumentFile > files = [];     final Uri audioPathUri = Uri . parse ( audioPath );     final ...

Android - 앱 서명키 인증서, 업로드 키 인증서 차이. 간략한 설명.

* 앱 서명키 인증서, 업로드 키 인증서는 아래에서 확인 할 수 있습니다.   * 구글 플레이 콘솔 -> App로 이동 -> 설정 -> 앱 무결성 -> 앱 서명.   *   https://play.google.com/console * 앱 서명키 인증서 - 사용자가 다운 받은 APP에 서명되어 있는 인증서. * 업로드 키 인증서 - 개발자가 구글 플레이 콘솔에 APP을 올릴 때 사용하는 인증서. * 동작 설명.   - 업로드 키를 잃어버리면 구글 플레이 콘솔에서 새로 APP을 만들어야 합니다. 기존 사용자와 APP 실적이 리셋 되기 때문에 활성화된 APP의 경우 문제가 큽니다.   - 이를 방지하고자 구글에서 생성한 인증서로 사용자가 받는 APP에 인증 합니다.    - 개발자가 APP을 올릴 때는 기존과 같이 개발자가 만든 인증서를 사용합니다. * 장점. ``` 개발자가 인증서를 잃어버리거나 해킹 당해도  업로드 키 인증서를 구글에 요청하여 교체하면  APP을 다시 만들 필요 없이 계속해서 서비스 할 수 있습니다. 업로드 키 인증서가 변경 되도 사용자에게 배포된 인증서는  구글에서 생성한 앱 서명키 인증서는  변경 없이 계속 사용하기 때문 입니다. ``` * 적용.   - 새 APP은 이를 위해서 별다른 작업은 필요 없는 거 같습니다. 저의 경우 다른 설정 없이 기존에 하던 대로 인증서 만들고 APP를 올렸더니 자동으로 적용되어 있었습니다.   - 기존 APP에 이를 적용하기 위해서는 키 파일을 구글 플레이 콘솔에 올려야 합니다. * 업로드 키를 잃어버리면 구글 플레이 콘솔에서 새로 APP을 만들어야 하는 것을 이해하지 못했다면 아래 예를 참고하세요. ``` com.ex.app_test 라는 도메인의 APP이 있었을 경우 com.ex.app_test와 인증서가 1:1로 묶여 있어 인증서를 잃어버리면 ...