반응형

Go언어로 Oracle 연결하기 위한 드라이버가 몇가지가 있는데, 그 중 Setting이 간단하고 실행 가능했던 드라이버가 godror 였습니다. 아래는 참조한 사이트이구요..

https://blogs.oracle.com/developers/how-to-connect-a-go-program-to-oracle-database-using-goracle

How to Connect a Go Program to Oracle Database using godror

Note: This blog post was updated from the original to reflect the new name for the Go Driver for Oracle Database: godror, ormerly known as goracle. Oracle has offered Go programming language RPMs on Oracle Linux yum server, for a while now. In this post, I

blogs.oracle.com

(ps) 아래와 같은 드라이버도 있는데, 

gopkg.in/rana/ora.v4

github.com/mattn/go-oci8

oci8.pc라는 파일을 세팅해야하는데 잘 안되서 중간에 설치하다가 계속 실패했습니다.

 

godror를 기준으로 설명하자면....

 

1. 우선 Oracle Instant Client 를 설치해야 합니다. 이건 다른 드라이버들을 설치한다고 해도 공통적인 사항입니다.

2. godror을 아래 명령어로 설치를 합니다.

go get github.com/godror/godror

3. 아래의 소스를 작성해서 테스트해 봅니다.

package main

import (
	"database/sql"
	"fmt"

	_ "github.com/godror/godror"
)

func main() {

	db, err := sql.Open("godror", "username/password@service_name:port/SID")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer db.Close()

	rows, err := db.Query("select EMP_#1 from TEMP where NAME='홍길동'")
	if err != nil {
		fmt.Println("Error running query")
		fmt.Println(err)
		return
	}
	defer rows.Close()

	var emp string			// DB에서 받을 데이터를 저장할 변수 선언

	for rows.Next() {

		rows.Scan(&emp)		// DB에서 받은 데이터 할당
	}
	fmt.Printf("The date is: %s\n", emp)
}

 

별다른 설정 없이도 설치만으로 DB 접속할 수 있는 환경이 구성됩니다.

이상 Go언어로 Oracle DB에 접속하는 방법 끝.~~

반응형
반응형

 

사내에서 사용할 간단한 GUI프로그램 개발 환경을 구상 중입니다. 배포도 해야해서 VM위에서 돌아가는 Java는 좀 꺼림직하고... 다른 언어로 쓸 수 있는 GUI Toolkit을 찾아보다가 결국 QT/GTK/WxWidgets 로 가야할 것 같은데요. 배포가 어렵다는 C/C++로 가는 것 보다는 요즘 언어인 Go언어로, 그리고 바인딩이 잘 되어있는 GTK로 가보려고 합니다. Go언어 바인딩은 Gotk3가 있습니다. 이번 포스트에서는 Gotk3설치 및 예제 프로그래밍까지 수행해 보겠습니다.

 

우선 사전 준비해야 하는 작업이 좀 있습니다. 생각보다....(이거 하면서 그냥 Swing써야겠다고 생각하는 중....ㅠㅠ)

1. git 설치

2. MinGW-w64설치(MSYS2설치)

3. GTK 및 dependencies 설치

4. MinGW 환경변수 추가

5. Gotk3 설치

6. 예제 실행

 

1. GIT 설치

요기 사이트로 가서 Git을 설치합니다. 요즘은 Git을 알아야 한다는데,, 아직 제가 잘 몰라서,,

나중에 공부해서 올리는 것으로 하고, 우선 설치하겠습니다.

 

 

 

 

 

 

2. MinGW-w64설치(MSYS2설치)

요기 사이트에서 msys2-x86_64-xxxxxxx.exe파일을 다운받아 설치해 줍니다. 이걸 설치하면 리눅스에서 사용하던 터미널이 생깁니다. 그럼 리눅스 명령어로 GTK를 설치할 준비가 됩니다.

 

 

 

 

 

 

설치하고 나면 저런 터미널이 뜹니다.

 

 

 

MinGW(MSYS2)를 실행한 모습

 

 

 

3. Dependencies 설치

방금 설치한 MSYS2 터미널을 찾아 실행해 보겠습니다.

 

 

 

 

 

 

