스토리 홈

인터뷰

피드

뉴스

조회수 1414

한 주가 끝나고, 새로운 한 주가 시작된다.

어느 순간부터 한 주가 온전히 끝나고 새로운 한 주를 시작하는 프로토콜이 생겼다. 매주 월요일 아침에 진행되는 회사의 각 파트 리딩 멤버들 간의 회의 준비다. 주간 회의 같은 느낌으로 지난 주 한 일과 이번 주 할 일들을 공유한다.그래도 출근은 안한다일요일 오후에 수영 갔다가 집에 돌아오는 길에 스타벅스나 동네 까페에 들러서 작업을 하게 된다. 보통 이런 순서로 작업을 진행한다.담당하는 파트 구성원들이 보낸 데일리리포트를 확인한다. (주: 우리 회사는 모두 ‘오늘 한 일/내일 할 일’로 구성된 데일리리포트를 쓴다.)각 구성원별 데일리 리포트를 merge해서 사람별 위클리 리포트를 만든다.다시 제품 단위로 분류해서 제품별 진행 사항을 릴리즈, 개발 완료, 개발 중, 기획/디자인 완료, 기획/디자인 중 등으로 분류한다.이렇게 지난 주 한 일을 적는다.이번 주 할 일은 트렐로를 확인해서 정리한다.이 작업의 전체 소요 시간은 보통 1시간~1시간 30분 정도 된다. 나한테는 이 시간이 이런 의미를 가진다.일에 완전히 몰입되어 있을 때는 잘 안 보이던 것을 보여준다. 주중에 데일리 리포트로만 봐서는 잘 모르던 부분들이 보이기도 한다.한 주의 우선순위를 잡을 때 특히 좋다. 한 주의 업무를 미리 결정할 수 있고, 각 구성원들의 한 주 업무를 정리할 수 있고, 제품 단위의 개발/기획 범위 결정에도 도움이 된다.휴식 모드에서 업무 모드의 전환을 의미한다. 보통 난 주말 중 하루만큼은 아예 업무와 거리를 두고 쉬는 편이다. 특히 요즘은 토요일은 어지간하면 놀거나 개인 업무를 처리한다. 그런 모드에서 다시 월요일부터 업무 모드로 들어가는 준비 과정 같다.그냥.한 주를 마무리하고, 다시 한 주를 시작하는 단계에 대해서 스스로 적고 싶어서 적어본다.푸른밤 안창영#푸른밤 #알밤 #일상 #개발자 #개발 #개발팀 #다짐
조회수 873

열일하는 매쓰플랫 콘텐츠 팀! 두 분에게 무슨일이?

안녕하세요. 매쓰플랫입니다 :)요즘 매쓰플랫 사내에서 조금은 특별한 모습을 볼 수있어요~!바로 콘텐츠팀에서 특별 프로젝트를 진행중이에요.과연 어떤 서비스가 업데이트 될 지 궁금하시죠?선생님들!매쓰플랫이 시중교재/교과서 연동 수가업계에서 압도적으로 많은 거 아시죠?현재 2015 개정 교육과정 포함약 800여권 교재 연동 서비스를 지원하고 있어요.현재의 교과과정에 맞는수학문제은행을 발빠르게 제공하기 위해서매쓰플랫 '콘텐츠팀'에서 열일해주고 계세요.여러명의 '수학 교육' 실력파 콘텐츠팀 멤버 중!두 분께서는 더 나은 서비스 제공을 위해서'특별히 마련된 자리'에서요새 아주 열심히 회의 또 회의를 하고 계세요.과연 무슨일을 하는걸까요?아직은★★사내 비밀★★분명히 선생님들이 좋아하실 무언가를서비스에 녹여내기 위한거는확실해요~!!궁금하셔도 조금만 더 참고,기대해주세요 :)매쓰플랫은콘텐츠팀을 비롯하여전체 팀에서 항상 더 나은 서비스 제공을 위해고민 또 고민 한답니다~!매쓰플랫에 주시는 관심에 걸맞는점점 더 좋아지는 서비스를 보여드릴게요.선생님들의 사랑항상 감사합니다 ♥오늘도 즐거운 하루 보내세요 :)click! click! 매일 매일 더 좋아지는 ♥ 매쓰플랫 7일 무료 체험하기 ♥http://bit.ly/2MczO25가장 빠르고 부담없이 문의하는 방법 요기!
조회수 977

아마존처럼데이터 분석 시작하기

