태그 글 보관함: golang

golang sciter Unhandled sciter event case: 32768 문제해결

golang에서 sciter 예제 어플을 테스트하는데, 뷰단의 스크립트에서 네이티브 코드쪽 펑션을 호출하는 코드가 있으면 실행이 안된다.

에러코드. Unhandled sciter event case: 32768

sciter의 golang 바인딩인 go-sciter 문제였고, 깃허브의 이슈란에서 힌트를 얻어서 해결했다. https://github.com/sciter-sdk/go-sciter/issues/239
해결 방법은 go.mod 파일에서 go-sciter 버전을 최신버전으로 지정하면 된다.

go.mod

gcc 버전 바꿔보고 별쇼를 다 했는데 역시 포럼을 잘 봐야한다… ㅠㅠ

golang gui sciter 리뷰? 사용기

sciter-acrylic-dark
이거에 반함…

go로 윈도우 어플을 좀 만들어보려고 이것저것 찾아보다 sciter 를 좀 만져봤는데 우리나라에선 sciter 관련한 글이 전무해서 혹시 찾는 사람이 있을까 해서 글을 남긴다.

sciter란

윈도우, 맥, 리눅스를 지원하는 GUI 툴이고 특징은 가벼운 라이브러리(sciter.dll 파일 한개 7메가)와 지원하는 언어가 많다는 것. (golang, python, rust, c# 등)
뷰쪽은 HTML, CSS를 쓰고 tiscript라는 독자 자바스크립트 같은 스크립트로 뷰단에서 제어를 한다.

나는 완전 투명이나 반투명 윈도우를 지원해서 써 보려 했는데…

golang 바인딩에 뭔가 문제가 있는듯해서 뷰단(html)에서 golang 네이티브 코드쪽 펑션을 호출하는 기능이 에러가 나서 되지를 않더라. 해결방법이 있는지 알아보고 있는데, 일단 안됨. 이거 아마 환경문제인듯하다.
Update:해결했다. golang sciter Unhandled sciter event case: 32768 문제해결

sciter 에 대해서 여러가지 검색해보고 실제 돌려보고 알아낸 정보를 좀 써 두겠다.
1. 라이센스는 비상용/상용 관계없이 무료인데, 실행에 필요한 sciter.dll 파일을 정적링크=실행 파일 내부에 포함시키기 위해서는 돈을 내야한다. 제일 싼 라이센스가 310달러/첫해, 120달러/매년, 윈도우만 가능.
2. 실행파일 배포시에는 sciter.dll을 같은 폴더에 넣어야 되는듯.
3. tiscript 라는 독자 스크립트를 배워야하는게 좀 걸림. 대신 html/css 를 쓰니까 이부분에 러닝코스트는 없으니 상쇄되려나?
4. html/css 를 뷰에서 사용하지만 GUI에서 html 티는 별로 안난다. 윈도우에서 보기에 촌스럽거나하지 않고, 반투명 윈도우를 사용하는 순간 세련됨이 철철 흘러넘친다. 너무 예쁘다.
5. 개발자가 답변을 너무 잘해준다. 대신 코딩도 해주더라 ㅋ
6. 기본적인 제어는 뷰쪽에서 tiscript로 하는 느낌이고 네이티브 코드쪽은 보조적인 느낌이다. 서로간 메소드 호출이 가능해서 맘대로 할 수 있지만.
7. 컴파일이나 실행 속도도 빠른거 같고, vscode에서 golang 으로 실행도 잘 된다. (이거 안되는 gui 툴도 있어서…)

sciter 홈
https://sciter.com/
golang sciter 예제
https://github.com/sciter-sdk/go-sciter-example

golang 테이블 쿼리시 필요없는 컬럼은 빼고 가져오기

golang 에서 데이터베이스의 테이블 데이터를 가져올 때, Scan을 사용하면서 작성한 쿼리 결과의 컬럼 수 만큼 변수를 지정해서 가져와야 하는데,
필요없는 컬럼(당장 쓸일이 없지만, 혹시 몰라 넣어두는 작성일이나 갱신일 같은 컬럼)의 데이터는 빼고 가져오는 방법이 있어서 여기에 올려둔다.

필요한 컬럼만 쿼리하면 되는데 왜 이런걸 쓰냐…할 수도 있는데,
컬럼 수가 많으면 select * 으로 해버리는게 편하고, 컬럼 이름 일일이 쓰는게 귀찮기도 하니까 그렇다.

바로 테스트할 수 있도록 소스코드를 다 올리지만, Scan 부분과 TrashScanner 만 보면 된다.
 
 
참고글: database/sql の Rows.Scan で不要なカラムデータを読み捨てる – https://qiita.com/wanko/items/2e6b5dd4867adaa24ec6
일본어다.
 
 

Golang Postgresql 접속시 jdbc URI 사용할 때 이스케이프

Golang 에서 Postgresql 접속시 익숙한 JDBC URI 방식으로 접속 정보를 쓰고 싶었는데, 패스워드에 특수문자가 있어서 제대로 접속이 안된다. 패스워드의 특수문자는 이스케이프 해서 사용하는 방법을 설명한다.

Go 에서 Postgresql 접속하기

Go 에서 Postgresql 접속하는 방법을 검색하면 DB 접속 정보를 넣는 방법을 아래처럼 쓰고 있다.

위 코드에서는 호스트, 포트를 지정하지 않는데, 기본값인 localhost, 5432를 사용할 때는 지정하지 않아도 된다. 아래 lib/pq 문서를 보면 기본값이 나와있다.

lib/pq 문서 – https://pkg.go.dev/github.com/lib/pq?tab=doc

하지만, 고 어플리케이션을 항상 DB가 있는 서버에서 돌릴 것도 아니고, 호스트랑 포트만 써도 아래처럼 길어지게 된다.

난 간결한 URI 방식이 좋다. 다행히 lib/pq 문서에 보면 지원한단다. 바꿔서 써보자.

필요한 정보만 모아서 쓰니까 알아보기가 쉽다. 이게 잘 돌아가면 좋은데 말이지.
딱 보면 패스워드 부분의 특수문자가 문제가 되게 생겼다. 실제로 돌려보면 아래처럼 에러가 나고…

해결방법은 문제가 되는 패스워드를 이스케이프 처리하면 된다.

이스케이프 처리

아래 특수문자를 퍼센트 인코딩하면 된다.

wikipedia percent encoding
Wikipedia Percent-encoding – https://en.wikipedia.org/wiki/Percent-encoding

이스케이프한 패스워드는 아래처럼 된다.

이걸로는 접속 안된다. 콤마는 이스케이프 안해도 되더라. 콤마는 그대로 둔 아래 코드로 접속에 성공했다.

결론은 파싱에 방해가 되는 특수문자만 이스케이프 처리해 주면 되는듯하다.
 
 
패스워드에 특수문자 넣기 좋아하는 나 같은 사람들이나 생기는 문제라 이 글이 도움될 사람은 별로 없을 것 같은데, 이렇게 써두지 않으면 나중에 내가 또 같은 함정에 걸리게 되니까 포스팅해 둬야한다. ㅋ

여담

자바에서도 같은 문제가 있나해서 해 봤는데 애초에 유저명과 패스워드는 URI 에 포함하지 않고 따로 입력하게 되어 있어서 이스케이프 처리 없이도 잘 접속 되더라.
golang 에 lib/pq 도 같은 방식으로 만들지…
 
 
접속 테스트에 사용한 golang 에서 postgresql 접속해서 select 하는 소스코드
GOLANG POSTGRES 접속해서 필요없는 컬럼은 빼고 가져오기

윈도우10 git 설치와 vscode 에서 github 리파지토리에 파일 올리기

윈도우10에서 git을 설치하고, vscode에서 작성한 코드를 github 리파지토리에 올리는 방법을 설명해 보겠다. git은 포터블판으로 설치한다.

이전글: 윈도우10 golang vscode 개발환경 구축

git 설치

git 다운로드 – https://git-scm.com/download/win

64비트 윈도우용 git 다운로드

다운로드 해보면 7z 실행파일인다. 실행해서 적당한 폴더를 선택해서 압축을 푼다. 여기선 c:\dev\git 에 압축을 풀겠다.

윈도우의 환경변수에 git 의 실행파일 디렉토리를 PATH 에 추가한다. 유저 환경변수나 시스템 환경변수, 둘 중 아무데나 추가해도 된다.

윈도우10에서 환경변수 화면으로 이동하는 방법
화면 왼쪽 아래에 윈도우 마크에서 마우스 오른쪽 클릭 -> 시스템 클릭 -> 오른쪽에 시스템 정보 클릭 -> 왼쪽에 시스템의 상세설정 -> 화면 아래쪽에 환경변수 버튼 클릭

PATH 항목을 편집해 git/cmd 디렉토리를 추가하자.

vscode git에 파일 올리기

git 실행파일을 환경변수 PATH 에 추가하고 vscode 를 실행해서 왼쪽 소스컨트롤 버튼을 눌러보면 아래 이미지와 같이 표시된다.
vscode 익스플로러에 열려 있는 폴더(go_work)가 git 리파지토리를 가지고 있지 않다는 내용이다. 리파지토리 초기화 버튼을 누르자.

리파지토리 초기화

아래와 같이 변경된 파일이 표시 된다.
플러스(+) 아이콘을 눌러서 변경된 파일을 스테이지에 올리자.

변경된 파일 표시

스테이지에 파일이 올라간 상태.
윗쪽 체크 아이콘을 눌러서 커밋하자.

변경된 파일 스테이지

커밋 메시지를 입력하라는데 적당히 입력하자.

커밋

메시지 입력하고 ENTER 키를 누르면 아래와 같이 에러가 난다.

에러 username

윈도우 커맨드창이든 vscode 에서 연 커맨드창(하단 TERMINAL 탭)이든 아래 내용을 입력해서 user.name과 user.email을 등록하자. github.com 에 등록된 유저명을 사용하는게 좋을 것이다.

vscode git user.name 입력
vscode 터미널에서 입력

다시 커밋해보면 에러가 안나오고 잘 된다.

github 에 올리기

github 에서 리파지토리를 만들자. 여기서 go_test 란 이름으로 만들었다.

github.com go_test 리파지토리

여기서 두가지 옵션이 있는데.
하나는 go_work 아래 go_test 폴더를 통째로 github 에 올리는 방법과, go_test 아래 test.go 파일만 올리는 방법이 있다. 리파지토리 하나에 여러 폴더를 올릴 경우에는 전자가 좋을것이고, 리파지토리 하나에 하나의 폴더(프로젝트)의 내용을 올리고 싶으면 후자가 좋다.

  • c:\dev\go_work 에서 커맨드창을 열어서 아래 명령을 실행한다. go_test 폴더를 github 의 go_test 리파지토리에 등록한다.
  • c:\dev\go_work 에 있는 .git 폴더를 지우고, go_test 폴더로 이동해서 git init 를 실행한 후, 아래 명령을 실행하면, test.go 파일을 go_test 리파지토리에 등록한다.

remote add github repo
test.go 파일만 올리는 후자의 방법으로 실행

커밋 되어 있는 내용을 푸쉬한다. 소스컨트롤에서 … 아이콘을 누르고, Push 를 선택.

vscode push

upstream 어쩌구 팝업이 나오면 일단 OK 를 누르면 된다. upstream 관련은 아래에서 설명.

upstream error

github 리파지토리에서 새로고침하면 test.go 파일이 등록되어 있는걸 확인할 수 있다.

github 리파지토리

no upstream branch

아래 명령을 한번 쳐주면 다음부터는 안나온다.