2014년 2월 18일 화요일

docker 맛보기

맥북프로를 구매했다.
좀 더 다양하게 여러가지를 수행하고 싶은데 맥북에어로서는 한계가 있어서 맥북프로를 구매했다.

그리고 docker를 설치해보기로 했다.

참고 페이지 : http://docs.docker.io/en/latest/installation/vagrant/

1. virtualbox 를 다운로드 받아 설치 : https://www.virtualbox.org/

2. vagrant 를 다운로드 받아 설치 : http://www.vagrantup.com/

3. git 으로 docker source 다운로드
    git clone https://github.com/dotcloud/docker.git

4. 다운로드 받은 docker 로 이동
    cd docker

5. docker 폴더를 살펴보니 이상한 것들이 많다.
AUTHORS Vagrantfile dockerinit nat tags.goCHANGELOG.md api dockerversion networkdriver tags_unit_test.goCONTRIBUTING.md archive docs pkg utilsDockerfile auth engine registry utils.goFIXME buildfile.go execdriver runconfig utils_test.goLICENSE commands_unit_test.go graph.go runtime.go vendorMAINTAINERS config.go graphdriver server.go version.goMakefile container.go hack server_unit_test.go volumes.goNOTICE container_unit_test.go image.go sorter.goREADME.md contrib integration state.goVERSION docker links sysinit

6. vagrant 실행
    vagrant up

  • vagrant 를 실행하면 ubuntu 64bit 를 다운로드 받는다.
  • 해당 ubuntu 에는 docker 가 이미 설치되어 있다.    

7. vagrant 를 통해 ubuntu 에 접속
    vagrant ssh

8. 이제부터 docker 를 공부해서 사용해 본다.
    아래 Hello World 를 출력하는 것 외에도 많은 예제가 있으니 참고하면 된다.
    http://docs.docker.io/en/latest/examples/hello_world/

그런데 중간에 나온 vagrant 를 좀더 알아야겠다.

쉽게 이해할 수 있는 발표자료 : http://www.slideshare.net/arawnkr/vagrant-chef
조대협님의 블로그 : http://bcho.tistory.com/806
vagrant box list : http://www.vagrantbox.es/

위의 box list 를 활용하여 개발환경을 구축하는 방법 : http://ppiazi.tistory.com/m/post/view/id/230

이로서 맥북프로에서 다양한 개발 환경을 만들어 사용할 수 있게 되었다.
하지만 아직 네트워크에 대하여는 지식이 매우 부족한 편이다.
어제 갔던 Openstack Day In Korea 에서 네트워크에 대한 질문을 하고 싶었는데 여건이 안되어서 물어보지 못했다.

나중에 네트워크에 대하여 좀 더 공부해 봐야겠다.


2014년 2월 13일 목요일

ASM 4.0 Example - Hello World 주석 달기

import java.io.FileOutputStream;
import java.io.PrintStream;

import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.GeneratorAdapter;
import org.objectweb.asm.commons.Method;

/**
 * @author Eric Bruneton
 */
public class Helloworld extends ClassLoader implements Opcodes {

public static void main(final String args[]) throws Exception {

        // 아래의 소스에 대하여 자바 클래스 파일에 해당하는 바이트 코드를 만들기
        /**********************************************************************
        public class Example {
            public static void main (String[] args) {
                System.out.println("Hello world!");
            }
        }
        **********************************************************************/

// ClassWriter 만들기 - Object 를 상속 받아서
ClassWriter cw = new ClassWriter(0);
        // visit(int version, int access, String name, String signature, String superName, String[] interfaces)
cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);

// 생성자 MethodWriter 만들기
        // visitMethod(int access, String name, String desc, String signature, String[] exceptions)
MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);

        // visitVarInsn(int opcode, int var)
        // opcode 는 ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE, RET 중 선택사용
        // opcode 참조 : http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html
        // 'this' 변수 지정
mw.visitVarInsn(ALOAD, 0);

// super class constructor
        // visitMethodInsn(int opcode, String owner, String name, String desc)
        // opcode 는 INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC, INVOKEINTERFACE 중 선택사용
mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");

        // visitInsn(int opcode)
mw.visitInsn(RETURN);

        // visitMaxs(int maxStack, int maxLocals)
        // 메소드의 최대 스택 사이즈
        // 메소드를 위한 로컬 변수의 최대 사이즈
mw.visitMaxs(1, 1);

mw.visitEnd();

// main 함수 만들기
        // visitMethod(int access, String name, String desc, String signature, String[] exceptions)
mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);

// System 클래스의 'out' field 사용
        // visitFieldInsn(int opcode, String owner, String name, String desc)
        // opcode 는 GETSTATIC, PUTSTATIC, GETFIELD, PUTFIELD 중 선택사용
mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");

// "Hello World!" String 상수 사용 (ldc instruction)
        // ldc pushes a one-word constant onto the operand stack. int, float, String 등
  mw.visitLdcInsn("Hello world!");
        
// 'prinln' 수행
mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");

        mw.visitInsn(RETURN);

        // visitMaxs(int maxStack, int maxLocals)
        // 메소드의 최대 스택 사이즈
        // 메소드를 위한 로컬 변수의 최대 사이즈
mw.visitMaxs(2, 2);

mw.visitEnd();

// 바이트코드 값 얻기
byte[] code = cw.toByteArray();

// class 파일 만들기
        FileOutputStream fos = new FileOutputStream("Example.class");
fos.write(code);
fos.close();

// 클래스로더로 읽어 들이기
        Helloworld loader = new Helloworld();
Class<?> exampleClass = loader.defineClass("Example", code, 0, code.length);

// 로딩된 클래스의 main 메소드 수행하기
exampleClass.getMethods()[0].invoke(null, new Object[]{null});

// ------------------------------------------------------------------------
// GeneratorAdapter를 이용하여 만들기 (편리하지만 느리다 ㅡ.ㅡ;;)
// ------------------------------------------------------------------------
        
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);

        // 생성자 만들기
Method m = Method.getMethod("void <init> ()");
        // GeneratorAdapter(int access, Method method, String signature, Type[] exceptions, ClassVisitor cv)
GeneratorAdapter mg = new GeneratorAdapter(ACC_PUBLIC, m, null, null, cw);
mg.loadThis();
mg.invokeConstructor(Type.getType(Object.class), m);
mg.returnValue();
mg.endMethod();

// main 함수 만들기
m = Method.getMethod("void main (String[])");
        // GeneratorAdapter(int access, Method method, String signature, Type[] exceptions, ClassVisitor cv)
mg = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC, m, null, null, cw);
mg.getStatic(Type.getType(System.class), "out", Type.getType(PrintStream.class));
mg.push("Hello world!");
mg.invokeVirtual(Type.getType(PrintStream.class), Method.getMethod("void println (String)"));
mg.returnValue();
mg.endMethod();

cw.visitEnd();

        // 바이트코드 값 얻기
code = cw.toByteArray();

        // 클래스로더로 읽어 들이기
loader = new Helloworld();
exampleClass = loader.defineClass("Example", code, 0, code.length);

        // 로딩된 클래스의 main 메소드 수행하기
exampleClass.getMethods()[0].invoke(null, new Object[]{null});
}
}


2014년 2월 12일 수요일

node.js 살펴보기

node.js 에 대하여 많이 듣기는 했으나 제대로 머리속에 정리가 안되어 있어서 정리를 해보도록 하자.

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

node.js  확장성 있는 네트워크 어플리케이션 개발을 쉽고 빠르게 할 수 있도록 지원하는 자바스크립트 런타임 기반의 플랫폼이다. (특히 server-side 에 유용하다.)
event-driven, non-blocking I/O model 을 사용한다. (기타 좋은 말은 영문으로... ^^)

위키 : http://ko.wikipedia.org/wiki/Node.js

음... 잘 모르겠다 ㅡ.ㅡ;;

