'Mono'에 해당되는 글 55건

  1. 2014.08.11 ubuntu 14.04에서 asp.net vnext 설치하고 사용하기
  2. 2013.10.20 Windows Azure Linux Virtual Machine과 docker를 이용한 Linux 기반의 C# 개발 환경 구축
  3. 2012.10.29 Mono 3.0 출시
  4. 2010.11.30 Delphi Prism, .NET, 그리고 iPhone App 개발
  5. 2010.10.13 Mono 2.8 출시
  6. 2010.03.16 MIX10 행사가 시작되었습니다! (2)
  7. 2009.12.16 Mono 2.6 출시! (2)
  8. 2009.08.04 C#, .NET으로 Apple iPhone 프로그램 만들기 (2)
  9. 2009.07.15 ECMA C# / ECMA CLI에 대한 Microsoft Community Promise 시행
  10. 2009.07.01 Mono Tools for Visual Studio 소개 (2)
  11. 2009.02.03 SuSE Studio Alpha 런칭
  12. 2009.01.16 Mono 2.2 출시
  13. 2009.01.13 Delphi Prism for .NET 발표 (2)
  14. 2008.08.08 Mono 2.0 Preview 1
  15. 2008.08.05 리눅스에서 닷넷하기: MonoDevelop와 지역화 프로그래밍
  16. 2008.07.22 리눅스에서 닷넷하기: MonoDevelop의 Packaging 기능
  17. 2008.07.20 리눅스에서 닷넷하기: MonoDevelop에서 만드는 Hello World
  18. 2008.03.24 리눅스에서 닷넷하기: Intro (2)
  19. 2007.12.14 Mono 1.2.6 런칭!
  20. 2007.12.08 xPlatform works in Linux!
  21. 2007.11.25 Known Issue: Mono의 __arglist 비호환성
  22. 2007.09.01 Mono 1.2.5 출시
  23. 2007.02.10 Mono 1.2.3 런칭
  24. 2006.09.17 Orientation - Welcome to Iron Python!
  25. 2006.01.04 [팁] Verbatim String에 관해 알아둘 몇 가지
  26. 2005.10.18 .NET 프레임워크의 종류와 근황
  27. 2005.10.03 [C# 고급] 이벤트 처리기 작성하기
  28. 2005.07.17 [팁] Mono 1.1.x 빌드에서 C# 2.0 기능 활용하기
  29. 2005.07.17 C# 2.0의 구문 살펴보기 Part 3: Generic 클래스
  30. 2005.07.17 C# 2.0의 구문 살펴보기 Part 2: 익명 대리자
Linux + .NET2014. 8. 11. 09:35

업데이트: mono 3.8이 9월 초에 새로 릴리즈되었으며 이 내용을 기초로 새로 업데이트한 아티클을 올렸습니다.

이 블로그 포스트의 내용은 아래 두 블로그 포스트의 내용을 기초로 작성한 것임을 말씀드립니다.
•http://graemechristie.github.io/graemechristie/blog/2014/05/26/asp-dot-net-vnext-on-osx-and-linux/
•http://www.rocko.me/install-mono-3-4-ubuntu/

또한 이 블로그 포스트는 MS Azure Virtual Machine과 Ubuntu Server 14.04 버전을 최초 설치했을 때의 상태를 기준으로 작성된 것이며, 이 블로그 글을 작성하는 2014년 8월 현재 ASP.NET vNext가 정식 출시 전임을 말씀드립니다.

주의: 실제 배포 환경에서 이 블로그 포스트의 내용을 활용하시는 것은 매우 위험합니다.

 

 

ASP.NET vNext는 기존의 System.Web 기반의 레거시 웹 개발 프레임워크에서 탈피하고자 하는 MS의 강력한 의지의 결과물인듯 합니다. 이전에는 상상하기 어려웠고, MS의 손이 아닌 오픈 소스 그룹 (Mono의 System.Web 구현)이나 써드 파티 회사 (Grasshoper 같은)에 의한 제한적인 수준의 작업 결과물일 뿐이었던 ASP.NET의 이식성이 이제서야 완벽함을 기할 수 있게 되었습니다.

이 블로그 포스트에서는 ASP.NET vNext를 우분투 서버 14.04에서 설치해본 과정을 기록하여 그것을 토대로 작성하였습니다. ASP.NET vNext의 발전 가능성을 살펴보시고, 여러 이야기를 나눌 수 있지 않을까 하여 기록해봅니다.

사전 준비 작업

ASP.NET vNext는 Windows 서버 환경에서는 손수 기존에 설치된 .NET Framework를 대체하는 K Runtime을 사용하여, 어느 버전의 K Runtime을 사용할 것인지 패키지 레벨에서 정의할 수 있는 것이 특징이었는데, 리눅스의 경우 기본 실행 엔진은 현재는 Mono를 기반으로 하고 있는 것이 특징입니다. 그럼에도 불구하고 K Runtime이 가지는 영역이 엄연히 있고, 아마 핵심 실행 엔진만 현재는 Mono를 기반으로 실행되는 것 같습니다.

그런 이유로 Mono의 최신 버전을 시스템에 설치해야 하는데, 안타깝게도 Ubuntu 14.04에 등록된 Mono 패키지의 최신 버전은 ASP.NET vNext를 실행하기 위해 필요한 버전과 격차가 상당히 크고, 또한 지원되지 않습니다. 그래서 제일 먼저 해야 할 일은 github에 올라와있는 Mono 소스 코드를 내려 받아 컴파일하고 새 버전으로 바꾸는 작업입니다.

우선은 기존에 Mono 런타임을 설치했던 이력이 있을 경우를 고려하여 Mono와 관련된 모든 패키지를 제거해야 하는데, 아래 명령어로 간단히 제거할 수 있습니다.


sudo apt-get -y purge mono-*

그 다음, Mono를 설치하기 위하여 필요한 이미징 라이브러리 관련 종속성을 해결해주어야 하는데, 필요한 패키지들중 상당수는 Ubuntu 14.04에서 직접 지원하지 않거나 오래된 버전으로 취급하여 apt-get으로 직접 설치가 어려운 패키지들입니다. 따라서, 이들 패키지들을 수동으로 내려 받아 설치하는 작업이 필요한데, 아래 명령어를 복사하여 하나씩 실행하시면 되겠습니다.


wget http://security.ubuntu.com/ubuntu/pool/main/j/jbigkit/libjbig0_2.0-2ubuntu1.13.10.1_amd64.deb
 wget http://security.ubuntu.com/ubuntu/pool/main/libj/libjpeg-turbo/libjpeg-turbo8_1.3.0-0ubuntu1.1_amd64.deb
 wget http://mirrors.kernel.org/ubuntu/pool/main/libj/libjpeg8-empty/libjpeg8_8c-2ubuntu8_amd64.deb
 wget http://mirrors.kernel.org/ubuntu/pool/universe/t/tiff3/libtiff4_3.9.7-2ubuntu1_amd64.deb
 wget http://mirrors.kernel.org/ubuntu/pool/universe/t/tiff3/libtiffxx0c2_3.9.7-2ubuntu1_amd64.deb
 wget http://mirrors.kernel.org/ubuntu/pool/main/libj/libjpeg8-empty/libjpeg-dev_8c-2ubuntu8_amd64.deb
 wget http://security.ubuntu.com/ubuntu/pool/main/j/jbigkit/libjbig-dev_2.0-2ubuntu1.13.10.1_amd64.deb
 wget http://security.ubuntu.com/ubuntu/pool/main/libj/libjpeg-turbo/libjpeg-turbo8-dev_1.3.0-0ubuntu1.1_amd64.deb
 wget http://mirrors.kernel.org/ubuntu/pool/main/libj/libjpeg8-empty/libjpeg8-dev_8c-2ubuntu8_amd64.deb
 wget http://mirrors.kernel.org/ubuntu/pool/main/libj/libjpeg8-empty/libjpeg-dev_8c-2ubuntu8_amd64.deb
 wget http://mirrors.kernel.org/ubuntu/pool/universe/t/tiff3/libtiff4-dev_3.9.7-2ubuntu1_amd64.deb

sudo dpkg -i libjbig0_2.0-2ubuntu1.13.10.1_amd64.deb
 sudo dpkg -i libjpeg-turbo8_1.3.0-0ubuntu1.1_amd64.deb
 sudo dpkg -i libjpeg8_8c-2ubuntu8_amd64.deb
 sudo dpkg -i libtiff4_3.9.7-2ubuntu1_amd64.deb
 sudo dpkg -i libtiffxx0c2_3.9.7-2ubuntu1_amd64.deb
 sudo dpkg -i libjbig-dev_2.0-2ubuntu1.13.10.1_amd64.deb
 sudo dpkg -i libjpeg-turbo8-dev_1.3.0-0ubuntu1.1_amd64.deb
 sudo dpkg -i libjpeg8-dev_8c-2ubuntu8_amd64.deb
 sudo dpkg -i libjpeg-dev_8c-2ubuntu8_amd64.deb
 sudo dpkg -i libtiff4-dev_3.9.7-2ubuntu1_amd64.deb

Mono 최신 버전 설치하기

이제 기본 준비 작업은 끝났고, 필요한 패키지들을 한꺼번에 설치할 차례입니다. 아래 명령어를 입력하도록 합니다.


sudo apt-get -y install libpng3 libpng3-dev libtool libexif12 libexif-dev libgif4 libgif-dev libpango1.0-dev libatk1.0-dev libgtk-3-0 libgtk-3-dev bison automake autoconf make gcc gtk-sharp2 build-essential xorg-dev libfreetype6 libfontconfig libfontconfig-dev gettext libglib2.0-dev git libjpeg-dev libjpeg8-dev libjpeg-turbo8-dev g++ unzip

쉬운 설명을 위하여, 사용자 프로필 디렉터리에서 설치를 진행한다고 가정하겠습니다.


cd ~

설치가 모두 되고 나면, mono git 리포지터리에서 libgdiplus 소스를 복사합니다.


git clone https://github.com/mono/libgdiplus.git

받은 소스 디렉터리로 이동합니다.


cd ~/libgdiplus

그리고 각종 설정 검사 및 헤더 구성을 진행합니다. 주의할 것은 공식 가이드에서는 –prefix=/usr/local로 소개하고 있으나 우분투의 경우 아래와 같이 /usr을 기준으로 잡아야 합니다.


./autogen.sh –prefix=/usr

구성이 끝나면 컴파일을 하도록 합니다.


make

컴파일 중 특별한 오류 메시지가 없었다면 시스템에 설치하도록 합니다.


sudo make install

이제 다시 홈 디렉터리로 이동합니다.


cd ~

mono 소스를 컴파일하는 과정 중에는 재귀적으로 mcs 컴파일러가 필요합니다. 이를 위하여 mono-gmcs 패키지를 구 버전이지만 우선 설치해야 합니다.


sudo apt-get -y install mono-gmcs

설치가 끝나면, 이제 mono 소스를 복사하도록 합니다.


git clone git://github.com/mono/mono.git
 cd mono

libgdiplus 때와 마찬가지로 prefix 설정에 유의하여 자동 구성을 진행합니다. 자동 구성 중에 다른 git 리포지터리에서 추가로 관련된 소스를 내려받기도 합니다.


./autogen.sh –prefix=/usr

모든 구성이 끝나면 컴파일하고 설치하도록 합니다.


make
 sudo make install

모든 설치가 다 끝났다면, 새 버전 (2014년 8월 현재 3.8)으로 업데이트가 잘 되었는지 확인해보도록 합니다.


mono –version
 mcs –version

위의 명령어에서 새 버전으로 표시가 된다면 ASP.NET vNext를 설치할 준비가 다 끝난 것입니다. 이제 다시 홈 디렉터리로 이동합니다.


cd ~

계속 하기 전에, 라이브러리 경로에 관련된 환경 변수를 하나 설정해주는 것이 좋습니다. 아래 명령어를 실행하여 LD_LIBRARY_PATH 환경 변수를 설정하도록 합니다.


export LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH

K Runtime과 ASP.NET vNext 설치하기

이제 중요한 부분이 남았습니다. K Runtime과 ASP.NET vNext를 설치하는 것이 남았는데, 앞의 과정보다 시간도 짧게 걸리고 비교적 쉽습니다.

ASP.NET vNext의 전체 소스 코드를 복사하지 않고 필요한 셸 스크립트 파일인 kvminstall.sh 파일만 가져오도록 합니다. 아래 명령어를 홈 디렉터리에서 실행합니다.


curl https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.sh | sh

경로 설정을 맞추기 위하여, 아래 명령어를 실행합니다.


source ~/.kre/kvm/kvm.sh

이제 KVM을 사용자 프로필 디렉터리 아래의 .kre 폴더에 설치하기 위해, 다음 명령어를 실행합니다.


kvm upgrade

기본적인 실행 환경이 준비되었고, K Package Manager (달리 표현하면 K Package Manager의 실행을 담당하는 Mono)가 통신해야 할 사이트들의 HTTPS 인증서를 추가한 다음, 시스템에 설치된 루트 인증서를 가져올 수 있도록 하기 위하여 아래 명령어들을 실행합니다. 확인 프롬프트가 나타나면 여러번 yes를 입력하여 모든 필요한 인증서 및 인증서 체인을 가져오도록 합니다.


sudo certmgr -ssl -m https://go.microsoft.com
 sudo certmgr -ssl -m https://nugetgallery.blob.core.windows.net
 sudo certmgr -ssl -m https://nuget.org
 sudo certmgr -ssl -m https://myget.org
 mozroots –import –sync

Hello, World! 찍어보기

모든 설치가 끝났습니다. 예제 소스 코드를 가져와서 실행하기 위하여, David Fowler님의 github 리포지터리에 올라와있는 ASP.NET vNext 샘플을 이용하도록 하겠습니다. 공식 웹 사이트에 있는 샘플은 HTTPAPI를 기반으로 하는 것이어서 Nowin Factory로 교체하여 실행할 수 있지만 쉬운 설명을 위해 David Fowler님의 예제를 가져와서 대신 설명함을 말씀드립니다.

홈 디렉터리로 이동합니다.


cd ~

그리고 아래 명령어를 실행하여 콘솔 프로젝트 샘플 소스를 복사합니다.


git clone https://github.com/davidfowl/HelloWorldVNext.git

해당 디렉터리로 이동하여 다음 순서대로 명령어를 입력하여 Hello World! 메시지가 나타나는지 확인합니다.


cd ~/HelloWorldVNext/src/helloworld
 kpm restore
 k run

여기서 kpm restore 명령은 해당 예제를 실행하기 위하여 필요하다고 project.json에서 명시한 NuGet 패키지들을 전부 시스템에 설치하는 과정을 포함하며, 최초 한 번만 실행하면 됩니다. 그리고 k run 명령은 project.json 또는 그 상위에 정의되어있는 run 명령어를 실행한다는 의미이며, 보통 run 명령어는 재정의하지 않는 한 Main 메서드를 찾아 실행하는 것과 의미가 같습니다.

받은 프로젝트 디렉터리 상의 파일을 보면 흥미로운 것이, 이전처럼 mcs (gmcs)를 호출하여 exe 파일을 만들지 않았는데도 소스 상태에서 바로 k run이라는 명령어를 넣으면 프로그램이 시작된다는 점입니다. 이런 방식의 닷넷 응용프로그램은 웹 환경에서 큰 강점을 발휘하게 될 것입니다.

ASP.NET vNext 샘플 웹 프로젝트 띄워보기

이제 핵심입니다. ASP.NET vNext 샘플 웹 프로젝트를 띄워볼 차례인데, 다음과 같이 명령어를 입력하도록 합니다. 물론, 진행의 편의를 위해 홈 디렉터리에서 실행하는 것이 좋겠습니다.


git clone https://github.com/davidfowl/HelloWorldVNext.git
 cd ~/HelloWorldVNext/src/helloworldweb
 kpm restore
 k web

예제에 같이 들어있는 Nowin Factory 프로젝트의 코드를 보면 TCP/5000 포트를 웹 리스너 포트로 사용하고 있습니다. 밖에서 호스트 이름과 함께 5000번 포트로 접속하면 웹 페이지가 나타나는 것을 볼 수 있습니다. 그리고 서버를 종료하려면 콘솔에서 아무 키나 누르면 종료가 됩니다.

만약에 원격에서 좀 더 지속적으로 서버의 성능을 측정해보고 싶으시다면 screen 유틸리티를 사용하여 세션을 분리하신 상태에서 위의 명령어를 입력하고, 서버가 떠 있을 때 Ctrl 키를 누른 상태에서 빠르게 a, a, d 키를 누르면 세션이 분리되어 계속 살아있는 서버가 만들어집니다. 이 상태에서 Apache Bench (AB)등의 유틸리티를 사용하여 부하 테스트 등을 해보시는 것도 의미가 있을 것입니다.

참고로, NAT 환경이나 퍼블릭 클라우드 환경에서는 대표 IP 주소에 대한 외부 방화벽 설정을 열어주셔야 밖에서도 접속이 가능합니다.

마무리

아직 ASP.NET MVC 6나 다른 기술들이 완전히 준비된 것은 아니지만, 이 정도만 하더라도 ASP.NET은 더 이상 윈도 OS 안에서만 사용 가능한 기술이 아니라는 것을 증명하는데에는 손색이 없을 것입니다. 더 많은 가능성과 잠재력을 포함하는 최신 기술이 곧 나타나게 될 것이 무척 기대가 됩니다.

만약 기존에 ASP.NET 웹 사이트를 개발해 놓은 것이 있다면, ASP.NET vNext로 프로젝트를 마이그레이션하면서 플랫폼에 중립적으로 동작하는 코드로 업데이트하는 프로젝트를 한 번 진행함으로서 그리 어렵지 않게 멀티 플랫폼으로 ASP.NET 웹 응용프로그램을 포팅하실 수 있을 것입니다.

앞으로 더 자세한 정보와 상세한 내용들, 그리고 활용 방안들도 블로그 포스트로 전할 수 있도록 하겠습니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

IaaS2013. 10. 20. 22:30

Windows Azure의 Virtual Machine 서비스는 Windows와 Linux를 Guest OS로 지원하는 전형적인 IaaS 플랫폼입니다. 그리고 Linux는 다양한 오픈 소스 소프트웨어와 결합할 수 있는 매우 이상적인 소프트웨어 개발 환경이기도 합니다.

Linux에서 사용할 수 있는 매력적인 소프트웨어들 중 최근 큰 주목을 받고 있는 프로젝트로 docker 프로젝트가 있는데, 이 프로젝트는 기본적으로 Hypervisor 없이 Linux 실행 환경을 가상화하고 서로 격리된 상태로 실행할 수 있도록 도와주는 Linux Container (LXC)를 조금 더 실용적이고 사용하기 편리하게 만들어주는 컴패니언 소프트웨어로, 이미지를 공유하거나, 이미지로부터 생성하는 컨테이너를 만들기 위해 필요한 명령을 자동으로 등록하거나, 컨테이너를 이미지로 변환하는 등의 작업을 단순화합니다.

docker 프로젝트를 설치하고 사용하는 방법에 대한 가이드는 인터넷 상에 이미 다양한 자료로 게시된 적이 있고, 최근에 열린 NAVER 개발자 행사인 DeVIEW 2013에서도 다루어진 적이 있습니다. (http://www.slideshare.net/modestjude/docker-in-deview-2013)

오늘 살펴보려는 내용은 docker 프로젝트를 Windows Azure Virtual Machine 상에서 설치하고 이용하는 방법과 함께, docker Index에 게시되어있는 최신 버전의 Mono 이미지를 다운로드하고 활용하는 방법을 간단히 살펴보려고 합니다. 지금 소개하는 방법을 통해서 쉽고 빠르게 리눅스 기반의 다중 개발 환경을 손쉽고 빠르게 프로토타이핑할 수 있습니다.

시작하기 전에 - Hypervisor 안에서 또다른 가상 환경을 만드는 것은 불가능하지 않습니까?

docker를 일반적인 PC나 서버 환경이 아닌 곳에서 사용할 때 가장 먼저 드는 의문점이 바로 이것입니다. 기본적으로 Hypervisor 위에서 실행하는 OS는 또 다시 가상 환경을 만들어낼 능력이나 여건이 되지 못합니다. 가능하도록 설정했다고 해도 결국 물리적인 한계에 부딪힐 가능성이 커집니다.

사실, docker는 Hypervisor가 아니기 때문에 Hypervisor 고유의 CPU 기능을 활용하는 일은 거의 없고, 호스트가 되는 리눅스의 커널의 재량에 따라 그 안에서 실행되는 독립적인 프로세스일 뿐입니다. 그러나, 제아무리 docker가 유용하다고 해도, 시스템이나 VM에 할당된 자원의 밀도나 품질을 생각해보았을 때 docker가 실제 처리할 수 있는 작업의 양이 항상 효율적이라고는 할 수 없습니다. 따라서, docker를 사용한 시스템 구축은 전적으로 충분한 시나리오 테스트와 QA를 거쳐야만 함을 염두에 두어야 할 것입니다.

docker로 할 수 있는 일

docker는 단순히 프로세스만을 격리하는 것이 아니라 일정 수준의 가상 환경을 다룹니다. 즉, 자체적으로 이용할 수 있는 파일 시스템, 네트워크 어댑터, 가용 메모리 크기 등이 있고, 상황에 따라 이들 자원의 크기가 동적으로 변화하게 됩니다. 그러나 우리가 일반적으로 사용하는 완전한 Hypervisor와는 다르게 자원을 명시적으로 제한할 수 있는 방법이 2013년 10월 현재 기준으로 특별히 없습니다. 그리고 네트워크는 사설 IP로만 할당되기 때문에, docker가 자체적으로 구성하는 NAT를 이용하여 외부로부터 들어오는 네트워크 요청을 특정 컨테이너 앞으로 도착하도록 연결해주는 것이 꼭 필요합니다.

그럼에도 불구하고, docker는 리눅스 기반의 환경에서 항상 있을 수 있는 파일 시스템, 커널, 잘못된 라이브러리나 패키지 설치로 인한 시스템의 중단으로부터 안전하게 지켜줄 수 있고, 신뢰할 수 있을만한 수준을 제공하면서도, 가볍게 다룰 수 있는 가상 환경을 제공한다는 점에서 큰 주목을 받고 있으며, 심지어 Hypervisor 기반의 실행 환경 위에서 전혀 다른 Linux Guest를 추가 실행할 수 있을만큼 유연합니다.

docker Index (https://index.docker.io/)에 게시된 이미지들을 살펴보면 알겠지만 호스트의 Linux OS와 아무 관련이 없는 busybox 같은 응급 이미지도 존재하고, Ubuntu가 호스트인 시스템에서 CentOS를 컨테이너 OS로도 택하는 것이 가능합니다. 즉, docker 환경에 맞추어 개발된 OS이기만하면 docker와의 상호작용을 전제로 호스트 OS와 완전히 분리된 환경에서 실행이 가능하므로 독립적인 환경 구성이 가능함을 뜻합니다.

docker를 Azure Linux VM 위에 설치하기

docker는 LXC 프로젝트를 기반으로 하기 때문에, 커널 버전에 대한 의존성이 크고, 사용할 수 있는 Host OS의 종류에도 제한이 있습니다. 현 시점에서는 Ubuntu Linux 13.04에서의 실행이 가장 안정적이기 때문에, Windows Azure Virtual Machine 갤러리에서 다음 그림과 같이 Ubuntu Linux 13.04 기반의 VM을 하나 추가해서 시작하셔야 합니다. 만약 Ubuntu Linux 12.04나 12.10 버전을 실행 중인 경우 Secure Shell 터미널 환경을 통하여 원격으로 13.04로 업그레이드하는 명령을 실행할 수도 있지만, libcurse 기반의 UI 실행이 일부 필요하기 때문에 putty 등에서는 정상적으로 보이지 않을 수 있고, 또한 잘못 선택할 경우 VM에 원격 접속이 불가능한 상황이 올 수 있으므로 추천하지 않습니다.

http://manage.windowsazure.com/ 으로 접속하여 새 VM을 갤러리로부터 생성하도록 시작합니다. 아래와 같은 대화 상자가 나타나는지 확인한 후 Ubuntu Linux 13.04를 선택합니다.

 

다음 버튼을 클릭한 다음 기본 VM 설정을 입력합니다.

 

PuttyGen을 이용하여 키 체인을 만들어 업로드하거나, 사용자 암호를 지정하고 다음 버튼을 클릭합니다.

 

클라우드 서비스는 네트워크 연결 및 중재를 위한 기본 단위이자 실행 환경을 정의하는 단위 환경입니다. docker 환경과 연결하려는 클라우드 서비스나 다른 VM이 있을 경우 같이 소속되도록 설정해주시고, 가용성 설정 등을 확인한 다음 다음 버튼을 클릭합니다.

 

기본적으로 SSH 포트가 열려있습니다. 그러나 docker container와의 연결을 허용하고 외부에서 접속을 받아들이려면 Windows Azure의 방화벽 설정도 수정해야 합니다. 외부에서 docker container 서비스로의 접속이 안된다면 이쪽의 방화벽 설정을 꼭 확인하셔야 합니다. 마침 버튼을 클릭하여 VM 생성을 시작합니다.

 

VM의 외부 DNS 주소를 확인하고, putty로 접속을 시작합니다.

 

접속이 완료되었다면 이제부터 명령어 입력을 진행합니다. 설치 가이드의 내용은 http://docs.docker.io/en/latest/installation/ubuntulinux/#ubuntu-raring-13-04-64-bit 에서 발췌하였습니다.

우선 최신 패키지 목록을 가져오기 위하여 다음 명령을 수행합니다. 최신 릴리즈를 사용하여 VM을 만들었다면 별 다른 업데이트는 발생하지 않을 것입니다.

sudo apt-get update

그리고 Ubuntu 13.04 시스템들 중 일부 릴리즈에서 누락되어있을 수 있는 AUFS 파일 시스템에 대한 지원 (LXC 실행을 위해 꼭 필요합니다.)을 추가하기 위하여 아래 명령어를 수행합니다. 참고로 Azure Virtual Machine을 통하여 최신 릴리즈를 사용하도록 VM을 생성했다면 역시 AUFS에 대한 지원이 이미 포함되어있어서 아래 명령어로 시스템에 변화가 발생하지는 않을 것입니다.

sudo apt-get install linux-image-extra-`uname -r`

이제 docker 리포지터리에 접근하여 패키지를 설치할 차례입니다. 우선 키 체인을 다운로드하여 시스템에 등록하여 docker 패키지를 인터넷으로부터 다운로드할 수 있도록 허가합니다.

sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"

OK라는 메시지를 확인하였으면 이어서 리포지터리 목록에 docker 리포지터리를 추가하기 위하여 다음 명령어를 실행합니다.

sudo sh -c "echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"

이제 패키지 업데이트를 다시 수행하여 사용 가능한 패키지 목록을 갱신합니다.

sudo apt-get update

출력 중에서 다음과 비슷한 메시지가 들어있는지 확인합니다.

Get:3 http://get.docker.io docker/main amd64 Packages [1,395 B]

이제 패키지 목록을 업데이트하였으므로 lxc-docker 패키지가 사용 가능한 상태가 되었을 것입니다. lxc-docker 패키지를 아래 명령으로 설치합니다.

sudo apt-get install lxc-docker

종속 패키지들을 다수 설치해야 함을 알리는 메시지가 나타나면 y 키를 눌러 진행합니다.

설치가 잘 되었는지 확인해보기 위하여 docker Index 사이트로부터 ubuntu 게스트 OS 이미지를 다운로드해보겠습니다. 아래 명령어를 실행합니다.

sudo docker run -i -t ubuntu /bin/bash

아래와 같이 다운로드 메시지가 나타나고 콘솔이 바뀌는 것을 확인하기 바랍니다.

rkttu@dockertest:~$ sudo docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu' (tag: latest) locally
Pulling repository ubuntu
8dbd9e392a96: Download complete
b750fe79269d: Download complete
27cf78414709: Download complete
root@f45ee37cf476:/#

호스트 이름이 Azure VM의 dockertest가 아니라 임의로 작명한 f45ee37cf476이라는 이름으로 바뀐 것을 볼 수 있습니다. 그리고 IP 주소 대역도 다르다는 것을 쉽게 파악할 수 있는데, ifconfig을 비롯한 네트워킹 도구가 이 버전의 이미지에는 들어있지 않기 때문에 다음 명령어를 실행하여 net-tools 패키지를 설치합니다.

apt-get install net-tools

격리 환경 상에서 자동으로 root 권한을 얻었으므로 sudo를 덧붙일 필요가 없습니다. 설치가 끝난 다음, ifconfig eth0 명령을 실행하면 다음과 같이 나타납니다.

eth0      Link encap:Ethernet  HWaddr fa:b2:4f:b9:15:84
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::f8b2:4fff:feb9:1584/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:192 errors:0 dropped:0 overruns:0 frame:0
          TX packets:81 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:267507 (267.5 KB)  TX bytes:5591 (5.5 KB)

굵게 강조 표시한대로 사설 IPv4 주소가 할당되어있습니다. 그리고 패키지 업데이트와 업그레이드를 진행하여 인터넷 연결 상태를 다시 한 번 확인해봅니다.

apt-get update
apt-get upgrade

가상 환경에서 나가기 위하여 exit 명령을 입력하면 다음과 같이 원래의 Host OS로 프롬프트가 바뀌는 것을 볼 수 있습니다.

root@f45ee37cf476:/# exit
exit
rkttu@dockertest:~$

이제 방화벽 설정을 확인합니다. 기본적으로 Ubuntu는 ufw라는 방화벽 프로그램을 이용합니다. 그리고 Windows Azure 기본 구성 이미지에서는 ufw가 비활성화되어있고, Windows Azure의 방화벽이 외부로부터의 연결을 차단하며, Windows Azure 간 네트워크에는 제한이 없습니다. 아래 명령어를 입력하여 방화벽 상태를 확인합니다.

rkttu@dockertest:~$ sudo ufw status
Status: inactive
rkttu@dockertest:~$

그리고 방금 전 테스트를 위하여 받은 이미지와 그 이미지를 기반으로 실행한 컨테이너가 잘 등록되었는지 확인하여 설치 프로세스를 마무리합니다.

rkttu@dockertest:~$ sudo docker images -a
REPOSITORY          TAG                 ID                  CREATED             SIZE
ubuntu              12.04               8dbd9e392a96        6 months ago        131.5 MB (virtual 131.5 MB)
ubuntu              latest              8dbd9e392a96        6 months ago        131.5 MB (virtual 131.5 MB)
ubuntu              precise             8dbd9e392a96        6 months ago        131.5 MB (virtual 131.5 MB)
ubuntu              12.10               b750fe79269d        7 months ago        24.65 kB (virtual 180.1 MB)
ubuntu              quantal             b750fe79269d        7 months ago        24.65 kB (virtual 180.1 MB)
<none>              <none>              27cf78414709        7 months ago        180.1 MB (virtual 180.1 MB)

rkttu@dockertest:~$ sudo docker ps -a
ID                  IMAGE               COMMAND             CREATED             STATUS              PORTS
f45ee37cf476        ubuntu:12.04        /bin/bash           8 minutes ago       Exit 0

예상한 대로 이미지가 다운로드되어있고, 해당 이미지를 기반으로 /bin/bash 앱에 대한 컨테이너가 생성 후 실행되었으며 종료 코드 0으로 종료되었다는 결과 표가 보입니다.

mono 개발 환경 빠르게 구축하기

mono 개발 환경을 입맛에 맞게 구축하는 방법은 여러가지가 있습니다. 방금 전처럼 base image를 받아서 수작업으로 설치하거나, 그 과정을 서술하는 Dockerfile을 만들어 한 번에 일괄 실행하여 시스템의 설치를 전개하는 방식도 있을 수 있습니다. 그렇지만 docker를 개발 환경으로 이용하기 위해서 취할 수 있는 가장 좋은 방법은 docker Index 사이트에 게시된 최신 이미지를 확인하여 해당 이미지를 직접 로컬 시스템으로 Pull 하는 것입니다.

편의를 위하여 잠시 리눅스 콘솔에서 윈도 화면으로 되돌아온 다음 https://index.docker.io/ 로 접속하여 키워드로 mono를 지정하고 검색합니다.

 

 

Ubuntu 이미지를 이용하여 Mono 3.2.3을 설치하여 배포하는 이미지가 Docker Index에 올라와있습니다. 그 외에도, 닷넷 기반의 SOA 실행 및 개발 환경 구축을 편리하게 할 수 있도록 Service Stack과 연계한 리눅스 이미지도 보입니다. 우리가 사용하려는 것은 rwentzel/ubuntu-mono 이미지이므로 이 이미지의 이름을 기록합니다.

이제 다시 리눅스 콘솔로 되돌아가서 해당 이미지를 로컬 리포지터리로 다운로드하겠습니다. 다음 명령어를 실행하여 동기화를 시작합니다. 해당 이미지는 여러 차례 수정을 거쳐 만들어진 것이기 때문에 다운로드에 다소 시간이 걸리니 조금 오래 기다리셔야 합니다.

sudo docker pull rwentzel/ubuntu-mono

이미지 다운로드가 완료되었다면, 이제 이 이미지를 이용하여 컨테이너를 만들고 정말 안에 mono 개발 환경이 들어있는지 확인해볼 차례입니다. 아래 명령어로 이미지를 우선 확인합니다.

sudo docker images -a

설치한 이미지의 갯수가 매우 많아졌습니다. 그런데 주의할 것이 하나 있습니다. docker rmi 명령으로 이미지를 제거하는 것이 가능하지만, 꼭 필요한 경우가 아니라면 가급적 리포지터리나 TAG가 none으로 설정된 이미지를 임의로 삭제하는 일은 피해야 합니다. 콘솔에서는 잘 드러나지 않지만 이미지는 차이점 보관 방식으로 생성되어있고 일종의 트리 계층을 형성하기 때문입니다. 그래서 docker로 이미지를 만들 때 정말 중요하게 관리되어야 하는 이미지는 REPOSITORY나 TAG에 정확한 속성을 지정하여 쉽게 찾을 수 있도록 해주는 것이 중요합니다.

REPOSITORY             TAG                 ID                  CREATED             SIZE
rwentzel/ubuntu-mono   latest              2e8ec476cfd1        3 weeks ago         12.29 kB (virtual 2.627 GB)
<none>                 <none>              866ee2ba174c        3 weeks ago         12.29 kB (virtual 2.627 GB)
<none>                 <none>              9d58fdd1f145        3 weeks ago         28.67 kB (virtual 2.627 GB)
<none>                 <none>              48d313d93277        3 weeks ago         194.1 kB (virtual 2.627 GB)
<none>                 <none>              a6f3f7d033e8        3 weeks ago         1.151 GB (virtual 2.627 GB)
<none>                 <none>              0063533722a2        3 weeks ago         486.2 MB (virtual 1.476 GB)
<none>                 <none>              563cc9ce1df7        3 weeks ago         43.2 MB (virtual 989.9 MB)
<none>                 <none>              d963202bdca8        3 weeks ago         62.24 MB (virtual 946.7 MB)
<none>                 <none>              fa1d9d247e8a        3 weeks ago         27.46 MB (virtual 884.5 MB)
<none>                 <none>              e01eae29dae1        3 weeks ago         32.86 kB (virtual 857 MB)
<none>                 <none>              eb5606044c61        3 weeks ago         70.23 MB (virtual 857 MB)
<none>                 <none>              519b96c9a701        3 weeks ago         29.08 MB (virtual 786.8 MB)
<none>                 <none>              552c68e56d9a        3 weeks ago         46.38 MB (virtual 757.7 MB)
<none>                 <none>              17f3c8064eb6        3 weeks ago         25.59 MB (virtual 711.3 MB)
<none>                 <none>              0cb9cc3fc7b8        3 weeks ago         144.5 MB (virtual 685.7 MB)
<none>                 <none>              898780b65670        3 weeks ago         12.29 kB (virtual 541.2 MB)
<none>                 <none>              de6790a79ec8        3 weeks ago         158.2 MB (virtual 541.2 MB)
<none>                 <none>              29002fa46318        3 weeks ago         24.58 MB (virtual 383 MB)
<none>                 <none>              270acf4d2474        3 weeks ago         96.52 MB (virtual 358.5 MB)
<none>                 <none>              1d4aaea09576        3 weeks ago         81.83 MB (virtual 261.9 MB)
ubuntu                 12.04               8dbd9e392a96        6 months ago        131.5 MB (virtual 131.5 MB)
ubuntu                 latest              8dbd9e392a96        6 months ago        131.5 MB (virtual 131.5 MB)
ubuntu                 precise             8dbd9e392a96        6 months ago        131.5 MB (virtual 131.5 MB)
ubuntu                 12.10               b750fe79269d        7 months ago        24.65 kB (virtual 180.1 MB)
ubuntu                 quantal             b750fe79269d        7 months ago        24.65 kB (virtual 180.1 MB)
<none>                 <none>              27cf78414709        7 months ago        180.1 MB (virtual 180.1 MB)

위의 rwentzel/ubuntu-mono 이미지를 사용하여 내부에 들어있는 /bin/bash를 컨테이너로 실행하기 위하여 아래 명령을 실행합니다.

sudo docker run -i -t rwentzel/ubuntu-mono /bin/bash

그러면 다음과 같이 프롬프트가 변경되는 것을 볼 수 있습니다.

rkttu@dockertest:~$ sudo docker run -i -t rwentzel/ubuntu-mono /bin/bash
root@f739c613d0ae:/#

이제 간단한 C# 소스 코드를 작성하여 프로그램으로 컴파일하고 잘 작동하는지 확인해보겠습니다. vi를 사용해도 좋고, vi 사용에 익숙하지 않은 경우 아래와 같이 명령을 실행하여 pico/nano 에디터를 추가 설치할 수 도 있습니다.

apt-get install nano

Hello.cs 라는 소스 코드를 원하는 에디터로 아래와 같이 작성합니다.

using System;
using System.Linq;
using System.Collections.Generic;

public static class Program {
        [STAThread]
        public static void Main(string[] args) {
                var count = args.Count();
                List<string> options = args.Where(x => x.StartsWith("-")).ToList();
                Console.Out.WriteLine("Hello, World!");
                Console.Out.WriteLine("Total Args: {0}, Option Args: {1}", count, options.Count);
        }
}

Mono 3.2.3은 LINQ와 제네릭을 모두 잘 지원하므로 위의 코드를 아래와 같이 컴파일하였을 때 문제없이 컴파일이 완료될 것입니다.

mcs Hello.cs

그리고 JVM과 마찬가지로 Mono VM을 실행하여 컴파일한 어셈블리 파일을 실행해봅니다.

root@f739c613d0ae:/# mono Hello.exe
Hello, World!
Total Args: 0, Option Args: 0
root@f739c613d0ae:/# mono Hello.exe a b c
Hello, World!
Total Args: 3, Option Args: 0
root@f739c613d0ae:/# mono Hello.exe a b -c
Hello, World!
Total Args: 3, Option Args: 1

의도한 대로 LINQ와 제네릭을 잘 받아서 처리하고 있습니다.

mono 실행 속도 개선하기

최신 버전의 mono는 실행 속도를 개선하기 위하여 가비지 컬렉터를 새롭게 디자인하였고, 전처리 컴파일을 미리 수행하는 방법을 제공합니다. 특히, Microsoft .NET Framework와 마찬가지로 GAC에 대해 ngen을 수행하는 것과 비슷하게 AOT 컴파일을 미리 수행하도록 명령어를 한 번 실행해주면 실행 속도 개선에 큰 도움이 됩니다. 아래 명령어를 실행하여 GAC 내부의 모든 어셈블리에 대해 AOT 컴파일을 실행합니다.

for i in /usr/local/lib/mono/*/mscorlib.dll; do mono --aot $i; done
for i in /usr/local/lib/mono/gac/*/*/*.dll; do mono --aot $i; done

위의 이미지 환경 내에서의 mono 설치 경로는 /usr/local에 있으므로 경로는 mono 실행 파일의 위치를 which 명령으로 확인하여 적절하게 변경해야 합니다. 참고로 GAC에 대한 AOT 컴파일은 시간이 오래 걸릴 수 있으며, 이 버전의 가상 환경에서는 .NET Framework 1.0이나 1.1 기준으로는 개발이 불가능하므로 버전을 업그레이드 하거나 base image로부터 구 버전의 mono를 설치하도록 수동 구성해야 합니다.

그리고 개별 어셈블리에 대한 AOT 컴파일은 다음과 같이 실행할 수 있으며, 실행 결과로 .so 파일이 생성되므로 AOT 컴파일의 효과를 위하여 항상 같은 위치에 배포될 수 있도록 배포합니다.

mono --aot Hello.exe
mono Hello.exe

마무리

지금까지 Windows Azure Linux VM에서 docker를 이용한 mono 개발 환경의 구축 방법을 살펴보았습니다. 언제든 원하는 때에 즉시 Linux VM을 만들 수 있다는 것 말고도, 한 번 만든 VM을 손상시키지 않으면서 환경을 독립적으로 구성할 수 있도록 하는 환경 상의 완결성을 제공하는 docker를 이용함으로서 최상의 리눅스 개발 환경을 체험할 수 있게 된 것은 참 좋은 일입니다.

그리고 한 가지 더 덧붙이면, docker를 이용하여 컨테이너를 만들 때 -v 스위치를 사용하여 호스트 파일 시스템과 링크를 연결할 수 있으므로, 컨테이너 셸 상에서 만든 파일을 쉽게 호스트로 반출하거나 반입할 수 있습니다. -p 스위치는 가상 NAT를 통하여 포트 리디렉션을 할 수 있는 방법을 제공하며, 양쪽 스위치의 자세한 사용법은 http://blog.docker.io/2013/07/docker-0-5-0-external-volumes-advanced-networking-self-hosted-registry/ 의 내용을 확인하기 바랍니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

기술 소식2012. 10. 29. 02:06

오랜 기간을 거쳐 Mono가 드디어 3.0 버전에 진입하였습니다. 여러가지 악재가 있었음에도 포기하지 않고 지속적으로 Mono 프로젝트를 이끌어나가시는 여러 개발자분들의 노고에 응원을 드리며 즐겁게 블로그 포스팅을 올립니다. 이번 Mono 릴리즈는 다른때보다도 더 의미가 깊고 강렬합니다. 무엇보다도, Windows Azure를 포함하여 국내외 여러 클라우드 컴퓨팅 환경 상에서 Mono를 다양하게 활용할 수 있다는 것은 바람직한 일이라고 할 수 있겠습니다. 특히 서버 사이드에서의 .NET 기반 개발 환경은 더 이상 Windows에만 국한되는 것이 아닙니다.

Mono 3.0은 Mono 2.10 브랜치를 계승하는 메이저 업데이트로 다음의 주요 변경 사항들을 포함합니다. 정보의 출처는 공식 릴리즈 노트 (http://www.mono-project.com/Release_Notes_Mono_3.0) 입니다.

비동기 프로그래밍 모델을 지원하는 새 C# 컴파일러

비동기 프로그래밍 모델의 원형은 .NET 4.0의 소개와 함께 TPL (Task Parallel Library)로 이미 소개된 이력이 있습니다만 이것을 C# 4.0의 다음 세대 언어인 C# 5.0에서 언어 차원에서 자연스럽게 통합하기 위한 노력이 있었는데 이것이 Mono 3.0의 C# 컴파일러부터 온전하게 지원됩니다. 즉, async~await 키워드의 사용이 가능해져서 좀 더 자연스럽게 비동기 프로그래밍의 이점을 여러 플랫폼으로 확장할 수 있게 됨을 뜻합니다.

복잡하고 정신없던 컴파일러 별칭의 구조 조정

오픈 소스의 특성상, 그리고 여러 플랫폼을 동시에 지원해야 했기 때문에 긴 시간 동안 고수되어왔던 컴파일러 별칭의 혼재가 드디어 정리됩니다. mcs라는 단일 컴파일러 유닛으로 정리되고 -sdk 플래그를 사용하여 특정 프로필을 목표로 컴파일 방법 및 라이브러리를 정의할 수 있습니다. 그리고 이와 동시에 특정 프레임워크의 버전의 영향을 받지 않는 IKVM.Reflection 기반의 코드 생성 체계로 변경되어 더욱 유연하고 단순한 Code Emitter를 만들어 컴파일러를 단순화한 것이 큰 변화입니다.

개선된 Evaluator API

Mono의 유용한 명령줄 도구인 C# Interactive Shell의 핵심인 Evaluator 클래스의 Eval 메서드에서 이제는 단순 표현식이 아니라 각종 Type (Class, Structure, Interface, Delegate, Namespace)들을 직접 명령문 세그먼트에서 해석하고 처리할 수 있도록 기능이 확장되어 더 강력한 코드 작성이 가능해졌습니다. 그리고 Evaluator 클래스는 이제 싱글턴이 아니라 인스턴스화가 가능한 유틸리티로 기능이 개선되어 단일 코드에서 다중 컴파일러를 사용할 수 있는 막강한 확장성을 보유하게 되었습니다.

Microsoft 기술과의 호환성 향상

.NET Framework 4.5의 출시에 따라 Microsoft 기술과의 차이가 생기는 부분이 있었는데, 이 부분에 대해 적극적으로 지원을 하게 되어 아래와 같은 부분에서 확실한 호환성을 기대할 수 있습니다.

  • 새로운 비동기 메서드
  • WinRT 호환 API
  • System.Net.Http
  • System.Net.Http.Formatting
  • System.Thrading.Tasks.Dataflow
  • System.Web.Http
  • System.Web.Razor (Razor 문법 지원)
  • System.Web.WebPages (ASP.NET Web Pages 2 지원)
  • System.Web.WebPages.Deployment
  • System.Web.WebPages.Razor (ASP.NET Web Pages 2 Razor 지원)
  • System.Web.Mvc.dll (ASP.NET MVC4 지원)
  • System.Json.dll (Microsoft 구현으로 대체)
  • EntityFramework.dll

향상된 가비지 컬렉터

가비지 컬렉터의 새 구현체인 SGen이 좀 더 전면에 적극적으로 등장하고 활용 폭도 넓어졌습니다. 이전에 사용하던 Boehm GC를 대체하는 것으로 다중 프로세서 지원, Win32 지원, MIPS 지원, Mac OS X 환경에서 Mach API와 직접 연동을 통한 성능 향상 등 장족의 발전이 있었고 이번 3.0 릴리즈에서 크게 활약할 것으로 보입니다.

그 외 개선된 사항들

  • 리눅스에서 System.Net.NetworkInformation.NetworkChanged 사용 가능
  • 유니코드 지원 개선 및 성능 향상
  • ThreadLocal<T> 성능 향상, List<T> 성능 향상
  • Mac OS X에서 System.IO.DriveInfo를 올바르게 사용할 수 있음
  • Mono.Data.Sqlite에서 스레딩 모델 설정 가능 및 iOS의 암호화 API 지원

좀 더 자세한 정보는 http://www.mono-project.com/Release_Notes_Mono_3.0 에서 확인해보실 수 있습니다. 이 글을 쓰는 시점에서는 Mac OS X 패키지만 공개되었지만 2012년 11월 중으로 Windows와 Linux에서도 사용 가능한 패키지가 빌드될 것으로 보입니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Exploring2010. 11. 30. 22:24

오늘 도착한 ZDNET 코리아 메일링 리스트를 통해 아주 흥미로운 웹 캐스트가 하나 게시되었습니다. Delphi Prism은 Embacadero의 최신 Rapid Application Development Tool로서 종전의 Delphi .NET에 대한 업그레이드 제품이자, RemObjects사의 Object Pascal 제품의 최신 버전입니다. Visual Studio Shell을 통하여 이전 버전의 Delphi IDE에서 사용헀던 .NET 개발 환경때 보다 더 풍부하고 확장된 기능을 제공하기도 하고, 특히 이번 XE 버전에서는 MonoDevelop 기반의 IDE도 동시에 지원하고 있어서 기능성이 매우 돋보이기도 합니다.

이 동영상에서 소개하는 기술들에 대해 간단히 요약하면, 리눅스, 솔라리스, 맥 OS X에서 데스크 탑 및 서버 닷넷 프레임워크 대체 구현을 제공하는 Mono 프레임워크 (http://mono-project.com/Downloads), 상용 제품군으로 판매되는 MonoTouch (http://monotouch.net/) SDK, 맥 OS X 환경에서 구동 가능한 iPhone 및 iPad SDK (http://developer.apple.com/iphone/), 그리고 Embacadero Delphi Prism XE (http://www.embarcadero.com/products/delphi-prism)를 활용하여 iPhone과 iPad에서 실행 가능한 응용프로그램을 디자인하는 것입니다. 이 중에서 상용 라이선스가 필요한 것은 MonoTouch와 Delphi Prism XE가 되겠습니다.

만약 Delphi가 아닌 C#을 이용하여 응용프로그램을 개발하기 원한다면 Delphi Prism XE 대신 MonoTouch와 함께 제공되는 기본 IDE인 MonoDevelop 만으로도 충분한 개발이 가능합니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

기술 소식2010. 10. 13. 09:12

Mono Framework는 계속 진화합니다. 이번에 나온 Mono Framework 2.8은 Mono 2.6 버전보다 더 성숙하고 완성된 프레임워크로서의 모습을 보여주고 있으며, 그 어느 때 보다도 많은 변경 사항이 반영되었습니다. Mono 2.6 버전에서 대기한 시간이 많았기 때문에 2.8에서는 Breaking Change가 많습니다. (Release Note: http://www.mono-project.com/Release_Notes_Mono_2.8)

Mono Framework 2.8은 OpenSUSE, SLES/SLED, RHEL/CentOS, Windows, Mac OS X에서 설치 가능한 형태의 패키지를 다운로드받을 수 있고, 평가를 위하여 OpenSUSE가 설치된 Windows Virtual PC 패키지 - 또는 - VMware 가상 PC 패키지를 다운로드받거나, Live CD를 다운로드받아 가상 PC나 실물 매체에 기록하여 OS를 변경하는 일 없이 간편하게 기능 테스트를 할 수 있습니다. 다운로드는 http://www.go-mono.com/mono-downloads/download.html 에서 가능합니다.

주요 변경 사항

.NET Framework 4.0 프로필을 기준으로 함: .NET Framework 4.0을 기본 프로필로 채택하고 있으므로 손쉽게 .NET Framework 4.0 기반의 응용프로그램을 멀티 플랫폼 환경으로 마이그레이션할 수 있습니다. 이에 따라, C# 4.0과 ASP.NET 4.0에 대한 지원도 추가되었습니다.

.NET Framework 1.1 프로필에 대한 지원을 제거함: .NET Framework 1.1에 대한 지원을 제거하였습니다. 앞으로는 .NET Framework 2.0 런타임을 사용하도록 Configuration File을 아래와 같이 업데이트하고, 변경된 부분에 대한 업데이트를 새롭게 수행해야 합니다.

<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
  </startup>
</configuration>

새로운 Garbage Collector 제공: Simple Generational Garbage Collector (이하 SGen-GC)는 Mono 프로젝트의 역사에 있어서 가장 중요한 역할을 수행해왔던 Boehm-GC에 대한 대안으로 개발된 것으로, Boehm-GC가 지원하지 않는 패턴의 가비지 컬렉션을 제공하기 위한 목적으로 개발되었으며, SGen-GC가 완성되기 전까지 Boehm-GC가 당분간 계속 사용될 것입니다.

Dynamic Language Runtime 번들링: Microsoft의 Open Source Project로 시작하여 .NET Framework 4.0의 기본 기능으로 채택된 DLR이 기본으로 번들링되어 프로그래밍 언어 수준에서의 DLR이 허용되고 후평가 기반 스크립트 언어 (IronPython 등)의 성능이 개선됩니다.

Managed Extension Framework 번들링: Microsoft의 Open Source Project로 시작하여 .NET Framework 4.0의 기본 기능으로 채택된 MEF 역시 기본 번들링됩니다.

ASP.NET MVC2 번들링: ASP.NET MVC2에 대한 지원이 기본 번들링됩니다.

OData client framework (System.Data.Services.Client) 번들링: OData 프로토콜을 분석할 수 있는 클라이언트측 프레임워크 역시 기본으로 번들링됩니다.

GLIB에 대한 종속성을 완전히 제거하고, 자체 GLIB 내장: 앞으로는 Mono Framework를 이기종 하드웨어로 포팅하는 절차가 더 단순해 질 것으로 보입니다. GLIB의 기능을 사용하기 위하여 핵심적인 구성 요소만을 발췌하여 자체 GLIB 구현을 사용하도록 업데이트되었습니다.

기타 변경 사항은 다음과 같습니다.
* ThreadPool 내 예외 처리에 대한 동작 변경
* 다양한 방면에서의 성능 대폭 향상
* mono-llvm을 통한 LLVM 기반 실행 지원
* Windows Communication Foundation Routing 지원
* OpenBSD 지원 추가

새롭게 추가된 API 및 개발 도구
* Thread Parallel Library, Parallel LINQ 지원
* System.XAML - XAML Framework 지원
* BigInteger 클래스
* MemoryMap 관련 클래스
* License Manager 지원 (LC 도구 지원)
* System.IO.Packaging 지원
* .NET Framework 4.0의 CodeContracts 기술 지원
* MSBUILD에 대응되는 XBUILD 지원

개선된 사항
* 난독 처리된 어셈블리에 대한 지원 개선
* 프로세스 간 핸들 공유를 사용하지 않도록 변경 (MONO_ENABLE_SHM 환경 변수로 활성화 가능)
* x86 환경에서 Ahead of Time 컴파일 완벽 지원
* 어셈블리 바인딩 지원

제거된 API
* ByteFX.Data
* Mono.Data
* Microsoft.JScript
* Microsoft.Vsa
* FirebirdSql.Data.Firebird
* Mono.Data.TdsClient
* Mono.Data.SybaseClient
Mono.Data.SqliteClient

제거된 도구
* mjs
* prj2make
* cilc

출처: http://www.mono-project.com/Release_Notes_Mono_2.8

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

이벤트2010. 3. 16. 10:41

MIX10 행사가 한국 시간으로 오늘 새벽에 시작되었습니다. 이번 행사에서는 Microsoft의 차세대 웹 기술을 집중적으로 조명하게 될 예정인데, Silverlight 4, Internet Explorer 9, Windows Mobile, HTML5 등의 최신 기술에 대한 다양한 내용을 공유하실 수 있는 좋은 계기가 될 것입니다. 아래의 링크들은 MIX10과 관련된 정보를 실시간으로 확인하실 수 있는 곳들이며, 특히 한국 마이크로소프트의 Windows Phone Developer Evangelist이신 서진호 차장님, UX Evangelist이신 황리건 과장님의 트위터에서는 실시간으로 정보가 업데이트됩니다. :-)


공식 정보 출처: http://blogs.msdn.com/popcon/archive/2010/03/15/mix-10.aspx

ps. 개인적으로 HTML5와 Mono에 관한 세션이 눈에 띕니다. :-)
Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

  1. IE9에 대한 구체적인 정보가 빨리 나왔으면 좋겠네요

    2010.03.16 19:01 [ ADDR : EDIT/ DEL : REPLY ]
    • 이번 MIX10 행사에서 IE9에 대한 구체적인 정보가 많이 공개되지 않을까 예상됩니다. :-)

      2010.03.16 19:50 [ ADDR : EDIT/ DEL ]

기술 소식2009. 12. 16. 15:14

Mono 2.6이 어제 (12월 15일) 긴 여정을 마치고 첫 릴리즈를 출시하였습니다. .NET Framework 4.0에 대한 지원은 Mono 2.8에서 완전해질 것으로 예상되며, LINQ to SQL, AOT 기능 강화 등은 주목할 만한 점입니다.

 

주요 사항 요약

  • 실버라이트 2.0에 대응되는 WCF 클라이언트와 서버 기술이 추가되었습니다.
  • 서버 및 고속 연산을 위한 LLVM 기술이 추가되었습니다.
  • Mono.Tasklets API가 추가되었습니다.
  • 유닉스 및 맥 OS X에서 MonoDevelop와 연결되는 디버거가 새로 작성되었습니다.
  • MonoDevelop 2.2와 함께 출시됩니다.
  • System.IO.Packaging API가 추가되었습니다.
  • C# Shell이 자동 완성 기능을 지원합니다.
  • xbuild의 기능이 완성되어감에 따라 대다수의 msbuild 프로젝트를 지원합니다.
  • 실버라이트 기반 응용프로그램과 호환되는 CoreCLR 보안 모델이 지원됩니다.

 

Mono 2.4에서 변경된 사항들

 

LINQ to SQL 제공

Firebird, Ingres, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, SQLite와 호환되는 LINQ to SQL Provider가 제공됩니다. 그러나, 아직까지 계속 개발 단계에 있으므로 정식 릴리즈 이전까지는 지속적으로 업데이트가 발생할 수 있습니다.

 

 

소프트 디버거

새로운 디버거 엔진으로 업그레이드 되었습니다. 자세한 내용은 http://www.mono-project.com/Mono:Runtime:Documentation:SoftDebugger 에 게시된 내용을 참조하여 주십시오.

 

C# 4.0 및 .NET Framework 4.0 API 프리뷰

Mono를 처음 구성할 때 빌드 스크립트에 --with-profile4=yes 스위치를 지정하여 4.0 버전의 API를 시험해볼 수 있습니다. 더불어서, ParallelFx를 Mono 2.6에서 사용하기 위해서는 이 옵션이 필요합니다.

 

System.IO.Packaging API 추가

Olive 프로젝트의 일부로 배포되던 WindowsBase 어셈블리가 정식 배포판 내에 속하게 되었습니다. ZIP 형식의 아카이브 파일을 다루는 경우가 증가함에 따라 결정된 사항들입니다.

 

Windows Forms

176개의 버그가 수정되었으며 다음은 주요 변경 사항들입니다.

  • DataGridView: 성능, 안정성, 기능성에 있어서 많은 개선이 있었습니다.
  • PropertyGrid: MDI 창에서의 불안정성 문제가 해결되었습니다.
  • MaskedTextBox: 마스크 처리가 개선되었습니다.
  • 리눅스 클립보드: 특별 데이터 형식 및 IDataObject 인터페이스에 대한 지원이 추가되었습니다.
  • 기타 수정 사항: DataGrid, TabControl, TextBox, RichTextBox, WebBrowser, TreeView, ListView 등이 수정되었습니다.

 

C# 언어

csharp 명령을 통하여 C# Shell 실행 시 자동 완성 기능이 제공됩니다. C# 4.0을 사용하도록 구성되었을 경우 dmcs 명령을 사용하여 C# 4.0 컴파일러를 사용할 수 있습니다. 명명된 매개 변수 및 옵션 매개 변수 사양은 완전히 구현된 상태입니다.

 

XBuild

ASP.NET 프로젝트, pkg-config 파일 분석 지원 및 msbuild 기반의 스크립트와 호환될 수 있도록 개선되었습니다.

 

더 자세한 내용은 http://www.mono-project.com/Release_Notes_Mono_2.6 에서 살펴보실 수 있습니다. 가상 PC (Virtual PC, VMware) 버전, 리눅스 패키지, 윈도 패키지 등은 http://www.go-mono.com/mono-downloads/download.html에서 다운로드하실 수 있습니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

  1. WOW .net 4.0대도 지원하는군요 ㅇㅂㅇ
    지금 리눅스로 접속했는데 모노놀이나 해볼까요?ㅋㅋㅋ

    2009.12.16 19:11 [ ADDR : EDIT/ DEL : REPLY ]
    • 리눅스 안에서도 Mono를 설치하거나 테스트하는데에 부담스러운 점이 있다면 VMware나 Xen, VirtualBox 같은 솔루션을 이용하여, 모노 다운로드 페이지에서 다운로드할 수 있는 가상 PC 패키지를 Guest로 올려써보는 것도 괜찮을겁니다. :-)

      2009.12.16 20:28 [ ADDR : EDIT/ DEL ]

Linux + .NET2009. 8. 4. 23:44

요즈음 Mono 기반 프로젝트들이 눈부신 발전을 거듭하고 있습니다. 그리고 이제 그 결과물로 최근 전세계적으로 많은 인기를 끌고 있는 Apple iPhone에도 Mono와 .NET 기술을 사용할 수 있게 되었습니다. :-)

MonoTouch는 기존의 Mono Framework에서 사용되어왔던 AOT (Ahead of Time) 컴파일 기술을 바탕으로 JIT (Just In Time) 컴파일 기능을 지원하지 않는 iPod과 iPhone 내의 임베디드 운영 체제를 위한 완전한 수준의 Native Application을 작성하는 것을 가능하게 만들었습니다. 정리하면, 기존에 사용되던 X-Code가 아닌 또 다른 유형의 Native Compiler가 추가된것으로 이해할 수 있습니다. 비슷한 기술을 가지고 있는 Unity3D와는 달리 MonoTouch는 Generic을 지원한다고 합니다.

그렇지만 기존의 .NET 기술을 완전히 사용할 수 있는 형태가 아니기 때문에 당연히 제약 사항이 존재하는데, 디버깅, LINQ 기능은 완전하지 않습니다. 향후 로드맵 상에서 버전 2.0에서 개선할 예정이거나 고쳐나갈 예정인 기능들입니다. 그리고 Reflection Emit API, System.Runtime.Remoting API, 동적 Type 생성, 콜백 역참조 (네이티브 코드로 전달된 대리자의 호출이 유효할 수 있게 만드는 동작)와 같이 동적으로 코드를 생성하는 부분들은 제한되거나 지원되지 않습니다. 또한, 현재는 iPhone OS 3.0에서만 테스트된 상태라고 합니다.

여러가지 제약 사항들이 있지만, 향후 로드맵에서는 상당히 희망찬 포부를 제시하고 있는데, 실버라이트 컨텐츠를 수용할 수 있도록 2.0 릴리즈 때에는 많은 부분이 개선/보수가 이뤄질듯 합니다.

현재는 클로즈 베타의 형태로 운영되고 있으며, 올해 가을에 1.0 버전이 런칭된다고 합니다. 관심있으신 분들은 지금 클로즈 베타를 신청하실 수 있으며, 개발 도구는 MonoDevelop 2.0 MonoTouch Edition 기반입니다.

홈페이지: http://www.mono-project.com/MonoTouch
클로즈 베타 신청: http://spreadsheets.google.com/viewform?hl=en&formkey=dHRXeFI5b1NjUWdRRkpiSmxkanh6T1E6MA..

 

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

  1. 오~ 좋은 소식 듣고 갑니다. 관심이 있었는데.. 당장은 힘들 겟지만. 눈여겨 두고 갑니다. ^^

    2009.08.28 02:11 [ ADDR : EDIT/ DEL : REPLY ]
    • 여러모로 .NET 기술을 활용할 수 있는 폭과 범위가 넓어진다는건 참 좋은 일인것 같습니다. :-)

      2009.08.28 10:28 [ ADDR : EDIT/ DEL ]

Windows + .NET2009. 7. 15. 18:45

2009년 7월 6일에, Microsoft가 기존의 Windows Related Protocol에 대하여 한정적으로 시행해왔던 Community Promise를 ECMA-334와 ECMA-335에 대해서도 적용을 시작한다는 공식 발표가 있었습니다. ECMA-334는 C# 프로그래밍 언어에 대한 사양을, ECMA-335는 Common Language Infrastructure (CLI)에 대한 사양을 정의하는 표준안입니다.

이 발표를 통하여, 이전까지는 자생적인 차원에서 진행되었던 오픈 소스 프로젝트들이, ECMA-334와 ECMA-335 사양을 구현하기 위하여 직접 Microsoft와 의사 교류를 진행할 수 있음은 물론 라이선스 계약서 등에 동의해야 할 필요가 없습니다. 즉, Community Promise 정책 아래에 놓여있는 표준 사양에 대한 모든 활동이 자유롭게 진행될 수 있음을 뜻합니다.

좀 더 자세한 내용은 아래 링크들을 참조하시면 편리합니다.

앞으로는 현재보다 더 많은 수의 닷넷 호환 프레임워크들이 시중에 등장할 수 있는 여건이 마련될 것으로 보입니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

기술 소식2009. 7. 1. 19:36

Port your .NET applications to Mono and Linux without leaving Visual Studio!

Mono 2.4가 발표된 이후로 지속적으로 Mono 프로젝트는 발전에 발전을 거듭하고 있습니다. 최근 흥미로운 툴킷 하나가 새로 등장하였는데 바로 Mono Tools for Visual Studio가 그 주인공입니다. 이전에는 Embacadero Delphi Prism을 통하여 Delphi Prism IDE 레벨에서 Mono와의 동시 Build를 제공한 것이 최선이었습니다만 이제 공식적으로 기본 IDE 위에서 사용할 수 있는 공식적인 Tool이 등장하게 되었습니다.

현재 Mono Tools for Visual Studio는 Private Preview 형태로 배포되는 것으로 소정의 가입 절차가 필요함을 알아두시면 좋겠습니다.

Mono Tools for Visual Studio의 주요 기능을 살펴보면 다음과 같습니다.

  • 호환성 검사: 이전부터 제공되어오던 MoMA (Mono Migration Assistant)를 활용한 호환성 검사 기능을 제공합니다. 개발 중인 닷넷 응용프로그램을 Mono로 가지고갈 때 발생할 수 있는 문제점들을 보고서의 형태로 알려주는 기능으로 호환성 문제에 대한 충분한 검토를 사전에 해 볼 수 있도록 해줍니다.
  • Windows에서 실행: Mono의 Win32 프레임워크를 이용하여 현재 개발 중인 닷넷 응용프로그램을 직접 실행할 수 있도록 해줍니다.
  • Linux에서 원격 실행: 미리 준비되어있는 Linux Workstation 컴퓨터 위에서 현재 개발 중인 닷넷 응용프로그램을 직접 실행할 수 있도록 해줍니다.
  • Linux에서 원격 디버깅: Mono Tools for Visual Studio의 중요한 기능이라고 할 수 있습니다. Linux에서의 원격 실행을 전제로, 원격 디버거를 통하여 Visual Studio의 Debugging Feature를 그대로 사용하여 문제점을 진단하고 파악할 수 있게 해 주는 기능입니다. 참고로, ASP.NET 디버깅도 지원된다고 합니다.

여기서 주목할 것은 VMware Virtual Appliance의 형태로 무료로 배포되는 가상 PC 패키지에 관한 것으로, 가상 PC 패키지를 이용하거나 Windows 7의 Windows Virtual PC 위에서 오픈수세 리눅스 + 모노를 설치하면 컴퓨터 앞을 떠나지 않고도 동시에 두 개의 운영 체제에서 테스트를 수행할 수 있는 편리성을 보여줍니다.

이 중에서 호환성 검사 기능과 원격 디버깅에 관한 내용은 블로그 강좌 형태로 다루어볼 계획이니 많은 관심 바랍니다. :-)

공식 홈페이지: http://go-mono.com/monovs/

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

  1. mono

    Monovs를 다운받으려고 Sign을 했는데, 제출후에는
    "내 스프레드시트에서 확인하세여?"인가 나오더라구요.

    어떻게 하면 monovs를 다운받을 수 있을까여?

    그리고 VS2008에서 만든 Winform을 Suse Linux에서 Mono로 실행해보면 Winform UI가 너무 허접하게 나옵니다.
    monoVS 사진을 보면 리눅스/윈도우즈 모두 UI가 비슷하게 이뿐것 같은데 ...
    정말 궁금하네요.

    2009.10.09 21:52 [ ADDR : EDIT/ DEL : REPLY ]
    • Mono VS Tool은 현재 Close Beta로 진행중입니다. 정식 출시까지는 시일이 좀 걸릴듯 합니다. 대신, Signup 신청을 하시면 메일링 리스트로 개발 상황이나 여러가지 피드백을 공유하실 수 있을 것입니다.

      Windows Forms의 UI Quality 향상이나 WYSIWYG 지원은 아직 실제 Windows 운영 체제에서 기동되는 것만큼 완전한 것은 아닐 것으로 생각됩니다. 조만간 출시되는 Mono 2.6 버전에서는 조금 더 개선될 것이라는 예상이 됩니다.

      2009.10.10 12:43 [ ADDR : EDIT/ DEL ]

기술 소식2009. 2. 3. 11:31

가상 PC 패키지를 만드는 작업은 상당히 손이 많이 가고 시간도 오래걸리는 작업 중에 하나입니다. 하지만 이러한 작업을 단순화하고 웹 기반으로 손쉽고 정확하게 처리해주는 획기적인 서비스 하나가 등장하였습니다. SuSE Studio가 그 주인공인데, 오픈수세 리눅스 배포판을 기반으로 하는 어플라이언스를 만들어줍니다.

http://susestudio.com/

다음은 DEMO 영상입니다.

최근 배포되는 Mono Framework의 가상 어플라이언스 역시 이 서비스를 기반으로 제작된 것입니다. 향후 Mono와 Linux 기반으로 닷넷 응용프로그램을 작성하여 시장에 공개하거나 판매할 요량으로 가상 PC 패키지를 만들 일이 있으시다면 이 서비스를 적극 활용하시면 좋겠습니다. :-)

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

기술 소식2009. 1. 16. 21:07

Mono 2.2가 새로 발표되었습니다. 이번 버전에서도 꾸준히 업그레이드되고 나아지는 모습을 보여주고 있습니다. 이번의 릴리즈 노트를 요약한다면 Mono에 대하여 제기되어왔던 성능 문제를 해결하기 위하여 상당히 많은 노력을 기울이고 있는 듯 보입니다.

  • 새로운 중간 언어 처리 엔진인 선형 엔진 (Linear IL)을 도입하였습니다. (http://www.mono-project.com/Linear_IL)
  • 전체 선행 컴파일 (Full AOT) 기능이 구현되었습니다. (http://www.mono-project.com/AOT)
  • 정적 링크 기능이 지원됩니다.
  • 성능 모니터 기능이 구현되었으며, mperfmon이라는 GUI 프로그램으로 시각적으로 내용을 살펴볼 수 있게 되었습니다.
  • SIMD 연산이 구현되었습니다. (http://go-mono.com/docs/monodoc.ashx?tlink=0@N%3aMono.Simd)
  • Mono.CSharp.Evaluator 클래스를 새로 추가하였고 컴파일러의 기능을 응용프로그램의 일부로 가져오기가 더욱 쉬워졌습니다.
  • C# 언어를 이용한 대화형 셸의 콘솔 버전과 GUI 버전이 제공됩니다. (http://www.mono-project.com/CsharpRepl)
  • 컴파일러가 생성하는 빈 문자열에 대한 참조를 모두 System.String.Empty 인스턴스로 통일하여 효율성을 높였습니다.
  • C# 컴파일러의 기본 경고 수준이 최고 수준인 4로 변경되었으며, 이전보다 C# 컴파일러의 오류 감지 및 오류 복구 능력이 향상되었습니다.
  • regex-to-CIL 엔진의 도입으로 정규 표현식 처리 성능이 좋아졌습니다.
  • ASP.NET 3.5 SP1의 MVC를 고려하여 라우팅 핸들러만이 우선 새로 추가되었습니다.
  • 첫 Windows Forms 2.0 버전 이후 보고된 약 200여개 가까운 수의 버그를 수정하였으며, Win32/Win64 환경에서 Application.EnableVisualStyles() 메서드를 이용하여 루나 테마나 에어로 테마를 적용할 수 있게 되었습니다.

출처: http://www.mono-project.com/Release_Notes_Mono_2.2

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

기술 소식2009. 1. 13. 11:28

이번에 새로 출시된 RAD Studio 2009에서는 좀 더 구체적이고 혁신적인 델파이 개발 도구의 변화가 있었는데 Delphi .NET Compiler가 RemObjects사의 새 컴파일러 엔진으로 교체됨과 함께 일말의 개발 도구가 Delphi IDE로부터 독립하여 Visual Studio Shell 버전으로 통합되었습니다. 결과적으로 RemObjects사가 줄곧 선보였던 오브젝트 파스칼 기반 개발 환경을 이번에서야 제대로 선을 보이게 되었네요.

사용자 삽입 이미지

출처: RemObjects Homepage

Delphi Prism이라고 불리는 이번 릴리즈는 예전의 Delphi 프로그래밍 환경이 그랬던것처럼 크로스 플랫폼을 강점으로 내세우고 있습니다. Delphi Native의 경우 Delphi와 Kylix의 조합이었었던걸 기억하시는 분들이 많을 줄로 압니다. Delphi Prism의 경우, 별도의 브랜드를 두는 것은 아니며 Delphi Prism .NET을 통하여 빌드 타겟을 MS.NET과 Mono로 놓고 진행할 수 있습니다.

좀 더 자세한 정보는 아래 웹 사이트를 참고하시면 되겠습니다.

http://www.codegear.com/products/delphi/prism
http://www.remobjects.com/prism

스크린 샷

사용자 삽입 이미지


Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

  1. 출시 언어엔 여전히 한국어가 없네요 ㅎ;; 델파이 개발자가 적어서 그런건지..;;
    RAD Studio가 가격만 더 내려가면 좀 더 개발자가 늘어나지 않을까.. 하는 생각을 종종합니다.
    그보다 VCL이 유니코드 기본지원으로 최근에 업그래이드 되더니 저건 또 과연 어떠한 기능으로 다가올지 기대가 되기도 하고 나름 걱정도 되네요. 그래도 델파이를 좋아하는 입장에서 성공 할 수 있길 바랄 뿐이랄까요 ㅎㅎ;

    2009.01.15 11:10 [ ADDR : EDIT/ DEL : REPLY ]
    • 델파이 프리즘은 원래의 VCL 기반 델파이나 델파이 닷넷으로 불리던것과는 다른 것입니다. RemObjects 사의 오브젝트 파스칼 컴파일러 기술을 도입하여 완전히 새로운 델파이 개발 툴을 만들었다고 보는게 맞을것 같습니다. 델파이 개발자분들의 입장에서 보면 네이티브 델파이와 매니지드 델파이 사이의 차이이며, 이것은 C++ 개발자분들의 입장에서 본 C++과 C#의 차이와 유사한 것으로 보입니다.

      그리고 제가 미처 언급하지 못했던 내용이 있네요. 기존 델파이 닷넷 런타임하고는 다르게 컴파일러만을 별도로 재배포하고 있습니다. 델파이 프리즘의 기능을 시험하기 위하여 RAD Studio 2009 전체를 구입하거나 내려받으실 필요가 없습니다.

      2009.01.15 14:32 [ ADDR : EDIT/ DEL ]

기술 소식2008. 8. 8. 16:47

Mono 1.0이 나온지 무려 4년여만에 2.0이 새롭게 모습을 드러내고 있습니다. 정식 버전은 올해 가을에 발표될 예정이며 이제 슬슬 그 윤곽을 드러내고 있습니다.

http://mono.ximian.com/monobuild/preview/archive/2.0/windows-installer/0/mono-2.0-gtksharp-2.10.4-win32-0.exe

Mono 2.0은 Microsoft .NET Framework 2.0과의 호환성을 상당부분 개선하였으며, C# 3.0 스펙과, Visual Basic 컴파일러를 내장하고 있고, IronPython과 Microsoft DLR 환경을 지원하는, 멀티 플랫폼 기반 CLI 프레임워크입니다. Microsoft .NET이 Windows에 최적화된 것이 특징이라면 Mono는 이와는 반대로 다양한 플랫폼에 걸쳐서 다재다능한 역할을 수행해내는 것이 다른 점이며, 최근에는 임베디드 장비로도의 이식이 진행 중입니다.

Major Highlights (주요 변경 사항)

Mono 2.0 is a major milestone in the Mono project, and it supports the following features:
Mono 2.0은 Mono 프로젝트에 있어서 중요한 전환점이며, 다음의 기능들을 지원합니다:

Microsoft Compatible API (Microsoft 호환 API):

  • ADO.NET 2.0 API for accessing databases.
    데이터베이스 접근을 위한 ADO.NET 2.0 API를 지원합니다.
  • ASP.NET 2.0 API for developing Web-based applications.
    웹 기반 응용프로그램 개발을 위한 ASP.NET 2.0 API를 지원합니다.
  • Windows.Forms 2.0 API to create desktop applications.
    데스크톱 응용프로그램 개발을 위한 Windows Forms 2.0 API를 지원합니다.
  • System.XML 2.0: An API to manipulate XML documents.
    XML 문서를 다루기 위한 API인 System.Xml의 2.0 API를 지원합니다.
  • System.Core: Provides support for the Language Integrated Query (LINQ).
    언어 통합 질의문 (LINQ)를 위한 System.Core API를 지원합니다. (닷넷 3.5)
  • System.Xml.Linq: Provides a LINQ provider for XML.
    Linq를 통한 XML 접근을 위한 XLinq를 지원합니다.
  • System.Drawing 2.0 API: A portable graphics rendering API.
    이식 가능한 그래픽 API인 System.Drawing의 2.0 API를 지원합니다.

Mono APIs (Mono 고유의 API, Microsoft .NET에는 없는 사항들입니다):

  • Gtk# 2.12: A binding to the Gtk+ 2.12 and GNOME libraries for creating desktop applications on Linux, Windows and MacOS X.
    Gtk+ 2.12와 GNOME 라이브러리에 바인딩되는 GTK# 2.12를 제공하여 리눅스, 윈도, 맥 OS X를 위한 데스크톱 응용프로그램을 제작할 수 있습니다.
  • Mono.Cecil: A library to manipulate ECMA CLI files (the native format used for executables and libraries).
    ECMA CLI 파일을 낮은 수준에서 재생산할 수 있는 Mono.Cecil 라이브러리를 제공합니다. (System.Reflection.Emit보다 한단계 더 낮은 수준의 기능을 뜻합니다. Mono.Cecil을 이용하면, 프레임워크의 버전이나 환경을 초월하는 특수 어셈블리 생산이 가능합니다.)
  • Mono.Cairo: A binding to the Cairo Graphics library to produce 2D graphics and render them into a variety of forms (images, windows, postscript and PDF).
    Cairo 그래픽 라이브러리에 바인딩되는 Mono.Cairo 라이브러리를 제공하며, 이미지, GUI, 포스트스크립트, PDF 제작을 지원합니다.
  • Mono's SQLite support: a library to create and consume databases created with SQLite.
    SQLite 데이터베이스에 관한 API가 제공됩니다.
  • Mono.Posix: a library to access Linux and Unix specific functionality from your managed application. With both a low-level interface as well as higher level interfaces.
    리눅스와 유닉스 시스템의 낮은 수준 API들과 함께 이를 응용하는 고급 API들을 공개적으로 지원하는 Mono.Posix 라이브러리를 제공합니다. Microsoft .NET의 Microsoft.Win32 네임스페이스의 위치와 유사한 것입니다.

Third Party APIs bundled with Mono (Mono에 번들링된 써드파티 API들, 역시 Microsoft .NET에는 없는 사항들입니다):

  • Extensive support for databases: PostgresSQL, DB2, Oracle, Sybase, SQL server, SQLite and Firebird.
    PGSQL, DB2, Oracle, 사이베이스, SQL 서버, SQLite, 파이어버드 DB와의 연동을 제공합니다.
  • C5 Generics Library: we are bundling the C5 generics collection class library as part of Mono.
    C5 제네릭 라이브러리를 번들링합니다. (제네릭을 이용한 다양한 컨셉 컬렉션을 제공합니다. C++ STL과 비슷한 개념으로 생각하시면 됩니다.)

Compilers (컴파일러):

  • C# 3.0 compiler implementation, with full support for LINQ.
    C# 3.0 컴파일러와 함께 LINQ가 지원됩니다. (C# 1.0과 2.0은 이미 지원되고 있습니다.)
  • Visual Basic 8 compiler.
    Visual Basic 8.0 컴파일러가 지원됩니다.
  • IL assembler and disassembler and the development toolchain required to create libraries and applications.
    IL 어셈블러와 디스어셈블러가 지원됩니다.

좀 더 자세한 정보는 http://www.mono-project.com/ 을 참고하세요. :-)

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Linux + .NET2008. 8. 5. 00:33

지난번에 이어서 이번 글에서는 MonoDevelop을 이용하여 지역화 프로그래밍을 다루는 방법을 소개하고자 합니다. 이미 이전 글에서 언급하였듯이 Mono에서는 지역화를 위하여 libintl 기반의 프로그래밍 기법을 사용합니다. Microsoft .NET Framework가 사용하는 방법과는 다소 차이가 있으며 접근 방법도 조금 다릅니다.

국제화 기능을 적용해보기 위하여 새로운 프로젝트를 하나 만들어 보도록 하겠습니다.

사용자 삽입 이미지

새로운 프로젝트를 여느떄와 같이 작성합니다.

사용자 삽입 이미지

하단의 Translation 항목을 체크하면 추가할 지역화 대상 언어를 관리할 수 있는 리스트박스와 UI가 나타나는 것을 볼 수 있습니다. Add 버튼을 클릭합니다.

사용자 삽입 이미지

언어와 함께 지역 코드를 선택할 수 있는 세부 대화 상자가 나타납니다. 우리가 여기서 시험해 볼 것은 단순한 번역이므로 지역 코드는 사용하지 않고 언어만을 선택하기로 합니다. Korean (한국어)를 선택하고 OK 버튼을 클릭합니다. 같은 방법으로 Japanese (일본어)도 추가합니다.

사용자 삽입 이미지

C# 프로젝트 외에 지역화 프로젝트가 추가된 것을 볼 수 있습니다. 지역화 프로젝트를 사용하기 전에 C# 프로젝트에도 약간의 추가 작업이 필요하므로 다음 단계를 계속하기로 합니다.

사용자 삽입 이미지

C# 프로젝트의 References 폴더를 오른쪽 버튼으로 클릭한 다음, "Edit References" 메뉴를 클릭하면 위와 같이 대화 상자가 나타납니다. 수많은 어셈블리 참조들이 있는데 이 중에서 Mono.Posix 항목 앞의 체크 박스를 클릭하고 OK 버튼을 클릭합니다. Mono.Posix 어셈블리의 유틸리티 클래스를 기준으로 번역할 메시지를 찾고, 여기에 맞는 파일을 제공할 수 있습니다.

사용자 삽입 이미지

C# 코드 편집기에서 사용이 편할 수 있도록 Mono.Unix 네임스페이스를 using 절에 추가합니다. Mono.Unix 네임스페이스를 가지고 프로그래밍하는것은 잠시 후에 다시 살펴보겠습니다.

사용자 삽입 이미지

이번에는 국제화 프로젝트 항목을 오른쪽 버튼으로 클릭하여 Options 메뉴를 클릭합니다.

사용자 삽입 이미지
 

Init String 항목을 잘 살펴보시기 바랍니다. 이 항목에 나타나있는대로 libintl을 초기화해야 실질적인 연동이 가능합니다. 여기서 참고해야 할 것은, 지역화 프로젝트도 여러 개가 존재할 수 있다는 점입니다. Package Name 부분을 달리 설정하면 이러한 내용이 반영됩니다. Package Name을 입력하면 Init String 항목도 같이 바뀌는 것을 볼 수 있습니다.

사용자 삽입 이미지

위의 Init String 항목의 내용을 기억하여 호출할 때 전달할 인수를 정확히 지정해야 합니다. 아래는 C# 코드에서 카탈로그를 실제로 초기화한 예제입니다.

사용자 삽입 이미지

이렇게 함으로서 런타임 상에서의 libintl 연동이 가능해졌습니다. 그렇다면 실제로 다국어 번역을 어떻게 이끌어낼 수 있을까요?

사용자 삽입 이미지

Catalog 클래스 내의 GetString 메서드를 사용하여 기준이 되는 영어 문장을 먼저 입력합니다. 만약 복수 명사를 구분하여 취급할 필요가 있다면 GetPluralString을 대신 이용합니다. 여기서는 간단한 인사 메시지 번역을 해볼 것이므로 GetString 메서드를 이용합니다. 번역할 대상이 있으면 GetString 메서드에 전달된 인수에 대응되는 국제화 프로젝트 내의 실제 문자열로 치환되어 반환될 것이며, 그렇지 않으면 Fallback 모드로 대응되어 전달한 인수 그대로 반환됩니다.

사용자 삽입 이미지

C# 프로젝트를 우선 다시 빌드합니다. 문법적인 오류가 없음을 확인합니다.

사용자 삽입 이미지

이어서 국제화 프로젝트를 오른쪽 버튼으로 클릭한 뒤 Update Translations 메뉴를 클릭하여 번역 대상 문자열 리소스들을 MonoDevelop가 수집할 수 있도록 명령을 내립니다.

사용자 삽입 이미지

이제 시험삼아서 일본어 PO 파일을 열어보겠습니다. 놀랍게도, Catalog.GetString 메서드로 호출한 대상 메시지만을 정확하게 가져온 것을 볼 수 있습니다. 이제 Translated 란에 해당 일본어 메시지를 입력하고, Comments에 약간의 부연 설명도 달아봅니다. 만약, 번역이 어려운 상태의 문장이라면 상단의 리스트 뷰에서 Fuzzy 열의 체크 박스를 클릭해놓아도 됩니다.

사용자 삽입 이미지

이제 같은 방법으로 한국어도 번역을 완성합니다. 참고로, MonoDevelop VMware Image에서는 기본적으로 한국어/일본어/중국어 입력이 지원되지 않는데 이를 해결하기 위하여 전용 IME를 설치하지 않는 대신 호스트 컴퓨터에서 해당 문자열을 클립보드로 복사하여 가상 머신에 붙여넣기하는 방식으로 가져왔습니다. :-)

사용자 삽입 이미지

다국어 프로젝트를 다시 빌드하도록 합니다. 다국어 프로젝트의 산출물은 EXE 파일이나 DLL 파일 외부에 배포되기 때문에 별도로 빌드해야 합니다. 이제, 콘솔을 열어서 해당 디렉터리까지 이동해 봅니다.

우리가 작성한 로케일 파일인 ja와 ko 파일이 있는 것을 볼 수 있습니다. 우선 일본어 파일의 내용을 제대로 반영하고 있는지 확인해보기 위하여 다음과 같이 명령을 내립니다.

  LANGUAGE=ja mono i18n_test.exe

그리고 한국어도 같은 방법으로 테스트할 수 있습니다.

  LANGUAGE=ko mono i18n_test.exe

만약 LANGUAGE 변수 설정 없이 시작하면 어떨까요? 기본 문자열이 나타나겠지요. :-)

** 노트: 정정사항이 있습니다. 다음 그림에서처럼 빌드 유형에 대하여 실행 방법을 정의하여 외부 콘솔 프로그램에서 띄워볼 수 있도록 할 수도 있습니다.

사용자 삽입 이미지

다음번에는 GTK# 디자이너인 Stetic을 이용한 간단한 응용프로그램 디자인 및 테스트를 다루어보기로 하겠습니다. 감사합니다. :-)

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Linux + .NET2008. 7. 22. 21:29

MonoDevelop를 이용하여 새로운 프로젝트를 만들 때 Packaging 기능을 이용하여 소스 코드를 재배포하거나, 바이너리를 재배포하는 작업을 편리하게 할 수 있다는 것을 지난번 강좌를 통하여 확인하였습니다. 그런데 Packaging 옵션이 굉장히 다양한 것을 볼 수 있었는데 이들 옵션이 실제로 어떻게 적용되는지 살펴볼 필요가 생겼습니다.

사용자 삽입 이미지

지난 번과 마찬가지로 새 프로젝트를 만들어보기로 합니다. 기존 솔루션에 새로운 프로젝트를 추가하는 방법도 좋습니다. 양쪽 모두 Packaging을 비롯한 추가 옵션을 묻는 대화 상자가 나타나도록 되어있습니다.

사용자 삽입 이미지

각각의 특성을 알아보기 위하여 Packaging 옵션으로 선택할 수 있는 모든 것들을 다 선택해보겠습니다. 다른 부분들은 체크하지 마시고 OK 버튼을 클릭하시면 Packaging 프로젝트와 함께 새로운 C# 프로젝트가 생성될 것입니다.

사용자 삽입 이미지

위의 그림에서 보듯이 오른쪽 화면의 솔루션 트리뷰에 Packages라는 이름의 Packaging 프로젝트가 새로 생성된 것을 보실 수 있습니다. 이름이 정형화되어있어서 마치 예약된 기능처럼 보여지지만 Packaging 프로젝트는 같은 솔루션 안에서 개수의 제한 없이 얼마든지 추가할 수 있습니다. 그리고 이 프로젝트 아래에 다양한 Sub Item들이 추가된 것을 볼 수 있습니다. 이제 이 각각의 아이템들을 살펴보기로 합니다.

사용자 삽입 이미지

Linux Binaries 항목을 오른쪽 버튼으로 클릭하고 속성을 살펴보니 위와 같은 대화 상자가 나타납니다. 프로젝트가 생성하는 EXE나 DLL 파일 (Visual Studio에서는 이것을 프로젝트 출력 (Project Output)이라는 말로 표현하고 있었습니다.)을 플랫폼 별로 구분하여 배포할 수 있게 한 것이 보입니다.

사용자 삽입 이미지

여기서 선택한 대상 플랫폼이 현재 버전의 Mono나 MonoDevelop에서 정확한 의미를 가지는 것은 아닙니다. 하지만 향후 개발 계획에 따라서 Mono나 MonoDevelop가 특정 OS에만 국한되는 내용이 들어있지는 않은지 판정하거나 하는 데 이용될 수 있습니다. 그리고 현 시점에서 우리는 특정 OS에만 국한되는 내용을 걸러내기 위한 목적으로 이러한 기준들을 이용하고 프로젝트에서 선택할 수 있습니다.

사용자 삽입 이미지

이제 그 옆에 있는 프로젝트 선택 탭을 클릭해 보기로 하겠습니다. C#이나 다른 프로젝트를 여기서 추가할 수 있는데, 같이 배포하기를 희망하는 프로젝트 노드 앞에 체크 박스를 클릭하면 됩니다.

사용자 삽입 이미지

마지막으로 파일 탭을 클릭해보기로 합니다. 앞서 선택한 프로젝트 내에 속하는 파일들 중 실제로 포함할 파일들만 선택적으로 여기서 다시 설정할 수 있습니다. Linux와 Windows 플랫폼을 나누어서 배포해야 한다면, 이 탭을 이용하여 리눅스 버전에서만 사용할 수 있는 C# 모듈이나 라이브러리 따로, Windows 버전에서만 사용할 수 있는 C# 모듈이나 라이브러리 따로 관리하도록 하면 됩니다.

사용자 삽입 이미지

실제로 다른 프로젝트를 추가해보기로 하겠습니다. 파일 탭에 선택한 내용이 나타날까요?

사용자 삽입 이미지

잘 보이는군요. :-)

사용자 삽입 이미지

이번엔 Source Packaging 항목을 살펴보기로 하겠습니다. File Format을 클릭하니 크게 세 가지 형식을 고를 수 있도록 되어있습니다. 우선, MonoDevelop IDE (지금 우리가 사용하고 있는 IDE입니다.) 파일 포맷을 선택할 수 있습니다. 그리고 Windows 환경에서 Visual Studio를 대신하여 널리 사용되는 오픈 소스 기반 .NET IDE인 SharpDevelop용 파일 포맷이 보입니다. 마지막으로, Visual Studio용 Solution 파일 포맷도 됩니다. 이전에 언급한대로 Visual Studio용 Solution 파일 포맷의 경우 msbuild에서도 로드하여 사용할 수 있다고 하였습니다.

사용자 삽입 이미지

소스를 묶어서 압축 파일로 만들 때 사용할 포맷도 지정할 수 있습니다. tar, tar.gz, tar.bz2, zip 포맷이 지원되는 것을 볼 수 있습니다.

사용자 삽입 이미지

그리고 마지막으로 Tarball 파일을 보기로 합니다. Tarball 파일은, 자동화된 것은 아니나, Windows 환경에서 사용하는 MSI 파일이나 CAB 파일과 마찬가지로 Linux 환경에서 소스 코드를 빌드하고 시스템에 설치할 수 있도록 도움을 주는 고유한 Installer입니다. 소스까지 같이 제공하므로 오픈 소스 정신에도 가까운 것입니다. Tarball 파일 안에 들어갈 Makefile에 대한 설정을 지정할 수 있는데, 일단 디버그 빌드와 릴리즈 빌드 중에서 선택이 가능합니다. 그리고 Autotools 기반인지, 편집하기에 용이한 일반 Makefile을 만들것인지도 선택할 수 있습니다.

사용자 삽입 이미지
 

새로운 패키지를 생성하거나 추가할 때 위와 같은 단계별 마법사 대화 상자를 볼 수 있습니다. 그리고 각 패키지 별로 세부 설정을 마법사 수준에서 마찬가지로 지정할 수 있으므로 패키지 설정의 어려움은 없을 것입니다.

다음번에는 Unix Integration이 어떻게 동작하는지에 대한 내용과 Translation을 위하여 사용하는 i18n을 위한 Portable Object 파일을 프로그래밍 방식으로 접근하는 방법에 대해서 살펴보기로 하겠습니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Linux + .NET2008. 7. 20. 23:24

이번 강좌에서는 Mono를 이용하여 Hello World 콘솔 응용프로그램을 만들어보고 MonoDevelop와 Visual Studio의 차이점을 살펴보기로 하겠습니다. Visual Studio가 Windows용 응용프로그램을 위하여 최적화된 환경을 제공한다면 MonoDevelop는 Linux 응용프로그램, 정확하게는 Gnome Desktop을 위하여 최적화된 환경을 제공합니다.

이번 강좌에서는 지난번에 이어 VMware 기반 Mono 패키지를 이용합니다. 다음의 웹 사이트에서 Mono 패키지와 VMware Player를 무료로 다운로드받으실 수 있습니다.

새 프로젝트 만들기

VMware 패키지를 부팅한 이후에 바탕 화면에 MonoDevelop 아이콘이 있을 것입니다. 이것을 더블 클릭하면 MonoDevelop IDE가 시작됩니다.

사용자 삽입 이미지

위의 화면에서 Start New Solution을 클릭하면 아래와 같은 대화 상자가 나타납니다.

사용자 삽입 이미지

Visual Studio의 새 프로젝트 만들기 대화 상자와 거의 비슷합니다. 하지만 Visual Studio와는 달리 Boo와 같은 신흥 닷넷 기반 스크립트 언어와 MSIL에 대한 직접 지원 (ILAsm), Java 프로그래밍, NUnit 프로젝트 등을 지원합니다. 패키징 프로젝트는 Visual Studio가 제공하는 설치 프로젝트의 성격을 가지지만 오픈 소스 프로젝트를 진행하는 사례가 많음을 감안하여 소스 코드 패키징까지 지원합니다.

Packaging

C# Console 프로젝트를 선택하고 프로젝트 이름을 HelloWorld로 입력하여 프로젝트 생성을 시작하면 새 프로젝트에 대한 상세 설정 대화 상자가 나타납니다. 크게 세 가지 설정이 존재하는데 일단 Packaging 설정부터 살펴보기로 하겠습니다.

사용자 삽입 이미지


Archive of Sources

프로젝트 소스 코드를 패키징하는 방법을 정의합니다. 오픈 소스 프로젝트를 많이 진행하는 경우를 감안한 MonoDevelop만의 독특한 설정입니다.

  • MonoDevelop Project Model Sources: 패키지의 압축을 풀었을 때 바로 MonoDevelop에서 열 수 있도록 패키징합니다.
  • SharpDevelop 1.0 Project Model Sources: 패키지의 압축을 풀었을 때 바로 무료 Windows/.NET 기반 오픈 소스 IDE인 SharpDevelop에서 열 수 있도록 패키징합니다. 여기에는 만드려는 MonoDevelop 프로젝트 파일의 형식 변환이 같이 포함됩니다.
  • Visual Studio .NET 2005 Sources: 패키지의 압축을 풀었을 때 바로 Visual Studio 2005 이상의 IDE나 msbuild 유틸리티에서 열 수 있도록 패키징합니다. 여기에는 만드려는 MonoDevelop 프로젝트 파일의 형식 변환이 같이 포함됩니다.

Archive of Binaries

  • Linux Binaries: GTK# 등의 크로스 플랫폼 라이브러리나 런타임이 있을 경우 이것들의 리눅스 버전을 모아서 패키징하기 위한 설정입니다. 이후에 패키징 대상을 수기로 변경할 수 있습니다.
  • Windows Binaries: GTK# 등의 크로스 플랫폼 라이브러리나 런타임이 있을 경우 이것들의 Windows 버전을 모아서 패키징하기 위한 설정입니다. 이후에 패키징 대상을 수기로 변경할 수 있습니다.

Tarball: 관련 소스 코드와 바이너리를 타르볼 파일 (.tar 시리즈)로 압축합니다.

Unix Integration

사용자 삽입 이미지

Generate Launch Script: PE 기반 MSIL 혼용 이미지를 만들어내는 것이므로 사실 만들어진 exe 파일 자체는 여전히 mono 런타임에 의하여 별도로 취급되어야 합니다. 이 과정을 단순화하기 위하여 별도의 스크립트를 생성할 수 있는 데 이 작업을 자동화해줍니다. 프로젝트 이름과 다르게 스크립트 이름을 지정할 수 있습니다.

Generate .desktop File: GNOME 노틸러스를 위한 단축 아이콘 파일 (Windows의 Explorer Shell과 대응됩니다. Windows의 단축 아이콘이 .lnk 확장자를 가지는 것과 같습니다.)을 생성하도록 할 수 있습니다. 이 설정 또한 스크립트를 만드는 것과 같은 용도이지만 GNOME 노틸러스를 위한 부가 설정이 포함됩니다.

Translation

사용자 삽입 이미지

Mono는 다른 Linux 기반 응용프로그램들과 같은 방법으로 지역화 기능을 제공합니다. Microsoft .NET Framework가 사용하는 지역화와는 다른 방법으로 프로그램과 함께 배포되는 PO (Portable Object) 파일을 i18n 라이브러리로 가져오는 방식입니다. 이 설정을 통하여 국적 및 국가 코드 별로 PO 파일을 미리 구성할 수 있습니다.

사용자 삽입 이미지

언어와 국적 코드를 설정하는 단계에서 User Defined Locale 설정을 이용하여 단순한 언어 번역을 위한 용도 외에도 사용자 정의 메시지 테이블을 구성할 수 있습니다.

Gtk# Support

사용자 삽입 이미지
 

프로젝트에 Gtk# 설정을 추가하고 대상 라이브러리 버전을 지정할 수 있습니다. 별도로 Mono SVN Repository에서 소스 코드를 체크아웃하여 가져오거나 Night Build (개발자에 의하여 짧은 시간 내에 Commit되는 검증 수준이 약한 최신 빌드)를 설치한 경우가 아니면 버전이 보통 한 개입니다.

여러 설정이 있었지만 우리는 여기서 아무런 설정을 택하지 않고 프로젝트를 만들어보기로 합니다. 하나씩 하나씩 다음 Chapter에서 짚어보기로 합시다.

첫 프로젝트 프로그래밍

사용자 삽입 이미지

우리가 예상하던것과 다르지 않게 프로젝트가 만들어지고, 편집과 테스트가 가능한 환경이 생성되었습니다. 리눅스 환경이라고는 해도 C# 코드를 보니 별로 어색하지 않습니다. Visual Studio와 유사한 Keyboard Scheme를 제공하므로 Console.WriteLine 메서드에 출력할 메시지를 Hello World!로 바꾸고 F5키를 눌러보기로 하겠습니다.

사용자 삽입 이미지

Visual Studio와는 조금 다르게 하단에 콘솔 프로그램의 실행 결과가 표시됩니다. GNOME의 경우 Windows에서처럼 기본 콘솔 인터프리터가 통일되지 않습니다. 하나도 설치되지 않았을 수도 있고, 수십 개가 설치된 상태일 수도 있습니다. 그래서 기본 설정은 이와 같이 표준 출력과 표준 오류 출력 스트림 (stdout, stderr)을 리디렉션하여 출력 결과를 보여주는 방식을 사용합니다.

사용자 삽입 이미지

프로젝트 디렉터리 구성 살펴보기

그러면 우리가 만든 프로젝트 파일들의 구성이 어떻게 되는지 한 번 살펴보기로 하겠습니다. 프로젝트 디렉터리는 위와 같이 사용자 프로파일 디렉터리 (이 가상 머신의 경우 /home/linux입니다.)에 솔루션 이름과 동일한 디렉터리가 생성된 것을 볼 수 있습니다.

사용자 삽입 이미지

mds 파일이 보입니다. 이 파일은 Visual Studio의 sln 파일과 같은 것이고 같은 솔루션 파일로 여러 프로젝트에 대한 정보가 mds 파일에 서술됩니다. 그리고 하위 프로젝트 디렉터리들도 이 디렉터리 아래에 생성되겠지요.

사용자 삽입 이미지

우리가 만든 C# 프로젝트가 저장되어있는 디렉터리로 들어가보면 이번엔 mdp 파일이 보입니다. Visual Studio의 csproj, vbproj, vdproj와 대응되는 것이 mdp 파일입니다. AssemblyInfo.cs, Main.cs 파일도 보이는군요. bin 폴더에 우리가 컴파일한 바이너리가 들어있을 것입니다.

사용자 삽입 이미지

Debug, Release 디렉터리가 마찬가지로 존재합니다. 디버그 모드와 릴리즈 모드를 프로젝트 작업 도중 IDE 도구 모음에서 설정할 수 있으며 여기에 맞추어 빌드하고 테스트할 수 있습니다.

사용자 삽입 이미지

Debug 폴더의 경우 exe 파일 외에 exe.mdb 파일 혹은 dll.mdb 파일이 생성될 수 있습니다. 이것은 Microsoft .NET Framework 환경에서의 pdb 파일과 같은 용도로 디버거가 문맥을 탐색할 수 있도록 정보를 저장한 Program Database 파일이지만 Mono Debugger를 위하여 생성된 것입니다.

요약

오늘 단원에서는 MonoDevelop로 프로젝트를 만들었을 때의 실제 디렉터리 및 파일의 배치, 소스 코드의 특성, 새 프로젝트를 만들 때 사용할 수 있는 설정들에 대하여 간략히 알아보았습니다. 다음 단원에서는 패키징 개념에 대하여 살펴보기로 하겠습니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Linux + .NET2008. 3. 24. 00:03

개요

근래에 들어서 Mono 프로젝트가 좀 더 대중에게 친숙한 방향으로 프로젝트를 발전시켜가고 있습니다. 가장 눈에 띄는 것은, 드디어 MonoDevelop가 수년간의 개발 과정을 거쳐서 드디어 1.0 버전을 처음 내놓았습니다. MonoDevelop는 Visual Studio에 익숙한 프로그래머들을 위한 오픈 소스 기반의 IDE (통합 개발 환경)입니다.

Windows 운영 체제에서는 Visual Studio나 SharpDevelop를 이용하여 닷넷 기반 응용프로그램을 손쉽게 개발할 수 있었습니다. 하지만 Linux, Solaris, Mac OS X등의 운영 체제에서는, 단순히 Mono 라는 프레임워크가 있었을 뿐 이에 대응되는 쓰기 편리한 개발 도구는 개발 단계였다는 점에서 여러 프로그래머들이 반길만한 즐거운 소식이 아닐 수 없습니다.

Mono Framework는 Miguel de Icaza 및 공동 창업자에 의하여 처음 설립된 Ximian (구 Helix Code)의 손으로 처음 시작된 것입니다. 그리고 이후 Novell에 합병되어 Mono Framework는 좀 더 전략적인 모습을 갖추게 되었고 현재는 Novell의 주력 리눅스 배포반인 SUSE Linux에 탑재되어 대중에게 선보이고 있습니다. 다양한 리눅스 배포반 (Fedora, CentOS, RHCE, SLES, SLED, openSUSE, Debian, Ubuntu, Gentoo 등...) 에서 패키지 방식으로 사용할 수 있고, Solaris, Mac OS X, Windows NT 계열을 지원합니다.

시작하기

참으로 좋은 취지의 프로젝트입니다. 더 이상 닷넷이 Microsoft Windows에만 묶여있다고 이야기할 필요도 없으며 다양한 커뮤니티에서 획기적인 솔루션들을 항시 새로 개발하고 있으니까요. 하지만 진짜 문제는, 이를 위하여 정말로 내가 지금 사용하고 있는 Microsoft Windows 운영 체제를 버려야 하는 것인가에 대한 문제입니다. 하지만, 고민하실 필요 없습니다. 절대 Mono를 위하여 컴퓨터를 포맷한다거나 컴퓨터를 교체해야 한다거나 하는 문제는 없을것이니 걱정하지 마십시오.

근간에 구입한 대부분의 개인용 컴퓨터 및 랩톱 컴퓨터들은 기본적으로 내장 코어를 2개 이상 사용하는 프로세서의 혜택을 누리고 있습니다. 따라서 간편하게 가상 PC를 이용하여 개발 환경을 체험하거나 평가할 수 있음은 물론 직접 사용하는 것 또한 가능합니다.

Mono 프로젝트 웹 사이트에서는 처음 Mono를 사용하거나 기존 Windows 운영 체제와 같이 개발 환경을 만들어나가고픈 개발자들을 위하여 가상 PC 패키지를 무료로 배포합니다. 이 가상 PC 패키지는 VMware Player를 이용하여 재생할 수 있도록 되어있으며 VMware Player 또한 무료이므로 간편하게 내려받아서 사용할 수 있습니다.

최신 버전의 Mono-Aware 가상 PC 패키지 받기: http://www.go-mono.com/mono-downloads/download.html

최신 버전의 VMware Player 받기: http://www.vmware.com/download/player/

만약 가상 PC를 사용할 여건이 안되신다면 Live CD를 이용하실 수도 있습니다. Live CD는 리눅스와의 호환성이 없어서 사용이 불편한 Microsoft Virtual PC 2004 및 2007에서도 잘 작동하며, 가상 PC를 구동하기에는 열악한 환경에서 ISO 이미지 파일을 CD로 제작하여 별도로 부팅해볼 수도 있는 유용한 옵션입니다.

첫 시동

모든 준비가 완료되었다면 이제 VMware Player를 열고 다음과 같이 가상 PC 파일을 열어봅니다.

사용자 이미지

파일을 열고 잠시 기다리면 아래와 같이 복사본 옵션에 관한 설정이 나타납니다. 특별한 상황이 아니면 대개의 경우 "I copied it" 라디오 박스에 응답하여 가상 PC를 시작하면 됩니다.

사용자 삽입 이미지

BIOS 화면이 지나가고 Master Boot Record에 설치된 GRUB이 나타나는 것을 볼 수 있습니다. 첫 번째 옵션이 선택된 상태에서 Enter 키를 누르거나 잠시 기다리면 정상 모드로 부팅됩니다.

사용자 삽입 이미지

부팅이 시작되고 상세한 내역은 모두 숨겨집니다. 리눅스가 자랑하던 콘솔 화면 위로 펼쳐지는 기나긴 부팅 메시지 대신 마치 Microsoft Windows 운영 체제의 시작 화면을 보는 듯한 느낌이 듭니다. 만약 종전의 화면에 나타나는 내용을 직접 확인해보길 원하신다면 Esc 키를 누르면 됩니다.

사용자 삽입 이미지

부팅이 완료되면 X-Windows와 함께 기본 Desktop인 GNOME이 시작음과 함께 나타납니다. 잠시 기다리면 아래와 같은 바탕 화면이 나타나는 것을 볼 수 있습니다.

사용자 삽입 이미지

이제 이것저것 둘러보셔도 됩니다. 인터넷 연결이 갖추어져있으므로 Firefox를 이용하여 웹 서핑도 할 수 있으며 SUSE Linux의 특징을 찾아보시는 것도 재미있겠습니다. 바탕 화면을 보니 MonoDevelop와 Mono Documentation 프로그램의 바로 가기 아이콘도 보이는군요. :-)

오늘은 간단한 소개를 목적으로 한 것이었으므로 여기까지 포스팅을 하도록 하겠습니다. MonoDevelop에 대한 구체적인 투어는 다음 아티클을 통하여 하기로 하겠습니다. 아티클을 마무리하기 전에 중요한 것을 하나 알려드리겠습니다. 가상 PC도 컴퓨터는 컴퓨터인지라 그냥 Shutdown하시면 안됩니다. VMware Player의 창을 닫으면 자동으로 Suspend Mode로 전환되기는 하겠습니다만 정확하게 Shutdown 하는 방법을 숙지하시는게 좋겠지요. :-)

사용자 삽입 이미지
 

좌측 하단의 Computer 버튼을 클릭하면 시작 메뉴와 유사한 팝업 창이 나타나는데 여기서 Shutdown 메뉴를 클릭합니다. 그러면 아래와 같이 Shutdown 대화 상자가 나타납니다.

사용자 삽입 이미지

여기서 Shutdown 버튼을 클릭하여 안전하게 SUSE Linux를 종료하고 컴퓨터의 전원을 내리실 수 있겠습니다. Windows와 마찬가지로 Restart, Hibernate, Sleep 옵션도 지원되므로 실제 PC에서는 다양한 옵션을 이용하실 수도 있겠습니다. :-)



Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

  1. 모노 개발 전용 VMware 이미지도 공개하는군요. 재밌네요.

    2008.03.24 23:22 [ ADDR : EDIT/ DEL : REPLY ]
    • 남정현

      요즈음 웬만한 오픈 소스 프로젝트들은 VMware 패키지를 무상으로 배포해서 개발자들이 충분히 최적화된 환경 아래에서 프로젝트를 검증해볼 수 있도록 도움을 많이 주고 있습니다. 참 바람직한 일이지요. ㅎㅎ

      2008.03.25 00:16 [ ADDR : EDIT/ DEL ]

기술 소식2007. 12. 14. 00:01

오랜 기간을 거쳐서 Mono 1.2.6이 새로 런칭했습니다. 매번 더 진화하는 모습을 보여주고 있는데 이번에는 Silverlight에 대한 구체적인 지원 방안을 포함한 것이 특징입니다.

주요 변경 사항

* Microsoft Silverlgith 1.1 응용프로그램을 완전히 제작할 수 있도록 구현되었습니다.
* X11 Server 없이 사용할 수 있는 Mac OS X용 네이티브 System.Windows.Forms 드라이버가 구현되었습니다.
* ASP.NET AJAX API와 컨트롤이 추가되었습니다.
* FastCGI 배포 기능이 지원되므로 lighttpd나 Apache에 보다 쉽게 통합할 수 있습니다.
* Mozilla 브라우저를 Embedding하는 WebControl이 추가되었습니다. (주: WebBrowserControl은 Internet Explorer를 Embedding 합니다.)
* 제네릭 및 다양한 분야에 걸친 최적화로 이전보다 더 적은 메모리 소비량을 나타내며 CoreCLR 보안 시스템이 구현되었습니다.
* C# 컴파일러가 C# 3.0 기본 언어 사양을 대부분 지원합니다.
* LDAP를 정식으로 지원합니다.

홈페이지: http://www.mono-project.com


Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

포트폴리오2007. 12. 8. 13:35

xPlatform의 Win32 API 영역 중에 Microsoft Visual C++ Runtime에 관한 정보 수집이 어느 정도 완료되었고 이것을 바탕으로 Phase #1을 이번달 말에 예정대로 런칭할 계획입니다. Visual C++ Runtime (msvcrt.dll)의 상당 수의 시그니처는 libc와 일치하는 것으로 보이며 이 중 몇 가지를 시험삼아 Linux 버전으로 옮겨서 작업 중입니다.

아래의 동영상은 Asianux 2.0 SP1 기반의 PC에서 Mono 1.2.5.1_3을 이용하여 xPlatform DLL을 이용한 간단한 파일 입/출력 서비스를 보여주고 있습니다. 점진적인 테스트를 거쳐 Linux에서도 표준 파일 입/출력 서비스 및 기본 C 런타임을 사용할 수 있도록 준비할 계획입니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

포트폴리오2007. 11. 25. 19:51

C#의 __arglist는 MSIL로 번역되면서 Call Instruction에 varargs라는 추가 파라미터를 지정하는 방식으로 사용됩니다. gmcs 컴파일러에서는 Microsoft .NET Stack과의 호환성을 위하여 __arglist 키워드에 대한 정확한 처리를 수행하는 것 처럼 보입니다. 그러나 런타임에서 Microsoft .NET Framework의 경우 이것을 정확히 관리하고 있지만 Mono의 경우 가변 인수를 IL에서 사용할 수 없습니다. 이것은 __arglist가 표준 사양이 아니기 때문에 그렇습니다. 다음은 Mono에서 가변 인수 메서드를 호출할 때 발생하는 예외입니다.

[CODE]
[root@localhost ~]# mono test.exe

Unhandled Exception: System.InvalidProgramException: Invalid IL code in Program:
Main (): IL_0007: call        0x0a000001

[root@localhost ~]

[/CODE]

그러나 가변 인수를 사용하지 않고 필요한 만큼 인수를 직접 선언하는 방법은 유효합니다. 다음과 같이 직접 필요한 인수를 지정하여 플랫폼 호출 선언을 지정하여 사용하는 경우 정상적으로 실행됩니다.

[CODE]
[DllImport("libc", CharSet = CharSet.Ansi, ExactSpelling=true)]
public static extern int printf(string format, int testIntenger);

[/CODE]

xPlatform은 이 부분에 대한 문제 개선을 위하여 동적 플랫폼 호출 선언 관리 클래스를 별도로 구현할 예정에 있으며 이 클래스를 통하여 Mono의 __arglist 비호환성 문제를 비롯하여 타 언어에서도 가변 인수 메서드의 사용을 가능하게 할 것입니다.

Issue Code: XP000002

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

기술 소식2007. 9. 1. 13:00
오랜 침묵을 깨고 Mono가 새로운 버전을 내놓았다. 그 동안의 침묵은 바로 .NET Framework 3.5에 준하는 기능을 구현하기 위한 목적으로 이행되었던 모양이다. Mono 1.2.5은 C# 3.0의 LINQ 및 C# 3.0의 기타 확장 사양들 (익스텐션 메서드, 람다 표현식 등)을 공식적으로 지원한다. 아울러서 마스크가 적용된 Windows Forms 텍스트 박스 컨트롤과 다수의 반가운 새 기능들이 추가되거나 좀 더 완전해진 모습으로 되돌아 왔다.

자세한 릴리즈 노트는 http://go-mono.com/archive/1.2.5/ 에서 확인할 수 있으며, 다운로드 페이지는 http://www.mono-project.com/Downloads 이다. 현 시점에서 아직 솔라리스 포팅 버전으로 1.2.5는 나와있지 않지만 조만간 새로 나올 것으로 보이며, MoMA (mono Migration Analyzer)도 1.2.5 사양에 맞게 업데이트되었을 것으로 생각된다. 1.2.4 버전에서 마이그레이션에 난항을 겪었다면 1.2.5 버전을 가지고 다시 한 번 도전해보면 좋을듯 싶다.
Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

기술 소식2007. 2. 10. 17:37
나날이 Mono 프레임워크가 좋아지고 있습니다. 이번에 새로 나온 Mono 1.2.3 역시 상당 부분 개선이 이뤄졌습니다. Microsoft Stack (Windows Forms, ASP .NET, Visual Basic 8.0과 같은 부분)에 대한 지속적인 개선이 돋보입니다. 이번에 새로 추가되었거나 향상된 MS Stack에 대한 구현은 대강 아래와 같습니다.

- WinForm 2.0의 TableLayout 컨트롤 구현
- WinForm 2.0의 ~Strip 시리즈 컨트롤 구현
- WinForm 1.1의 SendKeys 메서드 구현
- WinForm 2.0의 ListViewGroups 및 AutoCompletion 구현
- 더블 버퍼링 기능 개선
- 이벤트 처리 기능 개선
- Visual Basic 8.0 Compiler 데뷔 (프리뷰)
- Mainsoft사의 ASP .NET에 관한 다양한 패치/스타터 킷 마이그레이션
- <tagMapping> 구현
- ASP .NET 2.0의 Session State Model 구현
- ProfileCommon 사용자 정의 프로필 클래스 지원
- App_Local/GlobalResources 폴더에 대한 완벽한 지원
- App_Code, App_LocalResources, App_GlobalResources의 변경 사항을 감지하고 이것의 반영을 위하여 자동으로 ASP .NET 응용프로그램을 재시작하는 기능 추가
- 리눅스에서 사용 가능한 System.Media 네임스페이스 구현 추가
- XML 웹 서비스의 SOAP 1.2 프로토콜 지원
- XML 웹 서비스를 위한 XmlSerializer 기능 개선
- MkBundle의 Machine.Config 파일에 대한 기능 개선
- HttpListener의 HTTPS 프로토콜 지원
- .NET 2.0의 Socket API 구현
- System.Drawing.SystemIcons 구현
- ColorMatrix의 알파값을 올바르게 다룰 수 있으며 40% 정도 더 빠름
- 알파 채널을 포함하는 PNG 이미지를 제대로 표시할 수 있음
- 투명 배경색을 지원하는 새로운 아이콘 이미지 디코더 추가
- 15/16bpp 비트맵 이미지를 전용 비트맵 이미지 디코더에 의해 처리함
- .NET 2.0 API에 관한 Monodoc이 추가됨
- PE 파일과 확장 데이터에 관한 서명을 생성할 수 있게됨
- SSL/TLS의 캐쉬 문제를 해결함
- XML 서명 및 암호화 문제를 해결함
- DSA 인증을 위한 상속된 키 매개변수를 지원함
- PKCS#12 파일 안의 DSA 인증을 지원함
- X.509 CRL에 대한 향상된 지원 기능 추가
- Microsoft.Build에 대응되는 xbuild 추가 (Visual Studio 2005 프로젝트 파일을 직접 사용할 수 있음)
- Sqlite ADO .NET Provider의 ADO .NET 2.0 지원 추가
- 제네릭 기반 리모팅을 사용할 수 있음
- 다차원 배열 접근에 대한 기능 향상을 위하여 JIT를 수정함
- JIT에 의한 상수 초기화 및 블럭 초기화가 지원됨
- SafeHandle에 대한 지원을 추가함
- Mono 헤더 파일에 버전의 구별을 추가하여 Mono 런타임의 버전 별로 구동할 수 있는 기반을 조성함
- 배열 객체의 초기화를 최적화하여 이전보다 30% 이상 최고 100%까지 성능 향상을 이끌어내었고 다차원 배열에의 접근 기능을 최적화하여 3차원 배열에의 접근의 경우 이전보다 4배 빠름
- 더 적은 메모리 사용률을 보임
- Alpha, MIPS, ARM용 포팅이 업데이트됨
- SPARC 포팅의 경우 이전보다 3배 빠르게 동작함
- 콘솔에서의 오버헤드를 최소화하기 위하여 빠른 초기화에서 늦은 초기화로 구현을 바꿈 (.NET 2.0의 특이한 콘솔 API에 대한 지원을 위하여 바뀐 부분)

또한 MS의 IronPython 프로젝트를 기초로하여 기존의 CPython과의 호환성을 구축한 IPCE는 매력적입니다. IPCE는 IronPython이 기존의 CPython과 연동하여 동작하는 부분에 있어서 문제가 된 점을 패치하였으며 동시에 표준 Python 라이브러리를 첨부한 것입니다. 이 IPCE를 이번 Mono 1.2.3 릴리즈 안에 공식적으로 처음 포함했다고 합니다.

* 릴리즈 노트로 이동하기: http://www.go-mono.com/archive/1.2.3/
Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Windows + .NET2006. 9. 17. 18:34

IronPython은 개발 초기 단계부터 많은 사람들의 관심을 이끌었던 프로젝트입니다. C, C++, Java에서 사용이 가능했던 Python을 .NET Framework위에서 사용할 수 있게 되니까요. 뿐만 아니라 개발 과정 내내 발표된 성능 측정 자료는 점점 더 많은 사람들이 IronPython에 흥미를 느낄 수 있도록 해주었습니다. 부분적이기는 하지만 우리가 빠르다고 여겨왔던 C, C++ 기반의 Python보다 더욱 속도가 빠르기까지 하였습니다. (함수 호출, 수식 계산과 같은 부분은 종전의 Python이 1초라고 한다면 오차를 무시하고 약 0.3초 가량이 더 빠릅니다. Java 기반의 Python에 비해서는 무려 50배 이상 더 빠릅니다.)

IronPython은 현재 공식적으로 버전 1.0이 발표된 상태입니다. IronPython의 등장은 단순히 소프트웨어 하나가 더 늘어난 것이 아니라 .NET Framework를 더욱 풍성하게 가꾸어줄 양분이 늘어난 것으로 해석해야 할 것입니다. 왜냐하면 컴파일 언어 기반이었던 .NET Framework에는 스크립트 언어만이 가질 수 있는 확장성과 다양성이 다소 결여되어있었기 때문입니다.

우리가 앞으로 개발할 프로그램에 IronPython을 사용하게 된다면 이전보다 더욱 역동적인 프로그램을 제작할 수 있습니다. 우리가 잘 알고 있는 스크립트 언어 활용의 대표적인 사례인 Microsoft Office와 마찬가지로 현재 프로그램에서 생성한 객체들이나 노출된 API들을 프로그램의 자동화에 사용할 수 있을 뿐만 아니라 Microsoft Office가 지원하는 Script Programming 기능처럼 우리의 프로그램에도 그런 기능을 넣을 수 있게 됩니다. 그리고 IronPython만의 특전이 하나 더 있다면 그것은 바로 문자열로 된 수식 계산이 단 한 번의 호출로 처리될 수 있다는 점입니다. Python 패키지들이 흔히 제공해왔던 대화형 Python Shell에서 해왔던 것과 마찬가지입니다. 오히려 더 좋습니다. 단순한 수식일 수도 있지만 수식 안에 .NET Framework의 API 함수 호출 구문이나 자신이 만든 수식 계산 루틴을 담는 함수 호출 구문을 추가할 수도 있으니까요.

IronPython의 기본적인 문법을 익힘과 동시에 IronPython을 어떻게 기존 응용프로그램에 통합할 수 있는지를 이 강좌를 통하여 차근차근히 살펴보도록 하겠습니다. 이 강좌가 많은 도움이 되기를 바랍니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Windows + .NET2006. 1. 4. 17:00

오랫만에 업로드하는 강좌이군요. 그간 별 일 없으셨나요?

갈수록 바쁜일이 많아지다보니 강좌를 올리는 것 자체가 어려워지고 있습니다. 많은 양해를 부탁드립니다.

오늘은 C#에서 편하게 쓸 수 있는 유틸리티인 Verbatim String에 대해서 조명해 보도록 하겠습니다. Verbatim String은 마치 꽁수처럼 알려져 왔던 @ 이라는 기호가 붙는 문자열을 뜻합니다. 다음의 예제를 살펴보도록 하지요.

string test = @"
Welcome to
"" My ""
Program!";

Verbatim 문자열로 사용할 수 있는 모든 것이 드러난 코드입니다. 따옴표를 이스케이프시키기 위하여 두번 따옴표를 표기했다는 점을 빼면 이스케이프 기호를 한번도 사용하지 않고도 있는 그대로를 가져다 붙인 점이 매우 독특합니다. 이 점을 이용하면 정규표현식과 같이 매우 복잡한 문자열을 보이는 그대로 가져다 쓸 수 있습니다. 즉, 다음과 같은 코드가 가능합니다.

string innerCode = @"/// <summary>
/// 대한민국의 주민등록번호 식별 체계에 의하여 제공된 주민등록번호가 올바른 주민등록번호인지의 여부를 판별합니다.
/// </summary>
/// <remarks>
/// 이 메서드는 20세기, 21세기 출생자에 한해서 주민등록번호 유효성 검사를 지원합니다.
/// 20세기보다 이전의 출생자의 주민등록번호, 21세기보다 이후의 출생자의 주민등록번호들은
/// 검사 결과가 모두 False로 출력됩니다.
/// </remarks>
/// <param name=""firstPart"">주민등록번호를 구성하는 앞의 6자리 숫자입니다. 연, 월, 일 순서로 각각 두 자리로 구성된 앞의 6자리입니다.</param>
/// <param name=""lastPart"">주민등록번호를 구성하는 뒷쪽의 7자리 숫자입니다. 고유 번호 7자리로 구성되어있습니다.</param>
/// <returns>형식에 맞는 주민등록번호이면 True, 맞지 않다면 False를 반환합니다.</returns>
public static bool CheckSocialNumber(string firstPart, string lastPart)
{
  string socialNo = firstPart.Trim() + lastPart.Trim();

  // 정규식 패턴 문자열입니다. 6자리의 정수 + [1, 2, 3, 4 중 택 1] + 6자리의 정수
  string pattern = @""\d{6}[1234]\d{6}"";

  // 입력 내역과 정규식 패턴이 일치하면 이 조건문을 통과합니다.
  if(!Regex.Match(socialNo, pattern, RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace).Success)
       return false;

  // 20세기 출생자와 21세기 출생자를 구분합니다.
  string birthYear = ('2' >= socialNo[6]) ? ""19"" : ""20"";

  // 연도 두 자리를 추출하여 추가합니다.
  birthYear += socialNo.Substring(0, 2);

  // 월 단위 두 자리를 추출합니다.
  string birthMonth = socialNo.Substring(2, 2);

  // 일 단위 두 자리를 추출합니다.
  string birthDate = socialNo.Substring(4, 2);

  try
  {
       // 정수로 변환을 시도합니다. 예외가 생기면 catch 블럭으로 이동됩니다.
       int bYear = int.Parse(birthYear);
       int bMonth = int.Parse(birthMonth);
       int bDate = int.Parse(birthDate);

      // 20세기보다 이전연도, 21세기보다 이후연도,
       // 월 표기 수가 1보다 작은 값, 월 표기 수가 12보다 큰 값,
       // 일 표기 수가 1보다 작은 값, 일 표기 수가 12보다 큰 값에 해당되면
       // catch 블럭으로 이동됩니다.
       if(bYear < 1900 || bYear > 2100 || bMonth < 1 || bMonth > 12 || bDate < 1 || bDate > 31)
           throw new Exception(""잘못된 날짜 표현입니다."");
  }
  catch { return false; }

  // 고유 알고리즘입니다.
  int[] buffer = new int [13];

  for(int i=0; i<buffer.Length; i++)
       buffer[i] = Int32.Parse(socialNo[i].ToString());

  int summary = 0;
  int[] multipliers = new int [] { 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5 };

  for(int i=0; i<12; i++)
       summary += (buffer[i] *= multipliers[i]);

  return !((11 - (summary % 11)) % 10 != buffer[12]);
}
";

Verbatim 문자열을 이용하여 코드 자체를 미리 내장하고 프로그램을 실행하는 도중에 동적으로 컴파일할 수 있습니다. 또한 이와 같이 포함된 Verbatim 문자열은 Obfuscator와 같은 도구로 암호화할 수도 있기 때문에 정보를 보호하기 위한 목적으로도 사용할 수 있습니다.

프로그램을 개발하는데에 좀 더 도움이 되시길 바라며 올해도 건강하십시오. ^^

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Windows + .NET2005. 10. 18. 17:23

닷넷은 프레임워크라고 하는 구성 요소를 중심 축으로 하여 여러 가지 서비스들을 제공하고 있습니다. 이 프레임워크는 대개의 닷넷 개발자들이 Microsoft 제품 외에는 없다고 단정을 지을 때가 상당히 많은데, 사실은 프레임워크도 종류가 여러가지입니다. Mono는 이러한 것들 중의 한 종류라고 할 수 있습니다.

* Microsoft .NET Framework

Windows 환경에서 가장 널리 사용됩니다. Microsoft가 .NET에 관해서 보여주고 싶어하는 것을 가장 빨리 확인할 수 있는 프레임워크이기도 합니다. 현재 공개된 가장 최근의 버전은 2.0입니다. 소스 코드는 사용하실 수 없지만 무료로 다운로드하실 수 있습니다. 이 글을 새로 고친 현 시점에서 2.0을 기반으로 하는 3.0이 새롭게 출시되었습니다. .NET Framework 3.0은 C# 3.0이 아닌 C# 2.0 스펙입니다.

* Microsoft Rotor Framework

.NET Framework에 대한 얼터너티브 버전으로, Mac OS X, BSD 계열 유닉스, Windows를 대상으로 배포 중인 프레임워크입니다. .NET Framework의 버전에 맞춰서 같이 발매되는데, .NET Framework 2.0의 정식 버전이 발표되면 마찬가지로 이 프레임워크의 새 버전이 나옵니다. 이 글을 새로 고친 현 시점에서 FreeBSD와 Windows NT에서 사용 가능한 Rotor (SSCLI) 2.0이 나왔습니다. 이 프레임워크는 오픈 소스이며, 소스 코드로 제공됩니다.

* Mono Framework

원래 Ximian에서 처음 개발을 시작한 오픈 소스 프레임워크입니다. Linux, Unix, Mac OS X, Windows를 대상으로 개발되는 프레임워크입니다. Microsoft .NET 영역에서 제공되지 않는 툴킷을 다수 기본 제공하며 많은 수의 닷넷 계열 오픈 소스 프로젝트들이 이 프레임워크를 기준으로 작성됩니다. GTK#, COCOA#, 다수의 ADO .NET 어댑터 (SqLite, MySQL, ...)들을 기본 제공합니다. 최근 Mono Framework는 많이 안정화되고 성숙해졌습니다.

* DotGNU Framework

GPL 라이센스를 따르는 오픈 소스 프레임워크입니다. Mono에 비해 늦게 시작하였지만 Mono와는 달리 성능에 상당히 초점을 맞추고 개발하는 프레임워크입니다. 이 프레임워크가 지향하는 환경은 리눅스에서 네이티브 모드로 닷넷 어플리케이션들을 구동하는 것이라 합니다.

현재까지 알려진 프레임워크는 이 정도입니다. 진행하시고자 하는 프로젝트나 학습 방향에 맞는 프레임워크와 개발 도구를 선택하시는 것은 본인의 몫이기에 어느 것이 더 좋다고 이야기할 수는 없겠습니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Windows + .NET2005. 10. 3. 01:58

대입을 확정한 이후로 한동안 다른 프로젝트를 진행하느라 카페에 자주 못들렀습니다. 조만간 오픈 소스 프로젝트 몇 종류를 공개적으로 런칭하게 될 것 같습니다. 많은 관심 부탁드리면서 간단한 기술을 또 하나 알려드리고자 합니다. 이 강좌를 읽으시기 전에 이벤트를 선언하는 방법과 대리자의 특성에 대해서 숙지하시면 유용하실 것입니다.

이벤트는 흔히 구독 (Subscription)과 해지 (Cancellation)의 개념을 사용합니다. 이는 C#의 문법을 통해서 관찰하면 훨씬 쉽게 이해할 수 있습니다. 다음의 예를 살펴보도록 하지요.

public delegate void SampleCallback(object arg1, object arg2, object arg3);

public class Ex1
{
  public event SampleCallback Sample;

  public Ex1()
  {
      this.Sample += new SampleCallback(SampleTest);
      this.FireSampleEvent();

      this.Sample -= new SampleCallback(SampleTest);
  }

  protected void FireSampleEvent()
  {
      if(this.Sample != null)
          this.Sample(123, 456f, "7890");
  }

  private void SampleTest(object arg1, object arg2, object arg3)
  {
      Console.Out.WriteLine(arg1);
      Console.Out.WriteLine(arg2);
      Console.Out.WriteLine(arg3);
  }

  [MTAThread()]
  public static void Main(string[] arguments)
  {
      Ex1 tester = new Ex1();
      Console.WriteLine("Tester launched.");
  }
}

위의 코드에서는 Sample이라는 이벤트에 SampleCallback 형식의 대리자를 구독하고 해지하는 예를 보여주었습니다. 아주 기본적인 이벤트 처리 방법을 보여주는 예제입니다. 하지만 지금 보여드릴 예제는 C# 문법을 깊숙히 살펴보지 않으신 분들께는 상당히 생소한 예제가 될 것입니다.

public delegate void SampleCallback(object arg1, object arg2, object arg3);

public class Ex1
{
  public event SampleCallback ExactSample;

  public event SampleCallback Sample
  {
      add
      {
          Console.Out.WriteLine("Event Added.");
          this.ExactSample += value;
      }
      remove
      {
          Console.Out.WriteLine("Event Removed.");
          this.ExactSample -= value;
      }
  }

  public Ex1()
  {
      this.Sample += new SampleCallback(SampleTest);
      this.FireSampleEvent();

      this.Sample -= new SampleCallback(SampleTest);
  }

  protected void FireSampleEvent()
  {
      if(this.Sample != null)
          this.Sample(123, 456f, "7890");
  }

  private void SampleTest(object arg1, object arg2, object arg3)
  {
      Console.Out.WriteLine(arg1);
      Console.Out.WriteLine(arg2);
      Console.Out.WriteLine(arg3);
  }

  [MTAThread()]
  public static void Main(string[] arguments)
  {
      Ex1 tester = new Ex1();
      Console.WriteLine("Tester launched.");
  }
}

결과적으로는 위의 예제와 동일하지만 콘솔 윈도우에는 메시지가 몇 줄 더 기록될 것입니다. 기록되는 부분의 코드는 이벤트 선언을 확장한 곳에서 쓰여지는 코드인것을 알 수 있습니다. add 섹션에서는 이벤트를 등록하는 과정에 일어나는 일들이 기록되어있으며 remove 섹션에서는 반대로 이벤트를 해지하는 과정에서 일어나는 일들일 기록되어있음을 알 수 있습니다. 그리고 재미있는 점은, value라는 키워드가 프로퍼티에서처럼 여전히 유효하다는 점입니다. 그렇다면 value는 무슨 형식일까요?

public delegate void SampleCallback(object arg1, object arg2, object arg3);

public class Ex1
{
  public event SampleCallback ExactSample;

  public event SampleCallback Sample
  {
      add
      {
          Console.Out.WriteLine("Event Added. Type: " + value.ToString());
          this.ExactSample += value;
      }
      remove
      {
          Console.Out.WriteLine("Event Removed. Type: " + value.ToString());
          this.ExactSample -= value;
      }
  }

  public Ex1()
  {
      this.Sample += new SampleCallback(SampleTest);
      this.FireSampleEvent();

      this.Sample -= new SampleCallback(SampleTest);
  }

  protected void FireSampleEvent()
  {
      if(this.Sample != null)
          this.Sample(123, 456f, "7890");
  }

  private void SampleTest(object arg1, object arg2, object arg3)
  {
      Console.Out.WriteLine(arg1);
      Console.Out.WriteLine(arg2);
      Console.Out.WriteLine(arg3);
  }

  [MTAThread()]
  public static void Main(string[] arguments)
  {
      Ex1 tester = new Ex1();
      Console.WriteLine("Tester launched.");
  }
}

눈치가 빠르신 분들은 value 키워드가 어떤 형식의 변수인지 금새 알아채셨을 것입니다. 컴파일해보면 나타나겠지만 SampleCallback 대리자임을 나타낼 것입니다. 그리고 value 변수가 대리자이기 때문에 대리자를 가지고 처리할 수 있는 일은 모두 가능합니다. 그래서 위의 예제에서는 전달된 대리자를 다른 이벤트에 += 연산자와 -= 연산자를 사용하여 이벤트 구독과 해지를 대신 처리하도록 코드를 변형하였습니다. 그리고 += 연산자와 -= 연산자는 위에서 나타난 그대로 반드시 new 키워드와 함께 쓰여야만 하는 것이 아닌 것도 알 수 있습니다.

위의 예제에서는 이벤트 구독과 해지를 단순히 다른 이벤트에게도 위임하는 방법을 보여주었습니다만, 이 정도 단계에까지 왔다면 이벤트 자체를 직접 관리할 수도 있지 않겠는가라는 생각을 하시는 분들도 계실 것입니다. 이러한 호기심을 해결해 드리기 위하여 또 하나의 예제 코드를 보여드립니다.

using System;
using System.Collections;

public delegate void MyDelegate1(int i);
public delegate void MyDelegate2(string s);
public delegate void MyDelegate3(int i, object o);
public delegate void MyDelegate4();

public class PropertyEventsSample
{
  private Hashtable eventTable = new Hashtable();

  public event MyDelegate1 Event1
  {
     add
     {
        eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] + value;
     }
     remove
     {
        eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] - value;
     }
  }

  public event MyDelegate1 Event2
  {
     add
     {
        eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] + value;
     }
     remove
     {
        eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] - value;
     }
  }

 public event MyDelegate2 Event3
  {
     add
     {
        eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] + value;
     }
     remove
     {
        eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] - value;
     }
  }

  public event MyDelegate3 Event4
  {
     add
     {
        eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] + value;
     }
     remove
     {
        eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] - value;
     }
  }

  public event MyDelegate3 Event5
  {
     add
     {
        eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] + value;
     }
     remove
     {
        eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] - value;
     }
  }

  public event MyDelegate4 Event6
  {
     add
     {
        eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] + value;
     }
     remove
     {
        eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] - value;
     }
  }
}

public class MyClass
{
  public static void Main()
  {
  }
}

위의 예제에서는 이벤트를 해시 테이블을 통하여 관리할 수 있도록 통제합니다. 또한, += 연산자와 -= 연산자의 의미를 정확하게 보여주고 있습니다. 사실, 막연하게 생각하고 있던 += 연산자와 -= 연산자의 정확한 의미는 위에 아주 잘 표현되어있습니다.

eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] + value;
eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] - value;

이 한 줄 안에는 상당히 의미있는 내용들이 농축되어있습니다.

대리자는 보통 하나의 메서드만을 사용하여 초기화하는 것이 일반적입니다. 그러나, 여기에 나타난 것처럼 대리자는 한 메서드에 대해서만 컨테이너를 생성하는 것이 아니라, 메서드 컬렉션을 관리하고 있습니다. 이것을 정확한 표현으로는 호출 목록이라고 하며, 호출 목록에 또 다른 메서드들을 더하고 빼는 것을 컴바인과 제거라고 표현합니다. 그리고 이렇게 형성된 호출 목록을 감싸는 대리자를 멀티캐스트 대리자라고 부릅니다.

위의 구문은 다시 정리하면 아래와 같습니다.

eventTable["Event6"] += value;
eventTable["Event6"] -= value;

그렇다면 여기서 이벤트의 역할이 궁금해집니다. 이벤트는 멀티캐스트 대리자를 하나의 속성으로 관리하고 구체화할 수 있는 또 하나의 규격으로 이해하시면 됩니다. 사실 이제껏 보아왔던 이벤트에 사용하는 += 연산자와 -= 연산자는 멀티캐스트 대리자로 처리하더라도 얼마든지 가능했던 일입니다. 하지만 멀티캐스트 대리자는 호출 목록을 관리하기 위한 하나의 수단일 뿐 본 강좌에서 살펴본것과 같이 하나의 프로퍼티로서 확장하는 것은 어렵습니다.

이벤트와 대리자 사이의 차이점은 기존에 널리 사용되던 개념만을 가지고는 이와 같은 상황에 직면했을 때 사라지게 됩니다. 하지만 본 강좌에서는 이와 같이 모호한 상황에 대해서 구체적인 결론을 내리고자 합니다.

단순히 변수에 값을 집어넣고 빼는 것만으로 보았을 때에는 변수나 프로퍼티가 유사한 것처럼 보이지만 본질적으로 변수는 변수일 뿐, 프로퍼티와 같이 커스터마이징을 할수는 없는것을 여러분들께서는 알고 계십니다.

대리자와 이벤트 사이의 관계도 이와 같이 정의할 수 있습니다. 대리자나 이벤트 모두 호출 목록을 만들어서 관리할 수 있는 것은 동일합니다. 그러나, 대리자는 호출 목록을 관리하는 것 까지이지만 이벤트는 어떻게 호출 목록을 추가하고 제거할 것인지에 관해서 다룰 수 있는 프로퍼티의 역할을 이행할 수 있습니다.

긴 강좌를 읽어주셔서 감사합니다. 많은 도움이 되셨기를 바랍니다.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Linux + .NET2005. 7. 17. 21:30

Mono 1.1.x 빌드에서 C# 2.0 문법을 사용하기 위해서는 "반드시" 참고하셔야 합니다. mcs 컴파일러는 C# 1.x 문법을 다루는 컴파일러입니다. 당연히 아래의 세 강좌를 mcs 컴파일러로 구동하려고 한다면 오류를 만납니다. gmcs 컴파일러를 사용하여 컴파일하셔야 합니다.

Mono 1.1.x 빌드는 Microsoft .NET Framework 2.x와 마찬가지로 ASP .NET 2.0을 지원합니다. ASP .NET 2.0에 관한 간단한 기능 시험을 해보시려면 우선 XSP 웹 서버로 테스트해보시길 권장하고 싶습니다. ASP .NET 1.x 만을 지원하는 웹 서버는 xsp 이며, ASP .NET 2.0까지 지원하는 웹 서버는 xsp2 입니다.

최신 기술에 대한 개념 이해는 Visual Studio 2005를 활용해보시는 것이 좋을 것이라 권장하고 싶습니다. Visual Studio 2005의 무료 버전인 Express Edition 버전이 MSDN에서 배포중이니 Windows 플랫폼에서 한번 사용해 보십시오. 인터넷을 통하여 다운로드하므로 프록시에 대한 설정이 필요할 수 있고 시간이 오래 걸릴 수 있습니다. 전화 접속 모뎀에서는 권장하지 않습니다.

Visual Studio 2005 Express Edition 다운로드 페이지

http://msdn.microsoft.com/express/

좋은 하루 되십시오. ^^

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Windows + .NET2005. 7. 17. 21:21

C# 2.0은 지금 소개하는 Generic이라는 기술을 통하여 Object 형식을 다루는 방법을 새롭게 제공합니다. 더 이상 복잡한 조건문을 메서드 안에 배열할 필요가 없으며 이 개념을 통하여 새로운 디자인 패턴을 만들 수 있게 되었습니다. 이 글을 작성하는 현 시점에서는 아직까지 Generic의 정확한 번역 용어가 채택되지 않았으므로 원래의 뜻을 유지하기 위하여 Generic으로 표기하고 있으므로 양해 바랍니다.

1. Generic 클래스의 문법 구조
Generic 클래스를 선언하는 방법은 기존의 클래스와 유사합니다. 하지만 기존의 클래스 선언에는 없는 몇 가지 추가 구문이 명시되어야만 합니다. C# 구문을 기준으로 설명하도록 하지요.

Visual Studio 개발자 여러분들을 위한 안내: Visual Basic .NET, J#, Visual C++, JScript .NET 및 기타 언어를 사용중이신 프로그래머분들께서는 MSDN Library 베타를 참조하십시오. J#에서 이 Generic을 사용할 경우 기존의 Java, J++, J# 1.x 문법과 호환되지 않는다는 점을 꼭 염두에 두시기 바랍니다. Visual C++ 8.x 버전의 컴파일러에서 Managed Extensions for C++의 키워드가 새롭게 바뀌었습니다. 그에 따라, Managed Extensions for C++ 1.x 버전으로 작성된 소스 코드에 대한 업데이트 또는 유지 보수가 필요할 것으로 예상됩니다. 그리고 이번 업데이트를 기준으로 하여 C++의 Template과도 일정 부분은 연동이 가능할 것으로 예상됩니다. (일부 형식 제한 지정과 같은 문법은 표준에 어긋나므로 주의하십시오.)

[public | private | internal | ...] [sealed | abstract] class [Class Name]
      <[Argument Type I], [Argument Type II], ..., [ArgumentType n]> : [Parent Class], [Interface I], ...
{
  // Class Body
}

클래스의 이름과 상속 관계를 지정하는 영역 사이에 부등식 기호 '<', '>' 안에 사용자 정의 형식을 지정합니다. 이 사용자 정의 형식은 임의로 이름을 붙일 수 있으나 클래스 이름의 명명법을 그대로 따르므로 클래스 이름의 명명법에 어긋나는 형태의 이름은 사용할 수 없습니다.

Generic 인수에는 단순히 클래스 형식을 지정할 수도 있지만, 구조체 형식, 인터페이스 형식, 대리자 형식, 중첩 Generic 형식의 지정도 가능합니다. 다시 말해, 사용하기에 따라서는 이 Generic 인수 자체가 복잡한 인수 트리 구조를 생성할 수도 있다는 뜻입니다. 하지만 한 세대 이상 파고드는 예는 그리 많지 않으므로 어렵게 생각하실 필요는 없습니다.

이 강좌를 처음 접하시는 프로그래머 분들 중에는 비교적 근래에 C++에서 도입된 개념인 Template을 떠올리신 분들도 계시리라 생각됩니다. 예상하신 그대로, Generic은 C++의 Template를 C#에 맞게 첨삭한 클론입니다. 하지만 Template에는 없거나 다소 불편한 개념을 수정한 것이 .NET 플랫폼의 Generic의 특징이라고 할 수 있습니다.

2. Generic 클래스에서의 사용자 정의 형식 활용 방법
Generic 클래스 안에서 사용자 정의 형식을 활용하시는 방법은 단순합니다. 사용자 정의 형식은 사실 System.Object 형식을 상속한 것과 다를 바가 없습니다. 그리고 Generic 클래스 인수 안에서 명시된 적이 있는 사용자 정의 형식은 중첩된 서브 클래스에서도 유효합니다.

3. Generic 클래스의 인스턴스 만들기
다음의 예제 코드를 살펴보도록 하지요.

using System;

namespace Test2
{
  public class Generic1 <FirstType> : System.MarshalByRefObject
  {
       private FirstType m_firstType;

      public Generic1(FirstType firstType)
       {
           this.m_firstType = firstType;
       }

      public FirstType FirstTypeInstance
       {
           get
           {
               return this.m_firstType;
           }
       }

      public override int GetHashCode()
       {
           return this.m_firstType.GetHashCode();
       }

      public override string ToString()
       {
           return this.m_firstType.ToString();
       }
  }

  public sealed class MainObject
  {
       [MTAThread()]
       public static void Main(string[] arguments)
       {
           Generic1<string> s = new Generic1<string> ("Test");
           Console.WriteLine("{0}", s);
           Console.ReadLine();
       }
  }
}

Generic이 지정된 클래스는 형식 선언을 할 때 부터 인수를 지정되는 모습을 볼 수 있습니다. Generic1<string> 이라는 형식의 의미는 string (System.String) 형식만을 받아들이는 Generic1 클래스의 단편을 뜻합니다. 그리고 Generic1<string> 이라는 선언 자체는 하나의 형식 키워드가 되기 때문에 생성자를 호출할 때에도 다시 한번 Generic1<string> 이라는 이름을 사용하게 됩니다.

4. Generic 클래스의 상속
Generic 클래스의 상속에 관하여 새롭게 소개되는 용어가 하나 있습니다. 의미는 우리가 익히 알고 있으나 용어 자체는 새로울 것입니다. 기존의 클래스를 C# 2.0에서는 Concrete 클래스라고 새롭게 명명하였는데, 상속 관계를 설명할 때에는 반드시 알아두셔야 하는 개념입니다.

Generic 클래스의 특성을 유지하면서 상속을 할 수 있을 때에는 자식 클래스도 Generic 클래스로 인정됩니다. 하지만 Generic 클래스의 특성을 유지할 수 없는 상속을 하여 Generic 클래스의 특성을 소멸시킨 상속을 한 자식 클래스는 Concrete 클래스로 취급됩니다. 봉인된 Concrete 클래스가 아닐 경우 얼마든지 새로운 상속 관계를 형성할 수는 있지만 부모에 관한 모든 Generic 정보에 대한 접근 권한은 잃어버립니다.

4.1. Generic 클래스의 인수를 줄이는 상속
다음의 구문을 살펴보도록 합시다.

public class Parent1 <A, B, C> { ... }
public class Child1 <A, B> : Parent1 <A, B, int> { ... }

어떻습니까? Child1 클래스에서는 A와 B 형식만을 받아들이도록 되어있지만 Parent1 클래스의 형식 인자 목록을 충족하도록 선언하였습니다. 이것이 Generic 클래스의 인수를 줄이는 상속의 한 예입니다. 여기서는 특정 위치에 있는 하나의 인수를 제거하였지만, 원하는 위치에 원하는 수 만큼의 인수를 제거할 수 있습니다.

4.2. Generic 클래스의 인수를 늘이는 상속
다음의 구문을 살펴보도록 합시다.

public class Parent2 <A, B, C> { ... }
public class Child2 <A, B, C, D> : Parent2 <A, B, D> { /* 인수 C를 활용하는 코드 */ }

4.1 섹션과 마찬가지로 Parent2의 인수 목록을 Child2가 모두 만족하는 상속을 하였습니다. 남아있는 C 형식에 관한 활용에만 집중하면 Child2 클래스의 작업은 끝이 나는 것입니다.

4.3. Generic 클래스의 인수를 유지하는 상속
다음의 구문을 살펴보도록 합시다.

public class Parent3 <A, B, C> { ... }
public class Child3 <AChild, BChild, CChild> : Parent3 <AChild, BChild, CChild> { ... }

인수의 이름이 달라지더라도 이상이 없음을 보여주는 예제였습니다.

4.4. Generic 클래스의 관계를 끊는 Concrete 클래스
다음의 구문을 살펴보도록 합시다.

public class Parent4 <A, B, C> { ... }
public class Child4 : Parent4 <short, int, long> { ... }

Child4는 클래스 자체에 대한 상속은 제공하고 있지만 Generic에 관한 특성을 완전히 소멸시킨 것입니다. Child4 클래스가 만약 봉인된 클래스라면 Generic에 관한 측면은 물론 클래스 자체에 대한 상속마저도 봉인한 고립된 클래스가 됩니다.

4.5. Concrete 클래스로부터 새로운 Generic 관계를 생성하기
다음의 구문을 살펴보도록 합시다.

public class Parent5 <A, B, C> : System.MarshalByRefObject { ... }

System.MarshalByRefObject 클래스 자체는 봉인 클래스가 아니기 때문에 새로운 Generic 관계의 생성을 허용한 것이 되었습니다. 만약 System.MarshalByRefObject 클래스가 봉인 클래스였다면 위의 구문은 오류를 유발할 것입니다.

오늘 강좌는 Generic 클래스에 대한 것들을 살펴보았습니다. 다음회 강좌에서는 Generic 인터페이스에 대해서 살펴보도록 하겠습니다. 미리 말씀드리는 부분이지만 Generic 인터페이스의 상속도 섹션 4의 내용을 그대로 적용하므로 이 부분에 관한 충분한 실습을 통하여 감각을 익혀두시기를 권장합니다.

좋은 하루 되십시오. ^^

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요

Windows + .NET2005. 7. 17. 00:40

이제까지 대리자의 선언은 명시적인 대리자 선언이 많이 사용되어왔습니다. 하지만 C# 2.0에서는 새롭게 추가된 대리자 프로그래밍 방법론을 제공합니다. 바로 익명 대리자 혹은 인라인 대리자라고 합니다. 이 기술을 이용하여 특정 메서드나 코드 블럭 안에서 간단히 새로운 메서드를 작성하는 것이 가능해졌습니다.

이 익명 대리자를 사용하는 조건은 기존의 명시적인 대리자 선언과 마찬가지로 대리자 형식의 선언이 되어있어야 한다는 전제가 깔려있습니다. 하지만 구현 방법과 시점의 차이가 명시적인 대리자와 익명 대리자를 구분하는 기준선이 되는 것입니다.

명시적인 대리자를 구현하는 클래스를 살펴보도록 하지요.

    // Common.cs

    using System;

    namespace Test

    {

      [Serializable()]

      public delegate void TestDelegate(int a, string b);

      public interface ITester

      {

           void Test();

      }

    }

    // NamedTest.cs

    using System;

    using Test;

    namespace Test.Named

    {

      public class NamedTest : ITester

      {

           public void Test()

           {

               TestDelegate d = new TestDelegate(this.NamedMethod);

               d(123, "named: one-two-three!");

           }

           private void NamedMethod(int a, string b)

           {

               Console.WriteLine(a.ToString());

               Console.WriteLine(b);

               Console.ReadLine();

           }

      }

    }

    // AnonTest.cs

    using System;

    using Test;

    namespace Test.Anon

    {

      public class AnonTest : ITester

      {

           public void Test()

           {

               TestDelegate d = delegate(int a, string b)

               {

                   Console.WriteLine(a.ToString());

                   Console.WriteLine(b);

                   Console.ReadLine();

               }; // 세미콜론은 필수!

               d(123, "anon: one-two-three!");

           }

      }

    }

    // MainObject.cs

    using System;

    using Test.Named;

    using Test.Anon;

    namespace Test

    {

      public sealed class MainObject

      {

           [MTAThread()]

           public static void Main(string[] arguments)

           {

               ITester t = new NamedTest();

               t.Test();

               t = new AnonTest();

               t.Test();

           }

      }

    }

개략적인 문법 사항만을 살펴보도록 하겠습니다. 지금 지적하는 부분 이외에는 기존의 대리자 프로그래밍 방법과 동일합니다.

익명 대리자를 지정하기 위하여 다음과 같은 구문을 사용합니다.

    delegate(매개변수 목록)

    {

      // 함수 본문;

    };

매개변수 목록은 해당 대리자의 인수 목록과 일치하도록 선언되어야만 합니다. 함수 본문은 메서드와 동일하게 작성할 수 있으며, return 키워드로 반환값을 반환할 수 있는 조건은 대리자의 반환값에 관한 시그니처에 따라서 달라집니다. 그리고 실수하지 말아야할 부분은 이 블럭이 끝나는 대괄호 끝에는 반드시 세미콜론을 기록해야 합니다.

다음 강좌에서는 클래스의 Generic에 관하여 살펴보도록 하겠습니다. 좋은 하루 되십시오.

Posted by Cloud Developer 남정현 (rkttu.com)

댓글을 달아 주세요