AMAZON GOAmazon Go에 대해 들어보셨나요? 단순하게 ‘계산대 없는 마트’라고 표현할 수 있습니다. 고객은 매장에 들어와서, 필요한 물건을 고르고, 그냥 가지고 나오면 됩니다. 아마존이 만든 동영상을 보면 이해가 쉽습니다.Amazon Go를 가능하게 하는 핵심 기술은 Computer Vision과 Machine Learning이라고 합니다. 고객이 매장에 입장하면 사물을 인식할 수 있는 카메라가 고객을 추적하며 어떤 물건을 집었는지 판별합니다. 그리고 고객이 매장을 나가면 앱에 등록된 정보로 자동 결제됩니다. 최신 기술을 활용해 고객 경험을 어디까지 끌어올릴 수 있을지 기대하게 되네요.그러나 Amazon Dash 나 Amazon Echo 와 마찬가지로, Amazon Go역시 사업 타당성에 대한 부정적 견해가 있는데요, 실제로 Dash, Echo등은 자체적인 손익분기를 넘지 못하는 것으로 알려져 있습니다.하지만 앞서 출시한 서비스들처럼 Amazon Go는 뚜렷한 목적이 있는데, 바로 ‘구매고객 데이터 분석’이 그것입니다.*Amazon Echo : 2015년 출시된 음성인식 기반 스마트 기기. 음성 명령을 통한 음악 재생, 알람 설정, 스마트홈 기능 등을 탑재하고 있다.*Amazon Dash : 2015년 출시한 사물인터넷 쇼핑툴. 대쉬 위의 버튼 하나만 누르면 아마존에서 제품 주문이 자동으로 가능하다. Source: Amazon.com: The Hidden Empire, Fabernovel(http://www.slideshare.net/faberNovel/amazoncom-the-hidden-empire/39-A_datadriven_company_Amazon_pioneered) AMAZON 의 데이터 활용 오프라인 채널에 대해서도 동일한 방법론이 통한다고 본 것 같습니다. 구매고객 데이터 분석을 활용해 고객의 구매경험을 향상시키는 것이 오프라인 채널에서도 경쟁우위를 가져다 준다는 믿음아래, Amazon Dash, Echo, Go를 이용해 원하는 데이터를 확보하고자 하는 것입니다.아마존은 이미 Amazon Dash 데이터 분석을 이용해 고객의 전반적인 구매 패턴을 파악할 수 있습니다. 그리고 이런 구매 패턴 분석만으로도 많은 것을 바꿀 수 있습니다. 특정 상품에 대한 반복적인 구매 수량,구매 주기를 분석해 제품 자체를 다시 만들게 할 수 있을지도 모르니까요. Amazon Dash : 아마존에서 2015년 출시한 사물인터넷 쇼핑툴.위 그림처럼 상품의 위치에 대쉬를 붙여놓고, 상품이 필요할 때 버튼을 누르면 와이파이를 이용해 해당 제품을 아마존에서 자동 주문이 되도록 설정되어 있다 Amazon Dash를 통해 주방용 세제를 판매한다고 가정해 보겠습니다. 아마존은 고객의 구매 패턴을 분석해 한번에 몇 개를 구입하는지,어느 정도의 주기로 주문하는지를 알 수 있으며,나아가 가정에 유지하는 재고량, 일일 사용량도 매우 정확하게 추정할 수 있습니다. 자연스럽게 다음 어느 시점에 얼마나 구매할지 예상할 수 있는 것이죠.Amazon Go를 통해서는 해당 고객의 오프라인 매장에서의 행동 및 구매 특성을 파악하게 됩니다. 온라인과 오프라인의 패턴은 어떻게 다른지,오프라인에서만 구매하는 제품은 무엇인지, 어떤 이유로 특정 제품은 온라인 또는 오프라인으로만 구매하는지 등 옴니채널에 대한 강력한 통찰력을 확보하는 것입니다. Source: Freshpatents.com 이는 결국 제품의 온라인 판매에 최적화된 용량과 패키지, 오프라인 공급에 필요한 출고 타이밍과 최적의 재고량에 영향을 주게 됩니다. 시간의 흐름에 따른 구매 패턴 변화를 분석해 제품의 생애주기도 예상할 수 있으며, 이에 따라 전반적인 제품 전략 역시변 화하게 될 것입니다. 제조사에 대한 아마존의 협상력이 더욱 커지게 되겠네요.매장 입장 시 앱을 실행시켜 출입구에 인식만 시켜주면 더 이상의 절차가 필요 없는게 Amazon Go의 시스템입니다. 고객정보와 결제정보는 앱에 입력되어 있으므로, 고객이 매장으로 들어오는 순간 결제에 필요한 대부분의 데이터는 확보를 마치게 됩니다.매장을 나가는 시점에 결제가 이루어지며, 사용자는 앱을 통해 구매 이력이 정확한지 확인만 하면 됩니다.AMAZON 처럼 데이터 분석 시작하기한국 역시 대부분의 E-Commerce 회사들이 모바일 앱을 가지고 있으며, 모바일 채널의 거래액이 기존 채널을 추월한 기업들이 더 많을 것입니다. 그래서인지 결제가 일어나는 주요 채널인 모바일 앱에 대해서는 데이터 분석을 빼놓지 않습니다. 분석 필요성이 높은데다, 기술이 발전하는 만큼 분석도 쉬워진 영향이 있을 것입니다.웹 채널 분석에 특화된 Google Analytics는 모바일에서도 여전히 유효합니다. 다만, GA를 도입한 기업들 중 80% 이상은 다른 분석 서비스를 병행해서 사용합니다. 범용 툴로 개발된 특성상, GA는 누구에게나 잘 어울리지만 누구에게도 완벽하게 들어맞지 않는 기성복과 같은 성격이 있는 것이죠. 여담이지만 이 점에서 각 분석업체마다 차별화를 시도하고 있습니다.모바일 앱이 있다면 늦지 않았습니다. 아마존 역시 고객과 고객행동에 대한 의문을 해결하기 위해 가설을 세우고 간단한 A/B 테스트를 실행한 것이 분석의 시작이었으니까요. 눈사람을 만들려면 주먹만한 눈 뭉치부터 굴려야 하듯이, 몇 명의 사용자가 앱을 실행하는지 등의 기본적인 수치부터 분석할 수 있으면 충분합니다. 가벼운 마음으로 시작해보시길 권합니다.  * WISETRACKER는 모바일 광고 성과 측정부터 In-app 이용자/컨텐츠 분석, 푸시메시지 최적화까지 지원하는 모바일 통합 분석/타겟팅 솔루션입니다. 와이즈트래커 솔루션의 무료체험을 원하실 경우 여기를 클릭해주세요.* WISETRACKER가 제공하는 무료 데이터 분석 컨설팅를 원하신다면 여기를 클릭해주세요.#와이즈트래커 #서비스소개 #아마존 #데이터분석 #애널리틱스
조회수 1886

Mac을 처음 쓰는 개발자에게

Overview애플(Apple) 제품을 한 번도 써본 적이 없습니다. 3주 전, 입사하고 받은 맥북(MacBook Pro)이 첫 애플 제품이었죠. 사실 개발 업무를 하면서 ‘한 번쯤은 애플 제품을 써 봐야겠다’는 생각을 하고 있었습니다. 단지 쉽사리 용기가 나지 않았을 뿐이었죠. 하지만 여러 개발 환경이 존재하는데도 개발자가 한 가지 환경만 고집하는 건 스스로의 잠재 능력을 좁히는 거라 생각했습니다. 그래서 이번 기회에 새로운 환경과 친해지려고 APM 웹서버 구성에 도전해봤습니다. (아자!) OS 설치 완료 후 환경Sierra 10.13apache 2.4php 5.6mysql 5.6 APM 설치 과정MAC 환경에서 APM 설치하려면 MAMP 방법도 있지만 기본적으로 apache, php가 설치되어 있으므로 패키지관리자 Homebrew를 이용하여 설치하겠습니다. 1.apache 설치 버전 확인$ httpd -v 명령어를 실행해서 아래와 같이 버전이 나오면 설치가 되어있는 상태입니다. $ httpd -v Server version: Apache/2.4.27 (Unix) Server built: Jul 15 2017 15:41:46 2.php 설치 버전 확인php -v 명령어를 실행해 아래와 같은 버전이 나오면 설치가 된 것입니다.$ php -v PHP 5.6.32 (cli) (built: Oct 27 2017 11:55:27)  Copyright (c) 1997-2016 The PHP Group  Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies 참고: MAC Sierra 10.13 버전에는 php7 상위 버전으로 설치되어 있습니다. Homebrew로 php5.6 하위 버전을 추가적으로 설치해야 합니다.3.Homebrew 설치Homebrew 명령어1)패키지 검색하기 -> $ brew search 패키지명 2)패키지 설치하기 -> $ brew install 패키지명 3)패키지 삭제하기 -> $ brew uninstall 패키지명 4)설치된 패키지 목록확인 -> $ brew list 5)패키지 정보보기 -> $ brew info 패키지명 6)패키지 업그레이드 하기 -> $ brew upgrade 패키지명 7)패키지 저장소 추가하기 -> $ brew tap homebrew/패키지명 8)패키지 저장소 삭제하기 -> $ brew untap homebrew/패키지명 9)패키지 링크 삭제하기 -> $ brew unlink 패키지명 가.설치파일 다운$ /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 나. Homebrew wget 설치 (Apple에서 제공하지 않는 패키지를 설치하기 위한 것이다.) $ brew install wget다. 심볼릭 링크 연결 $ ls -l /usr/local/bin/wget ../Cellar/wget/1.19.2_1/bin/wget bin/wget -> ../Cellar/wget/1.19.2_1/bin/wget 라. 패키지 저장소 추가 $ brew tap homebrew/dupes $ brew tap homebrew/php $ brew update 4.php56 설치가. Homebrew php56 설치 $ brew install php56 –with-apache 나. Apache에 PHP 설정 수정하기 아파치에 php7 모듈이 연결되어 있어 주석 처리 후 설치한 php5 경로로 연결한다. $ vi /etc/apache2/httpd.conf LoadModule php5_module /usr/local/php5-5.6.31-20170817-164511/libphp5.so #LoadModule php7_module libexec/apache2/libphp7.so 다. apache 재시작 apachectl restart라. phpinfo 확인 phpinfo 확인5.mysql56 설치가. Homebrew mysql56 설치$ brew install mysql56나. mysql 시작$ /usr/local/Cellar/[email protected]/5.6.38/bin/mysql.server start다. mysql 버전확인$ /usr/local/Cellar/[email protected]/5.6.38/bin/mysql –version명령어를 실행해서 아래와 같이 버전이 나오면 설치가 되어있는 상태입니다.$ sudo /usr/local/Cellar/mysql\@5.6/5.6.38/bin/mysql --version  /usr/local/Cellar/[email protected]/5.6.38/bin/mysql  Ver 14.14 Distrib 5.6.38, for osx10.13 (x86_64) using  EditLine wrapper 6.가상호스트 설정로컬에 다수의 프로젝트를 세팅하기 위한 것이다. 가. httpd.conf 파일 수정Include /private/etc/apache2/extra/httpd-vhosts.conf <- 주석제거 $ vi /etc/apache2/httpd.conf  # Virtual hosts Include /private/etc/apache2/extra/httpd-vhosts.conf 나. httpd-vhosts.conf 파일 수정NameVirtualHost : 아파치 2.4 이전 버전일 경우 80 포트에서 이름 기반 가상 호스트를 사용하겠다는 의미로 반드시 적어줘야 한다.DocumentRoot : 해당 프로젝트 소스 경로ServerName : 해당 프로젝트 접속 도메인주소 $ vi /etc/apache2/extra/httpd-vhosts.conf NameVirtualHost *:80       DocumentRoot "/Users/comkjs/Sites/ex1"     ServerName ex1.brandi.co.kr     ErrorLog "/private/var/log/apache2/error_log"     CustomLog "/private/var/log/apache2/access_log" common               Options FollowSymLinks         AllowOverride All         Order allow,deny         Allow from all         Require all granted         DocumentRoot "/Users/comkjs/Sites/ex2"     ServerName ex2.brandi.co.kr     ErrorLog "/private/var/log/apache2/error_log"     CustomLog "/private/var/log/apache2/access_log" common               Options FollowSymLinks         AllowOverride All         Order allow,deny         Allow from all         Require all granted     7. hosts 설정해당 도메인으로 접속시 DNS 서버를 사용하기 이전 로컬에 지정된 IP로 맵핑된다.$ vi /etc/hosts ## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 255.255.255.255 broadcasthost  ::1             localhost   127.0.0.1 ex1.brandi.co.kr 127.0.0.1 ex2.brandi.co.kr Conclusion물론 오랫동안 맥북을 사용했던 개발자에겐 쉬운 내용일 수 있지만 MS와 리눅스에 익숙했던 저에겐 ‘두려움’이었습니다. 리눅스 구조와 명령어가 비슷해서 리눅스를 이용했던 이용자에겐 어렵지 않을 것입니다. 한 번 세팅해두면 환경이 바뀌지 않는 이상 잘 건드리지 않기 때문에 나중에 세팅을 바꾸는 일이 있으면 또 다시 볼 수 있도록 기술 블로그에 남겨둡니다. 분명 언젠가는 도움이 되지 않을까요. 글곽정섭 과장 | R&D 개발1팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #기업문화 #조직문화 #업무환경 #인사이트 #경험공유 #Mac #개발자 #신입개발자 #조언
조회수 839

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

