Showing posts with label java. Show all posts
Showing posts with label java. Show all posts

Monday, June 13, 2016

[자바예제] 하드(서버)를 DB로 사용하는 mapdb(파일디비) java 오픈소스


오픈소스


요즘 회사에서 하는 프로젝트는 온통
오픈소스 뿐입니다~ 전부터 오픈소스
사용에 대해서 굉장히 좋게 생각해오던
저인지라 새로운 오픈소스를 알게
될 때마다 큰 만족감을 느끼는 중입니다~
지금 하는 빅데이터 프로젝트의 내용 중에
일반 DB 서버를 사용하지 않고 파일에
data를 저장하는 부분이 있습니다.
단순히 파일에 내용을 저장하는게 아니고
객체나, 리스트, VO 등 모든 타입의
data를 파일에 저장하고 심지어 톰캣이나
다른 DB처럼 검색/수정/추가/삭제
심지어 join도 된다고 합니다~
한 시간 전까지는 내용만 알고 아직
예제를 돌려 보지 못했는데 오늘
드디어 예제 하나 돌려 봤습니다 ㅎㅎ

mapdb



data를 저장할 파일의 경로를 잡아주고
mapdb 예제를 돌려보면 해당 파일에
data가 저장되어서 위에 예제를 한 번
더 구동하면 그 전에 저장했던 data를
가지고 올 수 있답니다~~~ㅎㅎㅎ
이 때 최초에 파일이 없으면 아무 내용이
없더라도 해당 경로에 파일이 있어야 됩니다.

물론 왜 굳이 파일DB를 사용해야 되나를
묻는 분들도 계실 겁니다~
일단 오라클 같은 일반 DB를 사용하는 경우
연결 맺고 SELECT/INSERT/DELETE/UADATE를
하는 작업보다는 파일을 생성해서 read/write
하는 속도가 더 빠르다고 합니다. 그리고
DB를 사용하기 위한 환경 설정도 없어도 되고,
mapdb에서는 DB에서 제공하는 기능도
거의 제공까지 해주고 있습니다~
예를 들면 commit이나 rollback 같은 기능~

여튼 DB에 비해 Data 관리가
너무 편해지고 간편해 질 수
있다고 생각합니다~~

그리고 아마존웹서비스도 사용을
해보려고 하는데 DB와 서버 둘 다
아마존 웹서비스에서 사용하는 방법을
찾으려고 하니 너무 귀찮은 겁니다.
그런데 파일DB 되면 굳이 DB 사용할
필요가 없어져서 아마존웹서비 DB
서비스를 공부하지 않아도 되어서
너무 좋습니다~~

[자바예제] PDF뷰어 프로그램 소스(pdf 파일 read하는 Java 프로젝트)

PDF 뷰어


자바에서 제공하는 Swing 클래스와
icepdf 라는 오픈api를 이용해서
구현한 자바 PDF뷰어 입니다.
엄청 간단한 예제이지만 필요하신
분이 계실거 같아 공유합니다~
pdReport 카페에 올려 놓았습니다.


pdf 뷰어 실행한 화면 캡처 사진입니다.
프로그램 전체적인 틀은 보시는 것처럼
자바 Swing의 JPanel을 이용했고,
그 외 pdf 파일을 read해오는 것과
adobe reader처럼 pdf 뷰어의 여러
기능은 icepdf 라이브러리에서
기본으로 구현해 줍니다.


제가 한 거라고는 자바 클래스와
오픈api를 짬뽕시켜준 일 뿐입니다.

아래는 캡처 사진은 자바 pdf viewer의
프로젝트 구성입니다. 엄청 심플하죠?ㅎ
PDFJframeViewer.java 에
main 함수가 있으니 이클립스에서
해당 프로젝트를 import 해와서
실행만 시켜 주시면 됩니다.
혹 빌드패스 관련 문제가 생기면
직접 설정을 좀 해주셔야 될 수도 있습니다.


위 프로젝트의 lib 디렉토리 밑에 보면
icepdf 라이브러리를 보실 수 있습니다.
참고로 servlet-api-2.5.jar는 
필요 없는 파일입니다 ㅋㅋㅋ
제가 다른 작업 한 건데 안 지운 거니
참고하세요 ㅎㅎ

