OSX 자바 복구

맥에 java 버전 가지고 이런저런 장난 치다가 실수로 맥에 기본으로 설치된 자바VM 날려먹고 새로 다운로드 받은 java들도 설치가 안되는 난감한 상황이 되었다.

다행히 당황하지 않고 구글링해서 복구를 빡! 끝!

OSX 자바 복구

1. /System/Library/Java , /System/Library/Frameworks/JavaVM.framework, /Library/Java 완전 삭제

rm -rf /System/Library/Java
rm -rf /System/Library/Frameworks/JavaVM.framework
rm -rf /Library/Java

2. http://support.apple.com/kb/DL1572 에서 apple이 제공하는 java 1.6 dmg 다운로드 및 설치
3. terminal에서 자바 버전 확인을 빡! 끝!

Oracle Java 1.7로 업데이트

  1. http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 에서 oracle java 1.7 dmg 다운로드 및 설치
  2. terminal에서 자바 버전 확인을 빡! 끝!

최고의 루비 버전 관리 툴 rbenv

최근에 발견한 루비 버전 관리툴 rbenv

rvm보다 설치하기 쉽고 사용하기도 쉽고 편리하다.

rvm과 달리 시스템 설정쪽을 전혀 건드리지 않는다는 점은 정말 최고다!

플러그인 ruby build 까지 함께 설치해서 사용하면 더욱 최고!

https://github.com/sstephenson/rbenv

https://github.com/sstephenson/ruby-build

루비 개발자라면 강추! 강추! 강추!

1. 분할정복(divide and conquer) 알고리즘

요즘 알고리즘 공부하면서 느끼는 가장 어려운점은 해결해야할 문제에 적용할 알고리즘을 선택하는 과정이다. 사실 적용할 알고리즘을 찾았어도 해당문제에 맞게 변형하여 적용하는것이 진짜 어려운데 난 머리가 나빠서 그런지 먼저 적용할 알고리즘을 선택하는 과정에서도 골치를 섞는다. 그래서 나름 요령을 정리해보기로 했다.

사실 ‘알고리즘 문제 해결 전략’ 책을 보면 다양한 알고리즘들의 원리와 적용 대상이 상세히 나오긴 하는데 매번 수페이지나 되는 내용들을 들춰보기도 힘들고 해서 나름 한두줄 정도로 정리한 요약 판을 만들어 보면 어떨까 하는 생각이 들었다.

뭐 얼마나 쓸모있을지는 알 수 없지만, 안하는것보다 나을거 같으니 일단 분할정복부터 시작해본다.

분할정복(divide and conquer)

개요

문제의 범위를 더 작은 단위로 쪼개어 해결한 뒤 각각의 중간 결과를 합하여 최종 결과를 도출하는 문제풀이 기법이다. 대표적인 사례는 머지소트와 퀵소트이다. 문제를 해결하는 함수 f(n)를

 { f(1) = c , f(n) = C + 2f(n/2) }

의 형태로 변형할 수 있을 때 적용할 수 있다. 그냥 말로는 쉬운데 실제로 적용 포인트를 찾는게 생각보다 어렵다.

설명

보통 O(n2)의 시간이 걸리는 계산(함수)를 O(nLog(n))시간대로 최적화 할때 분할정복을 사용할 수 있다. O(n2)의 시간이 걸리는 함수의 계산 과정을 다음을 만족하는 계산과정으로 변형하면 분할정복이 가능하다.(사실은 가능할거 같다 -.-; 그냥 깔짝깔작 공부하나 얻은 요령이다보니 수학적 근거는 없다.)

  1. 함수내에 중간 결과를 처리하는 과정(A라 하자)가 있다.
  2. A가 한번 수행되면 현재의 데이터는 두개로 나뉘어지고 각각 나누어진 데이터들은 상호 완전히 독립되어(배타적이라고 해야하나?) 다시 A에 적용된다.

분할정복의 대표적인 예인 퀵소트를 살펴보면 pivot 값을 기준으로 정렬할 데이터를 나누는 과정 A가 있고 이 A가 수행될 때마다 데이터는 pivot을 기준으로 자연스럽게 좌,우로 나뉘어져 2를 만족한다. 다음 계산에서 pivot을 기준으로 좌우로 나뉜 데이터는 각각 독립적으로 다시 A가 적용되며 정렬이 반복된다. 이런 방식으로 A과정이 N번 반복될때마다 2n개의 정렬된 원소들을 얻으며 최종적으로 O(nLog(n))의 시간을 얻을 수 있다.

