2019년 6월 26일 수요일

C#으로 단어 학습기 만들기 (엑셀, 일본어)

예전에 제가 일본어 공부 할 때 엑셀에 단어장을 만들고, 암기 테스트를 쉽게 하도록 도와주는 프로그램을 작성했었는데요.

이 프로그램을 블로그에 소스 코드와 함께 배포했었습니다.

(해당 포스트로 이동하기 - 엑셀 데이터를 이용한 단어 연습기 만들기)

그런데 이 학습기는 처음에 제가 학습할 용도로 만들었던 거라 별다른 기능이 없었으며, 다른 환경에서의 호환성도 문제가 있었습니다.

해당 포스트를 봐주시고 연습기를 이용해주신 독자분들의 피드백을 통해 프로그램의 수정이 필요하다 생각되어 이번 포스트를 작성하게 되었습니다.

전편의 단어 학습기는 엑셀 파일에 저장된 단어를 읽어와서 랜덤으로 제출하는 기능만 있었는데요.

(엑셀 파일에 있는 단어들을)

(랜덤하게 제출되는 단어를 보고 암기 학습)

랜덤으로 표시되는 단어의 뜻과 읽는법을 맞추고 다음 단어로 넘어가는 방식이었으며, 학습한 단어의 갯수나 정답률을 표시하는 기능이 있었습니다.

여기에


한자가 나오는 부분의 글자 크기를 조절하는 기능과 표시될 단어의 기준을 선택할 수 있는 기능

틀린 단어만을 모아 오답 노트 처럼 심화 과정을 진행 할 수 있는 기능

단어 출제 범위를 설정 할 수 있는 기능과 창 크기에 따른 비율 변경 기능들이 보강된 새로운 단어 연습기를 만들어 보겠습니다. ^^

그리고 기존의 실행 파일만 제공하는 방식에서 프로그램 설치 후 안정적인 환경에서 실행하는 방식으로 프로그램 배포 또한 다르게 하도록 하겠습니다.

코딩하기전 프로그램의 흐름을 간략히 나타내면
1. 사용자에게 단어장 위치 정보를 획득하고
2. 해당 위치의 단어장을 찾아 검사 후
3. 단어장의 데이터를 내부 메모리에 정리하고
4. 해당 메모리로 사용자에게 원하는 옵션에 맞춰 데이터 제공

크게 4단계의 로직이 있으며 프로그램 예상 레이아웃은

이전 단어장과 기본 골격은 동일하지만

단어 제출 기준을 정할 라디오버튼, 글자 크기와 범위를 입력받을 텍스트 박스가 상단에 들어가고, 오답 데이터 수집 여부를 확인할 토글 버튼과 학습기 상태를 바꿀 토글 버튼이 추가 됩니다.

그리고 글자 크기에 따라 한자 뿐만 아니라 순서와 뜻 부분까지 함께 적용되도록 하겠습니다.

마지막으로 단어학습기의 크기를 변경시킬 경우 순서, 한자, 뜻을 표시하는 이 세개의 텍스트 박스의 크기와 글자 크기만 변경되도록 할 계획입니다.

프로그램 작성하다보니 길이가 조금 길어져서 코드 공개와 설명을 합치면 너무 길어질꺼 같아 이번편에서는 대략적인 제작 과정만 올리고 코드 관련 내용은 이후 포스트로 올리겠습니다. ^^

(새 버전 단어연습기랑 단어장 다운로드 - 다운로드)

일단 단어연습기 프로그렘을 작성할 프로젝트를 생성하고


(프로젝트는 윈도우 호환을 위해 닷넷 버전을 4.5.2로 하였습니다.)

기왕 만드는김에 이번엔 다른 디자인을 적용해 볼까요?


도구 - 너겟 패키지 관리 - 솔루션용 너겟 패키지 관리로 들어가서


윈도우8부터 큰 호평을 받았던 메트로 타일 스타일을 제공하는 MetroModernUI를 받았습니다.


단어연습기를 작성할 프로젝트에 적용 동의를 하면


갓 비주얼 스튜디오께서 환경을 알아서 잡아주십니다.


참조에 메트로 UI 테마 관련 dll들이 세팅되어 있습니다.

수동으로 설정할 경우 위 dll들을 다운받아 참조 설정과 도구 세팅만 해주시면 바로 사용이 가능합니다.


저번 단어연습기는 윈도우 7에서 안되는 경우가 있었지만 이번엔 XP까지 호환 되도록 4.5.2로 세팅하였습니다. ^^


