스토리 홈

인터뷰

피드

뉴스

조회수 751

스타트업 이야기를 시작하며

안녕하세요,처음 뵙겠습니다! :) 저는 스타트업 기업인 BEFLOAT의 공동 창업자 겸 대표이사였던 박세호 라고 합니다. 지금부터 제가 쓸 글은 2012년부터 2013년 말까지 제가 복무전 경험했던 스타트업에 대한 생각들과, 20대의 패기로 스타트업을 시작하는 젊은 분들을 위한 조언 또는 경험담등을 가지고 이야기를 써 내려가려고 합니다. 저는 2007년 유학을 시작으로 2012년 4월 미국에서 경제학 학사로 대학교를 졸업하고, 귀국하여 고등학교 친구들과 처음 “AFLOAT”라는 이름으로 2014년 초 서비스가 종료 된 BEFLOAT 서비스를 기획하고 마케팅 하고 경영하였습니다.BEFLOAT의 첫 대문 ! BEFLOAT는 기존에 Gatekeeper들이 장악하고 있는 문화예술 컨텐츠시장에 SNS라는 소통의 장을 마련하여 창작자들과 수요자들이 보다 쉽게 연결 될 수 있는 통로를 만들고, 창작자들에게는 수익창출과이라는 강점과 수요자들에게는 문화적 욕구 충족이라는 두가지 궁극적 지향점을 가지고 있던 본격 문화예술 컨텐츠 SNS 였습니다.이 서비스를 기반으로 BEFLOAT 팀은 다양한 서비스들을 제작하였고 (BEFLOAT -Beta, BEFLOAT-Words), 비록 큰 대회같은곳에서 입상하지는 못했지만, 2013 서울시 창업 1000 프로젝트 선발, 2013 모파일 창업 코리아 예선 PT, 2013, 2014 K-startup 예선 PT, 2014 Seedstars Startup 예선PT 등의 국 내/외 창업 경진대회에서 쟁쟁한 서비스들과 각축을 다투었고(?), 서비스에 관련하여 많은 분들의 지지를 얻었습니다. 지금 BEFLOAT의 서비스는 종료되었지만, 문화예술 컨텐츠의 무한한 가능성과 BEFLOAT가 가지고 있던 지향점, 그리고 시장의 수요는 분명히 있다고 생각합니다. 앞으로도 기회가 된다면 또 해보고 싶은 서비스 라고 할 수 있습니다. 저는 이러한 성공적인, 또는 발전적인 경험을 바탕으로 젊은 창업자들이 보다 쉽고 효율적이게 스타트업을 생각하고 통찰 할 수 있는 글을 적고 싶어 2014년 정도부터 이 글을 쓰기 시작했고, 2015년 9월 전역까지 하나하나 스타트업에 관한 저의 생각들을 하나하나 꺼내 보여드리려 합니다. 불과 2년 밖에 안되는 짧은 경험으로 국내 스타트업이라던지, 전체적 서비스에 관한 고찰을 내릴 순 없지만, 꿈을 시작하시려는 분들, 창업중 막막한 고민을 가진 분들에게 좋은 참고가 될 수 있으면 좋겠습니다. 계속해서 이 글을 보시는 분들에게 심심한 감사의 말씀을 드리며 이제부터 시작하겠습니다.Start-up 섹션을 통크게 구분하자면  1. 제가 생각했던 스타트업에서 가장 막막했던 것들에 대한 개인적 풀이법들    2. 기획자의 경험으로서 보는사람도 즐겁고 만드는 사람도 즐겁게 할 수 있는 IR 작성하기   이외에도 하나하나 생각나고 말씀드리고 싶은 것들이 생겨나면 하나하나 풀어드리려 합니다. 관심가져 주시고 읽어 주셔서 감사합니다. 앞으로 시작하겠습니다!#코인원 #블록체인 #기술기업 #암호화폐 #스타트업인사이트
조회수 1412

결전! CodeShip Pro vs Travis-CI

데일리의 Java 백엔드 개발자는 Docker 기반의 CodeShip Pro를 애용하는데 최근에 빌드가 급격히 느려지는 문제를 겪었다. 빌드가 느려진 원인은 다양하지만 그 중 일부는 CodeShip Pro의 캐싱 방식, 더 정확히는 도커의 캐싱 방식과 관련이 있다.CodeShip Pro는 pom.xml 또는 build.gradle 을 보고 빌드에 필요한 라이브러리를 미리 가져와서 캐싱하기를 권장한다.# We're using the official Maven 3 image from the Docker Hub (https://hub.docker.com/_/maven/). # Take a look at the available versions so you can specify the Java version you want to use. FROM maven:3 # INSTALL any further tools you need here so they are cached in the docker build WORKDIR /app # Copy the pom.xml into the image to install all dependencies COPY pom.xml ./ # Run install task so all necessary dependencies are downloaded and cached in # the Docker image. We're running through the whole process but disable # testing and make sure the command doesn't fail. RUN mvn install clean --fail-never -B -DfailIfNoTests=false # Copy the whole repository into the image COPY . ./예전에는 이 방식이 문제가 안 됐는데 최근 들어 캐시 적중률이 급격히 낮아졌다. 여러 애플리케이션이 공유하는 라이브러리를 몇 개 추가했는데 그 중 하나가 빈번히 업데이트되는 게 문제다. pom.xml 파일을 자주 수정하는데 그 말인즉 COPY pom.xml ./ 줄부터 다시 빌드해야 한다는 뜻이다. 그러므로 RUN mvn install clean --fail-never -B -DfailIfNoTests=false 을 실행하는 횟수가 많고 평균 빌드시간이 장난 아니게 늘어난다.CodeShip Pro에서 이 문제를 해결하는 방법은 비교적 간단하다. pom.xml 파일을 둘로 쪼개면 된다. 자주 수정하는 `pom.xml` 파일부터 빌드하면 빌드 시간을 종전처럼 끌어내릴 수 있다.COPY pom-not-frequently-changed.xml ./ RUN mvn -f=pom-not-frequently-changed.xml install clean --fail-never -B -DfailIfNoTests=falseCOPY pom.xml ./ RUN mvn install clean --fail-never -B -DfailIfNoTests=false하지만 CodeShip Pro가 이와 유사한 문제로 여러 번 문제가 된 터라 Travis-CI로 옮기면 어떤 장단점이 있는지 확인해보았다.장점Travis-CI는 커밋과 푸시를 한 해당 브랜치 뿐 아니라 머징할 브랜치 등에서도 빌드를 돌린다.CodeShip보다 캐싱 정책을 수립하기 쉽다.캐시 적중률 문제가 덜하므로 빌드 시간이 좀더 안정적으로 유지된다.현재 머신 사양으로는 약 1분 가량 빌드가 빠르다.빌드 과정을 한 눈에 이해하기 쉽다.Cron 빌드를 지원한다. 시간이 지나면서 의존성 문제 등으로 빌드가 깨졌을 때 조기에 조치할 수 있다.단점Travis-CI는 로컬에서 CI 환경과 동일한 빌드환경을 제공하지 않는다..travis.yml 파일을 수정하고 테스트하려면 git push 를 반복해야 한다.테스트를 돌리는 리눅스 환경과 실제 서버가 작동하는 도커 리눅스 환경이 같지 않다.돈으로 더 좋은 머신을 도입할 수 없다.빌드 환경을 이전하기는 그리 어렵지 않다. 하지만 장단점이 명확하다 보니 어느 게 꼭 좋다 말하기 힘들다. 상황에 따라 결정하는 수밖에.#데일리 #데일리호텔 #개발 #개발자 #개발도구 #도입후기 #일지 #인사이트 #조언
조회수 1715

효율적인 회의를 위해 필요한 것들

