Skip to main content

Posts

Showing posts from 2013

Mediator 중재자

Mediator 객체들 간의 의사소통을 하나 이상의 중재자들이 중재한다. 구성은 Mediator <-> Colleague 예를 들어, 어떤 폼에 버튼과 텍스트 박스가 있을 경우, 버튼이 직접 텍스트 박스를 접근하지 않고, 폼에 작업 요청을 하는 것이다. 버튼에 이벤트가 발생하면, 이를 폼에 전달하여, 폼에서 처리하도록 하는 것이다. 각 객체의 상태에 따라 서로의 상태를 바꾸게 되는데 이 작업을 각 객체들이 대상 객체를 직접 참조하여 상태를 파악하거나 상태를 변경되게 되면, 밀결합이 된다. 그리고 소스 코드가 아주 복잡해지고, 수정 작업이 매우 까다로워진다. 달리 말해, 일부 기능 수정에 따른 타 기능 영향(side effect)이 급격하게 증가하게 된다. 당연히 유지보수 비용은 늘어난다. 이 때, 중재자라는 놈을 이들 사이에 주입한다. 그리고 이들 간의 요청을 중재자에 요청을 하고, 중재자는 모든 객체의 상태를 알아내어서, 조치를 취한다. 구현 방법 1. 관련 colleague들이 하나의 mediator와만 동작한다면, mediator인터페이스는 필요없다. 2. 감시자 패턴을 이용하여, 구현할 수 있다.   colleague에서 상태 변화가 일어날 시, 이를 중재자에 통보하고, 중재자는 처리 방법에 따라 다른 colleague에 이 변경을 전달한다. 3. mediaor 클래스 내에 특화된 통지(notification) 인터페이스를 정의하여, colleague 들이 직접 서로 통신(위임 방식)하게 할 수 있다.

Adapter Pattern

Adapter Pattern wrapper라 불리기도 한다. 개념 기존 클래스를 사용하고 싶은데, 인터페이스가 맞지 않을 때, 이 수법을 사용한다. 예, 110볼트 어댑터를 220볼트 어댑티에 연결할 때, 우리는 변환 어댑터를 끼워사용한다. 적용 사례 인터페이스는 상속을 받고, 구현은 상속하지 않는다. 장단점 요약

Facade Pattern

퍼사드 패턴 Facade Pattern 개념 서브시스템들 사이의 의사소통 및 종속성을 최소화한다. 일단의 서브시스템의 기능성을 단순화된 하나의 인터페이스를 제공한다. 이 인터페이스를 public API, 서브시스템의 각 기능을 private API로 볼 수 있다. 적용 사례 예를 들어, 로그인 처리에 대해서 알아보자. 사용자가 아이디와 패스워드를 입력하고 로그인 버튼을 클릭하면, WAS 측의 로그인 public API가 호출된다. 이 때, 로그인 처리에 필요한 일단의 복수 기능이 호출된다. 이 기능은 계정 유무 판별, 계정 정보, 게임 머니, 오늘의 한마디, 친구 목록, 주간 랭킹 정보등을 들 수 있다. 모든 기능이 처리된 후, 그 결과를 메시지 등의 형태로 클라이언트에 전달된다. 이를 퍼사드 패턴이라 불리고, 로그인 public API가 창구역할(transaction manager)를 하는 인터페이스이고, 그 외를 서브시스템으로 볼 수 있다. 장단점 1. 서브시스템의 구성요소를 보호하고, 은폐할 수 있다. 2. 서브시스템과 사용자 코드 간의 결합도를 약하게 한다. 3. 서브시스템의 재활용도가 높아짐. 요약 객체지향언어에서의 추상클래스의 개념과는 관계없음을 주의하자. 단순히, 하나의 목적을 달성하기 위해, 하나의 함수에서 여러 복잡한 서브시스템를 호출하고, 그 결과를 돌려주는 개념이다.

