Useful GO coding pattern

프로그래밍 언어 GO 작성 시 유용한 패턴에 대해 공유한다. 1. Broadcasting with observer pattern c.incomingMsgChan 으로 모든 채널의 메세지가 들어올 때, range와 case를 사용하여 선택적으로 listening함으로써 간단하게 observer pattern을 구현할 수 있다. for msg := range c . incomingMsgChan {     select {     case c . memoryMsgChan <- msg :     default:     } } 2. Cleanup with signal Graceful shutdown을 위한 flow control 구현 시 GO의 channel을 이용하면 간단하게 구현할 수 있다. func work() {     exitChan := make( chan int )     go task1(exitChan)     go task2(exitChan)     time . Sleep(5 * time . Second)     close(exitChan) } func task1(exitChan chan int ) {     <- exitChan     log . Printf("task1 exiting") } func task2(exitChan chan int ) {     <- exitChan     log . Printf("task2 exiting") } 3. Superloop considering cleanup 2.를 실제 시스템에 적용할 때 Superlo...

JVM Thread & Memory Monitoring

이미지
JVM 위에서 실행되는 프로세스의 메모리 사용량 Monitoring 에 대해 정리한다. 우선 사용되는 툴에 대한 간략한 정리 JPS - Java Process Status, JVM에서 실행되고있는 프로세스의 목록을 확인할 수 있다. JMAP - JVM에서 실행되고있는 프로세스의 메모리 사용량을 확인할 수 있다. 0. Monitoring 할 프로세스 ID 확인 jps 실행 후 이름을 보고 프로세스 ID를 확인한다. -l 옵션을 사용하면 패키지명까지 볼 수 있다. 이외에도 옵션이 있다. 1. 객체 별 메모리 사용량 확인 jmap -histo [processID] 목록이 길 경우 파이프를 이용하면 유용하다. ex) jmap -histo 999 | head       jmap -histo 999 | tail       jmap -histo 999 | grep 'mypackage'       jmap -histo 999 | grep 'mypackage' | head 2. Heap 사용량 확인 jmap -heap [processID] Max, used, free 등을 space 별로 확인할 수 있다 [2]. * 주의점 JMAP -heap 을 사용할 경우, 프로세스를 실행시킨 사용자와 같은 사용자가 아니면 프로세스에 attach 할 수 없다. 3. Thread dump jstack [processId] jstack을 실행하는 시점의 thread stack trace가 가능하다. 파일로 저장하여 확인하고자 한다면,  shifter를 사용하면 간단하다. jstack [processId] >> thread.dump Reference [1] Spring Boot Memory Performance, https://spring.io/blog/2015/12/10/spring-boot-m...

GUI for Redis : Medis

이미지
Redis를 위한 GUI 오픈소스 프로젝트인 Medis를 소개한다. Medis 없이는 Redis를 모니터링하기위해 redis-cli를 통해 매번 커넥션을 만들고, 데이터의 type에 따라 smembers, hkeys, hget 등 서로 다른 명령어를 사용해야한다. Key가 길 경우 직접 치거나 복사 붙여넣기하는 번거로움도 있다. 이 모든 것을 Medis가 해결해준다. 심플해서 사용하기 편하다. 컴파일된 바이너리는 아래 사이트에서 바로 받을 수 있지만 유료이다. ($4.99) http://getmedis.com 하지만 오픈소스답게 직접 받아 컴파일하면 무료로 사용할 수 있다. 이제 $5를 아끼는 방법을 살펴보자. 매우 간단하다. 설치 순서 1) https://github.com/luin/medis에서 소스코드 받기 2) 소스코드 받은 폴더로 이동 3) npm install (npm이 없다면 brew 등을 통해 설치) 4) npm run build 4) 까지 완료되었다면 "npm run electron"을 통해 medis를 실행시킬 수 있다. Reference http://getmedis.com https://github.com/luin/medis

Cocos2d-x Scene 전환 방법

Cocos2d-x를 이용하여 앱 개발 시 Scene 전환 방법에 대해 정리한다. (v3.16 기준) Scene을 전환하는 방법은 네 가지가 있다. 1. Director::getInstace()->runWithScene(scene);   - 첫 실행 시 AppDelegate로부터 Scene을 시작할 때 쓰인다.   - 즉 오직 첫 번째 Scene에만 허용되는 방법이다. 2. Director::getInstace()->replaceScene(scene);   - 현재 Scene을 새로운 Scene으로 대체한다. 완전히 삭제되어 빠진다. 3. Director::getInstace()->pushScene(scene);   - 현재 실행 중인 Scene을 중지시키고 그 위에 새로운 Scene을 올린다.   - 반드시 실행 중인 Scene에서만 호출되어야 한다. 4. Director::getInstace()->popScene(scene);   - 현재 실행 중인 Scene을 중지시킨 뒤 지우고 이전에 실행됐던 Scene으로 되돌린다.   - 반드시 실행 중인 Scene에 대해서만 호출되어야 한다. Scene을 전환할 때 애니메이션을 적용할 수도 있고 안할 수도 있다. 안한다면 위의 1 ~ 4와 같은 호출 형태가 될 것이고, 한다면 Director::getInstance()->replaceScene(TransitionFade::create(time, MyScene::createScene())); 이러한 형태가 될 것이다. 이 때 time은 애니메이션 시간으로, 몇 초에 걸쳐 전환시킬 것인지 정할 수 있다. 실수(Float)로 설정할 수 있다. ex) 0.5 초 Scene을 전환할 때 적용 가능한 애니메이션은 아래와 같다. - TransitionRotoZoom: 회전하며 줌인되어 등장한다. - TransitionJumpZoom: 점프하며 줌인되어 ...

