# Docker 기반 Android Jenkins CI (Mac 환경)

 

1. docker 설치 및 실행

    - https://hub.docker.com/editions/community/docker-ce-desktop-mac


2. jenkins docker 이미지 다운로드 및 실행

$ docker pull jenkins/jenkins:lts

$ docker run -d -p 8080:8080 --name jenkinsCI jenkins/jenkins:lts


    - "-d" : 데몬으로 실행. 없으면 shell 종료시 같이 꺼짐.
    - "-p 8080:8080" :  포트 구성

    - "--name jenkinsCI" : 컨테이너 이름

    - "jenkins/jenkins:lts" : 받아놓은 lts 버전, 없으면 받아온다. - https://hub.docker.com/r/jenkins/jenkins/


3. jenkins local 접속 및 기본설치

    - localhost:8080 으로 접속

    - 첫 인증코드를 확인하기 위해 jenkinsCI의 log를 확인

docker logs jenkinsCI

    - 플러그인 설치
    - 사용자 계정 등록


4. docker 이미지에 Android SDK 설치

    4-1. docker shell에 접속     

$ docker exec -u 0 -it [Container ID] /bin/bash

 

    4-2. Android-SDK 기본 설치

$ apt update

$ apt install android-sdk


    4-3. 빌드에 필요한 Android-SDK tool 추가설치
        4-3-1. sdkmanager 설치

$ wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip

$ mv sdk-tools-linux-4333796.zip /usr/lib/android-sdk/sdk-tools-linux-4333796.zip

$ unzip sdk-tools-linux-4333796.zip


    4-3-2. sdkmanager로 필요한 tool 설치

$ cd tools/bin

$ ./sdkmanager --list

$ ./sdkmanager "build-tools;28.0.2" "build-tools;28.0.3" "platforms;android-28"


5. Jenkins 환경변수에 ANDROID_HOME path 등록

    - Jenkins 관리 > 시스템 설정 > Global properties > Environment variables
    - 이름: ANDROID_HOME, 값: /usr/lib/android-sdk

아마존 웨이_사물인터넷과 플랫폼 전략  - 존 로스만, 와이즈맵

(amazon way on IoT - John Rossman)

 

[책을 읽게 된 동기]

조직장님의 추천.

아마존은 IoT에 대하여 어떠한 접근을 하고 있는지 궁금한 부분을 해결하고 싶었다.

 

[도서정보]

https://www.coupang.com/vp/products/87669583?itemId=274963239&vendorItemId=3690304644&q=%EC%95%84%EB%A7%88%EC%A1%B4%EC%9B%A8%EC%9D%B4&itemsCount=36&searchId=29ccd70a2dfc43e3bbaf0e2454fbb5fe&rank=1&isAddedCart=

 

아마존 웨이 사물인터넷과 플랫폼 전략:4차 산업혁명 시대를 주도하는 아마존 IoT 전략의 모든 것

COUPANG

www.coupang.com

 

[요약]

원칙1. 커넥티드 기기로 고객경험을 재창조하라: 고객경험 + 고객들의 문제 해결에 초점

1-1. 고객에 대한 아마존의 집착

    - 고객리뷰(Customer Reviews): 부정적 리뷰를 거르지 않는 고객 리뷰로 충성도를 높인다.

    - 매일 무료 배송(Free Everyday Shipping): 유일한 마케팅

    - 원클릭 쇼핑(1-Click Shopping): 결제단계 간소화

    - Look inside the Book: 책의 첫 몇페이지 미리보기

    - 프라임(Prime): 무료 배송 프로그램, 고객 1인당 가치를 크게 끌어올렸음

    - Autorip: CD구매자들에게 무료 디지털 음원

    - Kindle: 킨들의 소프트웨어 매출 증대

    - Dash: 1세대, 음성인식, 스캔, 쉬운 설치, 견고한 디자인

    - Dash Buttons: 2세대, 누르면 특정제품만 주문되는 단일기능

    - 드론 배송: 진행중. 배송의 형태, 규제에 대한 노력

1-2. 고객들을 위해 IoT를 구현하라

    - 고객에서부터 시작: 고객에 대한 깊은 집착은 조직문화에서 비롯

    - 마찰을 제거하라: 고객이 불만을 가질 수 있는 마찰요소를 끔찍한 고객 경험을 상상하며 확인하고 제거

    - 넓게 생각하라: 현재의 제품만을 바탕으로 생각하지 않기

 

원칙2. 언제나 어떻게든 고객의니즈를 충족시켜라: 고객은 다양한 플랫폼과 유통채널을 넘나드는 원활한 경험을 기대

2-1. IoT를 통한 옴니채널 경험

    - 옴니채널: 플랫폼이나 채널에 상관없이 어디서나 통합된 형태로 제공되는 고객서비스

    - ex) 다른 사이트를 통해 검색한 기록, 쇼핑이력 등을 반영

2-2. 좋은 옴니채널에서 위대한 옴니채널로

    - 차이점: 정보의 연속성을 완성하는 기업의 능력

    - ex) 커넥티드 기기로 소모품의 상태를 알림/주문, 제품/고객 데이터 수집, 비콘으로 건물 내 안내 등

2-3. 연결된 경험을 생성시켜라

    - 커넥티드 기기가 트리거 -> 이를 평가하는 기준과 논리 -> 다른행동을 구체화할 기회를 제공

    - ex) 센서 측정/감지

2-4. 아우디가 IoT를 만났을 때

    - 아우디 트렁크에 직접배송: 아우디 + DHL + 아마존, 실험단계

    - 포드 + 아마존 체결

 

