스토리 홈

인터뷰

피드

뉴스

조회수 698

구글 애드워즈가 자연검색 트래픽 증가에 영향을 미칠까?

구글 애드워즈 배너 광고나 검색 광고가 자연 검색 트래픽에 영향을 미칠 수 있다는 것은 일반적인 디지털 마케팅 업계의 지식이 되어 왔습니다. 그러나 그 효과는 정확히 무엇이며, 어떤 과정을 거쳐 작동될까요? 오늘 오피노에서는 유료 광고가 유기적 결과에 영향을 주는 방식과 그렇지 않은 방식 중 하나를 다룰 것입니다 :) 많은 사람들이 의심해보았을 것입니다. "아, 우리는 Goolge AdWords에 많은 돈을 투자하기 시작했어! 그러니까 자연검색 트래픽이 올라갔어." 또는 "이봐, 우리는 Google에 많은 돈을 지출하고 있지만 경쟁 업체는 더 많은 돈을 지출하고 있어!. 그래서 쟤네들의 자연 검색 트래픽 증가율이 더 높은 거야!" 검색 광고에 대한 디스플레이 광고의 영향을 측정하고자 한 여러 연구가 있었지만 터키의 하버드 (Harvard)와 오지 겡 (Ozyegin) 대학의 연구자는 이 연구를 제대로 조사하려 했습니다. 그들의 연구 결과는 하버드 비즈니스 스쿨 (Harvard Business School)의 "Display Ads Influence Search? 온라인 광고의 간접 기여와 역동성"이라는 제목으로 게재되었으나, 이 문서는 학문적 전문 용어, 사회 과학 모델링 토론 및 다른 연구에 대한 언급과 같은 학술적 글쓰기 규칙에 따라 어려움을 겪기 때문에 지루하고 읽기가 어렵습니다.그래서 제가 간단히 정리를 해드리려고 합니다.결론 및 통찰력은 유의미하지만, 다음과 같이 요약할 수 있습니다.- 디스플레이 광고는 더 많은 검색양, 클릭, 전환에 기여한다.- 검색 광고는 디스플레이 광고의 상호작용을 증가시키는 것에는 딱히 기여하지 않는다.- 하지만, 디스플레이 노출 광고의 효과는 즉각적이진 않으나 평균적으로 2주 정도 이후에 발생하기 시작한다.- 마케터들은 단순한 계산이나 측정 항목으로는 디스플레이 광고의 ROI나 CPA를 결정하기에는 한계가 있다.이러한 인사이트는 온라인 광고를 사용하여 새로운 당좌 계정 고객을 확보하는 검색 및 디스플레이 광고 지출 및 전환 데이터 ( "미국의 대형 은행에서")로 깊이 파고들었습니다. 이 데이터는 2010 년에 나온 것입니다. 올해 온라인 은행의 온라인 광고 예산은 약 1 백만 달러였으며 검색과 디스플레이 간에 거의 균등하게 분배되었습니다.이 학술 논문에서 몇 가지를 발췌한 내용들이 있습니다."디스플레이 광고는 클릭뿐만 아니라 검색 트래픽 증가에도 중요한 영향을 미치는 것으로 나타났습니다. 이 파급 효과의 대다수는 순식간에 발생하지 않았지만 평균적으로 2주 후에 적용되었습니다...""우리의 연구 결과에 따르면 업계에서 일반적으로 사용되는 단순 정적 통계는 온라인 광고의 효과를 정확하게 측정하지 못할 수 있습니다. 그래서 우리는 측정항목을 동적으로 가져와 광고의 효율성을 측정했습니다. 그 결과, 검색 CPA가 단순 정적 CPA보다 48% 낮아졌고, 반면에 ROI는 38% 증가하였습니다. 디스플레이 광고에서도 비슷한 패턴이 나타나는데 여기에는 또한 기여도가 포함됩니다. 이로 인해 디스플레이 CPA가 표준 CPA보다 14 % 낮아졌으며 투자 수익 (ROI)이 10 % 증가했습니다...""광고 효과에 대한 이러한 수정된 성과 파악 방법론은 [은행]이 현재 사용하는 것보다 매우 다른 예산 배분을 초래합니다. 특히 우리는 제안된 할당이 검색 응용 프로그램에 미치는 영향으로 인해 디스플레이에 대한 기여도가 높았음에도 불구하고, 검색 광고 예산은 강력한 동적 효과로 인해 현재 수준에서 36 % 증가해야 하며 디스플레이 광고 예산은 31 % 감소해야 합니다."결과적으로, 디스플레이 광고가 검색률 증가에 지대한 영향을 미친 다는 것은 위에 프레임 워크에서 알 수 있습니다. 그런데도 우리가 Google Display Network에 회의감을 갖고, 성과 파악이 어려운 것은 모든 데이터 분석 툴이 "Last Click"에 기여 모델을 중점으로 두고 있다는 것입니다.논문 원본 : https://www.slideshare.net/gesterling/do-display-ads-influence-search?from_action=save다음에는 광고 성과를 제대로 분석하기 위한 "기여 모델(Attribution Model)"과 "교차 기기 트래킹" 대하여 심도 있게 얘기해보도록 하겠습니다.퍼포먼스 마케팅 에이전시, 오피노 바로가기
조회수 770

코호트 분석(Cohort Analysis)

올해 1월, Google Analytics(이하 GA)에서 Audience 카테고리에 Cohort Analysis(코호트 분석)라는 리포트가 추가되었습니다. 그런데 UI가 늘 보던 리포트와 달리 독특해서 이 리포트는 어떻게 데이터를 보고 해석해야 할지 막막하기까지 합니다. 일단 리포트보다 용어조차 생소한 코호트에 대한 이해가 필요합니다.( GA > Audience > Cohort Analysis Report )코호트 분석이란코호트 : 특정 기간에 특정의 경험을 공유한 사람들의 집합http://en.Wikipedia.org/wiki/Cohort_(statistics)코호트 분석 : 특정 기간에 특정의 경험을 공유한 집단간의 행동패턴을 비교/분석http://en.Wikipedia.org/wiki/Cohort_analysis리포트 조회 방법모바일 앱 분석에서 가장 많이 사용하는 코호트 분석은 같은 기간에 앱 설치를 경험한 사용자 그룹이 시간이 지남에 따라 앱의 꾸준한 사용여부(Retention)를 분석하는 것입니다. 앱은 설치보다 지속적인 재사용성이 앱 비즈니스를 좌우하기 때문입니다.( WISETRACKER > 방문행동 > Retention 리포트 )A열은 특정 기간에 앱을 설치한 사용자의 집단이며, +기간이 표기된 B열은 설치 시점으로부터 재사용율/삭제율을 제공하고 있는데, 여기서 데이터를 해석하기 위해선 데이터를 수직적으로 바라봐야 합니다.위 데이터로 예를 들면 다음과 같습니다.A : 2016년 12월 1일부터 5일까지 설치수가 꾸준히 증가하고 있다.B : 설치 후 하루가 지난 뒤 재사용률은 지속적으로 떨어지고 있고 오히려 삭제율이 증가하고 있다.코호트 분석 왜 필요한가첫째, 비즈니스 상황을 알 수 있다.위 그림의 데이터를 단순 앱 설치 추세 리포트로 보았다고 생각해봅시다. 설치수가 꾸준히 증가하고 있기 때문에 “우리 앱의 시장반응이 좋구나”라는 1차원적인 결과만 얻었을 것입니다. 그러나 코호트 분석을 통해 신규 고객 획득은 잘 이루어지고 있으나, 고객이 된 이후의 사용성이 떨어지고 앱을 삭제하는 비율이 점점 증가하고 있다는 사실을 인지함으로, 마케팅은 밑 빠진 독에 물 붓는 격이니 보다 고객관리/최적화에 먼저 집중해야 함을 알 수 있습니다. 이처럼 현재의 상황을 정확히 이해해야 더 나은 의사결정을 할 수 있습니다.둘째, 깊은 마케팅 인사이트 얻을 수 있다.보통 모바일 마케팅의 성과 지표로 얻을 수 있는 건 클릭수, 설치수 정도 입니다. 그러나 이것만으로 가치 채널을 도출하고 마케팅 전략을 수립하기엔 데이터가 부족한 것이 사실입니다. 같은 채널이라 하더라도 시점에 따라 게재하는 광고 내용도 다를 수 있고, 설치수가 많더라도 체리피커들 때문에 설치 후 바로 삭제하는(광고비만 날리는..) 비율도 꽤 높기 때문에 설치 이후의 데이터가 꼭 필요합니다. 코호트 분석은 특히 모바일 앱 기반의 스타트업에게 매우 중요한 분석기법으로, 사업 단계마다 우리가 잘하고 있는지 여부를 판단하고 더 나은 의사결정을 돕는 중요한 나침반 역할을 할 것입니다. * WISETRACKER는 모바일 광고 성과 측정부터 In-app 이용자/컨텐츠 분석, 푸시메시지 최적화까지 지원하는 모바일 통합 분석/타겟팅 솔루션입니다. 와이즈트래커 솔루션의 무료체험을 원하실 경우 여기를 클릭해주세요.* WISETRACKER가 제공하는 무료 데이터 분석 컨설팅를 원하신다면 여기를 클릭해주세요.#와이즈트래커 #데이터분석 #서비스소개 #코호트분석
조회수 1022

82% 의 아침잠을 깨우다

