아이폰 코드를 생성해주는 방법에 대한 논문

뉴스레터를 보다가 아이패드에 그림을 그리면 그걸 SwiftUI로 변환해주는 앱에 관한 논문을 알게 되었다. 

이런 내용은 첨보는데 논문에는 이미 이런 주제의 논문이 많다고 나열을… 정말 많더라 🫢 

구현은 대략 

앱에 그림을 그린걸 파이어베이스로 데이터 수집 > 수집한 데이터를 기반으로 딥러닝 학습 (YOLOv5) > coreML 타입으로 전환 > 코드 생성 

이런 식이다 

학습 시킨걸 iOS에서 어떻게 쓰나 했더니 YOLOv5가 pytorch 기반인데, 이 pytorch의 모델을 coreML 모델로 변환을 시켜주는 툴이 있다.  

Core ML Tools인데 레퍼런스를 타고 가보니 TensorFlow도 지원이 되는듯,, 그럼 그 기반의 라이브러리도 쓸수 있을거 같다 

코드를 생성하는 방식은 객체를 분류하고 반복해서 코드 생성, 머신러닝 크게 2가지 방식으로 나뉘는데 머신러닝은 꽤 복잡하고 대부분 첫번째 방식의 논문이 많다고 한다.

그 외의 구현 방식이나 리서치한 내용, 시행착오 등이 엄청 자세히 정리되어 있어서 또 여러번 읽을것 같다.. (기억력이 많이 안좋은 편..) 애초에 딥러닝은 아이폰 앱 개발과는 거의 상관이 없다고 생각했는데, 이런 쓰임새가 있을줄은 몰랐다 😳😳

데모 영상 : https://www.youtube.com/watch?v=SKGdZ3H9eyY

논문 : https://arxiv.org/abs/2103.05704

SwiftUI 뷰 개수 제한

스유 뷰를 10개까지 넣을수 있다는 제한이 있는건 몰랐는데

Swift 5.9를 기점으로 해결이 되나보다

결국 이 코드도 역사속으로 .. 🫢

static func buildBlock<C0, C1, C2, C3, C4, C5, C6, C7, C8, C9>(C0, C1, C2, C3, C4, C5, C6, C7, C8, C9) -> TupleView<(C0, C1, C2, C3, C4, C5, C6, C7, C8, C9)>

스택 오버플로에 개발자가 올린 Combine 관련 질문을 분석한 리서치

https://dl.acm.org/doi/10.1145/3613372.3613381

스택오버플로우를 기반으로 Combine 관련 질문을 2019부터 2022년까지 분석해줬는데, 인기, 어려움, 글 갯수 이런 주제로 분류되어있다.

인기있는 질문들은 대부분 사용성 관련인것 같은데 관심이 갔던건 어려운 질문중에서 “컬렉션 뷰에서 데이터 보여주기” 였다. 글에서는 아마 필터링이나 정렬 같이 실시간으로 데이터를 조작해서 보여주는데 이슈가 있지 않는거냐 하는데 그럴듯하고 나도 궁금..
아직 나도 컬렉션뷰 같은데서는 써보지 않아서 어떤 시행착오가 있는지 모르겠다
다른 어려운 질문은 명령형이랑 반응형 사이에서 왔다갔다할때에 관한 거라는데 뭔 질문일까.. 것도 궁금한데

누가 여기 나온 질문들을 묶어서 강의를 만들어주면 나도 사서 보고싶소 .. 이미 나와있을라나 🙄

그리고 컴바인 쓴다고 성능향상이 될거라고는 생각을 못해봤는데,, 그게 써드파티 라이브러리 사용하는것보다는 좋다고 레퍼런스에 있네에… 하긴 애플 자사제품이니 생각해보니 그렇겠구나 싶었다.

SwiftUI에서 뷰 디버깅

따따디씨 보다가 좋은 코드를 봐서 메모..

expression Self._printChanges()

뷰가 왜 불렸는지 알고싶을때 lldb 디버그 콘솔에서 저 명령어를 치면 된다

코드상에서도 저 메소드를 부를수는 있지만 프라이빗 API라서 리얼에 나가지 않도록 조심하라고 한다

요건 푸드트럭앱 샘플에다가 명령어를 쳐본 결과

같은 화면을 스크롤 했을때 같은 명령어를 쳐보면 설명이 바뀐다

그리고 저걸 보고 궁금했던건 나는 그동안 p, po만 쳤는데 expression은 무엇인가 …

찾아보니 결국 같은 명령어라고 봐도 될듯

p 는 expr —

po 는 expr –O —

expr은 expression 명령어의 줄임, e로도 쓸 수 있다.

더 궁금하면 LLDB: Beyond “po”를 보라는데, 나중에 보자아..

참고

Design Patterns in Swift 5

디자인패턴은 관심이 별로 없었는데.. (오히려 과한 추상화를 겪은 후로는 싫어하는 편) 주변에 디자인패턴에 관심이 많은 사람들이 늘어나고 내 코드도 도태된것 같아서 사봤었는데 결과는 만족

내용은 쉽고, 거의 아는 디자인 패턴들이었지만 그게 스위프트로 설명이 되어있으니깐 꽤 좋았다.

대부분의 디자인패턴 책은 예시가 자바로 되어있으니깐,, 대충 개념은 이해하지만 거기서 끝이었던 것이 이 책에선 현실감 있게 다가왔다.

게다가 몰랐던 스위프트 코드도 좀 있어서, 의외의 스위프트 공부까지 ..

