Intro 사실 나는 깃에 대한 이론 공부를 꽤 많이 했었다. 처음 개발을 시작했을 때부터 특강도 자주 듣고, 연습도 해봤지만 이론만 알고 실무에서는 막상 제대로 써 본적이 없었다. 혼자 작업하면 브랜치를 따로 팔 일도 없고, 맨날 커밋 푸시만 하게 된다ㅜㅠ 또 얼마 전에 git reset -hard 로 레포를 크게 날린 적이 있었기 때문에 (미리 백업을 해두어서 복구는 잘 했지만...) 한동안 깃을 쓰는걸 피하고 있었다. 회사에서 깃을 날리면 정말 큰일이 날 수 있으므로 이번기회에 잘 정리해보려고 한다! 서론 개발자들은 왜 깃을 쓸까? 단순히 코드를 저장하는 곳 보다는 깊은 의미가 있다. 굳이 코드를 저장하기 위한 용도라면 그냥 드라이브를 쓰는게 더 편할수도 있다. 복잡한 깃을 쓰는 이유는, 깃은 **..
올바르지 못한 코드 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { // Load resources for iOS 7 or later } else { // Load resources for iOS 6.1 or earlier } 사유 1: Version numbers aren’t always a simple floating-point number, for example “4.2.1” is a valid iOS version number. 2: You’re doing raw floating point comparison. Due to the finite precision of floating point numbers, your comp..
Functional Programming은 "자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다" . OOP나 절차지향같은 프로그래밍 방법들을 배운 것처럼, 함수형 프로그래밍도 그의 한 예제이다. Functional Programming의 가장 큰 특징 중 하나는 순수함수이다. 순수함수란, 부작용(side-effect)이 없는 함수, 즉, 함수의 실행이 외부에 영향을 끼치지 않는 함수를 뜻한다. 순수함수는 입력으로 주어진 것 외의 연산은 실행 하지 않음 순수함수는 부수효과(side effect)가 없어야 함 입력이 동일하면 출력이 동일해야함 상태의 변화가 없어야함 add(1,2) 이런 함수는 순수 함수라고 볼 수 있다. 어떤 값이나 상태를 바꾸지도 않..
var anOptionalInt: Int? = 10 var anotherOptional = anOptionalInt ?? 0 '??' 코딩하면 자주 보게되는 연산자다. 이런 간단한 코드가 있다고 해 보자! 옵셔널 값인 a가 nil이 아니면 옵셔널 아닌 그냥 int에 담아주는 코드이다. 이런 상황에서 저렇게 길게 코드를 안쓰고, 연산자로 한방에 해결하기 위한게 nil병합연산자 다. 이렇게 쓰면, a가 nil이 아니면 a값이 ! 되어서 나오고, nil이면 0이 들어간다.
Call this method when you want the current object to be the first responder. Calling this method is not a guarantee that the object will become the first responder. UIKit asks the current first responder to resign as first responder, which it might not. If it does, UIKit calls this object's canBecomeFirstRespondermethod, which returns false by default. If this object succeeds in becoming the fir..
textField.pattern = "[a-zA-Z]" 회사에서 코드 살펴보다가 이런 코드가 있었는데...! 뭐였을까 찾아보는 중이다. 정규표현식이라는걸 찾아서 내용을 정리해보려규 한다. 일단 swift에는 정규표현식 라이브러리가 있다. NSRegularExpression..!이라고 부른 것! NS가 붙었으니 Objective-C로 짜여졌다는 것도 알 수 있다. 예제로 좀 더 살펴보자! 만약 내가 인스타같은 서비스를 개발중인데, 해시태그(#)가 붙어있는 단어들만 추출한다고 해 보자. if문으로 떡칠하기에는 나는 너무 바쁜 개발자다. 야근 시렁 그럼 어떻게 하면 좋을까?? 왠지 똑똑한 사람들이 이미 이런 기능을 만들어 뒀을 것 같은 기분이 들지 않는가???? 그걸 해주는게 바로 정규표현식이다. 우리는 정규..
$0, $1 단축 인자 이름은, 클로저의 매개 변수 순서대로 $0, $1 ... 이렇게 간다!! result = calculate(a:10, b:10){ $0 + $1 } (심지어 return도 안써줘도 된다... 자동으로 알아...) result = calculate(a:10, b:10, method: { ( left:Int, right:Int ) -> Int in return left + right } ) 일반적인 클로저 폼⭐️⭐️ 난 처음에 in이 뭔지 몰라서 꽤 헤맸는데, 허무하게도 그냥 키워드였다고 한다. ㅜㅠ 클로저에는 여러가지 것들이 더 있는데, 대표적으로 후행 클로저, 반환타입 생략, 단축 인자이름, 암시적 반환 표현 등이 있다. 후행 클로저는 진짜 이상하다 (사실 왜 만들었는지 모르겠음 ..
https://zeddios.tistory.com/302 Xcode ) Playground에 3rd party framework 추가하는 방법 안녕하세요 :) Zedd입니다. 오늘은 Playground!!!! 딱히 빌드도 안해도 되고, 자동으로 빌드가 돼서 그때그때 값을 볼 수 있죠. RxSwift를 해보고싶은데..빌드를 매번하긴 좀......................... Playground.. zeddios.tistory.com 이거 따라하면서 제일 밑 부분에서 막혔는데, 제일 밑에까지 내리면 Playground가 나온다! ++) 또 다른 에러가 났었는데, RxSwift 최신버전을 사용하지 않아서 생긴 문제였다.
scaling - scale to fill : 비율 깨지지만 parent에 맞게 꽉 채움. - scale aspect fit : 비율 지켜서 채우므로 여백이 생길 수 있음. - scale aspect fill : 꽉 채우는데 새어나올 수 있음. 원하지 않으면 .clipsToBound = false 하면 안잘림 positioning -> 위치만 바꿔 줌 - center - top - bottom - left - right - top left - top right - bottom left - bottom right redrawing 용도: 화면을 다시 그리게 해 쥼. 그래야 어플에 반영이 되니까. - redraw
[되는 기능] * reponse/request 메소드, * JSON parameter * response serialization * authentication [여기서 배울 것] * 파일 업로드 * RESTful API에서 데이터를 요청하는 작업 [기본적으로 알고 있어야 하는 내용?] * NSURLSession * NSURLConnection * Cocoapods 설치하기 [예시] - 촬영을 하거나 앨범에서 이미지를 Third-party 서비스에 업로드를 하면, 이미지를 인식하여 이미지에 대한 태그와 이미지에 대한 색상을 알려주는 앱 Imagga는 이미지 인식 Platform-as-a-Service. 사진을 업로드할 url은 content endpoint를, 이미지 인식에는 tagging endpoin..
가정 '그림'과 같이 방향이 없는 weighted edge로 구성된 그래프라고 가정한다. 방향이 있는 edge도 가능하다. 결과 내가 정한 시작 노드 한 개에서 모든 노드로 가는 가장 빠른 길과 cost를 알 수 있다. 과정 초기화 먼저 시작 노드를 정한다. (나는 U라고 정했다.) U에 인접한 노드들의 distance를 저장해준다. 루프 저장한 노드들 중에 가장 빠르게 갈 수 있는 노드를 고른다. 그리고 그 노드에서 갈 수 있는 길들을 찾아서 업데이트 해준다. (기존 distance와 새로 찾은 node를 통해서 가는 것중에 짧은 distance로 업데이트 한다. distance = min(저장된 값, 새로 찾은 노드까지 가는 값 + 새로운 노드에서 원하는 노드까지 거리)) 모든 노드를 방문할때까지 반..
트리를 사용해서 '집합'을 표현해보자 집합의 모든 원소는 0, 1, 2, ..., n-1이라고 가정한다. 모든 집합은 disjoint된다고 가정한다. (각각 집합들끼리 겹치는 원소가 없음) 얘는 0~9인 예제이다. 집합에 대해 수행하고자 하는 연산은 다음 두 가지이다. (1) disjoint set union (2) find(i) (1)은 A∪B를 할 수 있다는 의미, 즉 (2)는 원소 i가 속한 집합을 리턴받는거 가능 A∪B을 하려면 어케 할까... 두 트리중 하나를 다른 트리의 서브트리로 만들면 된다. 저 위에 그림에서 S1 ∪ S2를 하려고 하면, 하면 되는것처럼 말이다! 두가지 함수를 짜보자! void simpleUnion(int i, int j){ parent[i] = j; } int simpl..
forest F에 대응하는 binary tree T의 preorder, inorder traverse는 F의 순회와 자연스러운 대응 관계를 가진다. [Preorder Traverse] T의 preorder traverse는 다음과 같이 정의된 forest preorder로 F의 노드들을 traverse하는 것과 동일하다. (1)F의 첫번째 tree의 node 방문 (2)첫번째 tree의 subtree를 preorder traverse한다. (3) F의 나머지 tree들을 preorder traverse한다 [Inorder Traverse] T의 preorder traverse는 다음과 같이 정의된 forest inorder로 F의 노드들을 traverse하는 것과 동일하다. (1)F의 첫번째 tree의 ..
중앙대학교 소프트웨어대학 강현철교수님의 "자료구조" 과목을 듣는 과정에서 학습 목적으로 작성한 포스트입니다. Selection Tree(선택 트리)는 merge sort에 사용하는 특수한 구조를 가지는 트리 자료구조다. selection tree에는 크게 winner tree와 loser tree가 있다. 다른 말로는 tournament tree라고도 불린다. (merge sort가 뭔지 모른다면 merge sort를 공부하고 와야 이 포스팅을 이해할 수 있다..!) 쪼갠 리스트들을 합치는 과정에서 각 리스트의 최솟값(최댓값)들을 비교해야 하기 때문에 n/2 , n/2개를 합칠때마다 (n-1)번의 비교횟수가 필요하다. 이걸 줄이기 위해서 선택트리를 이용한다. #include #include #includ..
참고영상 : https://firebase.google.com/docs/dynamic-links/ios/create iOS에서 동적 링크 만들기 | Firebase Firebase Dynamic Links Builder API를 사용하여 짧거나 긴 동적 링크를 만들 수 있습니다. 이 API는 긴 동적 링크 또는 동적 링크 매개변수가 들어 있는 객체를 취하며 다음 예와 같은 URL을 반환합니다. https://example.com/link/WXYZ https://example.page.link/WXYZ 기본 요건 Firebase 동적 링크를 사용하려면 iOS 8 이상이 필요합니다. 앱에서 iOS 7을 타겟팅해도 되지만 firebase.google.com ** 주의 !! 이 기능은 '애플 개발자 계정' 이 ..
WWDC 2019 처음본 나름 후기 : 애플은 진짜 미쳤다. iOS 13 발표, 아이폰 다크모드, 아이패드 전용 OS, 6년만의 맥프로, 새 맥 os인 캐롤리나, 아이패드가 맥북 외장모니터로 사용가능하게 지원, 그리고 대망의 swiftUI.......지금까지 나름 iOS개발 열심히 해왔는데 스위프트유아이 발표로 내 코드가 다 쓰레기가 되어서 슬프다..... 다 배우기도 전에 바뀌어버렸자너;; 이것이 프론트 개발자의 숙-명인가 그리고 wwdc를 보면서 꼭 내년 wwdc에 가고싶어졌다 하지만 600만원은 없으므로 scholarship을 노려보는걸루,,,
한참을 고생했는데, https://stackoverflow.com/questions/41515999/python-manage-py-collectstatic-noinput-error-when-deploying-django-project-to python manage.py collectstatic --noinput error when deploying Django project to Heroku I've recently encountered a static files error when deploying my Django project again to Heroku. I've deployed the project to Heroku once already previously (without static file..
Forest로 시작한다. 장점 : 트리가 여러개 나올 수 있다.
Binary search tree는 탐색, 삽입, 삭제, 연산에 있어서 지금까지 공부했던 어떤 자료구조보다도 성능이 좋다고 한다!! 열심히 공부할 이유가 되는군!! [Definition] (1) 모든 원소는 키를 가지며, 어떤 두 원소도 동일한 키를 갖지 않는다 (2) 왼쪽 subtree에 있는 키들은 루트의 키보다 작다 (3) 오른쪽 subtree에 있는 키들은 루트의 키보다 작다 (4) 왼쪽, 오른쪽 subtree도 모두 binary search tree이다. BST(binary search tree, 앞으로는 BST라고 부를게요) 의 가장 큰 특징은, inorder로 traverse했을 때 작은 순서대로 라는것 !!
이렇게 생긴 max heap에서 root인 50을 지운다고 해 보자. 우리가 쓰는 알고리즘은 가장 오른쪽에 있던 값을 떼서 루트에 넣고 본다.(대책 노...) 이제 adjust를 하는데, 31이랑 49랑 바꿔본다. 31이랑 또 48이랑 바꾼다. 이러면 다시 max heap의 조건을 충족한다. 근데 바꾸는 기준이 뭘까?? 44랑 바꿔도 max heap은 됐는데...? 이건 코드를 보면 알 수 있다. //코드가 정말 보기싫다. 다음에 정리하자
이런 max heap에서 원소 하나를 삽입한다고 해 보자. complete binary tree의 조건을 만족하려면, 원소 하나가 들어갔을 때 트리는 무조건 저 자리에 들어갈 수 밖에 없다. 삽입되는 원소의 정확한 위치를 결정하기 위해서는, 트리의 새 노드에서 시작해서 루트 쪽으로 올라가는 bubbling-up 방법을 사용하면 된다고 한다. 삽입되는 원소는 삽입이 완료된 뒤, 최대 힙이 되는 것이 확인될 때 까지 위쪽으로 계속 올라간다. 예를 들어서 생각해보자! 새로운 원소가 30이라면, 바로 저 자리에 넣으면 된다. 그러나 값이 49이면 넣을 수 없다. 그러므로 31을 검은색 위치에 넣고, 최대 힙이 되는지 본다. 여전히 안 된다. 그럼 48을 그 자리에 넣는다. 여전히 안된다. 51을 그 자리에 넣는..
1. priority queue란? 우선순위 큐에서는 우선순위가 가장 높은, (또는 낮은) 원소를 먼저 삭제한다고 하고, 임의의 우선순위를 가진 원소를 우선순위 큐에 삽입할 수 있다고 합니다. FIFO인 일반 큐와는, 우선순위 순서로 pop하는 기능이 다릅니다. 우선순위 큐가 왜 필요하냐면, 똑같은 기계를 쓰는 소비자 중에 3000원을 낼 사람, 1000원을 낼 사람, 2000원을 낼 사람이 있다고 하면 기계는 3000원을 낼 사람을 먼저 쓰게 해주고, 그 다음 2000원, 그 다음 1000원을 낼 사람 순으로 써주게 하는 것이 가게 주인 입장에서 최고이죠? 이런식으로 큐에 넣는 원소들에 우선순위를 부과해야 할 때, 우선순위 큐를 쓰면 됩니다. 이 경우는 max priority queue이고, 반대 경우..