챌린저스를 런칭하고 한 달이 지났습니다. 저희는 사람들의 목표달성률을 높이기 위해 서비스를 만들었습니다. 이를 위해 돈을 걸고 목표를 달성할 수 있는 시스템을 준비했습니다. 사실 돈을 걸고 목표를 달성한다는 것이 아주 익숙한 개념은 아닙니다. 알려지지 않은 서비스에 선뜻 돈을 결제하기 쉽지 않다는 허들도 있었습니다. 그럼에도 런칭 후 초기 유저들의 입소문을 타고 가입자는 꾸준히 늘어났습니다. 한 달간 4,000명의 유저가 모였습니다. 하지만 숫자보다 주의깊게 관찰해야 하는 것은 고객들의 경험과 리뷰입니다. 중요한 것은 서비스가 고객들에게 실제적인 도움을 주었는지, 그 결과 얼마나 로열티있는 고객들이 생겨났는지라고 생각하기 때문입니다. 다행히 초기 유저들은 저희에게 긍정적인 피드백을 보내왔습니다. 서비스를 잘 쓰고 있다며, 좋은 서비스를 만들어줘서 고맙다고 또 한편으로는 응원한다는 메시지를 전해줬습니다.이**  "이런 앱의 존재 자체가 의지가 약한 저에겐 큰 힘이 되네요. 챌리저스를 통해 목표도 달성하고 소소한 수익도 얻을 수 있어 너무 좋습니다!!"주**  "실제로 참여하니까 생각보다 강력한 동기부여가 되네요. 근래 받은 어플중에 가장 잘 활용하고 있어요"S***  "앱 컨셉이 참신한 것 같아서 좋아요 잘 이용할 것 같아요!"J***  "너무좋은 앱입니다 작심삼일이 없어졌고 계속다시 실천하게 만들어주네요"*Google Play 앱 리뷰 발췌고객들의 반응에 저희는 큰 힘을 얻었습니다. 고객들의 삶을 진짜 변화시키고 있다는 생각에 자신감도 생겼습니다. 그래서 더 적극적으로 이 서비스를 많은 사람에게 알리고 싶었습니다. 돈을 걸고 목표를 달성한다는 것이 그만큼 효과적인 방법이라고 믿었기 때문입니다. 사람들이 생소해하는 부분은 문제이지만 동시에 기회라고 생각했습니다. 아직 널리 알려지지 않았기 때문에 이 좋은 방법을 더 열심히 알려야 한다는 의무감도 느꼈습니다. 하지만 단순 홍보보다는 사람들이 직접 이 서비스를 경험해보는 것이 필요하다고 생각했습니다. 돈을 걸고 목표를 달성한다는 것은 듣기에는 거부감이 들지만, 직접 경험하면 그 효과를 공감할 수밖에 없는 강력한 무기이기 때문입니다. 그래서 챌린지들을 하나씩 살펴봤습니다. 일반적인 환경에서는 달성이 쉽지 않은 챌린지들을 분류하고 이 중에서 달성했을 때 생활의 변화를 가장 크게 느낄 수 있는 챌린지를 골랐습니다. 그리고 고객들이 이 챌린지에 직접 참여할 수 있는 이벤트를 준비했습니다.2주간 평일 매일 아침 6시 일어나기사실 일찍 일어나기는 단순하지만 하루를 가장 크게 변화시키는 습관입니다. 일찍 일어나면 하루의 계획을 세우고 운동, 책읽기, 공부 등 내가 원하는 일들을 할 수 있습니다. 아침에는 방해요소가 적기 때문에 생산성이 높습니다. 아침에 계획했던 첫 일을 완료할 때 느끼는 긍정적인 에너지는 하루를 기분 좋게 만드는 힘이 있습니다. 성공한 많은 사람들이 좋은 습관으로 아침 일찍 일어나기를 추천하는 이유입니다. 하지만 그만큼 아침 6시에 일어난다는 건 쉽지 않은 목표입니다. 7시반이나 되어야 해가 뜨는 겨울에, 그것도 회식과 송년회로 가득찬 12월에는 더욱 쉽지 않습니다. 이벤트를 열자 생각외로 사람들은 속속 모여들었습니다. 선착순으로 100명을 마감한 후에도 혹시 참여를 더 할 수 없는지 물어오는 사람들이 있었습니다. 세상에 일찍 일어나려는 사람들이 이렇게 많구나 내심 탄복을 하며, 열정이 넘치는 아침형 고객 100분과 아침 6시 일어나기 챌린지를 시작했습니다. 챌린지 시작 전날 밤. 저희는 모두 콩닥콩닥 긴장하는 마음으로 잠이 들었습니다. '사람들이 규정을 잘 이해했을까', '혹시 문제가 생기지는 않겠지' 와 같은 각종 걱정에 새벽녘에야 선잠이 들었습니다. 물론 참가자분들의 긴장도는 한층 더 높았을 것입니다. 인증샷은 12/17 월요일 오전 5시부터 올라오기 시작했습니다. 피드 창을 보고있으니 여기저기서 나도 일어났다는 소식이 들려왔습니다. 중국에서 참여한 참가자도 현지시간에 맞춰 기상을 알려왔습니다. 꼭꼭 눌러쓴 글씨에는 이번 한주를 잘 살아보겠다는 담담한 각오가 담겨있었습니다. 첫 날의 설레는 마음을 전하는 메시지도 있었습니다. 그렇게 이벤트 첫날 86분의 고객들이 6시에 일어났습니다. 하지만 중요한 것은 하루의 성과가 아니라 목표를 얼마나 꾸준히 달성할 수 있는지 일 것입니다.둘째주에는 변수가 있었습니다. 바로 크리스마스죠. 크리스마스에는 누구나 조금씩 들뜨기 마련입니다. 나가놀고 싶은 마음과 이 시간을 온전히 즐기고 싶은 마음이 나도 모르게 동하는 날입니다. 파티분위기에 취하면 평상시의 생활 밸런스를 유지하기 쉽지 않습니다. 게다가 두번째 주라는 점도 목표 달성에는 불리하게 작용할 것입니다. 아무래도 첫주의 긴장감을 유지하기 쉽지 않고, 포기하는 사람도 생기기 때문입니다. 한 번 실패를 하게 되면 아예 포기를 하는 것은 아주 자연스러운 흐름입니다. 습관의 깨진 유리창 법칙이라고 할 수 있습니다.그럼에도 6시에 일어나야겠다는 참가자들의 의지는 강했습니다. 물론 첫주보다 성공률이 다소 떨어졌지만, 여전히 10명 중 8명은 아침 6시 기상에 성공했습니다. 챌린지 참가자 100명의 9일간 기상 성적은 82%. 12월에 아침 6시에 일어나기라는 난이도를 감안하면 높은 성공률이 분명했습니다. 이 쯤에서 다시 생각해 볼 것이 있습니다. 처음 이벤트를 생각했던 이유입니다. 성공률은 저희 서비스의 기본이기 때문에 당연히 체크해야 하는 지표지만, 챌린지에 참여한 고객들의 목표 수행 경험담 또한 주의깊게 살펴야 하는 부분입니다. 혹시 너무 경쟁적이진 않았는지, 인증방법은 너무 부담스럽지 않았는지, 전반적인 고객들의 참여 만족도는 얼마나 높은지를 살펴야 합니다. 결국 중요한 것은 고객들에게 좋은 경험을 선사하고, 그들에게 사랑받는 것이기 때문입니다. 이를 위해 저희는 챌린지가 종료될 때마다 참가자들로부터 별점과 후기를 받았습니다. 6시 기상 챌린지의 평균 평점은 5점 만점에 4.64점을 기록했습니다. 사람들은 장문의 후기를 전달했습니다. 인증을 놓친 아쉬움의 목소리도 있었지만 대개는 평소보다 얼마나 쉽게 일어났는지, 또 아침에 일어나서 한 줄 각오를 적는 것이 하루에 얼마나 긍정적인 효과를 주었는지에 대한 소감들이 많았습니다. 100% 목표를 달성한 한 참가자는 1500원이라는 상금을 탄 것에 아주 기뻐하기도 했습니다. 세상에는 다양한 목표달성법이 있습니다. 사람마다 목표를 달성할 수 있는 비결이나 습관도 당연히 조금씩 차이가 있습니다. 저희가 7년간 자기계발 커뮤니티를 통해 확인했던 가장 좋은 방법은 목표 달성에 돈을 거는 것이었습니다. 돈을 건다는 것은 높은 의지가 있음을 의미하고, 초반의 높은 의지를 유지할 수 있는 환경을 만들어줍니다. 돈을 걸기 전에는 '뭐 이런 데에다 돈까지' 라고 생각하던 사람들도 돈을 걸면 '오 이게 되네' 라는 신기한 감정을 느끼게 됩니다. 그리고 항상 목표를 달성해야 한다는 생각을 가지고 생활합니다. 목표가 있다는 건 나아가고 있다는 것을 의미합니다. 저희는 사람들이 원하는 방향으로 나아가는 것을 돕고 싶습니다. 이번 이벤트를 통해 저희도 원하는 방향으로 한 걸음 발을 내딛었습니다. 이벤트의 결과를 떠나 지금 있는 곳에 안주하지 않고 발을 떼었다는 데에 스스로 박수를 쳐주고 싶습니다. 앞으로 저희는 더 많은 사람들이 목표달성을 하는 데에 도움이 되는 서비스를 만들 것입니다. 당연히 이런 이벤트도 계속해서 해나가겠습니다. 2019년에는 더 많은 사람들의 목표달성에 챌린저스가 도움을 줄 수 있게 되길 바라며, 저희는 오늘도 각자의 자리에서 걸음을 뗄 준비를 하고 있습니다.챌린저스, 전국민 목표달성 프로젝트www.chlngers.com#생활습관 #챌린지 #목표달성 #보상
조회수 4543

오픈소스 라이브러리를 사용해보자, CocoaPods! (KOR)

