RunWay 1.3.1 HotFix
1.3을 배포하고 얼마 안 돼서 실제로 뛰다가 문제를 겪었다. 흐름은 이랬다. OVERSPEED(너무 빠름) 경고가 떠서 속도를 줄였더니 정상적으로 SINK RATE(너무 느림)로 바뀌었고, 다시 속도를 올렸는데 SINK RATE에서 안 돌아왔다. 화면에 뜨는 편차 숫자는 계속 커져서 나중엔 300초까지 갔고, 결국 앱이 강제 종료됐다. 배포한 지 ...
1.3을 배포하고 얼마 안 돼서 실제로 뛰다가 문제를 겪었다. 흐름은 이랬다. OVERSPEED(너무 빠름) 경고가 떠서 속도를 줄였더니 정상적으로 SINK RATE(너무 느림)로 바뀌었고, 다시 속도를 올렸는데 SINK RATE에서 안 돌아왔다. 화면에 뜨는 편차 숫자는 계속 커져서 나중엔 300초까지 갔고, 결국 앱이 강제 종료됐다. 배포한 지 ...
앞 글까지 오므리면 진짜 복사까지 되고, 복사가 안 될 때 원인도 구분되게 만들었다. 그 다음엔 계속 창을 띄워놓고 써야 하는 게 불편해서 백그라운드처럼 쓸 수 있게 바꿨고, 화웨이 원본 영상처럼 사진이 손에 빨려들어가는 느낌도 넣어봤다. 창 대신 메뉴바로 원래는 창 하나 띄워놓고 쓰는 평범한 맥 앱이었다. 이걸 메뉴바 아이콘으로 바꾸고, Do...
지난 글에서 오므리면 진짜 복사까지 되도록 만들었는데, 실제로 여러 번 써보니 “복사가 안 되는 것 같다”는 상황이 몇 가지 다른 이유로 겹쳐서 왔다. 원인을 하나씩 구분해서 정리했다. 어느 앱이 진짜 앞에 있었는지 확인하기 모니터를 여러 개 쓰다 보니, 화면에 사진 앱이 보이고 있어도 실제로 키보드 입력을 받는 앱은 다를 수 있다는 걸 알게 ...
지난 글까지 오므리면 보내고 펼치면 받는 건 됐는데, 두 가지가 아쉬웠다. 텍스트만 되고 이미지는 안 됐고, “오므리면 복사”가 아니라 “미리 복사해둔 걸 보내기”였다. 이번엔 이 둘을 채웠다. 텍스트 말고 이미지도 보내기 지금까지는 그냥 텍스트만 주고받아서 데이터가 뭔지 서로 알 필요가 없었는데, 이미지가 섞이려면 받는 쪽이 지금 온 게 텍스...
지난 글에서는 맥이랑 아이폰이 서로를 찾아서 텍스트 하나를 주고받을 수 있는지만 확인했다. 이번엔 진짜 하고 싶었던 부분, 웹캠으로 손을 보고 오므리면 보내고 펼치면 받는 것까지 이어붙였다. 맥에서 손 오므림 인식하기 Vision 프레임워크에 손 관절 좌표를 뽑아주는 VNDetectHumanHandPoseRequest가 있다. 웹캠 프레임마다 ...
화웨이 노트북이랑 폰을 손으로 오므렸다 펼치면서 클립보드를 옮기는 영상을 봤다. 손을 오므리면 복사, 다른 기기에서 손을 펼치면 붙여넣기가 되는 기능이다. 애플 생태계에는 그런 게 없어서, 비슷한 걸 맥이랑 아이폰으로 직접 만들어보기로 했다. 이 글은 클로드 코드와 대화하면서 바이브 코딩으로 진행한 과정을 정리한 것이다. 카메라로 손 모양을 읽는 부...
워치랑 아이폰을 같이 두고 워치 단독으로 러닝을 했는데, 끝나고 보니 아이폰 로그북에 기록이 안 남아있었다. 오늘 고친 것들이랑은 무관한 문제였지만, 원인을 끝까지 따라가보니 훨씬 오래된 구조적 틈이 있었다. 이 글의 원인 분석과 해결 방향은 AI와 대화하면서 하나씩 짚어나간 과정을 그대로 옮긴 것이다. 특히 뒤에 나오는 “앱이 안 켜져있는데 어떻게...
실사용 피드백이 두 개 들어왔다. 하나는 러닝 종료 후 요약 화면의 지도를 확대할 수 없다는 것, 다른 하나는 제자리에 멈췄을 때 일시정지로 뜨기까지 8초나 걸려서 너무 길다는 것. 지도가 확대되지 않던 문제 GPWS 경고가 짧은 구간에 몰리면 마커가 서로 겹쳐서 어떤 경고인지 구분이 안 됐다. 확대해서 보고 싶다는 피드백이었는데, 코드를 보니...
Watch에서 CUSTOM 거리를 Digital Crown으로 조절하다가 이상한 걸 발견했다. 최소값 100m부터 시작해서 계속 돌리다 보면 500m, 600m, 1.1km, 1.6km처럼 애매한 값에서 멈췄다. 원인 WatchDistanceSettingView의 Crown 바인딩을 보니 시작값 0.1(100m)에서 0.5씩 계속 더하는 구조였...
Filtering Operators 이전글에서 살펴봤듯 Observable에 적용하는 모든 메서드는 연산자(Operator)라고 부른다. 이번 편부터는 그중에서도 Observable이 방출하는 이벤트 중 원하는 것만 골라서 통과시키거나 걸러내는 연산자들, 즉 Filtering Operator를 다룬다. ignoreElements, elementAt,...