원칙3. 커넥티드 기기를 통해 지속적으로 개선하라: 효율성/경쟁력/수익성 증가 목적

    - 혁신1(Big I): 새로운 제품이나 기능, 새로운 경험

    - 혁신2(Little i): 프로세스의 지속적인 개선

3-1. 아마존 운영 능력의 비밀

    - 주문 후 최소 15분만에 배송

    - IoT로 데이터 수집을 빠르고 풍부하게 하여 식스시그마를 적용하고 불량률을 최소화

    - 프로세스 전반에 센서와 판독기를 설치하고 적극적 확인 -> 오류탐지 및 알림

3-2. IoT 기반의 지속적인 개선을 운영에 통합하라

    - 운영상 중요한 정보를 수집

    - 오늘 수동으로 입력/기록한 데이터를 자동화

    - 불완전/부정확한 데이터도 IoT를 통해 관찰

    - 자산, 재고시스템 등의 감사/검사의 자동화

    - 현장 장비관리의 용이성 확보

    - 운영상 위험에 관한 실시간 정보 확보

    - 고객서비스를 필요하게...

3-3. 이미 최고라고? 다시 생각해보라

    - 가혹할 정도로 집요해져서 개선

 

원칙4. 수학적 계산으로 두 마리 토끼를 잡아라: 비즈니스의 상관관계를 분석(정의), 수집, 개선

4-1. 데이터 폭증

    - 데이터는 기하급수적으로 많아지고 있고 이 데이터를 활용할 수 있어야 한다.

4-2. 아마존의 문화: "신이 아니라면 근거 데이터를 가져와라!"

    측정할 수 없는 것은 관리할 수 없다. - 피터 드러커 -

    1) 의사결정의 논리를 정의

    2) 의사결정 논리를 설명하는 수학등식 정의(적합성 함수 => 책무성 명확)

    3) 데이터의 질을 개선 with IoT

    4) 개선된 데이터로 의사결정 논리를 강화

4-3. 계측화, 세분화된 실시간 데이터

    - 문제가 발생한 지점을 찾기위해 데이터는 세부적이여야 하고, 실시간 사용 가능해야 함

4-4. 아마존의 매커니컬 터크

    - 일상적이고 기계적인 일들을 OPW(Other People's Work)로 두고 처리하게 하는것

4-5. 아날로그를 디지털로 전환하라

    - IoT가 아날로그를 디지털로 바꿔줄 장치

    - 데이터를 수집/전송/처리/보관도 비용도 신중한 합리화 과정이 필요

4-6. 알고리즘으로 가는 출발점

    - 최적화하고 싶은 문제가 무엇인지 정확히 이해

    - 수학적 공식을 세우고 변수들을 결정

4-7. 비즈니스 프로세스를 수학적으로 재설계하라

    1) 핵심프로세스나 중요한 고객경험을 하나 선택

    2) 프로세스에 영향을 미치는 요소들을 정의

    3) 그 변수들로 공식을 도출

4-8. 핵심 주제와 프로세스에 대한 공식을 세워라

    - 주의: 완벽주의의 덫에 빠지지 말고, 프로세스를 당장 최적화 하겠다는 욕심을 부리지 말자.

    - 지속적으로 개선하기 위해 "수학적 계산"을 하고 그 핵심적 비즈니스 목표만 생각

4-9. IoT는 결코 인간의 자리를 빼앗지 않는다

    - 생산성 연구: 인간 + 로봇 > 인간 + 인간 or 로봇 + 로봇

 

원칙5. 크게 생각하되 작게 시작하라: 작은 실험으로 교훈을 얻는다.

5-1. 크게 생각하라

    - 크게 도박하는 것과 혼동하지 말 것

    - 커다란 비전을 세우고 지속적으로 실패에서 배우고, 조정하고 적응하며 앞으로 나아가는 것

5-2. 작게 시작하라

    - 수많은 작은 실험들을 시도하고, 장기적이고 끈질긴 접근

5-3. 실패한 실험이야말로 유익한 기회다.

    - 낮은 완성도의 시제품 제작(LFP: Low-Fidelity Prototyping): 대교모 시제품 개발을 위한 지지를 얻어내는 방법

      ex) 구글 카드보드

    - 최소 기능 제품(MVP: Minimum Variable Product): 비즈니스와 솔루션의 근간이 되는 중요한 가정들을 확인하고 검증

    - 기능성 시제품(Functioning Prototype): 최종 제품에 대한 기술적인 토대

    - 빠르게 실패하고, 실패를 딛고 앞으로 나아가라: 실패에서 귀중한 데이터를 얻을 수 있어야 한다.

5-4. 아마존은 왜 실패를 두려워하지 않는가

    - 실패는 학습의 과정

    - 직원들이 대담해지도록 독려, 혁신하는 팀들을 보호하고 목표에 초점, 사내 회의론자들의 반대와 걱정을 최소화

5-5. 비즈니스의 속도를 끌어올리는 열쇠

    - 운영자인 동시에 혁신가가 되라고 요구하는 것은 실패의 지름길

    - 마음껏 시행착오할 수 있는 지지대를 상상하고 만드는 것

