2019. 1. 8. 03:44

AWS Greengrass Worksheet

Recently, I am working for the project using Greengrass as a deployment solution.

AWS Greengrass is quite an early development phase, there are lots of cool new features are coming, but not yet available.

Here are some minor tips I found while I am building the service when I face some problems. (I will keep updating time by time my project progressing.) 


A Greengrass group cannot have more than one core.

Currently, you can see the CreateCoreDefinitionVersionRequest is you can see the CreateCoreDefinitionVersionRequest is accepting List<Core> as an input parameter, but this is just for future scalable, it does not support yet. It accepts only a single core now.


Greengrass Deployment Stuck In Progress

I created a group and a core using the console, and deploy something, and faced issues of deployments. Mainly the reasons are: When GG cannot communicate through MQTT, or the core daemon is not running.

So mostly I solved this by checking the core Greengrass config is correctly set (/greengrass/config/config.json), whether EC2 (or pi) network security group inbound rule has MQTT 8883 port open, and checking subscriptions between cloud and lambda, and restart the core daemon, and etc.


While you are building provisioning service using APIs, sometimes you mix-use with the console to delete resources like groups, cores, certificates. Because of that, sometimes there is a zomebie-like group showing in the console, for example,  So I removed core definition using API. After that, I got the same error like "This group is currently deployed so it cannot be deleted."


In this case, you should run "reset deployment" (if it does not work, run it with "force" option.) then you can delete the group. 

2011. 12. 7. 13:37

Android NDK로 OpenSSL 사용하기.

1. 리눅스에 안드로이드 NDK 설치.

2. openssl 소스 다운로드 받기.
package com.samsung.cerm.protos.comm;

public abstract class OpenSSL {
static {
System.loadLibrary("openssl2");
}
abstract public void sendMessage(int msgID);
// synchronized 를 통해 프로그램 상에 동작하는 쓰레드 중 하나만 해당 함수를 실행 할 수 있는 권한을 줌.
public native String generatePrivateKey();
public native String makeCertificateRequest();
public native String makeCertificate(String rootCA, int rootCALen, String rootKey, int rootKeyLen);
public native void initReference();
public native void initOpenSSL();
public native void release();
}

2010. 4. 21. 16:35

UPnP NAT traversal FAQ

출처: http://www.microsoft.com/korea/windowsxp/pro/techinfo/planning/networking/natfaq.mspx

Q.


UPnP란 무엇입니까?

A.

UPnP(Universal Plug and Play)는 특히, 가정 내에서 PC와 지능형 장치 또는 기기를 피어-투-피어 방식의 네트워크로 연결하기 위해 보편적으로 사용될 아키텍처입니다. UPnP는 TCP/IP, HTTP 및 XML과 같은 인터넷 표준과 기술을 기반으로 하기 때문에 이러한 장치들이 서로 자동 연결되고 더욱 많은 사람들은 네트워킹(특히, 홈 네트워킹)을 통해 함께 사용할 수 있습니다.

Q.
일반 사용자는 UPnP를 어떻게 사용할 수 있습니까?
A.

일반 사용자는 간편해지고 더욱 혁신적인 경험을 할 수 있습니다. UPnP 기술을 사용하는 네트워킹 제품은 네트워크에 물리적으로 연결만 하면 "바로 작동"됩니다. UPnP는 유무선에 관계 없이 거의 모든 네트워킹 미디어 기술과 호환됩니다. 여기에는 Category 5 이더넷 케이블, Wi-Fi 또는 802.11B 무선 네트워크, IEEE 1394("Firewire"), 전화선 또는 전력선 네트워킹이 포함되는데, 이러한 장치와 PC가 서로 연결되면 사용자는 혁신적인 새로운 서비스와 응용 프로그램을 더욱 쉽게 활용할 수 있습니다.

Q.
UPnP Forum이란 무엇입니까?
A.

UPnP Forum은 가정과 궁극적으로는 기업 내에서 지능형 장치의 네트워킹을 단순화하는 UPnP 표준을 규정하기 위해 1999년 6월에 출범한 개방된 통신업계 컨소시엄입니다. UPnP Forum은 UPnP 장치 제어 프로토콜 및 서비스 제어 프로토콜을 정의하고 발표함으로써 이러한 목적을 달성하고 있습니다. 2001년 6월 현재 350개 이상의 기업이 UPnP Forum의 회원사로 가입하였으며, 22개 회원사로 이루어진 UPnP Steering Committee가 UPnP Forum를 주도하고 있습니다. 이 컨소시엄의 노력을 구체화하기 위해 특정 장치 분야를 전담하고 있는 Technical Committee, Marketing Committee 및 기타 다양한 위원회가 운영되고 있습니다. UPnP Forum 가입 정보 및 전체 회원사 목록은 UPnP Forum 웹 사이트  에서 볼 수 있습니다.

Q.
UPnP의 기술적 요소는 무엇입니까?
A.

UPnP는 가정 네트워크, 근접 네트워크 및 소규모 기업과 전체 기업의 네트워크를 대상으로 하기 때문에 범위가 넓다고 할 수 있습니다. 네트워크에 있는 어떤 제어 장치의 명령에 의해 두 장치 간의 데이터 통신이 이루어지도록 하는 UPnP는 특정 운영 체제, 프로그래밍 언어 또는 물리적 매개체에 상관 없이 작동합니다.

UPnP는 무인 구성 네트워킹 및 자동 감지 기능을 지원하고, 장치는 네트워크에 동적으로 연결되어 IP 주소를 얻고, 고유한 이름을 알리며, 요청에 따라 기능을 수행하고, 다른 장치의 존재 여부 및 기능을 감지합니다. DHCP 및 DNS 서버는 선택 사항이며 네트워크에서 사용 가능한 경우에 사용됩니다. 더욱이, 장치는 네트워크에 원치 않는 상태를 남기지 않고 자연스럽게 자동으로 네트워크 연결에서 분리될 수 있습니다.

UPnP는 인터넷의 성공 비결을 통해 이루어졌으며 IP, TCP, UDP, HTTP 및 XML을 포함한 인터넷 구성 요소를 많이 활용합니다. 많은 업체들이 UPnP에 사용되는 표준 장치 제어 프로토콜(DCP)을 제정하기 위해 협력하고 있습니다. 인터넷과 마찬가지로, 이러한 프로토콜은 XML로 선언 및 표현되고 HTTP를 통해 통신되는 유선 프로토콜을 기준으로 하는 규약입니다.

Q.
NAT란 무엇이며, 왜 필요합니까?
A.

NAT(Network Address translation)는 개인 네트워크(10.0.x.x, 192.168.x.x, 172.x.x.x 등의 개인 주소 범위 사용)에서 여러 PC 또는 장치가 전역적으로 라우팅 가능한 단일 IPv4 주소를 공유할 수 있도록 하기 위해 사용되는 IETF(Internet Engineering Task Force) 표준입니다. NAT가 많이 사용되고 있는 주된 이유는 현재의 인터넷 주소 방식인 IPv4 주소가 별로 남아 있지 않기 때문입니다.

NAT는 공용 인터넷과 개인 LAN 사이의 경계를 형성하는 게이트웨이 장치에서 사용됩니다. 개인 LAN의 IP 패킷이 게이트웨이를 통과할 때, NAT가 개인 IP 주소와 포트 번호를 공용 IP 주소와 포트 번호로 변환함으로써 개인 세션을 그대로 유지합니다. Microsoft Windows XP 및 Windows Me 운영 체제의 인터넷 연결 공유 및 기타 많은 인터넷 게이트웨이 장치에서 NAT를 사용하고 있으며, 특히 DSL이나 케이블 모뎀을 통한 초고속 네트워크 공유를 위해 사용됩니다. 점점 더 많은 가정과 소규모 기업에서 PC를 네트워크로 연결하고 인터넷을 공유함에 따라 NAT 사용이 크게 증가되고 있습니다.

Q.
NAT를 사용할 경우 어떠한 문제가 발생합니까?
A.

