[GA] 번갯불에 콩 구워먹듯이 GA! - 도입

이미지
[GA] 번갯불에 콩 구워먹듯이 GA - 도입 본 포스팅을 구글 애널리틱스를 이용해 빠르게 실무에서 보고서를 작성해야만 했던 경험의 시행작오를 기록하려 한다. 무작정 문제를 마주하면서 궁금한 부분에 대하여 찾아보면서 문제를 해결하는 방식으로 진행된다. 처음 부터 차근차근 모든 것을 알아가고 싶다면 다음 페이지를 모두 읽어 보는 것을 추천한다. 구글 애널리틱스를 공부하는 방법은 크게 3가지가 있다. Analytics Academy 애널리틱스 고객센터 애널리틱스 개발자 애널리틱스 아카데미는 강의를 들으면서 내용을 이해 할 수 있지만 너무 방대하기에 빠르게 스킬을 익혀야 한다면 비추천이다. 애널리틱스 고객센터는 실제 원하는 것을 얻어가면서 구글링의 결과로 만나게 될 것이다. 애널리틱스 관련 서적을 사는 것보다 이 곳 에서 검색을 하는 것이 훨씬 효율적이다. 책은 이 고객센터를 친철하게 번역해서 출력해 놓은 느낌이다. 애널리틱스 개발자 페이지는 실제 개발하지 않으면 잘 들어가지 않는다. GA는 데이터의 수집 -> 데이터 전처리 -> 설정 -> 보고서 작성 의 순서로 동작한다. 자세한 동작원리는 다음 포스팅에 작성하겠다. 우리는 GA도 없고, 데이터를 수집할 웹페이지도 없다. 그렇기에 구글에서 제공해주는 데모 페이지와 데모 GA를 사용해 스킬업을 한다. 데모 GA 데모 페이지 처음 GA의 메인 페이지를 열었을 때의 느낌이 아직도 생생하다. 멋진 그래프에 많은 숫자들이 이미 대단한 것을 이룬 것 같은 느낌을 주었다. 하지만 그 다음에 어떤 정보를 봐야 하는지를 몰라 탭을 누르는 순간 펼쳐지는 수십개의 하위 페이지들. 각각의 페이지가 주는 정보들이 다 의미가 있기 때문에 원하는 정보를 자유롭게 다루러면 모든 탭을 열어서 모든 정보가 의미하는 바를 보는 것이 맞다. 하지만 그러면 우리는 당연히 야근행일 것이다. 야근을 하지 않기위해. 빠르게 결과물을 보기위해 이 포스팅

[IOS] IOS 디자인 패턴 - MVC(Model-View-Controller) 맛보기

이미지
[IOS] IOS 디자인 패턴 - MVC(Model-View-Controller) Model - 데이터에 관한 로직 View - 사용자에게 보여지는 화면 Controller - Model과 View 사이의 동작관리 사용자가 블로그 앱에 글을 작성했을 때, View가 변하게 된다. 이때 Controller는 View에서 입력된 값들을 모델로 전달 해준다. 만약 필요한 경우 Model에서 값을 계산해야 한다면, 결과값을 Controller에게 전달한다. Controller는 전달 받은 값을 바탕으로 View를 업데이트 한다. MVC 디자인 패턴은 이렇게 역할에 따라 구조가 나뉜다. UI를 바꾸고 싶으면 View를 수정하면되고, 데이터 처리 로직을 수정하고 싶으면 Model을 손보면 된다. 위에서 설명 했듯이 Model에서 View로 접근하는 일은 없다. 반대로 이야기 하면, Controller가 중간에서 Model에게 View가 보낸 값을 전달해주고, Model의 결과값을 View로 전달 해 업데이트 할 수 있게해야한다. View -> Controller : Delegate를 사용하여 해결(Controller가 View의 변경사항에 대응할 수 있음) Model -> Controller : Notification을 사용하여 해결(Model의 값이 변경되었을 때 Controller에게 전달) Controller -> View : 업데이트 한다. Controller -> Model : 업데이트 한다. 역할을 단순하게 나누어 빠르게 구현할 수 있으나, View lifeCycle 코드가 Controller에 위치하기 때문에 Controller가 커진다.

[dev] 오픈소스 기행문 - 문서번역 (만화로보는 https 동작원리)