5-6. 코끼리가 춤추게 하라

    1) 벤처캐피털회사처럼 투자하고 새로운 포트폴리오를 구축: 고객을 위한 기능

        - 내부 프로세스 개선시 : 이득과 위험이 무엇인지 정확히 이해

        - 타당성을 검증하기 위한 작은 실험

    2) 자율성과 독립성을 구축

        - 운영과 혁신 조직을 분리

    3) 유능한 고위 리더가 특정 IoT 프로젝트에 헌신하게 하라

        - 리더들이 새로운 무언가에만 집중할 수 있도록

    4) 적절한 측정지표와 목표를 설정하되, 대개는 그것들이 이익과 무관

        - 적절한 측정지표가 외부나 윗선의 간섭을 덜 받고 독립적으로 활동 > 성공 가능성 높아짐

    5) 부서간 통합 팀

        - 다양한 전문지식과 배경을 가진 사람들로 팀을 구성 > 폭넓게 생각

        - 피자 두판 팀: 8명 이하의 소규모 팀

    6) 월등하게 뛰어난 제품이나 서비스를 창조

        - 약간 개선된 서비스나 제품은 안된다.

        - 고객에게 믿을 수 없을만큼 좋은 경험과 놀라움을 선사

 

원칙6. IoT 기반의 플랫폼 비즈니스를 구축하라: 자사의 커넥티드 기기로 다른기업이 플랫폼 비즈니스 모델을 구축

6-1. 아마존의 다양한 플랫폼 비즈니스

    - 공급자와 소비자들을 위해, 복잡한 프로세스/업무들을 유연하게 완수할 수 있도록 긴밀히 결합

    - Warby Parker : 저가 맞춤안경, 5가지 안경 5일간 착용, 맘에드는 안경 외 반송

    - iTunes : 음악가-판매, 팬-음악가와 연결, 아이튠즈-네트워크 효과

    - PaypPal : 사용자-송금/입금, 판매자-결제시스템 이용

    - Alexa Voice Service: 다른제품에 탑재, 음성인식 소프트웨어

6-2. 플랫폼 비즈니스, 아마존이 가장 잘하는 일

    1) 플랫폼은 복잡성을 단순화해야 한다.

        - 더 나은 고객경험, 더 좋은 제품, 플랫폼 확장능력

    2) 플랫폼은 쉽게 설치할 수 있도록 API를 제공

        - 기술통합을 단순화, 대규모 확장

    3) 플랫폼은 지속적인 가치를 제공

        - 아마존 마켓플레이스: 결제/계정서비스, 제3자 판매 보증-고객신뢰, 꾸준한 고객수요-제3자 판매자들의 신뢰

    4) Eat your own dog food

        - 까다로운 내부 사용자들에게 먼저 제공, 피드백을 바탕으로 연구개발을 신속/가속/확장

    5) 아마존의 플랫폼

        - AWS: Amazon Web Service

        - FBA: Fulfillment By Amazon, 상품을 보관하고 주문을 이행

        - Amazon Machine Learning: 시각화 도구, 마법사 제공

        - Amazon Marketplace: ?

        - CreateSpace: 주문형 자가출판 서비스

        - AVD: Amazon Video Direct, 자체 제작 전문가 영상 콘텐츠 플랫폼

        - Mechanical Turk: 작은 업무 아웃소싱 + 인력 연결

6-3. 에코echo: IoT 세상에 심은 트로이의 목마

    - 서비스를 연결해줄 컴퓨팅 인터페이스

6-4. 알렉사를 무료로 배포하는 이유: 알렉사 소프트웨어 라이선스를 무료로

    - 알렉사의 경쟁력

        1) 정교한 음성인식

        2) 이벤트 생성 능력: 이벤트 인지 + Rules engine + 맞춤형 애플리케이션(Skill)

        3) 알렉사 소프트웨어 무료 라이선스

    - 아마존에서의 제품 구매로 연결

    - AWS에 통합되어 클라우드 사용으로 연결

    - 소비자 늘고 사용횟수 증가 > 기계학습에 의해 결과가 개선된다.

6-5. IoT 플랫폼 비즈니스의 기회

    - IT Gang of Four: Apple, Facebook, Google, Amazon

    - Bigbelly 쓰레기통: 태양광 전원 + 쓰레기 압축 > 용량 최대 8배 가능, 폐기물 관리 시스템

    - 진정한 플랫폼 : 기술상의 도전은 아님, 개방성과 제 3자 협업에 기초한 사고방식

    - 데이터, 이벤트를 감시/수집하기 유리한 "망대"를 선점하고 그곳에 대한 접근권한을 활용하도록 만드는 것

6-6. 성공적인 플랫폼 기업이 되기 위한 조건

    1) 제품의 물리적 위치와 포지셔닝: "망대"에 올라와 있는지

    2) 제품의 형태인자: 인프라를 제공하는지

    3) 기술적 역량: IT 플랫폼 기업은 결국 소프트웨어 및 IT기업

    4) 운영환경의 복잡성: 개발 + 테스팅 + 출시과정 + 업데이트 + 보안 + ....

    5) 장기전? VS 단기전?: 플랫폼은 구축하고 고객을 모으고 사용하는데까지 장기전

    - SMOP: Simple Matter Of Programming = "간단한 프로그래밍 문제"라고 말하지만 실제로는 복잡한 개발이라는 뜻

 

원칙7. 결과물 기반의 비즈니스 모델: 서비스형? - 소유권, 효과성, 유지관리 책임은 제공자에게

7-1. 결과물 기반 모델1: 셀프 모니터링 제품

    - 브리타 'Infinity Smart Water Pitcher' > 아마존 'Dash Replenishment System' > 새 필터 자동주문

7-2. 결과물 기반 모델2: 서비스를 구독하게 하라

    - UBI(Uage-based insurance) :  차량연계 운전습관 연계보험

    - Zipcar : 차량 월구독/사용한만큼, 자동차와 트럭

    - Kaeser Kompressoren : 압축공기 탱크 센서 > 사용패턴 분석 > 예방정비, 압축공기 구독 서비스

    - 드롭캠 : CCTV + 동영상 녹화 저장 서비스

