This document will be continuously updated.
문서가 너무 많아져서 30개로도 압축이 안되기 때문에 구글 문서로 모두 통합하여 업데이트 하기로 했다.
https://docs.google.com/document/d/1XeuDIhtXQ0UypbAG0yRRlsx1K0-LTWJaJr25snDvxRo/edit?usp=sharing
뭘하던, 요구사항 정의와 도메인 정의, 데이터 저장 방법이 끝나야 하지. ㅡㅡ; 누더기 코드는 여기에만 두고 실제로는 모두 삭제한다. 한 달 쓰는(함께 일하는) 고가의 웹 개발자를 잘못 뽑았더니 데이터 정의를 못해서 ㅠㅠ 우왕좌왕 하다 결국 내가 하는... 그러나 생각해보면 DB 담당자가 없으면 웹 개발자가 해야 한다는 인식이 잘못되었다. 서비스에서 가장 많은 %를 개발하고 있는 개발자가 데이터 정의를 하는게 맞다는 교훈을 얻은 경험이었다.
print("Auth.auth().currentUser!.uid = " + (Auth.auth().currentUser?.uid ?? ""))
print("app.current user = " + (app.currentUser?.id ?? ""))
// print("(Int(Date.timeIntervalSinceReferenceDate * 1000))/fromData/(imageURL.lastPathComponent) = " + "/\(Int(Date.timeIntervalSinceReferenceDate * 1000))/fromData/\(imageURL.lastPathComponent)")
// let addr_firebase_storage = ViewsAppConfiguration.shared.addr_firebase_storage
let storage = Storage.storage(url: addr_firebase_storage)
// let savingLocation = "gs://" + (self.udfirstArg ?? "") + "/" + "230830.jpeg"
let thirdWords = self.udthirdArg as Any
let stringValue = (thirdWords as? String) ?? "Default Value"
print("Value as String: \(stringValue)")
let businessNumber = self.udsecondArg
let businessNumberWithoutDashes = (self.udsecondArg ?? "").replacingOccurrences(of: "-", with: "")
// Now, businessNumberWithoutDashes contains the business number without dashes
let savingLocation = addr_firebase_storage + "2023/" + (app.currentUser?.id ?? "") + "/" + (self.udfirstArg ?? "") + "/" + "/\(Int(Date.timeIntervalSinceReferenceDate * 1000))" + "_" + stringValue + "_" + businessNumberWithoutDashes + ".jpg"
let storageRef = storage.reference(forURL: savingLocation)
print("HJH_UserDefault logs(self.udfirstArg) = ", self.udfirstArg as Any)
print("HJH_UserDefault logs(self.udsecondArg) = ", self.udsecondArg as Any)
print("HJH_UserDefault logs(self.udthirdArg) = ", self.udthirdArg as Any)
let metadata = StorageMetadata()
// metadata.contentType = "ProfileImage/jpeg"
metadata.contentType = "image/jpeg"
핵심은 savingLocation 이다. 보통은 파일명 해시화가 가장 좋았지만 한 번(1초 내)에 쓰레드에서 1000개씩 돌린것을 구글과 몽고DB, 아마존에 보내다 보니 DB 메타데이터랑 꼬이는 현상이 있어 주요 정보는 줄이고, 파일명 자체로 정보를 보내며 싱크를 맞추기로 했다.
var udfirstArg = UserDefaults.standard.string(forKey: "CameraViewfirstArg") 유저 디폴트 키로 오픈 소스와 데이터를 연결한다.
let savingLocation = addr_firebase_storage + "2023/" + (app.currentUser?.id ?? "") + "/" + (self.udfirstArg ?? "") + "/" + "/\(Int(Date.timeIntervalSinceReferenceDate * 1000))" + "_" + stringValue + "_" + businessNumberWithoutDashes + ".jpg"
가독성이 떨어질지도 모르지만 혼자 개발하다 보니 나에게는 이게 가장 가독성이 높다. 그리고 잘 짠다는 것은 코드 조각을 공개해도 주요 정보는 공개 되지 않는 시큐리티 정보 분할 방식 코딩이 잘 짠다는 것이다. 라인 맞출 필요 없이 formatter면 충분하고 실제 바이트 코드는 모두 리니어 하다. 사람의 두뇌 능력이 떨어지니 다 떨어뜨려서 이해를 해야하는 것 뿐.
주니어 개발자를 뽑으면 늘 리팩토링만 하다가 정작 신규 피처를 개발 못하고 욕하면서 나가며, 자신이 뭘 개선했니 마니 한다. 그래서 요즘엔 주니어 개발자 뽑으면 소스 공유 안하고 6개월 정도 똑같은 프로젝트 만들어 보라고 하고 시간을 준다. 그러면 스스로 굉장히 공부를 많이 한 줄 알고 6개월 동안 개고생하다가 배터리 다 되고, 본인 포트폴리오로 해서 이직을 한다. 이런 케이스를 한 6명 정도 겪다 보니 돈을 최소 2배 주더라도 시니어 개발자를 쓴다. 시니어 개발자와 커뮤니케이션은 간단하다. 그냥 전체를 떼 주고 VOC, 요구사항이나 기능, 퍼블리싱 시기 관련해서만 이야기를 한다. 개발 관리가 얼마나 편한지 깨닫게 되는 시간이다. 그리고 나도 개발자다보니 신규 개발 기술이나 어떤 것은 도전적인 것이고 어떤 것은 편한 것인지 이야기 하며, 좀 더 친해지다보면 우리 휴가 보전을 위해 좀 구린 개발자들이 모인 집단과 비교해서 충분한 개발 속도를 확보한 상태에서 개발 속도를 조절한다. 장기 휴가 아닌 장기 휴가를 가진다. 그게 큰 규모의 기업이던 작은 규모의 기업이던 스톡홀더나 경영자나 개발은 전혀 못하면서 자신이 뛰어난 관리자라고 착각하는 사람들을 대하는 방식이었고, 내가 대표가 되고 나서도 왠만해서는 경쟁력이 나오니 너무 아등바등 하지는 않는다. 시니어만 모인 조직만의 장점이다.
그러나 가끔 서로 얼굴 보며 너무 재미 없다고 느낄 때쯤 개발자를 찾으면 오로지 인성만 보고 뽑는다. 개발 실력을 정말 어릴적 부터 닦아서 주변 사람들보다 개발을 너무 잘해서 나오는 자신감과 그런 실력으로 주변 사람들의 칭찬에 길러져서 흡사, 온실속의 밝은 화초가 아니라면, 사실 다 고만고만하게 보이는게 사실이다.
인성을 보는 방법은 쉽다. 에베레스트를 올랐던, 다른 분야에서 1등을 했었던. 정말 뭔가 열심히 해서 결과를 내려고 부단히 노력했었던 사람이라면 또 그것을 다른 사람을 위한 행동이었다면 개발 분야에서도 똑같이 적용된다.
우리 분야는 학문적으로 너무 들어가는 깊이를 항상 경계하기 때문에 그 경계가 풀리면 무한히 재미있는 세계가, 또 그런 세계가 여러개 기다리고 있다. 단점은 시간이 너무 빨리 가서 어느 순간 늙어 있는 자신을 발견하면 좀 벙찐다.
===== 화사 첨족 ==========
제주도 차 가지고 가는 방법
배 출발 후 바로 쓴다. 배타고 나서 할게 없다. ㅠ
수원에서 외롭게 운전해서 간다. 12시(자정) 출발했는데 첫번째 휴게소에서 잠들어서 두시까지 잤다.
다섯시 반에 도착. 두시간 잔거 빼면 세시간 반 걸린다. 고속도로로 다 이어져 있고 평일인걸 감안(정체현상 제로) 휴게소 시간 합하면 다섯시간 반 걸린다고 보자.
일곱시부터라고 되어있지만 여섯시 반부터 차를 싣는다. 걍 운전하고 들어가면 된다.
참고로 여수 엑스포 옆에 여객 터미널이 있다. 예약 안하고 왔어도 일단 차부터 싣는다. 난 예약했다. 평일은 예약 안해도 될 것 같다.(주말은 경험이 없으니 모름) 차를 배에 선적하고 화면에 보이는 사무실로 가서 계산 한다.(예약으로 결재한 사람도 무조건 들러야 한다)
이층 주차장이 안에 있다고 보면 된다. 안내하시는 분들이 많으니 가라는데로 가서 주차하면 된다. 바퀴 결박해주신다.
원래 가격은
이거다. 그런데 6월 차량 가지고 온 탑승객은 일등실 업글 이벤트를 했다. 땡잡음 ㅋㅋㅋ 일등실이랑 특등실은 2인 이상이기 때문에 혼자오면 2등실을 잡는게 맞다.(뭐 돈 ㅈㄹ해도 되긴 함)
뱃사람들 격하지만 인심은 잘 안다. 지나가면서 눈썰미를 발휘하니 이벤트 아니라도 어르신들은 다 업글 해주는 듯하다.(하지만 말할 수 없다는... 진짠가?)
배는 참 크다. 내부는
4인실이 이렇다. 밤새 운전했으니 자고 일어나면 제주도일 듯. 레스토랑도 있고 화장실에 비데도 있고 기타 등등 적을게 많다. 그러나 {제주도에 차 가져가기}는 충분히 이야기 한 듯. 참고로 세월호 여파로 사라진 해운업 회사 많다. 블로그 포스팅 믿지 말고 예약하려면 직접 선사와 연락해서 회사가 있는지 확인해야 한다. 여수보다 완도가 제주도에 가깝지만 운전하기가 싫었다.(여수 엑스포가 있으니 도로가 잘 되어있을거라 판단함) 고향 부산에서는 제주까지 7~8 시간 이라고 했다. 완도는 세네시간, 여수는 다섯 시간이라더라.
참고로 이 정도 파도에서는 어린이와 온다고 해도 배 멀미 걱정 안해도 되겠다. 흔들림은 거읭 없다. 시동 걸어놓고 정차된 자동차 안에 있는 기분.
이등실엔 이불이 없다 ㅠㅠ
밖에는 커다란 재떨이식 쓰레기통이 있다.
애연가 분들은 담배불 붙이기는 힘들어도 좋을 듯. 터보라이터로 준비하시길.
전화도 계속 잘 터진다. 대한민국만세. LTE 는 조금 느린 기분.
제주항으로 도착합니다. 두시에 항구 근접!
정박 직전에 밖에서 구경하고팠는데 엄청난 배기가스가 바람을 이용하여 얼굴을 때려 안으로 들어갔다.
차를 가지고 가실 분께 도움되셨길.
http://www.hanilexpress.co.kr/external/ticket/login?returnurl=reservation
Hanilexpress
www.hanilexpress.co.kr
2016 9월 업데이트
제주에서 여수로 가는 것은 10시 도착이더라. 목포 도착으로 하면 6시 30분쯤 온다고 한다. 똑같이 제주 4 부두고 12시 40분에 와서 차량 싣고 면세점 쇼핑하고 탔다. 입석인데 더 비쌌다.
그래도 제주 생활 정리하고 바다보고 바람을 맞으며 가는 이 길이 마냥 즐겁다. 경기도 계신 분들께는 목포로 복귀를 추천 드린다. 휴게실에 책 놔두고 옆에 못 앉게 하는 사람들 많던데.... 쫌...
바람이 워낙 쎄서 몸이 날아갈 것 같은데 덩달아 꿀꿀한 기분도 함께 날아가는 기분.
두시에 출발하니 골드스텔라가 들어온다. 골드스텔라는 네시 반 출발에 열시 여수 도착이라 수원까지 운전하려면 빡실듯
바다를 보다 두시간 20분쯤 지나면 풍경이 펼쳐진다.
7시에 도착. 보통은 6시 반 도착이라고 한다. 귀경길은 서해안 고속도로 타다가 공주쪽으로 빠졌다가 경부타고 왔는데 휴게소에서 밥 먹고 집에 11시에 집에 도착했다.
목포 출발 제주 도착은 밤에 출발한다고 들었다.
혹 제주도에 다시 차 가져갈 일 있으면 여수와 목포를 잘 이용하려고 한다.
'XaaS > FireBase' 카테고리의 다른 글
폐쇄적 환경, 불특정 다수를 위한 firebase storage setting (0) | 2019.01.21 |
---|---|
제주도 항공 촬영 (0) | 2019.01.19 |
C의 struct와 Swift 의 struct (0) | 2019.01.19 |
userDefault 활용 (0) | 2019.01.16 |
iOS UI 기초 - Swift UI (2) | 2019.01.03 |
최근댓글