일반적으로 회의는 짧은 시간 안에 다수의 팀원들의 소통을 통해팀의 목표를 확인하고,업무에 필요한 정보를 공유하고,빠르게 의사결정을 진행하는,하는 중요한 업무이고 무엇보다회의를 참여한 모든 사람들의 소중한 시간과 리소스를 모은다.라는 점에서 매우 중요한 업무입니다. 그러나, 잘못된 회의 때문에 목표를 명확하게 알 수 없고, 필요 없는 정보 때문에 논지가 흐려져 정확하게 의사결정을 할 수없다면, 정말 비싼 낭비가 될 수 있습니다.동료 간의 오버 커뮤니케이션은 필요한 덕목 중 하나지만,목표가 정해져 있는 회의에서 오버 커뮤니케이션은 시간낭비입니다.그래서 오늘은 이 글은 목적에 맞는, 목표를 확인하고, 정보를 공유하고, 의사결정과 수렴을 명확하게 할 수 있도록 도와주는 회의 방법에 대해 원론적으로 고민해 보고 수행할 수 있도록 해 보도록 제안해 보도록 하겠습니다. (애자일 시리즈도 곧 나올 예정이니 기다려 주세요!)너무 많은 주제와 목표, 참여자는 국물맛을 망칠 뿐이죠!효과적인 회의를 위해 필요한 요소1. 명확한 회의 주제 회의를 만들기 전 “왜 회의를 해야 하는 건지, 목적과 얻고자 하는 것은 무엇인지”에 대해 회의 발의자는 명확하게 설정하고 진행할 수 있어야 합니다.2. 회의에 참여하는 인원에 대한 고려"일단 회의에 필요한 사람들이라고 생각하면 다 모은다.”는 생각으로 참여자를 모으게 되면모두가 공유하는 배경지식이 없을 경우 명확히 의사결정을 할 수 없고,필요한 사람들에게 필요한 정보가 가는 것이 아닌 불필요한 정보전달로 업무의 모호함을 일으킬 수 있고,회의 참석자 역시 왜 자신이 해당 회의에 들어왔는지 의도가 파악되지 않아 혼란을 야기할 수 있어서,회의 발의자는 회의 주제를 명확하게 하는 것만큼 어떤 인원이 참여해야 할 지에 대해 고민해야 합니다.회의 참가가 반드시 필요한 인원을 예시를 들자면,발의된 내용에 의사결정을 할 수 있는 자배경지식에 대해 정확히 알고 있는 자의사결정에 도움을 줄 수 있는 자해당 의사결정으로 업무에 영향을 미치는 자로, 이외에 부분도 어느 정도 고려할 수 있지만, 명료하게 커뮤니케이션을 할 수 최소한의 인원을 모으는 것이 가장 중요합니다.3. 회의를 통해 얻을 산출물 회의를 통해 얻어갈 산출물(또는 예상하는 회의의 Outcome)이 없는 회의는 명확한 주제 없이 흘러가거나목적에 대해 관철시키지 못하는 방향으로 흐르게 돼 회의의 논지를 흐리게 됩니다. 그리고 논지가 흐린 회의는 길고 의미 없는 회의시간으로 진행돼, 남는 게 없는 회의를 하게 됩니다. 흔히 “회의록"이라는 것이 산출물이라고 생각할 수 있지만, 회의록은 “회의의 기록”이지 회의에서 얻고자 하는 결론을 얻어낸 것이 아닙니다. 그래서 제안드리는 부분은 발의자가 회의 시작 전 회의를 통해 얻어내고자 하는 산출물에 대해 참여자와 공유하거나, 어젠다를 공유해 배경과 과정에 대해 설명하고, 회의 참여자도 산출물에 대해 같이 고민할 수 있는 방향으로 진행할 수 있게 합니다.4. 회의의 과정, 어젠다 설정과 진행, 그리고 타임 박싱“일단 이야기를 시작해 볼까?”나 “내가 다 준비해 왔으니, 이거 설명하고 회의 끝내면 되겠다.” 아니면, "기왕 모였으니 이야기도 해볼까?" 등으로 어젠다 설정과 타임라인 없이 회의를 진행하면,대화를 어떻게 시작하고 어떻게 끝내야 할 것인지에 대해 명확하지 못하고정해진 시간보다 더 많은 시간이 소요되될 수 있고이로 인해서명확하지 못한 산출물을 얻어가거나회의가 아닌 설명회로 끝나거나회의가 삼천포로 빠지게 되는목적과 결과에 벗어난 회의로 빠질 수밖에 없습니다. 그러므로, 회의를 진행하는 발의자는 목적 달성과 명확한 산출물을 위해 회의 참여자들과 어떻게 커뮤니케이션을 진행해야 하는지, 어떤 순서와 과정으로 커뮤니케이션을 진행해야 하는지 확인하고(어젠다 설정), 회의에 맞지 않는 이야기가 나올 경우 명확하게 정리하고(목적 주지), 모든 참여자가 회의에 집중할 수 있도록 환경을 만들고(외부 요소, 잡담 차단),회의 진행에 시간을 명확하게 잡아(타임 박싱) 회의시간을 최대한 넘어가게 하지 않도록,회의를 진행해야 합니다.5. 회의 참여자의 집중이야기가 시작되었을 때 시작대는 타이핑 소리, 바로 옆에 있는 직원과 다른 이야기를 공유하는 소리(같은 주제더라도 모든 사람이 아닌 둘이서만 공유하는 소리) 등은 모든 회의에 참여하는 사람들의 집중을 흐릴뿐더러, 한번 공유한 내용을 두 번 세 번 다시 공지해야 하는 상황을 만들 수 있습니다. 정말 중요한 사항이 있다 라고 한다면, 회의를 참가하지 않거나 회의에서 나올 때 양해를 구하는 것이 모두에게 효과적입니다.그렇다면, 효과적인 회의를 위해 내가 해야 할 일은 무엇일까요?회의 발의자회의를 발의하고, 진행하는 사람. 발의한 사람의 의견이 필요할 경우, 진행하는 사람을 따로 두는 것도 좋으나, 배경과 목적을 가장 잘 아는 사람이 발의자 이기 때문에 진행을 같이 하는 게 더 좋습니다.회의에 대해 명확하게 준비해 주세요회의 시작 전회의를 진행하는 배경과 목적회의를 통해 얻어야 할 산출물회의에 필요한 인원회의 어젠다등을 준비하고 예상하는 시간 안에 회의를 잘 마칠 수 있도록 스코핑과 준비에 노력해 주세요.(나의 시간이 중요하듯 회의에 참여한 사람들의 시간도 중요하다는 것을 잊지 말아주세요).회의 목적과 시간을 참여자에게 미리 설명해 주세요회의시간이 시작되면(또는 시작 전), 참여자들에게 구두상으로 또는 메일로라도회의를 통해 얻어가는 목적회의 시간 (열리는 시간과 기간)를 알려주세요. 회의에 대한 정보를 더 정확하게 알 수록 회의를 참여자들도 더 집중해서 회의에 참여할 수 있습니다.회의를 진행할 사람을 반드시 어사인 해주세요회의 진행자를 반드시 어사인해 주세요(매우 중요!). 대부분은 발의자가 진행을 하겠지만, 발의자가 의견을 내고 보다 자유로운 자리에서 회의를 보고 싶다고 한다면, 해당 회의를 드라이브할 수 있는 Facilitator를 두고 진행하는 것이 반드시 필요합니다. Facilitator는 회의 어젠다에 따라 의견 수렴 및 정리를 하고, 잘 진행될 수 있도록 의견을 내기보단 진행에 집중해야 합니다.회의 시작 전, 어젠다에 대해 공유해 주세요회의 시작 시 모두가 모이면, 이번 회의는 어떻게 시작할 것이고 어떻게 끝이날 것인지에 대해 간단히 공유 휴 시작하게 되면 과정과 결과에 대해 서로가 보다 쉽게 접근할 수 있습니다. 저는 개인적으로 시작하기 전 화이트보드에 어젠다와 종료 시간을 적어놓고 시작하는 습관을 들여 모든 사람들이 쉽게 회의에 참여할 수 있도록 노력하는 편입니다.발의자 또는 Facilitor는 회의 주제를 벗어나는 이야기는 과감히 정리하고, 목표시간을 넘길 경우 과감히 대화를 중단시켜 주세요회의가 길어지거나, 집중력이 흐트러질 경우, 주제가 벗어난 이야기들이 나오고, 목표와는 다른 이야기들이 나올 수 있습니다. 그럴 때마다 회의 진행자는 의도치 않은 부분이 나온다 라고 할 경우, 다시 목표하는 부분으로 돌아와 이야기할 수 있도록 가이드해 주세요 해당 부분에 대한 이야기를 해야 할 필요가 있다고 해도, 주제와 벗어났다면, 다른 회의시간을 잡는 게 낫습니다.회의 참여자회의 때 전화기와 노트북은 잠시 꺼두셔도 좋습니다.(정말 진짜 진짜 제일 중요합니다!) 진짜 회의와 상관없이 커뮤니케이션을 위해 노트북이 필요하다면, 필요한 일을 마치고 회의에 들어와 주세요. 한 명의 정신 분산이 다른 사람들의 생산성을 떨어뜨릴 수 있습니다.잡담은 나중에. 모든 회의 참여자와 공유할 이야기가 아니면 지양해 주세요.다른 이야기 도중에 콘텍스트가 흐려질 수 있고, 두 그룹, 세 그룹으로 나눠 이어지는 대화는 회의에 집중을 해치고 회의시간을 낭비하게 됩니다.무엇보다도 집중해 주세요.회의에 집중하는 것이 무엇보다도 가장 중요하겠죠?오늘도 정신없고 긴 글이 나와버렸네요. 최근에 업무도 많아지고 다양한 업무를 하다 보니 글을 잘 못쓰게 되었네요. (네 다 핑계고 열심히 다시 쓸 수 있도록 환경을 좀 바꿔볼까 합니다.)다음글은 애자일 시리즈에 마지막글이 발행될 예정입니다! 마지막이라고 하기엔 앞으로도 제가 일하고 있는 업무환경과 일하고 있는 팀에 대한 글을 많이 쓸 예정이라 민망스럽긴 하지만, 그래도 서둘러 더 재밌는 글 많이 많이 올릴 수 있게 할게요 오늘도 읽어주셔서 감사합니다!#코인원 #블록체인 #기술기업 #암호화폐 #스타트업인사이트
조회수 1744

Tips for building fast portrait segmentation network with TensorFlow Lite