7-3. 결과물 기반 모델3: 아마존의 서비스형 비즈니스 모델

    - AWS: 데이터센터 혹은 입주 방식(Colocation)의 단점을 해결

    - FBA(아마존 주문이행 서비스): 물류, 유통 네트워크 사용할 수 있는 권한을 판매

    - 롤스로이스: 항공기 엔진 임대 > 엔진의 상태 추적 > 유지관리 계획 > 매출증가, 항공사: 간소화된 효율적 운영

7-4. 결과물 기반 모델로의 전환 전략

    - 채널갈등: 제조업체, 유통업체 간에서 기존의 고객을 보호하며 서비스 공급채널의 전환

    - 고객교육: 어떻게 변하고 어떤 영향인지 이해

    - 회계상의 혼란: 비고정적 매출에서 고정매출로 전환시 초창기 매출이 감소되며 이를 투자자들에게 명확하게

    - 조직개편: 기존방식을 깨고 특정한 수준의 서비스를 제공해야 하는 계약상의 의무를 이행하는 조직으로

    - 새로운 인재: IT기술 기반의 경기순환에서 연료역할을 할 인재

 

원칙8. 데이터가 곧 비즈니스 모델이다: 데이터 접근권한 판매

8-1. 신디케이션 비즈니스 모델

    - Inlix: 실시간 교통 데이터, 자동차 관련 데이터 = 데이터 확보/조달, 확보한 데이터 판매

    - 몇년에 걸친 집중적인 노력과 투자, 인내심을 갖고 장기적인 초점을 유지

8-2. API를 통한 서비스형 데이터

    - API = 인프라, 트랜잭션

8-3. 프라이버시, 소유권, 보안

    - 다양한 매체로 부터 온 정보의 물질이 개인 소유라면 정보도 소유자의 권리로 볼것인지 논란

    - 법률들이 기술적 발전을 따라오지 못하고 있다. 향후 법률이 강화된다면...

8-4. IoT에 관한 프라이버시 전략 개발

    - 프라이버시에 대처가 가능한 정책 / 비즈니스 모델 및 가치 제안 / 조직 내부의 프로세스와 아키텍쳐로 접근해야...

8-5. IoT 기반의 데이터 중개 비즈니스

    - 미래에 대한 명확한 그림을 그릴 수 있는구체적이고 실질적인 사례를 찾는 것

    - 필요하다고 생각하는 것보다 더 많은 데이터를 수집하는 것이 현명할 수도...

    1) 데이터 구축의 시간과 비용을 계산하고

    2) 데이터의 가치를 재무적으로 분석한 후

    3) 다른 사람들의 데이터와 경쟁력을 비교

 

원칙9. 산업-가치사슬을 파괴하라: 우리 산업은 전통을 존중하지 않는다. 오직 혁신을 존중할 뿐이다. by 사티아 나델라
9-1. 아마존이 새로운 영역으로 비즈니스를 확장하는 방법

    - 인수 : 키바 시스템(창고 로봇), 자포스(신발 쇼핑몰), 안나푸르나 랩(하드웨어 OEM) 등

    - 자체 브랜드 : 라크앤로, 노스 일레븐, 스트라스우드, 아마존베이직스, 프라임 팬트리 등

    - 웹사이트 브랜드 : IMDB.com, Woot.com, Zappos.com, Dipers.com, Fabric.com, Twitch.tv 등

    - 제품과 서비스 : 주문이행, 결제, AWS, 파이어 스틱, SOC 디자인, 퍼블리싱, 광고, 트위치 등

    - 향후 : 전자기기 설계, TV쇼/게임 등 콘텐츠 제작, 창고 로봇, 사진 스튜디오/이미지 서비스 등

9-2. IoT 기반 공급사슬의 장점

    - 공급자/판매자인 동시에 서비스형 모델

    - 티센크루프 + 마이크로소프트 애저 IoT 서비스 > 승강기 상태 클라우딩 수집 > 유지관리 서비스

9-3. 가치사슬 분석으로 기회를 포작하라

    - 고객경험이 붕괴한 곳

    - 직접운영으로 수익성 향상되는 것

    - 서비스/제품 의 상품화

    - 기대이익 마진

    - IoT로 붕괴된 고객경험의 회복

 

원칙10. 플라이휠의 시너지 효과: 모멘텀을 생성/지속시키는 요소를 이해

10-1. 아마존의 비밀 무기, 플라이휠

    - 선순환 : 낮은 가격 > 더 많은 고객 > 판매자 증가 > 고정비용 효용성 증가 > 가격 더욱 내려감

10-2. IoT 기반의 플라이휠 비즈니스 모델

    - 플라이휠을 디자인하는 6단계

        1) 예비적 정의와 범위 기술서를 작성하라.

        2) 핵심적인 상수와 변수들을 대략적으로 정의하라.

        3) 상수와 변수들을 합리화하고 분류하라.

        4) 인과관계 도표를 작성하라.

        5) 모델 구축에 지속적인 노력을 기울이고 가능한 단순화하라.

        6) 모델에 함축된 의미를 찾아라.

 

 

# Jenkins in Docker in ubuntu 18.04


노트북을 서버로 만들고 싶은 마음은 없어서 Jenkins를 Docker위에 올렸고 그 과정을 기록해 둔다.


1. Docker 설치

2. Docker용 Jenkins 설치

3. Docker로 Jenkins 띄우기

4. Docker로 Jenkins 운영



