Programming 109

[Swift] Code Smell에 관하여....0

프롤로그코드를 작성할 때면 코드 한 줄 한 줄은 치열한 고민이 있어야 한다. 시간 내에 빨리 제출해야 하는 테스트 패스용 코드가 아닌 이상은 각 코드의 한 줄 한 줄은 고민이 있어야 한다. 그리고 경력자의 코드 한 줄 한 줄이 대충 짜인 것처럼 보일지라도 경력동안 해 온 고민들이 합쳐져 만들어진 결과물이어야 한다. 강연을 하면서 'Loop 혹은 Branch를 위한 코드가 비단 for와 if 뿐만이 아닌 것은 while과 switch의 용도가 분명하기 때문이다'라는 말을 자주 한다. 내가 작성하는 코드는 1차적으로 창조한 사람의 의도를 읽어야 한다. 가령 Python을 예로 들면, 귀도 반 로섬이 Python을 만들 때에 담고자 했던 철학을 이해해야 한다. Java라면 제임스 고슬링이 이 프로젝트를 시작했..

[iOS] 센서 이야기 - 자이로스코프

Background스마트폰에는 여러 가지의 센서들이 들어가 있다. 자기력계, 가속도계, 자이로스코프, 기압계, 고도계, 위치센서(GPS, Glonass, Galileo, Beidou), 조도센서, 근접센서 등이 대표적이다. 모든 센서들은 자기들의 영역이 있다. 자기력계는 자기장 측정, 가속도계는 가속력 측정, 자이로스코프는 기울기, 기압/고도/조도/근접 등등 모두 현실 세계의 물리량을 수치로 환산하여 OS에 제공하는 역할을 한다. 이번에는 그중에서도 자이로스코프와 가속도계의 협업에 대해서 얘기해보려고 한다. Gyroscope누구냐, 넌?아래는 일반적으로 우리가 보는 자이로스코프의 이미지이다. 원래의 자이로스코프는 중심에 횡방향으로 고속 회전하는 회전판이 있다. 정확한 원리의 이름이 이제는 기억나지 않으나..

[iOS] AVFoundation Foundation

PrologAsset과 Track의 이해asset은 하나 혹은 다수의 track으로 이루어져있다. track은 비디오 프레임, 오디오, 자막 등으로 재생에 이용되는 개별 컨텐츠를 의미한다. 이러한 컨텐츠들이 asset이라는 컨테이너에 담긴다. 플레이어는 asset이라는 컨테이너를 읽어와서, 각 track을 적절한 시간에 표시하여 재생한다. AVAsset과 AVPlayerItem의 이해AVAsset은 미디어를 담은 컨테이너인 asset의 데이터를 읽어오고 편집 등을 하기 위한 용도로 사용한다. 편집된거나 합성한 데이터를 읽거나 쓰기 위해서 사용되는 미디어 파일 그 자체라고 생각하면 된다. AVPlayerItem은 AVAsset을 재생하기 위해 사용하는 데이터 모델로서, 플레이어에서 재생에 관한 모든 제어..

[iOS] Core Video Foundation

Prolog레퍼런스 클래스 - 해당 타입의 기반이 되는 클래스로 동일한 기능의 사용을 위해서 상속 받아야하는 클래스인터페이스 (or 프로토콜) - 메소드의 Function Type을 선언하여 하위 구현체들의 용도/행위를 정의하기 위한 추상클래스 About Video비디오에 대한 이해비디오는 기본적으로 정지 이미지(Frame) 가 시간 축을 따라 연속적으로 표시하면서 움직임을 인식하게 만드는 시각적 매체입니다. 하나의 비디오는 수많은 이미지 프레임으로 구성되며, 이 프레임들은 일정한 속도(프레임 레이트, fps)로 표시됩니다. 예를 들어 1초당 30장의 이미지를 순차적으로 보여주는 영상을 30fps라고 합니다. 이때 각 이미지(Frame)는 약 33.3ms 간격으로 화면에 표시되며, 인간의 시각은 이 빠른..

[iOS] Accelerate computing with Metal

BackgroundCreateML/CoreML이 나오면서 Apple 플랫폼에서 ML model과 관련된 학습과 이용이 가능해졌다. 이러한 ML 관련 API의 등장과 함께 내가 관심을 가지기 시작한 것이 있었으니..... Metal Perfomance Shader (이하, 'MPS')이다. MPS는 ML의 백엔드에서 이산형 부동소수점 데이터의 병렬 연산을 위해서 사용된다고 한다. 만약에.... 우리가 데이터의 연산 처리를 하는데, 고도의 연산 처리가 아니면서 각 데이터의 값이 서로 연관이 없을 때는 GPU의 병렬 연산 처리를 사용한다면 속도와 성능 개선에 큰 기여를 할 수 있을 것이다. 2016년부터 함수형 프로그래밍을 공부하면서, 극한의 병렬/비동기 연산에 대해서 어떻게 활용하고 적용할지에 대해서 고민을..

[iOS] SwiftUI : View update에 대한 고찰

BackgroundSwiftUI는 선언형 기반으로 구현하도록 설계되어 있다. 이 선언형의 관점을 이해하기 위해서는 함수형 프로그래밍에 대한 깊이있는 이해가 필요하다. Immutable type을 왜 쓰는지, Value type을 왜 사용하는지, 순수함수를 왜 쓰고 어떻게 비지니스 로직을 구현해야 하는지 등이다. 그리고 SwiftUI의 동작 체계에 대한 이해도 필요하다. View의 업데이트는 어떻게 이루어지는지, 이에 대한 최적화 작업은 어떻게 해야 하는지 등이다. SwiftUI를 가볍게만 사용하던지라 이에 대한 이해가 부족했고, 그러기에 이에 대해서 정리하려고 합니다. SwiftUI가 iOS 13부터 지원했지만, 최근까지 버그도 많고 아직 기술 자체가 덜 성숙했던지라 어떤 변화가 생겼는지 정도만 관심을 ..

[iOS] Swift Concurrency Foundation

async-await 비동기 함수 혹은 메소드 (이하 '비동기 함수')는 다른 비동기 방법 (GCD, Operation 등)과 몇가지 다른 차이점을 보인다. return 및 thorows 등을 일반적인 함수들과 같이 지원한다. 이는 유연하고 확장 가능한 비동기 실행 방법을 제공한다. 그리고 실행 흐름을 busy wait 하지도 않고 suspend 상태로 남겨두었다가 마저 실행된다. suspend 상태로 남겨두는 곳을 suspension point로 칭하기도 하는데, 이를 await라는 키워드를 통해서 표시한다. thread는 이 suspension point를 만나면 실행의 흐름을 넘기고 다른 코드를 즉시 실행하는 동작을 수행한다. async-let 'async let'을 사용하면 비동기 함수의 실행을..

[iOS] SwiftUI Foundation

ProtocolsApp 프로토콜 앱의 구조를 설정하기 위한 프로토콜. @main을 통해서 main() 메소드의 기본 구현을 통해 entry point를 제공한다. Scene 프로토콜을 구현하여 App의 body를 구현한다. 각 scene은 각각의 root view와 life cycle을 가진다. 모든 scene을 넘어서 데이터를 공유하기 위해서 App을 구현한 곳에 StateObject 등을 구현하여 사용하는 방법이 있다. 공유하는 데이터의 성격에 따라 ObserbedObject나 EnvironmentObject 등을 사용한다. @preconcurrency @MainActor는 기본적으로 상속됨으로써 isolation 처리되어 있다. @MainActor를 opt out 처리하기 위해서는 extension..