PrefaceDeep learning has led to a series of breakthroughs in many areas. However, successful deep learning models often require significant amounts of computational resources, memory and power. Deploying efficient deep learning models on mobile devices became the main technological challenge for many mobile tech companies.Hyperconnect developed a mobile app named Azar which has a large fan base all over the world. Recently, Machine Learning Team has been focusing on developing mobile deep learning technologies which can boost user experience in Azar app. Below, you can see a demo video of our image segmentation technology (HyperCut) running on Samsung Galaxy J7. Our benchmark target is a real-time (>= 30 fps) inference on Galaxy J7 (Exynos 7580 CPU, 1.5 GHz) using only a single core.Figure 1. Our network runs fast on mobile devices, achieving 6 ms of single inference on Pixel 1 and 28 ms on Samsung Galaxy J7. Full length video. There are several approaches to achieve fast inference speed on mobile device. 8-bit quantization is one of the popular approaches that meet our speed-accuracy requirement. We use TensorFlow Lite as our main framework for mobile inference. TensorFlow Lite supports SIMD optimized operations for 8-bit quantized weights and activations. However, TensorFlow Lite is still in pre-alpha (developer preview) stage and lacks many features. In order to achive our goal, we had to do the following:Understand details of TensorFlow and Tensorflow Lite implementation.Design our own neural network that can fully utilize optimized kernels of TensorFlow Lite. (Refer to 1, 2 and 3)Modify TOCO: TensorFlow Lite Optimizing Converter to correctly convert unsupported layers. (Refer to 4)Accelerate several quantized-layers with SIMD optimized code. (Refer to 5 and 6)We are willing to share our trials and errors in this post and we hope that readers will enjoy mobile deep learning world :)1) Why is depthwise separable layer fast in Tensorflow Lite ?Implementing low-level programs requires a bit different ideas and approaches than usual. We should be aware that especially on mobile devices using cache memory is important for fast inference.Figure 2. Memory access requires much more energy (640 pJ) than addition or multiplication.Accessing cache memory (8 pJ) is much cheaper than using the main memory (table courtesy of Ardavan Pedram) In order to get insight into how intrinsics instructions are implemented in Tensorflow Lite, we had to analyze some implementations including depthwise separable convolution with 3x3 kernelsBelow we describe some of the main optimization techniques that are used for building lightweight and faster programs.Loop UnrollingCan you spot the difference between the following two code fragments?for (int i = 0; i < 32; i++) { x[i] = 1; if (i%4 == 3) x[i] = 3; } for (int i = 0; i < 8; i++) { x[4*i ] = 1; x[4*i+1] = 1; x[4*i+2] = 1; x[4*i+3] = 3; } The former way is what we usually write, and the latter is loop-unrolled version of former one. Even though unrolling loops are discouraged from the perspective of software design and development due to severe redundancy, with low-level architecture this kind of unrolling has non-negligible benefits. In the example described above, the unrolled version avoids examining 24 conditional statements in for loop, along with neglecting 32 conditional statements of if.Furthermore, with careful implementation, these advantages can be magnified with the aid of SIMD architecture. Nowadays some compilers have options which automatically unroll some repetitive statements, yet they are unable to deal with complex loops.Separate implementation for each caseConvolution layer can take several parameters. For example, in depthwise separable layer, we can have many combinations with different parameters (depth_multiplier x stride x rate x kernel_size). Rather than writing single program available to deal with every case, in low-level architectures, writing number of case-specific implementations is preferred. The main rationale is that we need to fully utilize the special properties for each case. For convolution operation, naive implementation with several for loops can deal with arbitrary kernel size and strides, however this kind of implementation might be slow. Instead, one can concentrate on small set of actually used cases (e.g. 1x1 convolution with stride 1, 3x3 convolution with stride 2 and others) and fully consider the structure of every subproblem.For example, in TensorFlow Lite there is a kernel-optimized implementation of depthwise convolution, targeted at 3x3 kernel size:template <int kFixedOutputY, int kFixedOutputX, int kFixedStrideWidth, int kFixedStrideHeight> struct ConvKernel3x3FilterDepth8 {}; Tensorflow Lite further specifies following 16 cases with different strides, width and height of outputs for its internal implementation:template <> struct ConvKernel3x3FilterDepth8<8, 8, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 4, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 2, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 1, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 2, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 4, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<1, 4, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 1, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 2, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 4, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 1, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 2, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 4, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 1, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<1, 2, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<1, 4, 2, 2> { ... } Smart Memory Access PatternSince low-level programs are executed many times in repetitive fashion, minimizing duplicated memory access for both input and output is necessary. If we use SIMD architecture, we can load nearby elements together at once (Data Parallelism) and in order to reduce duplicated read memory access, we can traverse the input array by means of a snake-path.Figure 3. Memory access pattern for 8x8 output and unit stride, implemented in Tensorflow Lite's depthwise 3x3 convolution. The next example which is targeted to be used in much smaller 4x1 output block also demonstrates how to reuse preloaded variables efficiently. Note that the stored location does not change for variables which are loaded in previous stage (in the following figure, bold variables are reused):Figure 4. Memory access pattern for 4x1 output and stride 2, implemented in Tensorflow Lite's depthwise 3x3 convolution. 2) Be aware of using atrous depthwise convolutionAtrous (dilated) convolution is known to be useful to achieve better result for image segmentation[1]. We also decided to use atrous depthwise convolution in our network. One day, we tried to set stride for atrous depthwise convolution to make it accelerate computation, however we failed, because the layer usage in TensorFlow (≤ 1.8) is constrained.In Tensorflow documentation of tf.nn.depthwise_conv2d (slim.depthwise_conv2d also wraps this function), you can find this explanation of rate parameter.rate: 1-D of size 2. The dilation rate in which we sample input values across the height and width dimensions in atrous convolution. If it is greater than 1, then all values of strides must be 1.Even though TensorFlow doesn’t support strided atrous function, it doesn’t raise any error if you set rate > 1 and stride > 1. <!-- The output of layer doesn't seem to be wrong. -->>>> import tensorflow as tf >>> tf.enable_eager_execution() >>> input_tensor = tf.constant(list(range(64)), shape=[1, 8, 8, 1], dtype=tf.float32) >>> filter_tensor = tf.constant(list(range(1, 10)), shape=[3, 3, 1, 1], dtype=tf.float32) >>> print(tf.nn.depthwise_conv2d(input_tensor, filter_tensor, strides=[1, 2, 2, 1], padding="VALID", rate=[2, 2])) tf.Tensor( [[[[ 302.] [ 330.] [ 548.] [ 587.]] [[ 526.] [ 554.] [ 860.] [ 899.]] [[1284.] [1317.] [1920.] [1965.]] [[1548.] [1581.] [2280.] [2325.]]]], shape=(1, 4, 4, 1), dtype=float32) >>> 0 * 5 + 2 * 6 + 16 * 8 + 9 * 18 # The value in (0, 0) is correct 302 >>> 0 * 4 + 2 * 5 + 4 * 6 + 16 * 7 + 18 * 8 + 20 * 9 # But, the value in (0, 1) is wrong! 470 Let’s find the reason why this difference happened. If we just put tf.space_to_batch and tf.batch_to_space before and after convolution layer, then we can use convolution operation for atrous convolution (profit!). On the other hand, it isn’t straightforward how to handle stride and dilation together. In TensorFlow, we need to be aware of this problem in depthwise convolution.3) Architecture design principles for efficient segmentation networkUsually segmentation takes more time than classification since it has to upsample high spatial resolution map. Therefore, it is important to reduce inference time as much as possible to make the application run in real-time.It is important to focus on spatial resolution when designing real-time application. One of the easiest ways is to reduce the size of input images without losing accuracy. Assuming that the network is fully convolutional, you can accelerate the model about four times faster if the size of input is halved. In literature[2], it is known that small size of input images doesn’t hurt accuracy a lot.Another simple strategy to adopt is early downsampling when stacking convolution layers. Even with the same number of convolution layers, you can reduce the time with strided convolution or pooling within early layers.There is also a tip for selecting the size of input image when you use Tensorflow Lite quantized model. The optimized implementations of convolution run best when the width and height of image is multiple of 8. Tensorflow Lite first loads multiples of 8, then multiples of 4, 2 and 1 respectively. Therefore, it is the best to keep the size of every input of layer as a multiple of 8.Substituting multiple operations into single operation can improve speed a bit. For example, convolution followed by max pooling can be usually replaced by strided convolution. Transpose convolution can also be replaced by resizing followed by convolution. In general, these operations are substitutable because they perform the same role in the network. There are no big empirical differences among these operations. <!-- substitutable -->Tips described above help to accelerate inference speed but they can also hurt accuracy. Therefore, we adopted some state-of-the-art blocks rather than using naive convolution blocks.Figure 5.  Atrous spatial pyramid pooling (figure courtesy of Liang-Chieh Chen) Atrous spatial pyramid pooling[1] is a block which mimics the pyramid pooling operation with atrous convolution. DeepLab uses this block in the last layer.We also substitute most of the convolution layers with efficient depthwise separable convolution layers. They are basic building blocks for MobileNetV1[3] and MobileNetV2[4] which are well optimized in Tensorflow Lite.4) Folding batchnorm into atrous depthwise convolutionWhen quantizing convolution operation followed by batchnorm, batchnorm layer must be folded into the convolution layers to reduce computation cost. After folding, the batchnorm is reduced to folded weights and folded biases and the batchnorm-folded convolution will be computed in one convolution layer in TensorFlow Lite[5]. Batchnorm gets automatically folded using tf.contrib.quantize if the batchnorm layer comes right after the convolution layer. However, folding batchnorm into atrous depthwise convolution is not easy.In TensorFlow’s slim.separable_convolution2d, atrous depthwise convolution is implemented by adding SpaceToBatchND and BatchToSpaceND operations to normal depthwise convolution as mentioned previously. If you add a batchnorm to this operation by including argument normalizer_fn=slim.batch_norm, batchnorm does not get attached directly to the convolution layer. Instead, the graph will look like the diagram below: SpaceToBatchND → DepthwiseConv2dNative → BatchToSpaceND → BatchNorm The first thing we tried was to modify TensorFlow quantization to fold batchnorm bypassing BatchToSpaceND without changing the order of operations. With this approach, the folded bias term remained after BatchToSpaceND, away from the convolution layer. Then, it became separate BroadcastAdd operation in TensorFlow Lite model rather than fused into convolution. Surprisingly, it turned out that BroadcastAdd was much slower than the corresponding convolution operation in our experiment:Timing log from the experiment on Galaxy S8 ... [DepthwiseConv] elapsed time: 34us [BroadcastAdd] elapsed time: 107us ... To remove BroadcastAdd layer, we decided to change the network itself instead of fixing TensorFlow quantization. Within slim.separable_convolution2d layer, we swapped positions of BatchNorm and BatchToSpaceND. SpaceToBatchND → DepthwiseConv2dNative → BatchNorm → BatchToSpaceND Even though batchnorm relocation could lead to different outputs values compared to the original, we did not notice any degradation in segmentation quality.5) SIMD-optimized implementation for quantized resize bilinear layerAt the time of accelerating TensorFlow Lite framework, conv2d_transpose layer was not supported. However, we could use ResizeBilinear layer for upsampling as well. The only problem of this layer is that there is no quantized implementation, therefore we implemented our own SIMD quantized version of 2x2 upsampling ResizeBilinear layer.Figure 6. 2x2 bilinear upsampling without corner alignnment. To upsample image, original image pixels (red circles) are interlayed with new interpolated image pixels (grey circles). In order to simplify implementation we do not compute pixel values for the bottommost and rightmost pixels, denoted as green circles.for (int b = 0; b < batches; b++) { for (int y0 = 0, y = 0; y <= output_height - 2; y += 2, y0++) { for (int x0 = 0, x = 0; x <= output_width - 2; x += 2, x0++) { int32 x1 = std::min(x0 + 1, input_width - 1); int32 y1 = std::min(y0 + 1, input_height - 1); ResizeBilinearKernel2x2(x0, x1, y0, y1, x, y, depth, b, input_data, input_dims, output_data, output_dims); } } } Every new pixel value is computed for each batch separately. Our core function ResizeBilinearKernel2x2 computes 4 pixel values across multiple channels at once.Figure 7. Example of 2x2 bilinear upsampling of top left corner of image. (a) Original pixel values are simply reused and (b) – (d) used to interpolate new pixel values. Red circles represent original pixel values. Blue circles are new interpolated pixel values computed from pixel values denoted as circles with black circumference. NEON (Advanced SIMD) intrinsics enable us to process multiple data at once with a single instruction, in other words processing multiple data at once. Since we deal with uint8 input values we can store our data in one of the following formats uint8x16_t, uint8x8_t and uint8_t, that can hold 16, 8 and 1 uint8 values respectively. This representation allows to interpolate pixel values across multiple channels at once. Network architecture is highly rewarded when channels of feature maps are multiples of 16 or 8:// Handle 16 input channels at once int step = 16; for (int ic16 = ic; ic16 <= depth - step; ic16 += step) { ... ic += step; } // Handle 8 input channels at a once step = 8; for (int ic8 = ic; ic8 <= depth - step; ic8 += step) { ... ic += step; } // Handle one input channel at once for (int ic1 = ic; ic1 < depth; ic1++) { ... } SIMD implementation of quantized bilinear upsampling is straightforward. Top left pixel value is reused (Fig. 7a). Bottom left (Fig. 7b) and top right (Fig. 7c) pixel values are mean of two adjacent original pixel values. Finally, botom right pixel (Fig. 7d) is mean of 4 diagonally adjacent original pixel values.The only issue that we have to take care of is 8-bit integer overflow. Without a solid knowledge of NEON intrinsics we could go down the rabbit hole of taking care of overflowing by ourself. Fortunately, the range of NEON intrinsics is broad and we can utilize those intrinsics that fit our needs. The snippet of code below (using vrhaddq_u8) shows an interpolation (Fig. 7d) of 16 pixel values at once for bottom right pixel value:// Bottom right output_ptr += output_x_offset; uint8x16_t left_interpolation = vrhaddq_u8(x0y0, x0y1); uint8x16_t right_interpolation = vrhaddq_u8(x1y0, x1y1); uint8x16_t bottom_right_interpolation = vrhaddq_u8(left_interpolation, right_interpolation); vst1q_u8(output_ptr, bottom_right_interpolation); 6) Pitfalls in softmax layer and demo codeThe first impression of inference in TensorFlow Lite was very slow. It took 85 ms in Galaxy J7 at that time. We tested the first prototype of TensorFlow Lite demo app by just changing the output size from 1,001 to 51,200 (= 160x160x2)After profiling, we found out that there were two unbelievable bottlenecks in implementation. Out of 85 ms of inference time, tensors[idx].copyTo(outputs.get(idx)); line in Tensor.java took up to 11 ms (13 %) and softmax layer 23 ms (27 %). If we would be able to accelerate those operations, we could reduce almost 40 % of the total inference time!First, we looked at the demo code and identified tensors[idx].copyTo(outputs.get(idx)); as a source of problem. It seemed that the slowdown was caused by copyTo operation, but to our surprise it came from int[] dstShape = NativeInterpreterWrapper.shapeOf(dst); because it checks every element (in our case, 51,200) of array to fill the shape. After fixing the output size, we gained 13 % speedup in inference time.<T> T copyTo(T dst) { ... // This is just example, of course, hardcoding output shape here is a bad practice // In our actual app, we build our own JNI interface with just using c++ code // int[] dstShape = NativeInterpreterWrapper.shapeOf(dst); int[] dstShape = {1, width*height*channel}; ... } The softmax layer was our next problem. TensorFlow Lite’s optimized softmax implementation assumes that depth (= channel) is bigger than outer_size (= height x width). In classification task, the usual output looks like [1, 1(height), 1(width), 1001(depth)], but in our segmentation task, depth is 2 and outer_size is multiple of height and width (outer_size » depth). Implementation of softmax layer in Tensorflow Lite is optimized for classification task and therefore loops over depth instead of outer_size. This leads to unacceptably slow inference time of softmax layer when used in segmentation network.We can solve this problem in many different ways. First, we can just use sigmoid layer instead of softmax in 2-class portrait segmentation. TensorFlow Lite has very well optimized sigmoid layer.Secondly, we could write SIMD optimized code and loop over depth instead of outer_size. You can see similar implementation at Tencent’s ncnn softmax layer, however, this approach has still its shortcomings. Unlike ncnn, TensorFlow Lite uses NHWC as a default tensor format:Figure 8. NHWC vs NCHW In other words, for NHWC, near elements of tensor hold channel-wise information and not spatial-wise. It is not simple to write optimized code for any channel size, unless you include transpose operation before and after softmax layer. In our case, we tried to implement softmax layer assumming 2-channel output.Thirdly, we can implement softmax layer using pre-calculated lookup table. Because we use 8-bit quantization and 2-class output (foreground and background) there are only 65,536 (= 256x256) different combinations of quantized input values that can be stored in lookup table:for (int fg = 0; fg < 256; fg++) { for (int bg = 0; bg < 256; bg++) { // Dequantize float fg_real = input->params.scale * (fg - input->params.zero_point); float bg_real = input->params.scale * (bg - input->params.zero_point); // Pre-calculating Softmax Values ... // Quantize precalculated_softmax[x][y] = static_cast<uint8_t>(clamped); } } ConclusionIn this post, we described the main challenges we had to solve in order to run portrait segmentation network on mobile devices. Our main focus was to keep high segmentation accuracy while being able to support even old devices, such as Samsung Galaxy J7. We wish our tips and tricks can give a better understanding of how to overcome common challenges when designing neural networks and inference engines for mobile devices.At the top of this post you can see portrait segmentation effect that is now available in Azar app. If you have any questions or want to discuss anything related to segmentation task, contact us at ml-contact@hcpnt.com. Enjoy Azar and mobile deep learning world!References[1] L. Chen, G. Papandreou, F. Schroff, H. Adam. Rethinking Atrous Convolution for Semantic Image Segmentation. June 17, 2017, https://arxiv.org/abs/1706.05587[2] C. Szegedy, V. Vanhoucke, S. Ioffe, J. Shlens, Z. Wojna. Rethinking the Inception Architecture for Computer Vision. December 11, 2015, https://arxiv.org/abs/1512.00567[3] A. Howard, M. Zhu, B. Chen, D. Kalenichenko, W. Wang, T. Weyand, M. Andreetto, H. Adam. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications, April 17, 2017, https://arxiv.org/abs/1704.04861[4] M. Sandler, A. Howard, M. Zhu, A. Zhmoginov, L. Chen. MobileNetV2: Inverted Residuals and Linear Bottlenecks. January 18, 2018, https://arxiv.org/abs/1801.04381[5] B. Jacob, S. Kligys, B. Chen, M. Zhu, M. Tang, A. Howard, H. Adam, D. Kalenichenko. Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference. December 15, 2017, https://arxiv.org/abs/1712.05877
조회수 909