1. Docker 설치

    1) Docker CE VS Docker EE

        - CE : Community Edition ==> 선택

        - EE : Enterprise Edition


    + Ubuntu 환경: https://docs.docker.com/install/linux/docker-ce/ubuntu/

        1) 소스로 부터 설치: (좀 복잡하지만) 다들 이렇게 쓴다고 설명이 되어있음. => 선택

        2) 패키지 설치: Docker 업그레이드 할때마다 패키지 설치해야 한다고 함.


    + Mac 환경: https://docs.docker.com/docker-for-mac/install/

        1) 패키지 설치: 이 방법만 제공  ==> 선택


2. Docker용 Jenkins 설치

    - https://hub.docker.com/r/jenkins/jenkins/

    $ sudo docker pull jenkins/jenkins:lts


    1) jenkins/jenkins:lts VS jenkins/jenkins

        - LTS : Long Term Support  ==> 선택

        - Default : latest


3. Docker로 Jenkins 띄우기

    1) 띄우기(로그로 찍어주는 Initial Password 물어볼 것임 끝난거 아님)

    $ sudo docker run -d -p 8080:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins/jenkins:lts


    2) http://localhost:8080 으로 접속

        - 처음은 Initial Password 물어봄


    3) Initial Password 찾을 수 있게 로그를 찍게해서 찾고 입력하기

    $ sudo docker logs jenkins


    4) Jenkins 스스로 업데이트


    5) 화면 갱신 및 사용자 등록




# Reference

- https://docs.docker.com/install/linux/docker-ce/ubuntu/

- https://docs.docker.com/docker-for-mac/install/

- https://jojoldu.tistory.com/139

- https://www.leafcats.com/215

# 바이너리에서 1인 Bit만 세어보기: Hamming weight(Population count algorithm)


2진수로 바꾸었을때 길이가 n인 정수에서 1인 bit만 세어보는 알고리즘을

발전하는 순서로 나열해 보았습니다.



1. 2로 계속 나누면서 나머지 세기 = O(n)

// 

public static int bitCount1(int i) {
int count = 0;

while (i > 0) {
count += i%2;
i /= 2;
}

return count;
}



2. bit shift 이용해서 1자리 세기 = O(n)

//

public static int bitCount2(int i) {
int count = 0;

while (i> 0) {
count += 0x1 & i;
i = i >> 1;
}

return count;
}



3-1. Population count 알고리즘으로 풀기 = O(log(n))

 // Java의 음수의 경우는 >> 할 때 맨 왼쪽에 1이 의도치않게 붙어서 >>> 를 사용하는게 낫다.

public static int bitCount3(int i) {
i = (i & 0x55555555) + ((i >>> 1) & 0x55555555); // ...01010101010101010101010101010101...
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); // ...00110011001100110011001100110011...
i = (i & 0x0f0f0f0f) + ((i >>> 4) & 0x0f0f0f0f); // ...00001111000011110000111100001111...
i = (i & 0x00ff00ff) + ((i >>> 8) & 0x00ff00ff); // ...00000000111111110000000011111111...
i = (i & 0x0000ffff) + ((i >>> 16) & 0x0000ffff); // ...00000000000000001111111111111111...
return i & 0x3f;
}



3-2. 고민말고 Integer.bitCount() 쓰기 = O(log(n))

// 원리는 3-1과 똑같다.

public static int bitCount4(int i) {
return Integer.bitCount(i);
}



# 1~3 까지의 성능비교

// shift도 빠르지만...

for (int i=0; i < Integer.MAX_VALUE; i++) {
int a = bitCount(i);
}

bitCount1 = 90,453ms

bitCount2 = 31,677ms

bitCount3 = 3ms

bitCount4 = 3ms



4. Hardware 찬스 쓰기

CPU 영역에서 bit를 한번에 세주는 기능이 있다고 한다.




Reference:

- https://en.wikipedia.org/wiki/Hamming_weight

- https://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer

'Algorithms' 카테고리의 다른 글

Wildcard('?', '*') 패턴 매칭 알고리즘  (0) 2018.11.20


# Wildcard('?', '*') 패턴 매칭 알고리즘


Wildcard가 들어간 패턴과 주어진 문자가 해당하는지 확인하는 알고리즘 중

매칭테이블로 이를 구현하는 것에 대해 알아본다.


1. 문제의 정의

- "ABC" == "ABC": 문자열 모두 동일하다면 True

- "ABC" == "A?C": 문자열 중 ?가 있는 한글자만 빼고, 나머지는 동일하다면 True

- "AC" == "A*C", "ABBBC" == "A*C": 문자열 중 *가 있는 부분이 없거나 여러개인 경우, 나머지는 동일하다면 True


2. 매칭테이블

Dynamic Programming 기법으로서 이전의 문자열까지의 비교를 누적하고, 다음문자를 비교할때 이를 참고한다.


Matching Table
0123...m
A?C...*
0T(0,0)T(0,1)T(0,2)T(0,3)...T(0,m)
1AT(1,0)T(1,1)T(1,2)T(1,3)...T(1,m)
2BT(2,0)T(2,1)T(2,2)T(2,3)...T(2,m)
3CT(3,0)T(3,1)T(3,2)T(3,3)...T(3,m)
........................
nZT(n,0)T(n,1)T(n,2)T(n,3)...T(n,m)

T(n, m)가 패턴 매칭의 결과가 된다.


3. 매칭의 조건

- case1: text[0] == pattern[0] 이면, T(0,0) = True 라고 본다.

             공백과 공백의 비교는 True라고 본다.

             하지만, 물론, 공백과 공백이 아닌 문자의 비교는 False이다.


- case2: text[i] == pattern[j]  이면, T(i, j) = T(i-1, j-1) 을 따른다.(대각선 상속)

              자기 위치의 문자와, 이전까지 문자열이 매칭되고 있었는지의 누적결과도 확인하는 것이다.