셀렉트 소트와 비교를 하며 생각해 보면 이해가 쉽다.

셀렉트 소트

  1. 전체배열을 한번 비교하여 가장 작은 원소를 찾는 select 과정을 A라고 하면 n번째 수행에서 (배열크기-n)의 시간을 소요하여 결과적으로 O(n) 시간 소요한다.
  2. A가 n번 반복될때마다 1개의 정렬된 원소를 얻으므로 이것을 n-1번 반복하여 정렬된 결과를 얻는다. 최종 결과로 O(n2)시간을 소요한다.

퀵소트

  1. pivot기준으로 원소를 좌우로 나누는 계산을 A라고 하면 A는 n번째 반복마다 n개로 쪼개진 영역별로 수행 되어 평균 (배열크가-전체pivot갯수) 시간 소요한다. 결과적으로 O(n) 시간을 소요한다.
  2. A가 n번 반복될때마다 데이터가 2n개의 구역으로 나뉘며 다음계산에서 나뉘어진 구역마다 A를 수행하여 2n개의 정렬된 원소(pivot)를 얻는다. 총 수행 시간은 2n을 역산한 log(n)으로 최종 결과로 O(nLog(n))의 시간을 소요한다.

맺음

개인적인 생각으로 분할정복으로 문제를 풀때 가장 중요한건 A를 잘 만드는것 같다. 사실 A가 제대로 만들어지면 2는 자연스레 해결된다. 반면 2의 데이터를 나누는 기준을 아무리 잘 잡아도 A가 똥망이면 O(n2)이 되는 처참한 결과를 얻을 수도 있다.

한번은 문제 풀면서 정말 생각없이 A를 만들었더니 대충 O(n3)의 결과가 나왔었다. 털썩….

몸 만들기 시작

일주일에 한번 회사 검도동호회에 나가 운동을 하는데 기초가 부족해서 그런지 실력이 잘 늘지 않는다. 요래선 안되겠다 싶어 새로 운동계획을 짜봤다. 20대 일때 비해 배도 슬슬 나오고 몸무게도 늘고 조금씩 둔해지는 느낌이 드는게 더 게으르게 살았다가는 머지않아 80키로를 쉽게 돌파할거 같다.

학생시절 한창 운동하던 때의 기억을 더듬으며 운동계획을 조금 강하게 짜봤다.  구글캘린더에 일정 등록해놓고 아이폰으로 동기화 하면서 체크하니 의외로 관리가 편하다.

일단 월요일부터 이틀 했는데 중량을 아직 약하게 해서 그런지 후유증(?)은 몸 약간 뻐근한 정도로 버틸만 하다. 생활패턴이 몸에 배면 근력 운동별로 중량을 계속 늘려가야할것 같다. 오늘이 삼일째니까 작심삼일은 돌파했다.

역시 난 의지의 남자!

최종 목표는 남자답게 벤치프레스 100키로를 목표로…. @_@

  • 월요일
    • 오후 검도 동호회 운동 참석
  • 화요일
    • 준비운동 및 러닝 30분
    • 상체 근력 운동 40분
  • 수요일
    • 준비운동 및 러닝 30분
    • 몸통 근력 운동 40분
  • 목요일
    • 검도 개인 연습 (혹은 주짓수)
  • 금요일
    • 준비운동 및 러닝 30분
    • 하체 근력 운동 40분
  • 토요일
    • 주짓수 오전 클래스
  • 일요일 휴식

3~4달 하고나면 몸이 곯던가 몸짱이 되던가 둘중 하나일듯….

정규표현식 정리

원본은 http://www.nextree.co.kr/p4327/

지금까지 본 정규식 관련 자료중 가장 정리를 잘 해놓은 곳인거 같다.

특히 표현식 설명해주는 테이블이 너무 이쁘다! 엔간헤선 소유욕이 발동하지 않는데 하앍! 가지고싶어!

그래서 퍼왔……문제되면 삭제하겠습니다……

jhkim-140117-RegularExpression-06

jhkim-140117-RegularExpression-07

jhkim-140117-RegularExpression-08

jhkim-140117-RegularExpression-09

눈 가리고 아웅

진실이란게 알고 나면 아프기 마련이다. 그래서 모르는게 약이라고 눈 가리고 귀도 막고 아웅 한다. 그냥 아웅 하고 있다 보면 어찌 어찌 지나가겠지 하는 심정으로 그저 오늘도 무사히 넘어가길 마냥 기다린다.