책임 연쇄 패턴 Chain of responsibility

책임 연쇄 패턴(Chain of Responsibility) 개념 메시지를 보낸 객체와 이를 받아 처리하는 객체 간의 결합도를 없애기 위한 패턴이다. 요청을 처리할 수 있는 객체를 여러 만들고, 요청을 송신하는 객체와 그 요청을 수신하여 처리하는 객체 사이의 결합을 피하는 패턴이다. 그리고 요청을 수신할 수 있는 객체를 연쇄적으로 묶고, 실제 요청을 처리하는 객체를 만날 때까지 고리를 따라 요청을 전달한다. 말이 좀 어려운데.. 이렇게 생각하면 알기 쉽다. 이 해동 패턴은 누군가에게 책임을 떠 넘기는 일이다. 예를 들어, 복리 후생에 관련된 문의가 있어서, 인사과 개똥이 과장에게 문의한다. 개통이 과장이 알면 답변할 것이고, 아니면 멍멍이 과장에게 문의하라고 할 것이다. 그럼 또 마찬가지로 멍멍이 과장에게 문의하면 그는 답변을 하던지 혹은 다른 이에게 문의하라고 할 것이다. 그리고 이 반복은 문의가 완료될 때까지 반복된다. 적용 사례 프로그래밍 관점에서 한번 보자. 어플리케이션이 있고, 그 속에 다이어로그 창이 있다. 그리고 그 창에는 버튼이 있다고 치자. 그리고 모든 컴포넌트에는 도움말 처리 기능이 있다고 하자. 클래스 구성요소와 종속성은 아래와 같다. 다음은 예제 코드이다. 1 Application* application = new Application(message); 2 Dialog* dialog = new Dialog(application, "다이어로그 도움말"); 3 Button* btn = new Button(dialog, "버튼 도움말"); 이 경우, 버튼에서 도움말 요청을 하면, 버튼 도움말이 표시될 것 이다(3번 행에서 설정되어 있으니깐). 하지만, 도움말이 설정되어 있지 않는다면, successor인 다이어로그의 도움말이 처리된다. 장단점 장점 1. 객체 간의 행동 결합도가 현저히 낮아진다. 즉, 객체들 간의 상호 작용 과정을 단순

Command Pattern

Command Pattern 명령 패턴은 요청 자체를 캡슐화하는 것이다. 서로 다른 요청을 매개변수로 만들고, 원하는 처리를 수행한 후, 되돌릴 수 있는 연산을 수행한다. 요청 자체를 객체로 바꿔서, 명시되지 않은 응용 프로그램 객체의 요청을 처리할 수 있도록 지원하는 패턴이다. 그리고 이 객체는 저장되거나 전달될 수 있다. 이 패턴의 핵심은 연산을 실행하는 데 필요한 인터페이스를 선언해 놓는 Command 추상 클래스이다. 이 클래스의 가장 기본 연산은 Execute()이며, Command 추상 클래스에서 상속 받은 서브클래스들은 수신 객체에 대한 참조자를 인스턴스 변수로 저장하고, 이 수신 객체에 정의된 요청을 호출하도록 Execute()를 구현하여, 수신자 - 작동 쌍의 정의한다. 예를 들어, 홈 오토메이션 리모컨이 있고, 이 리모컨으로 모든 가전 제품을 제어할 수 있다고 했을 때, 리모컨은 receiver가 되고, 각 가전 제품은 concreteCommand가 된다. command class에는 execute가 있고 receiver에서는 각 구현 클래스의 execute함수를 호출한다. 참조문헌 1. GoF 2. http://valley.egloos.com/viewer/?url=http://liepooh.egloos.com/1096056

SAStruts란