간단히 말하자면, NAT를 사용할 경우, 점점 더 많은 사람들이 가정이나 소규모 기업에서 인터넷을 사용하도록 만드는 멀티 플레이어 게임, 실시간 통신 및 기타 피어-투-피어 서비스와 같은 최신 기술과 혁신적인 PC 및 홈 네트워킹 경험을 체험하지 못할 수 있습니다. 이러한 응용 프로그램은 공용 인터넷의 개인 주소를 사용하거나 동일한 포트 번호를 동시에 사용할 경우 제대로 작동하지 않습니다. 응용 프로그램에서는 공용 주소를 사용해야 하고, 각 세션에 대해 고유한 포트 번호가 있어야 합니다. 대기업과 같은 경우는 IT 전문가를 두어 기업용 응용 프로그램이 NAT를 사용하면서도 잘 작동하도록 조치를 취할 수 있지만, 소규모 기업이나 가정에서는 그럴 만한 여력이 없습니다. UPnP NAT traversal은 NAT 사용해 응용 프로그램에 발생하는 여러 가지 문제를 자동으로 해결함하는 소규모 기업과 가정에서 활용할 수 있는 이상적인 솔루션입니다.

Q.
NAT traversal 솔루션은 어떻게 이루어졌습니까?
Q.

NAT traversal 문제를 해결하는 다른 방법은 없습니까? 방법이 있다면 UPnP를 사용하는 것이 어떠한 이유로 최선의 선택이 될 수 있습니까?

A.

물론, 이러한 문제를 해결할 수 있는 다른 방법이 있습니다. 하지만, 현재 일반 사용자를 위해 이러한 문제를 자동으로 해결하고 개발자가 폭넓게 적용 가능한 업계 표준은 UPnP 이외에는 없습니다. 다른 메커니즘의 경우 특정 응용 프로그램에서 발생하는 NAT 사용 문제를 해결하기 위해서는, 사용자가 직접 개입하거나 인터넷 게이트웨이 장치 개발업체나 소프트웨어 개발자가 특별한 노력을 기울여야 합니다. 결국, UPnP만이 이러한 문제를 일반적인 방법으로 해결할 수 있습니다.

일반 사용자의 작업이 필요합니다. NAT 문제를 직접 해결하기 위해서는 일반 사용자가 브라우저를 통해 그래픽 사용자 인터페이스 기반의 도구나 명령줄 인터페이스 도구를 사용하여 가정에 있는 인터넷 게이트웨이 장치의 일부 설정을 변경해 주어야 합니다. 이러한 작업을 많이 해 본 경험이 있거나 관심 있는 사용자는 별다른 어려움 없이 수행할 수 있겠지만, 대부분의 일반 사용자는 이러한 작업을 꺼려합니다. 더욱이, 많은 일반 사용자들은 NAT를 사용함으로써 인터넷에서 응용 프로그램이나 서비스를 이용할 때 문제가 발생할 수 있다는 사실조차 모르고 있습니다. 사용자는 멀티 플레이어 게임을 하거나 피어-투-피어 서비스를 이용하려고 하지만 어떤 이유로 접속할 수 없다는 사실을 알게 됩니다. 이에 따라, 여러 가지 문제 해결 방법을 시도하고 A/S 센터에 문의도 하지만, 결국 사용자의 불만이 쌓이게 되고 새로운 서비스나 미래의 혁신적인 경험을 시도하지 않게 될 수도 있습니다.

개발자의 작업이 필요합니다. 일반 사용자가 이러한 NAT 사용 문제를 직접 해결하지 않도록 하기 위해, 일부 인터넷 게이트웨이 장치 개발업체의 경우 응용 프로그램 계층 게이트웨이 지원 기능을 만들어 게이트웨이 장치에 포함시키기도 합니다. 이 응용 프로그램 계층 게이트웨이 소프트웨어는 특정 응용 프로그램을 염두에 두고 만들어집니다. 즉, 장치 개발업체에서는 특정 응용 프로그램의 NAT 문제를 자동으로 해결하는 코드를 작성하고 테스트합니다. 하지만, 이러한 응용 프로그램 소프트웨어가 업데이트될 경우, 장치 개발업체에서 작성한 응용 프로그램 계층 코드도 업데이트하거나 다시 테스트해야 합니다. 이와 같이, NAT 사용 문제를 한 번에 하나씩 해결하는 방법은 NAT 문제를 고려해야 할 피어-투-피어 또는 관련 응용 프로그램이 얼마 되지 않을 경우에는 크게 문제가 되지 않지만, 이러한 응용 프로그램의 수가 수백 또는 수천 개에 이를 경우 문제 해결을 위해서는 많은 비용이 들고 이러한 각 응용 프로그램이 어떻게 작동하는지에 대한 폭넓은 지식도 필요합니다. 이러한 문제를 해결하는 더 좋은 방법은 장치 제공업체에서 해당 장치가 UPnP를 이해하도록 소프트웨어나 펌웨어를 한 번만 추가하고, 다른 장치와 소프트웨어에서도 동일한 기술을 사용하여 NAT 장치와 통신할 수 있도록 하는 것입니다. 현재 이러한 역할을 충분히 수행할 수 있는 기술은 UPnP밖에 없습니다.

Q.
UPnP NAT traversal 솔루션은 무슨 역할을 합니까?
A.

UPnP 지원 NAT traversl은 다음과 같은 사용 문제를 해결할 수 있습니다.

  • 멀티 플레이어 게임
  • 피어-투-피어 연결
  • 실시간 통신
  • 원격 지원(Windows XP의 기능)

IHV의 경우, 이 솔루션을 사용함으로써 NAT 문제 해결을 위해 응용 프로그램 계층 게이트웨이(ALG) 데이터베이스를 작성하거나 관리할 필요가 없어집니다. 이 솔루션은 Windows XP 및 Windows 내의 프로그래밍 리소스인 Direct Play에서 모두 지원하므로, DPlay에 대해 작성된 소프트웨어 응용 프로그램은 NAT에서 자동으로 UPnP 솔루션을 사용하게 됩니다.

UPnP Forum의 IGD 사양은 다음과 같은 방식을 통해 자동으로 NAT traversal을 구현합니다.

  • 공용 IP 주소 얻기
  • 기존의 포트 매핑 열거
  • 포트 매핑 추가 및 제거
  • 매핑에 임대(사용) 시간 할당
Q.
어떤 업체들이 UPnP NAT traversal 솔루션을 구현하고 있습니까?
Q.
일반 사용자들이 UPnP 지원이 되는 인터넷 게이트웨이 장치가  무엇인지 어떻게 알 수 있습니까?
A.

사용자들은 해당 인터넷 게이트웨이 장치 업체의 웹 사이트를 방문하거나 제품 상자에 쓰여진 문구를 보고 UPnP 기능이 포함되어 있는지 확인할 수 있습니다. 소매업체에서도 앞으로 몇 개월 이내에 이러한 사실을 알게 될 것입니다. 몇 개월 후에 UPnP Forum에서는 인터넷 게이트웨이 장치가 UPnP Forum의 테스트 요구 사항을 만족하는지 여부를 표시하기 위해 제품 상자, 마케팅 자료 또는 제품 자체에 부착할 수 있는 UPnP 로고를 제공할 예정입니다.

Q.
개발자들이 이 솔루션을 구현하는데 필요한 리소스가 있습니까?
A.

일반 문서에서 호환성 테스트 자료(PlugFests)에 이르기까지 많은 리소스가 있습니다. 기술 문서를 보려면 http://www.upnp.org/resources/  을 방문하고, 앞으로 개최될 이벤트 정보는http://www.upnp.org/events/  을 참조하십시오. Microsoft는 MSDN Online에서 Windows XP에 대한 개발자 정보를 제공하고 있습니다.

Q.
그 밖의 정보는 무엇입니까?
A.


2010. 3. 22. 12:23

오픈 소스 기반의 DBMS 솔루션과 모바일 기기에서의 활용방법

출처: http://blog.naver.com/PostView.nhn?blogId=hongjig&logNo=150079382193

김형훈 asinayo73@hotmail.com


애플의 아이폰이 시장에 출시되면서, 많은 사람들이 모바일 컴퓨팅 기기에 관심을 가지게 되었다. 기존의 모바일 통신기기가 단순한 음성/영상 통신기기에서 멀티미디어를 비롯한 다양한 기능을 지원하는 대용량 기반의 모바일 컴퓨팅 기기로 진화하게 되면서, 많은 데이터를 처리할 수 있게 되었고 이와 관련된 처리 방법이 매우 중요한 위치를 가지게 되었다. 모바일 컴퓨팅 기기에서 데이터를 어떻게 관리해야 하는지에 대해서 살펴보도록 하자.