- case3: pattern[j] == ? 이면, T(i, j) = T(i-1, j-1) 을 따른다.(대각선 상속)

              ?의 패턴은 아무문자나 가능하고 그 개수만 맞으면 되기 때문에 이전까지의 누적결과만 확인하면 된다.


- case4: pattern[j] == * 이면, T(i, j) = T(i, j-1) 혹은 T(i-1, j) 을 따른다.(옆 또는 위 상속)

              T(i, j-1) 는 * 의 자리에 특정문자가 추가될 수 있음을 나타내고, 그 이전까지의 누적결과는 괜찮았는지 확인하는 것이다.

              T(i-1, j) 는 * 가 공백에 매칭되고 있음을 나타내고, 그 이전까지의 누적결과는 괜찮았는지 확인하는 것이다.


- case5: pattern[1] == * 이면, T(0, j) = T(0, j-1) 을 따른다.(옆 상속)

              패턴이 *로 시작하면 다음 pattern[2] 까지 문제없음을 전달하기 위함이다.



4. 다양한 case 확인해보기




Reference:

- https://www.geeksforgeeks.org/wildcard-pattern-matching/

- https://www.youtube.com/watch?v=3ZDZ-N0EPV0



# Android Material Design 스크롤에 따라 상단이 접히고 나오는 레이아웃 구성과 역할


화면구성과 그 xml 선언의 관계를 연결해보았습니다.





실제와 다른 부분이 있다면 알려주세요.

적극적으로 검토하고 반영하겠습니다.



Reference

- https://material.io/develop/android/components/collapsing-toolbar-layout/

- https://github.com/chrisbanes/cheesesquare

# Android Material Design 사이드메뉴(햄버그 메뉴?) 레이아웃 구성과 역할


화면구성과 그 xml 선언의 관계를 연결해보았습니다.



실제와 다른 부분이 있다면 알려주세요.

적극적으로 검토하고 반영하겠습니다.



Reference

- https://material.io/develop/android/components/navigation-view/

- https://github.com/chrisbanes/cheesesquare

# YOLO v3 demo webcam 돌려보기 for ubuntu 18.04


# YOLO란 무엇인가

- 는 웹사이트 읽어보시면 자세히 나와있습니다: https://pjreddie.com/darknet/yolo/

- 요약: YOLO가 나오기 전까지의 CNN은 사진을 여러조각(kernel or filter size)으로 그리고 그것들이 겹치게(stride) 하는 알고리즘이였다면, YOLO는 stride를 없애는(You Only Look Once) 전략으로 만들어진 알고리즘.



# 진행단계

- darknet 소스 다운로드

    - https://github.com/pjreddie/darknet


- CUDA 빌드환경 구성

    - Nvidia용 Additional driver 추가

    - CUDA toolkit 설치


- OpenCV 빌드환경 구성

    - OpenCV 설치


- darknet 빌드

- darknet 실행




0. 준비물

- Nvidia CUDA 지원 그래픽카드

- OpenCV

- webcam: ubuntu 호환되는 제품(ubuntu 내에 cheese 앱 실행여부로 확인가능)

- ubuntu(18.04): 이 데모가 ubuntu에서 진행되었기 때문.



1. darknet 소스 다운로드

- 적절한 위치에서

- $ git clone https://github.com/pjreddie/darknet.git



2. CUDA 빌드환경 구성

2.1. Nvidia용 Additional driver 추가

- Software & Updates > Additional Drivers > 드라이버 선택

  (YOLO 빌드가 안되는 낮은 버전이 있으니 주의)


2.2. CUDA toolkit 설치

- 설치가이드: https://developer.nvidia.com/cuda-downloads

    - 운영체제와 버전에 따라 설치

    - Tensorflow Object Detection에서는 CUDA 9.0을 지원하는데 CUDA 10.0 설치하면 호환에 어려움이 있을것.


2.3. ubuntu 내에서의 실행환경구성

- path와 기타 설정들을 알아서 해줌.

- $ sudo apt install nvidia-cuda-toolkit



3. OpenCV 빌드환경 구성

- 설치가이드: https://docs.opencv.org/3.4.1/d2/de6/tutorial_py_setup_in_ubuntu.html

- $ sudo apt-get install python-opencv



4. darknet 빌드 및 실행

4.1. Makefile 수정

    - $ vi Makefile

    - GPU=1

    - OPENCV=1

    - :wq

    - $ make


4.2. darknet 실행

- data출처(?) / hyperparameter 설정값 / weight 순서로 지정

- 실행을 위한 설정들이 cfg 파일 안에 있으니 해당 디렉토리를 참조


- $ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

  OR 메모리 부족이라고 나오는 경우 tiny 버전으로...

- $ ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights

'Machine Learning' 카테고리의 다른 글

Activation functions  (0) 2017.11.30
Wrap-up "Machine learning" by Andrew Ng  (0) 2017.10.13
Binomial Logistic Regression/Classification  (0) 2017.07.10
Linear Regression  (0) 2017.07.07

# 생각정리스킬-복주환, 천그루숲


장르: 자기개발

제목: 생각정리스킬

저자: 복주환

시작일: 2018.08.05일 쯤

완료일: 2018.08.31


[책을 읽게 된 동기]

이 책을 처음 알게된건 너무 많은 생각에 정리도 못하고 집중도 못하는 삶을 살고 있던 때 였다.

읽어본 책이라도 정리를 해보자는 마음에 독서정리 방법을 찾던중에 우연히 발견하였고,