안녕하세요,처음 뵙겠습니다! :) 저는 스타트업 기업인 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 작성하기   이외에도 하나하나 생각나고 말씀드리고 싶은 것들이 생겨나면 하나하나 풀어드리려 합니다. 관심가져 주시고 읽어 주셔서 감사합니다. 앞으로 시작하겠습니다!#코인원 #블록체인 #기술기업 #암호화폐 #스타트업인사이트
조회수 2635

8퍼센트 Test case 작성 가이드

8퍼센트에서 Python Django 코드에 대한 Test case 작성시 사용하는 가이드를 공유해보려고 합니다.클래스명일반적으로 TestCase 를 상속 받는 클래스일 경우 class 명의 마지막에 TestCase 를 붙입니다.예제: SimpleTestCase(TestCase)함수명테스트 함수명의 경우 test_ 로만 시작하면 동작하는데 문제가 없고 테스트 코드에까지 주석을 다는 것은 번거로우므로 함수명의 test_ 뒷부분을 한글로 하여 설명을 대신하도록 합니다.class IUPaginationMethodTestCase(TestCase): @classmethod def setUpTestData(cls): cls.request = Mock() cls.request.GET = {'page': 1, 'items_per_page': 1} cls.pagination = IUPagination(cls.request) def test_page_url_기본(self): expected = '?{}=1'.format(self.pagination.page_key) self.assertEqual(self.pagination.page_url(), expected) def test_page_url_쿼리스트링_없는경우_물음표_붙인다(self): expected = '/?{}=1'.format(self.pagination.page_key) self.pagination.url_prefix = '/' self.assertEqual(self.pagination.page_url(), expected) def test_page_url_쿼리스트링_있는경우_엠퍼센드로_붙인다(self): expected = '{}&{}=1'.format( self.pagination.url_prefix, self.pagination.page_key )) self.pagination.url_prefix = '?utm=source' self.assertEqual(self.pagination.page_url(), expected) factory_boyfixture 를 대신해서 가급적 factory_boy 를 사용합니다.signals 끄기factory boy로 모델 객체 생성시 signal 이 호출되는데 signal에 대한 테스트가 아니라면 대부분 실행할 필요가 없습니다.이 때 factory.django.mute_signals를 사용해서 끄면 됩니다.decorator, context manager 둘 다 사용 가능합니다.decorator@mute_signals(signals.post_save) def test_some_code(self): some = SomeFactory() context managerwith mute_signals(signals.post_save): some = SomeFactory() 참고 링크factory_boyDisabling signalssetUpTestData vs setUpfixture를 사용하면 fixture로 정의한 모델 객체가 모든 테스트 시작 전에 생성이 되는데 유사하게 setUp 에서 factory 생성을 하게 되면 매번 객체 생성을 하게 되므로 느립니다.테스트에서 read only 로만 사용하는 객체의 경우 class method인 setUpTestData 에서 생성하면 1번만 생성이 되므로 빨라집니다.가급적 setUp 에서 매번 객체를 생성하는 것을 지양하고 테스트 함수 내에서 필요한 객체만 생성하는 것이 효율적이고 빠릅니다.method mock메소드를 mock 하는 경우 unittest.mock.patch() 를 사용합니다.decorator보통 테스트 메소드에 대한 decorator 로 사용합니다.직접 호출class 내의 여러 테스트 메소드 혹은 모든 테스트 메소드에서 동일한 함수를 mock 하는 경우에는 start, stop 을 활용하면 편합니다.예제 코드from unittest import mock class MyTest(TestCase): def setUp(self): self.mock_method1 = mock.patch('package.module.method1').start() self.mock_method1 = mock.patch('package.module.method2').start() def tearDown(self): mock.patch.stopall() def test_something(self): something() self.assertTrue(self.mock_method1.called) 참고 링크: patch methods start and stoptimezonedatetime.datetime.now() datetime.datetime.strptime() 등을 사용해서 naive datetime 객체를 django 모델의 DateTimeField 에 할당할 필요가 있는 경우 반드시 django.utils.timezone.make_aware() 를 사용해서 time-zone-aware datetime 객체로 변환한 후에 합니다.참고 링크: Django timezone 문제 파헤치기freezegun특정 시점에서의 테스트가 필요한 경우 freezegun 을 사용해서 현재 시간값을 고정합니다.가급적 decorator 나 context manager 를 사용해서 특정 클래스나 메소드, 혹은 코드 블럭에만 적용하도록 하는 것이 좋습니다.decorator 예제from freezegun import freeze_time import datetime import unittest @freeze_time("2012-01-14") def test(): assert datetime.datetime.now() == datetime.datetime(2012, 1, 14) context manager 예제from freezegun import freeze_time def test(): assert datetime.datetime.now() != datetime.datetime(2012, 1, 14) with freeze_time("2012-01-14"): assert datetime.datetime.now() == datetime.datetime(2012, 1, 14) assert datetime.datetime.now() != datetime.datetime(2012, 1, 14) 특정 테스트 케이스 전체에 적용을 하기 위해 start(), stop() 메소드를 사용하기도 하는데 이 경우 반드시 stop() 을 해주어야 다른 테스트 케이스의 시간 값에 영향을 주지 않습니다.예제from django.test import TestCase from freezegun import freeze_time class SomeTestCase(TestCase): def setUp(self): self.freezer = freeze_time("2016-01-05 00:00:00") self.freezer.start() def tearDown(self): self.freezer.stop() 참고 링크: freezegun맺음말Python Django 개발시 Test case 작성을 잘 하기 위한 8퍼센트 개발팀의 가이드를 공유해 보았습니다. Python Django 개발자들이 Test case 작성을 효율적으로 잘 해서 서비스의 안정성을 높이는데 도움이 되기를 기대해 봅니다.#8퍼센트 #에잇퍼센트 #Django #Python #장고 #파이썬 #개발 #개발자 #가이드 #꿀팁 #인사이트
조회수 710

