안드로이드 스튜디오 자바 11 자바 1.8 오류

이미지
안드로이드 스튜디오에서 자바 11 자바 1.8 오류가 난다. 다음과 같은 화면이다. 이 오류는 Gradle 이 자바 11이 필요한데 현재 설정은 자바 1.8로 되어 있다는 이야기이다. 설정에서 자바 11로 변경하면 된다. 다음과 같이 변경 하였더니 오류없이 잘 된다.

KMM(Kotlin Multiplatform Mobile) 환경 구축 on 맥북(12.6 Monterey)

이미지
KMM 은 아직 알파이다. 베타도 아닌 플랫폼이 현장에 적용되고 있다고 해서 한번 구축해보았다. 나의 노트북 환경이다. 첫 번째로 공식 사이트에서 진행한다. https://kotlinlang.org/docs/multiplatform-mobile-getting-started.html 여기서 제공하는 도구가 있다. 맥북에서 설치하는 환경을 맞춰주는 도구이다. $ brew install kdoctor $ kdoctor 실행결과는 다음과 같다. 여기서 중요한게 버전을 맞추는 일이다. 나도 버전때문에 이틀 정도 체크가 뜨지 않았다. 안드로이드 스튜디오도 돌핀으로 올리고  엑스코드도 14.0.1로 올렸다. 결국 ruby 2.7 로 낮추고 겨우 환경 체크가 된거 같다. 루비와 코코아팟 설치에서 아주 애를 먹었다. 루비 버전을 2.7로 낮춰야 한다. 최신 버전에서 아직 지원이 되지 않는거 같다. 이렇게 아직 문제도 많은데 사용자가 점점 늘어나는거 같다.

fastapi 파이썬 모듈인데 쓸만하다.

운영하고 있는 서비스가 있습니다. 우분투 서버에 노드 코아로 API를 작성 했으며 AI 모듈을 위해 파이썬 3으로 진단모듈을 작성했어요. 안드로이드 및 아이폰에서 서비스를 요청하면 노드 코아가 받아서 내부 스크립트로 파이썬을 실행하여 그 결과를 문자열로 받아서 파싱 처리 하도록 구현 했는데 약 10초 정도 걸리더군요. 좀더 효율적인 방법이 없을까 고민하다 fastapi 를 알게 되었습니다. 파이썬으로 된 노드 코아와 같은 경량웹서비스용 모듈입니다. 서버 내부 스크립트가 필요 없어지더군요. 그냥 서비스 받아서 결과를 json 으로 내려주는 걸로 변환했더니 응답속도 5초로 줄었습니다. 파이썬 코드가 편하다면 이거 추천할만 하네요. 일단 파이썬이 파싱이나 json 그리고 멀티파트 폼 데이터 처리가 원활합니다.

구글 플레이 콘솔 지원되는 기기 0 표시 문제

이미지
안드로이드 앱의 카메라 기능을 수정하고 업데이트 했다. 보통 주말이면 더 많은 사용자가 유입이 되어야 하는데 되지 않는다. 추적해보니 구글 플레이 콘솔의 지원되는 기기가 0으로 되어 있다. 소스를 추적해보니 camera2 를 사용하면서 설정을 잘못한 것이다. 여기서 required 값을 true 를 줬던 것이다. 바꾸고 다시 컴파일하고 업로드 파일을 만들어서 구글 플레이 콘솔에 올리니 아래와 같이 나온다. 그냥 이전에 기기목록이 나왔을텐데 생각없이 봤나보다. 이번에 지원되는 기기로 추가가 되었다. 이제 심사를 기다려야 한다.

몽고디비 _id 값을 서버에서 내려주면 아이폰과 안드로이드에서 Date 변환하는 방법