한가지 착각인 것은 당장 아픔 없이 대충 넘어가는 것 같지만 사실 아웅 하고 있는 만큼 알게 모르게 조금씩 죽어가고 있는 거다. 그가 뭐가 잘못된 것 인지도 모르면서 조금씩 조금씩 말라 죽어 간다.

아픔을 느끼지 못하는 것만큼 무서운 일은 없다. 무엇보다 타인의 아픔을 느끼지 못하는 것은 더욱 무서운 일이다.

어차피 살거 조금 아프더라도 매일 매일 내 주변에 놓인 진실들을 마주보며 좀 더 나은 살길 찾는게 값진 삶을 사는 방법이 아닐까 하는 생각이 든다.

외면하지 말자
외면하지 말자
외면하지 말자

식당, 술집, 카페, 신문, TV, 인터넷 뉴스 여기저기 들려오는 소리 속에서 당장 내 일이 아니니 알게 뭐야라며 외면 해 버리는 사람들을 자주 보게 되는 요즘

잡생각이 많이 떠오르는 밤이다.

오픈소스와 마인드 컨트롤

Cloud Foundry를 사용하여 PaaS 구축 프로젝트를 진행한지 1년이 다 되어간다. 그런 와중에 느낀 오픈소스를 사용하는 업무 환경에서, 특히 단순 사용이 아니라 소스를 우리 필요에 맞춰 고쳐야 하는 상황에서는 더욱, 나의 일을 방해하는 가장 큰 요소는 스트레스와 의욕 상실이다.

이미 완성이 된 소프트웨에어는 개발자 고유의 철학과 테크닉, 개성이 자연히 녹아있다.오픈소스를 개수해야 하는 입장에서는 이런 원본(?) 개발자들의 철학과 개성들을 다 받아들여야 하는데, 그렇지 않고 내 멋대로 수정하기 시작하면 기존 정상적인 로직의 흐름이 깨지고 스파게티 코드가 늘어나고 막장 프로젝트가 될 가능성이 절대적으로 커진다, 삼라만상을 깨달은 부처가 아니고서야 나와 다른 타인의 생각과 개성들을 쉽게 받아들이기란 어려운 일이다. 즉, 스트레스다. 특히 Cloud Foundry 같이 거대한 오픈 소스의 경우에는 더욱 그렇다.

요즘 하루 일과 8시간 중 실제 코딩에 쏟는 시간은 4시간 정도 이다. 그럼 남은 4시간은 뭐에 쓰는 걸까? 대부분 마인드 콘트롤 하는데 쓴다. 요렇게 말하면 좀 멋질거 같다. 실상 마인드 콘트롤이라 해봤자 대부분 시덥잖은 잡담과 웹서핑, 멍때리기 이다.

Cloud Foundry 소스들을 뜯어보며 느낀 나의 부족함에 대한 자괴감과 제약된 상황에서 어떻게든 되는 방법을 찾아보려고 발버둥 치는 자신을 돌아보며 나름 하루 20줄도 안되는 코드 생산량에 대한 정당성(?)을 부여하기 위해 틈틈히 코딩을 멈추고 정신승리를 시전한다.

사실 그냥 원본의 코어와 커먼 요소들까지 다 뜯어고치면 코딩량도 많아지고(그럼 왠지 뿌듯하다) 속도 편하겠지만, 그로 인해 기하급수적으로 늘어날 스파게티 코드와 예측할 수 없는 수많은 에러들도 내가 감당해야하니 그딴 짓은 할 수 없다.

내가 나에게 똥을 쌀 순 없어!

생각해보니 남에게 넘길거라도 양심상 그러면 안된다. 내가 싼 똥은 내가 치워야지…

결과적으로 최근 내가 생산하는 코드의 양은 많지 않다. 신입 시절 멋도 모르고 신들린듯한(?) 타이핑으로 하루에 수백줄의 (개떡같은)코드를 생산하던것과는 달리 하루 20줄 정도의 코드 생산하기도 버겁다.그리고 그렇게 생산한 20줄의 코드를 다음날 테스트 하다가 다 뒤집어 엎기도 부지기수 이다.

반면, 기존 소스의 철학과 원칙을 이해하기 위해 쏟아붓는 시간이 더 많아 졌다.