그럼 예제를 보면 좀 더 이해가 가리라..... 역시 node.js 홈페이지(http://www.nodejs.org/) 의 예제를 보도록 하자.


  • 웹 서버 띄우기
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

자바스크립트를 이용하여 'http' 프로토콜을 지정하고 createServer 를 통해 서버를 만들었다. 웹 서버니까 listen 으로 포트를 열어두고. 서버의 요청이 있는 경우 'Hello World'를 출력하는 함수를 만들어 두었다.
간단한 예제이지만 쉽게 이해가 갈 것이다. 서버를 생성할 때 function 에 필요한 로직을 두면 웹 어플리케이션이 되는 것이다. 물론 이때 MVC 패턴 등을 이용하여 만들어 두면 훨씬 쉽게 작성할 수 있다. 아직 찾아보지는 않았지만 아마도 잘 정리된 개발 패턴이 있거나 node 기반의 프레임워크가 존재할 것이다. 꼭 찾아보자...

네트워크 어플리케이션을 작성할 수 있다고 하지 TCP 기반의 어플리케이션을 만드는 예제를 살펴보자


  • TCP 서버 띄우기 
var net = require('net');

var server = net.createServer(function (socket) {
  socket.write('Echo server\r\n');
  socket.pipe(socket);
});

server.listen(1337, '127.0.0.1');

명확하고 심플하다. net 객체를 받아서 TCP Server 를 만들었다. listen 함수를 통해 아이피와 포트를 지정하였다. 아직 살펴본 것은 아니지만 server객체로 부터 request 를 받아서 처리하는 로직을 주도 response 객체를 만들어 전달하면 응답하는 형태일 것이라는 추정이 된다. 아님 말구. ^^

자바스크립트만을 이용해서 어플리케이션을 만들 수 있고, 복잡한 서버 설정을 하는 것이 아니라 코드로 설정 정보를 세팅하는 방식이어서인지 매무 심플하고 명료하다.

관련 API 문서는 한글화 된 버전이 있다.

http://nodejs.sideeffect.kr/docs/

Node.js 관련 잘 정리된 사이트 : http://octoberskyjs.github.io/home/


docker 를 따라가기

어떤 분의 페북글에 docker.io 에 대하여 언급이 나와 이를 찾아보게되었다.

도커(docker)는 기존의 가상화 어플리케이션에서 하드웨어 전체를 가상화하는 것과 달리 리눅스 컨테이너를 활용하고 있는 도커는 아주 빠르고 쉽게 가상화 환경을 사용할 수 있도록 해준다.

http://docker.io

docker 에 대한 발표자료

http://www.slideshare.net/modestjude/dockerat-deview-2013

발표 내용을 보다가 궁금해진 hipache. 분산 프록시

https://github.com/dotcloud/hipache


다시 docker 에 대한 개념 정리... 역시 조대협님!!!

http://bcho.tistory.com/805

이어서 등장한 vagrant

http://bcho.tistory.com/806


다음에 도전하고 싶은 것은

맥북프로를 구매하여 vagrant 와 docker 를 이용하여 개발 장비 구축

Reference

* http://judekim.tistory.com/category/Programmer/Docker



2014년 2월 7일 금요일

ASM 4.0 Guide - 1 Days

1. introduction

1.1 Movivations

ASM 은 자바 바이트코드 엔지니어링 라이브러리(a java bytecode engineering library)으로 다음의 이점이 있다.


  • Program analysis : 파싱에서 부터 애플리케이션의 잠재적인 버그를 찾거나, 사용하지 않는 코드, 역공학에 사용
  • Program generation : 일반 컴파일러나 Just in Time 컴파일러 같이 분산 프로그래밍에서 사용할 스텁, 스켈레톤 컴파일러가 사용할 프로그램을 작성
  • Program transformation : 프로그램을 최적화 하거나 AOP같이 성능 모니터링 이나 디버깅용 코드를 추가
그것도 runtime 시에 가능하다.

1.2 Overview

1.2.1 Model

ASM 라이브러리는 2개의 API 를 제공한다.

  • core API : event based model
- 연속적인 이벤트로 클래스를 표현한다.
- 각 이벤트는 클래스의 특정 구성 요소를 나타낸다.
- 이벤트 기반 API는 사용 가능한 이벤트, 반드시 따라야 하는 순서, 파싱할 엘리먼트 당 하나의 이벤트를 생성하는 클래스 파서, 연속적인 이벤트에서 컴파일된 클래스를 생성하는 클래스 작성기를 제공한다.
  • tree API : object based model
- 객체 트리로 클래스를 표현한다.
- 각 객체가 클래스 구성 요소를 나타낸다.
- 각 객체는 자신의 하위 구성 요소에 대한 객체들을 나타내는 레퍼런스를 가지고 있다.
- 객체 기반 API는 연속적인 이벤트 모델을 객체 트리 모델로 변경하는 하거나 그 반대로 변경하는 기능을 제공한다.
- 객체 기반 API는 이벤트 기반 API를 근간으로 만들어졌다.

이벤트 기반 API가 더 좋다.

- 객체 기반 API 보다 빠르고 메모리 소비가 적다.
- 클래스 변형이 객체 기반 모델 보다 어렵다. 한번에 한 엘리먼트만 조작하니까.


1.2.2 Organization


  • asm.jar
org.objectweb.asm, org.objectweb.asm.signature
event based API
클래스 파서, 클래서 생성기(class writer) 등의 컴포넌트

  • asm-util.jar 
org.objectweb.asm.util

  • asm-common.jar
 org.objectweb.asm.commons
미리 정의해 둔 클래스 트랜스포머

  • asm-tree.jar 
 org.objectweb.asm.tree
object based API

  • asm-analysis.jar 
tree API 기반의 클래스 분석 프레임워크와 미리 만들어 둔 클래스 분석기 제공 

2014년 2월 5일 수요일

레고 시리어스 플레이

우연찮게 페친이 올린 글에서 "비주얼씽킹"이라는 말을 알게 되었다. 아이가 박물관에서 보았던 것들을 한 장의 그림으로 잘 표현한 것이다. 그 그림을 보는 순간 나한테도 저런 정리가 필요해 보인다는 생각이 들었다. 그리고 얼마 안있어 다른 페친이 공유한 "사장84"라는 그림을 보게 되었는데 그 웹 사이트가 "비주얼씽킹" 이었다.

http://www.visualthinking.kr/

그리고 생각정리 워크샵 에 대한 글도 보게되었다. 사실 이 글을 쓰고 있는 현재 갈지말지 고민중에 있다. 거금 10만원이기 때문이다. 그러다가 다른 워크샵이 있다는 것을 알게 되었다. 물론 그것도 10만원 ㅡ.ㅡ;;;

그것이 "레고 시리어스 플레이" 라는 워크샵이다.
어릴적부터 지금까지 레고를 갖고 싶다는 생각만하고 비싸다는 이유로 구매를 망설였던 나에게 엄청난 유혹이었다. 게다가 레고로 회의를 할 수 있다는 것도 매력적이었다. 일단 레고 시리어스 플레이에 대하여 자세히 알고 싶어서 여기저기 검색을 해보았다.

디지털 인사이트 투데이에서 작성한 기사가 있는데 제법 많이 설명한 편이다.


스토리텔링 UX, 레고시리어스플레이


간단한 절차를 요약하면 다음과 같다.

  1. 개별 모델 만들기 = Building Individual Models
  2. 내가 만든 모델 공유하기 = Building Share Models
  3. 시스템 뽑아내기 = Building a System
  4. 랜드스케이프 만들기 = Creating a Landscape
  5. 연결하기 = Making Connections
  6. 의견 말하기 = Playing Emergence and Decisions
  7. 원칙 도출하기 = Extracting Simple Guiding Principles 
정확한 방법은 직접 워크샵에 참여해 봐야겠지만 한번쯤 그냥 실험해 볼 만하다.

꼭 레고가 없더라도 어떻게 해볼수 없을까라는 생각을 하다보니 크롬에서 레고를 사용하여 만들 수 있는 서비스가 최근에 나왔다는 것을 알았다.


바로 들어가서 시작해 본 Build Academy



아직 많이 사용해 보지는 않았지만 이걸 사용할 수도 있겠구나 싶기도 하다.

또 찾은 흥미로운 것이 있는데 레고로 게임을 하는 것이다. 국내에 판매가 되는지는 확인안해 봤지만 레고와 이미지 인식 기술을 이용한 게임. Life of Georage


처음에는 "비주얼씽킹"에 대한 생각이 이렇게 번져버리고 말았다. 나중에 한번씩 다 해보고 싶다.

Reference
* 레고 시리어스 플레이 워크샵 후기 : http://story.pxd.co.kr/778
* 아이폰과 레고 : http://story.pxd.co.kr/512
* 돈 없이 즐기는 레고 ... : http://thebluexpanse.tistory.com/383

2014년 2월 4일 화요일

오픈 소스 관련 기사

올 한 해 계속 기억해야 할 오픈소스 수퍼 루키 10선

위 링크 기사 요약 정리

애피엄

애피엄(Appium, http://appium.io )은 네이티브와 하이브리드 모바일 앱을 위한 오픈 소스 테스트 자동화 프레임워크다.

다커

다커(Docker, https://www.docker.io)는 오픈소스 프로젝트 루키에게는 드문 유형의 흥분을 자아내왔다. 다커는 모든 애플리케이션의 경량, 이동형, 자족식 컨테이너의 손쉬운 생성을 가능하게 하는데 있다.

엑서시즘

엑서시즘(Exercism, http://exercism.io)은 프로그래밍 언어를 배우는 이들을 위한 협력적 교육 툴로, 학생들의 협동학습을 지원하기 위해 미국 콜로라도주의 작은 기술학교 강사인 카트리나 오웬가 시작한 이후 큰 성공을 거뒀다.

고스트

웹상에 콘텐츠를 퍼블리시한다는 한가지 목표만을 설정하고 있는 고스트(Ghost, https://ghost.org)는, 아름답게 설계되었고, 완벽히 커스터마이징 가능하며, 완전히 오픈소스다. 코스트는 사용자 스스로 블로그를 작성하고 포스트할 수 있게 해줘 이를 쉽고 심지어 재미있게 할 수 있게 만드는 툴을 제공한다.

인플럭스DB

인플럭스DB(InfluxDB, http://influxdb.org)는 시계열, 이벤트, 메트릭스 데이터베이스다. 고(Go)로 작성되었으며 외부 의존도가 없어서 한번 설치하면 더 이상 관리할 필요가 없다는 점에서 레디스(Redis), H베이스(Hbase) 등과 다르다.

오픈데이라이트

오픈데이라이트(OpenDaylight, http://www.opendaylight.org)의 목표는 다른 요소 없이 직접적으로 배치할 수 있는 완전하게 기능적인 SDN 플랫폼을 제공하는 것이다.

오픈사물인터넷

오픈사물인터넷(OpenIoT, http://openiot.eu)는 유럽연합 집행위원회의 자금지원을 받은 연구 프로젝트로 클라우드 컴퓨팅 제공 모델을 활용하는 새로운 오픈, 대규모, 지능형 사물인터넷 애플리케이션을 새롭게 총체적으로 활성화하는 것이 목표다.

서버스펙

서버스펙(Serverspec, http://serverspec.org)은 다른 모든 구성 관리 툴과 독립적으로 서버 구성을 테스트하는 단순한 접근방식을 제공한다.

톡스

프로젝트 톡스(Tox, http://tox.im)는 AIM, 스카이프(Skype)등을 대체하기 위한 보안 IM과 영상채팅 애플리케이션이다.

X프라이버시

X프라이버시(Xprivacy, https://github.com/M66B/XPrivacy)는 애플리케이션을 통한 데이터 유출을 막기 위해 만들어졌다. 앱에 가짜 데이터를 피딩하거나 아예 데이터를 들이지 않는 방식으로 애플리케이션이 접속할 수 있는 데이터 카테고리를 제한시킨다.

플라이트

플라이트(Flight, https://www.ohloh.net/p/flightjs)는 웹 애플리케이션에 데이터 렌더링이나 제공에 특정 접근방식을 규정하지 않는다는 점에서 다른 자바스크립트 프레임워크들과 다르다.

Front-end Framework & Javascript Framework

Front-end Framework 와 Javascript Framework 에 대하여 찾아둔 것을 정리해 본다.

Front-end Framework



Twitter Bootstrap

Foundation

Skeleton

HTML5 Boilerplate

HTML KickStart

Reference

* http://designinstruct.com/roundups/html5-frameworks/
* http://usablica.github.io/front-end-frameworks/compare.html

Javascript Framework


Reference

* http://www.infoq.com/research/top-javascript-mvc-frameworks?utm_source=infoq&utm_medium=popular_links_homepage
* http://matthiasschuetz.com/javascript-framework-matrix/en/
* http://designemerald.com/inspiration/javascript-mvc-frameworks/


2014년 2월 3일 월요일

심심할 때 새로운 언어에 대하여 배울 만한 사이트

스터디 그룹 패턴

스터디 그룹을 만들고자 할 때 봐두면 좋은 글


스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)

글쓰기가 안되는 나를 위한 4단계 작문법 리뷰

오늘 일과를 마무리하면서 나의 이슈와 관련된 글을 정리한다.

Reference : 글쓰기기 안되는 이들을 위한 4단계 작문법


  • 1단계 자유롭게 쓴다 : 이왕이면 영감이 떠오르는 환경을 만들고...
  • 2단계 버릴걸 버린다 : 정신과 체력이 좋을 때...
  • 3단계 논리적 순서를 만든다 : 많은 시간이 소요되니 각오하고...
  • 4단계 사소한 것까지 따지기 : 까칠해 지니 주변에 지인을 두지 말고 ^^

2014년 2월 2일 일요일

람다 아키텍처(Lambda Architecture)

우연잖게 찾게 된 람다 아키텍처(Lambda Architecture)
제대로 기억해 두기 위하여 글로 남겨둔다.

람다(Lamdba)는 도대체 무엇인가?
람다 대수라는 정의가 있고 람다(λ)에 대한 다양한 쓰임을 설명한 것도 있다. 간단하게는 축약 함수라는 단어로 설명하기도 한다.
또 Java 8 에 적용될 람다의 경우 병렬 처리를 위한 작업 함수를 정의하는 간결한 방식이라고 설명할 수 있다.
람다 아키텍처도 병렬 처리에 대한 간력한 방식을 설명하고 있는 것이라고 볼 수 있다.

우선 아키텍처의 High-Level 개념도를 살펴보자.



개념도를 살펴보면 batch layer 에서 배치 작업을 통해 데이터를 생산해 내고 serving layer 에서 데이터를 조회할 수 있다. 물론 배치 작업이 이루어지지 않은 부분에 대하여 speed layer 에서 조회할 수 있다. 조회된 2개의 데이터 덩어리를 merge 하면 원하는 데이터를 얻는다는 것이 람다 아키텍처의 내용이다.

빅데이터가 나오면서 람다 아키텍처에 대한 사항이 많이 나왔지만 예전부터 쓰던 방식이다. 예를 들어 일별 통계 데이터와 실시간 통계 데이터에 대한 것을 들수 있다. 전일까지의 데이터는 새벽 배치작업을 통해 작업해 두고 당일 데이터는 실시간으로 조회할 수 있도록 하여 SQL 문에서 union 을 통해 데이터를 조회하도록 하는 방식이다. 이렇게 생각하면 람다 아키텍처는 쉽게 이해할 수 있을 것이다.

조금 더 상세한 내용을 살펴보도록 하자.

  • Batch Layer

더 이상 변하지 않는 데이터들에 대하여 배치 작업을 통해 결과 값을 저장해 둔다.
가능하다면 변하지 않는 데이터들이어야하나 실무에서 수작업이라는 엄청나게 무서운 일들이 발생하는 경우가 있어 가능하다면 수동으로 재작업이 가능하도록 만들어 두는 것이 좋다.


  • Serving Layer


배치 작업을 통해 저장된 Batch View 에 대하여 조회할 수 있도록 제공한다. 데이터에 대한 업데이트는 반드시 Batch Layer 의 배치작업을 통해 이루어져야 한다. Batch Layer 에서도 언급하였지만 실무에서는 뜻하지 않은 수작업이라는 것이 존재한다. 절대로 Batch View 에 대하여 직접적인 작업을 하지 말아야한다. 건드리는 순간 쓰레기가 된다. 굳이 하자면 원본 데이터를 수정하고 Batch Layer 에서 배치작업을 수동으로 하여야한다. 가능하다면 이런 수작업을 하지 말아야 한다.

  • Speed Layer
일반적인 데이터 조회 기능을 제공한다. 다만 배치 작업을 통해 생성된 Batch View 와 중복되는 데이터가 없도록 처리하는 것이 중요하다. 그리고 실시간 데이터 조회를 처리하므로 되도록 퍼포먼스에 대하여 신경을 써야한다. 퍼포먼스를 위하여 많은 부분을 Batch Layer 으로 넘겨 처리를 하거나 조회 쿼리에 대하여 훌륭하게 튜닝해두면 된다.

아래는 빅데이터 처리에 적용한 람다 아키텍처 예이다. 실제 빅데이터에서 어떻게 사용하는지 조금더 구체적인 사항들이 나와있다.


어설픈 설명이지만 일단 이렇게 정리를 해둔다.
차후 직접 만들어 볼 기회가 있다면 이를 바탕으로 만들어보고 구축 경험을 더 정리해 보자.



reference
* http://lambda-architecture.net/
* http://www.databasetube.com/database/big-data-lambda-architecture/
* http://www.datasciencecentral.com/profiles/blogs/lambda-architecture-for-big-data-systems

Open Sources Library 정리

Apache Reference

Apache Commons : http://commons.apache.org/
Component
Desc
Commons BeanUtils
Easy-to-use wrappers around the Java reflection and introspection APIs.
Commons Codec
General encoding/decoding algorithms (for example phonetic, base64, URL).
Commons Collections
Extends or augments the Java Collections Framework.
Commons DBCP
Database connection pooling services.
Commons Digester
XML-to-Java-object mapping utility.
Commons FileUpload
File upload capability for your servlets and web applications.
Commons IO
Collection of I/O utilities.
Commons Lang
Provides extra functionality for classes in java.lang.
Commons Logging
Wrapper around a variety of logging API implementations.
Commons Pool
Generic object pooling component.

Apache HttpComponents : http://hc.apache.org/

Other

Mock

Xml

cache

UI

Json

AOP

SSH

Apache Axis
  • Apache Axis is an implementation of the SOAP ("Simple Object Access Protocol") submission to W3C
  • http://axis.apache.org/axis/
  • 의존라이브러리
    • axis-jaxrpc : javax/xml/rpc
    • aixs-saaj : javax/xml/soap
    • axis-wsdl4j : JWSDL (IBM Corporation)

Code Generation Library

Oracle Coherence

Ajax

Guava
  • The Guava project contains several of Google’s core libraries that we rely on in our Java-based projects
    • collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, and so forth.
    • Each of these tools really do get used every day by Googlers, in production services.
  • https://code.google.com/p/guava-libraries/wiki/GuavaExplained?tm=6

DataBase

Jfree

Restful

Java Mail

Apache POI

logging

Javascript

OGNL
Quartz
UUID
Velocity
XStream
Zip4j

Open Source Framework 정리하기

반응형 웹 UI 프레임워크 (reference : http://gokgo.tistory.com/96)

웹 프레임워크 (reference : 웹 프레임워크 조사)

Javascript (reference : http://html5experts.kr/archives/2039)

Other
  • JADE : http://jade.tilab.com/
    • JADE (Java Agent DEvelopment Framework)는 Java기반 다중 에이전트 시스템 개발을 돕는 미들웨어이며 Framework 이기도 하다. 국제적인 통신사들(Telecom Italia)을 위주로 개발/사용되고 있는 듯하며, 2013년 3월 29일 4.3.0 version이 배포될 정도로 현재 활발하게 진행 중인 open source project 이다.