디자이너가 혹시라도 멋져보인다거나 그러면.

포토샵을 열어요. 대지를 만들어요. 레이어를 만들어요. 고민을 해요. 핀터레스트를 본다. 빠져둔당. 2시간 순삭. 사진을 찾자. 2시간 순삭. 와씨...점심먹을 시간됨. 점심먹고 앉아서 다시 레이어를 만든다. 사진을 찾았다. 다른이름으로 저장... 문서에서 열어서 컨트롤 에이, 씨, ㅂ (욕 아님. v발음이예요.) 옮겨서 컨트롤 티 크기조정하고 마스크씌우고 쓱싹쓱싹 닦아내고 지우고 컨트롤 엘. 레벨조정 스윽... 밝아지고, 커브로 배불뚝이 S라인 만들어주고, 다시 레이어 만들고 눌러서 드롭섀도 주고 레이어 만들고, 텍스트 복붙하고 레이어만들고...아 맞다. 저장.레이어만들고, 흰색칠하고 다시 레이어만들고 마스크 씌우고 잘라내고, 그림 불러오고 고급개체 만들고 자유변형해서 기울이고 그림자 주고 레이어만들어서 광원효과 주고. 레이어만들고 텍스트 또 복붙해요. 아까 그 레이어랑 그룹핑 시켜줘요. 레이어 만들고 유튜브를 하나 볼까?..(중요)2시간 순삭.아씨...다시 레이어 만들고, 일러를 켜고. 일러에서 패스따서 아이콘 만들어요. 내보내기해서 고급개체로 불러왔는데 아놔 뭔가 작아지니까 안이뻐. 다시 만들고 또 만들고, 패스따고 도형만들고 합치고, 나누고 나부랭이 지우고 레이어 만들어서 아래꺼 고정시키고 레이어만들고 선만 따로 그룹핑, 레이어만들고 나머지 그려주고. 견본색 스포이드로 찍어서 따로 저장해놓고 선 끝처리 해주고 내보내기.포토샵으로 돌아오기 전 배고프니까 간식 와구와구..... 하나만 먹어야지. 한 봉지만... 컵라면도.. 피씨방인줄.포토샵으로 돌아와서 레이어만들고..아 왜 만들었지? 다시 지우고 아 맞다...그거 할려고 했지. 다시 만들고 그라데이션 만들고 레이어 만들고 글자쓰고 글자 테두리 따서 클리핑해주고 위로 옮겨요.그리고 레이어만들고..( 무표정.... )레이어 만들고 칠해주고 또 레이어 만들어서 위에 클리핑해주고, 레이어 만들어서 브러쉬로 뭐 그린다음 패턴지정하고 저장해서 다시 패턴채우기. 레이어만들고 브러쉬2000pt 잡고 흰색으로 삥! 만들어서 광원효과만들고 투명도 주고 다시 레이어 만들어서 빤짝이를 만듭니다. 레이어를 만들고 글씨를 쓰고 하늘색 정렬선 쭉쭉 끌어오고 레이어만들고 정렬맞춰요. 아오..텍스트가 애매하게 줄바꿈 되었어요. 한 단어만 툭 튀어나옴. 한툭튀. 뭔가 지울 게 없나 살펴봅니다. 클라이언트에게 전화를 해요. 이거 텍스트 좀 수정해도 돼요? 안돼요. 네. 자간을 좀 줄이자... 겨우 맞춤. 정렬선만들고 제목선 맞추고 정렬선만들고 두개 만들고 세개 만들고 문단맞추고 정렬선만들고 정렬선 또 만들어서 하단 맞추고 정렬선 만들고 오케이 계획대로 되고 있어.저장해주기.언스플래쉬가서 사진 찾기. 맘에 드는 거 없어. 턱수염아저씨들밖에 없음. 얼굴없는 걸로 셀렉. 불러와서 컨트롤 ㅆㅂ. (C+V) 레이어만들고 다시 편집, 레이어만들고 사진 위에 필터효과 주기, 레이어만들고 광원효과.레이어만들었는데 허리아퍼...일어나서 끄으으아아아어으아으아ㅡ아으아으앙 뚜둑.다시 앉아서 레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..잠깐 멍......턱을 괴고 쳐다봅니다.맘에 안들어...다시 레이어 그룹핑해서 잠시 눈 꺼놓고 다시 만듦. 색조정하고 레이어 만들고 아놔..... 메뉴꺼짐. 다시 불러와서 또 레이어만들고 클릭 딸깍..클릭 딸깍..레이어만들고 마스크만들어줘요. 폭염에 마스크쓰고 그룹핑에 쳐박힌 레이어기분을 니들이 알아?(feat. 마미손) 레이어만들고 반전주고 투명도23% 멀티플잡아주고 레이어만들고 가자 렛츠고.번아웃...하기싫어졌습니다. 손목이 아파서 잠시 허리를 풀어봅니다.(사실 손목을 어떻게 푸는 지 모르겠어..) 바람을 쐬고 와야지.. 바람을 쐬고옵니다. 다시 컴퓨터로 돌아오니 미치겠음. 갑자기 일정을 다시 보면 뭔가 달라지진 않았을까 싶어서 일정을 다시 확인함. 데드라인은 변함없어요. 오늘의 나는 노쇠했으니 내일의 나에게 기대를 걸어보는 것은 어떨까? 그런데 어제도 그랬어.이젠 아무 생각이 없어지고 레이어 만들어요. 노운프로젝트에서 아이콘 다운받아서 (이젠 일러로 만들기도 싫음) 포토샵으로 데려와서 아이콘 박아주고 선택툴 만들고 색바꿔주고 레이어 만들고...레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..잠깐! 아..이거 로고상태가....?  로고 파일을 JPG로 주셨네.자동지우개.. 허용치10...정도 주고 흰색을 날려보자..오호 로고에 흰색이 섞여있어서 같이 날아가네? (이 때 해야할 방법을 알지만 그것 말고 다른 방법은 없을 지 잠시 생각.. = 없음)패쓰로 누끼따기.... 딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트/딸깍쉬프트 다 됬다.. 이제 다시레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고..레이어만들고.. 레이어에 색칠해서 그룹핑 정리해주고 이름..........은 귀찮아서 안바꾸기로. 어차피 수정오면 다시 내가 만들건데 뭐...일단 다른 이름으로 저장. 알컨쉬+에쓰. 이미지로 뾱.. 피앤지로 저장. 메일을 쓰자...'담...당..자 님.... 요청..하신 시안...드립...니다... 확인..하시..고.. 피..드백..부..탁(시러) 드..립..니....다.'보내기 꾹. ㅓㅜㅑ 어깨야...Q. 총 몇 개의 레이어가 만들어져 있을까요?
조회수 857

