sabzil

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) rabbimqctl add_user sabzil 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.org/pkg/mime/multipart/#Writer.CreateFormField and then click the CreateFormFile heading to see its source code. ... Read more

December 6, 2016

Go코드로 HTML Form 전송

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

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

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

October 14, 2016

vendor 관리

vendoring되어 있는 패키지를 관리해야 할 이유가 무엇인지에 대해서 찾아보다가 좋은 글을 발견했다. https://gocodecloud.com/blog/2016/03/29/go-vendoring-beginner-tutorial/ 이 글을 읽고 이해한 정도만을 요약 vendoring을 왜 하나? Project A에서 사용하는 Pkg X의 리비전 1을 사용하고 있다. 그런데 Project B에서는 Pkg X의 리비전 2를 사용하려 한다. 그런데 $GOPATH 안에는 같은 패키지를 하나만 갖고 있을 수 있다. Pkg X의 리비전을 Project A에 맞추면 Project B가 빌드를 실패하고, Project B에 맞추면 Project A가 빌드에 실패하게 된다. 그래서 패키지들을 vendor 아래에 위치 시킨다. ... Read more

October 13, 2016

GitHub 페이지에 Hugo 올리기

Blogger에서 Hugo( http://gohugo.io )로 갈아타는 과정을 정리해 본다. Hugo 를 설치한다 https://github.com/spf13/hugo/releases 에서 본인의 환경에 맞는걸 찾아서 설치한다. Linux는 deb를 제공하고 있지만, Windows는 exe파일을 제공하고 있어서 환경변수(PATH)를 잡아주던가, 환경변수가 잡혀있는곳에 복사를 해준다. (이름도 hugo.exe로 바꿔주는게 사용하기에 더 편리한것 같다.) MAC은 안 써봐서 잘 모르겠다…;;; github에 저장소를 만든다 github에서 호스팅을 받아서 hugo를 사용하기 위해서는 2개의 저장소를 만들어야 한다. hugo의 컨텐츠를 관리하기 위한 저장소가 필요하다.(ex: https://github.com/sabzil/blog) 그리고 컨텐츠를 보여주기 위한 github의 페이지 저장소(ex: https://github. ... Read more

October 12, 2016

tmux

tmux 시작 $ tmux $ tmux new-session(or new) -s [세션 이름] -n [윈도우 이름] tmux 종료 $ ctrl-d $ exit tmux detach(현재 클라이언트) $ ctrl-b, d tmux attach $ tmux attach -t [세션 이름] window 생성 $ ctrl-b, c window 리스트 $ ctrl-b, w window 이동(현재의 이전(다음, 이전) $ ctrl-b, l(n, p) window 종료 $ ctrl-b, & ... Read more

September 5, 2016

vi 팁

vi
현재 작업중인 파일의 경로와 이름 확인 현재 작업중인 파일의 경로 또는 이름이 궁금할 경우가 있다. ctrl + g 또는 f 80컬럼에 버티컬 라인 vi에서 80컬럼의 버티컬 라인을 생성하려면 다음과 같이 한다. set colorcolumn=80 을 적용하면, 빨간색 라인이 생긴다. 파일 관리 NerdTree를 사용하지 않고 vi에서 파일과 디렉토리를 관리하는 방법 파일 네비게이션 표준모드(ex: i, o, a 같은걸 입력해서 입력모드로 전환되기 전 상태) ... Read more

September 5, 2016

vim-go 기본 템플릿 비활성화

vi
vim-go가 언제부터인가 main.go 를 만들면 템플릿으로 fmt.Println(“vim-go”) 를 찍어주는 코드를 자동으로 생성해 주기 시작했다. 나는 아무것도 나오지 않기를 바랬는데, 이런게 나와서 매번 지우는 작업을 하는게 싫었다. 그래서 설정중에 go_template_autocreate 를 조절했다. let g:go_template_autocreate = 0 와 같이 하면 이제 아무것도 없는 빈 화면이 나온다. 혹시라도 반복적으로 나오는게 좋은데 “vim-go”를 찍는게 아닌 특정한 코드가 필요하다면, “.vim/bundle/vim-go/templates/hello_world.go” 파일을 수정해도 된다. 또는 특정한 템플릿을 지정하고 싶다면, 다음과 같이, let g:go_template_file = “hello_world.go” ... Read more

September 3, 2016

template을 생성할때 왜 이름을 지정할까?

go
Go언어의 Template 엔진을 사용할때, 왜 New()의 파라미터로 이름을 만들어서 넘겨야 하는지가 궁금했었다. Template and Associated templates라는 글을 읽고 어느 정도 이해를 하게 되었다. 다음은 위 글의 내용을 요약한 것이다. template.New() 로 template을 만들때, 이름을 정해서 만든다. 이 때 FuncMap과 템플릿 리스트를 갖는 그룹(그룹의 이 글에서 사용하는 용어로 Associated Templates를 가르킨다)이 생성된다. FuncMap에 대해서는, https://golang.org/pkg/html/template/#FuncMap http://goinbigdata.com/example-of-using-templates-in-golang/ http://technosophos.com/2013/11/23/using-custom-template-functions-in-go.html 를 확인해본다. New()를 했어도 아직 템플릿 리스트에서 관리되는 대상은 아니다. Parse(…)를 하면 템플릿 리스트에 추가가 된다. ... Read more

© sabzil 2016