독서 분야 뿐만 아니라 인생의 목표를 생각하고 정리해서 구체화하는 방법까지 나와있어서

혼란스러운 나의 생각을 정리해줄 길잡이가 될 것이라는 생각에 흥미롭게 읽어내려갈 수 있었다.


[도서정보]

생각 정리 스킬
국내도서
저자 : 복주환
출판 : 천그루숲 2017.01.20
상세보기


[책의 내용(줄거리)]

제1장 우리가 몰랐던 생각정리의 재발견

- 머릿속에 생각은 많지만 아이디어로 기획하는 능력이 없다면 실력은 인정받을 수 없다.

- 집행력: 정보를 조직화하고 체계적으로 일을 수행하는 능력, 패턴을 이해하고 계획을 세워서 실천

- 생각정리의 기술을 꾸준히 훈련


제2장 근본적으로 생각정리를 못하는 이유

2.2. 머릿속 생각을 시각화

- feat. 전두엽-생각정리 담당: 계획수립, 주의집중, 자기성찰, 의사결정, 문제해결 등


2.3. 생각정리 도구 활용

- 마인드맵: 중심토픽을 기준으로 생각을 정리

- 브레인스토밍: 아이디어 발상

- 만다라트: 목표, 의사결정

- 로직트리: 문제해결, 논리적 생각

- 퀘스천맵: 생각확장

- 아날로그와 디지털 도구 함께 활용


2.4. 생각정리 원리

- 나열, 분류, 배열:

  1) 생각을 모두 꺼내어 적어보기

  2) 시간/장소/과업/우선순위 등의 종류에 따라 분류

  3) 해야 할 일의 중요도에 따라 간단한 숫자 붙이고 배열

- 질문으로 생각을 정리: 육하원칙


제3장 복잡한 생각을 스마트하게 정리하는 방법

3.2. 만다라트

- 중심토픽: 핵심아이디어

- 주요토픽: 중심토픽을 세분화한 아이디어 8가지

- 하위토픽: 각각의 주요토픽에 대한 실천방안/세부 아이디어

- 우선순위: 무엇부터 실행에 옮길지 결정

만다라트에 대한 이미지 검색결과<출처: http://tong.joins.com/archives/15633>


3.3. 마인드맵

- 웹기반 서비스: OKmind, 마인도모, 마인드마이스터, Mind Manager, Mind 42

- PC소프트웨어: 알마인드, XMind, MindMapper, FreeMind, 컨셉맵, 컨셉리더

- 모바일: iThoughtsHD, I Mind Map, MindNode, Tingking Space, Mind Map Memo, 씽크와이즈

마인드맵에 대한 이미지 검색결과<출처: https://uartis.wordpress.com/2015/04/27/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B0%B0%EC%9A%B0%EA%B8%B0-%EB%A7%88%EC%9D%B8%EB%93%9C%EB%A7%B5%EC%9C%BC%EB%A1%9C-%EC%A0%95%EB%A6%AC%ED%95%98%EB%A9%B0-%EB%B0%B0%EC%9B%81%EB%8B%88%EB%8B%A4/>


3.4. 3의 로직트리

- 3의 법칙: 많지도 적지도 않은 이상적 느낌 / 3번의 임팩트 느낌 / 기억하기 좋은 느낌

- 차례로 생각해보기

1) 문제 구성요소 파악: What Tree(무엇이 문제인가)

2) 문제에 대한 원인 파악: Why Tree(왜 문제가 되었나)

3) 해결책 찾기: How Tree(어떻게 극복할 것인가)

- 자기소개 상황: 강점 3가지 - 간단명료하게 설명 - 숫자를 붙이기

로직트리에 대한 이미지 검색결과<출처: https://brunch.co.kr/@thinkingschool/8>


제4장 단순한 생각을 아이디어로 기획하는 방법

4.1.2. 문서의 4대 천왕

    - 기획서: 무엇을 할 것인가? - 건축설계도

    - 계획서: 어떻게 할 것인가? - 건축일정표

    - 제안서: 무엇을 제안하는가? - 모델하우스

    - 보고서: 현재 진척상황은? - 현황판

- 현재의 필요성과 미래의 잠재성을 파악하는것이 시작


4.2. 기획의 핵심은 문제해결

    - 문제를 정확히 파악-> 기획의 방향성

    - 다각도 현황 분석

    - 목표설정, 해결방법 구체화

    - 세부계획: 언제, 어디서, 누가, 어떻게

    - 실행, 기획의 목표 완수, 피드백(성공요인, 장애요인)


4.3. 브레인스토밍

    1) 자유로운 분위기

    2) 질보다 양

    3) 비판 금지

    4) 결합과 개선으로 새로운 아이디어

    - 진행자, 기록할 사람, 아이디어 제공자

    - 주제 -> 개별 아이디어 목표치 -> 개별발상 -> 집단토론 -> 평가


4.4. 브레인라이팅(=침묵의 브레인스토밍)

    - 주제 -> 양식지에 의견작성 및 전달 -> 평가


4.6. 한 페이지 기획서 작성법

    - 제목

    - 핵심 내용: 무엇을 말하고 싶은가

    - 기획배경

    - 목적: 무엇을 얻기를 바라는가

    - 목표: 얻고자 하는 것

    - 비용: 예산은 얼마?

    - 기대효과: 효과와 이익의 관계

    - 실행계획: 구체적으로 어떻게 실행?


제5장 오랫동안 기억에 남는 독서정리스킬

- 독서를 할때 전두엽이 가장 활성화 -> 사고력 향상