회사도 민주적으로 운영될 수 없을까? -에이스프로젝트 운영위원회

탈권위와 소통, 토론을 통해 정책을 펼치고 있는 문재인 대통령이 연일 화제인 요즘.에이스프로젝트에서 2기 째 운영되고 있는 운영위원회를 소개해볼까 합니다.우리는 각자의 의견을 자유롭게 펼칠 수 있는 민주주의 사회에 살고있지만사실 회사에서 진짜 민주주의는 멀게만 느껴질 때가 많습니다.상명하달 문화에 익숙해지길 강요받고때론 부당하고 불합리하다고 느끼는 사규와 제도에 그저 따를 수 밖에 없습니다.왜 그래야 하는지 이유를 물으면나서지 말라는 둥, 조직생활에 맞지 않는다는 둥 핀잔을 듣기 일쑤죠.의견개진이 자유롭지 못한 근무환경은창의적인 사고를 필요로 하는 기업에게도, 주인의식을 갖고 일하고자 하는 구성원들에게도 독이 될 뿐입니다.그래서 에이스프로젝트는 '토론 문화'를 가장 중시해왔습니다.리더들이 토론하는 '리더십 토론', 전직원이 자유롭게 토론하는 캠페인 '로댕 프로젝트', CEO와 함께하는 '타운홀미팅등 다양한 주제로 토론을 진행해 왔습니다.임직원들이 자신의 생각을 이야기할 준비를 마치고2016년 10월부터 '에이스 운영위원회'제도를 도입했습니다.이름도 생소한 운영위원회는말 그대로 회사 운영정책에 대해 논의하는 모임입니다.운영위원은 직원 3명 이상의 추천으로 선발되며 인원수 제한은 없습니다.선출된 운영위원은 자신을 뽑아준 직원들의 의견을 수렴하여 운영회의 시간에 적극 발언합니다.필요하면 직접 발제도 가능합니다.에이스 운영회의는 에이스프로젝트 조직문화 및 운영과 관련된 사안에 대해 논의하고필요에 따라 정책을 결정하기도 합니다.작게는 회식비 지원 체계부터 크게는 역할 중심 문화에 대해서까지논의가 필요하다고 생각되는 모든 주제로 토론합니다.얼마 전 1기 운영위원회가 무사히 6개월의 임기를 마쳤습니다. :)1기 운영위원회를 통해 에이스인 모두가 함께 만든 일들에 대해 공유하고자 합니다.서로의 다른 의견을 토론을 통해 조율하고 합의하는 과정은때론 느리게 느껴질 수 있습니다.그러나 시간이 걸려도 다수의 지지를 얻는 것이 결과적으로 조직에 더 좋은 영향을 끼친다고 믿기 때문에에이스프로젝트는 앞으로도 운영위원회 제도를 적극 활용할 계획입니다.4월부터 2기 운영위원회를 시작했습니다.새롭게 선출된 7명의 운영위원과 에이스인 모두가 더 적극적인 의견으로, 더 좋은 에이스프로젝트를 위해 힘써주세요! :)
조회수 1469

여심 저격 금빛 미소, 옐로스토리 '장성한 매니저'

