본문 바로가기

분류 전체보기

(351)
Leopold FC750RBT, 그리고 FC750R 서론 내가 하려는 작업에 맞는 적당한 컴퓨터를 고르는 것도, 조립으로 구성하는 것도 큰 즐거움이지만 내게 맞는 마우스, 키보드 등 주변 기기를 찾는 것도 꽤나 많은 노력과 시간이 필요한 일이며 또 하나의 즐거움이다. 작게는 어디서 생긴 키보드부터, 선물 받은 키보드, 직접 고른 키보드 등 여러 루트로 생길 것이고, 멤브레인, 기계식, 유선, 무선 등의 동작 방식부터, 체리, 게이트론, 청축, 무접점, 배열 등의 세세한 부분까지 신경을 써야 할 수가 있다. 데스크 세팅에 관심을 슬슬 가지게 될 무렵부터 꽤 여러 번 키보드를 바꿨지만, 다른 사람들처럼 그리 오래 헤매지도 않았고, 적당한 가격대에 디자인까지 마음에 들어 정착할 곳이 있어 다행이었다. 그렇게 구매했던 FC750R에 정착하나 싶더니 맥북과 함께 ..
186. Managed Object and Managed Object Context Managed Object and Managed Object Context Core Data의 데이터 처리 단위는 관점에 따라 두 이름으로 불린다. Model 관점 Context 관점 Entity Managed Object Context 관점의 Managed Object가 이번 포스팅의 목적이다. Managed Object는 NSManagedObject로 구현 돼있고, 해당 객체의 Life Cycle을 관리하는 주체가 Core Data이기 때문에 'Managed'라는 접두어가 붙는다. NSManagedObject를 상속받아 Entity Class를 만들어 사용하게 되면, 일반적인 Core Data의 Key-Vlaue 방식식이 아닌 속성을 사용해 Attribute에 접근 할 수 있다. 이는 코드가 단순해 ..
185. CoreData CoreData 앱을 종료해도 유지될 수 있도록 데이터를 '영구'히 저장하는데 사용함. 관계형 DB아닌 DB의 사용을 돕는 것에 목적을 둠. 이에 따라 Object Graph Management Tool 이라고도 함. DB에 대한 이해가 부족해도 간편히 사용할 수 있음. 모바일 환경에 최적화 돼 있으며, iOS와 Mac OS를 아울러 사용할 수 있음. 구성요소 영구저장 (Persistent Store) : NSPersistent Atomic Store Non-atomic Store XML Binary In-Memory SQLite 데이터 처리시 모든 데이터를 메모리에 Load 필요한 부분만 Load Object Model : NSManagedObjectModel 어떤 데이터가 저장되는지, 어떤 관계를 가..
183 ~ 184. NSCoding and Codable NSCoding Apple Developer Documentation developer.apple.com 생성자와 encode(with:) 메서드를 필수로 구현해야 하는 NSCoding 프로토콜은 Archiving과 Serialization을 구현하기 위한 필수 프로토콜이다. Decoding Binary 데이터를 객체로 변환 Encoding 속성(객체)을 Binary 값으로 변환 프로토콜은 위의 두 가지를 담당하게 된다. NSCoding은 NSObject를 상속해야한다. NSCoding 프로토콜을 채용하거나 구현해야한다. 객체를 저장할 수 있다. 단, 구조체는 불가능하다. 위의 세가지 특징과 한계를 가지고 있다. init() Apple Developer Documentation developer.appl..
181 ~ 182. User Defaults and Property List User Defaults (Default Database) 특징 Key - Value의 형태 메모리가 아닌 'plist'파일로 저장 직접 수정할 수 없고 반드시 UserDefaultClass를 사용해야 함 앱 실행시 병목 해소를 위해 Cache에 Load된 후 사용됨 위의 이유로 최대 4GB 까지 사용할 수 있는 것으로 안내되지만 KB급 이상에는 부적합 즉시 사용 가능 해당 형태로 변환 필요 Bool String Data Array Dictionary Data URL NSCoding saveData() let key = "sample" @IBAction func saveData(_ sender: Any) { // UserDefaults.standard.set("Hello", forKey: key) Use..
애플에 보안 취약점 제보하기 (feat. 애플 홈페이지에 이름 석자 올려 보기) 서론 많이, 아주 많이 지난 이야기다. 때는 2019년 전역 이후 아직은 '학생'이라는 신분이 어울리던 때로, iOS 13.1.1에서 앱스토어에 로그인된 상황에서 로그아웃을 하고, 동일한 계정으로 다시 로그인을 수회 시도한 뒤에는 어떤 비밀번호 건 간에 로그인이 되는 희한한 버그였다. 원래의 비밀번호를 노출하지 않기 위해 정상적으로 로그인하는 부분은 잘라냈지만, 영상에서와 같이 애초에 올바른 비밀번호의 형식이 아니기 때문에 충분히 어떤 상황인지 확인할 수 있다. 이러한 문제를 발견하면 어떻게 대처해야 하는지, 또 어떤 식으로 진행되는지 간단하게 정리해 본다. 본론 어디로? 대부분의 기업들이 그렇듯, 애플도 제품과 보안 문제에 대한 피드백을 듣기 위해 연락처를 열어둔다. 제품 피드백 Product Feed..
180. File Manager #3 Slide Action deleteDictionary(), deleteFile() func deleteDirectory(at url: URL) { do { try FileManager.default.removeItem(at: url) refreshContents() } catch { print(error) } } func deleteFile(at url: URL) { do { try FileManager.default.removeItem(at: url) refreshContents() } catch { print(error) } } 두 메서드는 같은 방식으로 구현된다. 대상 삭제 removeItem(at:) Apple Developer Documentation developer.apple.com 해당 메..
179. File Manager #2 Directory 추가 func addDirectory(named: String) { guard let url = currentDirectoryUrl?.appendingPathComponent(named, isDirectory: true) else { return } do { try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil) refreshContents() } catch { print(error) } } URL 추가 현재의 Directory URL을 받아와 appendingPathComponent 메서드를 사용해 새로운 경로를 생성한다. appendingPathComponen..
178. File Manager #1 class FileManagerTableViewController: UITableViewController { var currentDirectoryUrl: URL? var contents = [Content]() var formatter: ByteCountFormatter = { let f = ByteCountFormatter() f.isAdaptive = true f.includesUnit = true return f }() currentDirectoryUrl의 형식은 URL이다. iOS에 경로는 URL 구조체로 표현한다. 만약 클래스로 서치하고자 한다면 NSURL 클래스를 사용한다. 이 둘은 파일과 네트워크 URL을 모두 표현할 수 있고, 이를 조작하기 위한 속성과 메서드를 제공한다. currentD..
177. Data Persistence Overview Data Persistence Overview (데이터 영구 저장) iOS에서 지원하는 저장 방식은 다음과 같다. User Default Property List Keychain Core Data Binary Data 설정값등의 간단한 데이터는 User Default와 Property List를 사용한다. 작은 크기의 데이터를 쉽고 빠르게 쓰고, 접근할 수 있다. 단, Query를 지원하지 않기 때문에 데이터의 검색이 쉽지 않다. 암호등의 민감한 정보는 Keychain을 사용한다. 다수의 데이터를 저장할 때는 Core Data를 사용한다. 모든 데이터를 객체로 관리하기 때문에 검색과 정렬이 용이하고, 일부 데이터에만 접근하는 것도 가능하기 때문에 파일 크기가 성능에 큰 영향을 주지 않는다. Binary ..