이렇게 오늘도 나는 나의 적은 코드 생산량에 스파게티 코드를 만들지 않기 위한 마인드 콘트롤이라는 정당성을 부여하며 정신승리를 시전한다.

멘탈을 복구하자

너무 깔끔하고 깨끗하게 하려고 집착했던게 문제였던거 같다.
사람이 살다보면 진흙탕을 뒹굴수도 있는건데 뭐 그런걸 무서워 했을까?
일단 부딪혀보고 진흙탕이면 씻고 나옴 되는거다.
그러다 깔끔하게 해결되면 기분 좋고 그런거지 뭐!
원래 진흙탕이라고 생각하니 마음이 편해진다.

이러다 진창만 뒹굴다 끝나는가 아닌가 하는 생각도 들지만 멍때리다 허송세월 보내는 것보단 나으니까….

Redhat OpenShift 분석 중

CF1으로 PaaS구축하는 일이 어느정도 끝나가는 마당에 CF1의 deprecated문제를 그냥 무시하고 지낼수는 없었다.
팀장님과 이야기를 나눈 결과 역시 deprecated된 녀석을 억지로 끌고 가는것도 정상적인 일은 아닌 것으로 결론이 났다.

그렇다고 밑바닥부터 뒹굴며 다시 만들수는 없으니 대체제를 찾아야 하는데 뭐 선택할 게 따로 있나? Cloud Foundry2나 OpenShift 둘중 하나지 뭐…

간단히 접한 Cloud Foundry 2에 대한 나의 생각은, 일단 CF1에 비해서 엄청 발전했다는 것이다. 하지만 고민하게 되는것은 역시 괴랄한 진입장벽인거 같다. Bosh를 사용한 뭔가 지랄맞은 설치 방법은 보고있다보면 토가 나올거 같다.

IaaS기 기본 사양이라니… 너무하잖아!

(사용법은 개떡같더라도) 설치는 무조건 쉽고 간단해야한다 라는 나의 철학과는 좀 많이 어긋난다. vgrant로 설치를 쉽게 해준 오픈소스가 있긴한데, 정규 프로젝트가 아니라는게 좀 마음에 걸린다. VMWare에 한번 데여서 인지, 앞으로 소스가 어떻게 바뀔지 모른다는 불안감이 크다. 그렇게 생각해보면 vgrant 유틸도 언젠가 제대로 안먹게 되겠지? 그럼 난 다시 멘붕 되겠지?

그리고 너무 CF에만 몰빵하는거 아닌가 하는 생각도 들어 슬쩍 OpenShift에 눈을 돌려보기로 했다. https://www.openshift.com/ 회원 가입도 하고, online 버전도 사용해 보고, enterprise 버전이랑 origin 버전 문서들도 좀 들여다 보고, 한 이틀정도 문서만 슬금슬금 보고 있다.

구조는 CF랑 뭔가 미묘하게 같은듯 다르면서 CF보다 뭔가 더 간단하다. (말이 뭐 이따구야.)

이래저래 문서보고 조금 써보면서 느낀건 CF는 사용자가 이미 완성된 구성을 사용하는 느낌이라면 OpenShift는 레고처럼 사용자가 취향에 맞게 적당히 조립해서 쓰는 느낌이다. 이런 사용성 부분은 취향에 따라 다르니 뭐가 좋다 나쁘다 하긴 어려울거 같다.

내 취향은 OpenShift쪽이다. 취향에 맞게 적당히 조립…. 덕 냄새가 좀 나잖아? 아키텍쳐 구성도 좀 간단하고, 대신 카트리지라는 개념이 새로 생기는 문제가 있었지만 그정도야 감안해줄 수 있지!

————————————

구성 간단히 요약

* Broker : 파스 관리 서버, Node에 Gear라는 단위의 가상머신(?)을 생성해주고 Cartridge를 설치해준다(카트리지는 후반에 설명), 관리 UI도 제공해주는거 같다.

* ActiveMQ : Broker<->Node간 메시징 채널

* Node : 물리 머신을 관리하는 컴포넌트라고 봐야할거 같다. Node가 Machine을 Gear 단위로 Virtualization 해준다. 그 단계에서 쓰이는 기술은 나중에~~ (과연 할까?) , CF로 생각하면 DEA라고 보면 될거 같다. DEA보다는 하는일이 좀더 많은거 같아 아직 한마디로 정의하기 어렵다.