안녕하세요! 매력만점의 옐로모바일 가족들을 소개하는 사내기자Y의 옐로피플 인터뷰, 여섯 번째 이야기. 이번 주인공은 바로 옐로스토리의 다재 다능한 열혈청년! 장성한 매니저 입니다. 옐로스토리 카페에서 인터뷰 중간중간 기타도 치고 다트게임도 하며 Y 인터뷰 사상 가장 정신 없는 인터뷰를 진행했다는 후문! 입사 4일만에 옐스 운동회에서 응원단장도 맡고 매 주말마다 레저활동을 즐긴다는 만찢남 장성한 매니저가 들려주는 옐로피플 이야기! 지금 만나보세요 :DY: 옐블 독자들을 위해 간단한 자기소개 부탁 드려요! 장: 안녕하세요:) 옐로스토리 ‘위블’의 상품광고팀에서 일하고 있는 장성한입니다. 반가워요!  Y: 위블의 상품광고팀이라! 좀 더 자세한 설명이 필요할 것 같아요. 장: 위블부터 간단히 설명 드리자면 옐로스토리의 블로그 마케팅 플랫폼인데요, 블로거들을 모집하고 블로그 체험단 진행을 위한 업체 소싱을 하고 있습니다. 제가 있는 상품광고팀은 지역 외 모든걸 다 취급하고 있어요. 카메라, 화장품, 옷, 앱이나 웹서비스까지… 홍보가 가능한 모든 것에 대해서 블로거와 업체를 매칭시켜주는 브릿지 역할을 한다고 보면 됩니다 :)Y: 관련분야를 선택하게 된 계기가 궁금해요장: 원래 전 직장에서는 3년정도 로컬팀에서 일했었어요. 옐로스토리로 이직할 때도 로컬팀에서 일하게 될 줄 알았는데, 지금 담당 팀장님께서 상품광고팀도 잘 맞을 것 같다며 추천을 해주셨어요. 새로운 도전이라고 생각해서 지금 열심히 배워나가는 중입니다.  Y: 새로운 직무를 맡은 지 몇 달 안되셨다고 들었어요! 두 직무 중 본인에게 어떤 게 더 맞다고 느끼세요?장: 제가 워낙 사람 만나는 걸 좋아해요. 지역과 상품광고 모두 새로운 사람들을 만나서 대화하고 설득하는 일이라서, 어느 하나를 고를 수가 없네요. 절.대. 상품팀이나 지역팀 눈치 보는 건 아닙니다ㅋㅋㅋY: 착한 거짓말, 인정합니다ㅋㅋㅋY: 다음 질문으로 넘어가서, 특별한 취미나 특기가 있나요? 장: 저는 직장인들의 레저 동호회를 직접 운영 중이에요. 현재 동호회에는 약 60명 정도의 회원이 있는데, 주말마다 수상레저, 스카이다이빙, 클라이밍, 볼링 등 다양한 레저를 기획해서 즐기고 있어요. 레저활동을 좋아하는 사람들끼리 모여 서로 배우고 가르쳐주기도 하고, 밤에 바비큐파티도 하고… 힐링이 되는 것 같습니다! 지난 금요일에도 가평으로 웨이크보드를 타러 다녀왔어요 :)Y: 우와… 저도 가입하고 싶어지네요! 가입비는 얼마인가요? (사심 한 가득)장: ㅋㅋ가입비는 없습니다. 레저를 좋아하고 새로운 사람들과 어울리는 걸 좋아하면 모두 환영이에요! 언제든지 연락 주시면 상세하게 설명 드릴게요 :)Y: 레저 관련 자격증도 갖고 계신가요?장: 아직은 없지만 이번 여름휴가 때 스쿠버 다이빙 자격증을 따러 세부에 갈 예정입니다.수상레저 관련해서도 관심이 많아서 동력수상레저기구 조종면허도 딸 준비를 하고 있어요!그러고보니 입사 때 제출한 자기소개 동영상도 수상레저 컨셉으로 만들어서 제출했었네요 :)Y: 세상에, 휴가 목적이 자격증이라니! 그 열정이 느껴지네요 :D장: 단순한 취미를 넘어서서 얻는 것도 많은 것 같아요. 레저 동호회에는 정말 다양한 사람들이 모이다 보니 인적 커뮤니티 형성에 도움이 많이 되더라고요. 예를 들어서, 저는 아무래도 상품 팀이니까 다양한 제품들을 많이 가져와야 하는데, 동호회 회원을 통해 업체를 소개받아 수월하게 계약을 따온 적도 있습니다. Y: 옐로스토리에 입사한 후 가장 기억나는 에피소드가 있나요? 장: 제가 입사한지 4일만에 옐로스토리 운동회가 열렸어요. 아시잖아요. 입사 4일차에 얼마나 사람들이랑 어색한지…… 그런데 그 상황에서 제가 저희 팀 응원단장으로 뽑힌 거예요. 너무 민망했지만 이게 빨리 친해질 수 있는 기회다 싶어서, 마치 10년 알고 지낸 사람들 마냥 댄스배틀도 하고 신나게 응원하며 놀았어요. Y: ㅋㅋㅋㅋㅋ댄스배틀이요? 장: 저희 상품광고팀이 워낙 잘 놀아서요. 쉬는 시간에 음악을 크게 틀어놨는데 한 명씩 자발적으로 춤추고 놀았어요! 덕분에 팀과 회사에 빨리 적응할 수 있었던 것 같아요 :DY: 사진을 보니 정말 4일차 직원이라고 믿기지 않는데요? 장: 10년치 낼 용기 하루에 쥐어짜느라 힘들었어요 ㅋㅋㅋㅋ Y: 얘기를 들으니 옐로스토리의 즐거운 분위기가 보이는 듯 해요:)장: 우선 회사가 젊어서 그런지 수평적이고 언제나 활기가 넘치는 분위기입니다. 보시다시피 카페에도 직원들이 업무 중간중간 머리 식힐 수 있는 공간이 많아요! 중간중간 다트게임도 하고 누워서 만화책도 읽고, 악기연주도 할 수 있어요. 종종 동료들끼리 다트게임으로 손목 맞기 내기를 하기도 하고요. 벌겋게 부은 손목으로 다시 일에 열중하곤 합니다.Y: 옐로모바일 서비스 중 가장 많이 사용하는 서비스가 있나요?장: 저는 피키캐스트와 우리펜션을 가장 많이 사용해요! 피키캐스트는 지금처럼 뜨기 전부터 항상 봐왔었고, 우리펜션은 주말마다 국내 여행을 가장한 레저활동 하러 다니는데 꼭 필요한 앱이죠 :) Y: 회사에 원하는 것이 있다면!? 장: 원하는 게 어디 있겠어요. 이미 완벽한데.Y: 에이 이러지 마시고! 대표님도 인터뷰 보실 텐데, 이럴 때 원하는 걸 밝혀야 합니다! 장: 음, 굳이 말하자면, 회사에서 자기개발 지원금이 있긴 하지만, 저는 개인적으로 일할 수 있는 체력을 만드는 것이 굉장히 중요하다고 생각해요. 회사근처에 편하게 이용 가능한 헬스장 하나 제휴해 주시면 너무 좋을 것 같아요. 하지만 이런 거 없어도 옐로스토리는 완벽합니다. (강조)Y: 일 하려면 체력 정말 중요하죠!ㅋㅋㅋ Y: 그럼 마지막으로 앞으로는 어떤 일을 해보고 싶으세요? 장: 먼 미래에는 여기에서 쌓은 커리어와 노하우를 바탕으로 레저 관련 사업을 하고 싶어요. 단기적으로는 회사 내에서 인정받는 전문가가 되고 싶어요. ‘위블하면 장성한!’이라는 얘기를 들을 수 있을 때까지 열심히 하겠습니다. 저와 옐로스토리, 많이 응원해주세요 :)
조회수 1232

KBS 분야별 업무소개 - 카메라

수많은 상징과 이미지로 가득 차 있는 이 세상을 사각형의 프레임안에 고스란히 담아 내어 시각적으로 재구성하여 표현해내는 업무를 맡고 있는 카메라맨들이 소속되어 있는 부서가 영상제작국입니다. 사실적인 것(다큐멘터리, 중계)과 허구적인 것(드라마, 쇼)을 씨줄과 날줄로 엮으며 영상적 시니피앙(記表)을 구현하기 위하여 방송 현장의 최전선에 서 있는 KBS의 카메라맨들은 21세기의 방송계 화두인 디지털 시대를 맞이하여 새로운 영상 문법을 정립하며 올바른 프로그램 영상 제작의 길을 제시하고자 각고의 노력을 하고 있습니다.인간은 그 사람이 쓰는 언어에 의해 표현되어 진다’라는 말이 있습니다. 여러분들이 언어학에서 배웠듯이 인간의 언어인지체계는 의미화 과정에 다다르기 위하여 시니피에(記意) 이전에 시니피앙의 출발점을 거쳐야 하듯이 영상 문법에 있어서도 이와 동일한 이미지의 의미화 과정이 수행됨은 주지의 사실입니다. 카메라맨들은 시청자들이 프로그램의 의미를 TV를 통하여 받아들일 때 이와 같이 명확한 영상적 시니피앙을 제시함으로써 한국 방송계 영상 제작의 초석으로서의 사명을 다하고 있습니다. 영상제작국의 업무는 프로그램 특성에 따라 다분화 되어 있습니다. 크게는 여러대의 카메라를 사용하여 영상 제작을 하는 다인작업과 한 대의 카메라를 사용하여 영상 제작을 하는 일인 작업으로 나눌 수 있고, 작게는 프로그램의 장르 특성에 따라 드라마 제작, 연예 오락ㆍ교양물 제작, 스포츠ㆍ보도 등의 중계 제작, 야외 촬영 등으로 나누어져 있습니다. 드라마 제작에서는 영상 하나하나에 감성과 이성을 부여하기 위하여 많은 시도들을 하고 있으며, 연예 오락ㆍ교양물 제작에서는 무엇보다도 안정적이면서도 항상 새로운 영상을 시청자들에게 제공하기 위하여 노력하고 있습니다. 중계 제작에서는 스포츠, 문화 예술 공연, 보도 등 현장성과 시의성이 있는 영상제작에 참여하며 다양한 메가 이벤트들을 소화해내고 있습니다. 야외 촬영 시에는 프로그램 제작 기획 의도에 맞게 드라마, 시사 교양, 오락, 다큐멘터리 촬영 등 여러 장르에 걸쳐 엄격한 영상 미학을 추구하는 가운데 시청자들에게 친근하면서도 미적 감동을 주는 영상을 제공하고자 노력하고 있습니다. 이와 같은 기본적인 업무 외에도 특수 장비의 사용도 빈번한데, 항공 촬영, 수중 촬영, 스테디캄 촬영 등 시대를 선도하는 다양한 영상 제작 기술은 한국의 방송 영상 제작 역사를 이끌어 오고 있습니다. 영상제작국에서는 그 업무의 다양성 만큼이나 부서원들의 학부 전공도 다양합니다.즉, 카메라맨으로의 문호는 누구에게나 열려있다는 것입니다. 필요로 하는 것은 인문학적 감성과 과학적 이성, 그리고 현재에 안주하지 않는 끊임없는 도전 정신 뿐입니다. 여러분들이 도전하고자 하는 미래가 있고, 성취하고자 하는 희망이 있다면 그 꿈은 이 곳에서 반드시 이루어지리라고 믿어 의심치 않습니다. CREATIO EX NIHILO(무에서의 창조)를 이루기 바랍니다.#한국방송공사 #KBS #KBS공채 #직무정보 #직무소개
조회수 1236