모든 모바일기기는 하드웨어와 소프트웨어로 구성되어 있다. ARM기반의 하드웨어에서 CPU의 성능이 향상되면서 다양한 어플리케이션을 수용할 수 있게 되었다. 기존의 ARM926EJ-S부터 시작하여 현재는 Cortex A8코어가 지원됨으로써 CPU가 처리할 수 있는 속도 및 능력이 향상되었다. 90nm 공정과 공간 최적옵션을 사용했을 때 최대 250MHz의 CPU 성능을 가지는 ARM926EJ-S가 65nm 공정과 속도 최적옵션을 사용하여 650∼1100MHz의 성능을 가지는 Cortex A8 CPU로 진화됨으로써 이러한 결과를 얻게 되었다. CPU 성능과 더불어 모바일 기기에서 가장 중요한 요소인 메모리의 경우에는 소프트웨어가 실제로 실행되는 장소인 휘발성 메모리의 용량이 증가할 수록 많은 어플리케이션이 동작할 수 있게 되고, 많은 어플리케이션이 실행될 수 있는 기기에서는 데이터베이스의 활용도 및 중요도가 그만큼 높아졌다. 이와 같이 중요한 역할을 담당하는 데이터베이스는 모바일 컴퓨팅의 성능/기능을 만족시키기 위해서 사용되는 모바일 플랫폼의 기본 시스템으로서 사용된다.

DBMS 솔루션은 비즈니스모델에 따라서 상용 솔루션과 오픈 소스 기반의 솔루션으로 나눌 수 있다. 상용 데이터베이스 솔루션은 일정한 금액을 받고 이를 원하는 업체에 제공을 하기 때문에 제공 이후의 사후 관리에 대해서도 많은 지원 대책이 존재하지만, 오픈 소스 기반의 데이터베이스 솔루션의 경우에는 오픈 소스를 활용하는 주체가 실질적인 솔루션 공급자와 운용자의 두 역할을 담당해야 하기 때문에 사후 관리에 있어서도 많은 책임이 주어진다. 물롞, 많은 오픈 소스 기반의 솔루션들도 상당한 수준의 상용화 수준을 이미 가지고 있으며, 전문적으로 이를 지원하는 조직을 가지고 있는 솔루션도 있다.

오픈 소스는 많은 형태의 라이선스를 가지고 있으며, 그 중 하나인 듀얼 라이선스 비지니스 모델을 적용한 솔루션의 경우에는 오픈 소스로 개인에게 공개하는 버전과 유상으로 기업에게 제공하는 버전이 존재한다. 이러한 오픈 소스 비즈니스 모델을 적용한 대표적인 제품으로서 MySQL이 있다. 오픈 소스기반의 솔루션을 사용할 경우에는 대체적으로 최소의 비용을 투자하여 최대의 효과를 얻을 수 있다는 점에서 많은 매력이 존재하기 때문에 기존의 성숙된 시장에 보다 용이하게 진입하고자 하는 경우에 사용될 수 있다. 하지만, 오픈 소스 기반의 솔루션을 초기에 도입하는 경우에는 이러한 작업들이 쉽게 여겨질 수 있지만, 상용화하고자 하는 타겟에 최적화하여 향상시키기 위해서는 많은 부가적인 노력이 필요하다.

대표적인 오픈 소스 기반의 DBMS 솔루션으로 다음과 같은 것들이 존재한다.

. MySQL
. PostgreSQL
. SQLite
. BerkeleyDB

MySQL은 빠른 성능과 멀티 쓰레드, 멀티 유저를 지원하는 SQL(Structured Query Language) 데이터베이스 서버 솔루션이다. MySQL은 대용량 데이터 처리 기기 뿐만 아니라 임베디드 기기에도 적용이 가능한 솔루션이며, 듀얼 라이선스 정책을 사용하여 GPL(GNU General Public License) 기반으로 코드가 오픈되어 일반 사용자들도 쉽게 접귺이 가능하다. MySQL은 C와 C++를 사용하여 만들어졌으며, Windows, OpenBSD, Mac OS X, AIX, Solaris 등의 다양한 플랫폼에 적용되어 있다. MySQL이 효과적으로 사용하기 위해서 다음과 같은 조건들을 만족하면 된다. 무엇보다도 쓰레드 라이브러리가 안정적이어야 하고, 파일 시스템의 안전성이 높으면서 성능이 높아야만 한다. 또한 테이블 사이즈와 개수도 영향을 줄 수 있는데, 큰 테이블들을 가지고 있는 파일들의 수가 증가할수록 이에 대한 파일시스템의 처리능력이 낮아질 수 있다. MySQL이 SMP(Symmetric Multi-Processor)을 사용함으로써 성능을 향상시킬 수 있으며, 사용자의 수를 제한함으로써 성능을 극대화할 수도 있다. 이러한 사항들과 더불어 MySQL이 컴파일될 때 해당 플랫폼의 최적화 옵션이 사용되어야만 한다. MySQL은 트랜잭션과 비트랜잭션 저장엔진 모두를 지원하며, 인덱스 압축을 이용한 B-tree 디스크 테이블을 사용한다. 다른 추가 저장엔진의 사용이 용이한 것도 또 다른 장점이다. 그리고, 쓰레드 기반의 메모리 할당 시스템을 사용할 수 있으며, 최적화된 스윕 멀티 조인을 사용하여 빠른 조인을 수행할 수 있다. In-memory Hash 테이블을 사용하고, 최적화된 클래스 라이브러리를 사용함으로서 빠른 SQL 함수를 제공할 수 있다. 고정길이와 가변길이 변수 타입을 지원하며, Group 관련된 함수들을 지원하고, GROUP BY/ORDER BY 젃에 대한 전반적인 지원을 수행한다.

MySQL은 최대 5천만 개의 레코드를 지원하며, 20만 개의 테이블과 50억 개의 행을 지원할 수 있다. 테이블다 64개의 인덱스를 지원할 수 있으며, 각 인덱스는 1부터 16개의 칼럼들로 구성되어 있다. 최대 인덱스 길이는 1000바이트이다. MySQL 서버로 클라이얶트는 TCP/IP를 통해서 접속할 수도 있으며, 만약에 Windows NT 계열의 시스템을 사용하는 경우에는 이름 지정 파이프를 통해서도 접귺이 가능하다.

PostgreSQL는 POSTGRES v4.2에 기반한 ORDBMS(Object Relational DBMS)이다. Windows를 비롯하여 Linux, AIX, BSD, HP-UX, Mac OS X, Solaris 등의 다양한 플랫폼을 지원한다. ACID 특성을 만족하며, 외래 키, 조인, 뷰, 트리거, 저장 프로시저에 대한 지원이 이루어지고 있다. INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, TIMESTAMP 등의 SQL92와 SQL99 데이터 타입을 만족하고, 그림, 사운드, 비디오를 포함하는 바이너리 형태의 큰 오브젝트들을 지원한다. 또한, PostgreSQL은 즉시 복구, 테이블공간, 비동기 복제, 중첩된 트랜잭션, 온라인 백업을 지원한다. PostgreSQL은 처리 가능한 최대 데이터베이스 크기와 테이블당 최대 행/최대 인덱스의 수에는 제약이 없으며, 최대 테이블 크기는 32TB, 최대 행 크기는 1.6TB, 최대 필드 크기는 1GB를 지원한다. PostgreSQL는 B-tree, R-tree, Hash, GiST(Generalized Search Tree)를 이용한 인덱싱 방법을 지 원한다. GiST 인덱싱은 B-tree, B+-tree, R-tree, 부분합 tree, 랭크된 B+-tree 등을 포함하는 정렬/검색 알고리즘들을 사용할 수 있도록 만들어 놓은 시스템이다.
이 외에도 테이블 상속, 룰 시스템, 데이터베이스 이벤트와 같은 특징들을 포함하고 있다. 테이블 상속은 테이블 생성 시에 베이스 클래스가 되는 다른 테이블로부터 상속받아서 새로운 테이블을 만들 수 있다. 룰 시스템은 데이터베이스 설계자가 새로운 동작을 위한 룰을 생성할 수 있도록 한다. 데이터베이스 이벤트 기능은 LISTEN/NOTIFY 명령어들을 사용하여 클라이얶트들 사이에서 전송되는 메시지와 이벤트들이 지원되는 것을 의미한다. 트리거나 저장 프로시저를 사용할 때 발생하는 이벤트들에 대한 모니터링을 통해서 처리가 테이블의 변경상황을 알 수 있다.
PostgreSQL는 SQL 표준의 많은 부분을 지원하면서, 복합 쿼리, 외래 키, 트리거, 뷰, 트랜잭션 무결성이 지원된다. PostgreSQL는 서버/클라이얶트 모델을 사용하며, 서버 프로세스는 클라이얶트 어플리케이션과 데이터베이스를 연결할 수 있도록 하고, 데이터베이스 파일을 관리한다. 서버/클라이얶트가 서로 다른 호스트에서 존재할 경우에 TCP/IP 연결을 통해서 통신할 수 있다. 서버는 여러 개의 클라이얶트들로부터의 연결을 동시에 수락할 수 있으며, 각 연결을 위해서 새로운 처리 프로세스를 생성한다.
PostgreSQL는 BSD 라이선스를 사용하기 때문에 보다 자유로운 소스코드 관리 및 활용이 이루어질 수 있다.