이제 본격적으로 코딩 시작이네요.


우선 메트로프레임워크 참조를 달고


윈폼을 메트로폼으로 바꿔주면


짜잔~


메트로폼은 스타일 속성에 타일 색상을 바꿀 수 있습니다.

이쁜 색상을 선택해서 실행해보면


기본 윈폼보단 훨씬 이쁘죠? ^^


(메트로UI용 도구들도 많습니다)

일단 기능 구현에 앞서 구도부터 잡아 볼까요?


이번 프로그램은 창 크기 조절이 많을 예정이라 컨트롤 위치와 크기 조절에 신경을 써야 하는데요. 저는 기능별로 층을 나눠 배치를 할 생각입니다.


위에서부터 각각의 판넬들은 대략 이런 컨트롤들이 들어갈 예정이죠.

그 중 단어 출력 부분을 담당할 판넬만 세로로 크기가 변경 가능하도록 설정 하였습니다.

이제 구도를 잡았으니 메트로UI를 활용해 컨트롤도 배치하면


짜잔~

확실히 기본 컨트롤들 보단 훨씬 이쁘네요. ^^

컨트롤들도 판넬과 마찬가지로 창 크기 변경에 따라 포지션이 달라지니 정렬 기준을 잘 잡아야 합니다.

정렬 기준을 잘 잡으면


이렇게 창 크기가 변경되도 비율에 맞게 컨트롤들이 잘 붙어 있게 되죠 ㅎㅎ


이제 단어연습기의 가장 핵심이 될 단어를 보여줄 레이블들의 위치를 잘 조절하고


테두리를 만든 다음


창 크기 변경 이벤트에 컨트롤들의 크기를 조절 해줄 로직과, 레이블의 글자 크기를 자동으로 맞출 로직을 작성하면


이제 창 크기 변경에 따라 버튼 크기와 단어 표시를 해주는 레이블, 글자 크기가 자동으로 바뀌며 맞춰집니다. ^ㅡ^

디자인을 완료하면



컨트롤들의 이벤트들을 하나씩 만들어 가고


단어장인 엑셀 파일을 읽기 위해 관련 dll을


참조하여


코드를 작성했는데...

작동은 잘 되었지만 테스트 과정에서


엑셀이나 오피스가 설치되지 않는 환경에서는 작동중 에러가 발생하더라구요... ㅠㅠ

그래서 엑셀을 로딩하는 부분을 위해


EPPlus를 설치하였습니다.


저도 이번에 처음 사용해봤는데 실행 환경에 오피스 설치 여부에 영향 받지 않고, 참조를 억지로 로딩할 필요도, xml을 이용한 별도의 로딩 과정도 필요없는 정말 좋은 패키지더라구요. ^^

코드 작성을 마친 뒤 배포를 위해


인스톨러 프로젝트를 만들었고


빌드 후 설치 파일도 완성!


설치 파일과 단어장, 설명서 모아 압축된 파일은 여기서 다운 받을 수 있습니다.

(새 버전 단어학습기, 단어장 다운로드 링크 = 다운로드)

제가 만든거라서 제 구글 드라이브 링크이며 다른 광고나 바이러스는 없습니다. ^^

파일을 받으셨으면 압축을 푸시고 설치 파일인 KanaApp1.msi을 실행하시면


요렇게 설치 마법사가 뜹니다.


설치를 원하시는 위치와 권한을 선택하고 다음으로 넘어가면


파일 배치만 하는 수준이라서 설치 시간은 매우 짧을꺼에요 ㅎㅎ

설치가 완료되면 바탕화면에


요렇게 단어연습기 바로가기 아이콘도 생성됩니다.

이걸 실행하면 단어연습기가 실행됩니다.

삭제하고 싶으시면 제어판 - 프로그램 삭제로 들어가서 단어연습기를 선택하시면

요렇게 삭제 마법사가 뜨고


매우 간단히 삭제가 되어집니다.

단어연습기 사용방법은

유튜브에 올린 영상이 있습니다.

00:13 에 아래 텍스트 박스에 마우스 클릭을 한 다음 부터는 키보드로 왼쪽, 오른쪽, 아래 화살표 키를 누르면 각각의 버튼들이 자동으로 실행되도록 하였습니다.

00:20 에서는 오답체크를 체크했는데요 이때부터 모르는 단어들은 따로 저장되어 있다가

00:28 때 오답노트로 변경 하면 오답 체크로 저장되었던 단어들만 제출되도록 하였습니다.