누가 iOS 개발 입문용으로 추천해달라면 이 책을 추천해주고 싶다.

dispatch barrier로 동시성 이슈 피하기

디자인 패턴 책 보다가 concurrent queue의 동시성 이슈를 피하기 위해서 .barrier 주는 코드를 봤는데 요거 꽤 좋은거 같다

.barrier 플래그를 주면 concurrent라도 그 옵션이 붙은 블락이 끝날때까진 순차적으로 실행을 시켜주는 거라는데.. lock 과 비슷하다고 보면 될듯

읽던 책에선 싱글턴을 구현하는거였는데 값이 수정될때 읽어오려고 하면 동시성 이슈가 생기니깐 값을 수정할땐 저 플래그를 줘서 수정이 끝날때까진 값을 바로 가져가지 못하게 하는 효과를 줬다

덕분에 앱이 죽는 이슈는 피하게 됨 🤗

경험상 concurrent 큐를 쓰다가 동시성 이슈가 있네..? 그럼 성능이슈가 좀 있지만 순차적으로 바꿔야지 이러고 끝냈었다.

실제로 성능 차이가 막 느껴지는 기능도 아니긴 했지만 ..

애플 문서를 찾아보니 DispatchWorkItemFlags중 하나였는데 다른 flag도 하나도 모르고 있었자나 … 그동안 GCD 대충 쓰고 있었다 😇

나머지 옵션도 읽어 둬야지 …

final 키워드

우버에서 쓴 프로토콜 성능을 개선했다는 논문을 보다가 (2019년 기준, 프로토콜을 9000개 이상을 사용하는 관계로 성능을 개선하려고 컴파일러 분석까지 하시는 분들..)

모르는것을 검색하다가 private으로 선언하면, 오버라이딩 하지 못하기 때문에 컴파일러 내부적으로 final로 마크를 하고 그럼 static dispatch로 실행을 하고, 런타임시 어떤 함수를 호출할지 찾아보지 않아도 된다는 이야기

…를 보고 어..? 그럼 함수에 final로 선언을 하면 컴파일러가 할 일을 줄여주겠구나 라는 생각을 했다

근데 왜 실제 코드에선 잘 보이지 않을까.. 하고 검색을 해 보니 final 클래스 내부 변수, 함수들은 다 오버라이딩 금지이기때문에 final 마크를 추가로 할 필요가 없다

우리 팀들은 대부분의 class를 final로 마크하고 있기 때문에 자주 보이지 않는 거였나보다

검색하다가 찾은 글에서는 extension의 함수들도 오버라이딩이 안되기 때문에 final이 필요 없다고 한다 (적어도 2019년 당시.. 지금도 그렇지 않을까?)

대부분의 경우에는 final 마크 안했다고 성능에 크게 차이가 없겠지만, 알아두면 좋지 않을까 싶다

Xcode 디버그 콘솔에서 뷰 계층 출력하기

엑스코드에서 뷰 계층을 3D로 예쁘게 보여주는게 이미 되지만 가끔은 특정 뷰 밑으로 쭉 찍어보고 싶을때가 있다.

그럴땐 디버그 콘솔에서 UIView의 숨겨진(?) 함수인 recursiveDescription()를 부르면 된다.

스위프트는 비공식 함수를 부르는 방식이 쉽진 않은데 밑의 방법으로 가능하다.

po view.value(forKey: "recursiveDescription")

그러면 요렇게 나온다.

perform으로도 부를순 있는데

po self.view.perform("recursiveDescription")

뭔가 아까 방법과는 조금 다르게 출력이 되긴 하지만 뷰가 찍히긴 한다.

참고 : https://www.hackingwithswift.com/articles/101/how-to-debug-your-view-hierarchy-using-recursivedescription

[iOS] YouTube를 재생하기 위한 헬퍼

유투브에서 ios용으로 동영상을 재생하기 위한 오픈소스를 제공하고 있었다.

이 소스를 적용해본 블로그 글을 보니 player뷰가 제공되고 그 뷰에 동영상 아이디로 로드해서 재생하는 방식으로 되어있다.

동영상을 재생할 때 전체화면으로 안덮고 동영상 뷰 크기를 설정할 수 있으니, 그 점은 좋은 것 같다.

관련 글 : http://dev.classmethod.jp/smartphone/youtube-player-ios-helper/

[iOS] APNS http/2 지원 API 공개

클라이언트 보다는 서버쪽에 관련된 이야기이지만, http/2 를 지원하는 push api가 공개되었다는 뉴스가 올라왔다.

덕분에 관련 wwdc를 좀 봤는데, http/2를 소개하기를 한 커넥션으로 request와 response를 여러 개 받을 수 있게 된다고 한다. 스트리밍과 비슷한건지 그렇게 비유를 해줬다.  그리고 여러개의 request 중 한 놈이 실패를 하더라도 커넥션은 살아있다고 한다. 클라이언트 쪽에서만 보면 http/2를 위해 따로 대응을 안해줘도 되는 것 같은데, 과연 그럴지 ..

 

덤으로 APNS 쪽에서 새로워진 점은 payload 사이즈가 4kb로 또 늘어나고, device token 길이도 길어진다. silent notification은 앱을 깨우는 형태로 동작하는거 같은데, 동작하는 타이밍은 os단에서 결정하는 모양이다.  apns feedback 서비스도 소개했는데, 이건 다시 알아봐야 할 듯 싶다.