이번 Exploring Windows Azure 세미나를 시작으로 올 한해는 Windows Azure에 관련된 다양한 발표 및 소프트웨어 개발 활동을 병행해 나갈 계획에 있습니다. 계획의 일환으로, Windows Azure에서 사용할 수 있도록 이전부터 지속적으로 개발해 오던 xPlatform 프로젝트를 Windows Azure에서도 사용할 수 있도록 준비할 계획입니다.
xPlatform 프로젝트는 Windows를 시작으로, Linux, Mac OS X 등 다양한 운영 체제에서 기본적으로 닷넷의 기본 프레임워크에서는 노출하지 않는 Low Level API를 손쉽게 호출하고, 포인터나 비 관리 메모리 영역을 손쉽게 제어할 수 있도록 돕습니다. 현재는 32비트 버전의 Windows에서 사용할 수 있도록 코드를 완성하였고 첫 알파 릴리즈를 지난 가을에 런칭한 상태입니다.
Windows Azure는 단순히 웹 서비스를 클라우드 환경 위에 올리는것 뿐만이 아니라, Windows Azure의 바탕을 이루고 있는 64비트 버전의 운영 체제를 얼마나 잘 활용할 수 있는가에 대한 부분도 중요한 관건이 될 것입니다. Windows Azure의 기능을 극대화하고, 향후에 개발될 다양한 클라우드 기반 응용프로그램의 품질 향상에 기여할 수 있게 하기 위하여 xPlatform을 64비트 버전의 서버 운영 체제에서도 사용할 수 있도록 프로젝트 방향을 정하기로 하였습니다.
Windows Azure 개발 및 플랫폼 관련 프로그래밍에 관심있으신 개발자 여러분들의 많은 관심과 참여 부탁드립니다. 조만간, 64비트 버전으로 개량된 xPlatform 라이브러리를 런칭할 수 있도록 하겠습니다. 감사합니다. :-)
긴 여정 끝에, Project Blend: xPlatform의 2009년 11월 릴리즈를 공개하게 되었습니다. Project Blend: xPlatform (이하 xPlatform)은 .NET Framework 2.0 이상의 환경에서, C#이 아닌 다른 프로그래밍 언어들 (예: Visual Basic .NET, Visual J#, Iron Python 등)을 위한 비관리 프로그래밍 기술을 제공하고, 운영 체제에 대한 API를 제공하기 위하여 시작된 프로젝트입니다.
xPlatform 프로젝트는 Ms-PL (Microsoft Permissive License) 아래에서 배포되는 오픈 소스 기반 소프트웨어입니다. 그리고 아직까지는 일반 개발 환경에 직접 투입하기에 적절하지 않을 수 있음을 미리 알려드리며, 정식으로 릴리즈가 되기 이전까지는 많은 피드백과 테스트가 필요합니다.
다음의 코드는 실제로 xPlatform의 Core 라이브러리를 사용하여 작성한 샘플 코드로, 비 관리 영역 상의 메모리를 Unsafe 코드를 사용하지 않는 C#을 통하여 자유롭게 제어하는 예시를 담고 있습니다.
using System; using xPlatform; using xPlatform.Buffers;
class Program { static void Main() { int Length = 15;
using (GlobalHeapBuffer<double> myBuffer = new GlobalHeapBuffer<double>(Length)) { Pointer<double> ptr = myBuffer.TypedPointer;
for (int i = 0; i < Length; i++, ptr++) ptr.SetData(i * 0.2);
for (int i = 0; i < Length; i++) Console.WriteLine(">> ptr++[i]: {0}", ptr++[0]);
ptr = myBuffer.Address;
for (int i = 0; i < Length - 1; i++) Console.WriteLine(">> (++ptr)[i]: {0}", (++ptr)[0]); }
Console.ReadLine(); } }
릴리즈를 다운로드하여 설치를 마무리하면, Visual Studio 및 Visual Studio Express Edition의 프로젝트 참조 추가 대화 상자에서 다음과 같이 xPlatform 프로젝트에 대한 참조가 나타납니다. 현재 배포되고 있는 이들 항목들에 대한 설명을 드리면 다음과 같습니다.
xPlatform Core에는 형식화된 포인터, 메모리 버퍼, 문자열 버퍼, 비트 연산 관련 보조 루틴 등이 포함되어있으며, ModuleBase 클래스를 통하여 API 모음에 대한 서비스를 제공하게 될 것입니다. 별도의 예외 사항이 없는 한, API 묶음들은 xPlatform Core에서 제공하는 추상 클래스 ModuleBase 클래스를 상속받게 됩니다.
xPlatform kernel32 (x86)과 xPlatform msvcrt (x86)은 이번 릴리즈에서 공개하는 API 모음입니다. kernel32.dll과 msvcrt.dll에 대한 P/Invoke 호출들을 제공하므로 단지 이들 어셈블리를 프로젝트에 추가하고, 호출하기만 하면 됩니다.
아직 이 프로젝트가 가야 할 길이 멀고, 분명히 문제점이 있을 것입니다. 이러한 부분들을 피드백으로서 제 메일 (rkttu nospam rkttu dot com) 앞으로 보내주시거나, 가급적 http://blendxplatform.codeplex.com/ 에 접속하셔서 여기서 이용하실 수 있는 이슈 트래커에 올려주시면 최대한 반영할 수 있도록 하겠습니다.
더불어서, 프로젝트에 개발자, 코디네이터로 참여해주실 분이나, 후원해주실 분들도 언제든지 환영합니다. :-)
약 3개월만의 작업 기록 포스팅입니다. Core Runtime에 대한 테스트를 강화하고 코딩할 때 불편한 부분을 최소화하면서 실제 C 프로그래밍 언어와 비슷한 환경을 나타낼 수 있도록 만드는데에 많은 노력을 들였습니다.
Buffer, String 계열 클래스의 확장 및 개선
[Test] publicvoid memchrTest()
{ int ch = 'r';
GlobalHeapAnsiString str = new GlobalHeapAnsiString("lazy");
GlobalHeapAnsiString @string = new GlobalHeapAnsiString("The quick brown dog jumps over the lazy fox");
GlobalHeapAnsiString fmt1 = new GlobalHeapAnsiString(" 1 2 3 4 5");
GlobalHeapAnsiString fmt2 = new GlobalHeapAnsiString("12345678901234567890123456789012345678901234567890");
SBytePointer pdest; int result;
Console.Write("String to be searched:\n {0}\n", @string.ToString());
Console.Write(" {0}\n {1}\n\n", fmt1.ToString(), fmt2.ToString());
위의 코드에서 보시는것처럼 String Buffer 클래스에 직접 Add / Subtract 연산자 오버로드를 추가하여 실제 포인터 연산의 결과를 재현합니다. 형식화된 Pointer 클래스와 다른점이 있다면 자기 자신에 대한 주소 설정은 허용하지 않습니다. 이것은 비관리 메모리 영역의 주소가 변경됨으로 인하여 발생할 수 있는 할당 해지 실패로 인한 메모리 누수를 예방하기 위한 디자인입니다.
총 20여종의 주요 값 형식에 대한 형식화된 포인터 제공 (Typed Pointer)
형식화된 포인터에 세부적인 기능 조절을 더하고 제거하는 노력을 통하여 총 20여종의 주요 값 형식에 대한 형식화된 포인터를 제공하게 되었습니다. 이들 포인터 형식 모두는 외관상 CLS 표준 사양을 만족하도록 만들어졌으며 포인터 개념이 없는 프로그래밍 언어 (예: Visual Basic .NET, Visual J# 등)에서도 포인터 연산을 간접적으로 사용할 수 있게 디자인되어있습니다.
AutoCharPointer
BooleanPointer
BytePointer
DateTimePointer
DecimalPointer
DoublePointer
GuidPointer
Int16Pointer
Int32Pointer
Int64Pointer
IntPtrPointer
Pointer<T>
SBytePointer
SinglePointer
TimeSpanPointer
UInt16Pointer
UInt32Pointer
UInt64Pointer
UIntPtrPointer
WideCharPointer
사용 빈도가 높을 것으로 추정되거나 기본 형식들에 대한 형식화된 포인터는 모두 제공하고 있습니다. 하지만 특정한 목적으로 직접 추가한 구조체에 대한 지원도 필요했고 경우에 따라서는 제네릭에 대응되는 가변 포인터에 대한 구현을 필요로 하였기 때문에 Pointer<T> 형식을 새로 추가하였습니다. 전용 포인터를 이용하여 계산하는것보다는 연산 횟수가 많다는것이 단점입니다.
실제 메모리 구조의 크기를 조사해주는 unsafe sizeof() 연산자의 Managed 버전 제공
위의 테스트 코드에서 나열한 형식들에 대한 sizeof 연산자의 결과를 반환해주는것이 NativeSizeOf 메서드입니다. 그 외의 형식들에 대해서는 Marshal.SizeOf의 결과를 반환합니다.
NUnit 테스트 코드 프로젝트 시작
프로젝트에 대한 검증을 수행하기 위하여 NUnit 프로젝트를 생성하고 테스트하면서 조금씩 진척을 시켜나가고 있습니다. NUnit 테스트 코드의 내용은 실제 적용에 많은 도움이 되는 예제 코드로도 활용이 가능하니 한번 살펴보시길 권합니다.
향후 계획
조만간 공식 릴리즈를 0.1 버전으로 런칭할 계획을 세우고 있습니다. 그리고 준비가 되는대로 Windows CE, Windows Mobile에 관한 API도 수집하여 데이터베이스화를 수행할 예정이니 관심있으신 분들은 블로그나 데브피아 등을 통하여 연락주시면 언제든 채널이 열려있으니 함께 하실 수 있습니다.
Codeplex에서 Subversion 클라이언트가 지원된다는 사실을 뒤늦게 알게 되었습니다. Codeplex가 이제까지 제공해오던 소스 코드 관리 인터페이스들은 Visual Studio 환경에서는 상당히 유용한 것이었지만 리눅스나 다른 플랫폼에서 사용하기에는 까다로웠습니다. (물론 이러한 문제점을 보완하는 여러 솔루션을 제공해왔지만 지금 이야기하려는 Subversion에 비해서는 역시 어렵습니다.)
Codeplex Subversion 리포지터리는 HTTPS 프로토콜 (TCP 443번 포트) 기반으로 서비스됩니다. 그리고 내부적으로 IIS 7.0을 이용하는것 같네요. Subversion의 웹 버전은 WebDAV 기능과 호환될 수 있도록 설계되어있어서 적정한 수준으로 개발된 Bridge Adapter가 있다면 얼마든지 타 시스템과 연계할 수 있다는 장점을 잘 살린 사례인듯 합니다.
Subversion 서비스를 이용하기 위해서는 TortoiseSVN이나 WinSVN 같은 도구가 필요합니다. TortoiseSVN이 Windows 탐색기와 잘 연결되기 때문에 주로 이 클라이언트를 많이 권합니다. (http://www.tortoisesvn.net/ 에서 받으실 수 있으며, x86 버전과 amd64 버전이 제공됩니다.)
클라이언트 프로그램을 설치하신 다음에는 다음과 같이 형식에 맞추어서 주소를 입력하여 리포지터리 탐색을 시작할 수 있습니다.
https://[프로젝트 Alias 명칭].svn.codeplex.com/svn/
아래는 svnbridge, Singularity 프로젝트의 Subversion 리포지터리 주소입니다. :-)
Subversion을 통해서 소스 코드를 체크아웃하거나 익스포트하는 작업은 익명 사용자에게 개방되어있으며 언제든 최신 리비전을 받아보실 수 있습니다. 그리고 커밋하거나 변경하는 작업이 있을 때는 Codeplex ID와 비밀 번호, 그리고 해당 프로젝트의 멤버로 참여하고 있을 때 권한이 부여됩니다. 커밋한 내용은 프로젝트 홈페이지에도 그대로 기재되며, TFS 클라이언트, 웹 서비스, 서브 버전 모두가 동일하게 움직이므로 정확도가 떨어질 걱정은 하지 않으셔도 될 것 같습니다. :-)
참고 사항: 미러링이나 분배 기능이 구현되어있지 않다보니 현재는 외국 서버로 다녀와야 하기 때문에 속도가 많이 느린 편입니다. 이용에 참고하시면 좋을것 같습니다. 만약 Team Foundation Server를 Subversion 스타일로 이용하기를 희망하신다면 위에서 소개한 svnbridge 프로젝트를 참고하시기 바랍니다. (svnbridge의 IIS 바인딩 기능은 특히 유용할 것입니다. 홈페이지: http://www.codeplex.com/svnbridge)