정밀의료 = 소프트웨어 산업

정밀 의료는 소프트웨어 산업이다. 개인용 컴퓨터 = 게놈해독기로 본다면, 각종 소프트웨어 = 정밀의료 분석 소프트웨어가 된다.  게놈을 통한 정밀 진단은 그 목적에 맞는 알고리즘, IT 인프라, 컨텐츠, GUI 가 필요하다. 단순히 NGS 장비를 구비해 놓는 것으로 정밀의료가 완성되는 것이 아니고, 사업화 경쟁력이 생기는 것이 아니다. 이미 NGS 실험은 아웃소싱이 매우 낮은 단가. 굳이 NGS 실험의 internalize 를 위해 큰 돈을 들일 필요가 없다.그 노력을 소프트웨어 파워 증진에 투입하는 것이 월등히 현명하다. 제대로 하고 싶다면 남들이 하는 수준으로 서비스 하면 ok 가 아니라, 소프트웨어 혁신을 꾸준히 해 앞서나갈 경쟁을 생각해야 한다. 현재 국내의 player들은 이를 위한 대비를 충실히 잘 해내고 있는가? 그렇지 않아 보인다. 1. 인식 부재정밀의료를 대비하는 기관들의 결정권자/경영진들이 이에 대한 인식이 부족한 경우가 많다. 그럴 수밖에 없는 이유가 게놈 산업은 전통적으로 wet lab 전문가들이 득세한 곳이고 현재 결정권자들의 대부분 역시 web lab 기반으로 성장한 분들이 대부분이기 때문. '직접해보지 않은 일'은 간단하고 쉬워 보인다. 특히나 wet lab work 들에 비해 깔끔하게 해결되고 제품 개발도 완료되는 것 처럼 보이는 소프트웨어는 이런 wet lab 전문가들에게 상대적으로 매우 쉬워 보일 수 있다. 해보지 않은 일은 쉬워 보이고, 쉬워 보이면 '중요하지 않아' 보인다. 자연히 상대적으로 익숙한 wet lab 투자에 총력을 기울이고, 정작 가장 중요한 소프트웨어 투자에는 둔감하다. 개인적으로 국내 major 게놈 기관/회사들의 소프트웨어 수준은 A레벨 2-3명이 모인 스타트업에 비해서도 뒤지는 수준이라고 본다. 2. 인력 수준현재 국내 정밀의료 소프트웨어에 관한 일을 하는 사람들 특히 생명정보학(Bioinformatics) 인력으로 채용되어 일하는 분들의 대다수의 소프트웨어 개발 능력은 매우 낮은 수준에 머물러 있는 경우가 대부분이다. 학교에서 내내 연구를 위한 1회용 프로그래밍만 하다가 졸업 한 후에도 마찬가지로 계속 그런 정도의 일을 하고 있기 때문. 제일 큰 문제는 리더 역할을 하는 사람들의 수준이 이런 정도에 머물러 있는 경우, 소프트웨어를 통한 효율화, 혁신을 '가능한지도 모르기 때문에' 못하고, 계속 인력을 투입해 노가다 형태로 일을 해나가는 경우. 다들 만들어진 소프트웨어를 연결한 pipeline 을 구축하는 것에 급급한데, 정작 자신이 사용하는 소프트웨어들의 근간은 모른다.  BWA 를 쓰지만, 정작 genome alignment 알고리즘에 대한 기본도 모르는 경우가 대부분이고, GAKT 로 base calling 을 하지만, 어떤 방식으로 각 base 들을 scoring 하고 평가하는지 모른다. 기본이 되는 알고리즘을 모르니, 당연히 더 나은 알고리즘을 개발하는 것이 불가능하고, 아니 아예 그럴 시도 자체를 떠올리지도 못한다.  데이터가 내부에 많이 쌓여도 정작 이걸 활용할 insight 가 부족하다. 다양한 머신러닝을 활용해 knolwedge extraction을 해 내지 못한다.  쌓인 데이터로 정밀의료 제품의 sensitivity를 어떻게 높일 수 있을지 개념도 없다. 그저 남들이 쓰는 DB를 가져다 쓰는 것 외에는. 내 생각엔 '리더' 역할을 하는 위치에 제대로된 A 레벨 소프트웨어 능력이 있는 사람들을 배치하는 것이 중요하다고 본다. 리더의 수준이 높으면 팀의 수준이 높아지고, 전체 기관/회사의 수준이 향상될 수 있다. #3billion #운영 #인사이트 #스타트업 #마인드셋 #조언
조회수 2153

Android Gradle Tips