AWS IoT Core 활용하기

이 포스팅에 실린 실습은 AWS CLI가 설치되어 있고, AWS credentials이 설정되어 있는 상태에서 진행했습니다. 서버와 하드웨어 사이의 TCP 연결을 구현하지 않고 AWS IoT를 이용해 MQTT 프로토콜로 데이터를 송수신하는 환경을 구성해보겠습니다. 진행을 위해 AWS IoT와 NodeJS가 필요합니다.1.AWS IoT Core로 접속해 사물을 생성합니다. 테스트로 1개만 사용할 것이므로 “단일 AWS IoT 사물”로 등록합니다.2.‘인증서 없이 사물 생성’을 클릭합니다. 인증서는 사물 등록 후에 생성할 예정입니다.3.사물이 정상적으로 등록되었는지 확인합니다.4.루트 CA 인증서를 생성합니다. 4-1.개인키를 생성하기 전, openssl 설정 파일을 추가해 아래 내용으로 저장합니다. 아래와 같이 진행하는 이유는 basicConstraints = true로 설정하기 위해서입니다.4-2.개인키를 생성합니다.openssl genrsa -out rootCA.key 2048 4-3.루트 인증서를 생성합니다.openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem -config rootCA_openssl.conf -extensions v3_ca 5.인증서를 생성합니다. 5-1.AWS IoT 등록 코드를 확인합니다.aws iot —region=ap-northeast-1 get-registration-code 5-2.개인키를 생성합니다.openssl genrsa -out verificationCert.key 2048 5-3.CSR을 생성합니다. 앞서 5-1에서 확인한 등록코드를 Common Name 항목에 입력합니다.openssl req -new -key verificationCert.key -out verificationCert.csr 5-4.인증서를 생성합니다.openssl x509 -req -in verificationCert.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out verificationCert.pem -days 500 -sha256 5-5.CA 인증서와 개인 인증서 파일들을 확인합니다.5-6.AWS에 인증서를 등록합니다.aws iot register-ca-certificate —ca-certificate file://rootCA.pem —verification-cert file://verificationCert.pem —region=ap-northeast-2 5-7.AWS에 인증서를 활성화합니다.aws iot update-ca-certificate --certificate-id 인증서 등록 후 응답으로 오는 certificateId 값 --new-status ACTIVE --region=ap-northeast-2 예)aws iot update-ca-certificate —certificate-id AAAAAABDADFDF1ABADFDFDFDF### —new-status ACTIVE —region=ap-northeast-2 5-8.AWS에 인증서 자동 등록 활성화를 켭니다.6.AWS 콘솔에 접속해 CA 인증서 등록을 확인합니다.7.AWS 콘솔에서 인증서를 생성합니다.7-1.원클릭 인증서 생성을 클릭합니다.7-2.활성화를 클릭하면 완료됩니다.8.인증서와 사물을 연결합니다.9.상호 작용 탭에서 디바이스를 연결합니다.10.환경에 맞게 선택하여 다운로드합니다.11.압축을 해제해 srart.sh를 실행하고, 연결 대기합니다.12.AWS IoT 테스트 접속 후, topic 1으로 메시지를 게시합니다.13.터미널을 확인합니다.이것으로 AWS IoT 로컬 환경이 구성되었습니다. AWS IoT를 사용하면 서버와 하드웨어를 제어하는 클라이언트 간 통신을 쉽게 하도록 다양한 구성을 할 수 있습니다. 모든 포맷은 JSON 포맷으로 송수신하며, MQTT(Message Queueing Telemetry Transport) 방식이라 양방향 통신을 쉽게 처리하고 전송할 수 있을 겁니다.참고자세한 MQTT - Publish/Subscribe 모델은 여기를 클릭하세요.글장현준 팀장 | R&D 개발3팀janghj@brandi.co.kr브랜디, 오직 예쁜 옷만
조회수 2705

