younjung1996의 등록된 링크

 younjung1996로 등록된 네이버 블로그 포스트 수는 90건입니다.

[C/C++ Tip] 21. C언어 반복문: For문 [내부링크]

C언어에서 for문은 반복적인 작업을 처리하는 데 필수적인 도구이다. 강력하고 유연한 이 반복문을 통해 코드의 효율성을 극대화하고, 가독성을 향상시킬 수 있다. 이 포스팅에서는 for문의 기본 사용법, 고급 활용법, 그리고 주의사항을 포함한 종합 가이드를 제공한다. For문의 기본 구조 for문의 기본 구조는 다음과 같다: for (초기화; 조건; 증감) { // 반복할 코드 블록 } 초기화: 반복문이 시작할 때 한 번 실행되며, 반복문의 제어 변수를 초기화한다. 조건: 반복문의 계속 여부를 결정하는 조건이다. 이 조건이 거짓이 되면 반복문이 종료된다. 증감: 반복문의 각 반복이 끝날 때마다 실행되어 제어 변수를 증가시키거나 감소시킨다. Code 예시 #include <stdio.h> int main() { int numbers[] = {1, 2, 3, 4, 5}; int sum = 0; for (int i = 0; i < 5; i++) { sum += numbers[i]; } pr

우분투 명령어 모음 [내부링크]

Ubuntu 20.4 내가 매번 찾는게 귀찮아 자주 사용하는 우분투 명령어 모음을 정리해뒀다. 0. 서버 재시작 sudo reboot now 1. 설치 되어있는 패키지들의 새로운 버전이 있는지 확인할 때 해당 명령어를 사용한다. sudo apt-get update 2. 위에 있는 apt-get update를 통해서 확인한 패키지들의 최신 버전에 따라서 패키지들의 버전을 업그레이드 해주는 명령어이다. sudo apt-get upgrade 3. vi (vim 편집기) 설치 sudo apt-get install vi 3. 현재 작업 중인 디렉토리 경로 출력 pwd 4. 디렉토리 생성 mkdir 5. 포트 열기 sudo ufw allow "포트번호" 6. 포트 확인 netstat -tnlp 7. 해당 키워드가 포함된 출력 결과만 확인하기 netstat -tnlp | grep "검색어" 8. ping을 통해 네트워크 확인(ICMP) ping 8.8.8.8 9. 동작하고 있는 프로세스 확인 (

[C/C++ Tip] 22. C언어 반복문 : While문 [내부링크]

C언어에서 while문은 주어진 조건이 참(true)인 동안 코드 블록을 반복 실행하는 데 사용된다. while문은 조건이 반복의 시작에 평가되므로, 조건이 처음부터 거짓인 경우 코드 블록은 한 번도 실행되지 않을 수 있다. while문의 기본 구조 while (조건) { // 조건이 참인 동안 실행할 코드 } #include <stdio.h> int main() { int i = 0; // 반복문 제어를 위한 변수 초기화 while (i < 5) { printf("%d\n", i); i++; // 변수를 증가시켜 eventually 반복문 종료 조건에 도달하게 함 } return 0; } 위의 코드는 i가 5보다 작은 동안 i의 값을 출력하고, i를 하나씩 증가시킨다. i가 5에 도달하면 조건이 거짓이 되어 while 반복문이 종료된다. break break 문은 while 반복문 (또는 다른 반복문) 내부에서 반복을 즉시 종료시키는 데 사용된다. 이는 특정 조건이 충족될 때 반복

Vim 명령어 모음 [내부링크]

Vim (Vi IMproved)은 강력한 텍스트 에디터로, 리눅스와 유닉스 시스템에서 널리 사용된다. Vim은 효율적인 텍스트 편집을 위한 다양한 명령어를 제공한다. 매번 찾는게 귀찮아 내가 보기 위한 자주 사용하는 Vi(Vim) 명령어 모음을 정리해뒀다. Vim 설치 sudo apt-get install vim Vi/Vim 단축키 모음 입력 모드 진입 입력 모드 진입 - esc 기본 명령어 입력 모드를 진입했다는 전제 i: 현재 커서 위치에서 입력 모드로 전환 :w: 파일 저장 :q: Vim 종료 :wq 또는 :x: 파일 저장 후 종료 :q!: 강제 종료 복사 y : 복사 yy : 현재 줄 복사 붙여넣기 :esc - p : 붙여 넣기 :ctrl + shift + v : 외부에서 붙여넣기 되돌리기 :esc - u : 되돌리기 :Ctrl + r : 되살리기 삭제 :dd : 커서가 있는 행을 삭제 :D : 커서 위치부터 행의 끝까지 삭제 검색 / [찾고자 하는 문자열] n : 다음 검색

Flutter Nginx 웹 배포 [내부링크]

flutter web flutter의 최고 장점은 Android, iOS를 한 번에 배포 가능하며, 이를 넘어 웹과 앱을 전부 배포할 수 있다는 큰 장점이 있다. 웹의 경우, 싱글 페이지 어플리케이션(SPA : Single Page Applicaiton)로 하나의 index.html로 여러 페이지를 구성할 수 있다는 특징이 있다. SPA는 기존 서버사이드 렌더링을 기반으로 하는 웹과 달리 처음 웹을 로딩할 때만 서버로부터 모든 페이지를 한번에 받아와 한 HTML 파일을 만들고, 이후 데이터만 동적으로 업데이트하는 웹 애플리케이션이다. 즉, SPA 웹 안에 html, css, javascript 등 모든 정보가 첫 로딩 시에 내장되어 있다는 뜻이다. 새로운 데이터(동적 데이터)가 필요할 때면, Ajax와 같은 API로 서버로부터 JSON으로 전달 받아 웹 측(JS)에서 페이지를 동적으로 렌더링한다. 이때, 동적으로 렌더링한다는 것은 클라이언트 사이드 렌더링(CSR)을 일컫는다. 기존

[머신러닝] 데이터 스케일링 : 로그 변환 (feat: Kaggle, Bike Sharing Demand) [내부링크]

이번 포스팅은 데이터 스케일링 중 하나인 로그 변환을 굉장히 잘 활용한 대표 예시를 보여 주며, 머신러닝 공부를 한다면 한 번 쯤 언급될 데이터셋 중 하나이다. Kaggle에서 열리는 대회 중 하나 인 자전거 공유 수요는 상당한 수준의 인기와 참여를 보여준다. 날씨, 시간 및 기타 관련 데이터와 함께 과거 사용 패턴을 분석하여 참가자들이 워싱턴 DC의 자전거 대여 수요를 예측하는 과제이다. 특히 가장 높은 Vote를 받은 카글의 "EDA & Ensemble Model (Top 10 Percentile)"은 데이터 스케일링을 가장 적절히 활용하였다. Kaggle : Bike Sharing Demand https://www.kaggle.com/c/bike-sharing-demand/discussion?sort=votes Bike Sharing Demand Forecast use of a city bikeshare system www.kaggle.com 훈련 데이터는 하기 링크에서 받으면

Flutter 버전 업그레이드 방법. (Error: No pubspec.yaml file found.) [내부링크]

BLE IPS 프로젝트 이 후, 플루터를 다시 할려고 하니 제법 업그레이드가 많이 나와있다. flutter --version cmd 화면에 위 명령어를 입력하여 flutter의 버전을 확인한다. 흠. 3.0.1 버전이다. 거의 flutter 3 버전이 나왔을 때 처음 사용해본 듯하다. flutter upgrade 위 명령을 통해 flutter를 업그레이드 진행한다. ?. Error: No pubspec.yaml file found. This command should be run from the root of your Flutter project. Do not run this command from the root of your git clone of Flutter. 에러가 발생한다. 머지? 재설치할 필요 없으니 아래 방법으로 실시한다. 간단히 찾아보니 기본 경로에서 실행하는 것이 아니라 flutter project 경로에서 터미널에서 실행해야한다는 것이다. 나는 visual cod

[Flutter] VScode 단축키 및 팁 [내부링크]

Flutter 개발을 Visual Studio Code(VSCode)에서 진행할 때 효율적으로 작업할 수 있는 몇 가지 팁과 단축키, 그리고 유용한 링크를 공유하겠다. 확장 프로그램 Flutter Extension: Dart와 Flutter를 위한 공식 VSCode 확장 프로그램이다. Syntax highlighting, 코드 자동 완성, 위젯 에디팅, 디버깅 지원 등의 기능을 제공한다. Dart Extension: Flutter 개발에 필수적인 Dart 언어 지원을 추가한다. VSCode 단축키 Ctrl+Shift+P (Cmd+Shift+P on Mac): Command Palette를 열어 다양한 명령을 검색하고 실행할 수 있다. Ctrl+Space (Cmd+Space on Mac): 코드 자동 완성 기능을 사용할 수 있다. F5: 앱을 디버깅 모드로 실행한다. Ctrl+F5 (Cmd+F5 on Mac): 디버깅 없이 앱을 실행한다. Ctrl+Shift+I (Cmd+Option+

[C/C++ Tip] 16. Extern 중복 문제 해결 (Include Guard) [내부링크]

C언어에서 헤더 파일의 중복 포함은 다양한 문제를 일으킬 수 있다. 예를 들어, 프로젝트 단위가 커져 같은 헤더 파일이 여러 번 포함되면 변수나 함수 선언이 중복되어 컴파일 오류가 발생할 수 있다. 이를 방지하기 위해 "Include Guard"라는 기법이 널리 사용된다. Include Guard는 전처리기(preprocessor) 지시문을 사용하여 헤더 파일이 한 번만 포함되도록 보장한다. 가장 일반적인 방법은 #ifndef, #define, #endif 지시문을 사용하는 것이다. 중복 포함 방지: 헤더 파일이 여러 번 포함되는 것을 방지하여, 중복 선언으로 인한 컴파일 오류를 예방한다. 프로그램 구조 개선: 코드의 모듈화와 재사용성을 높이며, 프로그램의 구조를 명확하게 한다. 컴파일 시간 단축: 불필요한 헤더 파일의 재처리를 방지함으로써, 전체 컴파일 시간을 단축할 수 있다. 코드 다음은 Include Guard를 사용한 헤더 파일의 예시이다. myheader.h: #ifndef

[C/C++ Tip] 17. Static 변수와 Extern 변수의 차이점 [내부링크]

Static 변수와 Extern 변수는 C언어에서 변수의 스코프(visibility)와 생명 주기(lifetime)를 관리하는 데 사용되는 키워드이다. 이 둘의 주요 차이점은 다음과 같다: Static 변수: 스코프: Static 변수는 선언된 범위(함수 내부 또는 파일 내부)에 제한된다. 생명 주기: 프로그램 실행 시작 시 할당되고 프로그램 종료 시 해제된다. 목적: 같은 파일 내에서만 접근 가능한 변수를 만들거나, 함수 호출 간 상태를 유지할 수 있는 지역 변수를 선언하는 데 사용된다. Extern 변수: 스코프: Extern 키워드는 다른 파일에 정의된 전역 변수나 함수를 참조하는 데 사용된다. 생명 주기: 해당 변수가 정의된 파일 내에서 프로그램 실행 시작 시 할당되고 프로그램 종료 시 해제된다. 목적: 프로그램의 다른 파일들 간에 공유되는 전역 변수에 접근하거나, 다른 파일에 정의된 함수를 호출하는 데 사용된다. Static 변수 Code static_example.c: #

Semantic Versioning 이란. [내부링크]

소프트웨어 세계에서 "버전"이라는 단어는 하나의 소프트웨어가 시간이 지나며 어떻게 발전해 가는지, 어떤 이정표들을 지나는지를 나타내는 표시이다. 개발자들은 새로운 기능을 추가하고, 오류를 수정하면서 이 소프트웨어 이야기에 새로운 장을 추가한다. 이렇게 계속되는 변화를 체계적으로 관리하고 추적하기 위해서 우리는 '유의적 버전(semantic versioning)'이라는 규칙을 따른다. Semantic Versioning 구조 Semantic Versioning은 MAJOR.MINOR.PATCH의 형식을 따른다. 여기서 각 부분은 다음과 같은 의미를 가진다: MAJOR: 호환되지 않는 큰 변경사항이 있을 때 증가한다. 기존의 사용자들이 코드를 변경하지 않으면 안 되는 수준의 업데이트이다. MINOR: 기존 버전과 호환되는 새로운 기능이 추가될 때 증가한다. 사용자는 소프트웨어를 업데이트하고도 기존 기능을 그대로 사용할 수 있다. PATCH: 기존 버전과 호환되면서 발생한 버그를 수정할

[판다스] Pandas vs Numpy [내부링크]

NumPy와 Pandas는 데이터 과학 및 수치 계산 프로젝트에서 매우 인기 있는 두 가지 Python 라이브러리이다. 각각의 라이브러리는 데이터 처리와 분석을 위해 고유한 기능과 장점을 제공한다. 이들의 주요 장단점을 살펴본다. Numpy 장단점 장점: 성능: NumPy는 내부적으로 C로 구현되어 있어 대규모 배열과 행렬 연산에 대해 매우 빠른 성능을 제공한다. 메모리 효율성: 고정 타입의 다차원 배열을 사용하여 메모리 사용을 최적화한다. 범용성: 수학, 과학, 공학 계산을 위한 다양한 함수를 제공한다. 단점: 유연성 부족: Pandas에 비해 데이터 조작 및 분석 기능이 제한적이다. 데이터 구조: 단순한 배열 위주의 데이터 구조로, 복잡한 데이터 조작이나 분석에는 제한적일 수 있다. Pandas 장단점 장점: 데이터 조작 및 분석: 풍부한 데이터 조작 기능을 제공하여 복잡한 데이터 분석 작업을 용이하게 한다. 데이터 구조: DataFrame과 Series와 같은 높은 수준의 데이

[C/C++ Tip] 18. C언어 조건문 마스터하기 : if문의 모든 것! [내부링크]

조건문은 프로그래밍에서 데이터에 따른 의사 결정을 가능하게 하는 핵심적인 요소이다. C언어에서는 if문, 삼항 연산자, switch문 등 다양한 조건문을 제공한다. 이 중 if문은 가장 기본적이면서도 언어 상관 여부 없이 가장 중요한 문법이다. 오늘은 if문의 구조, 사용 방법, 그리고 실제 예제를 통해 if문의 모든 것을 살펴본다. If문의 중요성 조건문은 프로그램의 흐름을 제어하는데 있어 필수적인 요소이다. if문은 주어진 조건이 참인 경우에만 특정 코드 블록을 실행하게 한다. 이는 데이터에 따른 다른 동작을 해야 할 때, 예를 들어 사용자 입력 검증이나 오류 처리 등에서 매우 유용하게 사용된다. (C언어는 try catch 문이 없음.) If문의 구조 if문은 다음과 같은 기본 구조를 가진다: if (조건) { // 조건이 참일 때 실행될 코드 } 조건은 참(true) 또는 거짓(false)을 평가할 수 있는 표현식이어야 한다. C언어에서는 0이 아닌 모든 값이 참으로, 0은

[C/C++ Tip] 19. C언어 조건문 마스터하기 : 삼항연산자 [내부링크]

C언어에서 삼항 연산자는 조건문을 더 간결하게 표현할 수 있는 유용한 도구이다. 기본 구조는 조건 ? 참일 때의 값 : 거짓일 때의 값으로, 조건이 참이면 첫 번째 값을, 거짓이면 두 번째 값을 반환한다. 이 포스팅에서는 삼항 연산자의 사용법과 if문과 비교했을 때의 장단점을 살펴본다. 삼항 연산자 사용법 삼항 연산자는 주로 간단한 조건에 따른 값을 선택할 때 사용된다. 예를 들어, 두 수 중 큰 수를 찾거나, 조건에 따라 변수에 다른 값을 할당하는 경우 등에 사용할 수 있다. int max = (a > b) ? a : b; // a와 b 중 더 큰 값을 max에 할당 장점 간결성: 삼항 연산자는 if-else문에 비해 더 간결한 코드를 작성할 수 있다. 표현력: 한 줄로 조건에 따른 값을 표현할 수 있어, 코드의 의도를 명확하게 전달할 수 있다. 사용 시 고려할 점 삼항 연산자는 간단한 조건 판단에 유용하지만, 복잡한 로직이나 여러 조건을 평가해야 하는 경우에는 if-else문을

[깃허브] Github 기본 사용법. [내부링크]

Github GitHub는 전 세계 개발자들이 코드를 공유하고 협업하는 데 가장 널리 사용되는 플랫폼 중 하나이다. Git을 처음 접하는 분들을 위해 커밋(commit), 업데이트(update), 푸시(push) 등 기본적인 사용법에 대해 포스팅을 한다. Github Desktop을 사용하여 GUI로 편리하게 유지보수를 하지만, 이번 포스팅은 CMD 환경에서 사용하는 법을 설명한다. 1. Git 설치하기 Windows: Git 공식 웹사이트(git-scm.com)에서 Git을 다운로드하고 설치 프로그램을 실행한다. MacOS: Terminal을 열고 brew install git 명령어를 입력한다. (Homebrew가 설치되어 있어야 한다.) Linux: 대부분의 Linux 배포판은 기본적으로 Git이 설치되어 있다. 그렇지 않은 경우, 배포판에 맞는 패키지 매니저로 설치할 수 있다. 예를 들어, Ubuntu에서는 sudo apt-get install git 명령어를 사용한다. 2.

[C/C++ Tip] 20. C언어 조건문 마스터하기 : Switch문 [내부링크]

C언어에서 switch문은 여러 조건 분기를 관리하는 데 있어 매우 유용한 도구이다. 특히, 하나의 변수를 여러 값과 비교해야 할 때 if-else문보다 더 간결하고 명확한 코드를 작성할 수 있게 해준다. 이번 포스팅에서는 switch문의 기본 사용법, 장점, 그리고 주의해야 할 사항에 대해 자세히 알아보겠다. 기본 사용법 switch문은 표현식의 결과값에 따라 다양한 분기(case)로 코드의 실행 경로를 결정한다. 기본 구조는 다음과 같다: switch (표현식) { case 값1: // 값1일 때 실행할 코드 break; case 값2: // 값2일 때 실행할 코드 break; // 여러 case 추가 가능 default: // 어떤 case도 매칭되지 않을 때 실행할 코드 } 장점 가독성: switch문은 여러 if-else문을 사용하는 것보다 훨씬 가독성이 좋은 코드를 작성할 수 있게 한다. 효율성: 컴파일러는 switch문을 최적화하여, 조건 분기를 더 효율적으로 처리할 수

[Flutter] StatefulWidget 사용하기 : 기본 가이드 [내부링크]

Flutter 개발을 하다 보면, 사용자 인터페이스(UI)의 일부가 시간에 따라 변할 수 있어야 할 때가 있다. 예를 들어, 사용자의 입력, 네트워크 응답 또는 시간의 경과와 같은 이벤트에 반응하여 UI가 업데이트되어야 하는 경우가 그러하다. 이때 필요한 것이 StatefulWidget이다. StatefulWidget은 상태(state)의 변화에 따라 UI를 동적으로 변경할 수 있는 위젯이다. 이 포스트에서는 StatefulWidget의 기본 사용 방법과 간단한 예제를 통해 Flutter에서 동적인 UI를 구현하는 방법을 설명한다. StatefulWidget이란? StatefulWidget은 Flutter에서 상태를 가질 수 있는 위젯이다. 상태란 위젯의 생명주기 동안 변경될 수 있는 데이터를 말한다. StatefulWidget은 두 부분으로 구성된다: StatefulWidget 자체와 State 객체이다. StatefulWidget 객체는 변경 불가능(immutable)하며, 실제

[머신러닝] 현 개발자가 설명해주는 데이터 전처리, 데이터 라벨링 이란? [내부링크]

데이터 전처리는 분석 및 처리를 위한 데이터를 최적화하는 과정을 일컫는다. 이는 데이터 분석, 데이터 마이닝, 머신 러닝 프로젝트에서 필수적인 단계로, 데이터의 품질을 결정짓는 중요한 역할을 한다. 일반적으로 데이터는 누락된 부분이 있거나 일관성이 부족한 경우가 많다. 최고의 도구나 분석 방법도, 품질이 떨어지는 데이터에서는 우수한 결과를 도출하기 어렵다. 데이터 전처리 란? 데이터 전처리는 분석 및 처리 작업에 적합한 데이터 형태를 준비하는 전반적인 과정을 의미한다. 이 과정은 데이터 분석, 데이터 마이닝, 머신 러닝 프로젝트에서 핵심적인 단계로, 데이터의 퀄리티를 높이는 데 중요한 역할을 한다. 자주 발생하는 문제로는 데이터의 누락이나 일관성 부족이 있다. 우수한 도구나 분석 방법론을 사용하더라도, 기본 데이터의 품질이 부족하면 원하는 수준의 결과를 얻는 것이 어렵다. 데이터 전처리 작업 비중은? 데이터 식별, 데이터 수집, 데이터 정제, 데이터 라벨링, 데이터 증강 등 하나의

[넘파이] 데이터 전처리 기법: NumPy를 활용한 다양한 정규화 [내부링크]

데이터 분석의 성공은 고품질의 데이터 전처리에서 시작된다. NumPy는 이 과정을 지원하는 강력한 도구로, 다양한 정규화 기법을 적용할 수 있게 해주어 분석의 정확도를 극대화한다. 이번 포스팅에서는 NumPy를 활용하여 데이터를 정규화하는 방법을 간단히 소개한다. 정규화의 중요성 데이터 정규화는 모델 알고리즘 튜닝 이전에 이루어져야 하는, 데이터 분석 및 머신 러닝 프로젝트의 성공에 결정적인 요소이다. 실제로, 모델 튜닝에 앞서 데이터를 적절히 정규화하는 것이 모델의 성능을 극대화하는 데 있어 훨씬 더 중요하다. 이는 정규화 과정이 데이터의 일관성과 품질을 보장함으로써 모델이 데이터에서 중요한 패턴과 관계를 더욱 효과적으로 학습할 수 있게 만들기 때문이다. 정규화는 모든 특성의 값이 동일한 척도에 있도록 보장하여, 특성 간의 불균형을 제거한다. 이는 특히 거리 기반 알고리즘에서 중요한데, 데이터 포인트 간의 거리 계산이 모델의 결정 과정에 직접적으로 영향을 미치기 때문이다. 또한,

중고 Mac북(맥) Ventura OS에 Xcode 설치하기 [내부링크]

중고 맥북 2017 Pro를 구매하고 간만에 컴퓨터하면서 멘붕이 터졌다. 머랄까. 처음 리눅스를 접했던 느낌이랄까. iOS개발을 위해 Xcode 설치는 필수적이다. Xcode 설치방법. Appstore에서 Xcode를 설치한다. 근데 왠걸 현재 Ventura OS가 설치되어 있는데 최신 Mac OS 14 이상이 아니면 설치할 수 없다고 뜬다. 하... 1차 빡침. 찾아보니 Xcode를 수동으로 설치해야한다고 한다. https://developer.apple.com/download/all/ 로그인 - Apple Copyright 2024 Apple Inc. 모든 권리 보유. 개인정보 처리방침 사용 약관 developer.apple.com 오늘자 기준으로 Xcode 15가 최신인 상황에서 Xcode 13.4.1을 설치했다. 근데 왠걸... 파일 용량이 10GB 정도되는데 용량이 부족하다고 한다. 파티션을 확인해보니... 2차 빡침 안그래도 128GB 밖에 안되는 SSD를 전 주인이 윈

Mac(맥) Flutter 설치하기. [내부링크]

이 전 시간에 Xcode를 겨우 설치 완료했다. flutter는 제법 간단하다. 터미널로 작업을 하려니 간만에 우분투 만지는 것 같아서 맛도리다. 찾아보니 homebrew 가 apt-get 과 같은 패키지 관리 시스템이라고 한다. 맥을 사용하면 설치는 필수라 한다. 설치는 아래와 같다. https://brew.sh/ Homebrew The Missing Package Manager for macOS (or Linux). brew.sh /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 터미널에 복사 붙여넣기 ! 설치 완료 후, 터미널에 하기 명령어 입력. brew install --cask flutter 설치 간단. 제대로 설치됐는지 확인하기. flutter doctor 설치 완료!

딥러닝의 진화: 역사와 발전 [내부링크]

딥러닝은 인공지능 연구의 전면에 서 있는 기술로, 지난 수십 년 간 그 발전 과정은 흥미롭고 다층적인 이야기를 담고 있다. 초기 이론적 기반부터 혁신적인 알고리즘의 발견, 그리고 눈부신 성과를 낳은 대회까지, 딥러닝의 역사는 지속적인 탐구와 도전의 결과물이다. 본 포스팅에서는 딥러닝의 역사와 발전과정에 대해 살펴본다. 1943년: 인공 뉴런의 최초 모델 워런 맥컬록과 월터 피츠는 인공 뉴런의 개념을 처음으로 소개하는 논문을 발표했다. 이는 신경망과 딥러닝의 이론적 기반이 되었다. 1958년: 퍼셉트론의 발명 프랭크 로젠블라트는 퍼셉트론, 인공 신경망을 구성하는 기본 단위인 인공 뉴런을 기반으로 하는 학습 알고리즘을 발명했다. 이는 딥러닝의 초기 형태 중 하나였다. 1986년: 역전파 알고리즘의 재발견 데이비드 E. 루멜하트, 제프리 힌튼, 론 월리엄스는 역전파 알고리즘을 사용한 신경망 학습 방법을 발표했다. 이는 신경망이 복잡한 패턴을 학습할 수 있게 하는 돌파구였다. 역전파 알고리

[C/C++ Tip] 14. 동적 메모리 할당 [내부링크]

C언어에서 동적 배열은 프로그램 실행 중에 배열의 크기를 결정하고 메모리를 할당할 수 있게 해주는 매우 유용한 기능이다. 동적 배열은 malloc, calloc, 또는 realloc 함수를 사용하여 힙(Heap) 영역에 메모리를 할당함으로써 생성된다. 이러한 방식은 정적 배열과 달리, 실행 시간에 배열의 크기를 유연하게 조절할 수 있게 해준다. 필요성 유연성: 프로그램 실행 중에 배열의 크기를 결정할 수 있으므로, 사용자 입력이나 다른 실행 시간 데이터에 기반한 메모리 할당이 가능하다. 메모리 효율성: 필요한 만큼의 메모리만 할당하여 사용하므로, 메모리 낭비를 줄일 수 있다. 메모리적인 관리의 장점 및 단점 1. 장점 메모리 최적화: 정적 배열과 달리, 필요한 만큼의 메모리만 사용하기 때문에 전체 프로그램의 메모리 효율성이 향상된다. 확장성: 필요에 따라 realloc 함수를 사용하여 배열의 크기를 증가시킬 수 있다. 2. 단점 메모리 관리 부담: 동적 할당된 메모리는 개발자가 직접

[C/C++ Tip] 15. extern 기본 [내부링크]

C언어에서 extern 키워드는 다른 파일에 정의된 전역 변수나 함수를 참조할 수 있도록 해준다. 이는 프로그램의 여러 파일 간에 변수나 함수를 공유할 때 매우 유용하다. extern의 사용은 큰 프로젝트에서 소스 코드를 모듈화하고 관리하기 쉽게 만들어 준다. extern 사용 예제 다음 예제에서는 두 개의 파일을 사용하여 extern의 기본적인 사용 방법을 보여준다. main.c #include <stdio.h> // 다른 파일에서 정의된 변수를 참조하기 위해 extern 사용 extern int sharedVar; int main() { printf("Shared Variable: %d\n", sharedVar); return 0; } shared.c // sharedVar는 이 파일에서 정의되며, 다른 파일에서 extern을 사용해 접근할 수 있다. int sharedVar = 10; 이 예제에서 sharedVar는 shared.c 파일에서 정의되고 초기화되며, main.c 파

[머신러닝] 앙상블 기법: 기존 머신러닝 기법의 성능 향상 (보팅, 배깅, 부스팅) [내부링크]

앙상블 학습은 여러 학습 알고리즘을 조합하여 보다 정확한 예측을 도출하는 기법이다. 단일 모델만 사용할 때보다 더 좋은 성능을 달성하는 것이 목표이며, 이는 특히 불확실성이 높고 복잡한 데이터셋에서 유용하다. 앙상블 기법의 주요 방법 보팅(Voting): 여러 다른 모델의 예측을 통합하여 최종 예측을 결정한다. 일반적으로 분류 문제에 사용된다. 배깅(Bagging): 같은 알고리즘의 여러 모델을 병렬로 학습시키고, 모든 모델의 예측을 평균내어 최종 결과를 도출한다. 랜덤 포레스트가 대표적인 예입니다. 부스팅(Boosting): 여러 모델을 순차적으로 학습시키면서, 이전 모델의 오류를 다음 모델이 보완하도록 합니다. XGBoost, LightGBM, AdaBoost 등이 이에 속한다. 앙상블 기법의 장점 성능 향상: 여러 모델의 결합을 통해 단일 모델로는 달성하기 어려운 높은 예측 정확도를 달성할 수 있다. 과적합 감소: 다양한 모델을 조합함으로써 과적합의 위험을 줄일 수 있다. 안정

펌웨어 Int와 Float 계산의 차이. (CPU vs FPU) [내부링크]

회사 프로젝프를 이어 받아 개발을 하기 시작했다. 고성능 MCU을 칩을 사용했기 때문에 회사에서도 처음으로 Float 계산을 하는 프로젝트라고 한다. 하지만 프로토타입으로는 미기능 구현이 많아 괜찮았으나, 기능이 많이 추가되어 Float 계산이 추가되니 성능 테스트에서 빠꾸를 먹었다. 부하를 강제로 주니 MCU가 강제로 리셋을 치기 시작했다. 결국 float 계산을 전부 삭제하고 unsigned char, 즉 1byte로 변경하는 작업을 시작했다. 그래서 이번 포스팅은 Float 연산이 얼마나 펌웨어 개발에 큰 계산인지 포스팅한다. 데이터 표현 정수 (int): 고정된 크기의 메모리 공간을 사용하여 정수 값을 직접 표현한다. 예를 들어, 32비트 int는 -2,147,483,648에서 2,147,483,647까지의 값을 표현할 수 있다. 부동소수점 (float): 실수를 표현하기 위해 사용되며, 지수와 가수를 이용해 넓은 범위의 값을 근사적으로 표현한다. 이 방식은 더 넓은 범위의

삼성 갤럭시에서 개발자 모드 켜기 & USB 디버깅 허용하기 [내부링크]

개발자 모드를 활성화하는 이유는 다양하지만, 주로 기술적인 목적 또는 고급 기능에 대한 액세스를 위해 사용한다. 나 같은 경우, 보통 Flutter를 이용하여 앱 개발을 하는데, 시뮬레이션 폰을 사용하는 것이 아니라 직접 앱을 실시간 디버깅하여 사용한다. 하지만 요즘엔 스마트폰을 빠르게 하기 위해 개발자 모드로 들어가 GPU 관련 설정을 강제로 OFF시켜 속도를 빠르게 한다. 개발자 모드 켜기 설정 앱 열기: 홈 화면이나 앱 드로어에서 '설정' 앱을 찾아 연다. 휴대폰 정보로 이동: 설정 메뉴에서 '휴대폰 정보' 또는 '장치 정보'를 찾아 탭한다. 소프트웨어 정보 선택: 휴대폰 정보 메뉴 내에서 '소프트웨어 정보'를 선택한다. 빌드 번호 7번 탭하기: '빌드 번호' 옵션을 찾아 7번 연속으로 빠르게 탭한다. 7번 탭한 후, 개발자 모드가 활성화되었다는 메시지가 화면에 표시된다. (일부 경우에는 비밀번호나 패턴을 입력해야 할 수 있다.) USB 디버깅 허용하기 개발자 모드를 활성화한

[C/C++ Tip] 8. 배열과 포인터 [내부링크]

C언어에서 포인터는 변수의 메모리 주소를 저장하는 변수이다. 배열과 포인터는 밀접하게 관련되어 있으며, 이 둘을 연결지어 이해하면 C언어의 메모리 관리에 대한 깊은 이해를 얻을 수 있다. 이번에는 배열과 포인터의 관계에 대해 설명한다. 배열과 포인터의 기본 관계 C언어에서 배열 이름은 배열의 첫 번째 요소를 가리키는 포인터로 사용될 수 있다. 예를 들어, int numbers[5]; 배열이 있다면, numbers는 &numbers[0]와 같은 주소를 가지고 있다. 이것은 배열의 이름이 첫 번째 요소의 주소를 가리키는 포인터로 동작한다는 것을 의미한다. int numbers[5] = {10, 20, 30, 40, 50}; int *p = numbers; // 또는 &numbers[0] printf("%d\n", *p); // 10 출력 포인터를 사용한 배열 요소 접근 포인터 연산을 사용하여 배열의 각 요소에 접근할 수 있다. 포인터에 정수를 더하면, 포인터가 가리키는 주소에서 그 정수

[C/C++ Tip] 9.memset, memcpy [내부링크]

C언어에서 배열을 다루기 위한 여러 함수들이 있으며, 이 중에서 memset과 memcpy는 가장 기본적이면서도 중요한 함수이다. 이들 함수는 메모리 관리와 배열 조작을 효율적으로 수행할 수 있도록 도와준다. memset 함수 memset 함수는 메모리의 일정 구역을 특정 값으로 초기화할 때 사용한다. 이 함수는 <string.h> 헤더 파일에 선언되어 있다. 함수의 원형은 다음과 같다. void *memset(void *ptr, int value, size_t num); ptr: 설정하고자 하는 메모리의 시작 주소 value: 메모리에 설정할 값. int형으로 전달되지만, 실제로는 unsigned char로 변환되어 메모리에 저장된다. num: value로 설정할 바이트의 수 #include <stdio.h> #include <string.h> int main() { int array[10]; memset(array, 0, sizeof(array)); for(int i = 0; i

[머신러닝] 서포트 벡터 머신(SVM): 이해와 사이킷런 예제 [내부링크]

서포트 벡터 머신(SVM)은 분류(classification), 회귀(regression) 및 이상치 탐지(outlier detection)와 같은 다양한 머신 러닝 작업에 사용되는 강력하고 유연한 지도 학습 모델이다. SVM의 핵심 아이디어는 데이터를 분류하기 위해 클래스 사이에 최적의 경계(결정 경계)를 찾는 것이며, 이 경계는 서포트 벡터라고 불리는 데이터 포인트에 의해 결정된다. SVM의 기본 원리 이 그림은 서포트 벡터 머신(SVM)의 기본 개념을 2차원 공간에서 설명한다. 여기서 볼 수 있는 주요 요소들은 다음과 같다. 두 개의 클래스: 그림에는 두 가지 다른 색상으로 표시된 데이터 포인트들이 있다. 이 두 색상은 SVM을 사용하여 분류하려는 두 개의 서로 다른 클래스를 나타낸다. 결정 경계(Decision Boundary): 두 클래스 사이에 그어진 선이 있다. 이 선은 SVM 모델이 두 클래스를 구분하기 위해 찾은 최적의 결정 경계를 나타냅니다. 이 선은 가능한 한 두

[C/C++ Tip] 10. Call by Value vs Call by Reference [내부링크]

프로그래밍, 특히 C언어에서 'Call by Value'와 'Call by Reference'의 개념은 기본적이면서도 핵심적인 부분이다. 이 두 호출 방식의 차이점을 이해하는 것은 다음과 같은 이유로 중요하다. 1. 코드의 안정성 보장 'Call by Value'는 함수에 변수의 복사본을 전달함으로써 원본 데이터를 안전하게 보호한다. 이는 원하지 않는 데이터 변경으로부터 값들을 보호하는 데 필수적이다. 반면, 'Call by Reference'는 원본 데이터에 직접 영향을 줄 수 있기 때문에, 데이터를 의도적으로 변경하고자 할 때 유용하다. 이 두 방식을 적절히 사용함으로써 프로그램의 안정성과 예측 가능성을 높일 수 있다. 2. 메모리와 성능 최적화 특히 대용량 데이터를 다루는 프로그램에서 'Call by Value' 방식은 복사본을 만들기 때문에 메모리 사용량이 증가하고, 성능에 부정적인 영향을 줄 수 있다. 반면, 'Call by Reference'는 데이터의 복사본을 생성하지

머신러닝과 딥러닝 차이: 인공지능의 현재와 미래 [내부링크]

인공지능(AI)은 현대 사회의 다양한 분야에서 혁신의 촉매제 역할을 하고 있다. 그 중심에는 머신러닝(ML)과 딥러닝(DL)이 자리잡고 있다. 이 두 기술은 AI의 발전을 이끌고 있는 주역들이며, 우리의 일상생활과 산업에 광범위한 영향을 미치고 있다. 하지만 이들 기술에 대한 역사적 배경과 각각의 독특한 특성을 이해하는 것은 여전히 많은 사람들에게 도전적인 일이다. 이 글에서는 머신러닝과 딥러닝의 발전 과정과 이들이 어떻게 인공지능의 판도를 바꾸고 있는지 살펴보겠다. 인공지능, 머신러닝, 딥러닝 인공지능의 첫걸음 인공지능의 여정은 1950년대, 앨런 튜링의 "계산 기계와 지능" 논문과 튜링 테스트로부터 시작되었습니다. 이후 1956년 다트머스 컨퍼런스에서 '인공지능'이라는 용어가 처음 등장하면서 AI 연구가 본격적으로 시작되었습니다. 초기의 AI 연구는 규칙 기반 시스템과 간단한 패턴 인식에 집중되었으며, 이는 오늘날까지도 AI 기술 발전의 기초를 이루고 있다. 머신러닝의 시작 머신

맥북 2017 중고 구매 후기 [내부링크]

이번에 지인분께 관공서에서 진행하는 행사 관련 어플을 만들어 줄 수 있냐는 제안을 받았다. 아무래도 돈을 크게 굴릴 수 없는 행사다보니 업체에 맡기는 것은 금액적으로 큰 부담이 되신다고 했다. 나는 펌웨어 개발자이기 때문에 플루터를 안 본지 1년이 넘어서 까먹어서 올해에 마무리가 안된다면 내년에 완성한다는 마음가짐으로 시작했다. 애초에 나는 회사에서 새 프로젝트를 설계 중이기 때문에 크게 시간을 쏟을 수 없어서 대략적으로 가능하면 납기일까지 만들어드리고 마음에 들면 적당하게 쳐달라고 했다. 그런데 다른 문제에 봉착했다. 나는 안드로이드와 iOS를 한 번에 개발할 수 있는 플루터를 공부했었는데, 왠걸 결국 아이폰에 어플을 올릴려면 맥북이나 미니맥이 필요하다는거다. 클라우드를 써볼까 했지만 시간 당 비용이 너무 비싸다라는 문제가 있다. 그래서 큰 맘먹고 중고로 맥북을 구매하기로 했다. 이미 컴퓨터 쪽으로는 고사양으로 조립해놔서 컴퓨터에 더 이상 돈쓸려고 하지 않았는데 이번 기회에 처음으

[C/C++ Tip] 11. C언어 포인터 기본 사용법 [내부링크]

포인터는 C언어를 배우는 사람에게는 종종 어려움을 주는 주제 중 하나이다. 복잡해 보이지만 한 번 이해하면 강력한 도구가 될 수 있다. 이 포스팅에서는 포인터의 기본 개념을 쉽게 풀어 설명하고, 몇 가지 팁과 함께 실제 코드 예시를 통해 그 사용법을 알아보겠다. 포인터란 무엇인가? 포인터는 간단히 말해, 메모리 주소를 저장하는 변수이다. 즉, 포인터를 통해 다른 변수의 위치를 알고, 그 위치에 접근하여 값을 읽거나 변경할 수 있다. C언어에서 포인터는 데이터의 동적 관리와 복잡한 데이터 구조의 구현에 필수적인 요소이다. 포인터의 선언 포인터를 선언하는 방법은 다음과 같다: 타입 *포인터변수명; 예를 들어, int형 데이터를 가리키는 포인터를 선언하고 싶다면 다음과 같다: int *ptr; 이 코드는 ptr이라는 이름의 포인터 변수를 선언한 것으로, int형 변수의 주소를 저장할 수 있음을 의미한다. 하지만 이와 같이 변수에 *을 붙이는 것은 포인터의 이해에 혼란을 가중시킨다. 실제로

[C/C++ Tip] 12. 포인터가 헷갈릴 수 밖에 없는 이유: 별(*)의 종류와 정체 [내부링크]

C언어를 배우면서 가장 많이 혼란을 겪는 주제 중 하나가 바로 포인터이다. 특히 * 기호의 다양한 역할이 이 혼란의 주범이다. 이 포스팅에서는 * 기호가 가지는 세 가지 역할을 친절하게 설명함으로써 포인터에 대한 당신의 이해를 한 단계 업그레이드시킬 것이다. 1. 포인터 변수 선언: *의 첫 번째 정체 포인터를 선언할 때 *를 사용하는 이유는, 단순히 "이 변수는 메모리 주소를 저장한다"는 사실을 나타내기 위함이다. int* ptr;라고 선언하면, "ptr은 정수의 주소를 저장하는 변수"라는 의미가 된다. 여기서 *는 포인터 변수의 타입 부분에 포함되어, 이 변수가 "주소"를 저장하는 특별한 종류의 변수임을 알려주는 역할을 한다. 2. 역참조 연산자: *의 두 번째 정체 변수 앞에 *가 사용되면, 그것은 "역참조 연산자"가 됩니다. 역참조 연산자는 포인터가 가리키는 메모리 위치에 저장된 값을 접근하게 해준다. 예를 들어, *ptr = 10;은 ptr이 가리키는 메모리 위치에 10을

[머신 러닝] 결정 트리(Decision Trees): 이해와 활용 [내부링크]

결정 트리는 이름에서 알 수 있듯이, 결정을 내리기 위한 일련의 질문과 결정(노드)으로 구성된 트리 구조를 사용한다. 학습 과정에서 결정 트리 알고리즘은 데이터의 특성(Feature)을 기반으로 가장 정보가 풍부한 질문(분할 기준)을 선택하여 데이터를 두 개의 하위 집합으로 분할한다. 이 과정을 데이터가 잘 분류되거나, 더 이상 분할의 이득이 없을 때까지 재귀적으로 반복합니다. 최종적으로, 리프 노드(잎 노드)에서는 분류할 클래스 또는 예측할 값에 대한 결정이 이루어진다. 활용 데이터 및 분야 결정 트리는 다양한 유형의 데이터와 문제에 적용될 수 있다. 예를 들어: 의료 분야: 환자의 진단 데이터를 기반으로 특정 질병을 예측하는 데 사용될 수 있다. 금융 분야: 고객의 신용 이력 데이터를 분석하여 신용 위험을 평가하거나 대출 승인 여부를 결정하는 데 활용한다. 마케팅 분야: 고객 데이터를 분석하여 특정 상품에 대한 고객의 구매 가능성을 예측하거나, 고객 세분화에 사용된다. from

MAC(맥) 윈도우 원격 데스크톱 연결 [내부링크]

맥북으로 윈도우 원격 데스크톱 연결하는 방법을 소개하고자 한다. 기본적으로 윈도우와 윈도우끼리 원격 데스크톱을 많이 사용했지만, 맥에서 윈도우 원격 데스크톱 또한 찾게 됐다. 방법은 간단하다. App Store에서 Microsoft Remote Desktop을 설치한다. 설치가 완료되면 설치한 프로그램을 실행시킨다. PC name에는 IP or DNS:포트번호를 입력하고, User account에 해당 계정 정보를 입력하면 끝이다. 보통은 집에 게이트웨이를 두지 않기 때문에 No gateway로 유지한다. 솔직히 말해서 맥에서 설정하는 것보단 해당 공유기의 원격 설정하는 것이 더 어려워한다. 보통 포트포워딩이나 DNS, 포트번호, IP에 대해 잘 모르기 때문이다. 나중엔 공유기나 관련 인터넷 동작에 대해 소개할려고 한다. iptime 공유기를 많이 사용하기 때문에 iptime에 대해 포스팅하겠다. 맥을 사용하는데 개인적으로 리눅스보다 더 어려운 것 같다. 키 배열이라던지 잘 적응이

[C/C++ Tip] 13. MCU 제어를 위한 비트 연산 [내부링크]

펌웨어는 하드웨어를 제어하는 소프트웨어로, 보통 임베디드 시스템, 마이크로컨트롤러, 다양한 전자 장비 등에서 작동한다. 펌웨어 개발에서 하드웨어의 세밀한 제어가 필요할 때, 비트 연산은 그 대표적인 방법중 하나이다. C언어의 비트 연산자를 사용하면 레지스터 설정과 같은 저수준 작업을 효율적으로 처리할 수 있다. 이러한 연산자에는 AND(&), OR(|), XOR(^), NOT(~), 비트 시프트(<<, >>) 등이 있다. 각 연산자의 사용 예를 통해, 어떻게 이들을 활용하여 펌웨어 코드를 작성하는지 살펴본다. 비트 연산의 장점 직접적인 하드웨어 제어: 비트 단위로 하드웨어 레지스터를 직접 조작할 수 있다. 메모리 및 처리 속도 효율성: 불필요한 메모리 접근을 줄이고, CPU의 비트 연산 처리 속도를 활용할 수 있다. 코드 최적화: 컴파일러가 최적화하기 쉬워져, 실행 효율이 향상된다. 비트 연산자 예제 1. AND 연산 (&): 특정 비트를 0으로 설정하거나 상태를 확인할 때 사용한다

[넘파이] NumPy 입문 - 파이썬 머신러닝의 핵심 및 설치 방법 [내부링크]

NumPy(넘파이)는 머신러닝을 위해 파이썬에서 사용되는 핵심 라이브러리 중 하나이다. 대규모 다차원 배열과 행렬 연산에 필수적이며, 고성능의 수학적 연산을 가능하게 한다. 이 포스팅에서는 NumPy의 가장 많이 사용되는 함수들과 장점, 그리고 파이썬 기본 내장 함수인 List(리스트)와 비교하여 속도가 빠른 이유를 예제 코드와 함께 살펴본다. Install pip install numpy NumPy의 가장 많이 사용되는 함수들 np.array(): 리스트, 튜플 등의 시퀀스를 넘파이 배열로 변환한다. np.arange(): 지정된 간격에 따라 값의 배열을 생성한다. np.zeros(), np.ones(): 주어진 모양과 타입으로 채워진 배열을 생성한다. np.reshape(): 배열의 모양을 변경한. np.dot(): 두 배열의 내적을 계산한다. np.sum(), np.mean(), np.std(): 배열의 합, 평균, 표준편차를 계산한다. NumPy의 장점 성능: 순수 파이썬에

[앱 배포] JDK 설치 및 Keystore 만들기 [내부링크]

Google Play 스토어에 앱을 배포하기 위해선 디지털 서명을 반드시 해야 한다. Keytool을 이용해 keystore을 생성하기 전에 JDK를 설치해야 한다. JDK 설치 1. 아래 openJDK 사이트에서 jdk를 설치한다. https://openjdk.org/ OpenJDK What is this? The place to collaborate on an open-source implementation of the Java Platform, Standard Edition , and related projects. Download and install the latest open-source JDK . Oracle’s free, GPL-licensed, production-ready OpenJDK JDK 21 binaries for Linux, macOS, and Windows are available a... openjdk.org 2. 그림에서 Download 영역에서 최신

[Selenium] 구글 크롬 디버그 모드 실행, 네이버 로그인 캡차 우회 [내부링크]

Python Selenium을 이용하여 자동화 프로그램을 개발할 때, 네이버 로그인 캡차가 문제가 되곤 한다. Pyclip을 사용하여 clipboard로 복붙을 하면 예전에는 캡차 우회가 됐지만, 지금은 안된다. 구글 크롬 디버그 모드를 실행하면 간단히 해결된다. 네이버 로그인 캡차 크롬 디버그 모드 보통 크롬을 설치를 할 때, 기본 경로에 설치하므로 대부분 경로는 아래와 같을 것이다. 대부분의 PC들은 64비트 아키텍처이므로 아래 경로에 크롬 실행 파일이 있다. 하지만 32비트 아키텍처를 가지는 컴퓨터가 있을 수 있으니 예외 처리를 한다. # 64bit C:\Program Files\Google\Chrome\Application\chrome.exe # 32bit C:\Program Files (x86)\Google\Chrome\Application\chrome.exe import subprocess from selenium import webdriver from selenium.w

[Debug] Python OpenCV2, dlib 설치 오류 해결 [내부링크]

Python OpenCV2 설치 pip install opencv-python Python dlib 설치 우선, dlib 패키지를 설치하기 위해서 cmake 패키지를 설치해야 한다. pip install cmake dlib 패키지를 바로 설치되면 좋겠지만, 아마 Visual studio build tool이 필요하다는 에러문구가 발생할 것이다. https://visualstudio.microsoft.com/ko/downloads/ Visual Studio Tools 다운로드 - Windows, Mac, Linux용 무료 설치 Visual Studio IDE 또는 VS Code를 무료로 다운로드하세요. Windows 또는 Mac에서 Visual Studio Professional 또는 Enterprise Edition을 사용해 보세요. visualstudio.microsoft.com 위 Visual studio 2022용 빌드 도구(Build Tool)을 설치한다. 기본 옵션으로 설치

[머신러닝] 로지스틱 회귀(Logistic Regression) 설명 및 사이킷런을 이용한 예제 코드 [내부링크]

로지스틱 회귀란? 로지스틱 회귀는 통계학에서 분류 문제를 해결하기 위한 알고리즘 중 하나아다. 이 알고리즘은 종속 변수가 범주형 데이터일 때 사용되며, 주로 이진 분류 문제에 적용된다. 로지스틱 회귀는 선형 회귀와 비슷하지만, 종속 변수가 특정 범주(예: 0 또는 1)에 속할 확률을 추정하기 위해 로지스틱 함수(또는 시그모이드 함수)를 사용한다는 점에서 차이가 있다다. 시그모이드 함수는 S자 형태의 곡선을 그리며, 어떤 값도 0과 1 사이의 값으로 변환한다. 이 특성 때문에 로지스틱 회귀는 예측된 확률을 기반으로 하여 특정 클래스에 속할 가능성이 더 높은지를 판단할 수 있다. 시그모이드 함수(Sigmoid Function) 로지스틱 회귀에서 가장 중요한 수식은 시그모이드 함수입니다. 시그모이드 함수는 선형 회귀로부터 계산된 값을 입력으로 받아, 그 값이 0과 1 사이의 값으로 변환된다. 이는 다음과 같은 수식으로 표현할 수 있다. 여기서: σ(z)는 출력값으로, 항상 0과 1 사이의

[고잉버스] ChatGpt4 저렴하게 사용하기 [내부링크]

ChatGpt4가 유료버젼으로 공개된지 꽤 시간이 지났다. 논문을 한 편 단기간에 써야 하다보니 ChatGPT4의 도움을 받아보기로 했다. 그런데 ChatGpt4의 한 달 이용료가 너무 비싸다. 그래서 고잉버스라는 사이트에서 공유 계정을 통해 저렴한 가격으로 한 달간 이용하려고 한다. https://goingbus.com/?s=DDdYcnFY GoingBus Shared premium subscriptions with lower price. goingbus.com 사용 방법은 간단하다. 자신이 원하는 서비스를 클릭 후, 구매하면 된다. 구매하게 되면 하기 이미지처럼 공유 계정의 아이디와 비밀번호를 제공한다. 아무래도 공유 계정이다 보니 속도 부분은 적지만 사용하는데 큰 지장은 없다.

ChatGpt4 이미지 생성할 때, 중요한 팁! [내부링크]

ChatGpt4 부터 이미지를 생성해주는 기능이 생겼다. 그런데 조금 사용하다보니 ChatGpt4가 그려주는 그림들이 너무 추상적이다. 예를 들어 나는 Sigmoid 함수를 그린다고 가정한다. Sigmoid 그리고자 하는 함수. 워낙 머신러닝 분야에서 기초적인 함수이기 때문에 ChatGpt4가 모르는 것은 말이 안된다. 한 번 시도해보자. ?? 대략 Sigmoid 함수는 맞지만 그림이 너무 화려하다. Sigmoid?? 다시 한 번 시도해보겠다. 뭐지..? 아니. 간단한 그래프인데 왜이렇게 불필요한 정보를 넣는거지? 조금 자세하게 정보를 기입해보자. 미치겠다. 점점 Sigmoid 함수에서 벗어나고 있다... 3D 그림은 그리지만, 2D 그림은 못 그린다니.. 여자친구가 혹시 2D라는 키워드를 주고 한 번 시도해보라고 했다. 똑같을 것 같았지만 의외의 결과가 나왔다. 와우... 키워드가 2D가 중요한 것 같다. 혹시 심플하면서 불필요한 정보를 원하지 않는 다면, 2D라는 키워드를 추가해

[C/C++ Tip] 4. 구조체 활용: 효율적인 데이터 관리 [내부링크]

C언어의 구조체(struct)는 서로 다른 자료형을 하나로 묶어 새로운 형태의 복합 데이터 타입을 정의할 수 있게 해준다. 이는 데이터를 효율적으로 관리하고, 코드의 가독성과 유지 보수성을 향상시킬 수 있는 강력한 도구이다. 이번 포스팅에서는 구조체를 통해 더 깔끔하고 효율적인 코드를 작성하는 몇 가지 팁과 예제를 제공한다. 전통적인 프로그래밍 언어에서는 변수를 사용하여 데이터를 저장했다. 그러나 변수만으로는 서로 관련된 여러 데이터 항목을 효율적으로 관리하기 어려웠다. 예를 들어, 학생의 정보(이름, 나이, 성적 등)를 처리하려면 각 항목을 별도의 변수로 관리해야 했고, 이러한 변수들 사이의 논리적 연관성을 코드상에서 명확히 표현하기 어려웠다. 구조체는 이러한 문제를 해결하기 위해 도입되었다. 구조체를 사용하면 서로 관련된 여러 데이터 항목을 하나의 논리적 단위로 그룹화할 수 있다. 이를 통해 데이터의 구조를 명확히 할 수 있고, 코드의 가독성과 유지 보수성이 향상된다. 구조체의

[C/C++ Tip] 5. 구조체 패딩 [내부링크]

구조체 패딩은 컴퓨터 메모리에서 데이터를 효율적으로 접근하기 위해 사용되는 개념이다. 컴퓨터 아키텍처 대부분은 특정 데이터 타입을 메모리의 정렬된 주소에서 읽고 쓰는 것을 선호한다. 예를 들어, 많은 시스템에서는 4바이트 정수(int)를 4바이트 경계에서 시작하는 메모리 주소에서 접근하는 것이 더 빠르다. 이러한 정렬 요구 사항을 충족시키기 위해 컴파일러는 구조체 내의 필드 사이에 "패딩" 바이트를 추가하여 메모리 접근 속도를 최적화한다. 구조체 패딩의 필요성 메모리 접근 속도 최적화: 데이터를 그들의 자연 정렬 경계에 맞춰 저장함으로써, CPU는 메모리에서 데이터를 더 빠르게 읽고 쓸 수 있다. 플랫폼 호환성: 다양한 플랫폼과 아키텍처에서 코드의 동작을 일관되게 유지한다. 패딩이 발생하는 예시 다음 구조체를 고려해본다: typedef struct { char a; // 1바이트 int b; // 4바이트 } Example; char 타입의 a는 1바이트만 차지한다. 그러나 int

Sci-Hub 쉽게 이용하기: 무료 학술 논문의 보물창고 [내부링크]

오늘은 학술 연구 논문에 무료로 접근할 수 있는 방법에 대해 소개하고자 합니다. Sci-Hub는 2011년 알렉산드라 엘바키아노바에 의해 창립된 웹사이트로, 연구 논문의 접근 장벽을 낮추어 지식 공유를 촉진하는 것을 목표로 합니다. 이 웹사이트는 특히 저널 구독료의 부담 없이 연구 논문을 이용하고자 하는 연구자들에게 유용합니다. SCI-Hub 사용법 https://sci-hub.se/ sci-hub.se sci-hub.se 1. 웹사이트 접속: Sci-Hub는 저작권 문제로 인해 도메인이 자주 변경되므로, 사용 전에 인터넷에서 최신 주소를 확인해야 합니다. 2. 논문 검색: 홈페이지에 접속하면, 검색창을 통해 원하는 논문을 DOI, 제목, 저자명, 출판 정보 등으로 검색할 수 있습니다. 검색 결과의 정확도를 높이기 위해서는 DOI 사용을 권장합니다. 3. 논문 다운로드: 검색을 통해 원하는 논문을 찾았다면, 해당 논문을 PDF 형식으로 바로 다운로드할 수 있습니다. 저작권엔 괜찮은가

[C/C++ Tip] 6. UNION 공용체와 STRUCT 구조체로 패킷 만들기 [내부링크]

Union 은 C 언어에서 서로 다른 데이터 타입을 하나의 메모리 공간에서 저장할 수 있게 하는 키워드이다. 이는 구조체(struct)와 비슷하지만, Union 내의 모든 멤버가 같은 메모리 주소를 공유한다는 점에서 차이가 있다. 결과적으로, 한 시점에 하나의 멤버만 저장하고 사용할 수 있으며, 가장 큰 크기의 멤버에 의해 union의 전체 크기가 결정됩니다. 이를 통해 메모리를 효율적으로 사용할 수 있지만, 멤버 간에 값의 오버라이트가 발생할 수 있다는 점을 유의해야 한다. Union 사용법 #include <stdio.h> union Data { int i; float f; char str[20]; }; int main() { union Data data; data.i = 10; printf("data.i : %d\n", data.i); data.f = 220.5; printf("data.f : %f\n", data.f); sprintf(data.str, "%s", "C Prog

[C/C++ Tip] 7. 배열의 기초 [내부링크]

C언어에서 배열은 같은 자료형의 변수들을 하나의 이름으로 묶어서 관리하는 자료 구조이다. 배열을 사용함으로써 변수들을 효율적으로 관리할 수 있으며, 인덱스를 통해 각 요소에 접근할 수 있다. 이 글에서는 C언어의 배열 기초, 배열의 선언과 초기화, 그리고 배열을 사용하는 몇 가지 예시를 다룬다. 배열의 기초 C언어에서 배열은 다음과 같이 선언한다. 자료형 배열이름[배열의 크기]; 예를 들어, int 자료형으로 10개의 정수를 저장할 수 있는 배열을 선언하려면 다음과 같이 작성한다. int numbers[10]; 배열의 초기화 배열은 선언과 동시에 초기화할 수 있다. 초기화는 배열을 선언하면서 동시에 특정 값으로 각 요소를 설정하는 것을 의미한다. int numbers[5] = {1, 2, 3, 4, 5}; 만약 배열의 크기를 명시하지 않고 초기화한다면, 컴파일러가 자동으로 배열의 크기를 결정한다. int numbers[] = {1, 2, 3, 4, 5}; 배열의 사용 배열의 각 요소

구글 성인 인증 없이 자유롭게 검색하는 방법 (별도 프로그램 설치 없이) [내부링크]

한국은 검색 검열이 강하기 때문에 성인 인증이 걸려 있는 글이 있다. 그 기준은 잘모르겠다. 회사 노트북에서 사용하는데 내 구글 계정으로 로그인을 하기 싫기 때문에 이 방법을 사용한다. 보통 VPN이나 이상한 프로그램을 쓰기 마련이다. 하지만 간단한 설정하나로 변경할 수 있다. https://support.google.com/websearch/answer/873?hl=ko&co=GENIE.Platform%3DDesktop 다른 국가의 검색결과 보기 - Android - Google 검색 고객센터 다른 국가의 검색결과 보기 Google에서 검색하면 현재 지역에 맞게 검색결과가 맞춤설정됩니다. 컴퓨터나 Android용 Google 앱에서 다른 국가의 검색결과가 표시되도록 선택할 수 있습니다. Android 휴대전화 또는 태블릿에서 Google 앱 을 엽니다. 오른쪽 상단에서 프로필 사진 또는 이니셜 설정 언어 및 지역 지역 검색 을 탭합니다. 검색결과를 표시할 때 사용할 지역을 탭합니다

공학 석사 졸업증 나옴... [내부링크]

드디어 졸업 확정 났다. 일반 대학원 과정을 밟다가 휴학을 하고 취직을 했다. 한 차례 이직을 하고 나서 다시 석사 과정을 밟고 싶어서 교수님께 양해를 구하고 회사를 병행하면서 석사 과정을 밟았다. 진짜 너무 힘들었다. 후,.. 공부도 다 때가 있더라... 다시 할려니까 숨이 막히더라.. ㅋㅋㅋ 폴더 정리를 하다 보니 웃겨서 사진 찍었다. 어찌저찌 석사 졸업도 확정났고, 학위 논문도 잘 올라간 것을 확인했으니... 이제 또 열심히 달릴 준비만 해야겠다. 박사 과정은 진짜 못하겠다...

[OBD2] 캔 통신 프로젝트 계기 [내부링크]

회사 선배에게 OBD2를 통한 옵션 설정에 대한 관련 이야기들을 들었다. 차량 마다 OBD2 케이블을 통한 진단 서비스로 READ/WRITE 한다. 차량마다 진단 서비스 ID와 데이터가 다르므로 카페에 들어가 참고하면 된다고 한다. 나는 쌍용 티볼리를 타기 때문에 아래 카페에서 정보를 얻어보려고 한다. https://cafe.naver.com/piphone/1029013?art=ZXh0ZXJuYWwtc2VydmljZS1uYXZlci1zZWFyY2gtY2FmZS1wcg.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjYWZlVHlwZSI6IkNBRkVfVVJMIiwiY2FmZVVybCI6InBpcGhvbmUiLCJhcnRpY2xlSWQiOjEwMjkwMTMsImlzc3VlZEF0IjoxNzA5NDUwMjQ4Njg1fQ.rqhiYYAu9VMbJ7NJEerLVjcbq5g51TSePMKr8cfmE-I 티볼리 LNT효율저하 산소센서 청소 문의 대한민국 모임의 시작,

[Flutter] Flutter 행렬 계산을 위한 matrix2d [내부링크]

Flutter로 앱을 개발하면서 matrix를 구현하는 일이 있어 pub.dev에서 급하게 matrix2d 사용법을 익혔다. 어렵지 않게 사용할 수 있는 이유는 python에서 numpy와 굉장히 유사하기 때문이다. 설치는 아래와 같다. // With Dart: $ dart pub add matrix2d // With Flutter: $ flutter pub add matrix2d 아래 코드로 불러온다. import 'package:matrix2d/matrix2d.dart'; Matrix 합, 뺄셈, 나눗셈, 곱셈 add : 행렬 합 substraction : 행렬 뺄셈 division : 행렬 나눗셈 dot : 행렬 곱셈 void main(){ // addition var add = m2d.addition([ [1, 1], [1, 1] ], [ [2, 2], [2, 2] ]); print(add); // [[3, 3], [3, 3]] // subtration var sub = m2

[VSCode] VSCode flutter 프로젝트 생성 시, 기본 설정. [내부링크]

0. Precondition VSCode Flutter Extension 설치 Flutter 환경 설정 - flutter doctor --android-licenses 1. Flutter 프로젝트 생성 # Command Palette Flutter: New Project 2. Device 선택 # Command Palette Flutter: Select Device 3. Dart recommendation # Command Palette Dart: Use Recommended Settings 4. analysis_options.yaml # analysis_options.yaml prefer_const_constructors: false prefer_const_literals_to_create_immutables: false 5. main.dart (basic) import 'package:flutter/material.dart'; void main() { runApp(MyApp())

[Flutter] Flutter GetX로 간단하게 상태 관리하는 방법 [내부링크]

https://pub.dev/packages/get get | Flutter package Open screens/snackbars/dialogs without context, manage states and inject dependencies easily with GetX. pub.dev Flutter 오픈 카톡 방에 getX가 이야기가 많이 나와서 한 번 써보기로 했다. getX 관련 자료를 찾아보니 블로그는 그냥 번역 블로그가 판을 치더라... 사람들과 이야기해보니까 대부분 blo -> provider -> getX로 넘어갔다고들 한다. 그래서 나름대로 BLE IPS 프로젝트를 진행하면서 내가 익힌 getX의 기본 사용법을 적어보려고 한다. 아직 완벽하게 사용하는 것이 아닌 프로젝트를 진행하기 위한 최소의 지식만을 가지고 있다. 내가 이해한 바로는 getX는 상태 관리를 위한 전역 공간이다. Class로 구현되는 각 page나 widget끼리 서로 데이터를 주고받을 때, con

[BLE 실내 측위 프로젝트] 7. NRF51822 비콘 테스트 및 초기 설정 [내부링크]

드디어 알리에서 구매한 NRF51822 BLE4.2 비콘이 도착했다. 개당 6000원에 배터리 4개 정도 해서 3만 원 정도에 구매했다. 다음 글로 삼변측량에 대해 포스팅할 예정이지만, 비콘으로 실내 측위를 위해선 최소 3개의 비콘이 필요하다. 조립은 간단하다 배터리 장착 후 나사 3개만 조여주면 된다 beacon 구매 후 beacon을 초기 설정할 필요가 있다. 설정 방법은 제작사에서 제공하는 Holyiot-beacon을 설치하면 된다. 우선, 하나의 비콘만 동작 중이며 다운로드한 앱을 실행할 경우 아래와 같이 화면에 표시된다 비콘의 연결을 위해선 최초의 비밀번호를 요구한다. 내가 구매한 비콘의 경우 초기 비밀번호는 aa14061112 이다. 비콘을 연결하고 나면, password, major, minor, MAC 주소 등 다양한 값을 변경할 수 있다. 내게 필요한 정보는 name, Tx Power, advertising interval이며, 변경할 수 있다. 아직은 Tx powe

[BLE 실내 측위 프로젝트] 8. Flutter 좌표 그리기 (데카르트 좌표계) [내부링크]

좌표 그리기 BLE 실내 측위 프로젝트의 최종 결과물은 아래의 그림과 같이 역시나 좌표를 찍는 것이다. 당연히 이상적인 상황은 나오지 않겠지만, 최대한 구현해 볼 생각이다. 처음엔 flutter에서 가장 유명한 차트 라이브러리인 syncfusion을 이용해서 구현해 보려고 했지만, 그냥 canvas로 그리는 방법을 선택했다. 괜히 익숙하지도 않은 라이브러리를 이것저것 건드려 보다가 포기했다. 우선 canvas로 배경에 grid widget을 이용해 좌표계를 표현할 생각이다. 그리고 줌 기능을 추가했다. import 'package:flutter/material.dart'; import 'package:zoom_widget/zoom_widget.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); // This w

[BLE 실내 측위 프로젝트] 9. Flutter 좌표에 실시간으로 원 그리기 [내부링크]

좌표에 실시간으로 원 그리기 Flutter에는 상태를 관리할 수 있는 라이브러리가 몇 가지 있다. 대표적으로 provider와 getX가 있다. 처음엔 코드를 provider를 사용해서 개발하다가 개발자 오픈 카톡 방에서 getX를 추천해서 getX로 변경했다. getX가 신세계라고 하는데, 이번에 좌표에 실시간으로 원 그리기를 하면서 알게 됐다. 클래스와 클래스 간 사이에 변수를 실시간으로 공유해야 하는데, 그게 잘 돼지 않아 하루 종일 토 나올 뻔했다. 그래서 그냥 오픈 카톡 방에 물어보니 1분 만에 해결됐다. 여러분들도 몇 시간 동안 막혀 있다면, 그냥 오픈 카톡 방에 질문하시길 바랍니다. 아래는 현재까지 개발한 코드를 git에 올려 두었습니다. 슬슬 앱이 커지다 보니 코드 한곳에 때려 박아서 블로그에 올리는 것도 어려워졌고 그냥 슬슬 git으로 관리할 때가 온 것 같다. https://github.com/JSYoon-git/Flutter-BLE-indoor-positionin

[BLE 실내 측위 프로젝트] 10. 삼변측량 정리 및 구현 [내부링크]

삼변측량 위치 측위 기술로 대표적으로 삼각측량과 삼변측량이 있다. 삼각측량은 두 점과의 거리와 각도를 알아야 위치를 측위 할 수 있다. 하지만 비콘은 직선거리만 계산할 수 있으므로 삼변측량을 사용한다. 삼변측량의 대표적인 예는 우리들이 사용하는 GPS가 있다. GPS로 자신의 위치를 파악하기 위해선 최소 4개의 위성이 사용된다. 삼변측량을 위한 3개의 위성, 그리고 오차 보정용으로 총 4개를 필요로 한다. https://m.blog.naver.com/younjung1996/223310046782 [Arduino] GPS 수신 모듈, NEO-6M, 7M (Tiny GPS) 오늘은 GPS 모듈에 대해 이야기하겠습니다. 아래 동영상은 LoRa 통신을 활용해서 GPS 트래킹 시스... blog.naver.com 삼변측량은 어떻게 계산되는가? P1, P2, P3는 각 고정 좌표(Anchor 좌표) r1, r2, r3는 각 원의 반지름(비콘의 RSSI로부터 계산된 거리) (목차에서 5번 글 참

[BLE 실내 측위 프로젝트] 11. Flutter BLE indoor position(실내 위치 추적) system demo, 실내 네비게이션 [내부링크]

Application Demo 포스팅 10편 만에 목표하던 flutter로 BLE indoor position을 구현했다. 내가 만들고자 했던 앱은 실내 측위 기능도 있지만, 어떤 상황에서든 사용될 수 있는 참고용(교육용?) 애플리케이션을 만들고 싶었다. 이 애플리케이션의 특징은 BLE를 스캔하고, 사용자가 anchor를 선택하여 직접 경로 손실 모델을 모델링하고, 삼변측량을 통해 계산된 위치를 실시간으로 보여줌으로써 사용자에게 실내 측위(실내 위치 추적) 원리를 보여준다. 완성한 애플리케이션의 테스트를 위해 anchor를 아래와 같이 설치했다. 동작 순서 (Operation Mode) 1. 애플리케이션을 시작하면, BLE 스캔 모드를 설정할 수 있다. 2. BLE가 스캔 되면, anchor로 활성화할 것인지 결정한다. 어떤 BLE 기기든 anchor로써 활용될 수 있다. 3. Indoor Map을 선택하면, 좌표에 실시간으로 위치를 실시간 시각화한다. 4. 선택된 anchor들은

[BLE 실내 측위 프로젝트] Indoor Positioning System 포스팅 리스트 [내부링크]

BLE 실내 측위 프로젝트 1. Flutter_blue 설정 (feat.안드로이드12 권한 이슈) : https://m.blog.naver.com/younjung1996/223334840714 2. Bluetooth Low Energy(BLE) 통신 스케줄, 안드로이드 함께 이해하기 : https://m.blog.naver.com/younjung1996/223357207874 3. Flutter BLE Scan Demo Program, RSSI monitoring : https://m.blog.naver.com/younjung1996/223357242785 4. BLE advertising packet 기본 구성 : https://m.blog.naver.com/younjung1996/223363785615 5. BLE Beacon의 RSSI 값에서 거리를 계산하는 방법 (feat.log distance path loss model) : https://m.blog.naver.com/y

[Debug] Dart matrix2d Transpose debuging, "'double' is not a subtype of type [내부링크]

matrix2D를 사용하면서 이상한 타입 오류?를 발견했다. 바로 전치행렬로 변환하는 transpose 메서드이다. 사용 방법은 아래와 같다. import 'package:matrix2d/matrix2d.dart'; void main() { var list = [ [1, 2], [1, 2] ]; // transpose print(list.transpose); // [[1, 1], [2, 2]] } 정수가 들어 있는 List의 경우 문제가 발생하지 않는다. 하지만, List 안에 double의 숫자를 넣으면 아래와 같은 에러가 발생한다. 처음엔 이 라이브러리가 double형이 연산 속도 때문에 막아 놓은 줄 알았다. 그렇다면 연산량이 더 많은 division, dot 경우에 말이 안 된다. 그리고 연산 방식이 비슷한 reshape, concatenate는 double형을 지원하니 이상할 노릇이다. import 'package:matrix2d/matrix2d.dart'; void mai

[Debug] Flutter window 실행 오류, Visual studio error [내부링크]

device를 window로 설정하고 빌드를 하였는데, 아래와 같은 에러 문구가 뜬다. 해결 방법은 간단하다. flutter doctor를 통해서도 쉽게 문제를 파악할 수 있다. 아래 경로의 vswhere을 git의 최신 버전 파일로 변환하면, 깔끔하게 문제가 해결된다. vswhere 3.0.1 => vswhere 3.0.2 C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe https://github.com/microsoft/vswhere/releases Releases · microsoft/vswhere Locate Visual Studio 2017 and newer installations. Contribute to microsoft/vswhere development by creating an account on GitHub. github.com

selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executableneeds to be in PATH [내부링크]

selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH . Please see https://sites.google.com/a/chromium.org/chromedriver/home 위 에러가 발생했을 때, 아래와 같은 방법으로 대처하면 된다. webdriver-manager를 설치한다. pip3 install webdriver-manager # selenium 3 from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install()) 위 코드처럼 webdriver.Chrome(ChromeDrivermanager().install())을 넣으면 된다. 하지만 webdri

[BLE 실내 측위 프로젝트] 2. Bluetooth Low Energy(BLE) 통신 스케줄, 안드로이드 함께 이해하기 [내부링크]

BLE 통신을 하기 전에 통신 스케줄에 대해 이해하고 가면 좋다. BLE의 물리 계층 먼저 간단하게 짚고 간다. BLE는 2.4GHz 대역을 사용하며, (2.402 GHz ~ 2.4835 GHz) : 2 MHz 간격으로 40개 채널로 구성된다. Advertising 채널은 37, 38, 39 (2402 MHz, 2426 MHz, 2480 MHz)를, Adaptive Frequency Hopping 방식을 사용한다. 실내 측위 Advertiser은 송신부, Scanner는 수신부라고 생각하면 편하다. 실내 측위 프로젝트는 따로 기기 간 연결을 필요로 하지 않고, Device discovery 모드만 사용한다. 실내 측위에 간략히 설명하자면, Advertiser가 모든 방향으로 Advertising 패킷을 브로드캐스팅하면, 수신 받는 Scanner는 패킷에 대한 RSS(수신신호세기)를 얻을 수 있다. 알려진 Log distance path loss model을 이용해 RSS로 거리를 구

[BLE 실내 측위 프로젝트] 3. Flutter BLE Scan Demo Program, RSSI monitoring [내부링크]

하이제니스 님의 포스팅에 포함된 코드를 일부 수정하였습니다. 참고 : https://blog.naver.com/chandong83/222414483554 BLE 통신 스케줄 및 안드로이드 동작에 관한 포스팅을 보고 와야 어느 정도 이해하기 편하다. 패키지 설치 및 설정 flutter_blue 대신 flutter_blue_plus 패키지를 설치한다. flutter_blue는 더 이상 업데이트하지 않고 안드로이드 12 권한 이슈가 있으므로, flutter_blue_plus를 설치한다. $ flutter pub add flutter_blue_plus 설치하게 되면 알아서 dependecies가 추가된다. 1. android/app/build.gradle : SDK 최소 버전 19로 설정 Android { defaultConfig { minSdkVersion: 19 2. android/app/src/main/AndroidManifest.xml : Bluetooth 권한 설정 <uses-pe

오버워치2 하트 조준선 [내부링크]

오버워치2가 대규모 업데이트를 진행했다. 진행 방향은 에임의 판정이 꽤나 파격적이라고 할 수 있을만큼 좋아졌다. 현재 입문용 FPS 게임이라고 할 만큼 판정이 후해졌다. 이건 뒤로 하고 또 하나 재밌는 패치가 있었다. 바로 조준선에 아래 사진처럼 하트가 생겼다는 것이다. 설정 방법은 간단하다. 조작법 - 조준선 - 점 점 종류가 늘어난 것이며, 아래 하트 이외에도 네모 세모 등 다양한 모양이 존재한다.

[BLE 실내 측위 프로젝트] 4. BLE advertising packet 기본 구성 [내부링크]

Packet BLE의 패킷 타입은 두 가지가 있다. 1. Advertising channl PDUs : 기기 감지 및 브로드캐스팅 2. Data channel PDUs : 데이터 전송용 실내 측위에서는 데이터 전송이 따로 필요 없으므로 Advertising channel PDUs에 대해서만 언급한다. Packet types은 아래 테이블과 같다. 보통 비콘의 타입은 ADV_IND가 일반적이다. 특정 중앙 장치를 특정하지 않고 모든 주변 기기와 연결할 수 있다. Payload는 최대 37바이트 중에서 6바이트는 Advertisement Address, 나머지 0 ~ 31바이트는 Advertisement Data이다. BLE 비콘에는 각 제조사에 따라 다양한 패킷 포맷을 가진다. 그중 가장 유명한 것이 애플의 iBeacon, 구글의 EddyStone이다. 이 글은 iBeacon의 패킷에 대해 이야기한다. iBeacon - Apple iBeacon 비콘 packet format (모든 B

[BLE 실내 측위 프로젝트] 5. BLE Beacon의 RSSI 값에서 거리를 계산하는 방법 (feat.log distance path loss model) [내부링크]

Log distance path loss model RSSI는 수신 신호 강도 표시기를 나타낸다. 스마트폰과 같은 수신 장치에서 볼 수 있는 비콘의 신호 강도이다. 신호 강도는 거리와 전송 세기에 따라 다르다. RSSI를 이용하여 거리를 구하는 식은 아래와 같다. d : 거리 n : 보정 상수 (2~4: 보통 2를 사용) a : 1m에서 측정된 RSSI RSSI : 측정된 현재 RSSI Code import "dart:math"; void main() { int n = 2; // constant N int alpha = -63; // rssi at 1m int rssi = -80; // measured rssi num m = pow(10.0,((alpha-rssi)/(10*n))); print(m); } // result // 3.548133892335755 [m] 한계점 흡수, 간섭 또는 회절과 같은 전파에 영향을 미치는 외부 요인으로 인해 RSSI는 변동하는 경향이 있다. 장치가

[BLE 실내 측위 프로젝트] 6. RSSI 변동을 해결하기 위한 이동 평균 필터 [내부링크]

BLE RSSI의 문제점은 위 그림과 같다. 4.5m 이상에서는 제대로 된 거리를 계산할 수 없음. (나중에는 통신 거리가 더 길어진 BLE5.0에 대해 알아볼 예정) 실제 환경에서는 많은 외부 요인으로 인해 RSSI 변동이 발생해 거리의 오차가 발생함. 이동 평균 필터 RSSI 변동을 해결하기 위한 방법은 여러 가지가 있는데 그중 가장 간단한 이동평균 필터이다. 1. 원리는 간단하다. 하나의 윈도우 사이즈만큼 그룹을 묶는다. 2. 그룹의 평균 값을 대푯값으로 잡는다. 3. 한 칸씩 이동한다. (Convolution 1D와 같은 원리) 이 간단한 방법으로 스무딩 효과를 낼 수 있다. RSSI 값이 확 튀었을 때 이를 완화시켜주는 효과를 낸다. 당연히 단점도 존재한다. delay가 발생한다. 윈도우 사이즈만큼 평균 내기 때문에 현재의 값이 바로 반영되지 않음. 윈도우 사이즈가 크면 클수록 delay는 점점 더 늘어난다. delay를 해결하기 위해 현재의 값에 가중치를 곱할 수 있고,

[Arduino Tip] 1. 아두이노 0, 1번 핀을 사용하면 안되는 이유. [내부링크]

2024년 1월 1일 개발 블로그를 시작하기로 마음 먹었으니 일단 아두이노로 간단하게 시작해보자. 대학교 3학년 정도 되면 아두이노를 시작한다. (요즘은 고등학생들도 아두이노로 코딩을 한다고 한다.) 나는 공부를 할 때 히스토리를 알아야 한다고 후배들에게 알려준다. 어떠한 함수, 언어, 기능 들은 생겨난 이유가 있다. 바로 불편함을 해소하기 위해서다. 그렇다면 아두이노 또한 어떠한 불편함을 해소하기 위해서 생겼을 것이다. 아두이노란 무엇인가? 아두이노란, ATmega 328P 칩이 박힌 개발 보드이다. ATmega 328P는 무엇인가? 개발자가 프로그래밍을 할 수 있는 산업용 제어 칩이다. 이 칩들을 쉽게 제어할 수 있고 교육용으로 개발된 것이 바로 아두이노이다. 이러한 펌웨어 개발들은 진입 장벽이 굉장히 높고 난이도 또한, 다른 개발에 비해 굉장히 어렵다. 요즘은 인공지능이니 블록체인이니 이런 것들에 빠져 파이썬이나 자바에 미쳐있지만... 펌웨어도 나름의 매력을 가지고 있다. 아두

[Python] SQLITE3 이미지 read 및 write 예제 [내부링크]

클라이언트 측 앱, 웹 혹은 에지 디바이스 등과 같은 가벼운 데이터베이스를 위해 설계된 SQLite는 내장 가능한 오픈소스 데이터베이스이다. C로 작성됐으며, 일반적인 SQL 쿼리 작성이 가능하며, 윈도우, 리눅스, iOS, 안드로이드를 비롯한 다양한 플랫폼에서 이식 가능한 장점을 가진다. 또한, SQLite3는 파이썬 표준 라이브러리로 인터페이스를 제공한다. 아래 url을 통해 쉽게 sqlite를 설치할 수 있다. https://www.sqlite.org/download.html SQLite Download Page Small. Fast. Reliable. Choose any three. Home About Documentation Download License Support Purchase Search SQLite Download Page Pre-release Snapshots sqlite-snapshot-202312201933.tar.gz (3.07 MiB) The amalga

[Arduino] GPS 수신 모듈, NEO-6M, 7M (Tiny GPS) [내부링크]

오늘은 GPS 모듈에 대해 이야기하겠습니다. 아래 동영상은 LoRa 통신을 활용해서 GPS 트래킹 시스템을 구현했습니다. 그 과정에서 블로그 포스팅 거리가 10가지는 넘게 나올 것 같네요. https://www.youtube.com/shorts/qERShRbuAM4 트래킹 시스템을 만들기 이 전에 GPS(Global Positioning System)에 대해 설명을 하겠습니다. GPS 모듈 중 가장 유명한 NEO 시리즈 입니다. 디바이스 마트에서 NEO 6M과 7M을 가장 많이 사용합니다. 7M이 6M보다 가격이 더 나가지만, 성능 차이는 크게 없습니다. 7M은 몇 개의 추가 GPS 채널을 가지고 있고 유럽 Galieo GNSS를 지원한다는 차이 정도만 있습니다, 자세한 내용은 ublox 361에서 사양을 확인할 수 있습니다. 저는 4000원 정도 더 사용해서 7M을 구매했습니다. NEO 파싱 기본적으로 NEO-7M의 동작은 인공위성으로 부터 수신 받은 데이터를 전달받아 파싱 후,

[LoRa Tracking] 시스템 소개 [내부링크]

이번에 만들고자 하는 프로젝트는 LoRa Tracking 시스템 입니다. 네이버 블로그에 올리는 첫 프로젝트입니다. 이 프로젝트를 만들게 된 계기는 평소에 오는 실종 문자 때문입니다. 치매에 걸리신 노인 분들이 집을 나가시면 굉장히 찾기 어렵다고 합니다. SK에서는 이미 스마트 지킴이라는 어플리케이션을 제공하고 있습니다. http://smartcitysolutionmarket.com/scsm/slutn/slutnView.do;jsessionid=DDC407D6334B2B19F6BB73DEE5726DDF?menuNo=5&typeId=TYP005&styCode=P0016&slutnId=SLUTN_00000000000172 스마트 시티 솔루션 마켓 스마트 시티 솔루션 마켓 홈페이지 smartcitysolutionmarket.com 현재 스마트 지킴이2가 있는 것으로 알고 있습니다. 그 외에도 Pet Tracking 등 다양한 어플리케이션에서 사용되고 있습니다. 그래서 LoRa Tracki

[LoRa Tracking] 2.1. TTGO LoRa32 OLED 개발환경 세팅 (based ESP32) [내부링크]

https://randomnerdtutorials.com/ttgo-lora32-sx1276-arduino-ide/ 오늘은 TTGO LoRa32 OLED 보드 개발환경 설정에 대해 포스팅하겠습니다. TTGO LoRa32 OLED 보드는 이 전 글에서 소개를 했었는데, LoRa 모듈과 OLED 모듈이 함께 붙어 있는 보드입니다. LoRa 모듈은 SPI로, OLED는 I2C를 통해 제어합니다. 그리고 특징 중 하나로는 아두이노 우노에서는 UART가 하나 밖에 없지만, 이 모듈은 ESP32 베이스로 하드웨어 UART가 두 개가 있습니다. TTGO LoRa32 OLED 보드는 ESP32 기반의 보드로 ESP32 개발환경 세팅하는 방법과 동일합니다. 설정 방법 TTGO LoRa32 보드를 프로그래밍하려면 아두이노 IDE를 사용해야 합니다. 따라서 ESP32 추가 기능뿐만 아니라 아두이노 IDE도 설치되어 있어야 합니다. [File] - [Preferences] [파일] - [기본설정] 아래 U

[LoRa Tracking] 3.1. TTGO LoRa32 OLED Sender 예제 코드 분석. [내부링크]

https://randomnerdtutorials.com/ttgo-lora32-sx1276-arduino-ide/ TTGO LoRa32 SX1276 OLED with Arduino IDE | Random Nerd Tutorials The TTGO LoRa32 SX1276 is an ESP32 development board with a built-in LoRa chip and OLED display. Learn how to send and receive LoRa packets using Arduino IDE. randomnerdtutorials.com 위 URL은 LoRa 모듈과 OLED 모듈의 코드가 같이 있는 예제를 제공한다. 하지만 코드 분석 없이 바로 돌려볼 수 있다는 장점이 있지만, 코드에 이해가 떨어지는 분들이 보면 혼동이 올 수 있다는 단점이이 있다. 그러므로 코드에 대한 분석을 조금해보려 한다. 우선, 대부분의 LoRa 모듈의 제어는 SPI 통신을 통해 제어된다. (간

[Visual Studio]error#1. No such file or directory [내부링크]

Visual studio 를 사용하는데 있어 가끔 씩 파일을 찾지 못하는 경우가 종종 있다. 아무래도 회사 프로젝트의 경우 유지보수를 위해 코드를 기능 별로 쪼개다 보면 트리가 복잡해지기 마련이다. 분명 해당 경로에 헤더 파일이나 .c 파일이 있는데 트리의 뎁스(깊이)가 깊어져 못 찾는다. 이럴 때는 경로를 추가해주면 된다. 윗 메뉴 바에서 [Project] - [Properties] 를 클릭한다. [Configuration] - [C/C++] - [General] 클릭 찾지 못하는 파일의 경로를 추가한다. [...] 을 클릭하면, 경로를 추가할 수 있는 창이 하나 뜬다. 다시 [Clean] - [Build]를 진행하면, 이번엔 해당 소스 파일을 제대로 찾을 수 있는 것을 확인할 수 있다.

[C/C++ Tip]1. 개발하기 전, typedef 별명 부여. [내부링크]

저는 전장(전장은 차량에 들어가는 모든 전기.전자 장비를 뜻) 회사를 다니기 때문에 C언어 밖에 사용하지 않는다. 요즘은 뭐 Python이니 JavaScript니 하이 레벨 언어만 추구하지만, 작은 MCU 보드에는 C언어 만한게 없다. 개발을 하기 앞서, 가장 먼저하는 것은 typedef를 통해 개발의 편의성을 높이는 것이다. typedef가 무엇이냐. 그냥 별명 정해주는 것이다. 예시를 보면 간단하다. typedef unsigned char u8; typedef unsigned short u16; typedef unsigned long u32; typedef signed char s8; typedef signed short s16; typedef signed long s32; unsigned char를 u8이라는 이름으로 대체한다는 것이다. 이유는 간단하다. unsigned char가 너무 길기 때문이다. (코드를 컴파일할 때, 전처리기가 u8을 unsigned char로 자동으로

[C/C++ Tip] 2. #define의 목적 [내부링크]

#define은 왜 사용하는 걸까? 단순히 상수 처리하기 위해 define을 사용하는 것일까? 이를 알기 위해선 소스 코드의 변환 과정을 알 필요가 있다. Build의 순서는 아래와 같다. exe 파일 생성 : 소스코드 -> 전처리 -> 컴파일 -> 링크 -> 실행 mcu 헥사 파일 생성 : 소스코드 -> 전처리 -> 컴파일 -> 어셈블리어 변환 -> 헥사 파일 생성 -> MCU 다운로드 C언어를 처음 공부할 때, #define을 사용하지 않으면 전처리 과정을 거치지 않는다고 생각한 적이 있다. #으로 시작하는 문장은 전부 전처리기 지시자임에도 #include는 전처리기라고 생각하지 않았다. 항상 C언어를 실습할 때, 의무적으로 #inlcude <stdio.h>를 작성한 폐해이다. 전처리란 무엇인가? 컴파일 전에 처리되는 하는 작업이고 전처리를 수행하는 장치를 전처리기라고 한다. 전처리기는 헤더 파일을 불러오거나, 소스 파일 내부의 특정 문자열을 상수 또는 문자로 치환하거나, 조건에

[Python] PyQt5의 Qt designer로 간단하게 UI 제작하기 [내부링크]

크몽에서 개발 의뢰를 받다 보면 최대한 빠르게 일 처리하는게 중요하다. 대부분 의뢰자들은 성능 이런걸 떠나 자동화 프로그램을 원하므로 Python이면 충분하다. Python은 왠만한 라이브러리를 제공하며 프로토 타입을 개발하기에 적합하다. 특히, 적당한 모양새를 갖춘 GUI에는 Python만한게 없다. Python으로 UI를 생성할 수 있는 라이브러리는 대표적으로 PyQt5와 Tkinter가 있다. 저는 Qt designer로 간단하고 빠르게 디자인할 수 있어서 PyQt5를 사용한다. Qt desinger를 사용하기 위해선 Pyside2를 설치해야 한다. $pip install pyside2 설치 후 python이 설치된 경로를 찾아야 한다. 나는 python을 보통 C 드라이브에 설치해둔다. Python 설치 경로 > 실행 .\Lib\site-packages\PySide2\designer.exe 그리고 qt designer에서 작업한 파일의 확장자 명은 (.ui)이다. 매번 위 설

[LoRa Tracking] 3.2. TTGO LoRa32 OLED LCD 제어. [내부링크]

https://blog.naver.com/younjung1996/223314914861 [LoRa Tracking] 3.1. TTGO LoRa32 OLED Sender 예제 코드 분석. https://randomnerdtutorials.com/ttgo-lora32-sx1276-arduino-ide/ 위 URL은 LoRa 모듈과 OLED ... blog.naver.com LCD 제어 코드를 분석하기 이 전, LoRa 코드에 관한 포스팅을 보는 것을 추천한다. TTGO의 full 코드는 아래와 같다. 라이브러리는 아래 첨부된 사진을 참고하여 설치한다. Adafruit SSD1306 Adafruit GFX /********* Rui Santos Complete project details at https://RandomNerdTutorials.com/ttgo-lora32-sx1276-arduino-ide/ *********/ //Libraries for LoRa #include <SPI.

Nested Interrupt... [내부링크]

오늘 코드 분석 리뷰를 마치고, Nested Interrupt에 대한 존재를 처음 알게 됐다. 우선, 인터럽트란 무엇인가. 그림은 어려워 보이지만, 사실 별거 없다. 내가 일을 하고 있는데, 중요한 일이 갑자기 생겨 하던 일을 멈추고 중요한 일을 처리하는 것이다. 일을 완료하면 다시 하고 있던 일로 돌아가는 것이다. Main 프로그램이 돌고 있는데, Interrupt(방해)가 들어와 ISR(Interrut Service Routine)을 처리하고, 완료되면 Main 프로그램을 재실행한다. 그렇다면 Nested Interrupt란 무엇인가? Nested Interrupt란, Main 프로그램 동작 중에 Interrupt #1 가 발생하여 ISR #1을 처리하고 있는 도중에 새로운 Interrupt #2 가 발생했을 때, ISR #1을 멈추고, ISR #2를 실행시키는 것이다. 기본 Interrupt는 ISR #1 동작 중에 우선순위가 더 높은 Interrupt #2가 발생했다 하더라도

[C/C++ Tip] 3. 코딩 규칙. 변수명 정하기 [내부링크]

C/C++ Tip 관련 세번 째 글이다. 뭘 작성할까 고민 하다가 코딩만큼 중요한 변수명 정하는 것으로 결정했다. 변수명 정하기가 중요한 이유는 가독성 때문이다. 가독성이 높은 코드는 내가 아닌 남에게 보여주기 위함이다. 여기서 남이란 후배, 상사 뿐만 아니라 한달 뒤의 '나'도 남에 포함된다. 코드를 봤을 때 결과가 독서하는 것처럼 바로 유추가 되어야 한다. 변수명 규칙은 네 개를 꼭 기억하면 된다. 함수의 input parameter(입력 인자, 입력 파라미터)는 i_{변수명} 함수의 output parameter(출력 인자, 출력 파라미터)는 o_{변수명} 함수의 local 변수(로컬, 지역 변수)는 l_{변수명} static 변수(정적 변수) 혹은 전역변수는 {변수명} 하나의 예시를 보겠다. #include <stdio.h> typedef unsigned char u8; typedef unsigned short u16; typedef unsigned long u32; type

[LoRa Tracking] 4.1. MKR1310 Receiver(수신기) 소스 코드와 JSON에 대해서. [내부링크]

Sender (송신기)에 대한 코드를 설명했다. 주파수는 922.7MHz 대역을 사용하였기 때문에, 수신부 또한 922.7MHz로 설정하였다. https://www.arduino.cc/reference/en/libraries/lora/ LoRa - Arduino Reference Reference > Libraries > Lora LoRa Communication An Arduino library for sending and receiving data using LoRa radios. Supports Semtech SX1276/77/78/79 based boards/shields. Author: Sandeep Mistry Maintainer: Sandeep Mistry Read the documentation Compatibility This library is compatible with all archi... www.arduino.cc 아두이노의 LoRa 라이브러리를 사용했다.

[LoRa Tracking] 3.3. LoRa 신호를 SDR로 관측하기. [내부링크]

https://blog.naver.com/younjung1996/223324723354 [LoRa Tracking] 3.2. TTGO LoRa32 OLED LCD 제어. https://blog.naver.com/younjung1996/223314914861 LCD 제어 코드를 분석하기 이 전, LoRa 코드에 관... blog.naver.com 저번 포스팅에서 언급했듯이 실제로 922.3MHz를 사용하였고, 실제로 적용됐는지 확인한다고 했다. #define BAND 923300000 SDR이란, Software Define Radio의 약자로 무선 통신 기술에서 무선 신호를 변.복조하는 기술이다. 변조란 무엇인가? 신호 정보를 전송 매체에 맞게 전기적 신호로 바꾸는 방법이다. 쉽게 말하면 송신기가 데이터를 송신할 때, 신호를 변환하는 것을 의미한다. 복조란 무엇인가? 당연히 송신을 위해 복조를 했으면, 수신 받은 전기적 신호를 알맞게 신호 정보를 해석하는 것을 의미한다. LoRa에서

[LoRa Tracking] 3.4. TTGO LoRa32 OLED + GPS (full code) [내부링크]

https://blog.naver.com/younjung1996/223332842224 [LoRa Tracking] 3.3. LoRa 신호를 SDR로 관측하기. https://blog.naver.com/younjung1996/223324723354 저번 포스팅에서 언급했듯이 실제로 922.3MHz를 사용... blog.naver.com 이 전 글에서 실제로 SDR을 통해 송신기가 송신한 LoRa 신호를 관측했다. 이제 LoRa Tracking 시스템의 구축인 LoRa Sender에 GPS를 다는 것을 목표로 한다. 구조는 아래와 같다. TTGO LoRa32의 장점은 LCD, LoRa를 한 번에 해결할 수 있다. 이제 GPS를 달면 끝. 하지만 하나 문제가 있다. 바로 TTGO LoRa32는 UART가 하나라는 점! 아니 하나 남은 공간에 UART를 달면 되는거 아닌가? 할 수 있지만. 하나 밖에 없는 UART 선이 USB와 연결되어 있다는게 문제이다. 즉, GPS를 장착하여 UART

[BLE 실내 측위 프로젝트] 1. Flutter_blue 설정 (feat.안드로이드12 권한 이슈) [내부링크]

개인 프로젝트인 BLE 실내 측위 첫 글이다. 우선, flutter에서 ble 관련 패키지를 설치한다. 대표적으로 ble 관련 패키지는 3개가 있다. 1. flutter_ble_lib 2. flutter_reactive_ble 3. flutter_blue flutter_ble_lib는 업데이트가 느려, 2번과 3번 중 골라야 하는데, 오늘 자 기준으로 flutter_blue가 최신 버전이 있어 flutter_blue를 사용한다. flutter 패키지는 pub.dev에서 설치할 수 있다. 혹은 아래 명령어를 통해 설치할 수 있다. $ flutter pub add flutter_blue 설치하게 되면 자동적으로 pubspec.yaml 파일의 dependecies에 추가된다. 하지만, flutter_blue의 경우 안드로이드 12에서 권한 이슈가 있다. 안타깝게도 내 스마트폰도 안드로이드 12였고 AndroidManifest.xml에 별에 별짓을 다했지만 되지 않았다. 결국 아래 git에

[Arduino Tip] 3. 라이브러리 추가 및 폴더 경로, 관리. [내부링크]

아두이노의 최고의 장점은 내가 테스트하고 싶거나 프로토 타입으로 만들고자 하는 것을 빠르고 쉽게 만들 수 있는 것이다. 특히, 라이브러리 제공은 큰 메리트로 다가온다. 라이브러리 사용은 꽤 간단하다. [툴] - [라이브러리 관리]를 클릭한다. 자신이 원하는 라이브러를 하기 사진과 같이 검색하여 설치하면 끝이다. 하지만 라이브러리 관리보다는 직접 git에서 다운로드하여 경로에 옮긴다. 방법은 간단하다. 예로 자신이 설치하고 싶은 라이브러리 코드의 git을 찾는다. 나는 LoRa 라이브러리를 예시로 든다. git을 찾는 방법은 간단하다. google에 Arduino {라이브러리 명} git 으로 검색하면 다 나온다. ex) Arduino LoRa git https://github.com/sandeepmistry/arduino-LoRa GitHub - sandeepmistry/arduino-LoRa: An Arduino library for sending and receiving data

2024년 일본 여행 5박 6일 ... 첫 번째 이야기(1) [내부링크]

회사 동기들과 설날에 일본 여행을 가게 됐다. 그 시작은 참 이상했다. 평소 카풀하던 회사 동생이 설날에 일본을 혼자 놀러 간다는 것이다. 장난 삼아 나도 가고 싶다고 했더니 나보고 같이 가는게 어떠냐 물어봤다. 설날에 친척들에게 인사드려야 하고 여자친구를 두고 가는게 마음에 걸렸다. 이게 왠걸. 갈 수 있을 때 갔다오라고 한다. 곧 상견례인데 여자친구 마저도 재밌게 놀고 오라고 한다. 나는 일본계 회사를 다닌다. 나는 개발자이기 때문에 일본어를 하나도 못하지만 동기들은 기본으로 JLPT 1급이다. 이렇게 듀오가 완성되니 평소 술을 자주 먹는 한 동생도 따라간다고 한다. 막상 가려니 느낌이 이상했다. 설날에 회사 동료랑 일본 여행을? 그렇게 이번 일본 여행이 시작됐다. 첫 째날... 당연히 일본 가느라 대부분을 가는데 시간을 잡아먹었다. 새벽부터 일어나 죽을 뻔 했지만 어느때보다 발걸음이 가벼웠다. 회사 친한 여자 동기 중에 인천공항을 가면 꼭 쉑쉑 버거를 먹으라고 추천했다. 솔직히