안드로이드와 GradleAndroid 가 Gradle 을 이용하기 시작한 것도 3년이 다 되어 갑니다. 이제는 많은 유저가 당연히 Gradle 을 Android 기본 개발 환경으로 사용하고 있습니다.하지만 기본 설정으로만 Gradle 을 사용하는 사용자들이 많습니다. 게다가 구글에서 Android Gradle Build DSL 을 끊임없이 변경했기 때문에 많은 사용자들이 이를 이해하기도 전에 변경이 되는 경우가 매우 빈번했습니다.Gradle Dependency 분리하기안드로이드 자동화 툴위 두번의 포스팅을 통해서 TossLab 에서 사용하고 있는 Gradle 에 대해서 소개를 해드렸습니다.오늘은 Android 팀이 사용하는 Custom 설정들에 대해서 정리하도록 하겠습니다.1. 초기화 값 검증 및 설정하기개발자들이나 CI 에서 관리해야하는 속성 값에 대해서는 각각 다르게 설정할 필요가 있습니다.안드로이드 팀은 3개의 추가적인 속성값을 추가하여 사용하고 있습니다.# gradle.properties inhouse_version=2 # 배포/qa 버전의 hofix version 을 관리학 ㅣ위함 report_coverage=false # coverage 측정에 대한 on/off 기능 dev_min_sdk=21 # minSDK 의 개별적인 관리를 위함 위의 3개의 값은 존재 하지 않으면 빌드가 되지 않도록 하는 강제사항으로 만들었으나 새로운 개발자가 입사하게 되었을 때 또는 CI 서버에 실수로 기입하지 못하게 되었을 때 Project Import 나 빌드가 아예 되지 않는 현상이 발생하였기에 초기 값을 설정할 수 있도록 하였습니다.report_coverage 는 5. Android Gradle DSL 에서 buildTypes.debug.testCoverageEnabled 에서 사용되며 이 값은 설정에 따라서 디버그 과정에서 변수값들이 제대로 노출되지 않게 됩니다. report 가 필요한 CI 서버 용으로 만들어진 값입니다.// valid.gradle def checkValidProperties() { println "Properties Valid Checking.........." if (!project.hasProperty("inhouse_version")) { println "set up to gradle.propeties --> inhouse_version = 1 (default)" project.ext.inhouse_version = 1 } if (!project.hasProperty("report_coverage")) { println "set up to gradle.propeties --> report_coverage = false (default)" project.ext.report_coverage = false } if (!project.hasProperty("dev_min_sdk")) { println "set up to gradle.propeties --> dev_min_sdk = 19 (default)" project.ext.dev_min_sdk = 19 } println "Properties Valid Check OK" } checkValidProperties() // ------------------------------- // build.gradle apply from: 'valid.gradle' 위와 같이 설정한 뒤 gradle.properties 에 아무런 값을 설정하지 않고 빌드를 하게 되면 빌드 최초에 다음과 같은 log 를 보실 수 있습니다.================================================================================ Properties Valid Checking.......... set up to gradle.propeties --> inhouse_version = 1 (default) set up to gradle.propeties --> report_coverage = false (default) set up to gradle.propeties --> dev_min_sdk = 19 (default) Properties Valid Check OK ================================================================================ 2. APK Copy 하기QA 팀 전달 또는 스토어 배포시에 Android Studio 의 기본 기능을 이용하지 않고 Gradle Task 를 사용하여 빌드를 하게 되면 /app/build/outputs/apk 에 있는 패키지를 복사하는 것이 여간 귀찮은 작업이 아닐 수 없습니다.그래서 Gradle 에서 기본적으로 제공되는 Copy Task 를 이용하여 APK Copy Task 를 만들었습니다.// apk-copy.gradle android.applicationVariants.all { variant -> // 1. Copy Task 생성 def task = project.tasks.create("copy${variant.name}Apk", Copy) task.from(variant.outputs[0].outputFile) // 2. 바탕화면 Task 로 복사 task.into("${System.properties['user.home']}/Desktop/") // 3. 복사하는 과정에서 APK 이름 변경 def targetName = "jandi-${variant.baseName}-${variant.versionName}.apk" task.rename ".*", targetName task.doFirst { println "copy from ${source.singleFile.name} to $destinationDir" } task.doLast { value -> println "completed to copy : $targetName" } } // --------------- // build.gradle apply from: 'apk-copy.gradle' 위의 Task 는 총 3개의 단계로 구분할 수 있습니다.Copy Task 생성~/Desktop 으로 복사복사 할 때 APK 이름 변경Task 를 정의하는 과정에서 application 의 flavor, build-type, version 을 기반으로 복사하도록 한 것입니다.위와 같이 설정하면 다음과 같이 사용할 수 있습니다.# flavor : qa , build-type : Debug $> ./gradlew assembleQaDebug copyqaDebugApk # 또는 줄여서 아래와 같이 쓸 수 있습니다. $> ./gradlew aQD copyQDA Application Variant 에 대한 변수는 링크에서 확인하실 수 있습니다.3. CI TasksCI 용으로 CheckStyle 과 PMD 를 사용하기 때문에 관련 설정 또한 별도로 처리하였습니다.task pmd(type: Pmd) { source 'src/main' include '**/*.java' ruleSetFiles = files('../pmd.xml') ignoreFailures = true } task checkstyles(type: Checkstyle) { configFile file('../checkstyle.xml') source('src/main') include '**/*.java' classpath = files() showViolations = true ignoreFailures = true } // --------------- // build.gradle apply from: 'ci-tasks.gradle' CheckStyle 과 PMD 설정에 필요한 정보 또한 별도의 script 로 설정하였습니다.4. Gradle Properties빠른 빌드를 위해 추가적인 설정을 하고 있습니다.# gradle.properties # 백그라운드 빌드 org.gradle.daemon=true # 동시 빌드 org.gradle.parallel=true # jvm heap size org.gradle.jvmargs=-Xmx4346m # build jdk org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home 위의 설정 중에서 제일 보셔야 할 것이 org.gradle.jvmargs 입니다. Android Gradle 설정 중에서 위의 값이 적으면 빌드속도가 현저히 느려집니다.빌드 할 때 console log 를 확인하시고 값을 적절하게 맞춰주실 것을 권장합니다.5. Android Gradle DSL 추가 정의하기 // build.gradle // ...중략 android { // 특정 Flavor에서 Release Build 막기 android.variantFilter { variant -> if (variant.buildType.name.equals('release') && (variant.getFlavors().get(0).name.equals('qa') || variant.getFlavors().get(0).name.equals('dev'))) { variant.setIgnore(true); } } buildTypes { debug { debuggable true testCoverageEnabled = project.hasProperty("report_coverage") && report_coverage.toBoolean() } // ..중략... } productFlavors { dev { // demo version applicationId 'com.tosslab.jandi.app.dev' versionName(defaultConfig.versionName + ".dev." + inhouse_version) minSdkVersion project.hasProperty("dev_min_sdk") ? dev_min_sdk : 19 } // ..중략.. } // 빌드 과정에서 CPU 와 Ram 최적화 하기 dexOptions { javaMaxHeapSize "2g" maxProcessCount Math.max(1, ((int) (Runtime.getRuntime().availableProcessors() / 2))) } } variant-filter 를 이용해서 qa 나 dev 용 빌드는 release 버전이 빌드되지 않도록 하였습니다.buildTypes 와 productFlavors 에서는 앞서 설정한 gradle-properties 에 대해서 설정에 따라 기본값이 지정되도록 하였습니다.dexOptions 설정은 개발하는 기기의 PC 환경에 따라 다를 수 있습니다.Android DSL 에 의하면 Dex 빌드 과정에서 최종적으로 사용하는 메모리는 heapsize * process-count 라고 합니다.heapsize 기본값 : 2048MBprocess-count 기본값 : 4참고문서6. Android Resource Image 의 EXIF 정보 삭제하기보통 디자이너가 Photoshop 과 같은 툴을 이용하여 이미지를 만들게 되면 자동으로 adobe 와 관련된 exif 정보가 붙게 됩니다. 그래서 빌드 할 때 libpng warning : iCCP ... 와 같은 warning 메세지를 보실 수 있습니다. 이는 Android Build 과정에서 aapt 가 이미지 최적화 하는 과정에서 불필요한 exif 정보로 인해서 오류를 내게 됩니다.따라서 exif 정보를 초기화 해주는 작업이 필요합니다.맥 사용자에 한해서 지원됩니다.HomeBrew 를 이용해서 exiftool 을 설치하셔야 합니다. exiftool 설명find . -path '*src/main/res/*' -name '*.png' -exec exiftool -overwrite_original -all= {} \; 저는 별도로 쉘 스크립트를 만들어서 실행합니다.아래를 복사해서 붙여넣기로 실행하시면 됩니다.echo "find . -path '*src/main/res/*' -name '*.png' -exec exiftool -overwrite_original -all= {} \;" > exif_clean.sh chmod 744 exif_clean.sh 관련 정보 : adt-dev google group 에서 제시된 해결책Wrap up안드로이드 팀은 Gradle 을 이용하여 반복적일 수 있는 작업을 자동화 하고 다양한 초기화 설정과 편의를 가지고자 하였습니다.초기화 값 검증 및 설정Apk 복사 자동화CI Task 정의Gradle Properties 지정Android Gradle DSL 정의Android Resource Image EXIF 삭제Gradle 을 얼마나 잘 활용하냐에 따라서 조직에 필요한 Task 를 금방 만드실 수 있습니다. 이번 포스팅이 도움이 되었기를 바라며 활용해보실 것을 권장합니다.#토스랩 #잔디 #JANDI #개발자 #개발팀 #앱개발 #안드로이드 #인사이트
조회수 1761

잘 팔다가 갑자기 Hazmat Review가 걸렸다?