5.2. 독서 전 독서: "궁금함의 크기만큼 기억할 수 있다."

    - 표지: 제목이나 카피문장으로 책에대한 큰 그림

    - 저자: 저자의 사상, 경험, 지혜, 지식이 담겨있어서 확인

    - 머리말: 책을 쓴 배경, 주제, 저자의 주장 등


5.3. 독서 중 독서

    - 목차: 목차의 내용을 스토리로 만들어 기억 -> 전체를 생각

    - 내용: 목차의 항목이 왜 이렇게 만들어졌는지 생각하면서 핵심을 추리/검색/마인드맵 정리

    - 여백: 시간과 함께 생각을 정리, 발견/깨달음/다짐/느낌/아이디어/이해 여부/반성/공감/비판 등 -> 책을 읽으며 생각하는 상태가 된다.


5.4. 독서 후 독서

    - 한페이지 독서정리

    - 독서모임 참석

    - 독서리스트 작성: 자신감, 100권 정도면 새로운 세상이 보인다.


제6장 생각정리를 잘하면 스피치는 덤이다!

6.4. 생각정리스피치 5단계

    1) 대상과 목적: 누구에게 왜 말하는지

        - 청중이 누구인지 구체화

        - 청중이 필요한 메시지 전달

    2) 주제선정: 한마디로 무엇을 말하고 싶은지

    3) 질문 나열: 줄거리를 정리

    4) 목차 설계: 서론, 본론, 결론에 맞추기

    5) 내용 작성: 다양한 사례

        - 남이 만들어 놓은 것: 책

        - 현장에 존재: 직접 본 사실

        - 개인이 보유하는 것: 자신의 경험과 생각/상상 등


제7장 인생을 바꾸는 생각정리의 힘

7.2. 일기쓰기

    - 잘 못써도 됌

    - 일기를 쓰는 시간과 장소 기입

    - 부정적 보다 긍정적 표현

    - 과거의 추억 기록

    - 미래 설계 기록

    - 매일 실천할 삶의 목표 기록

    - 신언서판: 몸, 말씨, 글씨, 판단

    - 지속적으로 많이 쓰는 단어 분석


7.3. 인생그래프

    - 행복지수/불행지수 그래프 -> 높은지점/낮은지점에 있는 키워드들의 공통점 찾아 인생의 생각 확인


7.4. 버킷리스트

    - 자신이 좋아하는 것을 발견

    - 꿈을 꾸고 이루는 능력

    - 도전하고 이루면서 삶의 만족도 높아짐



[인상 깊은 구절]

궁금함의 크기만큼 기억할 수 있다.(P.153)

좋은 책을 읽는다는 것은 좋은 스승을 만나는 것과 같다. (P.176)

부정적인 상황을 기록했다면 그 다음 긍정적인 내용을 바로 기록하는 것이다. (P.227)



[책을 읽고 난 후의 생각이나 느낌]

모든일에서 목표가 있다면 그 목표를 실천할 방법을 생각하고 구체화하는 것은 누구나 생각하고 있다.

하지만 목표를 향해 복잡한 생각이 들때 그것을 어떻게 해쳐나가야 하는지, 어떻게 구체화 하는지

막연한 생각에 사로잡혀 있는 상황에서 그 해결방법을 찾을 수 있었다.

- 그 복잡한 생각을 생각나는대로 쏟아내어 적고

- 그 생각을 다양한 카테고리를 추가하며 마인드맵으로 정리한다.

그 중에서도 가장 시작은 복잡한 생각을 우선 마구 적어보는 것이다.

그동안 난 시작이 두려웠던 것인지, 방법에 소극적이였던 것인지 혹은 둘다였는지 여전히 부끄럽다.

하지만 이젠 방법을 알았으니 그 시작을 두려워 하지 말자.



이 양식은 생각정리스킬의 독서정리양식을 사용하였다.



# Android 앱 소스 난독화/암호화(Obfuscation) 종류


"Proguard면 충분하지!" 하고 살았던 그동안의 시간을 반성한다.

난독화의 종류는 다양하며 Proguard는 그 중 극히 일부분만 혹은 거의 보호를 못한다고 봐야 된다.



# 소스 난독화/암호화 종류

1. Renaming: 식별자 전환. 클래스/메소드의 이름을 a, b, c... 등 의미없는 이름으로 대체

2. Control Flow: 제어흐름 변환. A->B 와 같던 실행순서를 A->C->B 처럼 C구문을 삽입하는 기법

3. String Encryption: 문자열 암호화. 문자열을 암호화된 문자열로 대체하고 사용시 이를 치환

4. API Hiding: API 은닉. 특정 라이브러리 또는 메소드 호출을 Reflection으로 대체하여 숨긴다.

5. Class Encryption: 파일내용 전체를 암호화하여 저장해 두었다가 동적으로 복호화, 클래스 로더로 로딩



# 안드로이드 

6. DEX Encryption: Dalvik Executable 파일 자체를 암호화 한다.



난독화를 직접 할 수도 있다지만

아래와 같이 Proguard는 식별자 변환만 하고 나머지 툴은 모두 유료다.


 

 Proguard(무료)

DashOPro(유료)

Allatori(유료)

 DexGuard(유료)

 Renaming

O

O

O

O

 Control Flow

X

O

O

O

 String Encryption

X

O

O

O

 API hiding

X

X

X

O

 Class Encryption

X

X

X

O

 DEX Entryption

X

X

X

X






Reference

- Kim Jiyun, Go Namhyeon, Park Yongsu, A Code Concealment Method using Java Reflection and Dynamic Loading in Android, Journal of the Korea Institute of Information Security and Cryptology, Volume 25, Issue 1,  2015, pp.17-30

+ Recent posts