** GEAR : Node에서 돌아가는 VM 단위 랄까? 여튼 Node는 사용자에게 GEAR단위로 자원이 분할되어 할당된다. 사용자는 자신에게 할당된 GEAR에 여러 툴들(카트리지)을 설치하여 사용하는 개념이다.

** CGroup, SELinux : Node에서 이놈들을 사용해서 머신을 GEAR단위로 쪼갠다. 덕분에 GEAR들은 지정된 자원 내에서만 사용자 프로세스를 돌릴 수 있다. 자세한 버추얼 기술은 내부 코드를 뜯어봐야 알수 있을거 같다. 어차피 오픈쉬프트를 사용하는 입장에서 주요 관심은 Broker와 아키텍쳐 구성일테니 이건 아직 자세히 안볼 생각.

** High-Density : 뭐 뭐신을 잘게 쪼개서 쓴다 뭐 그런 장점을 표현하는거 같은데 대충 넘어가기로…

* cartridge : 오픈쉬프트의 독특한 구성중 하나인데, GEAR에 설치되는 서비스들은 모두 카트리지라는 개념으로 제공된다. runtime이건 was이건 db건 다 카트리지다. 사용자는 자신의 gear안에 원하는 카트리지를 끼워넣는 구성이다. 내가 자바에 제이보스에 mysql을 돌릴거야! 라고 하면 gear를 하나 만들고 거기에 java 카트리지, jboss 카트리지, mysql 카트리지 를 낑겨 넣으면 된다. 레고 조립하는 느낌이다.

* horizontal App scaling : CF는 최상단에 goRouter라는 녀석이 ip랑 domain을 관리 해주기때문에 app instance간 scaling 걱정을 안해도 되는데 반해 오픈 쉬프트는 이런걸 따로 해줘야하는거 같다. HAProxy 카트리지가 있는데, 여러 GEAR에서 돌아가는 App을 Horizontal Scaling을 하려면 일단 여러 GEAR에 앱들을 배포하고 다시 다른 Gear에 HAProxy 카트리지 넣고 이녀석한테 request 라우팅을 맡기는 형태랄까? 이점에서는 CF가 좀더 편한거 같다.

* DNS : DNS도 얘네는 따로 설치해서 써야하는거 같다. CF는 goRouter가 다 관리해주니 그냥 *.xx.xxx Domain 잡아놓고 서비스하면 되는데, 구성상 DNS를 따로 만들어줘야하는거 같다. 그렇게 해놓으면 Broker에서 사용자가 만든 앱에대한 내용을 DNS에 등록해주는… 이건 귀찮은거잖아!

* git, jenkins : 기본으로 지원한다는데, 일단 지금의 주요관심사는 아니다. Broker랑 Node부터 때려잡아야 한다.

아무래도 지금까지 CF만 해왔으니 CF랑 자꾸 비교하게 되는거 같다.
Cloud Foundry가 {Router – Controller – HealthManager – DEA – SERVICE (Nats로 메시징)} 로 좀 복잡하다면
OpenShift는 {Broker – Node (ActiveMQ로 메세징)} 의 단촐한 구성이다.

Broker가 CF의 Controller, HealthManager, Router의 역할 을 담당하고
Node가 DEA, Service 역할을 담당하니 각각 컴포넌트는 내부가 더 복잡하지 않을까 예상해본다.

여튼 대충 파악 끝났으니, 다음주에는 실제 설치해봐야지

OpenShift공부하면서 좀 감동한건, RedHat에서 문서화를 엄청 잘해놨다 ㅠ.ㅠ
VMWare에 비하면 이건……흑흑…….업드려 절해주고 싶다.
서…설치 잘할게요…ㅠ.ㅠ

근데 개떡같은겓 왜 또 fedora 기준인거냐 ㅠ.ㅠ
CF하느라 CentOS버리고 Ubuntu 죽어라 했더니….
레드햇이니 팔은 안으로 굽는거니 ㅠ.ㅠ

Ubuntu 설치 법 따로 연구해야할거 같은 불안감이 엄습한다.

2013.10.13, Spring Camp, Cloud Foundry를 활용한 PaaS 구축기 발표, 소감

박용권 매니저님의 권유로 어제(13일) KSUG X 라스칼라코딩단(영어 쓰기 귀찮아..) 주최 Spring Camp에서 ‘Cloud Foundry를 활용한 PaaS 구축기’를 발표하기 되는 영광(?)을 얻게 되었다.