00:37 부터는 다시 일반 모드로 돌아옵니다. 일반 모드에서는 언제든지 오답 체크를 통해 모르는 단어 저장이 가능해집니다.

01:10 부터는 한자 크기 설정 부분을 설명하고 있습니다. 단어들 크기는 기본적으로 창 크기를 따라가지면 이렇게 임의의 크기로 고정할 수도 있도록 하였습니다. ^^

그리고 마지막으로 엑셀이 설치되지 않은 환경에서 실행을 해봤는 결과

엑셀이 설치되지 않거나 윈도우 7 32bit 환경에서도 무사히 실행되는 걸 확인했습니다. ^^

늦었지만 기다리셨거나 의견을 주신 독자분께 정말 감사드립니다.

긴 글 봐주셔서 감사합니다!
Share:

2019년 6월 19일 수요일

OPC란? OPC에 대해 쉽고 간단히 알아보자.

OPC(OLE for Process Control)는 공정을 제어하는 모든 장비들 사이의 통신을 원활히 하기 위해 생긴 국제 산업 표준 통신 규약입니다.

공정이 정밀하고 복잡해질수록 공정을 제어하는 장비들 사이에 데이터를 전송하는 제어 통신의 비중이 증가하는 반면, 통신 프로토콜은 장비 제조사마다 서로 달랐기 때문에 옛날에는 공정에 필요한 모든 장비를 같은 통신 프로토콜을 사용하는 동일 제조사의 제품으로 통일하거나, 메이저 제조사의 프로토콜들을 통합한 비싼 인터페이스 제품을 사용하는 방법으로 통신 문제를 해결했었습니다.


(공정에 필요한 모든 장비들을 같은 통신 프로토콜을 사용하는 동일 제조사의 제품으로 통일해버리기)

이 비싼 통신 인터페이스 프로그램들이 바로 인터치나 싸이먼, 싸이텍과 같은 HMI 프로그램들이죠. ^^

공정 제어 인터페이스 프로그램인 HMI 입장에선 장비 간 통신은 필수사항이었기 때문에 장비 제조사와 제휴를 통해 통신 프로토콜을 수집하는데 집중 투자하여 인터페이스 역량을 늘려 나갔고, 사용자는 공정 관리의 편의성과 통신의 부담을 줄이기 위해 비싸지만 HMI 프로그램을 구입하여 사용했습니다.


(HMI의 대두로 통신에 유연성이 증가 하였고, 공정 제어 기술도 발달)

이렇게 통신 문제를 해결해 왔지만

여전히 사용자는 HMI와 연계되는 메이저 제조사의 제품만 강요 당하거나, HMI가 필요 없는 환경에서도 통신을 위해 비싼 라이센스를 구매해야 한다는 문제점과
소규모나 후발 장비 제조사는 메이저 제조사와 HMI 업체에 의한 통신 진입 장벽의 문제로 인해 HMI가 아닌 범용성 높은 표준 통신 프로토콜의 필요성이 부각되었습니다.

이러한 수요는 결국 1996년 공정 제어 디바이스 간 통신 표준 탄생의 원인이 되었고, 이때 탄생한 통신 규약의 이름이 바로 OPC입니다.

OPC의 등장으로 이제 통신이 필요한 모든 장비들은 OPC 프로토콜만 지원하면 OPC를 지원하는 다른 모든 장비와의 통신이 보장되는 편리함을 가져다주었고, 이러한 변화는 기존의 메이저 제조사와 HMI 업체의 가세 후 더욱 빠르게 성장하여 이젠 전 세계를 지배하는 프로토콜이 되었습니다.


(OPC 안에서 모두가 평등해진 평화로운 세상 ^^)

OPC 프로토콜을 사용하는 통신 과정을 좀 더 자세히 알아보면



제어 장비들을 OPC 통신을 통해 서버와 연결한 다음, 통신이 필요한 장치 내부 태그를 서버에 등록하면 사용자는 원하는 제어나 데이터를 서버에 접속하여 사용하는형태 입니다.

유지와 보수 또한 태그들이 등록된 서버만 관리하면 되니 운영도 매우 간단해집니다. ^^

HMI 환경은


다른 장비와 동일한 OPC 클라이언트 구조로 되어 있지만 OPC 서버를 HMI이 관리하게 함으로 사용자에게 좀 더 편의성을 제공합니다.


