개발일지

    Android Hilt - DI 사용

    Hilt Dagger DI 라이브러리 기반으로 빌드되어 Dagger Android 애플리케이션에 통합하는 표준 방법을 제공. Android 앱을 위한 Dagger 관련 인프라 간소화 앱간의 설정, 가독성 및 코드 공유를 용이하게 하기 위한 표준 구성요소 및 범위 세트 생성 테스트, 디버그 또는 출시와 같은 다양한 빌드 유형에 서로 다른 결합을 프로비저닝하는 쉬운 방법 제공 DI를 구현하면 코드 재사용 가능, 리팩터링 편의성, 테스트 편의성의 이점이 있다. 1. 루트의 build.gradle에 hilt-android-gradle-plugin을 dependency 추가 buildscript { ... dependencies { ... class 'com.google dagger:hilt-android..

    Git - PR 반영시 지워진 브랜치 쌓여있는 문제, prune 옵션 사용

    Pull Request를 반영하면서 지워진 브랜치가 로컬에서 git branch -a로 확인하면 지워져 있지 않고 쌓여있는 문제가 있다. git config 옵션을 추가하여 git pull, git fetch시 반영되도록 한다. 1). git config 옵션을 추가하여 사용하는 방법 $ git config --global fetch.prune true $ git fetch $ git pull2). --prune 옵션을 사용하는 방법 $ git fetch --prune $ git pull --prune

    Emscripten: 동적링크하기

    Emscripten의 경우 기본적으로 Shared Library로 빌드되지 않고 Static Library로 변경되어 빌드되고 있다. 확인해보니 Emscripten 1.32.2 버전부터 Shared Library로 빌드할 수 있도록 지원하고 있어 이를 테스트해보고 기록한다. 일반적인 동적링크 테스트하기 main.c #include int side(int a); int main() { printf("hello world %d\\n", side(1)); } side.c int side(int a) { return a + 1; } pre.js Module.dynamicLibraries = \['side.wasm'\]; 위 3개 소스파일을 생성하고 컴파일 후 테스트하면 정상동작하는 것을 볼 수 있다. 아래 Co..

    Git - Encoding, Line Ending 오류 해결 방법

    여러 플랫폼에서 작성하는 저장소를 사용하다보면 IDE 설정에 따라 자동으로 소스의 Encoding, Line Ending, BOM(Byte Order Mark)이 변경되는 문제가 있다. 한글이 깨지는 문제도 발생할 수 있고, 이럴 경우 자신이 수정하지 않은 코드도 수정된 것 처럼 나타나기 때문에 커밋 히스토리를 엉망으로 만들어 나중에는 머지할 때마다 문제가 된다. 또한 BOM이 제거될 경우에는 Windows VS Warning Level에 따라 빌드오류까지 야기시킨다. 이를 해결하기 위해 아래 해결법을 제시해본다. 첫 번째로, 이를 해결하기 저장소의 컨벤션을 맞추는 일이다. 프로그래머끼리 convention을 정하여 Encoding, Line Ending을 동일하게 맞추어 개발한다. Encoding: U..

    [C++] backtrace함수를 이용한 로그 출력 및 분석 방법, 리터럴 스트링 제거하기

    __func__, __FILE__, __LINE__ 매크로를 사용하여 로그를 출력하게 되면 소스코드 정보가 리터럴 형태로 외부에 노출될 수 있는 문제가 발생합니다. 이를 해결하기 위해 Release빌드에서는 해당 매크로를 사용하지 않도록 하고 backtrace함수를 사용하여 심볼정보를 얻어오는 방법으로 변경해야 하는데요. 해당 방법을 블로그로 남겨 놓으려고 합니다. 먼저 리터럴 문자 확인 방법은 아래와 같습니다. # for macOS $ objdump -section="__cstring" -s ./test.dylib $ objdump -section="__cstring" -s ./test.o # for Linux, Android $ objdump -section=".rodata" -s ./test.so ..

    Emscripten: WebAssembly Install & example 테스트

    사전에 필요한 패키지 Windows Python 3.6 이상 설치되어 있어야 한다. git이 설치되어 있어야 한다. 빌드 구성을 CMake로 할 경우 CMake가 설치되어 있어야 한다. macOS Python 3.6 이상 설치되어 있어야 한다. Xcode Command Line Tools가 설치되어 있어야 한다. git이 설치되어 있어야 한다. 빌드 구성을 CMake로 할 경우 CMake가 설치되어 있어야 한다. Linux Python 3.6 이상 설치되어 있어야 한다. git이 설치되어 있어야 한다. 빌드 구성을 CMake로 할 경우 CMake가 설치되어 있어야 한다. emsdk 다운로드 & 인스톨 $ git clone https://github.com/emscripten-core/emsdk.git $..

    Calling Convention이란?

    함수를 호출할 때 파라미터를 어떤 식으로 전달하는가에 대한 약속. 함수 호출 후에 ESP(스택포인터)를 어떻게 정리해야하는지에 대한 약속. 으로 정의할 수 있다. 디버그 심볼을 확인하면 Name Mangling되는 것을 확인할 수 있는데 아래 Calling Convention에 따라 Mangling되고 있던 것이였다. 지금까지 c++filt같은 명령어로 Demangle하여 편하게 디버깅만 해봤지 자세히 살펴보지를 못 한것 같아 정리해본다. x86 아키텍처에 쓰이는 3가지 Calling Convention x86아키텍처의 _cdecl, _stdcall, _fastcall에 대해서 확인해보록 한다. 해당 Calling Convention의 경우 MSVC는 물론 GNUC계열 컴파일러에서도 지원한다. _cdec..

    UTF 문자열 표현 방법 정리

    개발하다보면 UTF 문자열 변환을 많이 하게되는데 이전에 정리한 글을 남겨놓으려고 한다. UTF-8 UTF-8 문자열은 8bit 기반으로 다음과 같은 4가지 패턴으로 표현된다. 0xxxxxxx // 000000-00007F 110xxxxx 10xxxxxx // 000080-0007FF 1110xxxx 10xxxxxx 10xxxxxx // 000800-00FFFF 11110zzz 10zzxxxx 10xxxxxx 10xxxxxx // 010000-10FFFF 0xxxxxxx ASCII와 동일한 범위. 맨 앞 바이트가 0으로 시작하면 한 바이트짜리 ASCII문자이다. 110xxxxx 10xxxxxx 첫 바이트는 110으로 시작하고, 10으로 시작하는 한 바이트가 따라온다. 1110xxxx 10xxxxxx 10..

    flutter - fvm 적용하기 (Futter Version Management)

    Flutter 2.0이 발표함에 따라서 2.0 프로젝트도 새로 테스트해보고 싶고.. 레거시 프로젝트의 경우 현버전을 유지시키고 싶어서 찾아보니 fvm이라는 패키지가 있어서 소개해드립니다. 윈도우즈 기준으로 작성하였고. 유닉스의 경우 해당 fvm 가이드 문서를 보고 진행하면 무리없이 진행 가능합니다. fvm 설치 $ flutter channel stable $ flutter upgrade # for flutter 2.0 $ flutter pub global activate fvm 환경변수 설정 fvm.bat와 pub.bat이 있는 경로를 path 환경변수에 추가해줍니다. 아래 커맨드를 ~/.bashrc 에 추가해주는 것도 방법입니다. $ export PATH=$PATH:C:/Users/frozenrain/..

    flutter - desktop app 빌드하는 방법.

    flutter의 경우 현재 iOS, Android 크로스 플랫폼으로 많이 사용하고 계실텐데요. 최근 커뮤니티를 보면 Flutter를 통한 Web App 개발도 활발한 것 같습니다. Web App 뿐만 아니라 Windows, Linux, macOS Desktop Application도 빌드 가능한데요. 아래 빌드하는 방법을 공유드리려고 합니다. 한 번 확인해보시고 Flutter의 미래를 미리 느껴보는 것도 하나의 재미일 듯 하네요. Web App 빌드 project 루트에서 아래 명령어를 사용하여 테스트가 가능합니다. $ flutter channel beta $ flutter upgrade $ flutter config --enable-web $ flutter packages pub global activ..

    Flutter - [dartdoc] API 자동 문서화

    안녕하세요? Flutter로 라이브러리를 개발할 때 코드상에 주석을 자동을 문서화하는 방법을 한 번 알아보겠습니다. doxygen과 비슷한 기능이라고 생각하시면 될 것 같습니다. 그럼 먼저 주석을 달아봅시다. / 3개로 주석을 메소드나 클래스 정의 위에 달게되면 dartdoc으로 자동으로 문서화할 수 있습니다. 아래 category의 경우 dartdoc_options.yaml을 통해서 정의할 수 있는데 반드시 설정해야 하는 부분은 아니기에 넘어가도록 하겠습니다. /// {@category Basics} /// {@category Assets, Images, and Icons} /// {@subCategory Information displays} /// {@image } class Icon extends..

    flutter에서 쉽게 다국어 처리 - 현지화하기 - localization

    인사말 flutter에서 다국어처리를 위해 flutter.dev에서 가이드하는 flutter_localizations를 사용하는데요. flutter_localizations의 단점으로 context가 없으면 다국어 처리가 힘든점과 다국어 처리시 코드길이가 길어지고 관리가 힘든 점이 있습니다. 그래서 찾아보니 easy_localization 패키지가 있어 사용해보려고합니다. 사용 방법 1. pubspec.yaml 에 easy_localization 추가합니다. 저는 csv파일을 이용할거기 때문에 easy_localization_loader 라이브러리도 추가할 것입니다. dependencies: easy_localization: ^2.3.3 easy_localization_loader: ^0.0.22. 인스..

    lefthook 설치하여 사용하는 방법 - Flutter 정적분석

    최근들어서는 jenkins, github나 gitlab에서 정적분석, 코딩스타일 체크하도록 구성하여 사용하고 있죠. push하고 스타일이 잘못됐네? 수정하고 push하고 CI에서 확인하는 것을 반복하는 것도 시간 낭비인 것 같습니다. push하기 전에 로컬에서 미리 체크하는 방법으로 git hook에 스크립트를 작성하여 사용하시는데요. 편리하게 사용할 수 있는 lefthook이라는 것이 있어 소개해드립니다. 설치방법 시스템에 따라 아래를 참고하여 설치합니다. go go get github.com/Arkweid/lefthook npm npm i @arkweid/lefthook --save-dev # or yarn: yarn add -D @arkweid/lefthook Rubygems gem install ..

    Flutter - NumberFormat - 숫자 세자리마다 콤마 넣기

    안녕하세요? intl라이브러리에 있는 NumberFormat을 이용하여 숫자 포맷을 자유자재로 변경해보려고 합니다. 포맷은 ICU 포맷팅 패턴을 따른다. 0 A single digit # A single digit, omitted if the value is zero . Decimal separator - Minus sign , Grouping separator E Separates mantissa and expontent +- Before an exponent, to say it should be prefixed with a plus sign. %- In prefix or suffix, multiply by 100 and show as percentage ‰ (\u2030) In prefix or su..

    여러 언어에서 순환참조 회피 방법

    안녕하세요? 여러 플랫폼에서 작업하다보면 순환참조를 회피해야하는 순간이 많이 발생되고 있는데요. 여기에서는 C++, Objective-C++, Java에서 회피하는 코드를 모아 놓으려고 합니다. iOS, Android, Windows 애플리케이션 개발시 참고하시면 좋을 것 같네요. 순환참조 두 값이 서로를 참조하는 상황으로 소멸이 제대로 안 이루어질 수 있어 순환참조를 하면 좋지 않습니다. 순환참조 회피방법 Child에 해당하는 Strong Reference Count를 올리지 않으면 회피할 수 있습니다. Weak Reference Conter를 올리도록 합니다. Parents에 해당하는 객체에서 Strong Reference Count를 올려 제어 합시다. Strong Reference Counting..

    Flutter - Plugin project :firebase_core_web not found

    이슈 안녕하세요? Flutter 최신버전(1.22.6)으로 업그레이드한 후 Android 빌드시 아래와 같은 워닝이 발생하고 있어요. 워닝 메시지와 같이 settings.gradle을 업데이트가 필요할 것 같아요. Plugin project :firebase_core_web not found. Please update settings.gradle. Plugin project :firebase_auth_web not found. Please update settings.gradle. Plugin project :cloud_firestore_web not found. Please update settings.gradle. 해결방법 먼저 android/app/build.gradle 에서 minSdkVersio..

    iOS - Fat Framework, Universal Library 만드는 방법

    빌드 속도 문제로 애플리케이션 빌드할 때마다 오픈소스들을 빌드하지 않고 Fat Framework를 만들어 prebuilt된 라이브러리를 사용하는 경우가 많다. Universal(multi-architecture) Library를 만들 때 자주 사용하는 lipo 명령어 사용법은 아래와 같다. iOS의 경우 시뮬레이터 아키텍쳐인 i386, x86_64가 포함되면 appstore에 upload되지 않아 strip되어야 하는데 strip시 아래 lipo -remove가 사용된다. 한 예로 오픈소스 icu를 빌드하고 universal Library 만드는 방법을 설명한다. 저장소 주소는 아래와 같다. https://github.com/unicode-org/icu/tree/master/icu4c icu를 여러 아키..

    Git - Fork 한 repository 최신으로 동기화하기

    안녕하세요? github에서 fork한 repository를 최신으로 동기화하는 방법을 살펴보도록 하겠습니다. 먼저 remote url 확인 $ git remote -v origin https://github.com/frozenrainyoo/settings (fetch) origin https://github.com/frozenrainyoo/settings (push) upstream 추가 fork한 부모 repository 주소를 remote에 등록합니다. $ git remote add upstream https://github.com/jglee1027/settings remote 다시 확인 $ git remote -v origin https://github.com/frozenrainyoo/settin..

    윈도우즈 Git Bash에서 tree 명령어 사용하는 방법

    안녕하세요? Git Bash를 사용하는데 Git Bash에서 tree 명령어를 사용하고 싶어서 알아봤습니다. Windows에서 tree 명령어 사용하는 방법. 먼저 tree Binaries Zip 파일을 다운받습니다. http://gnuwin32.sourceforge.net/packages/tree.htm C:\Program Files\Git\usr\bin 에 tree.exe 파일을 넣어준다. 다운로드 받은 tree-bin.zip을 압축풀고 bin폴더 안에 있는 tree.exe파일을 C:\Program Files\Git\usr\bin에 넣어줍니다. 테스트 $ tree -d . |-- blocs | `-- counter `-- repositories 3 directories macOS에서 tree 명령어 ..

    리눅스에서 모니터 해상도 작게 나오는 이슈

    리눅스에서 모니터 해상도가 작게 나오는 경우가 있어 강제로 해상도 설정하는 방법을 공유한다. $ xrandr Screen 0: minimum 320 x 200, current 1024 x 768, maximum 16384 x 16384 DisplayPort-0 disconnected (normal left inverted right x axis y axis) DVI-0 connected primary 1024x768+0+0 (normal left inverted right x axis y axis) 0mm x 0mm 1024x768 60.00* 800x600 60.32 56.25 848x480 60.00 640x480 59.94 1280x768_60.00 (0x4db) 79.500MHz -HSync +V..