그리고 아래 명령을 차례로 수행해주세요.

  1) pacman --noconfirm --needed -Sy bash pacman pacman-mirrors

  2) pacman --noconfirm -Su

  3) pacman --noconfirm -S mingw-w64-x86_64-gcc mingw64/mingw-w64-x86_64-pkg-config mingw-w64-x86_64-gtk3

 

 

 

 

 

 

마지막 명령에서 에러가 마구 발생을 하네요...ㅠㅠ.

구글링 하다가...터미널 창 새로 열고 실행했더니 잘 되는 듯 합니다. 그러다가 또 에러 반복..이건 뭔지....ㅠㅠ

결국 패키지 별로 나누어 설치하고 나서야 성공합니다.

그리고 추가로

bash -c "sed -i -e 's/-Wl,-luuid/-luuid/g' C:/msys64/mingw64/lib/pkgconfig/gdk-3.0.pc"

를 마지막에 한번 실행해 줘야 나중에 컴파일 할 때 에러가 없습니다. 버그픽스 명령어 같습니다.

 

4. MinGW 환경변수 추가

- C:\msys64\mingw64\bin

- C:\msys64\usr\bin

요 두 폴더를 Path에 추가해줍니다.

 

 

 

 

 

 

5. Gotk3 설치

이제 진짜 Gotk3가 설치되는지 보겠습니다. 이번엔 Git 터미널에서 아래 명령어를 수행합니다.

go get github.com/gotk3/gotk3/gtk

 

 

 

 

 

 

뭔가 에러가 조금 있었지만, Fail은 아닌 것 같습니다.

한번 아래 코드로 실행이 되는지 보겠습니다.

 

6. 예제 실행

아래 소스를 입력하고 Build&Run을 수행합니다.

Golang이 원래 컴파일이 엄청 빠른 언어인데, 최초 컴파일 때는 시간이 많이 걸립니다. 낼 출근이 심히 걱정됩니다...

4시간 자야되네...ㅠㅠ이게 머라고..

package main

import (
	"log"

	"github.com/gotk3/gotk3/gtk"
)

func main() {
	// Initialize GTK without parsing any command line arguments.
	gtk.Init(nil)

	// Create a new toplevel window, set its title, and connect it to the
	// "destroy" signal to exit the GTK main loop when it is destroyed.
	win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
	if err != nil {
		log.Fatal("Unable to create window:", err)
	}
	win.SetTitle("Simple Example")
	win.Connect("destroy", func() {
		gtk.MainQuit()
	})

	// Create a new label widget to show in the window.
	l, err := gtk.LabelNew("Hello, gotk3!")
	if err != nil {
		log.Fatal("Unable to create label:", err)
	}

	// Add the label to the window.
	win.Add(l)

	// Set the default window size.
	win.SetDefaultSize(800, 600)

	// Recursively show all widgets contained in this window.
	win.ShowAll()

	// Begin executing the GTK main loop.  This blocks until
	// gtk.MainQuit() is run.
	gtk.Main()
}

 

 

 

 

 

 

야호~~성공~~!!

이제 자러갑시다..^^;;;;;

 

Glade와 연동하는 건 다음기회에...

반응형
반응형

Go 언어로 간단한 GUI 구현을 위한 라이브러리로 andlabs/ui라는게 있습니다. 나중에 포스팅할 Glade 같은 GUI designer를 사용하여 구현할 정도가 아니라 간단한 GUI수준을 위해서는 괜찮은 방법인 것 같습니다.

 

우선 Linux에서 설치는

go get github.com/andlabs/ui

로 터미널에 입력하여 설치해줍니다.

Windows환경에서는 MinGW를 실행해서 설치해야 합니다.

 

그리고 아래의 예제코드를 입력하고 실행하면...

package main

import (
	"github.com/andlabs/ui"
	_ "github.com/andlabs/ui/winmanifest"
)

func main() {
	err := ui.Main(func() {
		input := ui.NewEntry()
		button := ui.NewButton("Greet")
		greeting := ui.NewLabel("")
		box := ui.NewVerticalBox()
		box.Append(ui.NewLabel("Enter your name:"), false)
		box.Append(input, false)
		box.Append(button, false)
		box.Append(greeting, false)
		window := ui.NewWindow("Hello", 200, 100, false)
		window.SetMargined(true)
		window.SetChild(box)
		button.OnClicked(func(*ui.Button) {
			greeting.SetText("Hello, " + input.Text() + "!")
		})
		window.OnClosing(func(*ui.Window) bool {
			ui.Quit()
			return true
		})
		window.Show()
	})
	if err != nil {
		panic(err)
	}
}

 

 

 

