sabzil's memorandum

February 21, 2018

Go언어 프로젝트에서 테스트 코드 작성 경험

주의, 아래의 내용은 학습을 하면서 이해한 정도에서의 정리라서 틀린 내용이 많이 있을 수 있습니다. 이제 테스트 코드 작성을 시도해보기 시작하는 뉴비라서… 잘못된 부분은 지적을 해주시면 감사한 마음으로 배우겠습니다. 테스트 코드는 왜? 현재 프로젝트를 진행 중 코딩을 할 때면 계속해서 의심과 두려움이 들었다. "내가 제대로 작성하고 있는 게 맞나?" "이렇게 작성하면 다른 데에서 문제가 생기는 건 아닌가?" 그리고 이런 걱정들은 다음의 2가지 원인 때문이지 않을까 라고 생각하게 되었다. ... Read more

December 2, 2017

KVM 스터디(with go)

주의, 이 글은 KVM이 뭔지도 제대로 모르면서 학습한 내용을 정리한거라서, 정확하지 않은 내용이 다수 포함되어 있을 수 있습니다. 틀린 내용은 지적해 주시면 수정해서 반영하도록 하겠습니다. 0. 준비물 노트북(우분투 16.04) 1. KVM이 뭔가요? 하이퍼바이저? 위키백과에 나와 있는 정의( https://ko.wikipedia.org/wiki/%ED%95%98%EC%9D%B4%ED%8D%BC%EB%B0%94%EC%9D%B4%EC%A0%80 ) 를 보면 이렇게 나와 있다. "다수의 운영 체제를 동시에 실행하기 위한 논리적 플랫폼" 여기에 우리가 잘 알고 있는 VmWare, VirtualBox와 같은것도 있고, Xen, KVM 같이 좀 낯선 것들도 있다. ... Read more

August 1, 2017

core파일 만들기

go
Go언어에서도 core dump를 떨구는 방법이 있었다. 데이브체니님이 정리해 놓은 무려 2015년도의 글이다. https://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables 환경변수로 GOTRACEBACK 을 crash로 설정만 해주면 된다. 이것도 모르고 Go언어에서는 dump 떨굴수 없다고 말하고 다녔다…​; 근데 위에 처럼 환경변수 설정하고도 core파일이 안생긴다면, 다음 블로그의 글을 참고해 보면 좋을것 같다. http://lapan.tistory.com/68 블로그의 내용처럼 ulimit -a 로 확인 해보니 core file size가 0으로 되어 있다. ulimit -c unlimited 로 해주었다. 이제 panic을 발생시켜 보면 core 파일이 잘 만들어져 있는걸 확인 할 수 있다. ... Read more

July 27, 2017

docker 스터디

docker ce 설치 오래된 버전 제거 $ sudo apt-get remove docker docker-engine docker.io 패키지 인덱스 업데이트 ```Shell $ sudo apt-get update apt가 https를 통해서 저장소를 사용할 수 있도록 패키지를 설치 $ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common docker의 공식 GPG 키를 추가 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - fingerprint를 확인 $ sudo apt-key fingerprint 0EBFCD88 안정화 버전의 저장소를 추가 ... Read more

June 18, 2017

delve를 사용한 Go언어 디버깅

delve설치 설치를 하기위해서는 Go 1.5 이상의 버전이 필요하다. 지금 시점에 Go 1.5를 사용하지 않을테니…​ 다음의 명령으로 설치한다. $ go get github.com/derekparker/delve/cmd/dlv 이제 설치 끝! (Windows랑 MAC은 모르겠다.) delve사용 프로세스 실행 제어, 변수, 스레드/goroutine 상태, CPU 레지스터 상태 등을 확인 할 수 있다. Commands attach: 실행중인 프로세스에 연결해서 디버깅을 한다. $ dlv attach pid [executable] 실행중인 프로세스에 디버그 세션을 연결해서 프로세스를 제어한다. ... Read more

May 25, 2017

build

go
소개 Go언어로 개발을 하다보면 debug모드 release모드 같이 별도의 빌드 환경을 구성하고 싶을때가 있다. 그래서 build 옵션으로 특정한 환경별로 결과를 달리 할 수 있는 방법에 대해서 테스트한 내용을 정리해본다. 빌드 go 파일들을 빌드하기 위해서는 일반적으로 다음과 같이 한다. $ go build Go언어 문서중에 보면 Build Constraints 에 관한 내용이 있다. 이 내용은 build 할 때 조건을 줄 수 있다는 내용이고 방법은 다음과 같이 하면 된다고 한다. ... Read more

April 19, 2017

RabbitMQ 스터디(with go)

Go언어로 RabbitMQ를 어떻게 이용할 수 있는지 스터디하는 내용들을 대충 대충 정리하는 중…​ RabbitMQ라는게 뭐지? AMQP를 구현한 메세지 브로커 여기 저기에 있는 클라이언트들(Producer/Consumer)이 메세지를 서로 주고 받을 수 있도록 해주는 그런거? 설치 RabbitMQ 설치 sudo apt-get install rabbitmq-server 관리 플러그인 설치 sudo rabbitmq-plugins enable rabbitmq_management sudo service rabbitmq-server restart 실행 service rabbitmq-server start 계정 등록(id:sabzil, pw:1234) ... Read more

December 10, 2016

CreateFormFile()을 사용하면 Content-Type이 고정되는 현상

go
mime/multipart를 사용해서 파일을 업로드 하려 할때 파일을 업로드할 필드를 생성하기 위해서 CreateFormFile()을 사용한다. 이를 이용해서 파일을 업로드하면 "Content-Type"이 "application/octet-stream" 으로 고정되어진다. src/mime/multipart/writer.go의 CreateFormFile을 확인해 보면 다음과 같이 고정되어 있는걸 확인 할 수 있다. h.Set("Content-Type", "application/octet-stream") 관련한 이슈가 올라온게 혹시 있지 않을까 해서 찾아보니. 이런 이슈가 있었다. https://github.com/golang/go/issues/16425 bradfitz는 다음과 같이 답변을 하고 있다. Use CreatePart. CreateFormFile is a very thin wrapper around CreatePart. Click https://golang. ... Read more

December 6, 2016

Go코드로 HTML Form 전송

go
HTML, Javascript를 사용해서 Post방식으로 Form을 전송하는 동작을 Go 코드를 작성해 보자. 우선 POST로 전송된 Form을 받아서 처리를 하는 서버쪽을 다음과 같은 구성을 갖는 코드로 만든다. package main import { "net/http" "github.com/gorilla/mux" } func main() { r := mux.Newrouter().StrictSlash(false) r.HandleFunc("/upload", upload).Methods("POST") http.ListenAndServe(":8080", r) } func upload(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { } } 이렇게 "http://localhost:8080/upload" 를 통해서 POST 방식으로 전달되는 요청을 받아서 처리하기 위한 큰틀을 만들었다. ... Read more

November 25, 2016

인코딩된 텍스트 디코딩하기

go
Javascript에서 encodeURIComponent() 함수를 사용해서 전달받은 문자열을 디코딩해서 보기 위해서는 "net/url" 패키지의 QueryUnescape() 함수를 사용할 수 있다. email, err := url.QueryUnescape(user.Email)

© sabzil 2016