OPC 서버는 지금 현재 라이센스 유무를 떠나 매우 다양한 제품군이 있으며 프로토콜의 강력함 만큼 제어 공정 전반에 널리 사용되고 있습니다.


(무수히 많은 Free OPC 서버 리스트 1)

산업 표준인 만큼 이를 활용한 제품이 많아 구글에 간단한 검색만으로도 테스트나 학습용 OPC 서버를 쉽게 구할 수 있습니다. ^^


(무수히 많은 Free OPC 서버 리스트 2)


(Free OPC 서버 리스트 3)

OPC에 대한 간단 설명을 끝으로 이번 편을 마치며 이제 본격적으로 C#을 활용한 OPC 서버와 클라이언트 구성, 관리에 대한 내용으로 돌아오겠습니다. ^^

긴 글 봐주셔서 감사합니다!
Share:

2019년 6월 18일 화요일

Log4J를 활용한 로그 관리 방법 (C#, Visual Studio환경, 텍스트 파일) - Log management method using Log4J In C#

로그는 프로그램 코딩부터 운영까지 반드시 필요한 부분이지만 로그를 분류하고, 별도의 텍스트 파일에 로그를 저장하거나 로그 파일들을 관리하는건 상당히 귀찮은 부분이기도 합니다. ^^;;

이럴 땐 시간을 내서 자신에게 맞는 로그 관리 유틸을 만들어 사용하는게 최고이긴 하지만 아직 이런 도구가 없으시다면 아주 쉽게 적용 가능한 범용적인 로그 관리 유틸리티인 Log4J를 소개합니다.

Log4J는 아파치 소프트웨어 제단에서 발표한 자바 기반의 로깅 유틸리티로서 처음엔 자바 디버깅에 사용되었다가 점점 심플하면서도 체계적인 로그 관리에 매료된 사용자가 늘어감에 따라 다른 프레임워크로 포팅이 되어 이제는 왠만한 메이저 언어에서도 쉽게 사용 할 수 있는 유틸리티로 발전 되었습니다.


(출처 - 위키백과 : https://ko.wikipedia.org/wiki/Log4j)

이번 포스팅 대상은 C#이니 닷넷 프레임워크에 대응하는 Log4net을 사용해 보겠습니다.


1. Visual Studio에서 작업을 할 프로젝트를 생성합니다.

프로젝트는 어떤거든 상관없으나 가장 많이 사용하는 윈폼으로 만들었습니다.


2. Log4net.dll를 직접 참조 시켜서 적용해도 괜찮지만 VS 환경에선 편리하게 너겟을 이용하여 설치도 가능합니다.

도구 - NuGet 패키지 관리자 - 솔루션용 NuGet 패키지 관리에 들어가서


3. Log4로 검색한 뒤, log4net을


4. 적용할 프로젝트에 체크한 뒤 설치를 합니다.


확인을 해주면


요렇게 간단히 Log4net 설치가 완료 되죠.


너겟은 이렇게 환경까지 다 맞춰주니 매우 편리합니다. ^^


5. 이제 로그 관리를 위해 xml 파일 하나를 만들어 줍니다.

프로그램이 읽을 수 있는 아무 위치에다 xml 파일을 하나 생성하는데 파일의 이름은 log4net.xml만 피하시면 됩니다.

저는 파일 이름을 logManager.xml로 했어요.


xml 파일이 생성되면 이렇게 텅 비어 있을껀데요.


6. 여기에 위 그림과 같이 로그 관리를 위한 태그를 추가합니다.

이 태그들은 log4J의 공통적인 명령어들로 이루어져 있는데요.

우선 #3 ~ #12까지는 로그 파일의 종류과 관리에 대한 내용이며
#14 ~ #17은 로그의 단계에 관한 내용입니다.

#3부터 설명을 하면

#03 : 로그 파일은 일정 크기를 넘으면 가장 오래된 내용을 삭제하는 방식으로 관리함
#04 : 로그 파일의 이름은 logTest.txt로 함
#05 : 로그 파일 유지
#06 : 일정 크기를 넘었을때 가장 오래된 내용이 파일이라도 삭제하겠음
#07 : 로그 파일 관리 단위는 파일 크기로 함
#08 : 최대로 백업할 로그 파일의 갯수 = 10개
#09 : 로그 파일 최대 크기 = 1MB
#10 : 로그 패턴
#11 : 로그가 작성될 시간 - 로그내용 NewLine
#15 : 로그 파일에 기록할 로그 범위 = 디버깅 수준까지

로 설명이 되어집니다.

따라서 이 프로젝트의 로그 파일들은 로그 앞에 로그가 생성된 시간도 함께 작성하면서 최대 1MB의 크기로 제한하고 만약 1MB를 넘길시엔 기본 파일은 백업 파일로 변경하고 새 로그 파일에 다시 작성한다.

그리고 백업 파일이 10개가 넘을 경우 가장 오래된 파일을 삭제하고 새 로그 파일을 작성하겠다는 뜻 입니다. ^^

번거롭지 않도록 해당 파일의 다운 링크를 제공할께요 => XML 파일 다운로드 링크



7. 로그 관리 파일을 프로그램이 읽을 수 있도록 복사 옵션도 추가해주면 편합니다. ^^

로그 관리가 다 되었으니 이제 소스로 가볼까요.


8. log4net관련 소스를 참조할 수 있도록 참조를 추가한 뒤


9. 로그를 로드할 위치에 위와 같은 소스 코드를 작성합니다.

저는 윈폼이고 폼 시작과 함께 로그를 로드하고 싶어서 이렇게 했습니다.

#24는 위에서 추가했던 로그 관리 파일을 로그 하기 위함이고
#25는 로그의 로드 위치를 지정하였습니다.

#26 ~ #29까지는 로그가 시작된 시점을 로그 파일에다 작성하고 싶어 만들었습니다.


10. 이제 본격적으로 원하는 곳에 로그를 남깁니다.

log4J의 로그는 총 6단계로 낮은 단계부터

FATAL - ERROR - WARN - INFO - DEBUG - TRACE 로 이루어져 있으며

로그 관리 파일에서 지정한 로그 등급 이상의 로그만 로그 파일에 저장합니다.

저는 로그 등급을 DEBUG로 했으니 TRACE를 제외한 모든 로그들이 파일에다 작성되겠죠 ^^

로그를 작성하는 방법은 ILog.Debug(로그내용); 으로 합니다.

FATAL 등급으로 남기고 싶으면 ILog.Fatal(), ERROR 등급은 ILog.Error() 이런식이죠.

위 소스에서는 프로그램 시작과 종료 이벤트 때 로그를 남기도록 했는데요.


11. 빌드를 하고 프로그램을 실행하면


지금쯤 로그가 작성되었겠죠? ^ㅡㅡ^

프로그램을 종료하고 실행 환경으로 가보면


12. 짜잔~ 따끈따끈한 로그 파일이 생성되었습니다. ㅎㅎ


로그내용도 지정했던 (시간 - 내용) 형식으로 되어 있고, 제가 작성했던 로그들 모두 잘 들어가 있네요.


그리고 자동으로 log4net.xml 파일도 생성되었는데 이 파일에서는


로그 관리 태그의 모든 명령어와 설명이 들어 있습니다.

제가 작성했던 내용도 여기 있는 태그 중 아주 일부만 가져온거죠.

보시면 단순히 텍스트 파일에 로그를 작성하는 기능 외에도 DB 연동을 위한 스키마 내용이나


연동 방법들이 있고

쭉 내려가 보면


제가 사용한 부분도 찾을 수 있습니다.

로그 작성은 해봤으니 이제 마지막으로 로그 파일의 백업이 어떻게 되는지 확인해 볼까요?


13. 일단 로그 파일의 용량을 늘려야 하니 타이머 하나를 생성해서


타이머 이벤트에


연속된 정수를 계속 찍도록 해봤습니다.


그리고 실행하면


이쁘게 작성되고 있네요 ^^.


요즘 재미붙인 움짤로 로그 쌓이는걸 만들어 봤습니다. ㅎㅎㅎㅎ

이렇게 로그가 쌓여서 제가 지정했던 용량 1MB를 넘어가면


14. 짜잔~ txt.1이란 확장자로 저장이 되었네요.


메모장으로 열어보니


시작과


끝 모두 이쁘게 잘 저장되어 있으며


새로운 로그 파일도 이어서 잘 저장된 모습을 확인 할 수 있습니다. ^^

이로써 C#에서 Log4J를 활용한 로그 유틸리티 적용 방법에 대한 설명을 마치겠습니다.

한 분이라도 도움이 되었으면 좋겠네요.

마지막으로 포스팅의 예제가 되었던 프로젝트도 공유할께요.

귀찮으시면 프로젝트를 그대로 사용하셔도 될꺼 같습니다.

샘플 프로젝트 다운로드 링크 = 다운로드

읽어 주셔서 감사합니다!
Share: