Android
![[Kotlin] Scope Function 범위 지정 함수<img src=](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcH2yb1%2FbtsBHRkUhh9%2FsN7qkopuwvHOROKM2EhLfK%2Fimg.png)
[Kotlin] Scope Function 범위 지정 함수
들어가며 처음 코틀린을 공부했을 때, 스코프 함수를 만나고 이것이 코틀린 진입장벽 중 하나라고 생각했다. 생전 처음 보는 키워드에다 (본인은 자바를 사용하고 있었다.) 어디에 뭘 써야하는지 도무지 감이 오지 않았기 때문이었다. 스코프함수에 대해 공부를 했지만 시간이 흐른 뒤에야 고백하자면 100% 이해하고 사용한 것이 아니었다. 요즘같이 기본을 탄탄하게 다져야겠다는 생각이 드는 바로 지금, 코틀린의 스코프 함수를 다시 알아보기로 한다. Scope Function (이하 스코프 함수) The Kotlin standard library contains several functions whose sole purpose is to execute a block of code within the context of..

GPS 보정하기 - 03
지난이야기 GPS 보정하기 - 02 들어가며 GPS 보정하기 - 01 사실 이 알고리즘은 이전 프로젝트에서 개발 되었던 것인데, GPS 정확도 개선을 위한 좌충우돌 얼레벌레 MapMatching 구현기들어가며 정말 오랜만에 글을 쓰는 것 같다. 못 www.pinslog.com 지난 글에서는 알고리즘의 문제점들을 개선하는 과정을 작성했다. 이번 글에서는 경로이탈에 관해서 작성해보려고 한다. 경로이탈 개인적으로 나는...내비게이션의 꽃은 경로이탈이라고 생각한다...(부들 사용자들은 자유의지를 가지고 있기 때문에 절대로 안내된 경로대로 가지 않는다. 난 그걸 내 눈으로 똑똑히 보았다. 그래서 경로이탈이 감지되면 사용자의 현재 위치를 바탕으로 목적지까지의 길을 재탐색하여 다른 경로를 제공해야한다. 그런데 보정 ..

GPS 보정하기 - 02
들어가며 GPS 보정하기 - 01 사실 이 알고리즘은 이전 프로젝트에서 개발 되었던 것인데, GPS 정확도 개선을 위한 좌충우돌 얼레벌레 MapMatching 구현기들어가며 정말 오랜만에 글을 쓰는 것 같다. 못해도 한달에 한개는 작성 www.pinslog.com 먼저 작성한 알고리즘에 문제가 있었다고 했다. 이를 해결하기 위해 어떤 것들을 수정 또는 추가 하였는지 간략하게 작성해보려고 한다. 0. 데이터 형식 변경 (보정 대상) 이전 프로젝트는 경로가 노드 정보로만 이루어져 있었다. 그래서 노드들을 이으면 링크가 되었기 때문에 노드를 이은 리스트가 매칭 대상이 되었는데, 이번 프로젝트 같은 경우 같은 경로 안내이지만 노드와 링크 정보가 모두 존재하였다. 따라서, 링크 정보를 받아 보정 대상을 생성해주었..
![[Android] 외부저장소에 파일 저장하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1hBAu%2FbtsAjQVotKi%2FEC5szCt1SCY6h1UbPTBR40%2Fimg.png)
[Android] 외부저장소에 파일 저장하기
안드로이드 파일 시스템에는 크게 내부저장소, 외부저장소가 존재한다. 앱 디버깅이나 기타 다른 목적을 위해 앱 경로에 파일을 저장하곤 했는데 이것이 내부저장소이다. 디바이스 파일 탐색기에서 찾을 수 없고 특별히 권한을 요청하지 않아도 된다. 그러나 나의 경우에는 디바이스 파일 탐색기에 저장되고, 불러오기를 원했다. 내부저장소에 저장할 경우 앱 재설치하는 경우 데이터가 다 날아가버리기 때문이다. 따라서, 외부저장소는 다른 곳에서도 접근이 가능한 곳을 의미한다. 파일 탐색기를 열어보면 나오는 파일들...이라고 하면 이해가 편할까 외부저장소의 경우 WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE 권한을 부여 받아야 한다. 파일 저장하기 디바이스 파일 - 문서 경로에 파일을 저장..

GPS 보정하기 - 01
사실 이 알고리즘은 이전 프로젝트에서 개발 되었던 것인데, GPS 정확도 개선을 위한 좌충우돌 얼레벌레 MapMatching 구현기들어가며 정말 오랜만에 글을 쓰는 것 같다. 못해도 한달에 한개는 작성하자고 마음먹었었는데 시간이 어느새... 이번에 GPS 관련하여 검토한 것이 있어 기록해두기로 했다. GPS는 그냥 WW(내 사이www.pinslog.com그 프로젝트는 사용자의 정확한 위치를 필요로 했었다. 그런데 부정확한 GPS 때문에 난항을 겪다가 해결 방안 중 하나인 맵 매칭 알고리즘을 검토하게 되었고 이를 프로젝트 성격과 환경에 맞게 수정한 것이었다. 나는 이를 매칭 알고리즘이라고 명명했었는데 알면 알수록 맵 매칭이라고 보기는 좀 그렇고.... GPS 보정 알고리즘(이하 '보정 알고리즘') 정도로...

GPS 보정하기 - 프롤로그
한동안 성의없는 포스팅을 일삼게 만들었던 1등 공신 알고리즘 완성된건 아니지만 얼추 마무리가 되었다. (정말? 약 3주 동안 정말 마음고생을 심하게 했고 진짜 진지하게 진로에 대한 고민까지 하게 되었는데.. 도대체 뭐길래 이렇게 우는 소리를 하는거냐면 위치기반 서비스를 제공할 때 빠질 수 없는 GPS (Global Positioning System)를 다들 알고 있을텐데 이 녀석은 제법 정확하지만 또 반대로 제법 부정확하다.위 사진에서 빨간 구간이 실제 우리가 지나갔던 곳이라고 할 때 초록 구간은 GPS가 찍힌 구간이다. 지도 상으로 봤을 때 도로 반대편에 찍힌 것을 알 수 있다. 대략적인 위치를 가지고 서비스를 해야하는 경우라면 이는 문제가 되지 않는다. (WW 같은 날씨 어플의 경우가 그 예시가 되겠..
![[Android] Android FCM 설정](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvK0hs%2FbtsycsbvXls%2FHJii40iM2UOaeCDnBZpWK1%2Fimg.png)
[Android] Android FCM 설정
Firebase Cloud Messaging 메시지를 안정적으로 무료 전송할 수 있는 크로스 플랫폼 메시징 솔루션 기본 원리 Firebase용 Cloud Functions 또는 앱 서버와 같이 메시지를 작성, 타겟팅, 전송할 수 있는 신뢰할 수 있는 환경 메시지 요청을 수락하는 등 여러 기능을 수행하는 FCM 백엔드는 주제를 통해 메시지 팬아웃을 수행하고 메시지 ID와 같은 메시지 메타데이터를 생성 기기로 타겟팅된 메시지를 라우팅하고, 메시지 전송을 처리하고, 필요한 경우 플랫폼별 구성을 적용 알림이 표시되거나 앱의 포그라운드/백그라운드 상태 및 관련 애플리케이션 로직에 따라 메시지가 처리 수명 주기 흐름 FCM에서 메시지를 수신하도록 기기 등록 클라이언트 앱의 인스턴스가 메시지를 수신하도록 등록하여 앱..
![[Android] Jetpack Compose 프로젝트 생성 + MainActivity 살펴보기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctoQMq%2Fbtsxtn9qKWK%2FVmU9SHXbm3ZNU7rhLa8er1%2Fimg.png)
[Android] Jetpack Compose 프로젝트 생성 + MainActivity 살펴보기
기존 프로젝트와의 차이 build.gradle (:app) android { ... buildFeatures { compose true } } 폴더 구조 앱을 만들기 위한 리소스 (컬러, 테마 등) 가 res/values 가 아니라 패키지/ui 에 존재한다. 리소스에 접근하기 위해 xml에 접근하는 것이 아니라 kotlin 코드로 리소스를 생성하고, 접근할 수 있음을 의미한다. MainActivity xml 방식 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_m..
![[Android] Thread와 Coroutine](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmorYP%2FbtswcHWx7Nl%2FtDaUcqCrrE1eUOKKj3wWeK%2Fimg.png)
[Android] Thread와 Coroutine
val list = mutableListOf("포도", "메론", "딸기", "사과", "바나나") CoroutineScope(Dispatchers.Main).launch { list.forEach { item -> if (item == "딸기") { list.remove(item) Log.d(TAG, "1. ${list}") } } } CoroutineScope(Dispatchers.IO).launch { list.forEach { item -> if (item == "바나나") { list.remove(item) list.add("자두") Log.d(TAG, "2. ${list}") } } } /* 2023-04-03 21:19:20.540 2. [포도, 메론, 딸기, 사과, 자두] 2023-04-0..
![[Android] 커스텀뷰 만들기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqeMJE%2FbtswbEr3wGU%2Ft67UBB96Twa9Q1x07IGSL0%2Fimg.png)
[Android] 커스텀뷰 만들기
커스텀뷰 xml (view)에서의 모듈화는 CustomView로 해결이 가능하다. 이렇게 생긴 버튼이 있다. 이런 화면을 만들어야 한다고 할때, 저 버튼 네개를 복붙해서 만들면 되겠지? 라고 생각할 수 있다. 그렇지만 만약 어떤 수정사항이 생긴다면? 네번 수정을 해주어야 한다. 그러다 보면 그 과정에서 생기는 오류나 실수는 아주 자연스러운 수순이 된다. (경험담 이를 방지하고자 style을 사용했지만..좀 더 쌈빡한 방법은 없을까? 라고 생각이 되어질 때 쯤에서야 CustomView를 알게 되었다…….늦었다고 생각할 때가 가장 빠른 법 얼른 알아보자. 만들기 1. xml 작업하기 생성할 커스텀 뷰의 xml 작업을 먼저 진행해준다. 나의 경우 앞에 아이콘이 붙은 버튼을 하나 만들었다. 이제 여기서 아이콘과..
![[Android] Jetpack Compose? true!](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGXn6P%2Fbtsv8bwXK2P%2F2FPvPABDeIG3gPH0Ziek9K%2Fimg.png)
[Android] Jetpack Compose? true!
컴포즈를 향한 나의 끝없는 구애(?)는 작년부터 계속 되었다. 비록 실무에서는 아직 적용해볼 기회가 없었지만... 틈날때마다 씹고 뜯고 맛보려고 노력했다는 얘기다. 그 흔적들을 하나씩 기록해보려고 하는데, 첫번째는 지난해 진행했던 집단지성의 방의 첫번째 컨퍼런스인 '집단지성의 날' 에서 발표했던 Jetpack Compose 의 자료이다. 집단지성의 날에 관한 건 아래를 참고하면 된다. 집단지성의 방 : 컨퍼런스 개최한 후기 안녕하세요. 핀수입니다. (이런 인사 해보고 싶었어요.) 오늘은 지난 9월 1일 개최된 컨퍼런스인 집단지성의 날의 후기를 들고 왔습니다. 처음 듣는 컨퍼런스라고요? 당연함. 저희가 만들었음 그 www.pinslog.com 그리고 첫번째로 Jetpack Compose를 살펴보았던 겉핥기..
![[Android] Hilt와 Room](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk5g8n%2FbtswbydnJ0a%2FG8JYPGz5TgHoaplCRzqlK0%2Fimg.png)
[Android] Hilt와 Room
의존성 주입도구인 Hilt를 사용중이었기 때문에 Room 또한 Hilt를 통해 생성하고 사용할 수 있도록 셋팅하는 시간을 가져보았다. Hilt에 관한 자세한 것은 아래 링크를 참고하면 된다. [Android] Hilt 적용해보기 들어가며 DI (Dependecy Injection)에 대해서는 어느정도 들어보거나 또는 알 것이라고 생각한다. 한번 더 짚고 넘어가자면 의존 관계에 있는 클래스의 객체를 외부로부터 생성하여 주입받는 것을 의 www.pinslog.com Hilt를 통해 Database 생성 @InstallIn(SingletonComponent::class) @Module class DatabaseModule { @Provides @Singleton fun provideAppDatabase(@Ap..