Go 언어를 이용하여 정말 간단한 UI를 한번 구현해 보았습니다.

 

- 끝 - 

반응형

'Programming > Golang' 카테고리의 다른 글

Go언어 oracle 연결  (2) 2020.03.26
Gotk3를 이용한 go언어 GUI 개발 예제  (0) 2020.03.16
Go언어 초간단 async 예제  (0) 2020.03.16
Go언어-파일찾기 프로그램 예제  (0) 2020.03.16
Go언어 - liteIDE설치 및 실행  (2) 2020.03.16
반응형

Go언어의 장점 중 하나로 비동기 함수실행을 매우 쉽게 구현한다는 점입니다.

비동기 프로그래밍을 직접 해본적이 없어서 잘은 모르지만, 아래 예제를 보니 정말 쉬운 것 같습니다.

package main

import (
	"fmt"
	"time"
)

func say(s string) {
	for i := 0; i < 10; i++ {
		fmt.Println(s, "***", i)
	}
}

func main() {
	// 함수를 동기적으로 실행
	say("Sync")

	// 함수를 비동기적으로 실행
	go say("Async1")
	go say("Async2")
	go say("Async3")

	// 3초 대기
	time.Sleep(time.Second * 3)
}

 

결과

C:/Go/bin/go.exe build [D:/5.System_dev/7_GO/async]
Success: process exited with code 0.
D:/5.System_dev/7_GO/async/async.exe  [D:/5.System_dev/7_GO/async]
Sync *** 0
Sync *** 1
Sync *** 2
Sync *** 3
Sync *** 4
Sync *** 5
Sync *** 6
Sync *** 7
Sync *** 8
Sync *** 9
Async2 *** 0
Async1 *** 0
Async1 *** 1
Async1 *** 2
Async1 *** 3
Async1 *** 4
Async1 *** 5
Async1 *** 6
Async1 *** 7
Async1 *** 8
Async1 *** 9
Async2 *** 1
Async2 *** 2
Async2 *** 3
Async2 *** 4
Async2 *** 5
Async2 *** 6
Async2 *** 7
Async2 *** 8
Async2 *** 9
Async3 *** 0
Async3 *** 1
Async3 *** 2
Async3 *** 3
Async3 *** 4
Async3 *** 5
Async3 *** 6
Async3 *** 7
Async3 *** 8
Async3 *** 9
Success: process exited with code 0.

-끝-

반응형
반응형

Go 언어로 작성한 파일찾기 프로그램 예제입니다. 검색하고자 하는 Directory와 파일명을 입력하면 찾는 프로그램입니다. 사용 방법은

filecheck.exe <검색Dir> <대상file>

과 같이 사용하면 되며, 아래 예시와 같이 사용하면 됩니다.

 

 

 

소스코드는 아래와 같습니다.

package main

import (
	"fmt"
	"os"
	"path/filepath"
)

var (
	targetFolder string
	targetFile   string
	searchResult []string
)

func findFile(path string, fileInfo os.FileInfo, err error) error {
	if err != nil {
		fmt.Println(err)
		return nil
	}

	absolute, err := filepath.Abs(path)
	if err != nil {
		fmt.Println(err)
		return nil
	}

	if fileInfo.IsDir() {
		fmt.Println("Searching directory ...", absolute)
		testDir, err := os.Open(absolute)

		if err != nil {
			if os.IsPermission(err) {
				fmt.Println("No permission to scan ...", absolute)
				fmt.Println(err)
			}
		}
		testDir.Close()
		return nil
	} else {
		matched, err := filepath.Match(targetFile, fileInfo.Name())
		//matched, err := filepath.Glob(targetFile)
		if err != nil {
			fmt.Println(err)
		}
		if matched {
			add := "Found : " + absolute
			searchResult = append(searchResult, add)
		}
	}
	return nil
}