PDFJframeViewer.java 파일을 보시면
아래와 같이 열고자 하는 pdf 파일의
경로를 담고 있는 filePath 라는
String 타입의 변수가 있습니다.


위에 경로만 본인이 가지고 있는
pdf 파일의 절대경로로 바꿔서
입력해 주시면 됩니다.

pdReport 카페에 올려 놓았으니
많이 다운 받아서 사용하세요!

Friday, June 3, 2016

자바 테트리스 게임 프로그램 예제 소스

자바 테트리스


예전 노트북에서 이클립스 작업 폴더를
뒤지다가 찾은 자바 테트리스 게임입니다.
안드로이드 프로젝트 하나를 찾는게
있었는데 엉뚱하게 자바 프로젝트를
하나 찾았습니다 ㅋ 아래 영상을 보시면
아시겠지만 테트리스의 기본적인
기능만 되지만 그래도 상당히 까다로운
테트리스 게임을 깔끔하게 구현해 놓은
자바 프로젝트 소스입니다.


Swing, JFrame, JPanel, JButton 등
자바에서 제공해주는 Swing 클래스를
이용해서 구현되었고, 이클립스에서
fmain을 실행시켜 주시면 바로 위와
같이 정상적으로 실행됩니다.


소스는 카페에 올려 놓았습니다.
위에 링크된 곳으로 가시면 됩니다.


소스에 나름 주석도 달아 있어서
소스 파악하는데 있어서
도움이 되실 거라 생각합니다.


아 그리고 제가 직접 실행을 해보니
약간의 버그가 있더라구요
자주 발생하는 문제는 아니지만
어쩌다 한 번씩 블록이 부서지지
않는 경우가 있었습니다.
참고 하시고 이 소스를 사용하시게
된 경우 꼭 수정하시기 바랍니다~

제가 구현한 건 아니지만 자바 테트리스
예제 소스에 대해 질문이 있으시면 카페
QnA 게시판에 글 남겨 주시면 아는
한도 내에서 답변 드리겠습니다.

Thursday, May 5, 2016

[앵귤러JS] 플로우차트(워크플로우) 동적으로 생성하는 AngularJS 예제 소스

FlowChart(WorkFlow)


회사 내부 프로젝트 중 BPMN이라는
것에 UI적인 표현을 위해 워크플로우
라는 것을 이용하려고 하고 있습니다.
워크플로우(WorkFlow) 라는 용어는
저희 회사 내부적으로만 사용하는
용어로 대략적으로 특정 비즈니스나 작업의 
흐름을 표준화된 형태로 파일로 기록하면
그 것을 기반으로 UI 적으로 표현을
해주는 기능을 의미하고 있습니다.
그리고 동적으로 추가/삭제/수정이
화면에서 수행되어야 합니다.
그러다가 연휴 전 날에 하나 재미있는
예제를 찾았습니다. 실행한 예제는
아래와 같습니다. 아! 예제는 카페에
올려 놓았습니다~~!



대략적으로 설명을 해보겠습니다.
일단 오른쪽에 차트가 그려져 있고,
차트 위에 네 개의 버튼이 있습니다.
그리고 왼쪽에는 뭔가 단어들이
나열되어 있는데 JSON 형태로
작성된 내용입니다.

일단 차트에는 두 개의 노드가 존재하고
있습니다. 이 때 Node1은 A,B,C 라는
Input과 A,B,C라는 아웃풋이 존재하고,
Node2 역시 A,B,C라는 인풋과 아웃풋이
존재합니다. 
(Input, output, node 명은 수정이 가능합니다)
그리고 Node1의 B라는 output이 Node2의
C라는 Input으로 연결되어 있습니다.

위에 내용과 같은 형식으로 표현될 수 있는
작업(Work)이나 비즈니스(business)가
실무에서 존재할 것이며, 위와 같이 길게
말로 설명할 수도 있겠지만 한 눈에
볼 수 있는 즉 가독성이 좋은 형태는
역시 UI 적으로 보여주는 겁니다.
그래서 위에 긴 내용이 그림으로 표현된 것이
오른쪽에 차트 형식으로 그려진 겁니다.


