기본 콘텐츠로 건너뛰기

1월, 2024의 게시물 표시

AI와 함께 춤을... (1) - OpenClaw 체험기, 결국 돌아온 Claude

최근 OpenClaw 라는 AI 툴이 등장해 인기를 끌고 있다. 나도 혹시 쓸모가 있을까 싶어 급히 Mac Mini를 주문하고 이 유행에 동참해 보았다. 사실 나중에 알고 보니 Mac에서만 동작한다는 건 이미 업데이트된 정보였는데, 역시 사람은 공부를 해야 한다. 😅 설치는 쉬웠지만, 설정은 만만치 않았다 OpenClaw 설치 자체는 어렵지 않았다. 문제는 설정 과정이었다. OpenClaw가 사용할 LLM 서비스 API Key 가 필요했고, 인터넷 검색을 시키려면 Brave API 도 필요했다. 처음에는 내가 이미 구독 중인 Claude MAX 요금제를 그대로 활용하려 했다. 그런데 Anthropic 측에서 이를 약관 위반으로 판단해 막아둔 상태였고, 내가 시도하던 시점에는 사용이 불가능했다. 그래서 차선책으로 Gemini 무료 티어 를 기본 LLM으로 설정했다. 그런데 작업 하나를 요청했을 뿐인데 바로 API 사용량 초과가 떴다. 내가 사용하기 얼마 전에 분당 사용량 제한 정책이 도입된 모양이었다. 어쩔 수 없이 Gemini를 유료로 전환하고, 가장 저렴한 모델을 적용했다. 원격에서 작업을 지시하기 위해 텔레그램 봇 까지 설정을 마쳤다. 잠깐씩 틈틈이 하다 보니 여기까지 오는 데만 며칠이 걸렸다. 그때 그 시절, 리눅스를 설치하던 밤 여기까지 하고 나니 문득 옛 기억이 떠올랐다. 1990년대 말에서 2000년대 초, 리눅스 배포판이 막 알려지던 시절이었다. 어렵게 배포판을 구해서 밤새 설치하고 설정을 마치면… "이제 뭘 해야 하지?" 하며 컴퓨터 전원을 끄던 그때 말이다. OpenClaw 설정을 끝낸 지금, 딱 그 느낌이었다. OpenClaw + Claude Code, 합체를 시도하다 이 녀석을 무엇에 쓸까 고민하다가, OpenClaw에서 Gemini 대신 Claude Code 에게 실제 작업을 맡기는 구조를 시도해 보기로 했다. 구상은 이랬다. 내가 "제미나이에 대해서 검색...

[flutter] deep link

 개발하고 있는 앱에서 다른 사용자를 앱으로 초대하는 기능을 추가하게 되어 앱에 deep link 기능을 앱에 구현하게 되었습니다. 구현에 필요한 자료는 이미 더 잘 정리되어 있는 많은 자료들이 있으니 그것들을 참고하면 될 것 같아서 여기에서는 특별히 설명하지 않습니다. 다만 내 앱에 해당 기능을 넣기 위해서 자료를 찾고 구현하는 과정에서 헷갈렸던 것들과 구현중 문제가 있었던 부분에 대해서 프로젝트를 정리하는 차원에서 메모를 남기기로 해서 글을 쓰고 있습니다. 참고:  - https://itnext.io/deep-linking-in-flutter-boost-user-experience-in-apps-29dd25842757  - https://docs.flutter.dev/ui/navigation/deep-linking 용어 deep link는 보통 웹에서 인덱스 페이지가 아닌 상세 페이지에 대한 다이렉트 링크를 생성하는 것을 말합니다. 예를 들어서 어떤 웹페이지를 사용하기 위해서는 홈 화면에서 로그인을 하고 몇 단계를 거쳐서 특정 페이지로 들어가야하는데, 이 기능에 대한 지름길을 만드는걸 deep link로 이해하면 되겠습니다. 그리고 deep link 구현관련하여 모바일에서는 OS에 따라서 custom scheme(url scheme), universal link, app link 등의 용어가 튀어 나오는데, 표준 URI 형식을 이용하여 앱을 실행시키기 위한 방법을 말한다고 이해하면 간단하겠다. 기술에 대한 상세로 들어가면 약간의 차이가 있으나 큰 틀에서 차이는 없기 때문에 deep link를 구현하기 위해서 app을 실행(lunch)하기 위한 기술이라고 보면 됩니다. 그리고, 검색하다가 보면 dynamic link라는 용어가 나오는데, firebase에서 제공하던 서비스인데 현재는 서비스 종료되었으니 무시하면 됩니다. Navigator / Router flutter로 deep link를 구현할 때 현재 앱이 Navigator를 이용...

