Posts
요즘 Rust를 추천 하는 글들이 많이 올라오니 Go에 대해서도 추천하는 글을 써봅니다.
TLDR python 에서 행복했던 분들은 Go를 C++/Java 에서 행복했던 분들은 Rust를 고민해 보는 것도 좋을 것으로 생각합니다.
go에 대한 해외의 평가는 C++을 잡으려고 go를 만들었더니 python을 잡고 있다. 라고 하더군요. ^^ C++ 프로그래머는 go로 전향하는 경우가 적은데 python 프로그래머는 go로 전향하는 비율이 꽤 높답니다.
구글+ 에 올린 http://kasw.blogspot.kr/2015/02/goguelike.html “python에서 죽어라 고생해도 달성할수 없던 것을 너무 간단히 달성해서 허탈할뿐.. " 이란 멘트에 달린 Go가 좋은 가요? 란 (의미의) 질문에 아무생각없이 “추천할만 합니다.
Posts
go 프로그램에서 실시간 통계를 기록하고 싶을때
goguelike의 webinfo 페이지를 보면
Stat total:4660/ 3.0/s lap:1/ 39.4/s
같은식의 실시간 통계를 볼수 있습니다. 이런식으로 어떤 행동의 총 횟수, 초당 일어난 시간(즉 평균) , 최근 횟수, 마지막 초당 횟수 등을 조사 기록하려면 꽤나 귀찮은 프로그래밍이 필요합니다.
그래서 제가 만들어 쓰는 것는 actionstat 패키지입니다.
사용 예는 https://github.com/kasworld/netspeed 의 서버 코드를 보면 됩니다만.. 간단히 적어보면
// init obj stat := actionstat.NewActionStat()
// see stat
log.Info("%v", stat)
stat.UpdateLap()
// update info stat.Inc()
같은 형태가 됩니다.
Posts
go 언어용 python-like log 모듈
goguelike 작업을 하면서 만들어진 모듈들 중 범용성이 높은 모듈들을 정리해서 공개하는 작업을 시작합니다.
이미 기존의 글들을 통해 소개된 모듈들은 id 생성 :http://kasw.blogspot.kr/2015/01/go-serial-id.html rand : http://kasw.blogspot.kr/2015/02/go.html runstep : http://kasw.blogspot.kr/2015/02/goroutine.html
이 있습니다. - 각각의 글을 수정해서 github 링크를 추가해 두었습니다.
이번에 소개할 모듈은 pyhon log처럼 사용하는 log package입니다. log 용으로 만든 것으로 rand 때와 같이 기존 go 언어의 표준 라이브러리를 확장하는 개념으로 만든것 입니다.
만든 이유는 아무래도 python을 쓴 기간이 길다보니 python 스타일의 로그 함수가 익숙한 관계로 최대한 비슷한 느낌으로 사용할수 있게 만들어 사용 중입니다.
Posts
goguelike의 네트웍 속도
일단 python에서 네트웍 속도로 이것 저것 해본 글들 http://kasw.blogspot.kr/search/label/wxgame
goguelike를 튜닝하던 중에 네트웍 패킷 처리량이 얼마나 되나 하고 테스트 해보니 20000 packet/sec 정도 밖에 안나와서 충격을 먹고 네트웍 부분을 집중적으로 검사및 튜닝을 한 이야기..
결론만 말하면 go 언어의 능력이면 1000 클라이언트 ( 10000클라이언트 에서도 속도 저하는 10% 이하) 에서 150000 패킷 / 초 정도를 처리 할 수 있습니다.
파이썬에선 정말로 최후까지 쥐어 짜야 60000넘기는 것도 힘들었던것에 비하면 깨끗한 구조를 유지하면서도 2.
Posts
go 언어에서 여러개의 goroutine을 동시에 한단계씩 실행하기
2015-02-24 추가 구글+ Jae-min Park 님께서 제가 잘못알고 있던부분을 알려주셨습니다. sync 의 waitgroup은 goroutine의 종료를 wait하는 것이 아니고 Done을 wait하는 것이므로 충분히 아래의 코드를 대치하는 것이 가능한 듯합니다. ( 결국 아래 코드는 뻘짓인 셈입니다. ^^;; )
Jae-min Park, Jongmin Kim 께 감사드립니다.
RunStep 과 sync.groupwait의 차이는 실행/완료시 인자를 전달 할수 있느냐 + 각각 step을 제어 할것이냐 아니면 group으로 제어 할것이냐 의 차이가 있어 용도에 맞게 쓰면 될것 같기도 합니다.
이하 원문입니다.
Posts
go 언어에서 profiling 하기
python도 그렇지만 go언어도 기본적으로 profiler를 제공합니다만, 정작 쓰려면 약간 귀찮은 관계로 제가 만들어 두고 거의 cut/paste 해서 사용하는 방법입니다.
아래 코드는 간단한 프로그램을 짤때 복사해 쓰는 파일의 내용입니다. 뭔가 파일 하나 짜리 프로그램을 짜서 테스트 할때 사용하곤 합니다.
이 자체로도 실행가능한 형태이며 그냥 실행하면 프로파일링이 실행되진 않고 더 아래에 있는 쉘 스크립트를 사용하거나 인자로 -pfilename을 주면 됩니다.
실행이 끝나면 자동으로 프로파일러가 실행되어 command를 기다리는 형태가 됩니다.
간단하게 프로파일 결과를 보고 싶으면 top30 같은 형태로 top + 수자 ( 빈칸 없이) 를 실행하면 됩니다.
Posts
go 언어에서 동시에 실행되는 goroutine의 수를 제어 하기.
goguelike용 loadtester를 만들면서 사용하는 방법입니다.
loadtester는 일정시간동안 서버에 클라이언트로 접속해서 부하를 주는 프로그램으로 부하를 주는 시간과 동시에 몇개의 connection을 사용할것인지를 인자로 받습니다. 서버 입장에서는 하나 하나가 실제 user처럼 보이게 되는 것이 중요하고, 따라서 loadtester는 UI가 없는 dummy client와 client side AI를 사용하게 됩니다. 그리고 또 중요한 것이 부하를 거는 시간 내내 접속을 유지 하는 것이 아니라 각 dummy client를 무작위 시간동안 작동한후 connection을 종료 합니다. 그러면 loadtester는 이를 감지한후 새 dummy client를 실행 접속해야 합니다.
Posts
go 언어에서 function object 사용하기. 반복루프 위임 패턴? (delegate loop)
이것 역시 대단한 팁이라긴 뭐합니다만 “작업하다 보니 이런 형태의 코드를 많이 짜고 있더라” 입니다. 주로 나오는 형태는 array/slice 들의 내용에서 조건에 맞는 뭔가를 찾아야 하는 경우에 쓰게 되더군요.
그중에 제일 짧은 코드를 예로 보면
//start
var Dir2Info = []struct {
Name string
Vt [2]int
Len float64
}{
Dir_stop: {".", [2]int{0, 0}, 0.0},
Dir_n: {"N", [2]int{0, -1}, 1.0},
Dir_ne: {"NE", [2]int{1, -1}, 1.4},
Dir_e: {"E", [2]int{1, 0}, 1.0},
Dir_se: {"SE", [2]int{1, 1}, 1.
Posts
go 언어를 사용하면서 표준 라이브러리를 확장하고 싶을때.
너무 간단해서 적기도 뭐한 팁이지만
가끔씩 표준 라이브러리가 제공하는 struct( class 가 아니지요 ^^) 를 확장해서 내가 필요한 함수들을 추가 하고 싶을때가 있습니다.
goguelike 에선 표준 분포에 따른 랜덤 함수를 상당히 많이 사용하는데 표준 라이브러리는 기초적인 함수만을 제공하여 더 쓰기 편한 형태의 함수를 추가해서 사용하고 있습니다.
기본적으로는 go 언어의 embedded field를 사용하는 것이고 이것을 통해서 embedded된 struct가 제공하는 함수들이외에도 원하는 함수를 추가해 사용할수 있습니다.
//start
package rand
import (
r "math/rand"
"time"
)
type Rand struct {
*r.
Posts
go언어를 사용하면서 주의 할 부분
1. struct embedding 한 경우 embeded struct에 exported filed 가 없으면 embeding한 struct를 gob encode를 할수 없다. ( type xxx has no exported fields 에러가남 ) 간단한 해결책은 dummy exported field를 추가 하는 것이다. ( 좀 보기 싫긴 하지만 )
type AAA BBB 형태로 정의한 경우 AAA 형 변수와 BBB 형 변수는 대입조차 안되지만 ( 에러가 남 ) 함수 인자로는 사용할수 있다. 즉 AAA를 받는 함수에 BBB 형 변수를 인자로 사용 할수 있다.