그리고 오른쪽 상단에 버튼 네 개 중
Add Node 라는 버튼을 누르면
위와 같이 새로운 노드를 추가할 수
있고 확인 버튼을 누르면 어플의
재시작 없이 바로 아래처럼
웹 브라우저에 새로운 노트가 추가되며,
마우스 드래그를 통해 원하는 위치로
이동도 가능합니다.


그리고 Add Input Connector,
Add Output Connector 버튼을
통해 아래 이미지처럼 원하는 노드의
input, output 값도 수정이 가능합니다.


input(왼쪽)에 원래 X, Y, Z 라는 
인풋만 존재했는데 1이라는 인풋을
추가해 준 모습니다.


그리고 화면에서 추가된 사항은
바로바로 위와 같이 왼쪽의
JSON에 반영이 됩니다~


생성된 Node3의 3 output을
기존에 존재하던 Node2의
C Output으로 연결해 주었습니다.
실제에서는 output에서 다른 노드의
output으로 가는 케이스가 많을까?
라는 의심이 들지만 단순 예제이니
그냥 넘어가도록 하겠습니다~
여기서 중요한 건 화면에서 동적으로
이러한 내용들을 실시간으로
표현해주고 반영이 바로 된다는
사실이니깐요~
위와 같이 화면에서 적용을 하면
당연히 왼쪽의 JSON에도 반영이
되어야 하겠지요~!?


위에 내용이 JSON 내용 중 노드 간
연결 정보를 표현하고 있는 부분입니다.
출발지(source) 정보와 도착지(dest)
라는 각각의 key에 node명과 connection라는
value를 가지고 있습니다.

AngularJS에서 통신을 하거나 어떤 
값/상태를 표시할 때 JSON을
사용하는데 잘 알지 못할 때는
음.. 뭐 이런 것도 있나보구나 하고
넘어갔었는데 AngularJS에서 자주
사용하다 보니 참 괜찮은 놈이구나란
생각이 듭니다~

이 녀석을 있는 그대로 사용할 순 없고,
좀 더 프로젝트에 맞게 다듬어야 하겠지만
정말 이런 예제가 있다라는 것만으로도
엄청난 시간을 절약한 셈입니다.
AngularJS 짱~ㅎㅎㅎㅎ

Saturday, April 30, 2016

[자바예제소스] 지메일 계정으로 메일/첨부파일 보내는법(Java 코드)

메일 보내는 자바 예제


작업을 하다가 자바나 혹은 웹에서
이메일을 보내는 예제가 필요해서
뭐 금방 찾겠지 하고 검색을 해봤습니다.
어? 그런데 생각처럼 간단하기만 한 건
아니었던 거 같습니다(물론 예제를 찾은
지금 기준으로는 간단한 예제이지만
어디까지나 알고 있는 지금 기준)
그냥 뭐 보내고 싶은 이메일 주소를
파라미터로 줘서 이메일 보내는 메서드
호출하면 되겠지 했는데 아니더라구요 ㅋ
일단 예제부터 공유하겠습니다




일단 위에 예제는 pdReport 카페에
올려 놓았으니 가셔서 다운 받으시면
됩니다. 그리고 먼저 말씀 드리는 건
위의 예제는 네이버에서 검색해서
찾은 예제입니다. 저는 그냥 갖다
사용만 한 겁니다. 거기에 추가적인
설명만 좀 더 할 뿐입니다.
출처를 찾아보려고 했는데 많은 분들이
위의 예제들을 사용하고 계셔서 어딘지를
알 수가 없습니다. 어쨌든 제가 직접 짠
코드는 아니고 인터넷에 막 돌아다니는
예제이고 그 중에 정상적으로 돌아가는
예제를 공유해 봅니다 ㅎㅎㅎ

다시 본론으로 돌아와서 위의 예제에
대해 간단하게 설명을 드리자면 지메일
계정을 사용해서 이메일을 보내는 예제인데
보내는 곳의 주소는 무조건 gmail이어야 되지만
받는 쪽의 이미엘은 지메일이 아니어도 됩니다.
저 같은 경우는 네이버 메일로 보냈습니다.