안녕하세요 대한민국 셀러들의 성공적인 아마존 진출을 도와주는 컨설팅 회사이자 대행사인 주식회사 컨택틱의 이이삭 대표입니다.아마존 판매를 하시다가 봉변을 당하는 사례들이 굉장히 많습니다. 그 중에 요즘 자주 발생하는 문제가 바로 hazmat review로 인해 리스팅이 일시적으로 판매 중지 걸리는 사례입니다. Hazmat Review는 예고 없이 들어옵니다. 그리고 걸리면 해결되기 전까지 리스팅이 판매 정지가 되기 때문에 상당히 골치 아픈 상황이 아닐 수 없습니다. 멀쩡히 판매하던 제품이 Hazmat Review에 걸렸다고요? 안심하십시오. 이럴 땐 2가지만 기억하시면 됩니다.Photo by Louis Reed on Unsplash일단 배경부터 알아볼까요? 도대체 hazmat review가 무엇인지, 그리고 심지어 해당 상품에 대해 FBA 재고를 처음으로 보낼 때 hazmat review를 거쳐서 승인 받았음에도 불구하고 갑자기 이제 와서 ‘다시’ hazmat review를 받으라고 안내가 나오는 이유가 무엇일까요?우선 hazmat review란, haz(ardous) 즉 위험이라는 단어와 mat(erials) 재료/성분/소재 라는 두 단어의 합쳐진 단어에다가 review 검토/승인이 필요하다는 제도입니다. 즉, 아마존 측에서는 해당 상품이 위험 상품 또는 위험 물질을 함유하고 있는 상품일 수도 있다는 판단을 하여, 검토를 요청하게 된 것입니다. 대표적으로 식음료, 신체에 바르거나 접촉되는 제품, 또는 배터리가 있는 제품들이 hazmat review에 걸리게 됩니다.그럼 위험 물질이라고 여겨질 수 있는 모든 제품들이 무조건적으로 hazmat review가 걸리는걸까요? 그건 또 아닙니다. FBM으로 판매하는 경우에는 hazmat review 대상이 아니며, FBA로 판매했을 경우에만 hazmat review 대상이 될 수 있습니다. 그 이유는, 아마존에서는 FBA로 판매할 경우 FBA 직원들이 포장 및 배송을 할 때 상품과 닿을 수 있으니 FBA 직원들의 안전을 책임지는 차원에서 hazmat review를 하게 된 것입니다.그럼 본론으로 들어가기 앞서 마지막으로, 특정 제품을 FBA에 입고하기 전에 분명히 hazmat review를 거쳤고, 심지어 통과까지 해서 멀쩡히 잘 판매하고 있었는데, 예를 들어 1년 뒤에 갑자기 아마존에서 리스팅을 정지시키고 다시 hazmat review를 진행하겠다고 하는 어이없는 경우는 도대체 뭘까요? 여기에 대해 컨택틱에서 알아본 결과, 다음과 같은 안내문을 확인할 수 있었습니다.아마존으로부터 온 이메일 예시핵심적인 내용만 요약하자면, 아마존은 FBA 창고에 있는 제품들을 정기적으로 확인해서 hazmat 여부를 확인한다는 내용입니다. 따라서 이미 hazmat review를 받고 승인 받은 제품이라고 하더라도, 이렇게 정기적으로 확인하는 과정 중에 또 review를 요청할 수 있다는 얘기입니다. 위 이메일에서 보이듯이, 저희는 이런 조치를 받았음에도 불구하고 결국 해결을 했죠? Notes 부분에 보시면 ‘Dangerous goods review for this product is completed’ 로 되어있으며, Current Status가 ‘Non-DG’로 변경되었습니다. 그리고 이메일 본문을 읽어보시면 이제 판매를 재개할 수 있다고 나와있습니다. 컨택틱은 어떻게 이걸 해결했을까요? 이제 본론으로 들어가겠습니다. 딱 2가지만 기억하시면 해결할 수 있습니다.이 사태를 해결하기 위해 여러분들께서 알아야하는 첫 번째는 바로! Exemption Sheet입니다. 아마존 help 메뉴에 들어가서 hazmat review라고 검색한 후 아래 스크린샷에 나온 순서대로 링크를 타고 들어가시면 PDF 양식을 다운로드 받을 수 있게 됩니다. 첫 번째 양식은 배터리가 있는 제품 전용의 exemption sheet이며, 두 번째 양식은 그 외 모든 종류에 해당하는 양식입니다.1) 아마존 셀러센트럴에서 Hazmat Review라고 검색2) Exemption Sheet을 찾는법다운로드 받은 양식을 보시면 성분을 작성하는 부분이 있습니다. 여기에 해당 제품의 성분을 있는 그대로 쭉 기재하시면 됩니다. 이 양식명 자체가 exemption sheet인 만큼 ‘우리 제품은 위험 제품이 아닙니다!’라고 주장해서 ‘면제’를 받도록 요구하는 것입니다. 다른 말로, 우리 상품은 non-hazmat 이라고 주장하시는 겁니다. 그렇게 양식을 작성한 뒤 위 화면에 업로드하고 제출하면 영업일 기준 3~4일 (길면 1주일 이상) 아마존 측에서 검토한 뒤 심사 통과 여부를 알려줍니다. 만약 기다려도 이메일이 안온다면 help에 들어가서 hazmat이라고 검색한 뒤에 ASIN lookup을 통해서 hazmat 상태를 조회해볼 수 있습니다.두 번째 방법은, 만약 exemption sheet를 작성하고 제출했는데도 정보 부족으로 심사 통과가 안됐다고 했을 경우, MSDS 혹은 SDS를 제출하는 방법입니다. MSDS는 material safety data sheet라고 해서 제조업체에 의뢰하면 받을 수 있는 문서입니다. 이 자료에는 해당 제품의 성분, 위험 항목 여부 등등이 16가지 조항으로 나열되어있습니다. 이 문서를 구비하기가 까다로울 수 있기 때문에 첫 번째 방법인 exemption sheet를 알려드린 것인데요, 첫 번째 방법으로 안된다면 어쩔 수 없이 제조사에게 연락해서 MSDS를 받고 제출하면 되는데, MSDS상에 나와있는 정보가 아마존 상품 정보와 일치해야하기 때문에, 제출하기 전에 한 번 검토한 뒤 제출해야하는 점 잊지 말아주세요!MSDS의 예시솔직히 말씀드려서, hazmat review 걸리면 일단 판매 정지부터 걸리기 때문에 여간 골치아픈게 아닙니다. 정지된 그 사이에 매출이 뚝 떨어지는 것이니, 베스트셀링 상품이 hazmat review 걸렸다면 눈앞이 캄캄할 것입니다. 위에 해결방법을 최대한 상세하게 알려드리긴 했으나, 막상 해보면 헷갈릴 수 있습니다. 특히 exemption sheet를 처음 작성하시는 분들은 어떤 란에 무슨 내용을 기재해야하는지 헷갈리실텐데요, 도움이 필요하신 분들은 컨택틱에 문의해주시기 바랍니다 (02-538-3939).컨택틱의 모든 교육은 파트너인 글로벌셀러창업연구소와 접수하고 진행합니다. 교육 신청은 아래 링크나 글로벌셀러창업연구소의 홈페이지를 통해 가능합니다.오프라인 아마존 입문 과정오프라인 아마존 기초/심화 과정온라인 아마존 입문 과정그럼 오늘도 즐거운 글로벌 셀링 되세요!감사합니다.컨택틱서울특별시 서초구 서초대로 356, 606호(서초동, 서초지웰타워)대표 전화: 02-538-3939이메일: [email protected]홈페이지: https://www.kontactic.com네이버 블로그: https://blog.naver.com/kontactic카카오 브런치: https://brunch.co.kr/@allaboutamazon유튜브 채널: https://www.youtube.com/c/kontactic

기업문화 엿볼 때, 더팀스

로그인

/