에이스프로젝트 신규입사자 OJT

두근두근 새 회사 첫 출근 날!깔끔한 사무실, 내 이름표가 붙은 책상, 잘 세팅되어 있는 컴퓨터, 여기까지는 좋았는데...."이번에 새로 입사한 땡땡땡이라고 합니다. 잘 부탁드립니다!"(짝짝짝!)서로 인사를 나눈 이후로 다들 스크럼이다, 아침 회의다, 업데이트다 바빠 보이고 혼자 멀뚱멀뚱 모니터만 보고 있다 보면 어느덧 점심시간.......신규입사자의 첫날 둘째 날이 보통 이렇게 지나가곤 합니다.(안돼..!)에이스프로젝트는 신규입사자의 빠른 안착과 꿔다 놓은 보릿자루화 방지를 위해 3일간 알차고 체계적인 OJT(On the Job Traning)를 진행합니다.프론트와 함께라면 외롭지 않아요!어떤 교육이 진행되는지 살펴볼까요?/ 웰컴 투어맨 먼저 지식관리자와 함께 웰컴 투어를 합니다.회의실이 많은 에이스프로젝트, 잠실도 가보고 목동도 가보고 다저스에도 가봅니다.화장실은 어디인지, 담배는 어디서 피우는지, 각 팀들은 어디에 있는지, 카페테리아는 어떻게 이용하는지 사무실을 함께 돌면서 안내를 받을 수 있어요.입사키트와 퀘스트/ 입사퀘스트 ; 환영한다 낯선 이여!세팅도 게임회사답게!입사 구비서류 제출부터 각종 프로그램을 설치하는 방법, 담당자 안내까지.퀘스트를 하나씩 하다 보면 어느덧 기본 세팅이 완료됩니다.퀘스트를 완료할 때마다 꿀보상이 주어집니다./ 입사키트 ; 입사자를 위한 작은 책어서 와, 에이스프로젝트는 처음이지?입사키트에는 에이스프로젝트의 팀 소개, 생활 가이드, 복리후생 등이 안내되어 있습니다.잊어버릴 때마다 다시 찾아서 볼 수 있어요!/ 커뮤니케이션 툴1일차의 핵심 프로그램!프론트 지식관리자와 함께하는 커뮤니케이션 툴 교육이 진행됩니다.구글 메일, 드라이브, 캘린더를 사용해 효과적으로 협업하는 방법,컨플루언스, 슬랙의 성격과 활용 팁을 듣고 실습도 합니다!/ 에이스프로젝트 조직문화2일차에는 인사담당자와 에이스프로젝트의 조직문화에 대해 이야기를 나누는 시간을 갖습니다.에이스프로젝트의 역할 중심 조직 문화, 중요하게 생각하는 권리와 의무를 차근차근 알려드립니다.현재 에이스프로젝트의 조직 구성과 각 역할을 맡은 구성원을 소개하고, 덤으로 그동안 에이스프로젝트가 어떻게 성장해 왔는지 히스토리도 알 수 있는 시간입니다./ 평가와 보상3일차에는 에이스프로젝트의 평가 제도, 인센티브 제도 관련 교육이 진행됩니다.에이스프로젝트가 어떤 것을 지향하고 어떤 것을 평가하는지, 성과는 어떻게 분배하는지 알 수 있습니다.신규입사자가 들어오면 서포터가 배정됩니다.서포터는 생활 면에서 신규입사자에게 도움을 주는 사람입니다."무슨 음식 좋아해요? 점심은 어떤 걸 먹을까요?""점심시간에 같이 게임해요!""도서 신청은 여기에서 할 수 있어요"같은 팀에서, 주로 자리가 가깝고 낯을 덜 가리는(?) 분이 배정되어 갓 알게 된 사람끼리의 서먹함을 해소하고 신규입사자의 회사생활을 도와줍니다.입사 5일차, 사무실과 주변 사람들이 익숙해질 무렵 CEO와 런치를 함께 합니다.사실 신규입사자와 CEO가 얼굴을 마주하고 대화할 일이 거의 없죠..?(2차 면접 때 가장 많은 대화를 나눈다고 한다..)이 런치 타임은 신규입사자와 CEO가 오손도손 이야기를 나누며 가까워질 수 있는 시간입니다.메뉴 선택권은 신규입사자에게 있어요! :D에이스프로젝트의 OJT는 신규입사자, 기존 팀원들 모두를 널리 이롭게 하고자 하는 프론트의 노력과'이런 것도 해주면 좋을 것 같아요!'라는 구성원들의 참여로 발전해왔습니다.아직도 지원이 망설여지시나요?함께 "성장하는 전문가"가 될 수 있도록 시작부터 도와드립니다.많이 지원해주세요!
조회수 668

[인터뷰] 미국에서 아름다움을 알리는 MEMEBOX USA의 Arnold를 만나다

찌는듯한 무더위!다들 잘 견디고 계신가요!?미미박서들은 더위에도 장마에도 고객의 아름다움과새로운 경험을 위해 고민 또 고민 중이랍니다.오늘은 저 멀리 미국의 고객들의아름다움을 책임지고 있는 MEMEBOX USA의 리더Arnold의 인터뷰를 소개해드리려고 합니다!지난번에도 소개해드렸듯이 (샌프란시스코 오피스보러 가기)미국 오피스가 시작된 스토리는 참 재밌는데요!구글에서 일하던 아놀드가 6개월간 지속적인훈수(?)를 두다 결국 미미박스에 조인하게 되었죠!아놀드는 미미박서들의 성장과테크와 뷰티를 연결하는 미미박스의 비전을 실현시키는 것에 특히 중점을 두고 있다고 합니다그럼 아놀드의 이야기를 함께 만나 보실까요?  Q. 아놀드 안녕하세요. 자기소개 부탁드려요A. 안녕하세요. 제 이름은 아놀드이구요. 저는 MEMEBOX USA(클릭)의 HEAD로 미국팀을 리드하고 있어요. 스타트업, 미미박스, 치맥을 좋아해요. Q. 이렇게 이야기를 전할 수 있게 되어 좋은데요! 인터뷰에 앞서 아이스 브레이킹 질문을 하나 드리겠습니다. 누군가 아놀드에 대한 영화를 만든다면 어떤 내용일까요?A. 음 누군가 저에 대한 영화를 만든다면 예측할 수 없는 코미디 영화일 것 같아요. 예상치 못한 상황이 계속 나오지만 주인공은 스스로 즐기면서 재미와 길을 찾아가는 그런 내용이 될 것 같아요. Q. 스타트업이나 IT업계를 배경으로 한 코미디 영화가 상상돼요. 아놀드를 한 단어로 묘사할 수 있다면 어떤 단어를 선택할 것 같나요?A. 한 단어를 뽑자면 '성장'입니다. 수익 같은 성장만 이야기하는 건 아니고요. 스타트업에서 매일 새로운 상황에 도전하고 스스로 잘하는 것이 무엇인지 배우고 그러면서 성장하고 있기 때문이에요. 스타트업의 장점이자 제가 성장한다고 느낄 때는 회사에 있는 모든 동료가 당신의 성장을 돕길 원할 때죠. 또한 각자가 성공적으로 해내길 바라고요. 제 생각엔 이러한 성장이라는 단어가 제 삶과 도전을 설명한다고 생각해요.Q. 성장! 미미박스가 전사적으로 강조하고 지향하는 가치 중 하나죠. 아놀드가 미미박스에 함께 하게 된 계기는 무엇인가요?A. 우선, 산업적인 측면에서 굉장히 기대됐어요. 뷰티 산업에 테크놀로지를 접목한다는 것이 제 가슴을 뛰게 했던 것 같아요. 이런 것이 전통적인 뷰티산업엔 없잖아요. 그게 처음에 제 흥미를 사로잡았던 것 같아요.하지만 그것보다도 처음 미미박스 팀을 만났을 때, 이것은 기회라고 생각했어요. 스스로 자랑스러워하는 일을 하고, 스스로 즐기는 일을 하고, 함께 있기만 해도 즐거운 사람들과 만나서 일하는 기회는 인생에 흔치 않잖아요. 이런 좋은 기회를 놓치고 싶지 않았어요.Q. 미미박서라면 다들 공감할 것 같아요. 아놀드가 미미박스에 오기 전에는 어떤 일을 하셨는지 궁금해요A.  처음으로 일한 곳은 샌드위치와 주스 가게였죠. 16살 때 이런 일을 많이 했었죠. 레스토랑에서도 일하고 다양한 일을 했었어요. 이런 일들이 중요하다고 생각해요. 이때 부지런함이나 모든 일에 최선을 다해야 한다는 것을 배웠어요. 대학교 졸업 이후에는 투자은행인 골드만삭스에서 일을 시작했어요. 제가 기대했던 것보다 그렇게 즐기진 않아서 컨설팅 쪽으로 옮겼어요. 보스턴 컨설팅 그룹에서 일하게 되었죠. 그 후 친구와 스타트 업을 하려고 했지만 잘 되진 않았죠. 하지만 그때부터 스타트업의 기 술적인 부분에 관심을 가지기 시작했죠. 그래서 구글 본사의 전략팀에서 몇 년 일했고, 그 이후에 미미박스에 조인하게 되었어요.Q. 이제 미미박스에서 스피드만큼이나 완벽함을 추구하려고 하고 있는데요. 아놀드는 어떻게 일을 완벽하게 끝내시나요?! A.  제가 '완벽'하게 일을 끝낸 적이 있다고 생각하진 않아요. 완벽이란 일종의 환상이라고 생각해요. 완벽에 대해선 '과정'이 중요하다고 생각해요. 제가 아웃풋을 낼 수 있는 한두 분야에 집중하죠. 그 한두 분야에 정말 정말 집중하고 강하게 끌고가요 그리고 시간이 지날수록 그 일을 발전시켜가요. 이런 식으로 저는 과정에 집중하고 과정에 완벽이 있다고 생각해요. Q. 미미박스에 있으면서 이루고 싶은 버킷리스트가 있나요?A.  제겐 중요한 세 개의 버킷리스트가 있어요. 하나는 멋진 사람들과 일할 수 있는 기회죠. 제가 배울 수 있고 영감을 받을 수 있는 사람들을 찾고 싶어요. 두 번째는 그들을 위한 환경을 만드는 것이죠. 자신의 일로 인해 신나고 함께 일하는 사람들로 인해 항상 기대되는 환경을 글로벌하게 만들고 싶어요. 마지막으로는 서울에서 시작한 스타트 업을 보고 그 스타트업이 미국에서 어떻게 성장하고 커가는지 이해하고 기대하는 것이죠. 또한 미국 오피스에서는 이런 것들이 세계적으로 퍼질 수 있도록 노력하고 있습니다. 세 번째는 훌륭한 사람들과 일하고 그들을 발전시켜가며 제가 가지게 된 목표는 많은 미미박서들이 서로 배워서 자신이 세운 회사를 시작하는 것입니다. 그들이 원하는 세상을 그들이 만든 회사로 만들어가는 것이죠. 이런 것들이 제가 돌아봤을 때 정말 자랑스러운 일이 될 것 같아요. 미미박스 동창회 같은 것이죠. 미미박스에 멈추지 않고 나가서 세상에 커다란 영향을 끼쳐야 하죠. 그렇게 미래의 창업자들에게 영감을 주고 그들이 원하는 만큼 배우고 성장할 수 있도록 만들고 싶어요. Q. 미미박스에 대해 어떤 비전을 가지고 있으신가요? A.  제가 가지고 있는 비전은 미미박스가 세계 최고의 테크 기반의 결합된 뷰티 회사(technology driven connected beauty company)가 되는 것입니다. 커넥티드 뷰티(connected beauty)란 세상에 정말 많은 뷰티 브랜드가 있잖아요. 그들은 단지 마케팅을 바꾸고 타겟 고객을 바꾸는 것 같아요. 같은 브랜드로 한 그룹에 팔고 같은 브랜드로 마케팅만 다르게 해서 다양한 그룹에 파는 것이죠. 제 생각엔 미미박스는 정말 특별해질 수 있어요. 브랜드와 제품을 한 타겟 그룹의 감정선까지 연결해서 전문적이고 특별하게 만들 수 있죠. 데이터, 기술, 브랜딩, 마케팅 미 모두를 함께 이용해서 말이죠. 이런 것들이 미래가 될 거예요. 패션 사업과도 비슷해요. 패스트패션(fast-fashion) 산업은 빠르게 변하는 컨셉이 패션 산업을 완전히 바꾸고 있죠. 저는 정말 커넥티드 뷰티가 기술, 브랜딩, 데이터, 마케팅 등을 모아 고객을 위해 의미 있는 커넥션을 들 거라고 생각해요. 이런 것들이 산업을 바꿔나갈 거예요. 패스트패션이 산업을 바꾸듯이 커넥티드 뷰티가 산업을 바꿔나갈 거예요. 이런 것들이 제가 기대하는 것들이에요. 단기적으로는 훌륭한 사람들을 모으고 즐겁게 일하며 이일을 발전시키는 것이 제 비전이에요.
조회수 1383