그러므로 위의 예제 중 본인의 지메일 계정과
패스워드를 입력해 주어야 됩니다.
제가 소스 상에 GMAIL_ID 라고 입력한 부분을
본인의 지메일 계정으로 바꿔 주셔야 되고,
소스의 제일 밑에 보시면 GMAIL_PASSWORD
​라는 부분이 있는데 그 부분에 해당 지메일 계정의
비밀번호를 입력해 주시면 됩니다.
아 그리고 받으시는 분의 이메일 주소도 입력해
주셔야 되는데 제가 공유한 소스 기준으로는
since201109@naver.com
​으로 받은 쪽의 이메일이 설정되어 있으니
이 것도 수정해 주셔야 됩니다.

p.put("mail.smtp.user", "GMAIL_ID@gmail.com");
Address fromAddr = new InternetAddress("GMAIL_ID@gmail.com");
Address toAddr = new InternetAddress("since201109@naver.com"); 
return PasswordAuthentication("GMAIL_ID@gmail.com", "GMAIL_PASSWORD");

위에 내용 수정해야 될 내용들입니다~
검색해서 찾으셔서 수정하세요ㅎㅎ

아 그리고 이 예제는 메일 보내는 것과 함께
첨부 파일도 함께 보내는 자바 예제입니다.
당연히 보내시려는 파일의 경로도 잡아
주셔야 겠지요. 아래 부분을 수정해
주시면 됩니다.

File file = new File("C:\aaa1.log");

저는 C 드라이브 밑에 있는 aaa1.log 라는
파일을 첨부해서 보냈습니다.
그리고 소스 상에서 메일의 제목과
메일의 내용도 설정이 가능합니다

메일 제목 설정
msg.setSubject("Gmail SMTP 서버를 이용한 JavaMail 테스트");

메일 내용  설정
messageBodyPart.setText("Java Mail API를 이용하여 첨부파일을 테스트합니다.");

메일은 받은 결과입니다~


권한설정


아... 근데 저도 이렇게 메일 보내는 자바 예제가
한 번에 바로 실행된 건 아닙니다.
분명 위에 제가 설명한 그대로 지메일 계정과
비밀번호까지 입력해주었는데도 메일이
전송이 되지 않았었습니다. 이클립스 콘솔에
찍힌 결과를 보니 권한이 어쩌고 저쩌고
하더라구요... 결론은 보안수준이 낮은 외부기기
(저의 이클립스 예제)에서 구글의 서비스를
사용하려고 하니 권한 문제가 발생한 거였습니다.

이 때 전 어떻게 해결을 했냐면 이클립스 콘솔에
나온 에러 메시지를 잘 찾아보시면
해결 방법이 나온 인터넷 주소가 하나 있습니다.
(캡처해놓은게 없어서 말로만 설명해요 ㅠㅠ)
구글에서 설명해주는 글인데 거기로 가시면
이클립스에서 메일 보내는 예제가 실행되도록
구굴의 특정 권한을 낮춰주는 방법에 대한
설명이 있습니다. 그 설정을 완료하면
아래와 같은 메일도 제 구글메일로 옵니다.


한 마디로 이제 제 구글 계정과
패스워드만 알면 제가 아닌 다른
사람이 제가 사용하지 않는 기기에서도
저처럼 제 메일의 계정으로 메일을
보낼 수가 있다는 겁니다.
즉 보안 수준이 낮아진 겁니다.
일단 저는 메일 보내는데 까지는
성공했으니 다시 위의 설정을
처음으로 되돌리려고 합니다.
애초에 이 예제를 찾은 이유가 있지만
보안 상 좋지 않아서 다른 방법을
찾아 보려고 합니다 ㅠㅠ

Monday, April 25, 2016

[빅데이터] CentOS에 하둡(Hadoop)과 스파크, 자바(Java), 스칼라, 메이븐(Maven), R 설치하기


빅데이터 솔루션 개발을 위해 CentOS가 설치된
Dell 서버가 하나 들어 왔습니다. 분산 처리를
하는 Slave 서버의 사양이 좋을 수록 처리
퍼포먼스가 좋다라고 하니 얼른 환경 설정을
해서 테스트 해보기로 했다.
그렇지만 환경설정이라는 게 단시간 내에
안끝날 거란 걸 너무나도 잘 알기 때문에
비장한 각오로 임했습니다.
이미 회사 서버에는 왠만한 환경은
다 갖춰져 있었고, 설치한 경험이
있어서 전보다는 막힘이 없겠지만
OS가 CentOS로 다른 것이라
OS dependency 한게 있으면
분명 고생을 할거란 생각도 가지고...