SQLite는 구글의 안드로이드, 노키아의 Maemo, 애플의 iPhone에 적용된 솔루션이다. 기존의 DBMS가 엔터프라이즈급에서 사용되던 것과는 달리 이는 경량화된 특성을 바탕으로 모바일 기기에 주로 적용되었다. SQLite의 대표적인 특성으로 설정이 필요없다는 것과 서버가 없다는 점이다. SQLite는 설치하는 과정이 필요없으며 셋업하는 과정도 없다. 따라서, 시작, 정지, 설정해야 하는 서버 프로세스도 없다. 별도의 관리자가 이를 관리할 필요가 없기 때문에 사용이 간단한 장점을 가지고 있다. 더군다나, SQLite는 서버/클라이얶트 모델로 동작하는 것이 아니기 때문에 클라이얶트가 서버에 TCP/IP로 접속해서 처리하는 동작이 필요없다. 디스크에 존재하는 데이터베이스 파일을 직접 읽고 쓰기 때문에 별도의 서버동작을 위한 프로세스가 존재하지 않는다. SQLite는 단 하나의 데이터베이스 파일을 사용하기 때문에 관리가 매우 용이하다.
SQLite는 가변 길이 레코드를 지원하며, BLOB, CLOB들을 사용할 수 있도록 한다. 가변 길이 레코드를 지원함으로써 더 작은 데이터베이스 파일을 만들 수 있고, 따라서 더 빠른 동작을 이끌어 낼 수 있다.
SQLite는 온라인 백업 인터페이스를 사용하여 디스크 파일의 컨텎츠를 인-메모리 데이터베이스로 또는 그 반대 방향으로 복사함으로서 핫 백업을 지원한다. 또한 동일한 페이지와 스키마 캐시를 공유하기 위한 2개 이상의 연결을 가능하게 해 준다. 데이터베이스에서 각 페이지와 인덱스 별로 각각의 B-tree가 독립적으로 사용되며, X/Y 좌표에 대한 최소/최대 값을 가지는 공간 시스템을 다루기 위해서는 R-tree를 사용한다. 그렇지만, SQLite는 몇 가지 사항에 대해서 미지원되는 것들이 존재한다. 트리거 중에 일부 특성들이 지원되지 않으며, ALTER TABLE 중 RENAME TABLE, ADD COLUMN은 지원되지 않는다. LEFT OUTER JOIN의 경우에는 지원되지만, RIGHT OUTER JOIN이나 FULL OUTER JOIN은 지원되지 않는다. VIEW는 SQLite에서는 읽기 전용이며, VIEW에서 INSERT, DELETE, UPDATE는 불가능하다.
SQLite는 Public domain이라는 라이선스 정책을 사용하고 있기 때문에 많은 사용자들이 자유롭게 사용할 수 있으며, 코드의 수정이 이루어지더라도 반드시 이를 공개할 필요는 없다. SQLite 솔루션을 지원하기 위한 조직으로서 Hwaci(www.hwaci.com/sw/sqlite)가 있으며, SQLite의 높은 품질의 지원을 받기 위해서는 SQLite 컴소시움에 가입하면 된다. 컨소시움에 가입하기 위해서는 멤버쉽 비용을 내고 따로 관리를 받으면 되며, 심비안, 블룸버그, 어도비, 모질라가 가입되어 있다.

Berkeley DB는 라이브러리 형태로 어플리케이션으로 링크되는 Oracle에서 제공하는 오픈소스 기반의 DBMS이다. Berkeley DB는 서버/클라이얶트 구조를 사용하지 않고, SQL 처리과정을 생략함으로써 성능을 향상시켰으며, 동작 시 처리 실패에 의한 복구 및 데이터 무결성을 보장하기 위한 트랜잭션 기능을 지원한다. 관리자가 별도로 필요하지 않고 각 어플리케이션이 각각의 데이터베이스에 대한 관리 기능을 수행한다.

Berkeley DB는 데이터베이스의 동시 액세스를 지원하기 때문에 멀티 프로세서 시스템에서 멀티쓰레드 또는 멀티프로세스 어플리케이션은 최대의 효과를 얻을 수 있다. 물롞 한 개의 프로세서를 사용하는 시스템의 경우에도 이러한 효과를 얻도록 되어 있다. Berkeley DB는 설계 목적과 데이터 특성에 맞추어서 높은 쓰루풋을 낼 수 있는 시스템을 구성할 수 있는 트랜잭션 기능을 제공한다. Berkeley DB는 최대 4GB의 레코드를 가질 수 있으며, 수 TB 크기의 테이블들을 가질 수 있다. 다수의 사용자가 사용할 때의 충돌을 회피하면서, 성능을 최대화하기 위해서 MVCC(Multi-Version Concurrency Control) 또는 로깅하기 이전에 쓰기 동작을 수행하는 전형적인 방법을 사용할 수 있다.

Oracle의 Berkeley DB는 인프라스트럭쳐 시스템에서도 광범위하게 사용된다. 모바일 게이트웨이, 메시지 서비스를 위한 저장 시스템, 모바일 사업자를 위한 OSS(Operational Support Systems), BSS(Business Support Systems)와 같은 시스템들에 사용될 수 있다. 이와 더불어서 작은 풋-프린트, 높은 안정성, 제로 관리기능 및 손쉬운 적용방법을 토대로 휴대용 모바일 기기에서도 영역을 넓히고 있다. 텍스트, 이메일, 인스턴스 매시지 그리고, 각종 멀티미디어 파일 등을 저장하기 위해서 사용된다.

다양한 오픈 소스 기반의 DBMS 솔루션이 존재하기 때문에 이 중에서 어떠한 솔루션을 선택해서 과제에 적용할 것인가를 결정하는 것이 무엇보다도 중요하다. DBMS를 선택하는 방법으로 다음과 같은 9가지 사항들이 있으므로, 이를 고려하도록 한다.


1. 데이터베이스가 사용자가 원하는 다양한 기능 모두를 지원할 수 있는가?
2. 높은 가격 경쟁력을 가지고 있는가?
3. 시장이 원하는 시점에 시장이 원하는 기능을 포함하는 버전을 제공할 수 있는가?
4. 크로스 플랫폼에 포팅이 가능하며 쉽게 될 수 있는가?
5. 관리자가 용이하게 관리할 수 있는가?
6. 보다 나은 성능을 지원하는가?
7. 안정성이 충분히 보장되는가?
8. 작은 풋-프린트가 지원되는가?
9. 확장이 용이하며, 사용하기 쉽고 편리한가?


가장 최우선적으로 DBMS는 사용자가 원하는 본연의 목적을 달성해야 한다. 많은 어플리케이션이 취급해야 하는 데이터들을 최상의 조건으로 다룰 수 있어야 하며, 가장 빠르게 원하는 데이터를 원할 때 가지고 올 수 있어야만 한다. 물롞 이러한 성능을 지원한다고 해서 가격경쟁력이 없다면 이는 이러한 솔루션을 사용하는 제품에 대한 가격경쟁력을 또한 저하시키므로 고려해야만 한다. DBMS는 시스템에 있어서 데이터를 다루는 기본적인 기반 소프트웨어이다. 따라서, 매우 특정한 목적을 가지는 경우가 아니면, 어느 특정 제품에서만 사용되는 것이 아니라 광범위하게 사용될 수 있다. 따라서, 광범위하게 사용될 수 있기 위해서는 다양한 플랫폼에도 포팅이 쉽게 될 수 있어야만 한다.