Overview개발 도중 내용이 복잡하거나 소스가 길면 종종 오픈소스 라이브러리를 사용합니다. 쉽게 원하는 기능을 구현할 수 있기 때문이죠. 그렇다면 오픈소스 라이브러리는 어떻게 앱에 가져와서 사용할까요? 바로 ‘CocoaPods(이하 코코아팟)’을 쓰면 됩니다.What is CocoaPods?코코아팟의 공식 웹사이트에서는 코코아팟을 이렇게 소개하고 있습니다.“CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects”“코코아팟은 스위프트와 오브젝티브-C 코코아 프로젝트를 위한 의존성 매니저(dependency manager)다.”즉, ‘개발자가 편리하게 사용할 수 있게 오픈소스 라이브러리를 프로젝트와 연결해주는 환경 또는 도구’를 말합니다. 이로 인해 다양한 장점을 가지고 있는데요. 우선 코코아팟은 개발자가 개발한 앱에 라이브러리를 추가, 삭제, 업데이트 등의 관리를 할 수 있습니다. 예를 들어, 네트워크 관련 라이브러리를 개발자가 직접 개발하지 않고, Alamofire 라이브러리를 코코아팟으로 앱에 연결해 사용하는 것입니다. 둘째, 라이브러리 버전을 직접 지정하여 사용할 수 있어 업데이트 버전이 나와도 지정한 버전을 계속 사용할 수 있다는 점입니다. 만약 새로운 버전에 맞춰 개발할 준비가 되면 그때 업데이트를 하면 됩니다.CocoaPods에서 facebook을 검색하면 관련된 다양한 라이브러리가 나옵니다.How to use Cocoapods?1.코코아팟 설치하기개발한 앱에 사용할 오픈소스 라이브러리를 찾았다면 코코아팟을 설치해 앱과 연결해봅시다. 먼저 코코아팟을 설치하고 터미널 프로그램을 열어 아래와 같은 명령어를 입력합니다.$ sudo gem install cocoapods 그리고 CocoaPods Master Specs repository에 있는 Podspec file를 컴퓨터에 다운로드합니다. –verbose 명령어를 이용해 현재 진행 상황을 터미널에서 볼 수 있게 합니다.$ pod setup --verbose 이제 코코아팟을 사용할 준비가 되었습니다. Xcode에서 간단한 프로젝트를 만들고 끝냅니다. 이번 글에서는 관광명소를 보여주는 목록 앱을 예제로 만들겠습니다.2.라이브러리 연결하기터미널 프로그램을 이용해 방금 전 만든 프로젝트 경로로 이동하고, Podfile을 만들어 앱에 필요한 라이브러리를 설정합니다. Podfile을 만드는 방법이 두 가지입니다. 첫 번째는 pod init 명령어를 이용해 코코아팟이 기본 틀이 있는 파일을 생성하게 하는 것입니다. 두 번째는 개발자가 직접 빈 파일을 만들어 설정하는 방법입니다. 이번 글에서는 pod init 명령어를 사용하겠습니다. (편리합니다.)$ pod init podfile이 생성된 것을 확인할 수 있습니다.이제 Podfile을 열어 우리가 사용할 라이브러리를 세팅하고 코코아팟 공식 사이트에 접속합니다. 사용하고자 하는 라이브러리를 검색하고 이름 옆 클립보드 아이콘에 마우스 포인터를 올려보세요. Podfile에 복사할 텍스트가 나타날 겁니다. 이 텍스트를 복사하여 Podfile에 붙이고 저장합니다. 이 글에선 URL에서 가져올 이미지를 다루기 위해 SDWebImage 라이브러리를 사용하겠습니다.완성된 Podfile의 모습위의 Podfile을 잠시 설명하자면 프로젝트의 배포 타겟은 iOS 9.0 입니다. ‘use_frameworks!’ 은 코코아팟을 통해 프로젝트에 추가할 라이브러리가 스위프트로 작성되어 있고, 프레임워크를 사용할 것이기 때문에 꼭 추가해야 하는 문장입니다. 라이브러리 옆의 숫자는 4.3 그리고 4.4 이전까지 라이브러리 버전을 사용하겠다는 뜻 입니다. 최소한의 설정을 맞췄으니, 저장하고 다음 명령어를 실행합니다.$ pod install --verbose pod install 완료 후 xcworkspace 파일이 추가된 것을 확인할 수 있습니다.Pod 설치가 완료되면 xcworkspace 파일이 생성된 것을 확인할 수 있습니다. Xcworkspace 파일은 쉽게 말해서 프로젝트들의 컬렉션(collection of projects)입니다. 기존에 제작한 프로젝트(Original project)와 pods 프로젝트(Pods project)를 함께 묶는데, 이 pods 프로젝트 하나로 모든 라이브러리를 관리할 수 있습니다. 기존 프로젝트는 이 pods 프로젝트를 의존하기 때문에 xcodeproj 파일을 열면 연결된 라이브러리들에 대한 정보가 없어서(혹은 발견하지 못해서) Xcode 프로그램이 에러를 발생시킵니다. 그러므로 코코아팟으로 pod을 설치했을 때, 프로젝트는 xcworkspace 파일을 열어 개발해야 연결한 라이브러리들을 잘 사용할 수 있습니다.3.라이브러리 사용하기이제 연결한 라이브러리를 사용해봅시다.1) 예제에서는 SDWebImage 라이브러리를 이용해 URL 이미지 주소로 ImageView에 이미지를 설정하도록 코드를 추가하겠습니다.테이블뷰(UITableViewController) 컨트롤러를 이용해 목록으로 관광명소 이름, 설명, 이미지를 보여줄 것입니다. 관광명소 이름, 설명, 이미지에 맞게 데이터 모델을 만들고 스토리보드에서 UI를 디자인합니다. 테이블뷰 컨트롤러 파일을 새로 생성해서 이 소스 파일에서 라이브러리를 연결해서 기능을 구현해봅시다. 먼저 라이브러리를 이 소스에 연결하도록 import 명령어를 입력합니다.AttractionTableVC.swift import SDWebImage 그리고 아래와 같이 tableView(tableView:cellForRowAtIndexPath:) 함수에 코드를 작성합니다.2)override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> AttractionTableViewCell {         // Table view cells are reused and should be dequeued using a cell identifier.         let cellIdentifier = "AttractionTableViewCell"         guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? AttractionTableViewCell else {             fatalError("The dequeued cell is not an instance of AttractionTableViewCell.")         }         let attraction = attractions[indexPath.row]                  // . . .         cell.attractionLabel.text = "\(indexPath.row). \(attraction.nameWithDescription)"         cell.attractionImage.sd_setImage(with: attraction.photoURL, completed: nil)                 // . . .                 return cell     } SDWebImage 라이브러리를 쓴 이유는, URL 이미지 주소를 이용해서 관광명소 이미지를 보여주고 싶었습니다. 하지만 UIImage에 바로 URL 주소를 사용할 수 없었고, Data 형식으로 변환한 다음 사용해야 했습니다. 라이브러리를 안 쓴 다면 아래와 같은 소스를 작성해야 했을 겁니다.// return UIImage which is set from url data     private func imageFromUrl(url: URL) -> UIImage {         var photo = UIImage()          do {             let imageData = try Data.init(contentsOf: url)             photo = UIImage(data: imageData)!             return photo         } catch {             print(error.localizedDescription)             return photo         }     } 하지만 위에서 만든 소스를 SDWebImage 라이브러리를 이용하면 아래처럼 딱 하나의 명령문으로 줄일 수 있습니다.cell.attractionImage.sd_setImage(with: attraction.photoURL, completed: nil) 소스 길이가 확연히 줄어들었습니다. 이외에도 GIF 지원, asynchronous image downloader 등 SDWebImage 라이브러리 GitHub 페이지로 접속하면 자세한 기능들을 만날 수 있습니다.CocoaPods Error브랜디의 앱 프로젝트를 클론해서 작업하면 종종 코코아팟 관련 오류로 당황했던 적이 있습니다. 몇 가지 에러의 해결 방법들을 소개하겠습니다.1.“/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/sqlite3.h” not found”-> 대부분의 오류들은 코코아팟을 다시 설치하면 거의 다 해결됩니다.$ sudo gem install cocoapods$ pod install –verbose2.“Could not build module firebase core” Error-> project’s temp file 삭제 (~/Library/Developer/Xcode/DerivedData — Xcode->Preference->Location에 위치함)우선 위의 폴더 경로를 먼저 찾아 Finder로 여세요. 그 다음에 Xcode를 종료해 안전하게 삭제해야 합니다.-> ProjectName, .xcworkspace 삭제-> Podfile.lock 파일과 Pods 폴더 삭제-> $ pod install –verbose-> 새로 생성한 ProjectName.xcworkspace 실행하여 다시 빌드하기-> 그래도 안 된다면?—> $ pod update(or) —> $ pod –version 체크(or) —> $ pod repo update—> Podfile에 ‘Firebase’ 주석 처리—> $ pod install (old Firebase가 제거된다)—> Podfile에 ‘Firebase’ 주석 해제—> $ pod install (new Firebase 설치)—> 해결 완료!Conclusion이제는 새로운 기능을 개발하거나 소스를 수정할 땐 코코아팟에서 관련 라이브러리를 찾아봅니다. 마음에 드는 라이브러리는 곧바로 개발하고 있는 앱 프로젝트에 연결해 적용하기도 하고요. 자신의 언어로 순수하게 소스를 개발하는 것도 좋지만, 좋은 도구를 활용하는 것도 업무에 도움이 될 겁니다. 혹시 마음에 드는 라이브러리 찾으셨다면 저에게도 알려주세요. 코코아팟을 사용하는 iOS 개발자가 되신 걸 축하드립니다!주석 1)각 라이브러리의 GitHub 페이지에서는 소스를 연결하는 자세한 방법들을 소개하고 있다.2)attractions 배열에 미리 만들어 놓은 관광명소 데이터들을 저장한다. 배열에서 선정한 하나의 관광명소 데이터 정보를 이용해 각 테이블 뷰 셀에 알맞게 설정한다. 여기서 테이블 뷰 셀에 있는 attractionImage(UIImageView)에 URL 주소로 이미지를 설정하면 된다.참고문헌 swift3 - Error: Could not build Objective-C module ‘Firebase’ - Stack OverflowGoogle 그룹스An Introduction to CocoaPods (Route 85) - YouTube글김주희 사원 | R&D 개발1팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #개발문화 #개발팀 #업무환경 #인사이트 #경험공유
조회수 3426

패스트캠퍼스 직원들은 어떻게 일할까?

안녕하세요. 패스트캠퍼스 HR 매니저 김하나입니다. 패스트캠퍼스는 직장인을 대상으로 하는 파트타임 교육뿐만 아니라, 커리어 전환을 목표로 하는 전일제 교육과정도 운영하고 있습니다. 전일제교육과정을 운영하고 있는 스쿨 팀 에서 채용 연계를 담당하는 채용 매니저분을 찾고 있어요! 오늘은 스쿨팀 채용 매니저 인터뷰를 준비했습니다. 스쿨 수강생들이 새로운 커리어로 취업할 수 있도록, 스쿨 참여기업, 채용연계 및 자소서 첨삭 등 다양한 업무를 담당해 주고 계신데요! 구체적으로 패스트캠퍼스의 채용 매니저가 어떤 일을 하는지, 알아보기 위해 강종무 매니저를 만나봤습니다. 안녕하세요! 간단하게 자기소개 부탁드려요종무 : 안녕하세요. 패스트캠퍼스 전일제 교육과정인 SCHOOL의 채용 연계 관련 업무를 전담하고 있는 채용매니저 강종무라고 합니다. 패스트캠퍼스의 채용매니저로 오기 전에는 어떤 일을 하셨나요?종무 : 저는 대학원에서 영국사를 전공했어요. 영국의 경제 문화사를 전공으로 공부하다가 학업을 마치고, 중공업 회사의 교육직무 담당자로 일을 시작하게 됐고 회사에 감사팀이 신설되면서 팀을 옮기게 됐었죠. 과거에 네이버 캐스트에 영국사 관련한 글을 썼었던 경력들 때문에 감사 보고서 작성 업무 담당자로 이동하게 되었습니다.스쿨 팀 강종무 채용 매니저 영국 경제문화사, 교육팀, 감사팀, 아주 다이나믹한 과정이네요. (웃음)종무 : 제가 생각해도 신기해요. 그렇게 감사팀에서 제가 했던 역할은 크게 두 가지였어요. 하나는 직원들을 대상으로 조사하고, 현황을 파악하는 일, 그리고 다른 하나는 우리 회사와 함께 일하던 하청업체들을 만나는 일들이었어요. 후자의 일을 하면서 지금의 패스트캠퍼스처럼 스타트업 규모의 중소기업들을 많이 만났고, 그 과정에서 대표님들이 어떤 고민을 하시고 어떻게 의사 결정하게 되는지도 간접적으로나마 많이 경험했어요. 나름대로 좋은 회사, 안 좋은 회사를 가르는 기준도 가지게 되었죠. 기업과 직원의 측면들을 모두 보게 되는 상황들을 자주 경험했습니다.업무의 자세한 이야기를 들으니 더욱 흥미진진하네요. 소위 대기업이라 말하는 중공업 회사에 재직하고 계셨는데, 패스트캠퍼스는 어떻게 알게 되셨나요?종무 : 전 회사에서 한 3년 정도가 지나고 순환 근무를 하게 되는 상황이었는데 그때 퇴사를 결심하게 됐어요. 그러다 지인의 소개로 패스트캠퍼스를 알게 되고, 채용공고에서 채용 매니저 포지션을 보게 됐죠. 처음에는 인사 담당자인 줄 알았는데 자세히 보니 수료생들의 채용연계 관련해서 다양한 일을 하더라고요 그래서 제가 이전 회사에서 경험한 여러 가지 경험들을 활용할 수 있을 것 같다는 생각이 들어서 지원했고, 합류하게 됐어요회사의 규모, 업종 뭐 하나 익숙하지 않은 회사, 그리고 처음 보는 직무였을 텐데 어떤 부분들이 매력적으로 생각되셨어요?종무 : 저는 제조업 중에서도 가장 보수적인 중공업계에 있었고, 그 이전에 몸담았던 학계도 정말 보수적인 분위기의 조직이에요. 학교와 회사에 다니면서 스타트업 생태계에 대해서는 잘 모르고 있었는데, 지인을 통해서 스타트업 업계에 대해 처음 알게 되었고 새로운 기술을 가장 먼저 적용하고 변화를 주도하는 트렌디한 업계와 생태계를 경험할 수 있다는 게 가장 매력적이었어요. 그리고 제가 지원한 SCHOOL 사업부는 주로 개발, 데이터사이언스 그리고 최신 디지털 마케팅 등 새로운 트렌드에 맞는 직무 역량을 다루고 있었고, 이 부분은 제가 관심 있어 하는 최신 기술과도 연관이 있어서 더욱 매력적으로 느껴졌죠.그다음으로는, 감사팀에서 인사와 채용에 관련한 여러 가지 케이스들을 접하면서 채용과 인사 관련한 업무에도 관심이 생겼었어요. 앞에서 말씀드린 것처럼 다양한 회사들의 여러 상황을 마주하게 되면서 사람을 다루는 회사의 인사 업무에 대해서 많이 생각하게 됐었거든요.채용 매니저 직무 설명을 보니, 전통적인 인사업무와는 다르더라고요. 일반적인 조직과 회사의 인사제도나 조직의 성장 과정 들은 이전 회사에서 많이 경험했지만, 채용 매니저로 일하면 스타트업의 조직이 어떤 특성을 가지는지 가까이서 경험할 기회라는 생각이 들었어요. 뿐만 아니라 SCHOOL과 함께할 참여기업을 찾고 회사 대표님, 인사담당자분들을 만나면서 구직자와 회사를 연결해주는 일련의 과정들에 적극적으로 참여할 수 있는 포지션이라면 해보고 싶다는 생각이 들어서 지원했죠.SCHOOL의 참여기업을 섭외/관리하고, 수강생들의 자소서 첨삭이나 진로상담, 그리고 채용연계, 채용행사 기획 등 여러 가지 일을 하고 계시잖아요! 여러 업무를 담당하시면서 혹시 힘든 부분이 있다면, 어떤 것들이 있을까요?종무 : 저는 제 일이 재미있어서 정말로 즐겁게 일하고 있어요! 힘든 것보다는, 어려운 일들은 많죠. 채용 매니저로서 제일 어려운 건 변화가 수시로 일어나는 스타트업의 채용 현황을 예측하기 어렵다는 점이에요. 참여기업들의 채용 상황은 제가 컨트롤 할 수 있는 부분이 아니고 심지어 회사 차원에서도 본인 회사의 채용현황을 컨트롤 하는 것은 힘든 경우가 많으니까요.스타트업 자체가 변화가 많고, 빠른 성장을 추구하다 보니까 기존의 대기업이나, 중견기업들처럼 정기적으로 사람을 뽑거나 그렇지 않은 거죠?종무 : 맞아요. 그리고 스타트업들의 최우선 과제가 생존과 성장이다 보니까 회사 자체에서 인사를 체계적으로 플래닝하기가 어려운 게 현실이에요. 그런데 저희 SCHOOL의 경우 2개월 단위로 150 ~ 200명의 수료생이 정기적으로 배출돼요. 채용매니저의 역할은 저희 수료생들이 계속해서 좋은 회사들에 취업할 수 있도록 도와주는 것이기 때문에 앞으로 더 열심히 뛰어서 좋은 스타트업들과 수료생들을 만나게 해주기 위해서 더욱 노력해야죠!스쿨 수료생들과 참여기업이 만나는 채용연계 행사 ‘HIRING DAY’ 채용 매니저로 일하시면서 가장 신경쓰고 있는 부분은 어떤 부분이세요?종무 :  업무적으로 다른 부분은 크게 힘들거나 어려운 부분은 없는데, 아무래도 수강생분들을 제가 직접 만나고, 상담하는 역할도 동시에 하고 있다 보니 멘탈관리를 잘 해야 한다는 생각은 저도 자주 하고 있어요.SCHOOL은 전일제 교육과정이고, 커리어 전환을 꿈꾸는 분들이 주로 오세요. 이 과정을 수강하기 위해 회사를 그만두고 오시는 분들도 많죠. 취업을 간절히 바래서 오는 분들도 많고요. 그래서 제가 수강생분들에게 힘을 주고 자신감을 심어줘야 해요. 막연한 두려움이나 좌절감 등 부정적인 감정들에 사로잡혀 힘들어하는 수강생분들이 많아요. 그런데 저까지 힘들어 하는 모습을 보이면 수강생분들이 더 불안해 하시거든요. 수강생 분들이 느끼는 불안함이 SCHOOL 과정에 대한 불안함으로 번질 수 있기 때문에 제가 항상 당당하고 자신감있게 수강생분들을 마주해야해요. 수강생분들의 감정이나 상황에 휩쓸리지 않고, 적절한 조언을 주고 힘을 실어주는 역할도 해야해서 멘탈관리도 중요한 거죠.그리고,  SCHOOL의 참여기업들을 섭외하고 관리하는 일을 하고 있으니 정말 많은 콜드메일, 콜드콜을 보내고 여러 네트워킹 행사들을 다니면서 SCHOOL을 소개하고 있어요. 당연히 그 과정에서 거절도 정말 많이 당하죠. 그러니 더욱 스스로 마음을 다잡는 걸 좀 신경 쓰는 편이에요.채용매니저를 하면서 가장 즐거운 점, 이 일을 하면서 가장 보람찬 순간이라면 언제인가요?종무 : 누군가의 채용에, 커리어에 제가 직접적으로 도움을 준다는 것 자체요. 제가 하는 일 자체가 매 순간 보람을 느끼는 순간의 연속이에요. 저희 수강생 분들은 새로운 분야에서 자신의 커리어를 만들어가려고 하는 분들이 대다수거든요. 처음에는 해당 분야에 대한 지식이 거의 없었던 수강생들이 기술적으로 성장하는 모습을 옆에서 도와주고, 자신의 자리를 찾아가는걸 돕고 취업까지 성공하는 과정에 함께하는 것 자체가 정말 뿌듯한 일이죠.그리고, 수강생분이 취업한 회사에서 좋은 결과를 보여주셔서 회사 대표님들이 다음 기수에 또 채용하러 오시고, 감사하다고 말씀해 주시면 정말 기쁘죠.스쿨 네트워킹 데이 : 스쿨의 수료생과 재학생이 한자리에 모이는 네트워킹 행사 저 역시 하이어링데이에 참여했었고, 종무 님께서 수강생과 상담하시는 것을 옆에서 지켜보기도 했는데 좋은 소식들을 접하면 더욱 기쁘고 보람이 클 것 같아요. 인터뷰를 진행하다 보니까, 일반적인 인사&채용 업무와 다른 부분이 있는 것 같아요.네, 맞아요. 회사의 인사팀의 경우에는 내부 채용이나 내부직원들을 관리하는 업무들을 주로 하게 되는데, 저는 바깥으로 나가는 일들이 많아요. 스타트업 관련 행사들에 참여해서 트렌드도 파악하고, 기업들의 소식도 들으면서 우리 스쿨에 함께할 회사들을 계속 찾아다니는 일이 많거든요.헤드헌터, 세일즈나, PR 업무와 비슷한 부분이 많아요. 고객사를 섭외하고 관리하고 홍보하는 일련의 커뮤니케이션을 담당하니까요. 고객과 수강생, 그리고 참여기업의 대표/ 인사담당자 등 많은 이해 관계자들과 커뮤니케이션해야 하기 때문에 커뮤니케이션 역량도 중요해요.스타트업 업계에 대해서 알고 계신 분들이면 채용매니저 업무에 빠르게 적응하실 수 있을 것 같아요종무 : 네! 그래서 스타트업 지원 프로그램을 운영하는 지원사들에서 일하신 분들이 오시면 빠르게 적응하실 수 있을 것 같아요. 지원자분들의 이력서와 지원서를 피드백 주는 것도 채용매니저의 업무다 보니 글쓰기와 커뮤니케이션을 모두 경험한 분이면 더욱 좋죠. 예를 들면, 기자 출신의 PR 업종을 경험하신 분이요. 아무래도 저희는 주로 스타트업들을 대상으로 취엽연계를 하다 보니, 스타트업 생태계에 대한 이해도가 있으신 분이 오시면 채용매니저로서 일하는 데 도움이 많이 될 것 같습니다.저는 종무님께서 하고 계신 업무 중에서 자소서 첨삭이나 진로 상담 등이 가장 신기했어요. 이건 아무나 하기 힘들 것 같다고 생각했는데, 오늘 이야기를 나눠보니 종무님께서도 입시나 채용 관련 업무를 하신 적이 없는데 어떻게 자소서 피드백이나 진로상담 쪽까지 하고 계신지 궁금해요.종무 : 저도 신기해요. (웃음) 사실 인사나 채용 담당 업무에 대한 경험보다, 글을 많이 쓰고 읽어본 사람이었던 게 도움이 됐어요. 특히 다양한 목적을 가진 글쓰기를 해봤던 경험이 수강생분들의 자소서 첨삭에 유용했어요. 제가 대학원이나 감사팀 업무를 하면서 논문, 보고서 등의 딱딱한 글도 썼었지만 네이버 캐스트에 14 ~15세기 근대적 보험의 태생에 대한 콘텐츠를 발행하기도 했거든요. 제가 해온 일들을 통틀어서  짧은 글, 긴 글 조금 딱딱하고 형식적인 글, 정보전달형 글, 콘텐츠성 글 등 좀 다양한 글을 자주 썼어요.자소서도 글쓰기잖아요. ‘취업’을 목적으로 하는 글쓰기라고 이해하고, 수강생들의 자소서에 대해 피드백을 주고, 첨삭하다 보니 자소서 피드백을 하는 과정이 크게 어렵지는 않더라고요.채용 매니저에 지원하려고 하시는 분 중에 이런 자소서 첨삭 업무에 대한 어려움을 느낄 수도 있을 것 같아요.‘자소서 첨삭’이라고 하면 매우 거창해 보이지만 SCHOOL 수강생의 자소서를 첨삭할 때는 목적에 맞는 글쓰기에 대한 감각, 이게 중요해요. 채용이나 인사 업무를 담당했던 경험보다 글쓰기에 능숙한 사람이라면, 자소서 첨삭을 잘 해내실 수 있다고 생각해요.채용매니저 업무를 통해 참여기업의 대표님들, 인사담당자분과 많은 커뮤니케이션을 하게 되는데, 그 과정에서 회사가 어떤 사람을 필요로 하는지는 빠르게 파악할 수 있어요. 각 직군을 채용하고자 하는 회사의 니즈에 맞게 수강생들이 자소서를 풀어갈 수 있도록 피드백을 주는 역할을 저희 채용 매니저가 한다고 생각하시면 돼요.스쿨 채용 현황을 요약한 2017 하이어링 리포트 보러 가기 채용의 최전선에서 다양한 경험을 할 수 있는 포지션 같아요. 지금 채용매니저를 채용 중에 있는데 저희 채용 매니저 포지션에 관심 있으신 분들에게 한마디 부탁드려요!종무 : 채용 매니저는 열심히 할수록 만나는 모든 사람에게 도움이 되는 직무예요. (웃음) 수강생은 새로운 회사로 취직하고, 참여기업들은 원하는 포지션의 필요역량을 가진 좋은 지원자들을 빨리 채용하고, 그리고 패스트캠퍼스의 비즈니스는 점점 성장하게 되니까요! 채용 매니저로 일하면서 많은 사람을 만나고, 좋은 경험을 할 수 있다고 자부합니다. 
조회수 444

컴공생의 AI 스쿨 필기 노트 ⑦합성곱 신경망

안녕하세요! 이번 주 수업에서는 합성곱 신경망에 대해서 배웠어요. 제가 읽은 한 기사에 의하면 대장 내시경 검사에도 딥러닝을 이용하면 종양 식별 능력을 더 높일 수 있다고 해요. 딥러닝을 이용한 검사는 전문가 분석을 통한 대장 내시경 검사보다 종양을 9개 더 많이 발견했고 진단 정확도는 96%인 것으로 나타났어요. (원문 링크) 이 대장 내시경에 우리가 배운 CNN(Convolutional Neural Network), 이미지 기반 딥러닝 모델을 사용했다고 하는데요. 이 대장 내시경에 사용된 CNN에 대해 알아볼까요? (Cover image : Photo by Paul Carmona on Unsplash)CNN(Convolutional Neural Network, 합성곱 신경망) CNN(합성곱 신경망)은 Convolution(합성곱)연산을 사용하는 인공신경망의 한 종류에요. 합성곱 신경망은 주로 이미지 데이터를 다루는 문제에서 사용돼요. 쉽게 말해 합성곱 신경망은 이미지의 특징을 추출하고 잘 조합하여 문제를 해결하는데요.  예를 들어 왼쪽 이미지가 고양이인지 컴퓨터가 알아맞히기 위해서 합성곱 신경망은 고양이가 가져야 할 특징을 한 번에 파악하는 것이 아니라 부분부분 판단하여 종합적으로 결론을 내요. 합성곱 신경망은 사진에 고양이의 특징이 기묘하게 분포되어 있어도 정확하게 고양이의 특징을 찾아내는 높은 적응도를 갖고 있어요.이제 합성곱 신경망의 구조에 대해 알아볼까요?CNN의 네트워크 구조1. 합성곱 층 (Convolutional Layer)합성곱은 두 함수 중 하나를 반전하고 이동시켜가며 다른 하나의 함수와 곱한 결과를 적분해나간다는 아주 어려운 뜻을 가지고 있어요. 다음 예시를 보도록 할게요.여기에 2차원 배열 픽셀을 넣으면 X 인지 O 인지 알아내는 합성곱 신경망이 있다고 해봐요.이 합성곱 신경망은 똑바로 된 X와 O를 넣으면 X 인지 O 인지 정확하게 구분하는데,이렇게 크기가 바뀌고 회전되어 모양이 변형된 이미지를 보고도 X 인지 O 인지 정확히 구분할 수 있을까요?합성곱 신경망은 합성곱 신경을 이용하여 이미지의 특징을 매칭 시킨 결과가 같으면 같은 이미지라고 인식해요.‘X’ 이미지의 특징을 추출하면 위와 같은 매트릭스, 합성곱 필터(Convolution filter(=커널))가 나와요. (세 특징을 잘 조합하면 X 형태가 나오죠?)이제 제일 왼쪽의 합성곱 필터를 가지고서 이미지가 X 인지 알아볼게요. 합성곱 필터와 원본 이미지를 비교할 때는 곱셈을 이용해요. 합성곱 필터의 크기만큼 원본 이미지와 차례차례 곱해서 값을 채워나가요.위의 합성곱 정의에서 두 함수를 하나는 이미지, 또 하나는 필터라고 생각하면, 필터를 이동시켜가며 이미지와 곱한 결과를 적분 즉, 덧셈해 나간다는 뜻이 돼요.합성곱 필터의 크기만큼 값을 다 계산한 후, 계산한 원소를 다 더해서 합성곱 필터의 크기만큼 나눈 평균값을 또 다른 새 매트릭스에 채우게 되는데 이를 특징 맵(Feature map)이라고 불러요. 즉, 특징 맵은 기존의 이미지에 필터를 곱한 결과로 각 픽셀에 쓰여있는 값이 클수록 그 특징을 가지고 있다는 뜻이에요.이렇게 원본 이미지와 합성곱 필터의 곱한 결과로 특징 맵이 나왔어요.나머지 두 개의 합성곱 필터와 곱한 결과로 두 개의 특징 맵을 가질 수 있어요.한 개의 합성곱 층(Convolutional layer)에는 여러 개의 합성곱 필터가 있어요. 합성곱 층에서 기존의 이미지와 필터들을 합성곱한 결과, 처음 이미지는 필터 된 이미지(특징 맵)로 쌓이게 돼요.2. 풀링 층(Pooling Layer)풀링은 가로/세로 방향의 공간을 줄이는 연산으로 합성곱 층의 특징을 압축한 특징 맵을 형성해요. 풀링에는 최대 풀링(Max pooling)과 평균 풀링(Average pooling)이 있는데 이미지 인식 분야에서 주로 사용하는 것은 최대 풀링이에요. 그래서 보통 풀링이라고 하면 최대 풀링이라는 의미로 사용한다고 보시면 돼요.위의 예시는 2x2 최대 풀링을 적용한 예시에요. 아까 구한 특징 맵에서 2x2 픽셀에서 가장 큰 원소 값을 새로운 맵을 채워나가는데 이를 활성화 맵(Activation map)이라고 불러요. 최대 풀링을 사용하면 노이즈가 감소하고 속도도 빨라지며 영상의 분별력이 좋아진다고 해요. 마지막 출력 층은 최대 풀링의 모든 뉴런과 연결되어 출력값이 어떤 클래스에 해당하는지 파악되는데 사용돼요.이렇게 CNN을 이용하면 변형된 이미지라고 하더라도 원래 이미지의 특징을 가지고 있다면 정확히 구분할 수 있어요.코드로 연습해보기아래는 간단한 인공신경망 코드예요.Layer 1 - input:1x28x28 , output : 64x28x28 + Activation function - reluLayer 2 - input: 64x28x28 output:1x28x28Layer 3 - input: 1x28x28=784 output:10class MNIST_Net(nn.Module):    def __init__(self):        super(MNIST_Net, self).__init__() # nn.Module 생성자 호출         # an affine operation: y = Wx + b        layers = []        layers.append(nn.Conv2d(1,64,3,1,1))         layers.append(nn.ReLU())         layers.append(nn.Conv2d(64,1,3,1,1))         layers.append(nn.ReLU())         self.main = nn.Sequential(*layers)        self.fc = nn.Linear(28*28, 10)    def forward(self, x):        # x.view함수는 주어진 인자의 크기로 해당 데이터의 크기를 반환합니다. 즉, (Batch_size,1,28,28) --> (Batch_size,28*28)로 변환합니다.        x = self.main(x)        x = x.squeeze().view(-1, 28*28)        x = self.fc(x)  # 10 으로 10개의 Class에 대한 logit 값을 호출합니다.         return x합성곱 인공 신경망의 내용은 정말 배울 것이 많아서 수업 시간 내에 다 배우기가 조금 벅찼지만 다른 인공 신경망에 비해 재밌어서 집중할 수 있었어요. 이제 앞으로 1번의 이론수업만을 남겨두고 있어서 아쉽기도 하고 또 뿌듯하기도 해요. 앞으로 조원들과 함께 프로젝트를 진행하면서 지금까지 배운 이론을 적용해보게 되는데요. 프로젝트 주제를 정하는 것부터 벌써 쉽지가 않아요. 하지만 열심히 프로젝트를 해서 리쿠르팅 데이 때 실력을 뽐낼 수 있다면 좋겠네요!* 이 글은 AI스쿨 - 인공지능 R&D 실무자 양성과정 7회차 수업에 대해 수강생 최유진님이 작성하신 수업 후기입니다.
조회수 1799

덕질도 신박하게! R을 활용한 텍스트 마이닝 도전기

Overview대학원에서 소프트웨어 공학을 전공하고 있습니다. 이번 학기엔 ‘빅데이터 분석’ 과 ‘대용량데이터베이스관리론’ 과목을 수강하면서 생애 처음으로 R Studio 프로그램을 설치해봤는데요. 머신 러닝을 다뤄본 적도, 자연언어처리 분야를 개발한 적도 없지만 어느 날 텍스트 마이닝 관련 강의에서 불현듯 이런 생각이 떠올랐습니다. “내가 좋아하는 가수로 텍스트 마이닝을 하면 어떤 결과가 나올까?”머릿속으로 생각하는 것과 내가 직접 구현을 해보는 것은 절대 다른 법! 일단 도전해보기로 했습니다. 개발 3년과 덕질 10년의 실력을 쏟아 부을 겁니다.지금까지 예쁜 디자인이라고만 알고 있었던 WordCloudStep1. 트위터 Developer 에서 인증키 받기트위터 Developer (Twitter Developer Platform — Twitter Developers) 에 접속해서 개인 계정으로 로그인하고, 오른쪽 위의 Apply를 클릭합니다.Twitter standard APIs > Get started with standard access를 클릭합니다.등록된 개발자 앱이 없으면 Create an app의 apps.twitter.com을 클릭합니다.Create New App을 클릭합니다.각 항목을 입력합니다. 저는 Website 가 없기 때문에 로컬 호스트를 기재했습니다.약관에 동의한 후 Create your Twitter application을 클릭합니다.만약 어플리케이션 이름이 중복된다면 위와 같은 에러 메세지가 나올 겁니다. 정상적으로 어플리케이션이 등록되면 위의 화면과 함께 API Key를 발급받을 수 있습니다. Consumer Key (API Key) 옆의 내용 (캡쳐화면에는 비공개)을 클릭하면 API Key 뿐만 아니라 API Secret, Access Token 등 세부 내용을 관리할 수도 있습니다.Step2. R Studio 설치하기 (Mac OS 기준)구글에서 R for macOS를 검색을 하면 맨 위에 설치 페이지가 보입니다. 1)먼저 R 패키지를 설치해야, 나중에 R Studio를 설치했을 때 실행이 가능합니다.R Studio 홈페이지에서 R Studio를 다운받습니다. 다운로드 링크는 여기를 클릭하세요.RStudio가 정상적으로 실행이 된다면, 이제 준비는 끝났습니다! Step 3. 필요한 패키지를 먼저 설치하기따로 설치가 필요한 패키지는 RStudio에서 명령어로 설치할 수 있습니다.—한 개씩 설치하는 법install.packages(“packageName”)—여러 개의 패키지를 한 번에 설치하고 싶을 땐 위와 같이 설치할 수 있습니다.—여러 개를 한꺼번에 설치하는 법install.packages(c(“package1”, “package2”,”package3”))—설치를 했다고 해서 바로 사용할 수는 없습니다. 이 패키지를 사용하겠다는 명령어를 다시 입력해야 합니다.—설치한 패키지를 사용하기library(“packageName”)—이번 글에서는 아래와 같은 패키지들이 필요합니다.twitteRROAuthbase64enchttpuvtmSnowballCwordcloudRColorBrewerStep 4. 트위터 api와 연동하여 WordCloud 생성하기먼저 각자 API 관련 Key 들로 객체를 생성해주고, setup_twitter_oauth() 메소드를 사용하여 Twitter API에 접근합니다.searchTwitter 4) 라는 함수를 사용하면, 트위터 API 를 통해 관련 트윗 내용을 추출할 수 있는데요. 좋아하는 일본 아이돌 가수인 “아라시”를 키워드로 추출하려고 첫 번째 파라미터에 “Arashi”를 넣었습니다. 그 뒤의 내용은 영문으로 작성된 최근(Recent) 트윗을 최대 1500개까지 리턴 받겠다는 의미입니다. resultType에는 popular를 넣으면 가장 인기있는 트윗을 받을 수도 있습니다.데이터를 가져오면, 위와 같이 데이터가 추출된 것을 확인할 수 있습니다.이제 matchTweets에 있는 내용으로 분석가가 되어 마음대로 데이터를 가공할 수 있습니다. class 등으로 구조와 클래스를 확인할 수 있을 뿐만 아니라, nchar() 를 이용해 트윗당 문자 수를 계산할 수도 있습니다. 이번 글에서는 위와 같이 트윗을 20개 추출했습니다.각각의 트윗을 보면, 이상한 코드나 슬래시 등 필요 없는 데이터들이 포함되어 내려온 것을 확인할 수 있습니다. 이 부분들을 제거해 깔끔한 데이터로 가공해보겠습니다. 그리고 텍스트 집합이라고 볼 수 있는 Corpus를 생성한 후, WordCloud 까지 생성해볼게요.데이터를 Corpus 로 만들 때는 Corpus() 를 사용하면 됩니다. 저는 VectorSource 라는 명령어를 사용해 단어들을 Vector로 바꿔주었고, 데이터가 잘 들어갔는지 확인하기 위해 inspect() 를 사용했습니다.사람이 읽기 불편한 단어들을 제거하는 건 tm_map 함수 하나면 충분합니다.위의 이미지를 보면, 각 행마다 특정 특수문자들을 제거하기 위한 명령어가 있습니다. 중간 부분엔 stopwords 라는 단어가 있는데, 영어 문장에 들어가는 i.e 나 etc 같은 표현들을 제거할 수 있는 겁니다. 그 외에도 대문자를 소문자로 바꾸거나 번호를 제거하는 등의 옵션들이 이미 R에서는 제공되고 있기 때문에, 우리는 입맛에 맞게 가져다 쓰기만 하면 됩니다.이제 대망의 WordCloud를 만들 차례입니다.max.words는 최대 N개의 단어를 고르는 옵션이며, min.freq는 최소 N번 이상 나온 단어, random.order = FALSE는 제일 많이 나온 단어가 먼저 나오도록 지정하는 옵션입니다. colors는 지정하지 않으면 검정색으로만 나오지만, 알록달록 예쁘게 표현하고 싶다면 여러 옵션을 지정해서 Frequency 에 따라 다른 색이 나오도록 할 수도 있습니다. 5) 첫 번째 이미지가 이번 글의 예제로 얻은 결과인데요. 추출 언어를 영어로만 한정했더니 일본어 발음을 영문으로 표현한 데이터가 많았습니다. 기타 설정을 변경하여 다시 추출한 게 바로 두 번째 이미지입니다. 큼직큼직하게 나온 단어들을 보면 DVD 나 블루레이 출시와 관련된 트윗이 대다수인 것을 볼 수 있는데요, 검색 결과 최근 2017-2018 라이브 투어 ‘Untitled’가 출시된 것을 확인할 수 있었습니다. 기타 작게 표현된 단어들을 보면 아라시의 노래 제목들도 확인 가능한데, 이 노래들이 인기있다는 것도 예측할 수 있습니다.Conclusion지금까지 R을 이용해 트위터 API 와 연동한 텍스트 마이닝을 했습니다. 데이터를 WordCloud로 생성하는 것도 해봤고요. 이번 글에서는 기본적인 예제를 다뤘지만 텍스트 마이닝의 세계는 아주 깊고 넓습니다. 만약 이 글로 텍스트 마이닝에 조금이라도 흥미가 생겼다면 일단 도전해보세요! 좋아하는 것과 연관 지어서 따라 하다 보면 꽤 즐거운 시간이 될 겁니다.참고1) 18년 6월 6일 기준이다.2) Twitter Sentiment Analysis Tutorial3) Text mining: Twitter extraction and stepwise guide to generate a word cloud4) R 함수 관련 설명은 R Documentation 사이트에서 확인할 수 있다. 5) 색상 옵션이 궁금하다면 여기에서 참고할 수 있다. 6) 머신러닝 언어처리 - R로 WordCloud 만들어보기 - 데이터 사이언스 랩글김우경 대리 | R&D 개발1팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #개발자 #개발팀 #인사이트 #경험공유 #R #텍스트마이닝
조회수 10942

