[Go] fogleman의 Go Graphics 라이브러리

Go는 그 목적이 시스템 및 서버 프로그래밍에 있음으로 그리기(Draw) API는 지원하지 않는다. 그러나 Go 언어에는 이러한 부족한 부분을 채워줄 매우 많은 그래픽 라이브러리 존재하는데, 그 중에 하나가 fogleman이 개발한 Go Graphic 라이브러(https://github.com/fogleman/gg)이다.

아래의 코드는 이 라이브러리를 이용해 필자가 작성한 테스트 코드이다. (사실 이글은 Go 마스터하기 라는 책을 다 보고, 다시 한번 더 볼 요량으로 파일을 정리하던 중에 코드를 이 블로그에 저장하기 위한 목적을 갖는다.)

package main

import "github.com/fogleman/gg"

func main() {
	const S = 256

	dc := gg.NewContext(S, S)

	dc.SetRGB(1, 1, 1)
	dc.Clear()

	if err := dc.LoadFontFace("font.ttf", 36); err != nil {
		panic(err)
	}

	dc.SetRGB(0, 0, 0)

	s := "한글ABC"
	n := 3 // "stroke" size

	for dy := -n; dy <= n; dy++ {
		for dx := -n; dx <= n; dx++ {
			if dx*dx+dy*dy >= n*n {
				// give it rounded corners
				continue
			}
			x := S/2 + float64(dx)
			y := S/2 + float64(dy)
			dc.DrawStringAnchored(s, x, y, 0.5, 0.5)
		}
	}
	dc.SetRGB(1, 1, 0)
	dc.DrawStringAnchored(s, S/2, S/2, 0.5, 0.5)

	dc.SavePNG("out.png")
}

결과는 아래와 같은 out.png 파일을 생성한다는 것이다. 파일로 생성하는 것은 필자의 목적에 맞기 때문인데, 이렇게 생성한 이미지를 네트워크를 타고 클라이언트에 전송되는 것이 목적이다. 또는 캐쉬 되거나…

위의 결과 외에도 이 라이브러리의 개발자가 언급한, 표현 가능한 결과물은 아래와 같으니 참고 바란다.

내용 정리 끝냈으니, 관련 소스 파일은 삭제 .. !

SVN에 새로운 Repository 생성하기

CentOS v7을 기준으로 먼저 해당 OS에 연결하여..

svnadmin create ./documents

생성된 디렉토리로 이동하여, 다시 conf 서브 디렉토리로 이동

vi passwd

아래와 같이 계정과 암호를 입력하고 저장한다.

MyId = PASSWORD

아래처럼 입력하고

vi authz

아래와 같이 계정에 대한 권한을 지정한다.

[/]
MyID = rw

Repository에 대한 환경 설정을 위해서..

vi svnserve.conf

아래처럼 익명 로그인은 막고, 계정에 의한 암호를 입력받아 접근하도록 설정한다.

anon-access = none
auth-access = write
password-db = passwd

[Go] 슬라이스의 정렬(Slice Sort)

나는 중학교 시절, 마이컴이라는 컴퓨터 잡지에서 동일한 기능을 수행하는 코드를 Basic, Pascal, C, Fortran, Cobol이란 프로그래밍 언어를 통해 비교해서 보여주는 글을 본적이 있다. 수십년전의 기억이지만, 나는 그때 그 짧은 소스코드를 보고 느꼈던 설레임을 아직도 기억한다. (노래 가사가 맞구요;) Go라는 언어가 생생했던 그 설레임을 다시 생동감있게 되살려 준다.

Go에서 대표적인 자료 구조로써 배열과 매우 유사하지만, 그 길이를 동적으로 변경할 수 있다는 이점을 갖는 Slice라는 타입이 있다. 이 슬라이스를 통해 여러개의 데이터를 담아둘 수 있고, 담아둔 데이터들을 목적에 맞게 활용하는데.. 담아둔 여러개의 데이터를 어떤 기준에 맞게 정렬을 해야 할 때가 있다. 이때를 위한 예제 코드를 정리해 본다.

package main

import (
    "fmt"
    "sort"
)

type myDataType struct {
    name string
    age  int
}

func main() {
    mySlice := make([]myDataType, 0)
    mySlice = append(mySlice, myDataType{"김형준", 42})
    mySlice = append(mySlice, myDataType{"홍길동", 28})
    mySlice = append(mySlice, myDataType{"임꺽정", 38})

    fmt.Println(mySlice)

    sort.Slice(mySlice, func(i, j int) bool {
        return mySlice[i].age < mySlice[j].age
    })

    fmt.Println(mySlice)
}

결과는 아래와 같다.

C:/Go/bin/go.exe build [D:/__Working__/tstGo]
Success: process exited with code 0.
D:/__Working__/tstGo/tstGo.exe [D:/__Working__/tstGo]
[{김형준 42} {홍길동 28} {임꺽정 38}]
[{홍길동 28} {임꺽정 38} {김형준 42}]
Success: process exited with code 0.

복합 데이터의 묶음 타입인 구조체를 정의하고 구조체를 정의하는 필드값을 기준으로, 여기서는 나이를 의미하는 age를 통해 오름차순으로 정의하기 위해 익명함수를 사용했다. 코드는 짧지만 곰곰히 코드를 되짚어 볼만한 예제이다.

PostgreSQL의 Tablespace와 Database 정보 얻기

PostgreSQL의 콘솔 프로그램인 psql을 통해 Tablespace와 Database 정보를 얻기 위한 명령을 기록해 둡니다.

먼저 데이터베이스의 물리적인 저장 공간을 의미하는 테이블 스페이스의 정보를 얻는 명령은 아래와 같습니다.

\db+

다음은 테이블의 논리적 저장 공간을 의미하는 데이터베이스의 정보를 얻는 명령은 아래와 같습니다.

\l+