GIT commit, push 된 버전 삭제하기

이미 작업이 끝나서 commit에 remote push까지 된 상태에서 취소하는 방법을 정리해보았다.
일단 최근 commit을 취소하려면 아래의 명령을 한다.

$ git reset HEAD~


그리고 나서 git log를 확인해보면 최근 commit이 취손 된 것을 확인 할 수 있다.
이제 취소된 내역을 remote에도 반영해보자.

$ git push origin qa
Password for 'https://rocksea@bitbucket.xxxxx.co.kr':
To https://rocksea@bitbucket.xxxxxx.co.kr/bitbucket/scm/project.git
 ! [rejected]        qa -> qa (non-fast-forward)


현재 local 브랜치와 remote 브랜치간의 버전이 안맞아서 rejected가 되는데 이 경고를 무시하고 push를 하면된다.
브랜치앞에 + 기호를 추가하면 된다.

$ git push origin +qa
Password for 'https://rocksea@bitbucket.xxxxx.co.kr':
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create pull request for qa:
remote:   https://bitbucket.xxxxx.co.kr/bitbucket/projects/MKT/repos/project/compare/commits?sourceBranch=refs/heads/qa
remote:
To https://rocksea@bitbucket.xxxxx.co.kr/bitbucket/scm/mkt/project.git
 + a61ec23…879dde1 qa -> qa (forced update))



신고

'Developer's Life' 카테고리의 다른 글

[GIT] commit, push 된 버전 삭제하기  (0) 2017.09.13
How to install Couchbase on OSX  (0) 2017.05.02
xcode에서 vim사용하기  (0) 2016.12.07
[Conference] Tech Planet 2016  (0) 2016.10.18
LRU Cache Algorithm  (0) 2016.10.13
[Jenkins] how to install jenkins on docker  (0) 2016.08.04
Trackback 0 , Comment 0
secret




Getting started with Couchbase on OSX

Couchbase is a NoSQL database that provides a mechanism for storage and retrieval of data.
Because Memcached protocol is supported, existing Memcached system can replace 100%.


Couchbase Server was designed to satisfy include:

  • Flexible data model
  • Powerful query language
  • Scalability
  • Performance
  • Simple administration

1. Installing the Couchbase Community Server

$ brew install Caskroom/cask/couchbase-server-community

==> brew cask install Caskroom/cask/couchbase-server-community

==> Deleting legacy cache at /Users/tmonplus/Library/Caches/Homebrew/Casks

==> Migrating Caskroom from /opt/homebrew-cask/Caskroom to /usr/local/Caskroom.

==> Creating symlink from /usr/local/Caskroom to /opt/homebrew-cask/Caskroom.

==> Downloading http://packages.couchbase.com/releases/4.1.0/couchbase-server-community_4.1.0-macos_x86_64.zip

######################################################################## 100.0%

==> Verifying checksum for Cask couchbase-server-community

==> Moving App 'Couchbase Server.app' to '/Applications/Couchbase Server.app'.
🍺  couchbase-server-community was successfully installed!


2. Installing the command-line KV client

In order to use command line interface, you need to install libcouchbase.

$ brew install libcouchbase

Updating Homebrew...

==> Auto-updated Homebrew!

Updated 2 taps (caskroom/cask, homebrew/core).

==> Updated Formulae

purescript


==> Installing dependencies for libcouchbase: openssl, libevent

==> Installing libcouchbase dependency: openssl

==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2k.sierra.bottle.tar.gz

######################################################################## 100.0%

==> Pouring openssl-1.0.2k.sierra.bottle.tar.gz

==> Using the sandbox

==> Caveats

A CA file has been bootstrapped using certificates from the SystemRoots

keychain. To add additional certificates (e.g. the certificates added in

the System keychain), place .pem files in

  /usr/local/etc/openssl/certs


and run

  /usr/local/opt/openssl/bin/c_rehash


This formula is keg-only, which means it was not symlinked into /usr/local.


Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries


If you need to have this software first in your PATH run:

  echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile


For compilers to find this software you may need to set:

    LDFLAGS:  -L/usr/local/opt/openssl/lib

    CPPFLAGS: -I/usr/local/opt/openssl/include

For pkg-config to find this software you may need to set:

    PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig


==> Summary

🍺  /usr/local/Cellar/openssl/1.0.2k: 1,696 files, 12MB

==> Installing libcouchbase dependency: libevent

==> Downloading https://homebrew.bintray.com/bottles/libevent-2.1.8.sierra.bottle.tar.gz

######################################################################## 100.0%

==> Pouring libevent-2.1.8.sierra.bottle.tar.gz