SAStruts 개요 Struts는 Spring Framework 다음으로 많이 사용되고 있는 FrameWork이다. Struts는 프레임워크로 강력한 기능을 제공한다. 하지만, 개발 과정에서 부수적인 설정 작업이 개발자들을 힘들게 했다. 이 문제를 해결하기 위해, 일본 개발자 커뮤니티 Seasar(일본 오키나와의 전설 동물, 우리나라의 해태와 비슷^^) 에서 개발한 프레임워크가 SAStruts(Super Agile Struts)이다. 아래 아키텍처 그림과 같이, SAStruts의 모태는 Struts이다. 다만, 상기한 복잡하고 까다로운 설정 작업을 그림2와 같이 SAStruts가 개발자 대신 내부적으로 처리해 준다. 예를 들어, Struts는 항상 struts-config.xml을 읽고 Action 클래스를 호출한다. 이 때문에, 개발자는 소스 코드를 수정한 후, 늘 struts-c onfig.xml 파일을 검토 또는 수정해야 한다. 또한, 대형 프로젝트일 경우는, 이 struts-config.xml 파일이 경합을 자주 일으킨다. 이는 실로 개발자의 스트레스 치수를 높이는 원인이다. 반면, SAStruts는 이 번거로운 작업을 알아서 처리해 준다. 아리가또~~~ 입니다. 그림1 Struts 아키텍처 그림2 SAStruts 아키텍처 그럼, 이 번거로운 작업을 SAStruts는 어떻게 처리하는 것인지 궁금할 것이다. 그것은 Java의 annotation기술을 이용한 점이다. 예를 들어, @Execute, @ActionForm, @Resource 등 Seasar 커뮤니티에서 제공하는 Dolteng 플러그인을 사용하면, SAStruts 개발이 더욱 효율적이다. SAStruts 프로젝트는 다음과 같은 패키지 구조로 형성된다. [root package].action Action 클래스 [root package].condition 데이터베이스에 엑세스하는 조건 설정 [root packa

BigData

최근 빅데이터라는 말을 많이 사용한다. 그럼 한번 빅데이터에서 대해서 간략하게 공부해 보자. 빅데이터 구글 닥스

OpenFlow Tutorial

OpenFlow Tutorial OpenFlow의 기본적인 개념을 익혔다면, OpenFlow 공식 사이트에서 제공하는 Tutorial를 따라해봄으로써, 개념을 더욱 견고하게 만들자. OpenFlow tutorial http://www.openflow.org/wk/index.php/OpenFlow_Tutorial

SDN(OpenFlow) 개요

OpenFlow는 SDN(Software Defined Network)의 하나의 콤포넌트이다. 아래는 2013/3/13 오픈프로우 코리아 주최로 열린 한국 SDN Interest Group 4번째 정기세미나의 내용이다. 다음에는 꼭 모임에 참석하고 싶다. SDN Architecture including OpenFlow 위 그림에서와 같이, Control Layer부분과 Application Layer부분이 최근 활발히 연구개발되고 있다. 그 중 Control Layer부분은 Controller가 많은 비중을 차지 하는데, 다음 절에서와 같이 이미 많은 벤더들이 많은 OpenFlow 기반의 Controller를 제공하고 있다. 그외 소규모 벤더들은 Controller가 아닌 Application Layer에서 보안, 로드벨런싱, 홈네트워크 등의 서비스가 지원되는 제품 개발에 힘쓰고 있다. SDN에서는 Router라는 명칭 대신, Switch라는 명칭을 사용하는데, 이는 Router보다 더 단순한 기능을 수행하고, 기존 레거시와 차별화를 위해 명명된 것으로 보인다. 또한, Switch를 반드시 벤더로부터 구매할 필요가 없다. 상황에 따라 리눅스 등의 운영체제를 기반으로 자체 개발이 가능하다. Controllers의 종류 SDN의 Controller 가운데 Open Source로 운영되는 것은 다음과 같다. 대부분 Java언어로 구현되어 있다. 따라서 플랫폼 또는 인프라 개발자라면 Java에 능숙해야 한다. NOX C++/Python Beacon Java Floodlight Java Maestro Java RouteFlow NOX, Quagga 보안을 위한 Open Source FortNOX Java 기반의 SE-FloodLight  공격 감지  인증  스위치의 Flow 처리 성능 고려 FRESCO OpenFlow Controller와 OpenFlow

grub.conf

grub.conf파일은 GRUB 부팅환경 설정 파일 /boot/grub/grub.conf 에 존재함 /boot/grub/menu.lst -> ./grub.conf >cat grub.conf kernel=해당 메뉴로 부팅할 때에 커널의 이미지파일 경로를 지정 initrd initrd로 사용할 이미지 파일을 지정

NoSQL

NoSQL과 NewSQL NoSQL: 분산 아키텍처의 확장성, 스키마 없는 데이터 관리가 특징이며, 기존 SQL과 다르다. NewSQL: 분산 아키텍처의 확장성하거나, .... 종래의 관계형DB에서 관계 속성이 지니는 구속적인 개념에서 벗어남. 예를 들어, 스키마 제약으로 인한 필드 값의 제한적이 사용이 예로 들 수 있다. 일관성보다는 가용성과 확장성에 중점을 둔 정장 방식을 취함. 오픈 소스 중에서 얼랭(Erlang)으로 제작된 CouchDB와 MongoDB가 있다. 얼랭은, 상업적 함수 기반 언어로, 속도가 빠르고, 언어 자체적으로 분산을 지원한다. 따라서 별도의 쓰래드 모델을 사용하지 않는다. MongoDB의 특징 은 다음과 같습니다. 0. 문서기반이다. 1. 빠르고 사용하기 쉽다. 2. RDBMS의 범위쿼리, 보조색인, 정렬 같은 관계형 연산 기능과 MapReduce같은 집계연산 기능을 동시에 지원한다. 3. 다양한 언어를 지원한다.(C, java, 파이썬... 등 약 10여개의 언어에 맞는 드라이버 제공) 4. C++로 작성되었다. 5. 수평적 무한확장 가능하다. 6. 데이터는 bson형태로 저장된다.(binary json) 7. 구조적이지 않다.(RDBMS처럼 데어터를 분석해서 모델링을 상세하게 할 필요가 없음, 스키마가 없음) 구조적/개발자적 관점으로 보면 다음과 같습니다. 1. 객체 형태의 컬렉션 기반 저장소 2. 동적 쿼리 지원 3. 내부 객체를 지원하는 Full index 지원 4. 쿼리 프로파일링 5. 복제, fail-over 지원 6. 비디오파일 과 같은 바이너리 데이터의 효과적인 저장소 7. 클라우드 기반의 자동화된 공유 MongoDB도 여타의  NoSQL 처럼 테이블, 로우, 컬럼등이 존재하지 않습니다. 저장의 최소단위는 Document 이며 이는 RDBMS의 로우와 비슷하다고 보면됩니다. 각 Document는 RDBMS의 테이블

ctags in OSX 10.8

기본 ctags는 사용하기 불편하다. 그래서 보통 exuberant ctags를 사용한다. 먼저 exuberant ctags 공식 사이트(http://ctags.sourceforge.net/)에서 최신 릴리즈를 다운받는다. 다운받은 후, 압축 해제하고, ./configure make sudo make install로 인스톨한다. 그런데 여기서 문제가 된다. which -a ctags로 ctags 실행 파일의 경로를 검색하면 기본 ctags와 exuberant ctags가 나온다. kinui-MacBook-Pro:ctags-5.8 suninno$ which -a ctags /usr/bin/ctags /usr/local/bin/ctags /usr/local/bin/ctags가 우리가 사용하고 싶은 exuberant ctags이므로 다음과 같이 PATH 순서를 수정하자 export PATH="/usr/local/bin:$PATH" in ~/.bash_profile PATH가 수정된 후, 커맨드라인에서 ctags --help를 치면 다음과 같은 결과가 나온다. kinui-MacBook-Pro:ctags-5.8 suninno$ ctags --help Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert   Compiled: May 17 2013, 05:02:22   Addresses: , http://ctags.sourceforge.net   Optional compiled features: +wildcards, +regex ..... (생략)

struct 복사

struct(구조체)를 복사할 경우, = 로는 아무리 해도 먹지 않는다. 아래와 같이 메모리에 있는 내용을 통체로 복사해야 한다. memcpy(dest, src, sizeof(desc)); 이건 오브젝트 지향 프로그래밍이 아니다는 점을 상기할 것.

맥OS 사전에 사전 파일 추가하기

1. http://code.google.com/p/mac-dictionary-kit/에서 sdconv를 다운로드 받는다. 2. e4u 등과 같은 사전 파일(stardict 형식)을 다운받는다. 3. 사전 파일의 압축을 풀면, e4u.ifo, e4u.dict.dz, e4u.idx와 같은 파일이 보인다. 4. sdconv 디렉터리 내의 convert 실행 파일로 convert e4u.ifo를 실행한다. 5. 위 과정이 완료되면 아래와 같이 사전에 e4u가 추가된 점을 확인할 수 있다. 6. 순서를 조절하여 사용하면 된다.

14일 만에 우울증을 고친다.

남을 돕는 일은 나 자신을 기쁘게 하고 즐겁게 하여, 걱정 따위를 할 틈을 없앤다. 날마다 어떻게 하면 남을 즐겁게 할 수 있을까를 생각하고, 실천하라 우울증이란, 남에 대한 장기적인 분노이며 비난과 같은 일이다. 그러나 우울증 환자는 보호나 동정, 지지를 얻고 싶어서 죄의식에 깊이 잠겨 있다. 남에게 끊임없이 관심을 가져라. 주위 사람에게 관심을 갖지 않는 사람은 반드시 인생에서 고난을 겪으며 남에게 큰 위해를 끼친다. 모든 인생의 실패는 남에게 관심을 갖지 않는 사람에게서 일어난다. 일일일선一日一善 선행이란, 남의 얼굴에 미소를 짖게 하는 일이다. 남을 기쁘게 함으로써 자신의 번뇌와 공포등의 우울증의 원인을 잊게 만든다. 그리고 남을 기쁘게 하면 자신의 우울증을 날려 버린다. 자신이 행복해지고 싶다면, 먼저 남을 행복하게 해줘야 한다. 또한, 행복은 다른 사람에 전염된다. 남을 돕고 사랑함으로써 고민과 슬픔, 자기 연민을 극복하고 다시 태어나게 한다. 아침 출근 길에 거리에서 만나는 사람부터 지금 당장 진심어린 관심을 보여라. 이렇게 하면, 자신에게 더 큰 행복, 더 큰 만족과 자신만이 생긴다. 남에게 선행을 배푸는 일은 의무가 아니라 기쁨이다. 그리고 이는 실천하는 이에게 건강과 행복을 증지시킨다. -짜라투스트 남에게 선을 베풀 때, 인간은 자기 자신에게 최선을 다하는 것이다. - 벤자민 프랭클린 타인에 대한 배려는, 자기 자신의 고민에서 스스로를 구출할뿐만 아니라, 많은 친구를 만들어 큰 즐거움을 얻게 한다. 진심된 맘으로 남에게 관심을 보이고 칭찬하라. 그러면 그들은 그 관심으로부터 기분이 좋아진다. 그리고 이는 그들을 기쁘게할뿐만 아니라, 나 자신을 행복하게 한다. 장미를 선물한 사람의 손에는 향기가 남아 있다. - 중국 속담 자기 자신만을 생각하는 이는 인생에 있어서 많은 것을 얻지 못할뿐만 아니라 반드시 비참해진다. 그러나 남을 위해 봉사하는 이는 인생에서의 즐거움을 얻는다. &qu