func main() {
	if len(os.Args) != 3 {
		fmt.Printf("USAGE : %s <target_directory> <target_file> \n", os.Args[0])
		os.Exit(0)
	}

	targetFolder = os.Args[1]
	targetFile = os.Args[2]

	fmt.Println("Searching for [", targetFolder, "]")

	testFile, err := os.Open(targetFolder)
	if err != nil {
		fmt.Println(err)
		os.Exit(-1)
	}
	defer testFile.Close()

	testFileInfo, _ := testFile.Stat()
	if !testFileInfo.IsDir() {
		fmt.Println(targetFolder, " is not a directory!")
		os.Exit(-1)
	}

	err = filepath.Walk(targetFolder, findFile)

	if err != nil {
		fmt.Println(err)
		os.Exit(-1)
	}

	fmt.Println("\n\nFound ", len(searchResult), " hits!")
	fmt.Println("@@@@@@@@@@@@@@@@@@@@@@")

	for _, v := range searchResult {
		fmt.Println(v)
	}
}

 

- 끝 -

반응형
반응형

취미 IT 하면서 참 여러가지 관심분야가 많다는 생각이 드네요. 깊이는 없고... 이것저것 해보고 싶은 건 많고...

이번엔 요즘? 한창? 떠오르던 Go언어에 대해 포스팅을 해볼까 합니다.

 

구글에서 웹이던 앱이던 빠른 속도의 성능을 위해 개발했다던 언어...결과적으로 컴파일 속도만큼은 빨라진 언어...

개인적으로 웹 뿐만아니라 데스크탑 앱에도 좀 관심이 있다보니, 실행 성능에 좀 더 비중을 두게 되었는데요...,

직접 체험한 건 아니지만 꽤 빠르다고 합니다. C/C++보다는 아니지만 가상머신 위에서 돌아가는 Java나 C# 보다는 빠른 성능을 보인다고 합니다. 물론 인터프리터 언어보다는 당연히 빠르겠죠?

게다가 문법도 단순해서 러닝커브, 작성력 또한 빠르다고 하네요. 파이썬만큼은 아니지만..

 

오늘 할 일은 1. Go 언어를 설치하고, 2. Go언어 전용 IDE인 liteIDE를 설치하고, 3. Hello World를 출력해보겠습니다.

 

1. Go언어 설치

링크로 접속하면 Go언어 홈페이지가 나타납니다. 다운로드 경로가 맨 첫페이지에 있으니, 자신의 환경에 맞는 배포판을 골라서 설치하시면 됩니다. 설치가 완료되면 자동으로 Path에 추가가 됩니다.

 

 

 

2. LiteIDE설치

LiteIDE는 홈페이지는 존재하지만 아직까지 소스포지에서 다운로드를 제공하고 있습니다. 링크 로 접속하면 LiteIDE를 다운받을 수 있습니다. LiteIDE는 설치하는 프로그램이 아니고, 다운받은 파일을 적당한 위치에 압축을 풀어서, 폴더 안 \liteide\bin\liteide.exe 파일을 실행하면 됩니다. 설치도 필요없다니 참 간편하네요.

 

3. Hello World

LiteIDE를 실행하고 새 파일을 눌러준 다음에, 적당한 이름의 Go SourceFile을 눌러줍니다. 이때 주의해야 할 점은, main 함수가 있는 go 파일이 한 폴더에 여러개 존재하면 실행 에러를 발생시킵니다. 따라서 같은 프로젝트에서 사용할 용도가 아니라면 별도의 폴더에서 작성해야 합니다.

 

 

 

아래의 코드를 작성해 줍니다.

// dbconn
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello World!")
}

 

그리고 실행하면..

 

 

아래 Build Output 창에 Hello World!가 잘 나타나는군요.

 


간단히 Go 언어 설치부터 LiteIDE 설치 및 Hello world! 까지 단숨에 알아보았습니다.

 

- 끝 -

반응형
반응형

오늘은 Java GUI에서 테이블 출력을 구현하는 Swing의 JTable클래스를 활용하여, 간단한 예제를 구현하였습니다.

아래 코드를 실행하면 아래와 같은 화면이 나옵니다. 기능은 없고, 단순히 화면만 구성된 소스이니 참고하세요~~

 

 

package com;

import javax.swing.*;
import java.awt.*;