🍺  /usr/local/Cellar/libevent/2.1.8: 847 files, 2.2MB

==> Installing libcouchbase 

==> Downloading https://homebrew.bintray.com/bottles/libcouchbase-2.7.3.sierra.bottle.tar.gz

######################################################################## 100.0%

==> Pouring libcouchbase-2.7.3.sierra.bottle.tar.gz
🍺  /usr/local/Cellar/libcouchbase/2.7.3: 89 files, 2.4MB


3. Setup Couchbase

Running the Couchbase Server.

Accessing http://127.0.0.1:8091/ui/index.html#/ from your web browser, then follow the
steps below.

Creating sample bucket.


Querying Sample Document on Command line.

$ cbc cat airline_10 -U http://localhost/travel-sample

airline_10           CAS=0x14b6698d99820000, Flags=0x2000006. Size=120{"id":10,"type":"airline","name":"40-Mile Air","iata":"Q5","icao":"MLA","callsign":"MILE-AIR","country":"United States"}


신고

'Developer's Life' 카테고리의 다른 글

[GIT] commit, push 된 버전 삭제하기  (0) 2017.09.13
How to install Couchbase on OSX  (0) 2017.05.02
xcode에서 vim사용하기  (0) 2016.12.07
[Conference] Tech Planet 2016  (0) 2016.10.18
LRU Cache Algorithm  (0) 2016.10.13
[Jenkins] how to install jenkins on docker  (0) 2016.08.04
Trackback 0 , Comment 0
secret




xcode XVim설치

XVim을 설치하면 xcode에서 vim을 사용할 수 있다.

xcode 8.x 이상일경우

xcode 8.x이상의 경우 코드 사이닝 과정이 필요하다.

$ sudo codesign -f -s XcodeSigner /Applications/Xcode.app

위 과정이 완료되었다면 아래 절차대로 설치를 진행한다.

1. Git 소스 Clone

$ git clone https://github.com/XVimProject/XVim.git


2. Make

$ cd Xvim
$ make


위 과정이 완료된 후 Xcode를 재실행한다.

출처 : https://github.com/XVimProject/XVim

신고

'Developer's Life' 카테고리의 다른 글

[GIT] commit, push 된 버전 삭제하기  (0) 2017.09.13
How to install Couchbase on OSX  (0) 2017.05.02
xcode에서 vim사용하기  (0) 2016.12.07
[Conference] Tech Planet 2016  (0) 2016.10.18
LRU Cache Algorithm  (0) 2016.10.13
[Jenkins] how to install jenkins on docker  (0) 2016.08.04
Trackback 0 , Comment 0
secret




SK Techplanet 후기.



테크플래닛 2016, 역시나 ML과 Bigdata 분산처리를 이용한 기술이 큰 화두였으며,  각 세션마다 기술적용 도입사례를  소개하는 방식의 프레젠테이션을 통해 각 세션에 대한 요약 및 정리를 해보았다.

1. Large-scale Robust Online Matching with lts applications in Alibaba (Rong Jin / VP, Alibaba Group)
적절한 온라인 상담을 위한 매칭 시스템으로 대규모 온라인 매칭연결을 위해 최적화 이론과 양변 일치 이론을 바탕으로 연구한 결과를 소개하였다. 