발표 전 첫 리뷰에서 야심차게 준비했던 발표자료는 ‘본부장님께 드리는 보고서’ 라는 낙인과 함게 강력하게 질타 받았고, 두번째 다시 만든 것은 그래도 많이 나아 졌다는 용권님의 승인(?)받아 그대로 질풍가도를 달리는 듯 했으나 발표자료에 첨부된 이미지들의 라이선스를 확인하지 않은 관계로 이미지를 전부 교체해야하는 뻘짓도 해야 했다. 이말년 작가님께는 이미지 사용 허가까지 받는 치밀함을 보여놓고 왜 나머지는 그럴 생각을 못했을까? 한이 맺히는 부분이다. 구글 이미지 검색에 라이선스 체크 옵션을 넣으니 맘에 드는 이미지가 진짜 안나오더라. 이미지 교체 작업으로만 한 네시간 날린것 같다. 지난 토요일 하루를 모두 발표자료 정리하는데 써버렸다.

발표 당일, 오전에 혹시나 하는 마음에 팀장님 리뷰 받고 일부 멘트랑 장표 순서 좀 조금 바꾸고 마무리를 했다. 발표 전까지 계속 진장이 되어 긴장을 풀고자 제자리를 빙빙돌며 걸었다. 오른 어깨에 간지나는 DSLR을 걸친채 뭘 그리 긴장하냐며 풋! 하고 웃으시는 변정훈님! 하지만 후에 변정훈님도 자신의 발표 시간이 다가오니 긴장되어 복도를 빙빙 돌더라는 웃지 못할 전설 같은 이야기…

발표 5분전, 디스플레이 미러링 해제하고 시작멘트 정리하고 마지막 장표 체크하는데 맥이 멈춰버렸다. 데모귀신인가! 커널패닉! 재빨리 강제 리붓! 다행이 시작 3분전에 준비가 완료되었다.

발표 1분전, 시작 전에는 좀 많이 떨렸는데 막상 시작하니 매우 마음이 덤덤해 지더라. 발표 중반부터는 그냥 준비했던 스크립트를 보지 않기 시작했다. 야심차게 준비했던 ‘이말년 시리즈’ 애드립은 대차게 실패하고, 개그를 쳤는데 청중이 그렇게 조용할 수가 없더라! 으아아! , 발표는 어느새 중반을 넘기고 있었다.

중간 즈음 Cloulu 시연에는 얼마전부터 속썩이덴 L4스위치 문제가 또 터져서 에러가 나기 시작. 오마이갓! 하며 리프레쉬를 반복하니 느리지만 다시 되긴 했다. 당황하지 않은척 하며 시연은 마칠 수 있었지만, 원래는 채팅 방도 열어 놓고 설문 사이트도 열어 놓으면서 파스를 자유롭게 쓰는 모습을 보여주고 싶었는데 그렇지 못한게 많이 아쉽다. 혹시나 또 에러나는거 아닐까 하는 걱정에 그냥 접었다. 에잇! 이게 다 L4 때문이다.

데모 삑사리와 회심의 애드립을 죄다 말아먹는 불상사가 있었지만 전반적으로 별 탈 없이 발표는 마무리 지을 수 있었다.

긴장풀려고 하루종일 빙글빙글 걸어다녔더니 다리가 매우 아프다. 내일 데뷰 행사는 잘 갈 수 있으려나.

마지막으로 의미있는 행사 준비하시느라 많은 고생 하셨을 KSUG 및 라스칼라코딩단 여러 분들께 감사드립니다.

발표 마무리에 Special Thanks to에 LG CNS때부터 알고 지내온 대(!)선배 채수원님과 이동욱님을 넣었는데, 멘트가 꼬여 마치 Cloulu개발에 도움을 주신 분처럼 묘사된거 같은 느낌이다. 오래전부터 많은 조언으로 큰 힘을 불어 넣어주신 이라고 말하고 싶었는데, 혀가 꼬인건지 멘트가 꼬인건지 엉망이 되어버렸다. 젠장.

Special Thanks to 인물 소개 사진으로 페북 프로필 사진을 따다 썼는데 때 마침 채수원님의 프로필 사진이 채수원님의 애견(dog). 시간이 없어 별 생각 없이 넣었는데 발표 끝나고 생각해보니(주변 분들 말씀도 그렇고) 오바한거 같다. 나중에 혼날거 같다. ㅠ.ㅠ 죄송합니다.

구글 드라이브에 올려놓은 발표자료 URL
https://drive.google.com/open?id=0B35qkFCKn8rjVm1qay00WlI5N3c