public class wij_com {
    public static void main(String args[]){

        Dimension dim = new Dimension(430, 400);  //단순 2차원값 입력을 위한 클래스

        JFrame frame = new JFrame("wij complex");
        frame.setLocation(0, 0);				  //출력 위치를 화면 좌상단에 위치
        frame.setPreferredSize(dim);              //위 코드에서 지정한 좌표를 프레임 사이즈로 사용
        frame.setLayout(null);                    //레이아웃을 사용하지 않고 절대좌표계 사용

        String header[]={"이름", "영어", "수학", "국어"};
        String contents[][]={
                {"이정현", "50", "60", "70"},
                {"김영호", "70", "80", "75"},
                {"전수용", "80", "65", "95"},
                {"김진희", "80", "65", "95"},
                {"신정섭", "85", "60", "85"},
                {"김승현", "80", "65", "95"},
                {"김영석", "80", "65", "95"},
                {"이정석", "80", "65", "95"},
                {"이승근", "80", "65", "95"},
        };

        JTable table = new JTable(contents, header);
        //table.setLocation(0,0);

        JScrollPane jscp1 = new JScrollPane(table); //이런식으로 생성시에 테이블을 넘겨주어야 정상적으로 볼 수 있다.
                                                    //jscp1.add(table); 과 같이 실행하면, 정상적으로 출력되지 않음.
        jscp1.setLocation(0,0);
        jscp1.setSize(300,160);

        frame.add(jscp1);

        Button jb = new Button("임시입력");
        jb.setLocation(10,230);
        jb.setSize(70,30);
        frame.add(jb);

        Button jb2 = new Button("임시출력");
        jb2.setLocation(80,230);
        jb2.setSize(70,30);
        frame.add(jb2);

        JLabel jl = new JLabel("SQL입력");
        jl.setLocation(10,270);
        jl.setSize(100,30);
        frame.add(jl);

        JTextField tf = new JTextField(10); // 텍스트필드 초기화
        tf.setLocation(10,300);
        tf.setSize(400,30);
        frame.add(tf);

        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //닫기버튼 클릭시 프로그램 종료

    }
}

(ps) 레이아웃/컨테이너를 책으로만 공부해서 아직 정확히 활용을 못하다보니 시행착오가 좀 있었는데, 생각보다 훨씬 힘들게...간신히 구현했네요. 다음엔 구성도 좀 더 Java스럽게 하는걸로...ㅋㅋ

 

-끝-

반응형
반응형

JAVA프로그램을 실행하기 위해서는 jar파일이 있어야 하는데요,

저는 주로 인텔리제이를 사용하는 관계로, 인텔리제이에서 jar 실행파일 만들기를 수행해보겠습니다.

 

우선 File - Project Structure 메뉴로 들어가서 Artifacts - JAR - From modules with dependencies... 를 클릭합니다.

 

 

 

 

그리고 메뉴가 팝업되면, Main Class에 현재 프로젝트의 메인 클래스를 선택해줍니다. (탐색 버튼으로 고르기)

 

 

 

 

잘 추가되면 아래와 같이,,,

 

 

정상 추가된 모습. OK를 눌러줍니다.

 

 

이제 준비가 되었습니다. 빌드하러 갑니다.

 

Build 메뉴로 가보시면 Build Artifacts...라는 서브 메뉴가 보입니다. 이걸 클릭해야 실행파일이 만들어집니다.

 

 

 

 

뭐가 한번 더 뜨네요. Action 에서 Build 를 클릭해줍니다.

 

자~ 확인해봅시다. 프로젝트 탐색창에서 out -> artifacts ->.....로 찾아 들어가면 드디어 .jar파일이 존재하는 것을 볼 수 있습니다. 이 경로를 탐색기로 찾아가 보겠습니다.

 

 

 

 

찾아보니 있습니다. 이걸 실행해보니.... 잘 열립니다.

 

 

실행파일 확인 및 프로그램 실행 모습

 

 

리눅스라 그런건지, JDK를 깔아서 그런건지, java path가 지정이 되어있어서인지는 모르겠습니다만, jar파일 만으로도 실행 잘 됩니다.

 

(ps) 만자로 리눅스 환경입니다.

반응형

+ Recent posts