보통 서버에서 서비스를 만들때 몽고디비를 많이 사용합니다. 이때 _id 는 날짜와 시간을 기반으로 생성됩니다. ObjectId("62b47ff00000000000000000") 몽고디비 쉘에서는 getTimestamp() 로 날짜와 시간을 가져올 수 있습니다. 서비스에서 ObjectId 방식으로 데이터를 내리고 모바일(아이폰 및 안드로이드)에서 날짜를 변환해서 사용하는 방법을 소개하고자 합니다. 먼저 아이폰에서 사용할 스위프트용 함수입니다. func ObjectIdToDate(id: String) -> Date {   var resultDate = Date()   let endIdx: String.Index = id.index(id.startIndex, offsetBy: 7)   let hex = id[id.startIndex...endIdx]   if let offset = UInt32(hex, radix: 16) {     resultDate = Date(timeIntervalSince1970: TimeInterval(offset))   }   return resultDate } 안드로이드에서 사용할 자바 메소드입니다. public Date ObjectIdToDate(String id) {   String hex = id.substring(0, 8);   Long x = Long.parseLong(hex, 16) * 1000;   return new Date(x); } 이런식으로 공통 함수를 만들어 사용하면 편합니다.

하나의 서버에서 노드 코아 서비스 여러개 돌리는 방법

현재 서버를 하나 운영중입니다. 여기에 노드 코아로 만든 서비스를 돌리고자 합니다. 이 서비스를 안정적으로 돌리자고 하면 여러개를 올려야 합니다. 난 이 방법으로 해결했습니다. 먼저 Haproxy 를 설치합니다. 같은 동작을 하는 노드 서비스를 포트만 다르게 작성합니다. 전 보통 3개를 작성합니다. A - 7001 번 포트로 서비스 합니다. B - 7002 번 포트로 서비스 합니다. C - 7003 번 포트로 서비스 합니다. 만약 A 가 죽으면 B와 C 에서 부하분산되어 서비스 됩니다. 이는 Haproxy 에서 역할을 해줍니다. 참고로 이방법으로 집에서 작은 서비스 돌리고 있습니다. 10여년 전에 50만원 주고 산 일체형 컴퓨터에 우분투 서버를 올리고 여기에 개인 프로젝트로 운영중인 서비스 약 2~30개가 돌아갑니다. 아주 저렴하게 운영되고 있습니다. 매우 안정적입니다. 시간이 허락되면 이 서버의 구성에 대해 이야기 하도록 하겠습니다.

아이폰 그리고 안드로이드 화면 동일성 추구 개발에 관하여...

이미지
 아이폰과 안드로이드를 각각 네이티브로 개발을 해온지 세월이 꽤나 흘렀다. 항상 화면의 동일성을 추구하였다. 이왕이면 같은 화면을 보여줘야 사용자가 편할꺼란 생각이었다. 그러다 보니 몇가지 원칙이 생겼다. 일단 화면을 보자. 안드로이드 화면이다. 아이폰 화면이다. 각 화면의 가운데에 뷰를 만들고 거기에 제목 문자열 그리고 그 밑에 프로그레스바를 추가하였다. 안드로이드의 액티비티는 엑스코드의 뷰컨트롤러가 된다. 안드로이드의 프레임레이아웃은 엑스코드의 뷰가 된다. 기본으로 이런 구조를 맞추고 나머지 세세한 부분을 맞추면 된다. 엑스코드에서 크기는 뷰는 전체 뷰와 크기를 동일하도록 컨스트럭트를 추가한 후 거기 비율을 조정한다. 안드로에드에서 크기는 프레임 레이아웃의 크기를 0dp 로 설정한 다음 웨이트를 주어서 조정하면 둘의 크기는 같아진다. 안드로이드에서 리니어와 프레임만 사용해서 구현하면 엑스코드의 뷰를 사용한 것과 동일한 화면을 맞출 수 있다. 각 특성별로만 있는 객체는 가급적 사용하지 않는것이 좋다. 대부분의 화면은 라벨, 버튼, 프로그레스, 이미지 등이면 충분하다. 사실 사용자는 이게 아이폰인지 안드로이드인지 상관하지 않는다. 기능에 충실한 앱을 만드는 것이 기술자이지 않을까 싶다.