반응형

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) 만자로 리눅스 환경입니다.

반응형
반응형

 

cx_Oracle의 설치에 이어 DB 연동, 그리고 tkinter를 이용한 GUI 프로그래밍을 해보겠습니다. 화면 구성은 정말 간단히...레이블에 DB 주소를 입력하고 엔터를 누르면 연결해서 결과를 출력하는 구성입니다.

import cx_Oracle 
import os 
import tkinter 

#GUI 부분 

window=tkinter.Tk() 

#기본 설정 
window.title("GUI Sample") 
window.geometry("640x640+100+100")  #너비X높이+X좌표+Y좌표 
window.resizable(True, True)        #사이즈 변경 가능 

#레이블 
label_ip=tkinter.Label(window, text="예: myid.myweb.com:1526/orcl", width=50, height=2, fg="red", relief="solid") 
label_id=tkinter.Label(window, text="예: erpif", width=20, height=2, fg="red", relief="solid") 
label_pw=tkinter.Label(window, text="예: erp0901", width=20, height=2, fg="red", relief="solid") 



#엔트리 함수 
def set_ip(event): 
    ip_adress=str(eval(entry.get())) 
     
#엔트리 입력창 
entry=tkinter.Entry(window) 
entry.bind("", set_ip) 



#한글지원방법 
os.putenv('NLS_LANG', '.UTF8') 

#연결에 필요한 기본 정보(유저, 비밀번호, 데이터베이스 서버 주소) 
connection = cx_Oracle.connect('login_id','login_pw', ip_adress) 

cursor = connection.cursor() 

cursor.execute(""" 
    select * 
    from TEMP 
    where KORN_NAME='홍길동' 
    """) 

for list in cursor: 
    print(list) 


label_ip.pack() 
label_id.pack() 
label_pw.pack() 

entry.pack(side="top") 

window.mainloop()

 

 

좀 멋도 없었는데, 블러까지 적용하니 참.....한심해보이지만,

그래도 기본적인 내용은 들어있다고 자축하며

이번 예제를 마무리 해봅니다.^^;;;

 

GUI화면에 결과 출력하는 것은 다음기회에...

 

 

반응형
반응형

Python로 Oracle Database에 연결하기 위해서는 cx_oracle 모듈을 설치해야 합니다.

 

설치 방법은 어렵지 않은데 Pycharm과 일반 커맨드창 파이썬에서 실행하는 방법을 나눠 설명하겠습니다.

 

1. 우선 주로 쓰는 Pycharm에서는 File - Settings - Project - Project Interpreter 로 진입합니다. 그리고 cx_Oracle 모듈을 찾아서 설치해 줍니다.

 

cx_Oracle 모듈을 찾아 설치한다.

 

 

 

모듈 설치하고 난 모습

 

2. Command창에 설치해서 사용하는 경우라면,

sudo pip install cx_oracle

로 설치할 수 있습니니다.

 

3. Oracle Client 설치

cx_Oracle을 사용하려면 Oracle Client를 설치해주어야 합니다. Oracle이 설치되어있어도 Library 때문에 필요한 것으로 보입니다. 설치 경로는 여기를 참조하세요.

설치가 다 끝나면 코드 내부에서 해당 라이브러리를 사용하도록 경로를 설정해줍니다. (Path에 추가해주면 된다고 하는데, 잘 안되서 직접 경로를 넣어줬습니다. 이방법이 제일 확실히 되는 것 같습니다.)

cx_Oracle.init_oracle_client(lib_dir=r"D:\8_Programs\Oracle\instantclient_19_9")

 

4. DBconn.py (DB Connection Sample)

import cx_Oracle
import os


#한글지원방법
os.putenv('NLS_LANG', '.UTF8')

# 함수 정의
def connect():
	#라이브러리 연결
    cx_Oracle.init_oracle_client(lib_dir=r"D:\8_Programs\Oracle\instantclient_19_9")
    
    con_ip='localhost:1526/testdb'
    con_id='user'
    con_pw='password'
 
    #연결에 필요한 기본 정보(유저, 비밀번호, 데이터베이스 서버 주소)
    connection = cx_Oracle.connect(con_id,con_pw, con_ip)
    cursor = connection.cursor()
    cursor.execute("""
        select *
        from member
        where name='홍길동'
        """)

    for list in cursor:
        print(list)

    cursor.close()
    connection.close()
    