현대오일뱅크 선배들의 이야기 - "당당하게 너 자신을 증명하라" 영업본부 LPG팀 조세현

현재 담당하고 있는 업무와 필요한 역량에 대해 소개해 주세요.영업본부 법인사업부문은 LPG팀, 법인영업팀, 특수제품팀으로 구성되어 있습니다. LPG팀은 CDU공정에서 제일 먼저 생산되는 프로판과 부탄을 전국에 있는 충전소 및 직매처에 판매합니다. 법인영업팀은 그룹 계열사, 대형 산업체 및 국가기관을 전담하고, 특수제품팀은 공장에서 생산되는 부산물을 적기에 판매하여 공장 안전가동을 이끌고 중간유분을 상품화해 신규수익을 창출 합니다. 저는 LPG팀에서 고속도로 휴게소 충전소를 담당하고 있습니다. 충전소에 주기적으로 방문하여 국제유가 및 LPG시장 동향, 마케팅 정보 등 충전소 운영에 필요한 정보를 충전소 소장님께 전달하고, 소장님의 요구와 불만을 선제적으로 해결하면서 이익 창출에 기여하고 있습니다. 영업 담당자에게 필요한 역량은 본인이 담당하는 ‘제품과 시장 동향에 대한 이해력’ 그리고 이를 거래처의 니즈에 맞게 잘 전달할 수 있는 ‘커뮤니케이션 능력’입니다. 이를 바탕으로 영업담당자는 담당 거래처에 필요한 정보를 정확하고 신속하게 전달할 수 있습니다. 특히, 커뮤니케이션 능력은 다양한 이해관계자를 상대해야 하는 영업담당자에게 필수적인 역량이라고 생각합니다.입사하기 위해 어떤 준비를 하셨나요?입사 후 어떤 부서에서 어떤 일을 하고 싶은지 확실히 정했습니다. 그 후 제 성격, 경험, 장점을 해당 부서에서 어떻게 활용할 것인지 자기소개서에 녹여냈습니다. 면접을 준비할 때는 현대오일뱅크의 재무제표, Annual Report, 사보, 보도자료, 홍보 영상 등을 찾아보며 현대오일뱅크의 현재 상황과 앞으로의 사업 방향을 파악했고, 제 역량과 비전을 바탕으로 어떻게 회사에 기여할 지 고민했습니다. 또한, 현대오일뱅크 입사를 위해 기울인 제 차별화된 노력과 열정을 면접에서 어떻게 보여드릴 지 생각했습니다. 이렇게 저 자신과 현대오일뱅크를 면밀히 공부하니 자신감을 가지고 면접에 당당하게 임할 수 있었고, 좋은 소식을 들을 수 있었습니다.지원자 여러분, 취업 준비라는 큰 산을 넘는 과정에서 항상 불안하고 때로는 지칠 것입니다. 하지만 여러분은 할 수 있습니다. 현대오일뱅크에 입사하여 어떤 꿈을 펼치고, 어떻게 성장해나갈 것인지 자신감을 가지고 당당하게 제시하십시오. 현대오일뱅크는 여러분을 기다리고 있습니다.#현대 #현대그룹 #현대오일뱅크 #영업본부 #법인사업부문 #LPG팀 #직무정보 #직무소개 #선배들의이야기 #현대오일뱅크공채 #현대오일뱅크채용
조회수 75

그것이 시작이었다

“일어났어?”“응. 자고 있어... “"지금 몇 신데 아직도 자? 얼른 일어나서 나와. 네가 좋아할 만한 곳을 찾았어.” “응? 뭐라고?”“잔말 말고 그냥 나와. 거기가 어디냐면, 나 한 번밖에 말 안 할 거니까 잘 들어. 알았지? 일단 지하철을 타. 그리고 을지로역 4번 출구로 나와. 거기서 500미터를 걸어가면 횡단보도가 나오거든? 그 횡단보도를 건너. 그리고 300미터쯤 가다 보면 두 갈래 길이 나오는데, 왼쪽 골목이야. 알겠지? 오른쪽 아니고 왼쪽이다! 그 골목으로 들어가면 길이 점점 좁아지거든? 그럼 제대로 찾은 거야. 그렇게 700미터쯤 가잖아? 그러면 바닥에 흰 글씨로 희미하게 간판이 새겨져 있거든. 이거 잘 안보이니까 정말 섬세하게 봐야 돼. 그 간판이 보이면 다 찾은 거야. 그럼 그 위쪽으로 계단이 보이거든? 거기로 올라가면 돼. 그럼 문이 보일 거야. 알겠지? 거기서 3시 반에 만나는 거다! 이따 봐!!”“응??? 야! 잠깐만!!” 뚜뚜뚜... 그렇게 전화가 끊겼다. 어제 늦게 잤는데 이렇게 찝찝하게 잠이 깨버리다니... 짜증이 확 밀려왔다. '아 얘 뭐지.. 미쳤나..'  '대체 이걸 찾아오라고 말한 게 맞는 거야?' '아니 무슨 약속을 이렇게 일방적으로 하고 난리야.' "아 씨!! 안가. 안 간다고!!"잠이 덜 깬 채 씩씩대다가 소리를 빽 지르고는, 다시 이불을 덮어쓰고 잠을 청했다. 그런데 한편으로 궁금증이 몰려왔다. '뭐지.. 왜 거기서 만나자는 거지.. 내가 좋아할 만한 곳이란 건 뭐지?''얘가 제멋대로 긴 해도 헛소리할 애는 아닌데... 아 뭐지? 괜히 궁금하잖아!!'   "어휴. 그래 간다, 가." 이불을 박차고 일어나 시계를 봤다.  "지금이 열한 시니까 지금부터 천천히 준비하고 나가면 되긴 하겠는데..” “아.. 근데, 을지로에서 뭐 어쩌라고?” 뭐라 했더라 기억을 다시 되짚어보려는데, 띵동 문자가 울렸다.    내가 특별히 문자로 알려준다. 잘 찾아오라고 ㅋㅋ을지로역 4번 출구. 거기서 500미터 횡단보도, 건너서 300미터 두 갈래 길. 왼쪽 골목, 길이 점점 좁아짐. 700미터 직진. 바닥에 흰 글씨 간판. 그리고 계단. 세시 반! 늦지 마!!그것이 시작이었다.
조회수 2265

