본문 바로가기
반응형

기술적인 이야기/기타 개발32

Flutter 앱 빌드 때 만난 Unsupported class file major version 어쩌구 저쩌구 에러 오랜만에 Flutter 앱 프로젝트를 새로 빌드할 일이 생겨서 빌드 명령을 입력했는데 전에 보지 못하던 에러가 발생했다. 아래와 같은 오류다. * What went wrong: Could not open settings generic class cache for settings file '/Users/seorenn/developments/myproject/android/settings.gradle' (/Users/seorenn/.gradle/caches/7.2/scripts/foobarsomeidentifier). > BUG! exception in phase 'semantic analysis' in source unit '_BuildScript_' Unsupported class file major v.. 2024. 3. 15.
macOS 터미널에서 안드로이드 에뮬레이터 실행시키기 일반적인 안드로이드 앱 개발자들이야 Android Studio를 쓸 테고 거기서 에뮬레이터를 띄우면 되니 무의미한 주제의 글일 수도 있겠지만, 그게 아니라 Flutter 등 다른 기반으로 안드로이드를 지원하는 경우라면 굳이 무거운 Android Studio를 띄우지 않고 에뮬레이터를 띄우길 원할 수도 있다. 그래서 이번 글의 주제는 터미널에서 셸 커맨드로 안드로이드 에뮬레이터를 띄우는 방법에 관한 것이다. 준비 작업 만약 Android Studio를 막 설치한 상태라면 에뮬레이터를 설치하고 AVD(Android Virtual Device)를 생성해야 한다. 당연하게도 이미 설치되어 있고 AVD도 생성된 상태라면 건너뛰고 바로 다음 항목으로 넘어가도 된다. 우선 에뮬레이터를 설치해 보자. Android S.. 2024. 3. 13.
또다시 나타난 libarclite_iphoneos.a 오류 (Flutter) 회사 업무용 Flutter 프로젝트를 오랜만에 빌드했더니 지난번에 글을 썼던 적이 있었던 libarclite_iphoneos.a 문제가 또다시 나타났다. 대충 축약해서 아래와 같은 동일한 오류다. Error (Xcode): File not found: /Applications/Xcode.app/Contents/ ... /lib/arc/libarclite_iphoneos.a 다시 나타난 이유야 명백하다. Xcode 버전이 업그레이드되는 바람에 이전에 풀어놨던 파일들이 다 사라져 버렸기 때문이다. 그렇다면 원천적으로 이 문제를 해결하지 못하는 한 Xcode가 업그레이드될 때마다 이 문제를 계속 마주치게 될 것이 분명해 보인다. 상당히 귀찮다. 원천적으로 해결할 방법이 없는 것일까? 그나마 최근에는 정보가 생.. 2023. 6. 14.
Flutter 앱 빌드 시 libarclite_iphoneos.a 및 아카이브 실패 문제 회사 Flutter 앱 프로젝트를 iOS 용으로 빌드하던 도중 문제가 발생했다. 이 글 주제의 시작은 아래 오류 메시지로부터 출발한다. Error (Xcode): File not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a 빌드하는데 필요한 libarclite_iphoneos.a 파일이 없다는 오류다. Xcode 14.3으로 올린 이후에 이런 문제를 겪었기 때문에 아마도 이 버전의 Xcode 문제라고 생각된다. 위 메시지를 통해 두 가지 문제가 나왔고 이 두 가지 문제 해결의 과정을 정리해 보자. 명확한 해답이라고 하기엔 아직 지식이 부.. 2023. 4. 23.
Flutter에서 Debug 혹은 Release 모드 판단하기 Flutter에서 Debug 모드로 실행 중인지 아니면 Release 모드로 실행 중인지 파악하기 위해서는 우선 foundation 모듈이 필요하다. import 'package:flutter/foundation.dart'; 이후 kReleaseMode 혹은 kDebugMode 심볼을 이용할 수 있으니 용도에 맞게 사용하면 된다. if (kReleaseMode) { // 릴리즈 모드에서 할 일 ... } else if (kDebugMode) { // 디버그 모드에서 할 일 ... } 엄청나게 단순한 내용이지만 개인적인 기억력의 한계로 메모를 남긴다. 2022. 4. 24.
Flutter의 Widget에서 앱 활성화 여부 파악하기 앱이 활성화될 때, 즉 백그라운드 상태에서 포그라운드 상태로 앱이 다시 올라왔을 때 위젯이 이 상태를 직접 파악하는 방법은 기존적으로 제공되지 않습니다. 앱 단위에선 onResume이나 onPause가 제공되는 것과는 다르게 말이죠. 제 경우 iOS 앱에서 백그라운드 태스크 앱이 백그라운드 상태에서 동작하다 포그라운드로 활성화될 때 UI 갱신이 누락되는 현상이 있어서 앱 활성화 여부를 알아낼 수 있어야 했습니다. 이와 관련해 정보를 찾아보던 도중 다행히도 제가 원하는 기능을 제공하는 Widget Bindings Observer라는 것을 발견할 수 있었습니다. 아래 예제는 특정 StatefulWidget에서 WidgetBindingsObserver를 사용해 앱의 상태 변화를 추적하는 코드를 구현한 예제입니.. 2020. 11. 13.
Rust의 Generics 맛보기 제네릭(Generics)은 많은 언어에서 지원하는 다형 타입 지원 기능입니다. 동일한 기능을 여러 타입으로 사용하려는 경우 각 타입 별로 비슷한 코드를 중복해서 코딩해야 할 수도 있는데, 제네릭은 타입과 코드를 분리시켜서 하나의 코드로 다양한 타입을 사용해서 동작시킬 수 있게 만들어 주기 때문에 매우 효율적인 코딩이 가능합니다. 러스트(Rust)도 이런 제네릭을 지원합니다. 이 글에서는 러스트의 제네릭 기능을 살짝 살펴보며 깊게는 안 들어가고 간단히 맛만 보고자 합니다. 벡터 구경 제네릭은 여러 코드에 구현되어 있는데 그중 가장 가깝게(?) 찾아볼 수 있는 예제는 아마도 벡터(Vector) 일 것 같습니다. 다른 언어에는 리스트나 배열이라고 부를만한 그 자료구조지요. 벡터는 구조체로 구현된 자료구조이지만.. 2020. 11. 1.
Rust로 객체지향 프로그래밍 흉내내기 러스트(Rust)는 객체 지향 프로그래밍(OOP - Object Oriented Programming) 언어가 아닙니다. 애초에 클래스(class) 문법 조차 없고 따라서 상속(inheritance) 개념도 없습니다. 그저 구조체에 메서드를 구현할 수 있을 뿐입니다. OOP에서 정말 중요한 개념이 없는데 과연 러스트는 OOP 패러다임으로 코딩하는 것이 가능할지를 그냥 맛만 봅시다. 트레잇(trait) 러스트에는 트레잇(trait)이라는 개념이 있습니다. 이 기능은 인터페이스를 설계하는 기능입니다. 이를 이용해 특정 타입에 인터페이스에 맞는 메서드를 구현하도록 강제하기 위해서 사용할 수 있습니다. 이런 면에서 비교하자면 스위프트(Swift)의 프로토콜(Protocols)과 상당히 닮아 있습니다. 다짜고짜 .. 2020. 10. 26.
Flutter에서 애플 앱스토어 업로드 시 최소 버전 표기 문제 Flutter를 업그레이드한 이후인지, 아니면 Xcode 12로 업그레이드 이후인지는 명확하지 않지만, 어느 날 fastlane 연동으로 앱스토어 업로드를 진행하는 도중에 아래와 같은 오류 메시지를 만났습니다. ERROR ITMS-90208: "Invalid Bundle. The bundle Runner.app/Frameworks/App.framework does not support the minimum OS Version specified in the Info.plist." 이 문제를 해결해봅시다. 약간 삽질을 하긴 했지만 이 문제의 해결은 생각보다 간단했습니다. 프로젝트와 타겟 그리고 앱 프레임워크의 최소 요구 버전(MinimumOSVersion)을 동일하게 맞춰주니 해결되었습니다. 우선 Xcode.. 2020. 10. 13.
Python Exceptions 간략 정리 이 글은 파이썬(Python)의 예외 처리(Exception Handling)를 간단히 정리합니다. 개인적인 용도로 메모했던 내용을 글로 작성하는 거라 원하시는 내용이 없을 수도 있다는 점 양해 부탁드립니다. 문법은 3.x 기준이며 2.x에서는 약간의 수정이 필요할 수 있습니다만 웬만하면 3.x 쓰세요. 예외(Exceptions)가 뭐냐고요? 뭐 그냥 에러 혹은 오류라고 치죠. 성공이 아닌 나머지 모든 명확한 경우를 예외사항으로 취급할 수 있습니다. 예외 처리하기 파이썬의 예외 처리 방식은 try 블록 내에서만 가능합니다. 여기 안에 예외가 발생할지도 모를 코드를 실행시키고 여기서 예외가 발생하면 여기에 연결된 except 블록에서 해당 예외를 처리할 수 있습니다. try: do_what() except.. 2020. 10. 9.
Python 3.9 변경사항 간단 정리 파이썬(Python) 3.9 버전이 공식 릴리즈 되었기에 이에 관해 간단히 살펴보는 글입니다. 다만 이 글은 문법적으로 변경되는 사항만 정리합니다. 파서가 바뀌는 등의 변화는 저 같은 사람에겐 체감이 잘 안 되기도 하니깐요. 사전형 합치기 및 수정 연산자 추가 사전형(dict)끼리 합치기를 지원하는 | 오퍼레이터가 추가되었습니다. >>> {'a': 1, 'b': 2} | {'c': 3, 'd': 4} {'a': 1, 'b': 2, 'c': 3, 'd': 4} 합쳐질 때 중복되는 키는 업데이트 되는 형태 같습니다. 따라서 아래와 같이 |= 오퍼레이터를 이용해 사전형의 값을 업데이트 할 수도 있습니다. >>> d = {'a': 111, 'b': 2} >>> d |= {'a': 1, 'c': 3} >>> d .. 2020. 10. 6.
러스트의 열거형(Enums) 살펴보기 열거형은 일반적으로 상태(state)를 정의하기 위한 타입입니다. 하나의 타입에 여러 선택 가능한 값을 정의해두고 이 값들 중 하나를 선택할 수 있게 하기 위한 특수한 타입이지요. 러스트(Rust)도 열거형 타입을 지원하며 그 목적도 비슷합니다. 다만 각 값에 별도로 가질 수 있는 독립된 추가 값을 정의할 수 있다는 점이 독특한데 스위프트(Swift)의 열거형과도 비슷한 느낌을 받았습니다. 열거형(Enums) 러스트의 열거형은 아래와 같은 형식으로 정의할 수 있습니다. enum Gender { Male, Female, Other, } 위 코드는 세 가지 값 즉 Male, Female, Other라는 세 가지 값 중 하나를 가질 수 있는 Gender라는 타입을 정의하는 예제입니다. 다른 언어에 비해 약간 .. 2020. 10. 4.
flutter: 당신의 Xcode는 너무 구버전이예요! 이 글은 팁이라기보다는 그저 로그에 가깝습니다. 어느 날 flutter run 커맨드로 개발 중인 프로젝트를 실행시켜 보다 아래와 같은 메시지를 보게 되었습니다. Your Xcode version may be too old for your iOS version. 네. 바로 제목의 그 내용이지요. 스크린샷으로 보면 빨갛게 아주 기분 나쁜(?) 뭔가 해결해야 할 문제로 보입니다. 그런데 문제는 이 메시지의 내용이었습니다. 왜냐하면 제가 당시 사용하던 Xcode는 12 버전으로 정식 릴리즈 된 지 하루 정도 지난, 당시 가장 최신 버전이었기 때문이었죠. 구글은 검색엔진 빼고는 뭔가 나사가 빠진 것 같다는 느낌을 종종 받는데 flutter도 비슷한 느낌을 자주 받습니다. 물론 사람이 만드는 거니 실수는 없을 수.. 2020. 9. 18.
러스트의 가변성(Mutability) 이야기 가변성(Mutability)과 불변성(Immutability)은 현대적인 언어에서는 제법 잘 다뤄지는 주제일지도 모릅니다. 그도 그럴게 코드의 구조나 성능이나 메모리 효율성이나 관리 등 다양한 면에서 영향을 끼치기 때문이니깐요. 러스트(Rust)도 비슷한 이야기를 할 거리가 있네요. 사실 이 이야기는 초반에 변수나 타입과 관련된 이야기와 함께 등장했었어야 하는 게 아닐까 할 정도로 기초적인 내용일지도 모릅니다. 불변 변수(Immutable Variables)와 가변 변수(Mutable Variables) 불변 변수는 생성될 때 받은 초기값을 변경할 수 없는 변수를 의미합니다. 이미 앞선 글들에서도 언급했지만 러스트의 변수는 기본적으로 불변성을 가집니다. let age = 16; age = 17; // E.. 2020. 9. 4.
러스트의 미래는 어떻게 될까? 최근 모질라(Mozilla) 재단과 관련된 암울한 소식이 나오고 있지요. 정확하게 재단이 아닌 회사(Mozilla Corporation)의 이야기지만 수익 문제로 운영이 힘들어지고 있어서 모질라의 많은 인력이 해고되고 있습니다. 모질라 파이어폭스의 핵심인 Servo 엔진 개발팀 또한 마찬가지로 운명이 암울합니다. 러스트(Rust)도 2010년 모질라의 연구 프로젝트로 시작한 언어인 만큼 모질라 재단의 상황에 영향을 받을 수밖에 없습니다. 그래서 러스트를 사랑하는 많은 사람들의 걱정 또한 끊이질 않고 있습니다. 그래서 러스트는 어떻게 될까요? 러스트는 이제 모질라에서 벗어나 별도의 재단으로 독립할 예정입니다. https://blog.rust-lang.org/2020/08/18/laying-the-found.. 2020. 8. 19.
러스트의 구조체 살펴보기 러스트(Rust)는 다양한 타입을 제공합니다. 원시 타입의 종류도 많지요. 그리고 튜플과 같이 다양한 타입을 묶을 수 있는 그룹형 타입도 있습니다. 그렇다면 러스트의 복잡한 자료구조는 튜플만 쓰면 되는 것일까요? 물론 아니니까 이런 글을 쓰고 있는 것이겠지요. C의 구조체(Structs)와 비슷하게 러스트도 구조체라 불리는 특수한 복합 타입을 정의하는 기능을 가지고 있습니다. 현대적인 OOP 언어의 클래스(class)와도 비슷하다고도 볼 수 있겠지만 물론 다른 겁니다. 러스트에서 구조체는 세 가지 의미가 있습니다. 하나는 C의 구조체와 비슷한 것, 다른 하나는 튜플 구조체, 다른 하나는 단위로만 쓰는 구조체의 세 가지입니다. 여기서 아무래도 제일 중요한 것은 처음의 C의 구조체와 비슷한 것이겠지요. 일반.. 2020. 8. 19.
728x90
반응형