이러한 9가지 고려 사항 중에서 모바일 기기에서 특히 더욱 더 큰 중요성을 가지는 것으로서 관리자가 용이하게 관리할 수 있는 지, 작은 풋-프린트가 지원되는 지와 사용하기 쉬운지의 여부이다. 모바일이라는 홖경은 한정된 자원만을 사용할 수 있으며, 여러 가지 자원의 확장이 용이하지 않다. 그렇다는 것은 DBMS가 자원을 충분히 사용하지 못할 수도 있다는 것을 의미하며, 따라서 최소한의 자원만을 사용해서 동작할 수 있어야만 한다는 의미이다. 이렇게 최소한의 자원만을 사용해서 동작하기 위해서는 별도의 관리자를 통한 제어와 다양한 설정방법이 불필요할 수 있다. 이와 같은 특성을 만족시키는 대표적인 오픈 소스 DBMS가 SQLite이다. SQLite는 실제로 Android, iPhone, Maemo와 같은 모바일 플랫폼에서 기본 DBMS로 사용되고 있다.

DBMS는 많은 수의 데이터들을 빠른 시간 안에 처리하고 쉽게 관리하기 위한 것이므로, 이러한 목적이 최우선적으로 고려되어야만 한다. 모바일 기기는 전화번호, 콜 로그, 메시지, 다이어리와 파일 매니저를 비롯한 거의 모든 어플리케이션들을 지원하므로, 이러한 어플리케이션에서 다루는 데이터들의 양이 많아 질수록 DBMS의 성능이 필수 고려사항이 된다. 데이터를 처리하는 방법에 따라서 처리하고자 하는 용량이 증가시의 처리속도가 선형 그래프 형태로 증가할 수 도 있고, 로그 그래프 형태로 증가할 수 도 있다. 따라서, 사용하고자 하는 데이터베이스 솔루션이 데이터처리 방법에 있어서 어떠한 특성을 가지는지 확인한 이후에 이에 맞추어서 사용해야 한다.

또한, 다양한 오픈 소스 기반의 DBMS는 각자 자기만의 인터페이스를 가지고 있다. 따라서 만약에 기존에 이미 다른 DBMS를 사용한 업체에서 오픈 소스 기반의 DBMS를 적용하고자 한다면 기존에 적용되어 있던 인터페이스를 모두 제거하고 다시 새로운 인터페이스를 적용해야 한다. 이러한 포팅 상의 문제점은 DBMS를 새로이 적용할 때 많은 장애가 된다. 이러한 문제점을 해결하기 위해서 다음과 같은 2가지 방법을 적용할 수 있다.

- ODBC 인터페이스의 제공
- 별도의 포팅 계층을 제공


전자의 경우에는 ODBC라는 표준화된 인터페이스에 맞추어서 오픈 소스 기반의 DBMS의 드라이버를 제공함으로서, 사용자는 손쉽게 DBMS를 사용할 수 있다. ODBC 드라이버가 중간 포팅 계층의 역할을 담당하는 것이다. 이미 대부분의 오픈 소스 기반 DBMS는 이를 사용할 수 있도록 준비되어 있다.

후자의 경우에는 각 DBMS가 ODBC 드라이버를 사용할 때 다른 솔루션과 비교하여 성능상의 문제가 존재할 때 자신만의 포팅계층을 구축하는 것이다. 그리고, 그 포팅 계층에서는 다른 DBMS 인터페이스와의 부정합을 완화시켜주는 역할을 담당한다. 이때 성능의 최대 이슈가 될 수 있는 이 포팅 계층의 설계가 매우 중요하다.

오픈 소스기반의 DBMS 솔루션으로 여러가지가 존재하지만, 실제로 모바일 기기가 가지고 있는 특수한 홖경을 만족시킬 수 있는 솔루션은 많지 않다. 각 솔루션의 장단점을 파악하여, 사용하고자 하는 모바일 기기에 맞는 최적의 솔루션을 적용하도록 해야 할 것이다.



참고문헌
1. www.mysql.com
2. www.sqlite.org
3. http://www.postgresql.org/
4. www.oracle.com


2010. 3. 22. 09:31

Android 에서 MySQL 을 사용하지 않는 이유!

출처: http://groups.google.com/group/android-developers/browse_thread/thread/f1763b9a0c63653e

I would very explicitly NOT develop a MySQL App on the Android.
안드로이드에서 MySQL 개발을 하지 마십시오.

While you could perhaps get the JDBC driver to run on Android, this is the wrong approach from a architectural standpoint.
Android에서 돌리기 위해 JDBC 드라이버를 얻어야 할텐데요, 설계적 관점에서 이는 잘못된 접근 방식입니다.

You won't get the performance, scalability, maintainability, reliability, nor security characteristics you'd like.
수행성, 가용성, 관리성, 신뢰성, 보안성.. 그 어느것 하나 제대로 되지 않을겁니다.

Instead, expose your client-side functionality in a web service.
대신, 웹 서비스를 통해 클라이언트 쪽 기능을 하게 할 수는 있습니다.

For most purposes, I'd suggest a RESTfull web service, but SOAP is also an option.
대부분은, RESTfull 방식의 웹 서비스를 추천하지만 SOAP 또한 방법 중 하나죠.

JSON is often a good alternative to XML -- especially if you will be interacting with this service via a browser.
JSON은 XML을 훌륭하게 대체해 줍니다. 특히 브라우저를 통해 서비스 통신을 하게 된다면 말이죠.

If you put SQL in your client, you are basically screwed.
SQL을 클라이언트에 넣었다면, 근본적으로 완전 망하는겁니다.

You will NEVER be able to alter your schema, or introduce some non-DB processing, or split the data between databases, or make any of a host of other changes, because some people may never upgrade their apps.
스키마 변환이라든가 non-DB prosessing, DB 간 데이터 분리, 어떤 변화를 가지는 host 생성, 등은 절대 불가능 하겠죠. 왜냐하면 일부 유저는 프로그램 업데이트를 하지 않으니까요.

Well, OK, you can say "screw them", and change it anyway, but they'll ding you in the marketplace ratings.
뭐, 망하면 망할테라지라고 해버리고 어떻게든 바꿔버린다면, 뭐 시장 결과는 뻔하겠죠.

Especially in a mobile app, you want a looser coupling.
특히 모바일 app에서는 느슨한 커플링이 필요합니다.

With a web service, you can simultaneously provide multiple versions of the same service (perhaps distinguished only by a revision indicator).
웹서비스를 통해서라면, 같은 서비스를 여러 버전으로 하여 지속적으로 제공해 줄 수 있습니다. (아마 revision indicator를 통해야만 하겠죠.)

You can do server-side caching to take a load off your database. You could even move to a different database entirely.
또 데이터베이스 서버측의 로드를 줄여줄 수도 있습니다. 데이터베이스 전체를 다 바꿔버릴수도 있구요.

Also, connection failures will be frequent. With MySQL, you'd have to pay considerable attention to recovering from connection failures.
또한, 연결 실패가 빈번하게 일어날텐데, MySQL을 쓰면 연결 실패를 복구하는것에 대해 아주 신중하게 고려해야만 하죠.

With a web service, a single call may fail, but because the communication itself is stateless (if designed well), you can just retry that one failing call.
웹서비스를 이용한다면, 단일 호출이 실패하더라도 설계가 잘 되있는한 통신 자체는 stateless(?)이기 때문에 그냥 실패한 호출을 재시도하기만 하면 되죠.

You do have to think carefully about transaction boundaries, and try to accomplish more with a single call, rather than beginning a transaction, doing a bunch of stuff, and the committing.
트랜젝션 바운더리에 대해서도 신중해야 할텐데 하나 이상의 호출을 수행해야 한다면, 그냥 트랜젝션의 시작부터 모든 일들을 한꺼번에 수행하고 마지막에 committing만 하면 되죠.

That's a good thing -- you'll get much better performance, because the round-trip time through the mobile network will be poor.
이건 매우 좋은겁니다 -- 수행성이 훨씬 나아지죠. 왜냐하면 모바일 네트워크를 통해 데이터가 왔다갔다 하는건 엄청난 시간이 걸리는 작업이니까요.

You'll also be rewarded with much superior reliability -- a single MAKE-ALL-THESE-CHANGES call happens in a shorter period of time, and is much less likely to fail due to the network than a series of BEGIN-EDIT-EDIT-EDIT-EDIT-COMMIT operations.
그리고 훨씬 나은 보안성을 얻을 수 있구요. 한번으로 여러 호출을 한꺼번에 수행하는것은 시간도 더 짧게 들고 네트워크를 통한 호출 실패를 확 줄여줍니다.