이미지
[dev] 오픈소스 기행문 - 문서번역 오픈소스 기행문 - 문서번역 만화로보는 https 동작원리 오픈소스에 어떻게 기여하면 좋을지 계속 고민하던 중 처음 기여하기 좋다는 번역을 할 기회가 생겼다. 읽어보면 좋을만한 문서라고 소개받았는데, 원서였다. 읽어봤을 때 내용이 굉장히 마음에 들었다. 한글로 된 자료가 있으면 좋을텐데라는 생각을하다가 내가 번역을 하면 되겠지라는 생각이들었다. git에 바로 기여할 수 있는 형태가 아니라 관리자에게 번역문의를 했고, 흔쾌히 수락 해주었다. 문서는 만화였고, 생각보다 길었다. 번역작업을 하는 중 돈도 안받고 번역을 하는 이유는 정말 공익을 위해서구나 라는 생각을 많이 했다. 나도 한글로 된 문서를 많이 읽었으니, 누군가를 위해 한글로 된 자료를 남기고 싶다 라는생각이 많이 들었다. 나의 번역에 대해 어떻게 검증을 하는지는 잘 모르겠으나, 보내준대로 게시해주었다. 엄청 부끄럽고 창피하기도 했으나, 많은 사람들이 공유하는 것을 보고 내 생각보다 더 의미있는 일을 했다는 생각에 뿌듯했다. 또한 게시 후에 티셔츠와 작은 선물을 보내줄테니 주소를 달라는 요청을 받았다. 코로나 때문에 언제 올지는 모르지만 오면 착샷이라도 남겨야겠다. 처음 기여를 해보니 오픈소스에 기여하는 재미와 이유가 좀 더 명확해졌다. 조금 더 찾아보고 다음에는 버그픽스 정도의 기여를 할 수 있기를 바라본다.

[dailycoding] 위장