요약
- 유저가 원하는 답변을 해줄 수 있는 상담원을 정확하게 매칭해 주는 기술이 핵심.
- Stable marriage model ( https://rosettacode.org/wiki/Stable_marriage_problem )

2. Cognitive Computing with Multilingual Watson(Salim Roukos / Sr. Manager, IBM Watson Fellow)
Watson solution의 도입을 가속화하기 위해 다중 언어를 지원하는 것을 포함하는 클라우드 기반의 인지 서비스의 NLP(Natural Language Processing)에 대한 새로운 통계 모델 개발에 대한 개요를 다룬다 . Watson Developer Cloud에서 사용 가능한 대화(conversation), 자연언어에 대한 이해(Natural Language Understanding), 음성에서 텍스트 전환 (Speech to Text) 및 번역 (Language Translation)등의 다양한 서비스에 대하여 다룬다.

요약
- Multi-Lingual NLP 인지시스템-> Classfication -> Machine Learning을 통해 다양한 언어를 지원하는 대화형 시스템을 만드는것이 핵심기술
-  Watson Cloud : http://www.ibm.com/watson/developercloud/services-catalog.html
- NLP : https://en.wikipedia.org/wiki/Natural_language_processing


3. Echosystem of Python (김영근 / Python SW재단 이사)
파이썬의 성공의 연료인 커뮤니티와 파이썬 생태계에 대해서 설명하고 다양한 파이썬 활용 사례에 대해서 소개한다.
기본적으로 파이선 비기너가 들으면 좋을것 같다라는 생각이 들었으며, 리마인드 차원에서 편하게 들을 수 있었다.




요약
pyc, pypy, jython 등의 다양한 구현체
- OOP, Functional Language의 멀티 패러다임.
Docker Prototype, Disney, Launch Pad Software, Phillips, D-Link, Nasa, 문명5 등에서 활용됨.
Python2 or Python3?  앞으로 Python3만 지원하기때문에 처음시작시 Python3로 시작.


4. Visual Search at SK Planet (나상일 매니저 / SK Planet)
SK Planet에서 연구,개발한 Visual search technology를 소개하며, 특히 11번가 패션상품 검색에 어떻게 적용되었는지,  최신의 Visual recognition / Language modeling 기술을 살펴보고, visual information, textual information을 결합한 대용량 검색모델에 대한 연구 진행사항에 대하여 발표하였다.



요약
- 상품이미지를 통해 -> 카테고리 예측 -> 관심영역 추출 -> 특징 추출
- 카테고리 예측에 Deep Learning 적용하여 Score가 가장 높은 카테고리 선정
- Grab-cut, Saliency, HOG(Histogram of Oriented Gradient) + SVM(Support Vector Machine)을 통한 관심영역 추출에대 검증
- Pattern, Color등에 대한 특징 추출
- 검색서버 성능향상을 위해 Redis를 활용하여 병렬처리
- HOG : https://en.wikipedia.org/wiki/Histogram_of_oriented_gradients
- SVM : https://en.wikipedia.org/wiki/Support_vector_machine

5. Travel Platform (전민수 / Lead Architect)
RDB에서 데이터 동기 및 분산형 검색 시스템을 구축하면서 벤더의 제품에 의존하지 않고 리얼타임으로 데이터 동기화를 구현한 경험을 바탕으로 발표하였다.
(개인적으로 사례를통한 적절한 비유와 PPT로 가장  이해가 쉬웠다. 또한 발표자님의 일본식 한국어 발음이 재미를 더했다.)


요약
- read 25 : write 1의 비율로 I/O발생
- Scalable, Low latency, Trouble shooting, SLA, Fault Tolerance, Cost Efficiency 에대한 고려
- MongoDB, Redis, RabbitMQ를 이용하여 인프라구축  
- Ansible (Provisioning Tool)을 이용한 서버 자동 배포환경 구축


5. In-App Messaging and  Chatbot (김태양 / 팀장, SK Planet)
App 내에 Chat 기능을 사용할 수 있도록 하는 In-App Messaging SDK 개발과 적용 사례에 대해서 알아보고, 2016년 화두가 되고 있는 대화형 커머스(Conversational Commerce)와 Chatbot 에 대하여 발표하였다.


요약
- In-App Messaging 정의 : Mobile App 내에 실시간 메세지 전송기능을 제공
- Conversational Commerce 정의 : Chat Interface를 통해 브랜드, 상거래등의 기능을 제공
- 챗봇 정의 : 대화형 UI에서 동작, 사전 정의된 Interface, 자연어를 통해 Context에 맞는 응답을 제공하는 커뮤니케이션 소프트웨어
- 챗봇의 발전 방향 :  자연어 -> ML을 이용한 AI
- Node.js, Websocket, Long Polling, JWT를 이용하여 어플리케이션 구현


6. Google Tensor Flow & Machine Learning in the Cloud (Kaz Sato / Evangelist, Google Japan)
뉴럴네트워크가 무엇인지, 딥러닝은 왜 중요한지 이러한 기술들을 제품서비스에 적용하는데 난관들은 없는지, 이러한 질문에 대한 답변을 제시하고 구글이 어떻게 성공적으로 거대규모의 뉴럴네트워크를 구글포토, 안드로이드, 구글서치 등에 적용했는지  또한 새로운 구글비젼API, 스피치 API, 텐서플로우, 클라우드Ml등의 새로운 구글클라우드 제품들을 소개하고 이들이 어떻게 개발자들로 하여금 구글의 머신러닝 경쟁력을 확장 가능하고 통제가능한 서비스들에  대하여 발표하였다.


요약
-
Input "Cat Image" -> Ventor -> Algebra Function -> Other Vector -> "Cat"
- Hidden Layer가 많아질수록 더 스마트한 결과 도출
- Cloud ML ( Vision-explorer.reactive.ai ), TensorFlow등을 이용하면 손쉽게 ML 구현가능
- Portable and Scalable
- GPU를 활용하여 성능향상
- Image, 시계열데이터 분석가능
 유즈케이스 : 오이분류기, 치킨너겟 서빙머신, 드론을 활용한 일반개인개발자들도 간단하게 도입
- Datacenter & Jupiter Network ( 10GbE x 100 K = 1Pbps )
- TPU Tensor Process Unit (CPU, GPU보다 가성비가 훌륭하다)


7. 빅데이터와 자연어처리 기술을 이용한 11번가 상품추천 (황영숙/팀장, SK Planet)
SK플래닛에서의 자연어처리와 텍스트 마이닝 기술을 간단히 소개하고, 11번가 서비스에서 생성/수집되는 방대한양의 상품데이터와 사용자 행동정보를 빅데이터 처리와 자연어처리 기술을 결합하여 분석, 상품과 사용자를 공통의 의미 속성 공간에서 모델링하고, 이를 상품 추
천, 마케팅 및 컨시어지 서비스 기술 개발 등에 활용하는 현황에 대해 발표하였다.


요약
-
팔레토 법칙(상위 20%가 전체매출을 차지) VS 롱테일법칙(하위 80%가 전체매출을 차지)
- 협업필터링(Collaborative Filtering) : 고객 행동이력을 기반으로 고객소비패턴 분석 하여 추천 제공
- 상품기반필터링(Content-Based Filtering) : 상품의 정보분석 정보를 기반으로 추천
- 자연어 처리(NLP), 머신러닝(ML)기반의 추천시스템 구성

8. Facebook Chatbot M messenger (Alex Lebrun/Team Lead, Facebook)
요즘 봇들이 최고의 관심을 받고 있다. 따라서 인공지능과 봇의 역사를 간략하게 짚어보고 개발자들이 봇을 만들어 활용 할 수 있는 베스트프랙티스(best-practice)에 대한 발표를 진행하였다.

요약
- 앨런튜링에 의해 AI가 화두가됨.
- 지난 20년간 AI에 대한 연구가 없었으며, 최근 등장한 Deep learning 이후 ML에대한 연구가 활발해짐
- Chatbot  : NLP -> ML -> Answer
- Chatbot도 ML에의한 기술의 한계가 있기때문에 때때로 사람의 컨트롤이 필요함.
- Wit.ai에서 자연어처리에 대한 데모가능


참고 사이트 
https://nhnent.dooray.com/share/posts/iegR3nOSSdi-k-BNNvsCPA

신고

'Developer's Life' 카테고리의 다른 글

How to install Couchbase on OSX  (0) 2017.05.02
xcode에서 vim사용하기  (0) 2016.12.07
[Conference] Tech Planet 2016  (0) 2016.10.18
LRU Cache Algorithm  (0) 2016.10.13
[Jenkins] how to install jenkins on docker  (0) 2016.08.04
How to make shorten url using BASE62  (0) 2016.05.19
Trackback 0 , Comment 0
secret




LRU (least recently used) Cache 알고리즘.

직역하면 '최근까지 최소로 사용되었다' 즉 사용한지 가장 오래된 데이터를 퇴출시키는 알고리즘이라 볼 수 있다.
OS의 페이지 교체 알고리즘(Page Replacement Algorithm)으로 사용되는 방식으로, 새로운 페이지를 할당 시 공간이 부족한 경우, 기존에 사용중인 페이지를 교체해야하는데, 교체시 가장 사용한지 오래된 영역의 페이지를 선정하여 교체하기위해 사용된다. 
LRU외에도 흔히아는 OPT, FIFO, LFU, NUR, SCR 등등이 있으며 OPT알고리즘의 실현 가능성이 희박하기때문에 차선으로 LRU 캐시를 사용한다.

In Memory 기반의 NoSQL인 Redis에서도 LRU 페이지 교체 알고리즘이 존재한다. 


LRU Cache의 기본적인 알고리즘.
최근까지 사용되지 않은 페이지를 교체한다.

[그림1] LRU 페이지 교체 방식



LRUCache.java
Node간 연결을 위해 Linked List를 이용하여 구현하도록 한다. Page Fault발생가 발생하여 Node의 퇴출 시, 각 Node간의 연결을 위해 사용한다.

import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class LRUCache { int capacity; HashMap<Integer, Node> map = new HashMap<Integer, Node>(); Node head; Node end; public LRUCache(int capacity) { this.capacity = capacity; } public void remove(Node n){ if(n.pre != null){ n.pre.next = n.next; }else{ head = n.next; } if(n.next != null){ n.next.pre = n.pre; }else{ end = n.pre; } } public void setHead(Node n){ n.next = head; n.pre = null; if(head != null) head.pre = n; head = n; if(end == null){ end = head; } } public int get(int key){ if(map.containsKey(key)){ Node n = map.get(key); remove(n); setHead(n); return n.value; } else { return -1; } } public void set(int key, int value){ if(map.containsKey(key)){ Node n = map.get(key); n.value = value; remove(n); setHead(n); }else{ Node n = new Node(key,value); System.out.println("size : " + map.size() + " , capacity : " + capacity); if(map.size() >= capacity){ map.remove(end.key); remove(end); } setHead(n); map.put(key,n); } } public void print(){ for(Integer key : map.keySet()){ System.out.println( "Key: "+key+", Value: "+map.get(key).value); } } }

Node.java
public class Node {
  int key;
  int value;
  Node pre;
  Node next;
  public Node(int key, int value){
    this.key = key;
    this.value = value;
  }
}

Main.java
public class Main {
  public static void main(String args[]){
    LRUCache cache = new LRUCache(3);
    cache.set(3,3);
    cache.print();
    System.out.println("====================================");

    cache.set(6,6);
    cache.print();
    System.out.println("====================================");

    cache.set(9,9);
    cache.print();
    System.out.println("====================================");

    cache.set(7,7);
    cache.print();
    System.out.println("====================================");

    cache.set(9,9);
    cache.print();
    System.out.println("====================================");
  }
}

결과

size : 0 , capacity : 3

Key: 3, Value: 3

====================================

size : 1 , capacity : 3

Key: 3, Value: 3

Key: 6, Value: 6

====================================

size : 2 , capacity : 3

Key: 3, Value: 3

Key: 6, Value: 6

Key: 9, Value: 9

====================================

size : 3 , capacity : 3

Key: 6, Value: 6

Key: 7, Value: 7

Key: 9, Value: 9

====================================

Key: 6, Value: 6

Key: 7, Value: 7

Key: 9, Value: 9

====================================


신고

'Developer's Life' 카테고리의 다른 글

xcode에서 vim사용하기  (0) 2016.12.07
[Conference] Tech Planet 2016  (0) 2016.10.18
LRU Cache Algorithm  (0) 2016.10.13
[Jenkins] how to install jenkins on docker  (0) 2016.08.04
How to make shorten url using BASE62  (0) 2016.05.19
[Heroku] Getting started with Heroku  (0) 2016.05.09
Trackback 0 , Comment 0
secret




Docker를 이용한 Jenkins 설치방법.

jenkins 2.7.1로 넘어오면서 설치방법이 바뀌었으므로 재 정리 차원에서  작성하였다.

*Docker 설치
ubuntu 예 :  apt-get install docker.io

jenkin official docker hub에 등록된 Docker Image를 이용하여 설치하였다.
Official jenkins docker hub url : https://hub.docker.com/_/jenkins/

Step 1. docker pull image

$ docker pull jenkins


Step 2. run container 

Docker Container를 구동시킨다.

$ sudo docker run -u jenkins -p 8080:8080 -p 50000:50000 -v /home/service/jenkins jenkins


현재 container의 상태를 확인한다.

$ sudo docker ps -a

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                              NAMES

6caeefea6c88        jenkins:latest      "/bin/tini -- /usr/l   23 minutes ago      Up 3 minutes        0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   tender_sinoussi


Step 3.  Jenkins 설치

인스턴스가 실행되면 위와같이 설치가 진행이 되며,  패스워드가 생성이 되면 복사한 뒤 웹 페이지로 이동하여 붙여넣는다. (필자의 경우 8080 port를 사용하였다.)

플러그인을 직접 선택하려면 오른쪽, 추천 플러그인을 활용하려면 왼쪽 메뉴를 선태한다.


설치UI가 매우 심플해서 마음에 든다!

신고
Trackback 0 , Comment 0
secret




How to make shorten url using BASE62.

짧은 URL을 만들기 위한 알고리즘을 고민하던 중. base64를 고민해봤는데, 보통의 Short URL들의 특징을 살펴보니 특수문자를 제외한 영문 대소문자 + 숫자로만 이루어진 조합의 URL을 사용하고 있다.  특수문자가 사용될 경우 URL Encoding을 해줘야 하기때문에  (Base64의  +의 경우  %2D, /의 경우 %2F, 패딩 '='은 %03D) 특수 문자를 제외한 나머지 62개의 값을 가지고 URL을 생성을 목적으로 하는게 Base62의 기본 알고리즘이다. 

기본적으로  Base64의 알고리즘을 알 필요가 있다.

Base64는 8비트로 구성된 입력값을 2의 6승인 6비트씩 짤라서 64까지의 값을 표현 한다.

ASCII Code 입력 값 : CBA 인코딩

 01000011

 01000010

 01000001

 

 010000

 110100

 001001

 000001

 Q

 0

 J

 B

Base64 Encoding 결과 값 : Q0JB


Base62의 경우에는 +,/ 문자를 제외한 62개의 값을 표현한다.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789


특정 sequence를 매칭하여 BASE62 주소로 반환하는 코드를 작성해보았다. 

int형과 long 타입까지 생성 가능하도록 작성 하였다.

Base62.java

/**
 * Created by rocksea on 2016. 5. 12.
 */
public class Base62 {
    /**
     * Base62 Character Table
     */
    static final char[] BASE62 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();

    /**
     * Base62 Encoding
     *
     * @return the base 62 string of an integer
     */
    public static String encode(int value) {
        final StringBuilder sb = new StringBuilder();
        do {
            int i = value % 62;
            sb.append(BASE62[i]);
            value /= 62;
        } while (value > 0);
        return sb.toString();
    }

    public static String encodeToLong(long value) {
        final StringBuilder sb = new StringBuilder();
        do {
            int i = (int)(value % 62);
            sb.append(BASE62[i]);
            value /= 62;
        } while (value > 0);
        return sb.toString();
    }

    /**
     * Returns the base 62 value of a string.
     *
     * @return the base 62 value of a string.
     */
    public static int decode(String value) {
        int result=0;
        int power=1;
        for (int i = 0; i < value.length(); i++) {
            int digit = new String(BASE62).indexOf(value.charAt(i));
            result += digit * power;
            power *= 62;
        }
        return result;
    }

    public static long decodeToLong(String value) {
        long result=0;
        long power=1;
        for (int i = 0; i < value.length(); i++) {
            int digit = new String(BASE62).indexOf(value.charAt(i));
            result += digit * power;
            power *= 62;
        }
        return result;
    }
}


Base62Test.java

import org.junit.Test;
import java.util.Random;
import static junit.framework.Assert.assertEquals;

public class Base62Test {

    @Test
    public void testEncodeAndDecode() throws Exception{
        String encodedReservationNo = Base62.encodeToLong(1234512345);
        System.out.println("ENCODE : "+encodedReservationNo+", DECODE : " + Base62.decodeToLong(encodedReservationNo));
        assertEquals(1234512345, Base62.decodeToLong(encodedReservationNo));
    }

    @Test
    public void testRandomEncodeAndDecode() throws Exception{
        for(int i=0; i < 10; i++) {
            Random rnd = new Random();
            long value = Math.abs(rnd.nextLong() % 10000000000L);
            System.out.println("VALUE : " + value);
            String encodedReservationNo = Base62.encodeToLong(value);
            System.out.println("ORIGINAL : " + value + ", ENCODE : " + encodedReservationNo + ", DECODE : " + Base62.decodeToLong(encodedReservationNo));
            assertEquals(value, Base62.decodeToLong(encodedReservationNo));
        }
    }
}

SMS나 메세지, SNS URL 공유가 많이 필요한 서비스에 활용할 경우 유용하다.

신고
Trackback 0 , Comment 0
secret




Paas 클라우드 서비스 Heroku 시작하기.



클라우드서비스가 대중적이지 않던 시절에는 SE나 개발자가 인프라를 구축하고 운영해야 했으나, 요즘과 같이 다양한 클라우드 인프라를 이용할 수 있는 시대에는 개발자가 가장 잘 할 수 있는 어플리케이션 개발에 집중하고, 가장 심플하게 인프라를 이용할 수 있는 클라우드 서비스 사용이 개발의 핵심 요소로 자리 잡았다고 볼 수 있다.  AWS, GAE, Asure, Heroku 등등 국내 통신사, 호스팅 업체도 클라우드서비스 상품을 출시 하므로 점점 대중화에 힘쓰고 있는 것을 볼 수 있다. 

Paas 서비스 중에서도 설치,배포가 심플한 Heroku에 대해 알아보았다.

Heroku는 Ruby부터 Java, Python, PHP, GO, Scala, Node.js, Clojure등 여러 플랫폼을 제공하고 있으며, 설치 배포가 다른 클라우드 플랫폼들에 비해 쉽다.


Deploy Spring Boot Application on Heroku.

개발환경

OS : OSX El Capitan

java : 1.8

Spring Boot : 1.4.0

Redis

MySQL

Heroku Toolbelt : 3.43.2


1. Sign-up

https://www.heroku.com/pricing 접속 후 Sign-up For Free

[그림 1] Sign up For Free


2. 계정 등록 및 E-mail 인증

계정 등록 후 E-mail 인증 및 Password를 설정하면 로그인이 가능하다.

[그림 2-1] 계정 등록 및 플랫폼 선택


[그림 2-2] 계정 등록 및 플랫폼 선택


[그림 3-1] 인증메일을 통한 사용자 인증



[그림 3-2] 인증메일을 통한 사용자 인증


3. Heroku Tool 설치

https://toolbelt.heroku.com/ 접속 후 Toolbelt Installer를 다운로드 받는다.

[그림4] Heroku Tool belt 설치


설치 확인

$ heroku --version

heroku-cli: Installing CLI... 19.39MB/19.39MB

heroku-toolbelt/3.43.2 (x86_64-darwin10.8.0) ruby/1.9.3

heroku-cli/5.1.6-151ac67 (darwin-amd64) go1.6.2

You have no installed plugins.



4. Deploy 절차 수행

Gradle과 maven기준이 다르기 때문에 주의해야한다.  (Gradle 기준으로 작성되었다.)


- Procfile 작성

web: java $JAVA_OPTS -Dserver.port=$PORT -jar app.jar


- system.properties 작성

java.runtime.version=1.8


- build.gradle 추가

task stage(type: Copy, dependsOn: [clean, build]) {

  from jar.archivePath

  into project.rootDir

  rename {

    'app.jar'

  }

}

stage.mustRunAfter(clean)


clean << {

  project.file('app.jar').delete()

}


- heroku login

$ heroku login

Enter your Heroku credentials.

Email: globalrocksea@gmail.com

Password (typing will be hidden): 

Logged in as globalrocksea@gmail.com


- git 셋팅

heroku는 GIT을 이용하여 배포되기 때문에 git사용법을 미리 숙지하여 사용하도록 한다.

$ git config --global user.email "globalrocksea@gmail.com"

$ git config --global user.name "rocksea"

$ git init

$ git add -A

$ git commit -m "first commit" -a


- heroku create

heroku application을 생성한다.

$ heroku create

Creating app... ⬢ obscure-thicket-xxxxx

https://obscure-thicket-xxxxx.herokuapp.com/ | https://git.heroku.com/obscure-thicket-xxxxx.git


- DBMS AddOn 설치

PostgreSQL을 사용할 경우

$ heroku addons:create heroku-postgresql


MySQL을 사용할 경우 (현재 MySQL을 사용하므로 이 부분을 진행

$ heroku addons:create cleardb:ignite


설치 시 아래와 같은 메세지가 출력 되는 경우가 있는데, 결제 카드 등록이 안되어있는 경우이니 당황하지 말고 

https://dashboard.heroku.com/account/billing  페이지에서 등록하도록 한다.

 !    Please verify your account to install this add-on plan (please enter a credit card) For more information, see https://devcenter.heroku.com/categories/billing Verify now at https://heroku.com/verify 


- DB config 확인

$ heroku config

=== obscure-xxxxxx Config Vars

DATABASE_URL: postgres://xxxxxx:xxxxxxx@....


- Redis AddOn 설치

$ heroku addons:create rediscloud:30


$ heroku config | grep REDIS

=== obscure-xxxxxx Config Vars

REDISCLOUD_URL:       redis://xxxx:xxxxx@pub-redis-15612.us-east-1-2.2.ec2.garantiadata.com


전체 addons 내역 확인

$ heroku addons


Add-on                                       Plan       Price

───────────────────────────────────────────  ─────────  ─────

cleardb (cleardb-rugged-93865)               ignite     free

 └─ as CLEARDB_DATABASE


heroku-postgresql (postgresql-curved-93379)  hobby-dev  free

 └─ as DATABASE


rediscloud (rediscloud-horizontal-52863)     30         free

 └─ as REDISCLOUD


The table above shows add-ons and the attachments to the current app (obscure-xxxxxx) or other apps.


5. Deploy

Heroku에 배포시 git push를 통해 수행 한다.  Push를 하면 자동으로 빌드를 시작한다.

$ git push heroku master

remote:        2016-05-09 07:57:36.177  INFO 328 --- [       Thread-7] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@53c47fe: startup date [Mon May 09 07:57:07 UTC 2016]; root of context hierarchy

remote:        :check

remote:        :build

remote:        :stage

remote:        

remote:        BUILD SUCCESSFUL

remote:        

remote:        Total time: 1 mins 2.36 secs

remote: -----> Discovering process types

remote:        Procfile declares types -> web

remote: 

remote: -----> Compressing...

remote:        Done: 117.5M

remote: -----> Launching...

remote:        Released v7

remote:        https://xxxxx.herokuapp.com/ deployed to Heroku

remote: 

remote: Verifying deploy... done.

To https://git.heroku.com/xxxxx.git

 * [new branch]      heroku -> master


TIP 1. 빌드 실패 또는 소스 수정 없이 재 빌드 시 

$ git commit --allow-empty -m "empty commit"

$ git push heroku master


TIP 2. 수동 빌드 팩 설정 시 ( Gradle )

$ heroku create --buildpack https://github.com/heroku/heroku-buildpack-gradle.git


6. Open Browser

$ heroku open


$ heroku logs --tail

[그림 5] heroku 브라우저 접속 테스트

신고
Trackback 0 , Comment 0
secret




Gradle 빌드 속도 향상을 위한 Daemon 실행



개발 시 gradle 빌드 한번 돌리려면 수초에서 수분까지 기다려야 하는 상황이 빈번히 발생한다. 따라서 아래와 같이 Daemon을 띄워 빌드속도를 올려 보도록 한다.

 빌드를 하다보면 아래와 같은 문구를 확인 해 볼 수 있다.

This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.11/userguide/gradle_daemon.html

빌드 속도가 빨라진다는 메세지와 함께 링크가 출력된다. 바로 들어가서 확인해보았다.

https://docs.gradle.org/2.11/userguide/gradle_daemon.html


설정은 간단하다.

gradle.properties 파일에 아래와 같이 작성한다. (각 플랫폼 별 gradle경로를 확인한다.)

- C:\Users\<username> (Windows Vista & 7+)

- /Users/<username> (Mac OS X)

- /home/<username> (Linux)


org.gradle.daemon=true


그리고 이제 빌드를 돌리면 빨라짐을 느낄 수 있을 것이다.

$ gradle build

Starting a new Gradle Daemon for this build (subsequent builds will be faster).


프로세스를 확인 해보니 아래와 같은 데몬프로세스가 돌고 있었다.

501 16132 1 0 5:02PM ttys007 0:24.91 /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/bin/java -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xmx1024m -Dfile.encoding=UTF-8 -Duser.country=KR -Duser.language=ko -Duser.variant -cp /usr/local/Cellar/gradle/2.11/libexec/lib/gradle-launcher-2.11.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 2.11


마지막으로 데몬종료 시 kill 할 수 도 있지만 아래와 같이 간단히 종료가 가능하다.

$ gradle --stop



신고
Trackback 0 , Comment 0
secret




유클리드 호제법을 이용한  최소공배수(GCD)구하기

유클리드 원론에  기술되어있으며, 서로간의 값을 나눈다 하여 붙여진 호제법, 최소공배수(GCD : Greatest common divisor) 를 구하기 위한 인류 최초의 알고리즘이라 불리운다. 

두 양의 정수 a,b(b>a)에 대하여  b=aq+r,(0≤r<a)라 하면, a,b a,b의 최대공약수는 a,r a,r의 최대공약수와 같다. 즉, gcd(a,b)=gcd(a,r).


소인수 분해를 이용한 방법도 있지만 유클리드 호제법을 이용하면 훨씬 빠르게 구할 수 있다.


소인수 분해를 이용한 최대공약수 구하기

  2 | 1000, 300
  2 |   500, 150
  5 |    250, 75
  5 |      50, 15
            10, 3 
  5^2 x 2^2  = 25 x 4 = 100


유클리드 호제법을 이용한 최대공약수 구하기

1000 = 300 x 10 + 100

300 = 100 x 3

유클리드 호제법 계산량이 더 간결하다는 것을 확인 해 볼 수 있다.
이러한 이유로 다양한 알고리즘에도 활용된다. (RSA 키생성 알고리즘 등)

python을 통해 유클리드 호제법에 대한 구현 예제를 작성하였다.

euclide.py
import sys

def gcd(a, b) :
  print "%d = %d x %d + %d" % (a,b,a/b,a%b)
  if(a % b == 0) :
    print "GCD : %d" % b
    return
  else :
    gcd(b, (a%b))

if len(sys.argv) < 3 :
  print "Usage : python euclide.py \"INT\" \"INT\"";
  sys.exit(-1)
else :
  a = int(sys.argv[1])
  b = int(sys.argv[2])
  if a > b :
    gcd(a,b)
  else :
    gcd(b,a)


참조 URL : https://namu.wiki/w/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C%20%ED%98%B8%EC%A0%9C%EB%B2%95

신고
Trackback 0 , Comment 0
secret