[flutter] textScaleFactor

노안이 있는 사람이나 시각 장애가 있는 사람들은 모바일 환경의 기본 글자 크기에 불편함을 느끼는 사용자들을 위해서 iOS와 안드로이드에서는 접근성 설정을 통해서 글자 크기를 크게 또는 작게 설정할 수 있도록 지원하고 있습니다. 그리고, 앱 개발시에도 이를 고려하여 개발하라고 가이드하고 있습니다. 그렇지만 앱 개발 단계에서 이런 부분이 몰라서, 귀찮아서 또는 디자인과 같은 현실적 한계로 인하여 가이드를 무시하고 개발되는 경우가 종종 발생하게 됩니다. 이렇게 접근성 설정을 무시하고 앱을 개발하면 앱 접근성 설정을 이용하는 사용자 환경에서 화면이 깨지거나, 사용상의 문제를 발생시키는 경우가 발생합니다. 또는 앱 심사 과정에서 거부되기도 합니다. 그런데 이런 문제가 인식된 시점에 디자인 변경이 어렵거나, 변경해야 하는 범위가 커서 접근성 설정을 무시하고 기본 글자크기로 나오도록 하여 문제를 회피하여 해결해야하는 방법을 알아보겠습니다. 아래 방법은 flutter에서 문자의 비율을 시스템에서 설정하는 값이 아닌 개발자가 기본 비율로 강제하도록 하여 접근성 설정이 무시되도록 하는 방법입니다. Widget build(BuildContext context) { // 사용자가 OS에서 제공하는 접근성 설정을 변경할 경우, 앱의 폰트 크기가 변경되는 것을 방지한다. // 폰트 크기가 크게 변경되면 다이얼로그의 레이아웃이 깨져서 다음 단계로 진행하지 못하는 경우가 발생함. final mediaQueryData = MediaQuery.of(context); final newMediaQueryData = mediaQueryData.copyWith(textScaleFactor: 1.0); return MediaQuery( data: newMediaQueryData, child: Container() ) } 내용이 잘못되었거나, 더 좋은 방법이 있으면 댓글 남겨주시기 바랍니다.

[flutter] 모바일 앱 재시작 또는 종료

모바일 앱을 개발하다 보면 앱을 재실행 시키거나 코드에 의한 종료를 해야하는 경우가 발생합니다. 예를 들어서 앱의 전반에 걸쳐서 영향을 끼치는 설정을 초기화하고 새로 로딩해야 하는 경우가 있습니다. 이런 경우에는 해당 설정값만 다시 로딩하는 방법도 있겠지만, 이 값이 여러곳에 영향을 끼친다던가 초기화 해야하는 값들이 많다던가 하면 머리가 아파지고, 앱을 재시작 시켜서 자연스럽게 설정값을 읽어들지게 하는게 자연스러울 수 있습니다. 그런데, iOS와 안드로이드 모바일 환경에서는 코드에 의해서 앱을 재실행 시키거나, 종료 시키는 것에 대해서는 권장하지 않으며, iOS의 경우에는 이런 기능이 들어가면 앱 스토어 심사 단계에서 거부될 수 있습니다. 그래도 좋은 사용자 경험을 위해서 앱의 종료나 재시작이 꼭 필요한 경우에는 구현을 하는게 좋습니다. 앱 재시작 설정 초기화 후 앱을 재로딩이 필요한 경우라면 앱이 자동으로 재시작 되는 것이 앱이 종료되는 것 보다는 더 좋은 사용자 경험을 제공합니다. 그런데 iOS에서는 앱을 재시작 시킬 수 있는 방법을 찾지 못해서 안드로이드에서 재실행 시키는 방법만 정리하도록 하겠습니다. flutter 에서 제공하는 기능만으로 앱을 재시작 시키는 방법은 아직 찾지 못했고, 메소드 채널을 이용하여 네이티브 코드로 구현하셔야 합니다. PackageManager packageManager = getPackageManager(); Intent intent = packageManager.getLaunchIntentForPackage(getPackageName()); ComponentName componentName = intent.getComponent(); Intent mainIntent = Intent.makeRestartActivityTask(componentName); startActivity(mainIntent); System.exit(0); 참고 : https://ideaj...