Root 계정이 sudo 명령어 사용할 수 있도록 설정
chmod u+\ /etc/sudoers

그룹 생성
sudo groupadd 그룹

사용자 생성
계정 생성 : sudo useradd 계정
사용자 암호 설정 : passwd 계정
암호 설정 확인 : cat /etc/shadow

그룹에 사용자 추가
sudo gpasswd -a 계정 그룹

설치 파일(.gz) 저장할 디렉토리 생성
su - 계정
​mkdir Downloads



wget 을 이용해서 다운로드 받은 파일들

설치

gz/tar 압축풀기 : tar xzf 압축파일명
zip 압축풀기 : unzip 압축파일명

하둡 설정
$HADOOP_HOME/etc/hadoop에서 아래의
파일들에 대한 환경 설정이 필요.
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml

이미 환경 설정이 완료된 내용을
복사해서 적용했다. 이 때 서버ip,
계정 등은 새로 환경 설정을 해주는
서버의 정보로 수정해 주어야 된다.

sudo mkdir -p hadoop_sotre/tmp
sudo mkdir -p hadoop_store/hdfs/namenode
sudo mkdir -p hadoop_store/hdfs/datanode
sudo chown -R 계정:그룹 hadoop_store

$HADOOP_HOME/etc/hadoop/ 경로에 있는
slaves와 masters 파일에 host를 적어준다.
이 때 해당 서버가 slaves(datanode)이면
slaves 파일에 host를 적어주면 되고
마스터(namenode) 서버이면 masters
파일에만 host를 적어주면 됩니다.

$HADOOP_HOME/etc/hadoop/ 에 있는
hadoop-env.sh 를 열어 자바 경로 설정
export JAVA_HOME=자바경로

스파크 설정
$SPARK_HOME/build/zinc-버전/bin/
에서 아래의 명령어 수행한다
./zinc -shudown

$SPARK_HOME 에서 아래의 명령어를
차례로 수행합니다.
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
./make-distribution.sh --tgz --skip-java-test -Pyarn -Phadoop-2.6 -Dhadoop.version=2.7.1 -Phive -Phive-thriftserver -Dscala-2.10

설치
R 설치를 위해서는 좀 복잡한 과정을 거칩니다.
yum update
sudo mv 0608B895.txt /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
rpm -qa gpg*
sudo rpm -ivh epel-release-6-8.noarch.rpm
sudo yum install npm
sudo yum install R

.bash_profile에 아래 내용 추가
R_HOKME=usr/lib64/R

유별나게 R만 CentOS의 영향을
많이 받아서 설치하는데
애 많이 먹었습니다...

SparkR 설치
$SPARK_HOME/R 에서 아래의 명령어 수행
USE_MAVEN=1 USE_YARN=1 SPARK_YARN_VERSION=2.7.1 SPARK_HADOOP_VERSION=2.7.1 SPARK_VERSION=1.5.1 ./install-dev.sh

host 설정
sudo nano /etc/hosts에서 서버 URL에
해당하는 host를 아래와 같이 지정해 준다.
111.222.333.444 test-server01
111.222.333.555 test-server02

sudo nano /etc/sysconfig/network 에서
작업하는 서버의 HOSTNAME 설정
HOSTNAME=test-server02

SSH 통신을 위한 공개키 공유
공개키가 없는 서버 : ssh 계정@작업서버IP mkdir -p .ssh
공개키가 있는 서버 : cat ~/.ssh/id_rsa.pub | ssh 계정@공개키없는서버IP /cat >> ~/.ssh/authorized_keys'

.bashrc 파일 복사
cat ~/.bashrc | ssh 계정@설정할서버IP 'cat >> ~/.bash_profile'
기존 서버에서는 .bashrc 파일이고, CentOS에서 .bash_profile

.bash_profile 수정 사항 반영
source ~/.bash_profile

주의사항
모든 서버의 하둡 경로는
동일해야 하둡 구동 시
모든 서버에서 하둡 관련
프로세서가 정상적으로
동작합니다.