Next.js 튜토리얼 6편: 서버 사이드

* 이 글은 Next.js의 공식 튜토리얼을 번역한 글입니다.** 오역 및 오탈자가 있을 수 있습니다. 발견하시면 제보해주세요!목차1편: 시작하기 2편: 페이지 이동 3편: 공유 컴포넌트4편: 동적 페이지 5편: 라우트 마스킹6편: 서버 사이드 - 현재 글7편: 데이터 가져오기8편: 컴포넌트 스타일링9편: 배포하기개요이전 편에서는 깔끔한 URL를 생성하는 방법에 대해 배웠습니다. 기본적으로 다음과 같이 생긴 URL를 가질 수 있습니다: http://localhost:3000/p/my-blog-post하지만 이 URL은 클라이언트 사이드 이동 시에만 동작합니다. 페이지를 새로고침하면 404 페이지가 표시됩니다.페이지 디렉토리에 p/my-blog-post를 부르는 실제 페이지가 없기 때문입니다.Next.js 커스텀 서버 API를 이용하여 쉽게 해결할 수 있습니다. 어떻게 구현할 수 있는지 살펴봅시다.설치이번 장에서는 간단한 Next.js 애플리케이션이 필요합니다. 다음의 샘플 애플리케이션을 다운받아주세요:아래의 명령어로 실행시킬 수 있습니다:이제 http://localhost:3000로 이동하여 애플리케이션에 접근할 수 있습니다.커스텀 서버 생성하기Express를 사용하여 애플리케이션의 커스텀 서버를 생성할 예정입니다. 간단합니다.먼저 애플리케이션에 Express를 추가해주세요:npm install —save express애플리케이션에 server.js 파일을 생성하고 다음과 같이 작성해주세요:npm dev 스크립트를 수정해주세요:이제 npm run dev 명령어로 애플리케이션을 다시 실행시켜주세요.어떤 일이 일어날까요?- 깔끔한 URL을 지원하는 서버 사이드를 추가할 것이다.- 애플리케이션이 동작하지만 서버 사이드의 깔끔한 URL은 동작하지 않는다.- "Express와 Next.js은 함께 동작할 수 없습니다"라는 에러가 발생할 것이다.- "Next.js 커스텀 서버는 프로덕션에서만 동작합니다"라는 에러가 발생할 것이다.커스텀 라우트 생성하기경험했다시피 구현한 커스텀 서버가 "next" 바이너리 명령어와 비슷하기 때문에 이전과 비슷하게 동작합니다.블로그 포스트 URL과 매치되는 커스텀 라우트를 추가해봅시다.새로운 라우트가 있는 server.js는 다음과 같습니다:다음의 코드를 살펴봅시다:단순히 기존 "/post" 페이지에 커스텀 라우트를 매핑했습니다. 또한 쿼리 매개 변수도 매핑했습니다.이게 끝입니다.애플리케이션을 다시 실행시키고 다음 페이지로 이동해주세요:http://localhost:3000/p/hello-nextjs더이상 404 페이지가 보이지 않습니다. 이제 실제 페이지를 볼 수 있습니다.하지만 작은 문제가 있습니다. 뭔지 아시나요?- 아무런 문제가 없다.- 클라이언트 사이드에서 랜더링된 제목과 서버 사이드에서 랜더링된 제목이 다르다.- 서버 사이드에서 랜더링된 페이지는 콘솔에 에러를 발생시킨다.- 클라이언트 사이드에서 랜더링된 페이지는 콘솔에 에러를 발생시킨다.URL에 있는 정보/post 페이지는 쿼리 문자열 파라미터 title을 통해 제목을 가져옵니다. 클라이언트 사이드 라우팅에서는 쉽게 URL 마스킹을 통해 적당한 값을 전달할 수 있습니다. (Link의 as prop을 통해)서버 라우트에서는 URL에 있는 블로그 포스트 ID만을 가지기 때문에 제목이 없습니다. 이 경우 ID를 서버 사이드 쿼리 문자열 파라미터로 설정합니다.다음과 같은 라우트 정의를 볼 수 있습니다:문제가 발생하지만 실제로는 ID를 사용하여 클라이언트와 서버 모두 서버에서 데이터를 가져오므로 이는 별로 문제가 되지 않습니다.그래서 ID만 필요합니다.마무리Next.js의 커스텀 서버 API를 사용한 라우트를 간단히 구현해보았습니다. 깔끔한 URL을 지원하는 서버 사이드를 추가했습니다. 원하는 대로 여러 라우트를 구현할 수 있습니다.Express를 사용하는 것에 국한되지 않습니다. 원하는 Node.js 서버 프레임워크를 사용할 수 있습니다. 커스텀 서버 API에 대한 Next.js 문서를 볼 수 있습니다.#트레바리 #개발자 #안드로이드 #앱개발 #Next.js #백엔드 #인사이트 #경험공유
조회수 1571