All in all, there's very good reason why nobody uses MySQL on Android, and it has nothing to do with limitations on Android.
이 모든것들이 아무도 Android 에서 MySQL 을 쓰지 않는 이유가 되겠죠. 안드로이드의 한계와는 아무 상관이 없습니다.

The same arguments actually apply to ANY client-side use of MySQL, it's just that they get even stronger on a mobile platform.
MySQL 을 사용하는 어떠한 클라이언트 라도 동일한 논쟁이 발생합니다. 단지 모바일 플랫폼 상에서는 더욱 강력하게 발생할 뿐이죠.



흠... 이건 정말이지.. 안드로이드 위에서의 MySQL 이야기가 아니라, 네트워킹을 통해 db access 를 하는 모든 클라이언트-서버 시스템의 문제가 아닐까 하는데 -_-;;;; 결국 걍 RESTfull 방식으로 데이터 전송 하라는 거잖아.;; 그거 몰라서 안하는게 아니고 걍 클라이언트 내부적으로 데이터 관리를 용이하기 위해 쓰는 DB 라면 이야기가 달라지는거 아닌가... 내가 잘못 이해하고 있는건가....
어짜피 내부적으로만 쓰는거면 (당연히 차후 데이터 스키마를 바꾸게 된다거나 할일이 없어야겠지!) MySQL 에서 서버측 라이브러리를 제공하니 이를 링크해서 쓰게 되는건데..... 쩝. -_-

아, 물론.;; 안드로이드에서 제공하는 SQLite 를 쓰는게 베스트이지만 지금 제가 이 작업을 하는 이유가 안드로이드와 임베디드 리눅스, 윈도우 CE 모두에서 돌아가는 DB 조사를 하고 있는 중이기 때문에.;;;; 수행성과는 상관없이 말입니다.

*추신-막번역입니다 오역부분 댓글주시면 수정하겠습니다. 감사.

2010. 3. 18. 00:03

C#에서 Managed Gesture API 이용.

안녕하세요,


저 같이 헤메이시는 분을 위한 팁 공유 합니다.

혹시 C# 에서 Managed Gesture API 사용하신 분들.. 낭패 보신분 없으신지요.

저의 경우, 제스쳐가 걸린 패널이 포커스를 잃은 후 일정 시간 이후 (랜덤하게.) 해당 패널로 돌아왔을때 제스쳐 이벤트가 제대로 발생 하지 않는 문제가 있었습니다. 도무지 원인을 알 수가 없었죠.
(마찬가지로, msdn 포럼 내에서도, 버튼을 더블 클릭하고 나면 제스쳐 이벤트가 뜨지 않는다는지 하는 비슷한 문제들이 다수 있었습니다. 다 같은 원인이었겠죠.)

그래서 관련 포럼글을 찾아보던 중에 문제 해결법을 찾았습니다.

관련 문제 글 링크:

이곳에 가시면 Download 탭에서 Gesture.dll 의 소스를 구하실 수 있습니다.
소스에서 일부분 수정하여 dll 을 다시 만드시면 됩니다. 내용 하단에 옮겨둡니다.

------------------------------------------------------------------------------------------------------------
댓글 내용:
The automatically generated delegates (using the implicit casts from a method to a delegate) can be garbage collected at any time, after the first garbage collection the gesture detection will stop working. To fix this problem a reference to the delegate must be stored in the GestureRecognizer class (AutoGestureContext also suffers from the same problem).
applying this patch should fix the problem.

자동으로 생성되는 delegate 들은 언제라도 가비지 콜렉팅 될 수 있기에, 처음 가비지 콜렉션이 실행되고 나면 제스쳐 탐지가 작동하지 않는다. 이 문제 해결을 위해서는 delegate의 참조객체가 GestureRecognizer 클래스 안에 있어야만 한다. 아래와 같이 하면 문제가 해결된다.

--- GestureRecognizer.cs 2009-08-26 11:53:24.000000000 -0000
+++ GestureRecognizer.cs 2010-02-26 09:46:33.000000000 -0000
@@ -30,12 +30,13 @@
private static readonly object EndEvent = new object();
private static readonly object SelectEvent = new object();
private static readonly object DoubleSelectEvent = new object();
private static readonly object HoldEvent = new object();
private static readonly object PanEvent = new object();
private static readonly object ScrollEvent = new object();
+ private WndProcHook wndProcHook = null;

private Control targetControl;

///


/// Initializes a new instance of the GestureRecognizer class
///


@@ -36,27 +37,31 @@

private Control targetControl;

///


/// Initializes a new instance of the GestureRecognizer class
///


{
if (value != this.targetControl)
{
if (this.targetControl != null)
{
// remove the WndProc hook for the previous targetControl
- Hook.RemoveHook(this.targetControl, WndProc);
+ if (wndProcHook != null)
+ {
+ Hook.RemoveHook(this.targetControl, wndProcHook);
+ }
this.targetControl = null;
}

if (value != null)
{
// add the WndProc hook for the current targetControl
this.targetControl = value;
- Hook.AddHook(this.targetControl, WndProc);
+ wndProcHook = new WndProcHook(WndProc);
+ Hook.AddHook(this.targetControl, wndProcHook);

}
}
}

}
------------------------------------------------------------------------------------------------------------

보시면 아시다시피, GestureRecognizer.cs 파일을 여시고, 일부 소스를 추가합니다. (댓글 내용대로, WndProc 딜리게이터의 참조 변수가 추가됩니다.) 제가 파란색으로 색깔구분 해 두었습니다. + 표시가 된 라인이 추가 및 수정 라인입니다.

결론은.... 제 프로그래밍 미스가 아니었다는 겁니다. -_- 분명 내가 뭘 잘못 했지라며 저처럼 헤메이고 계신 분들 많으리라 생각하면서 꼭 도움이 되길 바랍니다. 흑흑.


2010. 1. 27. 13:26

Android - HttpClient 로 서버 접속이 되지 않을 때!


나의 경우와 같이 회사 내에서 개발을 하다 보면 네트워크에 프록시 서버를 거치는 경우가 많을 것이다.
이럴때 꼭 프록시 설정을 제대로 해주도록 하자!!

            HttpParams httpParameters = new BasicHttpParams();
   HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);
   HttpConnectionParams.setSoTimeout(httpParameters, 5000);
    HttpClient httpclient = new DefaultHttpClient(httpParameters);
   HttpPost httppost = new HttpPost(server);
   HttpHost proxy = new HttpHost("프로시서버아이피", 프록시포트);
   httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

아놔... 안드로이드 네트워크 설정에서 암만 프록시 설정해줘두 안되더니만 ㅠ ㅠ 
httpclient 객체에 설정을 해줬어야 했군. 아무튼 해결!!

2009. 3. 27. 12:43

Designing with an Agile Attitude

Rebecca J. Wirfs-Brock
Attitude is a little thing that makes a big difference. —Winston Churchill



Good software designers share many traits, habits, practices, and values, whether they work on agile teams or not. Many designers value design simplicity, communication, teamwork, and responsiveness to stakeholder needs. So what distinguishes agile design from other design processes? Do successful designers working on agile projects need radically different techniques and skills?


Agile Design Supports Existing Values

As a reviewer of experience reports at several agile conferences for the past five years, I’ve vicariously experienced the joys, struggles, and triumphs of several successful design teams. Most didn’t ignore their corporate culture or existing design context even though they shifted priorities and added many new practices. Adopting agile development seems to go hand in hand with articulating what you value, then finding ways to improve on what you already do well. Jon Spence, a principal engineer at a medicalinstrumentation company, sums up his initial attraction to agile development (“There Has to Be a Better Way,” Proc. 2005 Agile Conf., IEEE Press, 2005, pp. 272–278): There’s nothing wrong with plan-driven, waterfall-based, document-centric approaches. They’re just not suited to controlling complex activities like software development. We needed to adopt agile software development because it’s the best technique for the activities we’re trying to manage and control. After studying literature, talking to agile thought leaders, and thinking about how agile practices might fit in his company’s development process, Jon and a handful of colleagues launched an agile initiative. They proposed adopting new practices that seemed radically different from their current ones:
forming s • mall development teams;
• giving each team freedom to adapt its development process;
• emphasizing simple design—designing only for current, not speculative, needs;
• developing in short, two-week iterations; and
• reflecting at the end of each iteration.
They followed test-first development on all new and changed, nontrivial, non-GUI code. They refactored code to maintain simple design only when that code had unit tests in place. Initial reactions to their proposal were largely supportive. Yet some wondered about how pair programming might impact productivity and whether it would disrupt the status quo of solo development. Management viewed refactoring as having the potential for gold plating. So, they proceeded with the understanding that these practices would get a fair trial and were subject to change as they learned and applied them. In addition to having project management support, Jon asserts, “it was equally important to have friends and allies in management, both immediate management
and upper management.” Jon’s team came from a culture that values measuring productivity and making
process improvements. So, as part of adopting agile practices, they closely monitored the amount of rework, the speed with which they completed tasks, and how effectively they worked through their feature backlog. As a result, they decided to reduce teams from 12 members to four to six members, add a team of system engineers to support the product manager in defining product features and functionality, and adjust their planning meetings to improve intrateam communication.