[Buzzvil Culture] Buzzvil Global Workshop 2018 in Bali

 “일 년중 가장 기대되는 회사 행사가 무엇인가요?” 라는 질문에 대해 누군가는 그런게 존재할 수 있냐며 반문하겠지만, 버즈빌리언들에게 묻는다면 열에 아홉은 분명히 글로벌 워크샵을 꼽을 겁니다. 회사 사람들과 함께 5일동안이나 같이 있어야 하는데 끔찍하지 않냐구요? 천만에요! 즐거움과 추억으로 가득했던 2018 버즈빌 글로벌 워크샵의 현장으로 여러분들을 초대 합니다.매년 그래왔듯이 버즈빌 글로벌 워크샵은 일주일 간의 프리워크샵으로 시작했습니다. 프리워크샵 기간동안 한국, 미국, 일본, 대만에 퍼져서 일하고 있는 모든 글로벌 멤버들이 한 곳에 모여서 각 오피스의 업무 상황을 공유하고 하나의 버즈빌로서 앞으로 어떤 방향으로 달려가야할지를 논의하고 조율하는 시간을 가졌습니다.다양한 이야기가 오갔던 프리워크샵을 와인파티로 마무리하고 드디어 모두가 기다리고 기다리던 해외 워크샵을 떠났습니다. 이번 해외 워크샵 장소는 발리였는데요. 작년 해외 워크샵이 아쉽게 불발 되었기에 더더욱 기다려졌던 해외 워크샵이 아니었나 합니다. 워크샵 기간동안 버즈빌리언들은 여러가지 액티비티들을 통해 서로에 대해 알아가며 하나가 되고 소중한 추억을 만들며 휴식할 수 있는 시간들을 보냈습니다. “일할 때는 열심히, 놀 때는 더 열심히” 라는 버즈빌의 정신에 부끄럽지 않게 자는 시간도 쪼개가며 워크샵을 즐기는 버즈빌리언들의 모습을 통해 다시 한번 버즈빌리언들의 남다른 열정을 확인할 수 있었습니다.  이번 워크샵이 더 특별했던 이유는 버즈빌리언 스스로가 액티비티를 기획하고 진행하는 시간들이 있었기 때문입니다.  절반 이상의 버즈빌리언들이 참여한 서핑부터 발리의 아름다운 바닷속을 감상할 수 있었던 다이빙, 별이 쏟아질 듯한 밤하늘과 잊지 못할 일출을 볼 수 있었던 하이킹 등 내가 다른 버즈빌리언들과 함께하고 싶은 액티비티를 직접 정하고 팀원을 모집해 함께 즐길 수 있었기에 더욱 즐거운 워크샵이 되었던 것 같습니다.  워크샵의 하이라이트는 바로 둘째날 저녁에 진행되었던 “버즈빌리언 어워드” 였습니다. 버즈빌에서는 매년 워크샵마다 버즈빌의 5가지 인재상에 맞는 버즈빌리언들을 추천받아 시상하는 버즈빌리언 어워드를 진행해왔습니다. 그런데 이번 버즈빌리언 어워드는 기존의 버즈빌리언 어워드와는 조금 달랐는데요. 그 이유는 올해에는 모든 버즈빌리언이 버즈빌리언 어워드의 주인공 이었기 때문입니다.  모든 버즈빌리언들은 HR팀에서 준비한 감사장과 선물을 받았고, 오늘 날의 버즈빌이 있기까지 숨가쁘게 달려온 시간들을 돌아보고 각자의 자리에서 누구보다 치열하게 최선을 다한 스스로와 서로를 축하하고 격려하는 시간을 가졌습니다. 이 시간을 통해 ‘나’가 아니라 ‘우리’로 일하는 것이 얼마나 가치있는 일인지를 돌아보고 버즈빌리언 한 명, 한 명이 버즈빌에 정말 필요하고 소중한 사람이라는 것을 느낄 수 있는 시간이었습니다.  순식간에 지나간 5일의 시간이었지만, 지난 겨울 구글 정책 변경으로 인한 여러가지 일들을 잘 마무리하느라 누구보다 치열한 시간들을 보냈던 버즈빌리언들이 스스로에게 충분한 쉼을 줄 수 있었던 쉼표같은 시간이 되었다는 점에서 큰 의미가 있는 시간이었다고 생각합니다. 과연 내년 글로벌 워크샵 어디로…?
조회수 585

숙박앱에 필요한와이즈트래커 리포트 Top 3

숙박앱은 O2O 서비스를 선도하는 사업 중 하나로 빠르게 시장을 확보하기 위한 다수의 앱이 생산되면서, 유사한 경쟁 앱 속에서 차별화 된 서비스로 고객을 잡기 위한 노력이 치열한 사업영역 이기도 합니다. 그래서 숙박 앱 운영에 도움이 될 와이즈트래커의 리포트 3가지를 소개하고자 합니다.1. 상품 카테고리 리포트숙박의 등급은 생각보다 다양합니다. 그러나 숙박 앱에서 한 화면에 보여지는 컨텐츠는 1~2개이며, 이후에는 지속적인 스크롤링으로 원하는 숙박장소를 찾기 때문에 사용자가 선호하는 컨텐츠를 상단에 효과적으로 배치하는 게 중요합니다.상품 카테고리 리포트는 각 숙박 카테고리별로 방문수(=유니크 조회수), 평균 체류시간 등 인게이지먼트 지표와 더불어 객실선택, 예약하기, 주문, 매출액 등 다양한 컨버전 지표를 함께 제공합니다. 나아가 상품 리포트를 통해서 ‘특급’이란 카테고리 중 실제 어떤 호텔이 효과가 좋았는지를 파악할 수 있습니다.이러한 데이터는 컨텐츠 배치 뿐만 아니라, 제휴 영역을 확장하는 데도 어떤 카테고리에 집중해야 할지 참고할 수 있는 유용한 데이터입니다.2. 화면 이동경로 리포트숙박 앱 UI는 매우 심플하고 직관적인 편입니다. 사용자는 예약이 앱 실행의 주 목적이기 때문에, 퍼블리셔는 보통 첫 화면에 컨텐츠를 스크롤링해서 볼 수 있도록 구성하지만 의외로 예약에 접근하는 행동패턴은 다양할 수 있습니다.샘플 데이터처럼 목적을 갖고 검색을 통해 빠르게 상품 정보를 획득하고자 하는 사용자의 비중이 많다면, 모바일 기기에 적합한 내부 검색엔진 편의성 및 결과 화면의 퀄리티가 매우 중요할 것이며 이는 예약율과 직결될 수 있습니다. 반대로 검색했는데 만족하지 못한 결과 값을 제공했다면, 높은 외부 유출 비율을 나타낼 것입니다.화면 이동경로 리포트는 이러한 다양한 사용자들의 행동패턴을 타겟별로 4가지 타입(A화면 이후, A화면 전/후, A화면 도달경로, A화면에서 B화면을 도달하는 경로)으로 분석하여 네비게이션 개선에 통찰력을 얻을 수 있는 데이터를 제공합니다.  3. 내부 검색어 리포트 숙박 앱에서 검색엔진을 사용하는 빈도는 꽤 높습니다. 앱을 실행하자마자 검색하는 사용자는 서핑을 즐겨하기보단 자신이 원하는 컨텐츠(정보)만을 빠르게 받고 싶은 성향이 있습니다. 해당 사용자에겐 효과적인 검색결과 화면을 제공하는 것이 핵심입니다.검색결과 화면은 2가지가 필히 고려돼야 합니다.1) 검색결과와 관련성 높은 결과 값 제시( 방대한 결과값은 오히려 재검색하게 하여 불편함을 제공)2) 검색결과 값이 없을 경우 대안을 제시( 빈 페이지 제시는 매우 부정적인 경험으로 기억)내부 검색어 리포트는 사용자의 검색빈도가 높은 인기 키워드를 파악할 수 있으며, 검색 실패수 지표를 통해 온전한 결과 값을 제시하지 못한 경우를 찾아 검색엔진 개선의 방향을 잡을 수 있습니다.  * WISETRACKER는 모바일 광고 성과 측정부터 In-app 이용자/컨텐츠 분석, 푸시메시지 최적화까지 지원하는 모바일 통합 분석/타겟팅 솔루션입니다. 와이즈트래커 솔루션의 무료체험을 원하실 경우 여기를 클릭해주세요.* WISETRACKER가 제공하는 무료 데이터 분석 컨설팅를 원하신다면 여기를 클릭해주세요.  #와이즈트래커 #서비스소개 #데이터분석 #데이터트래킹 #앱리포트

기업문화 엿볼 때, 더팀스

로그인

/