# 함수 실행    
connect()

 
반응형
반응형

 

 

회사에서는 예전에 만들어둔 Visual Basic 6.0을 어쩌지 못해 계속 사용하고 있습니다. 저는 그 유지보수 담당입니다. 다른 언어로 갈아 엎고는 싶지만,,,  온지 얼마 안돼서..아니, 실력이 아직 한참 모자라서 그냥 유지보수 중입니다.

그러나 마음만은 항상 다른 언어로 포팅하려고 준비하고 있습니다. 배포가 편리한 Java를 유력 후보로 생각하고 있는데요..(C# 안사줌..ㅠㅠ)

그 전에 간단한 프로그램 프로토타입 설계를 위해 tkinter를 손대보기로 했습니다.

 

결론은, 필요한 기능 그때그때 불러다 쓸 기본 위젯 종합 선물세트를 만들었습니다.  필요할 때 골라 쓰려구요. 실행하면 이런 gui프로그램이 나오게 될 것입니다.

 

그리고, 소스는 https://076923.github.io/ 사이트를 참조했음을 알려드리며, 개발자분께 감사드립니다. 자세한 모듈 속성에 대한 설명도 해당 사이트에서 확인할 수 있습니다.


import tkinter

window=tkinter.Tk()

#기본 설정
window.title("GUI Sample")
window.geometry("640x640+100+100")  #너비X높이+X좌표+Y좌표
window.resizable(True, True)        #사이즈 변경 가능

#레이블
label_1=tkinter.Label(window, text="위젯 테스트용입니다.", width=20, height=5, fg="red", relief="solid")
label_2=tkinter.Label(window, text="", width=20, height=3, fg="red", relief="solid")

label_1.pack()
label_2.pack()

#버튼
button = tkinter.Button(window, text="hi", overrelief="solid", width=20)
button.pack()


# 엔트리 함수
def calc(event):
    label.config(text="결과=" + str(eval(entry.get())))

#엔트리 입력창
entry=tkinter.Entry(window)
entry.bind("<Return>", calc)
entry.pack()

#리스트박스
listbox=tkinter.Listbox(window, selectmode='extended', height=0)
listbox.insert(0, "no1")
listbox.insert(1, "no2")
listbox.insert(2, "no3")
listbox.insert(3, "no4")
listbox.insert(4, "no5")
listbox.pack()

#체크박스 함수
def flash():
    button.flash()

#체크박스
CheckVariety_1=tkinter.IntVar()
CheckVariety_2=tkinter.IntVar()

checkbutton1=tkinter.Checkbutton(window,text="O", variable=CheckVariety_1, activebackground="blue")
checkbutton2=tkinter.Checkbutton(window, text="Y", variable=CheckVariety_2)
checkbutton3=tkinter.Checkbutton(window, text="X", variable=CheckVariety_2, command=flash)

checkbutton1.pack()
checkbutton2.pack()
checkbutton3.pack()

#라디오버튼
RadioVariety_1=tkinter.IntVar()

#value값이 같을 경우 함께 선택됨
radio1=tkinter.Radiobutton(window, text="1번", value=3, variable=RadioVariety_1)
radio1.pack()
radio2=tkinter.Radiobutton(window, text="2번", value=3, variable=RadioVariety_1)
radio2.pack()
radio3=tkinter.Radiobutton(window, text="3번", value=9, variable=RadioVariety_1)
radio3.pack()

#메뉴
def close():
    window.quit()
    window.destroy()

menubar=tkinter.Menu(window)

menu_1=tkinter.Menu(menubar, tearoff=0)
menu_1.add_command(label="Sub Menu1-1")
menu_1.add_command(label="Sub Menu1-2")
menu_1.add_separator()
menu_1.add_command(label="종료", command=close)
menubar.add_cascade(label="Menu1", menu=menu_1)

menu_2=tkinter.Menu(menubar, tearoff=0, selectcolor="red")
menu_2.add_radiobutton(label="Sub Menu2-1", state="disable")
menu_2.add_radiobutton(label="Sub Menu2-2")
menu_2.add_radiobutton(label="Sub Menu2-3")
menubar.add_cascade(label="Menu2", menu=menu_2)

menu_3=tkinter.Menu(menubar, tearoff=0)
menu_3.add_checkbutton(label="Sub Menu3-1")
menu_3.add_checkbutton(label="Sub Menu3-2")
menu_3.add_checkbutton(label="Sub Menu3-3")
menubar.add_cascade(label="Menu3", menu=menu_3)


#메뉴 버튼
menubutton=tkinter.Menubutton(window,text="Menu Button", relief="raised", direction="right")
menubutton.pack()

menu=tkinter.Menu(menubutton, tearoff=0)
menu.add_command(label="Sub-1")
menu.add_separator()
menu.add_command(label="Sub-2")
menu.add_command(label="Sub-3")

menubutton["menu"]=menu
window.config(menu=menubar)

#배치(place(), pack(), grid())
b1=tkinter.Button(window, text="top")
b1.pack(side="top")
b2=tkinter.Button(window, text="bottom")
b2.pack(side="bottom")
b3=tkinter.Button(window, text="left")
b3.pack(side="left")
b4=tkinter.Button(window, text="right")
b4.pack(side="right")

bb1=tkinter.Button(window, text="(50, 50)")
bb2=tkinter.Button(window, text="(50, 100)")
bb3=tkinter.Button(window, text="(100, 150)")
bb4=tkinter.Button(window, text="(0, 200)")
bb5=tkinter.Button(window, text="(0, 300)")
bb6=tkinter.Button(window, text="(0, 300)")

bb1.place(x=50, y=50)
bb2.place(x=50, y=100, width=50, height=50)
bb3.place(x=100, y=150, bordermode="inside")
bb4.place(x=0, y=200, relwidth=0.5)
bb5.place(x=0, y=300, relx=0.5)
bb6.place(x=0, y=300, relx=0.5, anchor="s")

"""     grid() 는 pack()과 함께 쓰일 수 없음

bbb1=tkinter.Button(window, text="(0,0)")
bbb1.grid(row=0, column=0)
bbb2=tkinter.Button(window, text="(1,1)", width=20)
bbb2.grid(row=1, column=1, columnspan=3)
bbb3=tkinter.Button(window, text="(1,2)")
bbb3.grid(row=1, column=2)
bbb4=tkinter.Button(window, text="(2,3)")
bbb4.grid(row=2, column=3)
"""

window.mainloop()

 

필요하신 분, 가져다가 적극 활용하시기 바랍니다.

감사합니다.^^

 

 

 

 

 

 

 

 

 

 

반응형
반응형

만자로 리눅스에서 한글 ibus 설정하는 방법을 기록해놓습니다.


1. 설치하는 방법
ibus-hangul만 설치하면 다른 필요한 패키지는 자동으로 설치됩니다.

sudo pacman -S ibus-hangul


2. ibus 설정 방법

먼저 applications 에서 ibus-preferences 에 들어가야 하는데....application list를 살펴봐도 보이지가 않네요. 패키지 관리자에서 ibus를 검색해서 실행하던지...터미널에서 ibus-setup 명령으로 들어갑니다.



입력방식(input-method) 탭에서 '추가' 클릭 후 '... -> 한국어'을 선택하고 삼색의 태극무늬가 있는 hangul을 선택합니다.(ibus-hangle 설치하면 추가됨. 잘 안보이면 리부팅.)

추가한 후 기본설정을 누르면 한/영 전환 키 설정하는 부분이 나오는데..

추가->한영키를 눌러 키를 인식시켜주면 추가됩니다. 인식은 되었는데도 막상 해당 키로 변한이 안되면, Hangul이라고 쳐서 등록해주면 됩니다. (제 개인 노트북 특성상 한영키를 Alt_R로 인식하네요..^^;;)


3. 시스템 설정에서 설정하기

Gnome의 경우 'Region & Language' 에 들어가서 '입력 소스' 부분의 + 키를 눌러 추가를 해 줍니다.
경로는 others (또는 ...) -> 한국어'-> 한국어(hangul)을 추가해줍니다.

이제 한극 ibus가 상단에 추가되어 (한/A)를 변환할 수 있게 됩니다.



~~끝~~

반응형

+ Recent posts