Telegram sendMessage API 간단 사용

텔레그램(Telegram)의 API를 이용하여 간단히 나에게 메세지를 보내보자. 준비: 텔레그램 가입 먼저 요약하자면, 텔레그램의 Bot을 이용하여 채팅방을 만들고 메세지를 보내는 API에 해당 채팅방을 연결시켜주면 끝이다. 구체적인 예를 통해 정리해보자. 1. Bot 생성: 나의 Bot을 만들기위해 텔레그램의 Bot 관리자(@BotFather)에 접근한다.   1-1. 웹브라우저(Web browser)에서 https://web.telegram.org/#/im?p=@BotFather   1-2. 하단의 Start 버튼 클릭 또는 /start   1-3. /newbot   1-4. Bot 별칭 지정: chat 리스트 등 외부에 보일 이름   1-5. Bot 이름 지정: 반드시 이름이 bot으로 끝나야 한다. ex) hexoul_bot   1-6. Access token 메모: 1-4까지 진행하면 BotFather가 메세지를 보내는데 이것이 Access token이다.             "Use this token to access the HTTP API:" 바로 아래의 긴 문자열을 복사해둔다.   1-7. chat 리스트에서 1-4. 에서 지정한 별칭을 찾아 Start 버튼 클릭 또는 /start 입력 2. 채팅방 정보 얻어오기   2-1. 내 정보 API 호출: "https://api.telegram.org/bot" + Access token + "/getUpdates" 를 웹브라우저에 입력한다.            1-5에서 얻은 Access token이 123ABC 였다면, "https://api.telegram.org/bot123ABC/getUpdates" 가 된다.           만약 "resu...

AWS + Python Django 1 - 프로젝트 생성 및 배포

이미지
이미 AWS에 유용한 튜토리얼과 함께 설명이 잘 되어있지만 길기 때문에, 리마인드용으로 AWS 상에 Django로 서버를 구축하는 과정을 간략한 글로 정리한다. 일반적으로 Windows 환경에서의 개발은 적을 것 같으므로 Linux/Mac 환경 기반으로 쓰고자 한다. 1. Prerequistes   - AWS 계정(17년 현재 기준 가입자는 1년에 한하여 일정 트래픽/용량 등을 초과하지 않는다면 무료로 사용 가능하다. AWS Free tier.)      > 가입 :  https://aws.amazon.com      > Free tier 상세 :  https://aws.amazon.com/ko/free   - Python 2.7(3.x 버전은 AWS에서도 목적에 따른 외부 라이브러리에서도 완전한 지원이 안될 수 있다.)      > 보통 설치돼있으나 없다면 brew 등을 이용하여 설치하자.      > 만약 brew를 사용한다면,        i. brew 설치( https://brew.sh/index_ko.html ) ~$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"        ii. Python 설치 ~$ brew install python or ~$ brew install python3   - pip(패키지 설치용, 이 역시 없다면 brew로 python 설치 후 pip 설치 가능, brew install pip)   - virtualenv(개발을 위한 가상환경 제공, brew install vi...

Digital identities

이미지
전자서명 방식들을 나열하고 비교한다. Methods 1. OAuth2 - RFC 6749   - 2-legged(Resource owner password credentials grant, Client credentials grant: 보안 취약)   - 3-legged(Authorization code grant, Implicit grant)   - Authorization server에서 Access token을 저장하기도 한다.   - API 사용(리소스 서버에 요청) 시 기본적으로 매번 인증 서버에서 재검증받아야 한다.   - Reference:     > https://tools.ietf.org/html/rfc6749 2. JWT(JSON Web Token) - RFC 7519, 7523   - 헤더 및 내용에 서명을 붙여 Secret key로 암호화한 것을 토큰으로 사용   - OAuth에서 매번 Access token을 가지고 재요청하는 과정을 단순화시키기 위해,     access token 이외의 정보들도 JSON으로 표현하여 전달   - 클라이언트 쪽에 토큰 관리를 위임하여 서버의 부하를 줄일 수 있음   - Reference:     > https://tools.ietf.org/html/rfc7519     > https://tools.ietf.org/html/rfc7523 3. Self-sovereign   - Identity data를 개인의 기기에 저장하고 관리   - Claim(주장), Proof(자기증명, 여권 등), Attestation(기관증명) 세 단계로 서명   - Public key와 Private key를 이용한 Non-blockchain distributed ledger  ...