Agile Design Improves through Reflection

Frequent checkpoints let designers learn and refine their software and how they work. Marilyn Lamoreux, a colleague of Jon’s, has recounted how she introduced end-of-iteration reflection meetings into their project (“Improving Agile Team Learning by Improving Team Reflections,” Proc. 2005 Agile Conf., IEEE Press, 2005,
pp. 139–144). Initially, some developers believed that meetings weren’t “real work” no matter what the meetings’ agendas were. A common belief was that effective meetings should have a detailed agenda and result in actions, decisions, and to-do lists. Her first attempts at conducting reflections were only moderately successful. After investigating, Marilyn decided to introduce Conversation Café (http://tinyurl.com/4kxmcv), a technique that combines simple ground rules and a talking token to guide conversation. The first time she tried it, Marilyn was stunned by how successful it was. She was able to instigate a thought-provoking design discussion about why some code had errors and how to improve it. Marilyn speculates that this technique worked because it “taught our teams some of the conversational practices that open minds and hearts to new ideas.” Even following this technique, teams still occasionally have unproductive reflection meetings. Marilyn says, “Learning to reflect is a process that takes persistence, practice, feedback, and adaptation.” And, I
might add, determined efforts to seek out and experiment with ways to make a particular practice effective.

Agile Happens One Step at a Time

Agile design and development practices don’t have to happen all at once to be successful. David Kane reports on how he incrementally introduced agile development techniques into a team that designs software used by US National Cancer Institute scientists and researchers (“Introducing Agile Development into Bioinformatics: An Experience Report,” Proc. 2003 Agile Development Conf., IEEE Press, 2003, pp. 132–139). David’s team already worked collaboratively on development and had ready access to experimental biologists in a lab across the hall. The team wanted to adopt agile methods, but they also needed to continue to make releases while they learned new techniques. They had varying degrees of knowledge about agile methods and needed time to develop their skills.
One of the first things David did was get their code base under better configuration management. Shortly afterward, he introduced the team to automated testing. As their test case coverage grew, they started refactoring portions of ugly code, cleaning up the design and removing unnecessary complexity and coupling. It wasn’t until more than a year and a half into agile adoption that they introduced code reviews and
one-day-a-week pair programming. They wanted code reviews to complement their existing practices and help share knowledge among team members. Each iteration, one developer would pick two to six classes to review from those he or she created or modified.
Others would review the code well before the end of the iteration, giving enough time for revision. They found reviewing and discussing code let them raise design and implementation issues that occurred across larger portions of their code.


Agility Comes with an Attitude

Developing complex software can be difficult no matter how good designers get at architecture, tooling, or technology. Although agile techniques and practices vary, successful agile designers I know are passionate about producing high-quality incremental design solutions. They aim to design and implement solutions for the

current problems at hand simply and efficiently. They adopt practices, tooling, and technology that enable them to produce results. They prefer to connect their design work to real, not presumed, needs and aren’t satisfied with being only headsdown problem solvers or coders. They expect to give and take criticism and ask
clarifying questions of teammates and other project stakeholders. And they take care not to ignore details that could derail design quality or put their project at risk.

So what does it take to be an effective designer in an agile development environment?
Although I don’t find agile development to require drastically different design or technical skills, it does demand
teamwork and cooperation. Agile designers need to sharpen their communication and collaboration skills as well as their technical practices. They should value collaboration and collective understanding as much as good design and development practices.
It’s a matter of attitude more than any specific technique or process.

Developing complex software can be difficult no matter how good designers get at architecture, tooling, or technology.

2009. 3. 10. 01:10

"Professional 소프트웨어 개발" 을 읽었다.

저자: 스티브 맥코넬
출판사: 인사이트

읽으면서, 내가 스스로 소프트웨어 개발자 라고 말하기에는 챙피할 수준이라는 것과 동시에, 무언가 깨달은 것만 같은 느낌에 흥분감이 밀려왔다.
정말 많은 내용을 - 실제 개발보다는 개발 원칙과 개념적인것을 다루고 있지만 - 담고 있는 책의 내용 중 일부 내가 크게 동화된 내용을 옮겨적고자 한다. 후일에도 두고두고 보면서 "나는 소프트웨어 개발 전문가 입니다."  라고 말할 수 있는 수준이 될 때까지 노력해 볼 생각이다.
물론 내가 감명 받은 내용만을 부분적으로 적을것이므로 책의 다른 생략 된 부분에 대해서는 직접 책을 읽어야 할 것이다. 

my note 1. 프로세스 기반 개발 vs 책임 기반 개발

저자는 책에서, 실무에서 개발의 방법에는 크게 두가지 부류로 나누어 볼 수 있다고 한다. 첫째는 책임 기반 개발이고, 둘째는 프로세스 기반 개발이다.

책임 기반 개발: 쉽게 말해 영웅중심개발이다. 천재 프로그래머를(영웅) 프로젝트에 투입하는 것이다. 이러한 구조는 영웅 혹은 영웅들에게 커다란 동기를 부여하여 잠재력을 유도하는데에 목적을 둔다. (보통 영웅개발자들은 회사를 위해서가 아니고 나와 나의 자존심을 위해 개발을 하는 경우가 대부분이니까. 영웅들은 돈인나 삶의 질적 가치보다는 그들의 명예를 지키고 그에 따른 희열을 맛보기 위해 개발을 한다. 24시간을 프로젝트에 전념하며 매달리기도 한다.)

프로세스 기반 개발: 잘짜여진 계획과 프로세스 그리고 S/W 공학 기법을 사용하여 개발하는 방법이다. 모든 팀원이 골고루 역할 분배를 받으며, 프로세스에 따라 체계적으로 개발해 나간다. 이런 형태의 개발에서 영웅의 존재는 팀웍을 방해하는 굉장한 방해물이 될 것이다. 영웅들은 제멋대로 자신의 방식을 과시하면서 프로세스를 무시하고 개발하기 때문에! 뭐, 프로세스 기반 개발이 영웅기반 개발보다 세련되 보일 수는 있겠지만, 소규모 프로젝트에서는 불필요한 문서 작업과 회의량만을 늘릴 뿐이다.

어찌됬든 두 방법 모두 실무에서 쓰이고 있고 성공적인 프로젝트 사례도 많다. 허나~! 문제는 이런 방법을 어설프게 따라하려고 했을때 발생한다. 저자는 이것을 각각 이렇게 정의한다.

책임 사칭 조직: 책임 기반 개발을 어설프게 따라하는 조직. 일명. 착취조직!! 똑똑히 일하는 것보다는 열심히 일하는 것을 중시한다. 결과(긴 근무시간)과 원인(높은 동기부여)를 혼동하는 것이다. 친구들의 푸념을 들으면서 이런 조직을 종종 보는데, 이렇게 명확히 정의를 내리고 보니 문제점을 확연히 알겠다.

프로세스 사칭 조직: 관료조직! 프로세스의 형태를 본질보다 중요시하는 조직이다. 쓸데없는 산출물만을 끊임없이 만들어내면서 자신들은 지금 무척 세련되게 잘 해나가고 있다고 착각하는 조직이다. 음.. 일종의.. 세모모양 구멍에 네모모양 블럭을 억지로 끼워 넣는 기분이랄까? 네모모양 블럭은 네모모양 구멍에 넣어야지!

보면서 나는 박장대소를 하며 엄청난 공감을 하게 되는 씁쓸한 현실을 마주해야 했다.


my note 2. 화물 숭배 소프트웨어 공학.

본문에 삽입된 재미있는 이야기를 옮겨두겠다.

예전에 남태평양 어떤 섬에는 화물 숭배라는 종교를 믿는 사람들이 있었다. 당시에 섬 하늘에는 전쟁 물자를 수송하는 비행기들이 많이 다녔고, 섬 사람들은 비행기를 신의 전령이라 믿었다. 그들은 언젠가 신이 자신들에게도 비행기에 엄청난 물자를 실어 보내줄 것이라고 생각했다. 그래서 비행기가 섬으로 착륙할 수 있도록 활주로 비슷한 것을 만들기 시작했고, 활주로 좌우에는 유도등처럼 불을 피워 놓았다. 또 사람이 들어와 앉을 수 있도록 관제탐 같은 통나무 집도 만들었고, 대나무를 깎아 안테나처럼 달아 놓았다. 그 안에서 나뭇가지를 헤드셋처럼 묶고 앉아, 비행기가 착륙하기만을 하염없이 기다렸다. 그들은 이전에 다른 곳에서 본 진짜 활주로의 모습을 재현했다. 적어도 그 형태만큼은 완벽했다. 그러나 비행기는 오지 않았다. 나는 섬 사람들이 "과학적인 연구의 형태와 지침"을 따르기 때문에, 이것을 화물 숭배 과학이라 부른다. 그들은 뭔가 중요한 것을 잊고 있음이 분명했다. 왜냐하면 비행기가 한 대도 오지 않았기 때문이다. -리차드 파인만.

저자는 앞의 책임 사칭 조직과 프로세스 사칭 조직을 "화물 숭배 소프트웨어 공학" 이라고 칭했다. 프로젝트의 성공을 위한 통찰 없이 그 형태만 흉내내는 꼴이, 비행기가 한대도 오지 않는 활주로를 만든 섬 주민과 같기 때문이다.
이런 화물 숭배 소프트웨어 엔지니어는 현재에 안주하며 자신의 방식을 정당화 한다는 것이다. 일 자체가 말도 안됨에도 "우린 원래 이렇게 해 왔는걸" 이라고 말하면서 말이다.
무언가 조금 찔리지 않는가?


my note 3. 소프트웨어 공학 vs 소프트웨어 과학

책에서 이 부분을 읽으면서, 대학을 다니면서 가졌던 모호한 질문을 시원하고 깔끔하게 이해할 수 있었다. 시작은 공학과 과학의 차이점에서부터이다. (저자는, 일반적으로 생각하는 공학과 과학의 차이와 S/W에서의 공학과 과학의 차이가 크게 다르지 않다고 말한다.)
공학은 무엇인가? 공학은, 현재 만드는 제품과 관련된 모든 분야의 지식을 습득해야 한다. 또한 최종 소비자와 관련이 있기 때문에 많은 제약사항을 숙지하고 있어야 한다. 반면 과학은? 과학은, 특정 전문 지식만을 연구해도 된다. 다른 과학자와 관련이 있기에 큰 통제가 따르지 않는다.
단원의 마지막에, 공학과 과학의 차이에 대해 극단적이지만 명료하게 이렇게 정의한다.
" 공학을 전공한 학생은 학업을 마친 후 즉시 작업 현장에 투입 될 준비를 한다. 그리고 과학을 전공한 학생은 연구를 계속할 준비를 한다."

깔끔하지 않은가? 왜 소프트웨어를 전공했다는 학생들이 실무에서 샌님처럼 굴까? 그것은, 학교에서 충분한 공학 수업을 거치지 않았기 때문이다. 많은 학교들이 소프트웨어 공학을 가르친다면서 소프트웨어 과학을 가르치고, 반대로, 소프트웨어 과학을 가르친다면서 공학을 가르치고 있다. 그 두가지의 혼란선상에서, 누구나 이런생각 해보지 않았는가? "개발을 하려면, 많은 언어와 기술을 알아야 하는거야? 아니면.. 하나만 끝까지 파고들면되는거야?"
뭐 대답은 둘 다 아니다. 언어나 기술에 대한것을 아는 것이 당연히 좋겠지만, 내가 소프트웨어 공학자(즉 개발자?) 를 하기로 한 이상, 언어나 기술등 과학과 밀접한 것보다는 수많은 원칙과 다양한 분야를 섭렵하는 것이 맞다. 그럼 얼마나 다양하게??? 이 책은 어디까지 날 깨우쳐주려는건지!! 저자는 그 부분도 친절히 범위를 정의해 주었다 -ㅂ- gogo my note 4.


my note 4. 소프트웨어 엔지니어가 반드시 갖춰야 할 지식 영역.

일단, 이것은 저자가 멋대로 만든것이 아니며,  SWEBOK (ACM과 IEEE에서 관리하는 소프트웨어공학 지식체계 프로젝트.) 에서 정의한 것이다. 고로 수많은 경험이 축적된 개발자들의 머리에서 뽑아낸 매우 신빙성 있는 것이라 할 수 있다. 총 10가지이다.

- 소프트웨어 요구사항: 나에겐 아주 귀찮은 존재 영역. -_-
- 소프트웨어 설계: 나 잘났다고 뻐기는 영역이지만 사실은 매우 아마추어 수준. -_-;;
- 소프트웨어 구축: 나의 지식 영역의 50%는 여기에 집중되어 있다.
- 소프트웨어 테스팅: 필요성은 알지만 가볍게 무시하는 수준. -_-
- 소프트웨어 유지보수: 필요성은 알지만 할 줄도 모르고 하기도 귀찮다 -_-;;;
- 소프트웨어 형상관리: 그나마 요근래 맛만 살짝 본 영역.
- 소프트웨어 품질: 테스팅도 안하는데. 품질에 신경쓰겠는가? -ㅂ- 완전무시수준.
- 소프트웨어 공학 관리: 그렇저렇 하는 수준.
- 소프트웨어 툴과 방법론: 소프트웨어 구축을 뺀 나의 남은 지식 영역이 여기에 포함된다.-ㅂ-;;
- 소프트웨어 프로세스: 알만큼 알고 필요성도 알기에 하고는 있지만 귀찮아 하는 수준. -_-

위에서 색이 진할수록 나의 지식영역이 집중포화 되있다고 볼 수 있다. 이야... 영양의 불균형이 지나치게 드러난다. 아마 관련 전공 학사 학위자는 대부분 나와 비슷하지 않을까 한다. 이 부분에서.. 조금은 내 자신이 창피하다. -_- 사실 소프트웨어 설계니 구축이니.. 방법론도, 그냥 아는 것이 많다뿐, 별로 어떻게해야 '잘' 하는 것인지 아직도 모호하다. 다양한 프로젝트에 대한 경험을 쌓아야 하는 문제겠지만 말이다.


my note 5. 소프트웨어 의식 향상

지식을 갖췄다고 해서 다가 아니다. 개발자로서의 의식자체를 업그레이드 해야한다. 저자는 아래와 같은 3단계로 나누고 있다.

의식 1 - 개척자 정신. 소프트웨어로 치면, 야생마.. 프리마돈나.. 수준? 개발자의 자만심과 관련된 의식이라고 한다. 자기 멋대로 막무가내로 개발하지만 어쨋든 결과는 나온다. 가끔은 꽤 성공적일때도 있어서 자신을 천재로 착각하기도 한다. 그럼과 동시에 다른 사람의 의견에 배타적으로 변하고 지식에 닫혀 있다.

의식 2 - 양복쟁이. 일종의 규칙 중시자이다. 이럴때 이렇게 저럴땐 저렇게. 의식 1 상태에서 한계를 깨닫고(당연히 그렇겠지..-_-) 팀 단위 개발을 하기 시작하는 단계라고 한다. 이 단계에서는 방법론을 중시하기 때문에 자칫 잘못하면 프로세스 사칭 팀으로 전락할 수도 있다고 본다.

의식 3 - 계몽 독립 정신! 마지막 단계이다. 원칙에 초점을 맞춘다. 예를들자면, 소프트웨어의 결합도를 낮추고 응집도를 높여야 한다는 원칙을 위해 수많은 디자인 패턴들이 쏟아져 나오는 것을 생각할 수 있겠다. 의식 2 에서는 이것을 반대로 여겨, 디자인 패턴을 써야만 결합도를 낮출수 있다고 착각한다.(물론 사실이지만, 디자인 패턴은 optional 한 것이지 mandatory 한 것은 아니다) 의식 3에서는 결합도를 낮추는 것에 집중하는 것이지, 디자인패턴에 구애받지 않는다.

나는 의식 2에 머물러 있는듯 하다. 그리고 슬픈 것은 의식 1에서 의식2로 넘어온지 얼마 안된것 같은 느낌을 받는다. 나아갈 길이 멀다.