Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf ·...

33
SYS - SOLAR - 007, 2010 1 ¤(! ¥X tManual for SoCID Developers YP L0ıYü [email protected] ABSTRACT l t@ üQ 1¥ D\ i tXL· ü X tt. SoCID /\t X /\X lp@ 0¥ !tt $Xp, üX x ˜ `iD (˜ (1 D( 2 D() \ XX $\.1 D( ü DB l, pt0 ¤¨, , Ht æt ü ·'tp,2 D( FCM t/0` ¤¨ , ¤1 $X ¤¨t ü ·'t. 0¥ü /\X U¥ ), $XX X Q ) æt˜ $X. KEYWORDS SoCID, Developer, Manual 1 1.1 SoCID(Solar Cell Instrument Database) /\ SoCID üQ 1¥ ˜ pt0| ¤ü<\ X0 X ø 0X i pt0 /\t. 2010 D 12 0<\ 2 D( L · <p, /\X P˜ l1 ü. l1. SoCID /\ P˜ Copyright © Graphics Application Lab. Pusan National University

Transcript of Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf ·...

Page 1: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 1

태양광효율측정장치개발자매뉴얼

Manual for SoCID Developers

박선영

부산대학교 컴퓨터공학과

[email protected]

ABSTRACT

본 매뉴얼은 ”염료감응 태양전지 성능평가 실험을 위한 통합 시뮬레이션 소프트웨어 개발” 과제의 개발자 매뉴얼이다. SoCID 시스템에 대해 소개하고 시스템의 구조와 기능적 측면에 대해서 설명하며, 과제의 전반적인 진행 상황을 연차별 (1년차 및 2년차)로 분류하여 설명한다. 1년차에는 실험 결과 DB 구축, 데이터 수집 모듈, 파서, 홈페이지 개발 등이 주요 내용이며, 2년차에는 FCM 클러스터링 모듈 개발, 유효성 검사 및 오류 정정 모듈이 주요 내용이다. 개발예정 기능과 시스템의 확장 방법, 오류의 종류 및 대응 방법 등에 대해서도 설명하였다.

KEYWORDS SoCID, Developer, Manual

1 개요

1.1 SoCID(Solar Cell Instrument Database) 시스템 소개

SoCID는 염료감응 태양전지 성능평가 실험에서 도출되는 데이터를 효과적으로 관리하기 위하여 개

발된 웹 기반의 통합형 데이터 관리 시스템이다. 2010년 12월 말 기준으로 2년차 분량까지 개발되어

있으며, 시스템의 개념도는 그림 1과 같다.

그림 1. SoCID 시스템 개념도

Copyright © Graphics Application Lab. Pusan National University

Page 2: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 2

1.2 시스템 구조

SoCID의 시스템 구조는 수행하는 기능에 따라 크게 세 개의 모듈로 나뉘며, 다음과 같다.

1.2.1 폴링 서버/클라이언트

1. 폴링 클라이언트는 각 실험 장비에 설치되어 폴링 서버로 데이터를 전송

2. 폴링 서버는 클라이언트로부터 전달받은 데이터를 파싱 후 DB에 저장

1.2.2 분석 모듈

1. 데이터에 포함된 오류 탐색 및 수정 후 보고

2. DB에 저장된 데이터를 FCM 등의 방법으로 다인자 분석

1.2.3 SoCID 홈 페이지

1. 사용자 인증 후 실험 데이터 조회

2. 표, 그래프 등으로 데이터 시각화

1.3 시스템 기능

SoCID의 주요 기능 (개발 예정 기능 포함)은 다음과 같다.

1.3.1 SoCID 홈 페이지

1. 사용자 인증 및 관리

2. 실험 결과 데이터베이스 관리

3. 데이터 열람 및 시각화

4. 데이터 보고 및 출력

5. 실험 Class 관리 기능

1.3.2 SoCID 데이터 수집 모듈

1. TCP/IP 기반의 실험 데이터 수집 (서버/클라이언트 모델)

2. 수집된 데이터 자동 파싱 및 데이터베이스화

1.3.3 실험 데이터 분석 및 평가 모듈

1. 유효성 검사 및 오류 정정

2. 실험 데이터의 다중 인자 분석 및 클러스터링

SoCID의 데이터 흐름도는 그림 2와 같다.

Copyright © Graphics Application Lab. Pusan National University

Page 3: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 3

그림 2. SoCID 시스템 데이터 흐름도

구분 필요 환경 버전 적용 범위

OS Windows 계열XP SP2 서버 및

Windows 7 클라이언트

Runtime Environment

Apache 2.2.14 서버

PHP 5.3.0 서버

Adobe Flash Player 9.0 클라이언트

Java Runtime Standard 6.0.230 서버 및

Environment (JRE) Edition(SE) 실험 측정 장비

Development Environment

Eclipse SDK 3.5.2폴링 서버 및

폴링 에이전트

Adobe Flex Builder 3.0SoCID

홈페이지

DB mySQL 5.1.39 서버

표 1. SoCID 시스템 설치 및 사용을 위한 시스템 설정

1.4 설치를 위한 시스템 설정

SoCID 시스템을 완전히 새로 설치하기 위해서는 표 1과 같은 시스템 설정이 필요하다.

2 1년차 결과물

1년차 결과물은 실험 결과 데이터베이스 구축, TCP/IP 기반의 데이터 수집 (Polling) 기능, 자동 파싱

및 데이터베이스화 모듈 개발, 데이터 검색 및 조회를 위한 홈 페이지 (SoCID) 개발 등이다.

Copyright © Graphics Application Lab. Pusan National University

Page 4: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 4

2.1 실험 결과 데이터베이스 구축

DeVAC 대용량 버전은 크게 3개의 모듈로 구성되어 있다.

2.1.1 데이터베이스 관리 체계 (DBMS) 선택

SoCID에서는 mySQL[1]을 데이터베이스 관리체계 (DBMS)로 사용한다. mySQL은 Java를 개발한

Sun Microsystems 사에서 제공하는 DBMS로써, 동사에서 제공하는 Oracle과 더불어 가장 널리 사

용되고 있는 DBMS 중 하나이다. mySQL을 선택한 배경은 다음과 같다.

1. 비용

일반적으로 시판되는 DBMS를 사용하기 위해서는 수십 수백만 원 정도의 라이선스 비용이 발

생하지만 mySQL은 프리웨어로써 라이선스 비용이 없음

2. 설치 및 사용 편의성

mySQL은 설치가 간편하며, 고가의 DBMS에서 제공하는 GUI 기반의 관리 도구를 제공하고

있어 DBMS 접근이 용이

3. 강력한 드라이버 지원

mySQL은 C/C++, Java, PHP 등 대부분의 언어에 호환되는 강력한 드라이버 및 라이브러리를

제공하므로 확장성이 뛰어남

4. 개발 편의성

위에 언급한 장점으로 인해 많은 개발자가 mySQL을 사용하여 DB를 구성하는 경우가 많기 때

문에 개발 시 정보를 얻기 쉬움

2.1.2 실험 결과 데이터 분석

SoCID에서 다루는 데이터는 총 4 개의 실험 장비 (K3000, K3100, K3400, K3600)에 대한 실험 결과

를 의미한다. 모든 장비에서 출력되는 데이터를 처리할 수 있는 데이터베이스를 구축하기 위하여 실험

데이터를 분석한 결과, 실험 데이터는 4 계층으로 이루어져 있다. 이 4계층을 기본으로 하여 각 측정

장치 별로 실험 데이터를 정확히 표현할 수 있는 데이터베이스를 설계하였다. 실험 데이터의 4계층에

대한 설명은 다음과 같다.

1. Class

실험 (측정) 장비 단위를 Class라 한다. 예를 들어 K3000에서 실험한 모든 데이터는 같은 Class

에 속하게 된다. 따라서 Class가 같으면 출력 파일의 포맷이 동일하며, Class가 다르면 출력 파

일의 포맷도 상이하다.

2. Experiment

각 Class의 실험 데이터 중 파일 1 단위를 Experiment라 한다. 예를 들어 K3000 장비에서 출

력된 실험 결과 파일 하나가 Experiment가 되며, K3000 장비에서 5개의 파일이 출력되었다면

Experiment 5단위가 생성된 것이다. 각 Experiment는 환경 변수를 저장하고 있으며, 이를 위한

DB 스키마도 모두 정의되어 있다.

Copyright © Graphics Application Lab. Pusan National University

Page 5: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 5

3. Sheet

각 Experiment에 저장된 독립적인 실험 단위를 Sheet라 한다. 1개의 Experiment(실험 파일)

내에 Sheet가 1개만 존재하는 경우도 있고 여러 개가 존재할 수도 있다. 동일한 Experiment

내에 있는 Sheet는 모두 같은 환경변수를 공유하게 되나 측정 시각의 차이는 있을 수 있다.

4. Spot

실험 데이터 중 1회 측정 결과 (row data)를 의미한다. 예를 들어 K3000에서 실험 환경 변수를

제외한 각 측정 결과 한 줄이 Spot 이 된다. 가장 중요한 데이터이며 각 Class(실험 장비)별로

스키마를 별도로 구성하였다.

2.1.3 DB 스키마 설계

2.1.2절의 데이터 분석 결과를 바탕으로 2010년 12월 현재 K3000, K3100, K3400, K3600의 4가지 데

이터에 대해 SoCID DB 스키마에 대한 설계를 완료하였다. 각 실험 장비별 할당된 테이블 및 설명은

표 2와 같으며, 이를 토대로 맥 사이언스 사에서 제공한 샘플 데이터를 참조하여 각 테이블에 필요한

스키마를 표 3과 같이 정의하였다.

실험 장비 명테이블 명 대응관계 (1:1) 설명

(Class)

k3000mi Experiment Measurement Information

K3000 k3000mr Sheet Measurement Result

k3000md Spot IV Raw Data

k3100mi Experiment Measurement Information

K3100 k3100mc Sheet Measurement Condition

k3100md Spot IPCE Raw Data

k3400miExperiment,

Measurement InformationK3400 Sheet

k3400md Spot Raw Data

k3600mi Experiment Measurement Information

K3600 k3600mr Sheet Measurement Result

k3600md Spot Raw Data

표 2. K3000, K3100, K3400, K3600에 대한 DB 테이블

2.2 1.1. TCP/IP 기반의 데이터 수집 (Polling) 기능

데이터 수집 프로그램 (폴링 서버/에이전트)은 각 실험 장비에서 측정된 실험 데이터 파일 (xls, csv)

을 관리 서버로 복사하는 역할을 수행한다. 실험 장비의 데이터가 저장되는 디렉터리를 지정해 두면,

해당 디렉터리와 서버의 지정 디렉터리를 동기화하여 추가되거나 갱신된 실험 데이터 파일이 있을

경우 자동으로 전송한다. Java 언어로 작성되었으며, GUI 기반의 서버-클라이언트 모델을 사용하고

Copyright © Graphics Application Lab. Pusan National University

Page 6: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 6

테이블 명 속성 명

K3000mi Idx, Date, Area, InPw, Delay, Start, Stop, Step, Comment

k3000mr Idx, Voc, Isc, Jsc, Pmax, Vmax, Imax, FF, Eff, Rshunt, Rseries

k3000rd No, K3000MI Idx, Vol, Curr, CurrDen, Power, Temp

k3100mi Idx, Filename, CellInfo, DeviceID, Date, UserID, GlassID, Lotid, SamplePos

k3100mcIdx, Bias, StartWL, EndWL, StepWL, Avg, AcqDelay, ChopFreq, Jsc,

RangeOfCurr

k3100rd Idx, K3100MI Idx, Ramda, Power, Isc, SRref, SRtar, EQE, Temp

k3400miIdx, Date, Mode, Bias, Amp, Freq, SwpType, NumOfFreq, Repeat,

Lifetime, DiffLen

k3400rd Idx, K3400MI Idx, Freq, Z1, Z2, Time, Ecd, Idc

k3600miIdx, StartTime, Interval1, ChangeAF, Interval2, IVPoints, VST,

SwpDir, Path

k3600mrIdx, K3600MI Idx, Voc, Voc Init, Isc, Isc Init, Jsc, In Power, FF,

Pmax, Vmax, Imax, Eff

k3600rdIdx, K3600MI Idx, K3600MR Idx, SysTime, LifeTime, Volt, Curr,

Temp, Humi

표 3. 각 테이블의 속성 정의 표

있다. 사용을 위해서는 Polling Server 프로그램을 서버에, Polling Agent 프로그램을 각 실험 장비에

설치하여야 한다. 설치는 관리자에게 압축파일을 전달받아 그대로 해제하여 사용하면 되며, JRE SE

6.0 이상이 필요하다. 서버 및 에이전트의 자세한 사용법은 2.2.1절 및 2.2.2절에서 다룬다.

2.2.1 폴링 서버

폴링 서버 프로그램은 서버에서 수행되며 각 실험 장비의 실험 데이터를 수집하는 역할을 한다. 폴링

서버의 인터페이스는 그림 3과 같다.

사용법은 설정된 서버에서 Polling Server 프로그램을 실행한 후, ”Select Download Folder” 버

튼을 눌러 실험 데이터를 다운로드 받을 디렉터리를 선택한 다음 ”Start Server”를 누르면 서버가 에

이전트의 연결을 기다리는 상태가 된다. 모든 로그 메시지는 중앙의 로그 기록 창에 기록되며 동시에

파일로도 저장된다. 주요 기능인 파일 목록 일치 검사 및 수신 모듈의 핵심 코드는 표 4와 같다.

Copyright © Graphics Application Lab. Pusan National University

Page 7: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 7

그림 3. 폴링 서버의 사용자 인터페이스. 다운로드 폴더 설정과 서버 시작 버튼, Log

출력 창 등으로 구성되어 있다.

//1. Creating a server socket

ServerSocket mServerSocket = new ServerSocket(3334);

//File lDestDirectory = new File(cStrDestDirectory);

FileNameFilterClass lFileNameFilterClass = new FileNameFilterClass();

//1.1 Creating Logger

Logger logger = new Logger("Log.txt");

dbw = new DBwriter();

while(true){

//2. Wait for connection

logger.write("Waiting for connection");

Socket lClientSocket = mServerSocket.accept();

logger.write("--------------------------------------------------------");

logger.write("Connection received from "

+ lClientSocket.getInetAddress().getHostName());

//3. get Input and Output streams

DataOutputStream out = new DataOutputStream(lClientSocket.getOutputStream());

DataInputStream in = new DataInputStream(lClientSocket.getInputStream());

logger.write("Connection successful");

// 0. Read Device Name & create Directory

String lDeviceName = in.readUTF();

File lFinalDestDir = new File(cStrDestDirectory+"\\"+lDeviceName);

Copyright © Graphics Application Lab. Pusan National University

Page 8: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 8

// 1. Read File Name

String lFileName = in.readUTF();

long lFileDateLong = in.readLong();

logger.write("DeviceName : " + lDeviceName + " File Name:"

+ lFileName + " Date:" + lFileDateLong);

if(!lFinalDestDir.exists()){

lFinalDestDir.mkdir();

}

if(!lFinalDestDir.isDirectory()){

logger.write("Device Directory Error");

continue;

}

lFileNameFilterClass.mCompareFileName = lFileName;

File[] lFoundedFiles = lFinalDestDir.listFiles(lFileNameFilterClass);

if(lFoundedFiles.length == 0){

logger.write("파일이 존재하지 않음 - Client 파일 새로 생성하여 수신함");

File lNewFile = new File(lFinalDestDir.getPath() + "\\" + lFileName);

lNewFile.createNewFile();

out.writeBoolean(true);

long lNewFileLength = in.readLong();

FileOutputStream lNewFileOutputStream = new FileOutputStream(lNewFile);

byte[] lBuffer = new byte[4096];

int readInt;

while(lNewFileLength > 0){

if(lNewFileLength > 4096)

readInt = in.read(lBuffer);

else

readInt = in.read(lBuffer, 0, (int)lNewFileLength);

lNewFileLength -= readInt;

lNewFileOutputStream.write(lBuffer, 0, (int)readInt);

}

lNewFile.setLastModified(lFileDateLong);

String FilePath = lNewFile.getPath();

Copyright © Graphics Application Lab. Pusan National University

Page 9: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 9

// 2. 저장이 완료된 파일을 파싱하여 DB에 저장

Parse(lDeviceName, FilePath, logger);

lNewFileOutputStream.close();

}else if(lFoundedFiles.length > 0){

if(lFoundedFiles[0].lastModified() < lFileDateLong){

out.writeBoolean(true);

logger.write("갱신된 파일 존재 - Client 파일 수신함");

long lFileLength = in.readLong();

FileOutputStream lFileOutputStream =

new FileOutputStream(lFoundedFiles[0]);

byte[] lBuffer = new byte[4096];

int readInt;

while(lFileLength > 0){

if(lFileLength > 4096)

readInt = in.read(lBuffer);

else

readInt = in.read(lBuffer, 0, (int)lFileLength);

lFileLength -= readInt;

lFileOutputStream.write(lBuffer, 0, (int)readInt);

}

lFoundedFiles[0].setLastModified(lFileDateLong);

// 3. 저장이 완료된 파일을 파싱하여 DB에 저장

Parse(lDeviceName, FilePath, logger);

lFileOutputStream.close();

}else{

out.writeBoolean(false);

logger.write("동일한 파일 존재 - Client 파일 수신 거부함");

}

}else{

out.writeBoolean(false);

logger.write("파일 크기 오류 - Client 파일 수신 거부함");

}

in.close();

out.close();

Copyright © Graphics Application Lab. Pusan National University

Page 10: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 10

if(lClientSocket.isConnected())

lClientSocket.close();

}

표 4. 폴링 서버(Polling Server)의 파일 목록 일치 검사 및 파일 수신 모듈의 소스

코드

2.2.2 폴링 에이전트

파일 목록 일치 검사 및 파일 수신 모듈은 서버가 시작되면 자동으로 수행되는 모듈이며, 수행 절차는

다음과 같다.

1. 에이전트의 연결을 기다리다가 에이전트의 연결 요청이 도착하면 이를 수락

2. 연결이 완료되면 에이전트의 파일 목록 (파일명+최근 갱신 시각)을 전송받음

3. 에이전트의 파일 목록과 서버의 파일 목록을 대조

4. 갱신되었거나 존재하지 않는 파일의 목록을 에이전트에 송신

5. 에이전트가 파일을 보내면 수신하여 설정된 디렉터리에 저장

폴링 에이전트는 각 실험 장비 (K3000, K3100, K3400, K3600)에 설치되어 폴링 서버에 실험데이

터를 전송하는 역할을 한다. 폴링 에이전트의 사용자 인터페이스는 그림 4와 같다.

그림 4. 폴링 에이전트 프로그램의 사용자 인터페이스

각 실험장비마다 파일의 형식이 다르기 때문에 서버에 이를 알려주어야 하는데, 이를 각 장비별로

변경 설정할 수 있도록 하기 위하여 설정 창이 따로 있으며, (’L’=Lock) 버튼을 통해 이 설정 창의

잠금을 해제할 수 있다. 잠금 해제 후 새로운 장비 명을 설정했다면 다시 L 버튼을 눌러서 이를 저

장해야 한다. ”Select Data Folder”를 통해 각 장비의 실험 데이터가 저장되는 디렉터리를 설정할 수

있다. 서버를 새로 설정했을 경우 ”Server IP” 부분을 수정하여 설정할 수 있다. 포트 번호는 ‘3334’로

내부에서 고정되어 있다. 데이터 디렉터리를 설정하였으면 ”Start Agent” 버튼을 통해 폴링 서버와

동기화를 시작한다. 핵심 모듈인 디렉터리 동기화 및 송신 모듈의 소스 코드는 표 6와 같다.

Copyright © Graphics Application Lab. Pusan National University

Page 11: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 11

File lScanDirectory = new File(cStrSrcDirectory);

HashMap<String, Date> lFileHashMap = new HashMap<String, Date>();

System.out.println("클라이언트시작");

try{

while(true){

// 지정 디렉토리에 존재하는 실험 데이터 파일 스캔

File[] lScanFiles = lScanDirectory.listFiles(new FilenameFilter() {

public boolean accept(File dir, String name) {

return name.endsWith(".csv");

}

});

for (File file : lScanFiles){

Date lFileModifiedDate = lFileHashMap.get(file.getName());

if(lFileModifiedDate != null){

if(file.lastModified() > lFileModifiedDate.getTime()){

System.out.println("파일전송시도");

lFileHashMap.put(file.getName(),

new Date(file.lastModified()));

SendFile(file);

}

}

else{

System.out.println("파일전송시도");

lFileHashMap.put(file.getName(),

new Date(file.lastModified()));

SendFile(file);

}

}

Thread.sleep(1000);

}

}

catch (Exception e) {

System.err.println(e.toString());

}

표 5. 폴링 에이전트 프로그램의 디렉터리 스캔 및 파일 송신 모듈의 소스 코드

Copyright © Graphics Application Lab. Pusan National University

Page 12: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 12

디렉토리 스캔 및 파일 송신 모듈은 서버에 연결된 후 수행되며 지정된 디렉토리의 모든 실험 데

이터를 스캔한 후 서버로부터 요청된 파일을 전송한다. 파일 전송 담당 함수 (SendFile)의 소스 코드는

표 6과 같다.

public void SendFile(File pSendFile){

boolean pProcess = true;

while(pProcess){

try{

Socket lClientSocket = new Socket(cServerIPAddress, 3334);

System.out.println("SendFile 1. 서버 접속 성공");

DataInputStream in = new DataInputStream

(lClientSocket.getInputStream());

DataOutputStream out = new DataOutputStream

(lClientSocket.getOutputStream());

if(cDeviceName.isEmpty())

System.out.println("Device Name Error");

out.writeUTF(cDeviceName);

out.writeUTF(pSendFile.getName());

out.writeLong(pSendFile.lastModified());

System.out.println("SendFile 2. 파일 정보 전송 " + pSendFile.getName()

+ ": " + pSendFile.lastModified());

if(in.readBoolean()){

System.out.println("SendFile 3.1. 서버 허가 받음");

FileInputStream fis = new FileInputStream(pSendFile);

out.writeLong(pSendFile.length());

long lFileLength = pSendFile.length();

byte[] buf = new byte[4096];

while(lFileLength > 0){

if(lFileLength > 4096){

fis.read(buf);

out.write(buf);

lFileLength -= 4096;

}else{

fis.read(buf, 0, (int)lFileLength);

out.write(buf, 0, (int)lFileLength);

lFileLength = 0;

Copyright © Graphics Application Lab. Pusan National University

Page 13: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 13

}

}

fis.close();

}else{

System.out.println("SendFile 3.2. 서버 거부 받음");

}

pProcess = false;

in.close();

out.close();

if(lClientSocket.isConnected())

lClientSocket.close();

} catch (Exception e) {

System.err.println(e);

}

}

}

표 6. 폴링 에이전트 프로그램의 파일 전송 함수(SendFile)

SendFile 함수는 각 파일의 정보를 서버에 우선 전송한 후, 서버의 허가가 떨어지면 해당 파일을

전송한다. 전송은 TCP/IP 기반으로 이루어지며 1회 전송 당 버퍼 크기는 4KB(4096Byte) 이다.

2.3 자동 파싱 및 데이터베이스화 모듈 개발

자동 파싱 및 데이터베이스 (DB)화 모듈은 서버에 저장된 데이터 파일을 각 실험 장비 포맷별로 파

싱하여 데이터베이스에 입력하는 모듈이다. 맥 사이언스 사에서 제공한 각 실험 장비별 샘플 데이터

를 분석하여, 입력 데이터의 개수에 상관없이 데이터 파일이 종료될 때까지 파싱하여 해당 데이터를

읽어 들인 후 DB에 저장한다. 현재는 각 측정 장비별 (K3000, K3100, K3400, K3600)로 파서 (Parser)

가 별도 구성되어 있다. K3000, K3400, K3600의 측정 데이터는 Java 기반의 ’CSV Reader’를 이용해

파싱하고, K3100의 측정 데이터는 ’JXL(Java eXcel Library)’을 통해 파싱한다. 이는 K3100의 CSV

데이터가 확보되면 추후 수정 가능한 부분이다. K3000 파서의 소스 코드는 표 7과 같다.

Copyright © Graphics Application Lab. Pusan National University

Page 14: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 14

package K3000;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.FileInputStream;

import java.util.*;

import jxl.*;

import java.sql.SQLException;

import java.sql.Statement;

import java.sql.*;

import Server.ValidCheck;

import au.com.bytecode.opencsv.CSVReader;

public class K3000Parser{

private K3000MI K3000mi;

private K3000MR K3000mr;

private List<K3000RD> K3000rds;

private List<String> Query;

public K3000Parser(String FilePath) throws IOException{

CSVReader K3000Reader = new CSVReader(new InputStreamReader(

new FileInputStream(FilePath),"EUC_KR"));

K3000mi = new K3000MI();

K3000mr = new K3000MR();

K3000rds = new ArrayList<K3000RD>();

K3000RD K3000rd_tmp;// = new K3000RD();

String [] nextLine;

ValidCheck vc = new ValidCheck();

// Parse Raw Data

int i=0;

nextLine = K3000Reader.readNext(); // attribute name

nextLine = K3000Reader.readNext();

while (nextLine[0].compareTo("$$")!=0){

K3000rd_tmp = new K3000RD();

K3000rd_tmp.SetNo (new Double(vc.isNumber(nextLine[0]))

.intValue());

K3000rd_tmp.SetVol(vc.isNumber(nextLine[1]));

K3000rd_tmp.SetCurr (vc.isNumber(nextLine[2]));

K3000rd_tmp.SetCurrDen(vc.isNumber(nextLine[3]));

K3000rd_tmp.SetPower(vc.isNumber(nextLine[4]));

Copyright © Graphics Application Lab. Pusan National University

Page 15: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 15

K3000rd_tmp.SetTemp(vc.isNumber(nextLine[5]));

K3000rds.add(K3000rd_tmp);

nextLine = K3000Reader.readNext();

i++;

}

// Parse Measurement Information

K3000Reader.readNext(); // "$$"

nextLine = K3000Reader.readNext(); // "Test Information"

K3000mi.SetDate(nextLine[0]);

nextLine = K3000Reader.readNext();

K3000mi.SetArea(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mi.SetInPw(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mi.SetDelay(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mi.SetStart(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mi.SetStop(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mi.SetStep(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

// Parse Measurement Result

K3000Reader.readNext();

K3000Reader.readNext(); // empty row

nextLine = K3000Reader.readNext(); // "Test Result"

K3000mr.SetVoc(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mr.SetIsc(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mr.SetJsc(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mr.SetPmax(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mr.SetVmax(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

Copyright © Graphics Application Lab. Pusan National University

Page 16: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 16

nextLine = K3000Reader.readNext();

K3000mr.SetImax(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mr.SetFF(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mr.SetEff(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mr.SetRShunt(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

nextLine = K3000Reader.readNext();

K3000mr.SetRSeries(vc.isNumber(nextLine[0].split(":")[1].split(" ")[1]));

Query = new ArrayList<String>();

Query.add(K3000mi.GetQuery());

Query.add(K3000mr.GetQuery());

for(i = 0; i < K3000rds.size();i++){

Query.add(K3000rds.get(i).GetQuery(i+1));

}

}

public boolean executeQuery(Statement stmt) throws SQLException{

for(int i = 0; i < Query.size(); i++){

stmt.executeUpdate(Query.get(i));

}

return true;

}

}

표 7. K3000 실험 데이터(CSV) 파서의 소스 코드

2.1.3절에서 정의한 스키마를 바탕으로, 맥 사이언스 사에서 제공한 샘플 데이터를 입력한 결과는

그림 5(k3000mi), 그림 6(k3600rd)과 같다.

2.4 데이터 조회 및 검색을 위한 SoCID 홈페이지 개발

SoCID 홈페이지는 데이터베이스에 저장된 실험 데이터의 조회와 검색을 위해 개발되었다. 인증된 사

용자만 접근 가능하며 특정 조건에 맞는 실험 데이터를 검색해서 볼 수 있다. 또한 데이터를 그래프

로 표현 가능하다. 사용자 인증, 게시판 등 홈 페이지의 기본적인 기능들은 Xpress Engine[2](구 제

로보드) 기반으로 구성되어 있으며 데이터 검색 및 조회 페이지는 Flex 기반으로 개발하여 차트 등을

Copyright © Graphics Application Lab. Pusan National University

Page 17: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 17

그림 5. k3000mi 테이블에 저장된 K3000 측정 장비의 샘플 데이터

그림 6. k3600rd 테이블에 저장된 K3600 측정 장비의 샘플 데이터

효과적으로 표현 가능하도록 하였다.

2.4.1 SoCID 홈 페이지의 기본 기능

SoCID 홈 페이지는 기본적으로 Xpress Engine을 기반으로 구성되어 있으며, 이를 사용할 경우 사용

자 인증 - 회원 가입 (그림 7), 로그인 등, 게시판 등의 기능과 홈 페이지 전체 레이아웃이 패키지 혹은

위젯 형태로 제공된다. 이를 Windows 서버에서 활용하기 위해서는 APMsetup(Windows용 Apache,

PHP, MySQL 패키지)가 필요하다. 설치 후에는 관리 모듈이 제공되어 프로그래머가 아니더라도 레

이아웃과 사용자 권한, 게시판 구성 등 대부분의 기능을 원하는 대로 수정할 수 있다.

Copyright © Graphics Application Lab. Pusan National University

Page 18: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 18

그림 7. 회원 가입 창. Xpress Engine의 회원 관리 기능. 패키지에 포함되어 있어 별

도로 개발할 필요가 없다.

2.4.2 SoCID 데이터 조회 및 검색 기능

SoCID의 중요한 기능 중 하나는 데이터 조회 기능이다. 이 기능을 통해 DB에 저장된 실험 데이터를

실시간으로 조회할 수 있다. 조회 화면은 그림 8과 같으며, 각 리스트는 Flex로 구현되어 있다.

그림 8. SoCID의 데이터 조회 창. 좌측 하단 메뉴에서 Class를 선택할 수 있으며, 클

래스를 선택하면 우측 본 화면과 같이 Experiment의 리스트가 출력된다. Experiment

를 선택하면 Spot을 포함한 상세한 정보를 볼 수 있다.

표 8은 K3000의 리스트를 표시하기 위한 Flex 소스 코드이다. Flex 소스 코드는 Javascript와 유

사하나 차이가 있으며 PHP 페이지를 거쳐 DB에 접근한다.

Copyright © Graphics Application Lab. Pusan National University

Page 19: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 19

<?xml version="1.0" encoding="utf-8" ?>

<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" width="800" height="600"

layout="absolute" creationComplete="startApp()" close="this.close()"

showCloseButton="true" verticalScrollPolicy="auto" borderColor="#E2E2E2">

<mx:Style>

global{

fontSize : 12;

}

</mx:Style>

<mx:Script>

<![CDATA[

import mx.rpc.events.FaultEvent;

import mx.rpc.events.ResultEvent;

import mx.controls.Alert;

import mx.utils.ObjectUtil;

import flash.system.System;

import mx.events.ListEvent;

import mx.rpc.http.HTTPService;

import mx.core.IFlexDisplayObject;

import mx.managers.PopUpManager;

private var httpService:HTTPService;

private var DataGridItem:Object;

//xml 데이터를 받을 시 한글 깨짐 방지

System.useCodePage = true;

[Bindable]public var index:String;

private function startApp():void{

Helper();

}

private function close():void{

PopUpManager.removePopUp(this as IFlexDisplayObject);

//PopUpManager에서 팝업창을 제거해준다.

}

Copyright © Graphics Application Lab. Pusan National University

Page 20: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 20

private function Helper():void{

httpService = new HTTPService();

// POST 방식으로 데이터를 전송한다.

httpService.method = URLConfig.method;

// 목록을 초기화한다.

RD.dataProvider = new Array();

httpService.addEventListener

(ResultEvent.RESULT, resultHandler);

httpService.addEventListener(FaultEvent.FAULT,

faultHandler);

httpService.url = URLConfig.K3000Report;

httpService.request.idx = index;

//Alert.show(httpService.request.idx);

httpService.send();

}

private function resultHandler(event:ResultEvent):void{

MI1.dataProvider = event.result.root.K3000MI1.entries;

MI2.dataProvider = event.result.root.K3000MI2.entries;

MR.dataProvider = event.result.root.K3000MR.entries;

RD.dataProvider = event.result.root.K3000RD.entries;

}

private function faultHandler(event:FaultEvent):void{

Alert.show(event.message.toString(),"핸들러 오류입니다");

}

private function refreshHandler(event:ResultEvent):void{

//Alert.show(event.message.toString(),"새로 고침");

Helper();

}

private function itemClickEvent(event:ListEvent):void

{// DataGrid 컨트롤의 아이템 클릭 이벤트

DataGridItem = new Object();

DataGridItem = event.target.selectedItem;

//Alert.show("클릭");

}

]]>

</mx:Script>

Copyright © Graphics Application Lab. Pusan National University

Page 21: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 21

<mx:Panel layout="vertical" paddingBottom="10" paddingLeft="10"

paddingRight="10" paddingTop="10" width="98%" height="100%"

horizontalAlign="center" fontSize="12" y="0" verticalAlign="top" x="0">

<mx:VBox width="100%" height="100%">

<mx:Label text="I V Report" textAlign="center" verticalCenter="center"

width="100%" fontSize="40" fontFamily="Times New Roman" fontWeight="bold"

alpha="1.0"/>

<mx:Label text="Measurement Information" width="100%" textAlign="center"

fontSize="24" fontFamily="Times New Roman" fontWeight="bold"/>

<mx:HBox width="100%">

<mx:DataGrid id="MI1" width="50%" headerHeight="-1" height="125">

<mx:columns>

<mx:DataGridColumn headerText="Label" dataField="Label"/>

<mx:DataGridColumn headerText="Value" dataField="Value"/>

</mx:columns>

</mx:DataGrid>

<mx:DataGrid id="MI2" width="50%" headerHeight="-1" height="125">

<mx:columns>

<mx:DataGridColumn headerText="Label" dataField="Label"/>

<mx:DataGridColumn headerText="Value" dataField="Value"/> </mx:columns>

</mx:DataGrid>

</mx:HBox>

<mx:Label text="Measurement Result" fontSize="24" width="100%"

fontFamily="Times New Roman" fontWeight="bold" textAlign="center"/>

<mx:DataGrid id="MR" width="100%" height="220"

sortableColumns="false">

<mx:columns>

<mx:DataGridColumn headerText="Items" dataField="Items"/>

<mx:DataGridColumn headerText="Result" dataField="Result"/>

<mx:DataGridColumn headerText="Unit" dataField="Unit"/>

<mx:DataGridColumn headerText="Remark" dataField="Remark"/> </mx:columns>

</mx:DataGrid>

<mx:Label text="IV Raw Data" fontSize="24" fontFamily="Times New Roman"

fontWeight="bold" width="100%" textAlign="center"/>

<mx:DataGrid id="RD" width="100%" height="2425"

itemClick="itemClickEvent(event)"> <mx:columns>

Copyright © Graphics Application Lab. Pusan National University

Page 22: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 22

<mx:DataGridColumn dataField="No" headerText="No" width="45"/>

<mx:DataGridColumn dataField="Vol" headerText="Voltage(V)"/>

<mx:DataGridColumn dataField="Curr" headerText="Current(mA)"/> <mx:DataGridColumn dataField="CurrDen" headerText="Current(mA)"/>

<mx:DataGridColumn dataField="Power" headerText="Current(mA)"/>

<mx:DataGridColumn dataField="Temp" headerText="Current(mA)"/> </mx:columns>

</mx:DataGrid>

</mx:VBox>

</mx:Panel>

</mx:TitleWindow>

표 8. K3000 List 확인 페이지의 Flex 소스 코드. PHP와 연동하여 DB에 접근한다.

그림 8에서 각 Experiment를 선택했을 때 해당 보고서는 그림 9와 같이 그래프와 표를 이용해

표시된다. 그래프는 Flex Chart를 이용하였으며 DB에 저장된 데이터를 불러와서 이를 그래프로 재

구성하는 방식을 취한다.

그림 9. K3100 Measurement Information 의 2번 Experiment를 선택한 모습. 해당

Experiment의 상세 보고서를 출력한다.

또한, 특정 조건에 부합하는 데이터를 찾아서 따로 출력하는 기능도 포함되어 있다. 그림 10과 같

이 각 데이터 별 검색창에 데이터의 범위를 입력하면 해당 조건에 맞는 데이터의 리스트를 따로 출

력해준다.

Copyright © Graphics Application Lab. Pusan National University

Page 23: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 23

그림 10. K3000 데이터의 실험 데이터 검색 창. 각 데이터 속성의 범위를 지정할 수 있다.

3 2년차 결과물

3.1 실험 데이터의 다인자 분석을 위한 FCM 클러스터링 모듈 개발

실험 데이터의 다인자 분석 (Multi-variable analysis)은 실험 데이터를 분석하여 최종 결과 (효율 등)

에 가장 큰 영향을 미치는 인자를 분석하기 위한 방법이다. 이를 위해 SoCID 시스템에서는 클러스터

링 방법 중 하나인 FCM(Fuzzy C Means) 알고리즘을 사용한다.

3.1.1 FCM(Fuzzy C-Means) 알고리즘

FCM 알고리즘은 하나의 클러스터에 속해져있는 각각의 데이터 점을 소속 정도에 의해서 클러스터에

대한 데이터의 소속 정도를 일일이 열거한 데이터 분류 알고리즘이다. HCM(Hard C Means) 클러스

터링을 알고리즘을 개선하기 위하여 제안되었으며, HCM과 달리 변수의 소속 여부가 참 또는 거짓이

아니라 0∼1 사이의 실수로 표현된다는 것이 특징이다. n개의 벡터 xi, i = 1, ..., n 의 집합을 개의 퍼지

그룹으로 분할하고, 비유사성 측정의 비용함수가 최소가 되는 것과 같은 각각의 그룹 안에서 클러스

터의 중심을 찾는다. 데이터 집합에 대한 소속감 정도의 합은 식 (1), (2)과 같이 항상 1이다.

c∑i=1

uik = 1,∀k = 1, ..., n (1)

0 <

n∑k=1

uik < n (2)

Copyright © Graphics Application Lab. Pusan National University

Page 24: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 24

FCM에 대한 비용함수 (또는 목적함수)는 다음과 같은 형태를 가지고 있다.

J(uik, ui) =c∑

i=1

n∑k=1

umik(dik)2 (3)

dik = d(xk − vi) =[∑l

j=1(xkj − vij)12

](4)

vi = {vi1, vi2‘, ..., vil} (5)

여기서, uik는 0과 1사이의 수적인 값으로 i번째 클러스터에 속해져 있는 xk 의 k번째 데이터

의 소속정도를 나타낸다. vi는 i번째 클러스터 중심 벡터이다. j(j = 1, 2, ..., l)는 특성 공간상의 변

수이다. m은 소속 함수의 퍼지성 (애매함)의 정도에 대한 영향을 나타내는 지수의 가중 (exponential

weight)이다. 이 값은 m ∈ [1,∞)와 같은 범위를 가지고 있으며, 분류 공정에서 퍼지성의 양을 제어

하는 파라미터이다. 보통 m을 2로 설정한다. 식 (3)∼(5)의 목적함수를 최소화하기 위해서 먼저 vi와

uik와의 관련된 식의 목적함수를 분화시켜야 한다.

vij =

∑nk=1(uik)mxkj∑nk=1(uik)m

(6)

uik =( 1‖xk−vi‖2

)1

m−1∑cj=1(

1‖xk−vi‖2

)1

m−1

=1∑c

j=1

[‖xk−vi‖‖xk−vj‖

] 2m−1

=1∑c

j=1

[dikdjk

] 2m−1

(7)

식 (6)과 (7)에 의해서 묘사되어진 시스템은 분석적으로 해결할 수 없다. 그러나 FCM 알고리즘은

주어진 위치로부터 시작해서 목적함수의 최소로 접근하기 위해서 반복적으로 접근한다. FCM 알고리

즘은 다음과 같이 요약된다.

Step 1 - 클러스터의 개수 c(2 ≤ c < n) 을 정하고 지수의 가중 (exponential weight) 을 선택한다.

초기 소속 함수를 초기화한다. 알고리즘 반복 횟수를 r(r = 0, 1, 2, · · · ) 로 표시한다.

Step 2 - 식 (6)을 이용하여 퍼지 클러스터 중심 {u(r)i |r = 1, 2, · · · , , e} 을 계산한다.

Step 3 - 다음과 같이 새로운 소속 함수 U{r+1} 을 계산한다.

u(r+1)ik = 1∑c

j=1

[drikdrjk

] 2m−1

for Ik = φ

또는

u(r+1)ik = 0 for all classes i, here i ∈ barIk여기서, Ik = {i|2 ≤ c < n; d

(r)ik = 0} 이고 Ik = {1, 2, · · · , c} − Ik 이다. 그리고

∑i∈Ik u

(r+1)ik = 1

이다.

Step 4 : 다음 식을 계산해서 만일 ∆ > ε 이면 r = r+1 로 정하고 Step 2로 가서 다시 알고리즘을

반복 수행하고, ∆ ≤ ε이면 알고리즘을 종료한다. 여기서 ε 는 임계값이고, ∆는 다음과 같다.

∆ =‖ U (r + 1)− U (r) ‖= maxi,k| u(r+1)

ik − u(r)ik | (8)

Copyright © Graphics Application Lab. Pusan National University

Page 25: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 25

3.1.2 FCM 클러스터링 모듈

FCM 클러스터링 모듈은 위에서 언급한 FCM 알고리즘을 다차원 데이터에 적용할 수 있는 모듈이다.

n개의 d차원의 벡터 (데이터)를 c개의 클러스터로 나눌 수 있으며, 지수의 가중치 m과 반복횟수 ,

임계값 ε 등을 모두 변경할 수 있도록 설계하였다. FCM 클러스터링 모듈의 소스 코드는 표 9와 같다.

public class FCM {

private final int c; // 클러스터 개수 c=2, 3, 4, ...

private final int r; // 알고리즘 반복 회수 r=0, 1, 2, ...

private final double m; // 지수의 가중치(exponential weight) 1<m<∞

private final double e; // 임계값

private final int d; // 데이터의 차원

ArrayList<ArrayList<Double>> prevU; // 이전 소속 함수(임계값 비교를 위해)

ArrayList<ArrayList<Double>> U; // 소속 함수

ArrayList<ArrayList<Double>> Data; // 입력 데이터

ArrayList<ArrayList<Double>> V; // 각 클러스터에 대한 중심 벡터

FCM(final int c, final int r, final double m, final double e, final int d){

// 생성자. 각종 변수 초기화

this.c = c;

this.r = r;

this.m = m;

this.e = e;

this.d = d;

setDataArray(); // Data vector 초기화

setUArray(); // 소속 함수 초기화

setVArray(); // 클러스터의 중심 벡터 0,0 으로 초기화

FCMclustering(); // FCM 클러스터링

}

@SuppressWarnings("unchecked")

// FCM 클러스터링

void FCMclustering(){

// 이전 상태를 저장할 임시 소속 함수

prevU = (ArrayList<ArrayList<Double>>)U.clone();

for(int i = 0; i < this.r; i++){

// 클러스터의 중심 벡터 계산

Copyright © Graphics Application Lab. Pusan National University

Page 26: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 26

calVArray();

printVArray();

// 각 클러스터 중심과의 거리 계산

calUArray();

printPrevUArray();

printUArray();

// 임계치 종료조건

if(exitCondition(prevU)){

break;

}

prevU = (ArrayList<ArrayList<Double>>)U.clone();

}

}

boolean exitCondition(ArrayList<ArrayList<Double>> prevU){

double maxgap = 0;

for(int i = 0; i < U.size(); i++){

for(int j = 0; j < U.get(i).size();j++){

double gap = U.get(i).get(j) - prevU.get(i).get(j);

if(maxgap < gap)

maxgap = gap;

}

}

if (maxgap < e)

return true;

else

return false;

}

// 클러스터의 중심 벡터 계산

void calVArray(){

for(int i = 0; i < c; i++){

for(int j = 0; j < d; j++){

double numerator=0,denominator=0;

for(int k = 0; k < Data.size(); k++){

numerator += U.get(k).get(i)*U.get(k).get(i)*Data.get(k).get(j);

denominator += U.get(k).get(i)*U.get(k).get(i);

}

Copyright © Graphics Application Lab. Pusan National University

Page 27: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 27

V.get(i).set(j,

Math.round(numerator / denominator*100)/100.0);

}

}

}

// 각 클러스터 중심과의 거리 계산

void calUArray(){

for(int i = 0; i < Data.size(); i++){

final double distance [] = new double [c];

for(int j = 0; j < c; j++){

double sum = 0;

for(int k = 0; k < d; k++){

sum += (Data.get(i).get(k) - V.get(j).get(k)) *

(Data.get(i).get(k) - V.get(j).get(k));

}

distance[j] = Math.pow(sum, 1/m);

}

for(int j = 0; j < c; j++){

double sum = 0;

for(int k = 0; k < c; k++){

sum += (distance[j] / distance[k]) *

(distance[j] / distance[k]);

}

if(Double.isNaN(sum))

sum = 1.0;

else

sum = 1.0 / sum;

U.get(i).set(j, Math.round(sum*1000)/1000.0);

}

}

}

// 소속 함수 초기화

void setUArray(){

U = new ArrayList<ArrayList<Double>>();

ArrayList<Double> u;

for(int i = 0; i < Data.size()-1; i++){

Copyright © Graphics Application Lab. Pusan National University

Page 28: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 28

u = new ArrayList<Double>();

u.add(1.0);

u.add(0.0);

U.add(u);

}

u = new ArrayList<Double>();

u.add(0.0);

u.add(1.0);

U.add(u);

}

// 클러스터의 중심 벡터 0,0 으로 초기화

void setVArray(){

V = new ArrayList<ArrayList<Double>>();

ArrayList<Double> v;

for(int i = 0; i < c; i++){

v = new ArrayList<Double>();

for(int j = 0; j < d; j++){

v.add(0.0);

}

V.add(v);

}

}

}

표 9. FCM 클러스터링을 수행하기 위한 FCM 클래스의 소스 코드

3.2 유효성 검사 및 오류 정정

실험 중 여러 가지 원인으로 인하여 잘못된 데이터가 입력될 수 있다. 효율 값이 100%를 초과하는

경우나 수치 데이터에 문자열 (’ABC’ 등)이 들어가는 경우, 시각 데이터에 엉뚱한 데이터가 들어가는

경우 등을 예로 들 수 있다. 잘못된 데이터의 경우 DB에 저장되더라도 아무런 의미가 없으며 분석

결과의 신뢰도를 크게 떨어뜨린다. SoCID 시스템은 각 변수별로 관리자가 미리 지정한 범위를 벗어

나거나 수치 데이터에 수치가 아닌 데이터 (문자열, 수식 등)가 들어가 있을 경우 이를 걸러내어 오류

메시지를 출력하고, 설정 값에 따라 약속된 값으로 치환하거나 해당 데이터를 파기한다. 유효성 검사

모듈 중 수치 데이터 검사 모듈의 소스 코드는 표 10과 같다.

Copyright © Graphics Application Lab. Pusan National University

Page 29: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 29

public double isNumber(String input, double max, double min) {

double value = 0.0;

try {

value = Double.valueOf(input);

if (Double.isInfinite(value)) {

value = 99999.99999;

logger.write

("Warning 1 : NumberFormatException - Infinity value");

} else if (Double.isNaN(value)) {

value = -99999.99999;

logger.write

("Warning 2 : NumberFormatException - NaN value");

}

} catch (NumberFormatException e) {

value = -77777.77777;

logger.write("Error 1 : NumberFormatException - character");

}

// min, max 검사

if (new Double(min).compareTo(Double.NaN) != 0

&& new Double(max).compareTo(Double.NaN) != 0) {

if (value > max) {

logger.write

("NumberRangeExceptionError : The value is higher than the MAXIMUM Value");

} else if (value < min) {

logger.write

("NumberRangeExceptionError : The value is lower than the MINUMUM Value");

}

}

return value;

}

표 10. 유효성 검사 모듈의 수치 데이터 검사 모듈의 소스 코드

Copyright © Graphics Application Lab. Pusan National University

Page 30: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 30

4 개발 예정 기능

4.1 오류 보고 기능 강화

현재의 오류 보고 기능은 일반적인 수치상의 오류 혹은 문자열 오류만 검출하도록 되어 있다. 오류 보

고 기능을 강화하여, 실험 데이터가 축적되면 데이터의 분석 결과를 바탕으로 발생 빈도가 매우 낮을

것으로 예측되는 값이나 계산 상 발생하기 힘든 값 등을 찾아내어 이를 사용자에게 경고할 수 있다.

4.2 폴링 에이전트 원격 관리 기능

에이전트 프로그램이 실행되어 있다면 폴링 주기나 에러 검출 여부 등에 대한 설정을 SoCID 홈 페이

지의 관리자 모드에서 일괄적으로 관리할 수 있도록 폴링 서버와 에이전트의 기능을 보강한다. 이를

위한 인터페이스는 그림 ?? 과 같이 이미 완성하였으며 로직을 구현 중에 있다.

그림 11. 폴링 에이전트 원격 관리 기능(제어실) 인터페이스

4.3 다인자 분석을 위한 클러스터링 방법 추가

SoCID 시스템은 데이터 분석을 위한 클러스터링 방법으로 FCM 알고리즘을 적용하였다. 데이터의

종류 등 상황에 따라 여러 클러스터링 방법 중 하나를 선택하여 적용할 수 있다면 기능적 측면에서

더욱 유리할 것으로 본다. 따라서 FCM 외의 클러스터링 방법에 대해 조사해 보고 적용 가능한 모델은

구현하여 적용한다.

4.4 클래스 자동 확장 기능 추가

현재 SoCID 시스템은 K3000, K3100, K3400 및 K3600 측정 장비의 실험 데이터에 대해서 built-in

형식의 파싱 및 DB 저장 모듈이 적용되어 있다. 추후 측정 장비의 종류가 늘어난다면 이를 확장할 필

요가 있는데, 이 경우 장비가 늘어날 때마다 수동으로 파서 및 DB 저장 모듈을 추가하여야 한다. 이

러한 불편함을 최소화하기 위하여 설정 값에 따라 적절하게 파싱이 가능한 범용 파서 (general parser)

개발과 함께 실험 장비 추가 시 클래스를 자동으로 추가할 수 있도록 하는 등 시스템의 확장성을 강

화할 계획이다.

Copyright © Graphics Application Lab. Pusan National University

Page 31: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 31

5 시스템 확장 방법

실험 데이터의 변경 혹은 장비의 추가로 인한 SoCID 시스템을 확장하기 위해서는 built-in 파서를 추

가하고 폴링 서버 및 클라이언트를 변경하여야 한다. 현재로써는 범용 파서 및 자동 확장 기능이 구현

되어 있지 않으므로, 개발자를 통하여 built-in 파서를 추가하거나 수정하여야 한다. 추후 해당 기능이

완성되면 실험 데이터 포맷 변경 및 실험 장비 확장에 따른 시스템 확장 방법에 대한 상세한 설명을

추가할 것이다.

6 오류의 종류 및 대응 방법

6.1 설치 관련 오류

6.1.1 Flash Builder 버전 관련 오류

SoCID 서버는 Flex Builder 3으로 개발하였다. 그러나 Flex Builder가 Flash Builder 4 로 통합되면

서 이전 버전으로 개발한 프로그램과 호환이 되지 않는다. Flash Builder 4는 이전 버전으로 컴파일

할 수 있으므로 현재는 3.5 버전으로 낮추어 컴파일 하여야 한다. 추후 Flash Builder 4를 지원하도록

추가할 계획이다.

6.1.2 제로보드 게시판에 Flex 페이지 삽입하기

제로보드를 홈페이지로 사용할 경우, Flex 페이지는 외부 페이지로 삽입하여야 한다. 그 과정은 다음

과 같다.

1. xe를 설치한 폴더 - layout 폴더 - 스킨을 포함한 폴더 - js 폴더 에 표 11 코드 파일을 추가한다.

2. 레이아웃 편집에 들어가서 제일 윗줄에 <!--%import("js/activeX.js")--> 를 입력한다.

3. swf 파일을 포함하고 있는 html 파일의 내용을 모두 삭제한다.

4. html 파일에 표 12의 코드를 추가하되 fm 이하는 홈 페이지의 설정에 맞추어 작성한다.

6.2 수행 관련 오류

6.2.1 Flex Security Error

Flex 수행 도중 표 13과 같은 메시지를 받았다면, 서버를 바꾼 후 Flash Builder에서 바뀐 서버의 IP

와 설정에 맞게 다시 컴파일 하지 않았기 때문이다. 새로 바뀐 서버의 설정에 맞추어 다시 컴파일하고,

해당 swf 파일을 홈페이지에 연결해주면 해결된다.

6.2.2 데이터 유효성 에러

실험 데이터의 유효성 검사 모듈에서 데이터의 오류가 발생했을 경우, 두 가지의 선택 사항이 있다.

사용자가 오류 검사 옵션을 선택하였다면 해당 데이터는 DB에 기록되지 않으며, 옵션을 선택하지 않

Copyright © Graphics Application Lab. Pusan National University

Page 32: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 32

/*------------------------------------------*/

//ActiveX 적용 관련

//-------------------------------------------------

//fm(src,id,w,h,t,m)

→ Flash Movie. src:파일 경로, id:플래시 무비 아이디, w:너비, h:높이,

t:배경 투명여부(Y:투명, N:불투명), m:메뉴 표시여부(Y:표시, N:미표시)

/*------------------------------------------------*/

function fm(src, id, w, h, t, m) {

var s = ’’;

var s_id = ’’;

var s_t = ’’;

(id == "") ? s_id="swf" : s_id = id;

(t == "Y") ? s_t = ’<param name="wmode" value="transparent">’ : s_t=’’;

(m == "Y") ? m = ’true’ : m = ’false’;

s += ’<object type="application/x-shockwave-flash" ’;

s += ’classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ’;

s += ’codebase="http://fpdownload.macromedia.com/’;

s += ’pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"’;

s += ’id="’+s_id+’" width="’+w+’" height="’+h+’">’;

s += ’<param name="movie" value="’+src+’">’;

s += ’<param name="quality" value="high">’;

s += s_t;

s += ’<param name="menu" value="’+m+’">’;

s += ’<param name="swliveconnect" value="true">’;

s += ’<embed src="’+src+’" quality="high" menu="’+m+’" ’;

s += ’width="’+w+’" height="’+h+’" swliveconnect="true" ’;

s += ’id="’+s_id+’" name="’+s_id+’" type="application/x-shockwave-flash" ’;

s += ’pluginspage="http://www.macromedia.com/go/getflashplayer"><\/embed>’;

s += ’<\/object>’;

document.write(s);

}

표 11. 제로보드 내에서 Flash를 삽입하기 위한 activeX 코드

Copyright © Graphics Application Lab. Pusan National University

Page 33: Manual for SoCID Developerspearl.cs.pusan.ac.kr/~wiki/images/d/dc/SYS201007SOLAR.pdf · 2015-01-18 · Lt – Q ˜(1:1) $– (Class) k3000mi Experiment Measurement Information K3000

SYS - SOLAR - 007, 2010 33

<script language="javascript" type="text/javascript">

fm("Flash 파일의 절대경로", "Flash 파일 명", 창 넓이, 창 높이,"N","N");

</script>

표 12. 제로보드 내에서 Flash를 삽입하기 위한 activeX 코드

<script language="javascript" type="text/javascript">

fm("Flash 파일의 절대경로", "Flash 파일 명", 창 넓이, 창 높이,"N","N");

</script>

표 13. Flex Security Error

았으면 문제가 발생한 데이터를 특정 값으로 치환하여 데이터베이스에 저장하고 사용자 로그에 기록

을 남긴다. 이 때 잘못된 데이터를 대치하여 저장하는 값은 표 14와 같다.

입력된 문자열 데이터베이스 저장 값

NaN -99999.99999

Infinity 99999.99999

의미없는 문자열 -77777.77777

표 14. 실수 데이터에 입력된 문자열을 대치할 값. 데이터베이스에는 입력한 문자열

이 아닌 대치한 값을 저장한다.

7 Contact Us

SoCID 시스템에 대한 의문사항이나 조언이 있으시면 해당 담당자에게 메일로 연락하실 수 있습니다.

– 개발 및 활용 총괄 : 조환규 교수 ([email protected])

– 데이터, 서버, 홈페이지 관리 : 김선영 연구원 ([email protected])

– 네트워크, 브라우징, 클라이언트 : 박선영 연구원 ([email protected])

SoCID 개발 팀 연락처

– 그래픽스 응용 연구실 : 051-510-2871

– 조 환 규 교수님 : 051-510-2283

– 연 구 실 F A X : 051-582-5009

참고 문헌

1. Oracle, “Mysql,” http://dev.mysql.com/.

2. NHN, “Xpressengine,” http://www.xpressengine.com/.

Copyright © Graphics Application Lab. Pusan National University