Swift(12)
-
AVFoundation - 비디오의 인코딩(압축) 및 업로드(2) - AssetReader / Writer 이용
AVFoundation - 비디오의 인코딩(압축) 및 업로드(1) - ExportSession 이용 ExportSession을 사용하지 않게된 이유 exportSession은 프리셋을 사용해 인코딩을 조절할 수 있기 때문에, 원하는 화질을 유지하면서 용량을 낮추는데에 한계가 있었다. 따라서, low level API인 Asset Reader / Writer를 사용하게 되었다. stream을 이용한 파일 입출력과 비슷한 느낌이다. Asset Audio Reader: 오디오가 없는 비디오 case를 고려하여 처리 // Set AudioReader var assetReaderAudioOutput: AVAssetReaderTrackOutput? if let audioTrack = asset.tracks(with..
2023.03.20 -
잘못된 코드로 인하여 AWS 폭탄 맞은 이야기
깊은 고민 없이 사용한 잘못된 코드(라이브러리)로 비용이 많이 청구된 이야기를 공유해보려고 한다. 결론 부터 말하자면, 비디오의 캐시 다운로드로 인하여 아직 개발 중이어서 사용자가 적은데도 불구하고 AWS 비용이 30만원이 청구되었다. 개발 히스토리 비디오 피드 리스트가 있는 화면을 만들게 되었다. 처음엔 트위터의 비디오 피드 같이 심플한 디자인이어서 AVKit만으로 충분했다. 하지만 점점 유튜브 비디오 UI처럼 요구 사항이 늘어나게 되어, AVPlayer Layer를 사용한 커스텀이 필요하게 되었다. ControlUI도 필요하고, 비디오 캐시 처리를 하면 데이터를 아낄 수 있을 것 같아 Custom 확장성과 비디오 캐시를 지원하는 GSPlayer 라이브러리를 사용했다. 이 당시에는 AVAsset의 이해..
2023.03.17 -
Apple Design Challenge Part 1 - 컨설팅 후기
챌린지에 참가하면 소정의 혜택으로 원하면, 본인의 앱을 애플 에반젤리스트 분이 컨설팅 해준다. 할까말까 고민하다가, 현재 회사 앱이 앱이 너무 예쁘지 않아서 받게 되었다. 컨설팅에서 다음과 같은 말을 해주셨는데 아주 정확한 말씀이셨다. 앱의 첫 인상이 초기 기획보다 피처가 많이 확장되어보이는데, UX의 고려 없이 덧붙힌 느낌이다. 초기 기획은 채팅 + 음성/영상 VOIP였다. 이 후, 유료 비디오 스트리밍 + 정기 구독이 추가되었다. 컨설팅 전 세션 듣고 수정한 사항 첫 페이지 이후 탭바 숨김 처리한 것 해제 - 트위터 / 인스타 / 슬랙 등이 이미 이를 지키고 있음. 프로필 메뉴를 80 / 20 룰을 지켜 분리 함 컨설팅을 원하는 항목 찾기(검색) 탭 타이틀의 애매함. 더보기 탭 메뉴 이름 및 정체..
2023.03.15 -
[백준] 7576 토마토 🍅
7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net 블로그 글을 쓴 이유는 다른 그래프 문제에서는 문제가 되지 않던 시간 초과가 발생해서이다. 기존에는 swift Array를 큐로 사용하여 pop할 때 removeFirst()를 사용해도 시간 초과가 되지 않았다. 해결법은 큐를 팝하면서 순회하지 않고, head 변수를 두어서 queue[head]의 값을 가져오도록 해야 한다. 문제 해설 1. 그래프를 이용한 최단 거리를 구하는 문제이니 BFS로 접근 2. 상자에서 토마토의 위치를 기록 3. BFS..
2022.04.14 -
Class function과 Static function
작성 이유 HealthKit Weekly를 작성 중에 WWDC 프로젝트 예제에서 class func이 사용되었다. static과 class function이 Type method라는 것만 알고 정확한 차이를 몰라 작성하게 되었다. 먼저 둘의 차이는 재정의 가능 여부이다. class function은 상속받아서 재정의 가능하다. Method는 크게 Instance Method와 Type Method로 나눌 수 있다. Instance Method 클래스 인스턴스가 생성된 후, 인스턴스가 주체가 되어 실행하는 메소드이다. 일반적인 클래스 내에 선언된 메소드이다. Type Method 클래스 인스턴스없이, 실행가능한 메소드이다. 사용 이유는 메소드 선언이 필요하지만, 인스턴스가 필요 없는 경우이다. 주의 할 점..
2022.02.28 -
🥁 SwiftLint with SPM
vi Mintfile brew install mint 커밋 컨벤션에 이은 협업 시리즈 2탄이다. 왜? 먼저 swiftLint는 무엇이고, 왜 도입해야하는지를 알아보자 스위프트 스타일 및 컨벤션을 강제하기 위한 도구 그럼 이 도구를 왜 도입해야 할까? 주된 이유는 코드 컨벤션 체크를 자동화하여 보다 핵심 기능에 집중할 수 있기 때문이다. 즉, 코드 컨벤션이 있다하더라도 자기도모르게 지키지 못했을 경우가 있을 것이다. 내가 그렇다. 이번에 swiftLint를 적용하면서 400개 가량 이슈가 발생하였다. 개인 프로젝트에서 나름의 컨벤션을 정하고도 이렇게 나왔는데 팀 협업에서는 컨벤션을 강제할 필요성이 더 크다고 생각한다. 설치 방법 Homebrew 설치 -> Mint 설치 SPM환경에서 사용하려면 Mint를..
2022.02.21