이미지
[dailycoding] 위장 문제 clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다. 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다. 같은 이름을 가진 의상은 존재하지 않습니다. clothes의 모든 원소는 문자열로 이루어져 있습니다. 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 ‘_’ 로만 이루어져 있습니다. 스파이는 하루에 최소 한 개의 의상은 입습니다. 입출력 예 clothes return [[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]] 5 [[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]] 3 해결의 과정 문제는 단순히 수학문제에서 마주할 수 있는 조합의 문제이다. 옷의 종류가 a,b,c가 있다면 a b c가지가 있다. 하지만 옷을 입지 않은 가짓수도 있기 때문에 (a+1)(b+1)(c+1) 가지의 조합이 나온다. 마지막으로 하나도 입지 않은 가짓수는 제외해야하기 때문에 (a+1)(b+1)(c+1) - 1 을 계산한다. 입력 받은 옷 중에 같은 이름은 없기 때문에 결국 옷 종류별로 몇개씩 있는지만 고려하면된다. 옷 종류별로 몇벌씩 가지고있는지 계산한다. 종류별 옷을 전부 +1 한뒤 곱한다. 마지막에 -1을 해준다. import Foundation func solution(_ clothes:[[String]]) -> Int { var clothType : [String : Int] = [:] var answer = 1 clothes.forEach {item in // 옷 종류별 갯수를 계산한다. if clothType.keys.contains(item[1]){

[dev] Opensource에 처음 기여해보고 싶어서 찾은 내용

이미지
Opensource에 기여하기 오픈소스에 기여해보는 첫 발을 내디딘기념 오픈소스를 시작하게 된 동기 개발자로 성장하면서 계속 가지고있던 갈증 중 하나는 협업 이라는 키워드였다. 결국 좋은 개발자란, 다양한 사람들과 다양한 일을 할 수 있는 개발자 일테니 말이다. 회사에서 하는 일도 성장에 도움이 되지만 자신이 생긱하기에 재미있어 보이는 프로젝트에 좋아하는 만큼 기여해보고 싶다라는 막연함으로 오픈소스를 찾게되었다. 하지만 이번이 첫 도전은 아니다. Github을 처음 알았을 때도, 오픈소스에 관련된 세미나를 들었을 때도 항상 꼭 컨트리뷰터가 되어야지 마음만 먹고 프로젝트만 뒤적뒤적거리다가 접은적이 한 두번이 아니었다. 그래서 이번에는 어떤 프로젝트에 기여하면 좋을지에 대한 검색 방법에 대해 찾아보았다. 이전에 받았던 조언들은, 너가 평소에 쓰는 서비스에서 불편한 점을 개선해 보아라, 오탈자 수정, 문서화작업을 해 보아라 라고 받았지만 와 닿지가 않았다. 그래서 이번에 선택한 방법이 내가 사용하고 있는 언어로 기여할 수 있는 프로젝트 찾기 와 Open source alternative 라는 키워드였다. 결국 처음에 받은 조언과 같은 맥락이다. 하지만 느끼는 시각을 다르게 해 주었다. 내가 돈내고 쓰고있는 어플리케이션에 대해 알아보는 시간과 어떻게 구현되었을까에 대한 호기심이 소스코드를 들여다보게 만드는 원동력이 되어주었다. 검색경로 hacktoberfest 오픈소스를 프로젝트 찾기를 검색하다보면 가장 먼제 눈에 띄는 페이지 중 하나가 핵토버페스트 이다. Details 페이지에 접속해보면, 친절하게 PR을 날리는 방법 어디서 어떻게 날리면 좋은지도 알려준다. ● Up For Grabs ● Issuehub.io ● First Timers Only ● Your First PR ● Awesome for Beginners ● This is another great guide Github Issue

[swift] table view를 처음 써보고 남기는 글

이미지
[swift] table view basic TableView Main.storyboard에서 Library(⌘ + ⇧ + L)를 열어서 Table view controller를 추가한다. 처음에 만들면, 진입 포인트가 없기 때문에 Attribute inspector에서 is initial view controller 를 체크해 최초 진입 포인트로 지정해준다. table view cell은 만들어 놓고 재 사용할 수 있다. cell은 identifier를 이용해 식별 할 수 있다. identifier에 이름을 줘보자. 이제 테이블을 구현해보자. 먼저 테이블의 줄 수를 정한다. // 1000 줄짜리 테이블을 그려준다. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1000 } 빈칸이 무수한 테이블이 생겼다. 이제 내용을 채워주자 // 테이블의 셀에 내용을 채워주지 않아 아무것도 그려지지 않는다. // Attribute inspector의 Accessory에서 checkmark를 선택해준다. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ChecklistItem", for: indexPath) return cell } indexPath는 행을 식별하기 위한 식별자이다. [section,row]의 형태로 이루어져있다. section은 table을 나누는 기준 중 하나이다. row는 의미 그대로 테이블의 행이다. // 특정 조건을 줘서 출력해보자. override fun

[git] git을 사용하는데 필요한 기본 개념과 기본 용어 정리

이미지
[dev] git 다루기 깃 개념 정리 깃을 알고 있다고 생각하고 쓰면서, 평소와 다른 문제가 일어나면서 깃에 대한 개념이 부족하다고 생각되어 찾아 본 내용들을 정리했다. 자세한 내용은 블로그 보다는 Git book 정독하는 것을 추천한다. 기본 사용 플로우 리모트에 있는 소스코드를 받거나(clone), 새로운 프로젝트를 시작한다. 변경사항을 저장(commit)하고, 리모트에 반영(push)한다. 이미 존재하는 소스코에서 독립적으로 작업을 진행해야 하는 경우에는 새로운 브랜치(branch)를 생성해 작업을 한다. 작업이 완료 된 후에, 갈라져 나온 origin branch에 merge되거나 rebase를 한다. Merge and Rebase mrege는 기존 존재하던 브랜치에 병합(merge)하는 기능이다. 기존 브랜치에 작업 내용이 없다면, fast-forward merge를 이용해 병합을 하거나 기존의 브랜치에도 작업 내용이 있다면, 3-way-merge 방식으로 각각의 브랜치의 작업 내용을 남겨놓고 하나의 브랜치로 병합한다. master 에서 slave를 merge해주면, master브랜치로 slave가 병합된다. rebase는 커밋 내역을 재정렬 해서 하나의 브랜치로 합쳐준다. 결과적으로는 한 갈래의 브랜치를 만들어준다. rebase해준 최신의 커밋으로 정렬되고 checkout 되어있던 브런치의 커밋이 먼저 정렬된다. slave 에서 master를 rebase해주면, master브랜치로 slave가 병합된다. Stash 아직 마무리 하지 않은 작업이 있지만, 다른 작업을 해야해서 변경사항을 저장해야 할 때는 어떻게 해야할까? 커밋해서 저장하기에는 내키지 않는다. 이럴 때 쓰는 명령어가 Stash 이다. 아직 마무리하지 않은 작업을 스택에 잠시 저장할 수 있도록 하는 명령어이다. 다음과 같은 파일을 Stash할 수 있다. Modified이면서 Tracked 상태인 파일 Stagi