iOS Graphic Interface 살펴보기 (1/2)

1.intro: 애정하는 iOS, 애증의 Xcode프론트엔드 개발자가 가장 기쁠 땐 언제일까요? 여러 가지가 있죠. 직접 만든 스무스한 애니메이션을 볼 때, 고생해서 작업한 하드코어 고난도 레이아웃이 잘 작동할 때, 작업한 화면을 사람들이 ‘예쁘다ʼ고 말해줄 때 등등. 그러므로 iOS는 모든 프론트엔드 개발자가 동경하는 OS라고 말할 수 있습니다. 대부분의 굵직한 Transition들을 알아서 Animate해주고, 프레임레이트가 복잡한 레이아웃 효과도 부드럽게 표현해주기 때문에 ‘예쁘다ʼ, ‘쾌적하다ʼ는 말이 절로 나오는 OS이기 때문이죠. 물론 그만큼 손도 많이 갑니다. 사실 iOS는 신기한 점이 많습니다. Xcode를 사용하다 보면 Interface Builder에서 ctrl+드래그를 사용하여 Code로 Reference를 가져오는 방법부터 String값으로 찾아가는 Xib/StoryBoard 파일까지.. 다른 플랫폼 및 IDE에서는 겪어보지 못한 새로운 경험들을 만나죠. 덕분에 다년차 개발자의 멘탈도 Xcode-iOS를 만나면 탈탈 털립니다. 시간이 지나면 이 독특하고도 불편한 Xcode를 사랑하고, 저주하는 상황까지 생깁니다.그래서 오늘은 많은 iOS 루키들이 겁내고 괴로워하는 iOS의 Graphic Interface를 살펴보고자 합니다. 맨땅에 헤딩할 때 헬멧이라도 쓰고 있으면 그나마 덜 아프니까요.2.Point, PixelAndroid에서는 다양한 기종의 스크린을 지원하기 위해 자체적으로 dp라는 수치 개념을 만들어 사용합니다. 파편화된 디바이스들을 모두 지원하는 레이아웃을 구성하려고 고안한 효율적인 방법이죠. iOS에도 이와 같은 개념이 있습니다. 바로 포인트(Point)인데요. Xcode의 ImageAsset 파일을 열면 이런 것을 찾을 수 있습니다. 1X, 2X, 3X바로 이 화면에서 볼 수 있는 1x,2x,3x라는 문구가 포인트 개념을 설명하고 있습니다. 포인트는 디바이스의 물리적 픽셀을 2배, 3배로 압축해 사용하는 iOS 만의 독특한 단위입니다. 이 개념이 처음 쓰인 건 iPhone 4, 즉 레티나 디스플레이가 등장하면서부터 인데요, 기존의 iPhone 3Gs와 물리적 화면 크기는 동일한데, 4배의 픽셀 수를 가지는 레티나 디스플레이에 기존의 앱들을 그대로 보여주자니 픽셀 단위로 정의된 기존의 모든 이미지/레이아웃이 절반 크기로 줄어드는 문제가 발생했습니다. 따라서 별도의 작업 없이 디스플레이하기 위한 방법으로 고안된 게 바로 포인트입니다.포인트는 픽셀을 2배, 3배로 압축해 1포인트라는 단위로 규정하고, 그 단위를 Nib(Xib) 에디터 및 개발 과정에서 사용합니다. 앞으로 여러분이 iOS 개발을 하면서 접할 기본 단위는 바로 포인트가 될 겁니다. 2X 혹은 3X는 단어는 픽셀을 2배, 3배로 압축했다는 의미입니다. 개발자의 편의를 위해서 만들어진 개념이 오히려 개발자에게 혼동을 주는 아이러니한 상황이 펼쳐졌습니다. 사실 이 픽셀-포인트의 개념이 처음 등장했을 때는 꽤 편리했을 겁입니다. 당시만 해도 iPhone4와 iPhone3Gs의 해상도를 구분하지 않고 작업할 수 있는 획기적인 방법이었으니까요. 하지만 지금은 iPhone5, iPhone7 Plus, iPhone X 등 다양한 장비들이 등장했습니다. 그래서 iOS 개발자는 포인트를 단지, 픽셀의 또 다른 이름처럼 느낄 뿐입니다. 애플도 자신들이 이렇게 다양한 해상도의 iPhone을 출시하게 될 줄은 몰랐을 겁니다.애플의 해상도 춘추전국시대 / 출처: paintcodeapp3.Storyboard, Nib (Xib)iOS UI 디자인의 꽃이 무엇인지 묻는다면 그것은 단연 Storyboard와 Xib일 것입니다. Storyboard는 기획자들이 사용하는 그것과 유사한 개념입니다. 하나의 큰 틀에 화면 단위로 여러 장의 기획안을 놓고, 그것들의 시퀀스를 한 눈에 알아볼 수 있도록 하는 보드입니다.Storyboard는 Segue와 같은 시퀀스 설정을 직접 할 수 있고, 연결된 하나의 Flow를 시각적으로 펼치기 좋습니다. 프로토타이핑을 위한 적절한 툴인 셈이죠.UIStoryboard 예시 - 브랜디 iOS의 Main StoryboardNib(혹은 Xib, 이하 Xib로 지칭)는 조각조각 단위의 화면이나 재활용을 많이 하는 CollectionViewCell 등의 화면 작업에 적합합니다. 이 점이 Storyboard와는 다르죠. (CollectionViewCell에 대한 자세한 포스팅은 여기를 클릭하세요.)물론 Storyboard에서 할 수 있는 작업은 대부분 Xib로도 가능하지만, 각각의 용도를 다르게 해서 사용하는 경우가 많습니다. 예를 들어, 브랜디 iOS 프로젝트는 Storyboard에선 큰 틀의 화면을 다루고, Xib에서는 CollectionView Cell과 ReusableView, Custom Component등을 다루고 있습니다. UICollectionViewCell.xibStoryboard와 Xib로 인터페이스 작업을 할 때는 파일의 컨텐츠가 너무 비대해지지 않도록 조심해야 합니다. Storyboard가 비대해지면 많은 작업자가 동시에 파일을 수정할 수도 있는데, VCS를 사용하면서 Storyboard나 Xib 파일의 충돌이 발생하면 병합하는 과정이 매우 고통스럽습니다. 그러므로 Storyboard는 서로 충돌하지 않도록 더 큰 그림을 그리고, 해당 Storyboard를 Senior 개발자가 관리할 수 있도록 안전장치를 두도록 합시다. 야 이거 소스 건드린 사람 나와 Storyboard와 Xib는 기본적으로 XML 기반의 파일입니다. 혹시라도 충돌이 발생하면 UI로 확인이 불가능하기 때문에, Xcode에서 해당 Storyboard, Xib 파일을 우클릭한 후 Open As > Source Code 메뉴를 클릭하면 XML 형식으로 브라우징할 수 있습니다. 해당 충돌 부분을 찾아가서 수정하고 다시 확인하면 UI로 볼 수 있습니다.소스코드로 스토리보드 보기4.From Storyboard, to CodeStoryboard와 Xib에서 구현한 컴포넌트들을 ViewController의 SourceCode에서 다룰 일이 분명 생길 겁니다(언제나 그렇죠). 그럴 땐 Outlet이라는 개념을 이용해서 Storyboard 와 SourceCode를 연결하는데요.네, 코드가 아닙니다. 포토샵하는 기분으로 ctrl + 마우스 좌클릭 드래그를 해주시면 됩니 다. 이 기능은 다른 IDE에서 보기 힘든 건데요. 나름 쓸만합니다. 익숙해지면 여러 가지 컴포넌트, 유닛들을 Outlet으로 처리할 수 있습니다. 코딩을 자유롭게 할 수도 있고요. 예를 들어, LayoutConstraint를 Outlet으로 처리하면 해당 Constraint를 코드 시퀀스에 따라 자유자재로 변경할 수 있게 되는 것처럼 말이죠.물론 이보다 선행되어야 할 작업은 Storyboard에서 해당 ViewController가 연결될 ViewController를 지정하고, 해당 ViewController의 파일을 미리 만들어야 합니다.5.Extraction of ViewControllerStoryboard에서 ViewController A를 연결했는데, ViewController B 에서 ChildViewController로 ViewController A 를 사용하고 싶다면 어떻게 할 수 있을까요? (간장공장공장장) 당연한 이야기지만 코드를 통해 구현 가능합니다. 필요한 것은 Storyboard 파일명과, Storyboard에서 미리 지정한 ViewController A 의 Identifier, 두 가지입니다. Storybo/rd에서 ViewController A를 연결했는데, ViewController B 에서 ChildViewController로 ViewController A 를 사용하고 싶다면 어떻게 할 수 있을까요? 당연한 이야기지만 코드를 통해 구현 가능합니다. 필요한 것은 Storybo/rd 파일의 이름과, Storybo/rd에서 미리 지정한 ViewController A 의 Identifier, 두 가지입니다. instantiateViewController From Storyboard/**  현재 화면에 디스플레이중인 UIWindow 객체로부터 UITabBarController를 반환받는 메  소드  - parameter window: UIWindow  - returns: UITabBarController */ fileprivate func tabBarControllerFromStoryboard() -> BRTabBarController {  let storyBoard = UIStoryboard(name: "mainStoryboard", bundle: nil let viewController = storyBoard.instantiateViewController(withIdentifier: "mainTabBarController") return viewController as! BRTabBarController  // 잘못된 viewController를 추출한 경우 nil exception } 비슷한 방법으로 Xib에 작성된 View도 추출할 수 있습니다. Xib파일 하나에 여러 View가 정의되어 있다면, 각각의 View를 필요에 따라서 사용할 수도 있습니다.Extraction From Xiblet nib = UINib(nibName: NSStringFromClass(BRDropdownSelector.self) let components = nib.components(separatedBy: ".").last!, bundle: nil) let view = components.instantiate(withOwner: nil, options: nil).last as! BRDropdownSelector  // 잘못된 view를 추출한 경우 nil exception 6.LayoutConstraints For Flexible UI더 유연한 레이아웃 동작을 원한다면, Static하게 선언된 수치보다는 LayoutConstraint로 제한적 범위 안에서 유동적으로 동작할 수 있도록 View를 주물러 주는 게 좋습니다. 예를 들어, 어떤 두 컴포넌트 사이의 최대 너비를 100으로 지정하되, 컨텐츠 사이즈에 따라 더 작아질 수도 있도록 하려면, LayoutConstraints의 Less than or Equal기능을 사용하는 것처럼 말이죠.Less than or equalLess than or Equal뿐만 아니라 Greater than or Equal도 존재합니다. 상황에 맞게 사용하는 지혜가 필요하죠. LayoutConstraint에는 Multiplier라는 개념도 있습니다. 만약 컴포넌트 A 절반 너비의 컴포넌트 B를 작성하고 싶다면, 그리고 이 조건이 화면 크기와 관계없이 동일하게 적용되기를 원한다면, 컴포넌트 B의 너비를 컴포넌트 A와 동일하게 Constraint로 지정하고, Multiplier를 0.5로 지정하면 됩니다. Multiplier는 단어 그대로 ‘배수ʼ라는 의미입니다.이처럼 화면 해상도에 구애받지 않는 유연한 UI를 작성하고 싶다면 LayoutConstraint 의 사용은 필수입니다. 브랜디 iOS 앱이 다양한 해상도의 iOS 디바이스에서 동일한 비율 로 출력되는 것도 이러한 LayoutConstraint를 사용했기 때문이죠.7.View를 핸들링할 그곳앞서 정리한 방식들을 사용해서 Storyboard, Xib 파일을 훌륭하게 작성했다면, 이제는 ViewController의 소스코드로 돌아올 차례입니다. View Size를 이벤트에 따라 변경하거나, 숨겼던 View를 보여주는 등의 작업들을 할 차례입니다.Storyboard나 Xib에서 작업한 View를 코드 상에서 다룰 일은 많습니다. 99.78% 이상 ViewController에서 View를 다루어야만 하죠. 무조건입니다.viewDidLoad() 에서 View는 대부분의 초기화 작업을 합니다. 그것은 소스코드를 다루는 개발자에게도 마찬가지죠. Storyboard에서 연결한 Outlet들도 이 Function에서부터 nil값이 아니게 됩니다. 따라서 뷰에 필요한 초기화 작업 (Button의 Title 지정, ImageView의 이미지 지정 등) 을 viewDidLoad()에서 모두 하면 됩니다. viewDidLoad()는 그 이름처럼 ViewController가 생성되었을 때 단 한 번 호출됩니다. 다시 거치지 않는 코드이기 때문에 ViewController에서 사용할 변수들을 초기화하는 등의 작업도 이 자리에서 할 수 있습니다. viewDidLoadoverride func viewDidLoad() {      super.viewDidLoad()     /* do 초기화 in 여기 */ } 다만 여기서 아무리 해도 안 되는 작업이 있습니다. View 사이즈를 해상도에 맞게 변경하는 작업 같은 것 말이죠. LayoutConstraint를 통해 지정된 사이즈를 가져올 때, 화면을 꽉 채우도록 Constraint를 지정해도 로그를 찍으면 엉뚱하게 더 적은 값 이나 큰 값이 나올 수도 있습니다. 이런 경우에는 아무리 viewDidLoad()에서 열심히 Constraint의 값을 가져와도 결과가 똑같을 겁니다.개미지옥override func viewDidLoad() {      super.viewDidLoad()     // 백년동안 코딩해도 화면 해상도가 다르게 나와요 } viewWillAppear() 에서는 viewDidLoad()에서 작동하지 않던(?) 코드를 적용할 수 있는 자리입니다. Constraint들로 지정된 사이즈들은 viewWillAppear()에서부터 각 디바이스의 해상도에 맞게 적용됩니다. 여기서부터는 화면 크기에 맞춘 SubView들의 사이징이나 Constarint들로부터 추출한 값이 의미가 있습니다.viewWillAppearoverride func viewWillAppear() {     super.viewWillAppear()     // 이제 아마 화면이 나올 차례인가봐요 } viewDidAppear()는 출력된 화면에 실행할 코드를 작성하는 자리입니다. 화면이 등장한 이후 보여줄 팝업창이나, 튜토리얼을 출력하는 건 여기서 해야 합니다. viewWillAppear()는 예상되는 출력 화면에서 호출되기 때문에, 실제로는 화면이 없는 상황에서도 호출될 수 있습니다. 만약 해당 viewController의 출력이 확실히 완료된 후 에 실행되어야 하는 이벤트라면, 이 Function에서 코드를 작성해야 합니다. viewDidAppearoverride func viewDidAppear() {     super.viewDidAppear()     // 화면 출력이 끝났답니다. 마음껏 코딩하세요! } 네, 지금까지 루키들을 위한 GUI 만들기의 기본 과정은 다 알려드렸습니다. 많은 개념과 기능, 방법론이 존재하지만 일단 이 정도면 알아도 첫 번째 iOS 앱 UI를 만들 준비는 어느 정도 마친 겁니다. 그럼 마지막으로 UI를 구성하면서 유용하게 사용할 수 있는 팁을 알려드리겠습니다. 8.Little Tricks1) Clip it, or not Clip it.ImageView를 다루다 보면 자주 발생합니다. 지정된 ImageView의 사이즈보다 이미지가 크면 이미지가 ImageView의 영역을 빠져나가버리는 건데요. 이것은 Label이나 View에서도 동일합니다. 작성한 컨텐츠가 부모 View보다 큰 경우 부모 View의 프레임을 벗어납니다. 이런 경우, 재부팅하세요. clipsToBounds 값을 true로 지정해주면.. view.clipsToBounds = true 매-직! 이 작업은 코드뿐만 아니라 Storyboard상에서도 가능합니다. Xib에서도 동일합니다. Storyboard에서 클리핑2)Circular View요즘 많이 사용하는 동그라미 모양 프로필 이미지 때문에 고생하는 고심하는 개발자들이 많을 겁니다. iOS에서는 이 작업을 view의 Layer를 편집하는 방식으로 아주 간단하게 처리할 수 있습니다.self.layer.cornerRadius = self.frame.size/2.0 self.layer.masksToBounds = true self.clipsToBounds = true 위의 코드를 사용하면 아래와 같은 이미지를 출력할 수 있습니다.둥글게 클립핑된 최신 트렌드의 ImageView를 간단하게 출력했습니다. 물론 위에서 언급한 clipsToBounds 값을 true로 지정해주는 것도 잊지 마시고요. 이 코드를 응용하면 모서리가 둥근 직사각형 뷰도 만들 수 있습니다. 원하는 곡률을 적용할 수 있죠. view의 Layer를 다루는 방법을 공부한다면 다양한 상황에서 유용하게 사용할 수 있을 겁니다.3)NSAtrributedString 클라이언트가 다양한 형태의 Font, Color의 텍스트를 한 문장에 넣어달라고 한다면 어떻게 작업해야 할까요? 스타일마다 Label 묶음을 만들어서 각각의 단어를 지정해주는 방법이 있습니다. 하지만 텍스트 또는 문장 구성이나 스타일이 서로 다른 묶음으로 변경된다면 어떨까요? 또 다시 새로운 기준으로 Label 묶음을 만들어야 할까요? 이럴 때 사용하기 좋은 녀석이 바로 NSAttributedString입니다. 볼드체, 보통체가 혼합된 텍스트에 색상이 다른 텍스트가 혼재되어 있는 Attributed String이렇게 다양한 형태의 텍스트를 한 문장에 담을 수 있고, 변경되는 내용이 있더라도 코드로 간단하게 수정하면 됩니다. 브랜디 앱에서도 NSAttrributedString을 많이 사용하고 있습니다. 브랜디 iOS 앱의 간지나는 UI 속 요소요소를 차지하고 있는 중요한 녀석이죠. 4)Debug Wirelessly 각종 케이블이 난잡하게 널부러진 책상을 보면 한숨이 나옵니까? 걱정하지 마세요. 이제 하나는 줄일 수 있을 겁니다. Xcode로도 무선 디버깅을 할 수 있기 때문이죠. 먼저 디바이스를 맥에 연결하고, Xcode가 활성화된 상태에서 Window > Devices And Simulators 항목을 클릭합니다. Devices and Simulators그런 다음 출력된 화면에서 원하는 디바이스를 선택하고 Connect via Network를 체크 합니다. (디바이스에 암호가 설정되어 있어야 합니다.) 지구본 모양이 디바이스 오른쪽에 있다면 무선 디버깅이 가능한 상태입니다. 무선디버깅체크9.Outro: 긴 글을 마무리하며아장아장 걸음마 시절이던 첫 개발 프로젝트 작업이 생각납니다. 클라이언트는 끝도 없이 요구를 하는데 구현하는 방법을 몰라 막막했던 적이 많았습니다. 여러 실수를 겪고 나서야 많은 것을 알게 되었죠. 그때를 생각하면 이제 막 iOS 개발을 시작하는 분들께 하나라도 더 도와주고 싶답니다. 지금 막 iOS 개발자가 되었나요? 그렇다면 이 포스팅은 분명 당신의 검색 한 번, 실수 한 번을 줄여줄 수 있을 겁니다.글이정환 과장 | R&D 개발1팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #개발자 #개발팀 #인사이트 #경험공유 #iOS
조회수 1629

수파자 서울대 과학 선생님 일주일만에 과학 4등급에서 1등급으로

안녕하세요? 대한민국의 모든 자녀들이 국내외 어디에서든 질 좋은 교육을 제공을 받을 수 있도록 항상 노력하는 수파자입니다. 오늘은 수파자에서 과학을 가르치고 계신 선생님 한 분을 소개해드리고자 합니다. 저희가 이 선생님을 알게된 건, 어느날 갑자기 수파자 본사 사무실에 전복이 도착해서였어요.다름아니라 바닷가 마을에 살고 계신 수파자의 고객님이 계셨는데, 이번에 수파자 덕분에 아이의 과학 성적이 눈에 띄게 상승하여 감사의 마음을 담아 보내주신 선물이었어요. 어머니께서 보내주신 전복은 수파자 전직원이 전복죽으로 감사히 맛있게 잘 나누어 먹었답니다! 그리고 영양 보충해서, 더 많은 학생들이 이렇게 기쁜 경험을 가질 수 있도록 으쌰으쌰 힘을 냈습니다.그리고 이런 이야기의 주인공, 바로 그 선생님!을 만나보지 않을 수 없었는데요, 그 분은 서울대학교 건축학과에 재학중이신 선생님이었습니다. 선생님께서는 이번 긴 연휴였던 추석 기간을 활용해서 학생과 매일매일 과학 수업을 진행하셨는데요,수업 전 4등급이던 학생의 과학 성적이 일주일 특강을 통해 바로 1등급 겟!공부는 재미라는 선생님의 말씀... 역시 갓서울대 저도 선생님처럼 공부를 잘 하면, 공부가 재미있을 것 같네요! 자세한 내용은 유튜브 영상을 통해 확인해주시고, 수파자의 모든 선생님은 공부 전문가 서울대 선생님으로만 구성되어 있어요.인터넷 강의실에서 수업이 진행되기 때문에, 인터넷이 가능한 전세계 어디에서나 수업을 받을 수 있고, 1:1 과외이기 때문에 내 아이의 상황과 수준을 고려하지 않고 천편일률적인 수업을 쏟아내는 학교/학원/인터넷 강의 수업과 달리 단기간 효과가 확실한 편입니다. 이제 수파자에서 직접 블로그를 운영하는 만큼많은 학습 정보, 입시 정보 꿀팁과 좋은 이야기들 많이 전해드리도록 하겠습니다. 아이들의 공부 고민이 모두 타파되는 그 날까지 수파자가 함께하겠습니다.#수파자 #서울대과외 #서울대건축학과 #화상과외 #온라인과외 #서울대선생님 #에듀테크
조회수 1165

스타트업을 시작하며...3

Phase 11. 살짝 암초에 걸리다.주로 사용하게 될 5ml 향수병 샘플을 중국에 있는 회사들에 요청하였는데.. 3개 회사 것이 도착하였으나, 아직 맘에 드는 것이 없다. 이런 된장. 그러던 중 관계가 있다던 fragrance house의 샘플 바틀을 보고 "바로  이거야"라는 느낌이 들어 급하게 메일을 써본다. 30ml 알루미늄 바틀은 좀 많이 비싸지 않을는지? 5ml 바틀은 사이즈가 없는 것은 아닐는지? 걱정 걱정에 잠 못 드는 밤들 이 살짝 생겨난다.Phase 12. 부정적인 의견들을 만나다.. 하지만 그것을 극복해보자!!이 서비스가 머릿속에서 잘 그려지지 않는데? 많은 사람들은 본인의 입장에서 feedback을 주는 경우가 많다.  그중에서 걸러서 들어야 할 것도 있고, 새겨 들어야 할 내용들도 있을 것이다. 구체적인 occasion을 더 제공해주지 않고 단순히 매월 향수를 보내주는 것에 대한 부정적인 의견이 있었고.. 이것을 6개월 box (보석상자 콘셉트)으로 개선해 가는 방향을 잡아 보았다. 6개월 치 향수 통을 담을 수 있는 box를 제공하면 collection이 완성될 것이고, 빈 자리들을 채워가고 싶은 욕심과 다음엔 어떤 것들이 올까? 에 대한 호기심을 만들어 낼 수 있지 않을까?phase 13. 현장이 답이지 말입니다.packaging design이 꽤나 중이요한 요소임을 처음부터 인지하고 있던지라, 굉장히 다양한 의견들을 만들어 보았다. 담뱃갑 모양, CD case 모양, 리본 형태, 파우치 형태, 등등. 만들어 보고 고민했는데.. 방산 시장을 가면서 새로운 월드를 발견하게 되었다. 참고할 것들이 많이 있었고, 현실적인 가격을 들을 수도 있었다. 아이디어를 mock up으로 만들다 보니.. 과대포장은 벌금을 내게 될 수도 있다는 사실도 알게 되었다. 그러다가 이젠 직접 디자인을 해서, 종이를 자르고, 접고, 접착을 해서 박스를 만드는 단계까지 오게 되었다. 이젠 다시 견적을 뽑아야 할 상황이다.Phase 14. 실마리가 될 수 있는 것들은 조금씩이라도 당겨보자..페이스 북에서 예전부터 알고 있던 디자이너 분이 "파워포인트"처럼 쉽게 웹 페이지를 만들 수 있는 서비스를 기획하고 진행하고 있다는 사실을 발견하고, 바로 연락을 하였다. 일단 만나보자고.. 만났더니 오히려 나에게 더 필요한 서비스를 소개해 주었다. Six Shop! 모든 사람들이 6분 만에 커머스를 만들 수 있도록 해주는 목표를 가진 서비스다. 이전에 고려하고 있던 WordPress + Woo-commerce 조합보다 훨씬 간단하게 사이트를 제작할 수 있다!! 코딩에 대한 부담과 시간에 대한 제약이 사라진다. 일단 사람을 만나고 나에 대해서 설명을 하고 도움을 요청하면 새로운 길들 이 나타나는 것을 느낀다.Phase 15. 투자를 받을 것인가?요즘 start up들이 투자받는 규모는 꽤나 크다. 몇 십억에서 몇백억까지 이젠 규모도 제법 된다. 부럽다.. 그런데 고민을 해본다. 투자를 왜 받아야 하지? 투자를  받는다는 것은 내가 갈 수 있는 속도보다 빠른 속도로 목표에 도달하기 위해 인재를 구하고, 마케팅을 하고, 개발에 힘을 쓸 수 있다는 것이다. 나에게 투자가 필요할 것인가? 나에게 1억이라는 투자금이 들어온다면 무엇을 해야 할까? 과연 필요할 것인가?#파펨 #스타트업 #창업가 #창업자 #마인드셋 #인사이트

기업문화 엿볼 때, 더팀스

로그인

/