최근들어 Windows Azure 보안 가이드라인 (http://download.microsoft.com/download/7/3/E/73E4EE93-559F-4D0F-A6FC-7FEC5F1542D1/SecurityBestPracticesWindowsAzureApps.docx)에 소개된 내용을 읽던 중 Windows Azure 서비스에 CNAME 레코드를 이용하여 DNS를 확장하는 방안을 개발 중인 Imagine Cup 솔루션에 적용해보았습니다. 이 방법을 적용한 이후에 클라우드 기반 서비스에 접근하는 것이 훨씬 속도도 빨라지고, 간혹 발생하는 연결 거부 현상도 완전히 제거되었습니다.

기본적으로 cloudapp.net이나 windows.net과 같이 대외적으로 노출되어있는 도메인을 이용하여 Azure Service를 이용하게 되는 경우, 최근 들어서는 DDoS를 방지하기 위한 목적으로 연결을 감시하고, 필요한 경우 연결을 직접 차단하는 정책을 사용하는 것 같습니다. 이 때문에 처음 배포한 클라우드 기반 응용프로그램에서 기대할만한 성능을 경험하지 못하는 경우가 자주 나타나는 것 같습니다. 이와 관련하여, 클라우드 서비스 대 클라우드 서비스로 연결하는 시나리오 (제가 개발중인 Imagine Cup 솔루션의 경우 Tropo와 Windows Azure 사이의 연결이 해당됩니다.)에서 속도 저하나 소켓 수준의 연결 실패가 자주 있었습니다.

기존에 할당받은 도메인에 CNAME 레코드를 할당하는 방법을 적용하기 위해서는, 직접 운영하는 DNS 서버가 필요합니다. 하지만 별도의 DNS 서버를 구축하지 않고도 손쉽게 이러한 문제를 해결할 수 있는 방안을 이번 아티클을 통하여 조명해 볼까 합니다. 소개하고자 하는 서비스는 이미 많은 분들께서 개인 도메인 위에 홈페이지나 메일 서비스 등을 운영하기 위하여 적용하셨을 DNSEVER 서비스입니다. DNSEVER 서비스를 통하여 자신이 소유한 도메인을 연결하거나 DNSEVER가 미리 확보한 무료 도메인을 할당받는 방법으로 정규 DNS 레코드를 확보할 수 있습니다.

* NOTE: 아래의 스크린 샷과 메뉴 구성은 2010년 7월 현재 기준이며 예고없이 서비스의 내용과 사이트 레이아웃에 변동이 발생할 수 있음을 알립니다.

1. 회원 가입하고, 관리할 도메인을 등록한 후, 메인 페이지에서 도메인 목록에 자신이 관리할 도메인 목록을 확인하고 해당되는 도메인을 클릭합니다.

2. 사이트의 왼쪽 메뉴에 나타나는 항목들 중, 도메인 별명 (CNAME) 관리를 클릭합니다.

3. 이어서 나타나는 페이지의 하단에 있는 추가 기능에서, 원하는 도메인 별칭을 입력하거나, 도메인 별칭 란을 비워 기본 도메인을 선택할 수 있습니다. 그리고 목적지 도메인에는 여러분이 원하는 Production Stage의 클라우드 도메인을 기재합니다. (예: ????.cloudapp.net) 설정이 끝나면 별명 (CNAME) 추가 버튼을 클릭합니다.

4. DNS 레코드 전파 시간을 감안하여 최장 12시간 이내에 해당 도메인으로 접속이 원활하게 이루어지는지 테스트해봅니다.

다음번 강좌에서는 BLOB Storage, Queue Storage, Table Storage에 대한 Custom Domain을 연결하는 방법을 소개하겠습니다. 감사합니다. :-)

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

ASP.NET AJAX와 더불어서 ASP.NET MVC를 비롯하여 거의 모든 웹 사이트와 웹 개발 프레임워크들이 채택하는 jQuery에 대한 세미나가 오는 2010년 7월 10일에 열립니다. 이번 세미나에서는 jQuery에 대한 고급 기법을 다루고, jQuery를 어떤 방법으로 확장할 수 있는지에 대한 다양한 테크닉을 "실전! jQuery CookBook"의 역자 분들께서 꼼꼼히 짚어주실 것입니다. 많은 참여 부탁드립니다. :-)

주의 사항: 세미나 참석 등록을 아래의 주소에서 제공하는 댓글 달기 기능을 이용하여 등록해 주십시오. 아래는 세미나 소개 글을 발췌해 온 것입니다.

세미나 등록하러 가기: http://taeyo.net/Forum/Content.aspx?TBL=NOTICE&SEQ=383&PGN=1

7월 10일 기다리던 jQuery 세미나가 시작됩니다.
실전! jQuery CookBook의 역자들이 모두 모여서 jQuery 고급기법에 관한 세미나를 진행합니다.
경품으로 신간 "실전! jQuery CookBook"도 드리니 많이 참석하셔서 즐겨주세요.

이번 세미나는 닷넷 개발자이던, 자바 개발자이던 무관하게 누구나 참석이 가능합니다.
현장등록도 가능하지만, 사전 준비를 위해서 반드시 리플로 참석 등록을 해주시기 바랍니다.
미리 참석등록을 한 분에 한해서 경품 추첨에 참여하실 수 있습니다.
(난 좀 샤이한 사람이다 하시는 분은 등록없이 그냥 오셔도 됩니다만, 그 경우 경품추첨에서 배제됩니다)

장소 : 한국 마이크로소프트 세미나실(선릉 포스코빌딩 서관 5층)
일시 : 2010년 7월 10일 토요일 오후 1시 (접수는 1시, 시작은 2시)


등록방법 : http://taeyo.net/Forum/Content.aspx?TBL=NOTICE&SEQ=383&PGN=1 에 리플로 참석여부와 이름, 개발분야를 남겨주시면 됩니다.

세션1 : jQuery의 Event 다루기

  • 시간 : 2:00 - 3:00
  • 발표자 : 김경균
  • 내용 :
    jQuery가 지원하는 이벤트에 대한 효과적인 사용방법과 고급 이벤트 기법에 대해서 다룹니다.
    이미 jQuery가 제공하고 있는 이벤트를 사용하는 방법 뿐만 아니라,
    자체적인 이벤트를 작성 및 사용하는 방법 및 이벤트 통지를 받는 방법에 대해서까지 심도 있게 이야기합니다.

세션2 : jQuery와 QUnit을 이용한 단위 테스트

  • 시간 : 3:15 - 4:15
  • 발표자 : 최지훈
  • 내용 :
    jQuery로 작성한 코드에 대해 단위 테스트하는 방법을 소개합니다.
    Qunit 프레임워크를 사용하여 결과를 어설션하고, 동기/비동기 콜백을 테스트하는 방법을 설명합니다.
    또한, 다양한 테스트를 그룹으로 묶어서 처리하는 방법에 대해서도 다룹니다.

세션3 : jQuery 확장 플러그인 만들기

  • 시간 : 4:30 - 5:30
  • 발표자 : 김태영
  • 내용 : jQuery를 확장하기 위한 방법들을 설명하고 그를 기반으로 플러그인을 제작해 봅니다.
    기본적인 플러그인 개발 규칙에 대해 다룬 후, 좀 더 완성된 형태의 플러그인 제작을 위해 필요한
    Option Hash 기법 및 $.extend()을 이용한 매개변수 초기화 방법 그리고 클로저 기법을 설명합니다.
    그리고, 그들을 모두 혼합하여 보편적인 형태의 플러그인을 직접 제작하고 활용하는 방법에 대해 이야기합니다.

경품 : BJ퍼블릭 협찬 - 실전! jQuery CookBook 5권
- 원하시면 역자들이 사인을 해드립니다.

* 세션 주제는 좀 더 나은 세미나를 위해 통지없이 변경될 수 있습니다.

tweet : @taeyo

세미나 등록하러 가기: http://taeyo.net/Forum/Content.aspx?TBL=NOTICE&SEQ=383&PGN=1

저작자 표시 비영리 동일 조건 변경 허락
이 장소를 Daum지도에서 확인해보세요.
서울특별시 강남구 대치4동 | 포스코센터
도움말 Daum 지도
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

오늘은 .NET Framework 4 에서 가장 많은 충돌을 야기할 수 있는 변동 사항 중 하나를 오늘 아티클에서 잠시 다루어보기로 하겠습니다. 바로 ISerializable 인터페이스에 관한 것인데요, Serializable Attribute와 NonSerialized Attribute를 이용하여 제어하는 것 만으로는 불충분한 경우 즐겨 사용해오던 인터페이스입니다. 그렇지만 여기에 급격한 변화 (Breaking Changes)가 .NET Framework 4에 더해지게 되었는데, Partial Trust Mode로 실행되는 어셈블리에서 이 인터페이스를 구현하는 로직을 호출하게 되는 경우, ISerializable 인터페이스의 GetObjectData에 추가된 SecurityCritical Attribute에 의해 호출이 거부됩니다.

저 개인적으로는 XML-RPC의 .NET Framework 버전의 Implementation 라이브러리 (http://www.xml-rpc.net/)를 .NET Framework 4로 업그레이드하여 Windows Azure에 Deploy하면서 이러한 현상을 겪었는데, 이 라이브러리에서 제공하는 Custom Exception 클래스 상의 GetObjectData 메서드가 문제의 원인이 되었습니다. .NET Framework 4 환경에서 사용하도록 별도의 프로젝트 파일을 만들어서 Predefine Condition을 부여하여 ISerializable 인터페이스를 이용하지 않도록 코드를 수정한 이후에는 문제가 잘 해결되었습니다.

만약 ISerializable 인터페이스의 기능을 그대로 가져갈 필요가 있다면, http://msdn.microsoft.com/en-us/library/system.runtime.serialization.isafeserializationdata.aspx 의 내용을 참고하시어 ISafeSerializationData 인터페이스를 구현하는 별도의 코드를 작성해야 합니다. 아래는 MSDN Library에서 발췌한 샘플 코드입니다.


using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;
using System.Security;

// [assembly: SecurityCritical(SecurityCriticalScope.Everything)]
// Using the SecurityCriticalAttribute prohibits usage of the
// ISafeSerializationData interface.
[assembly: AllowPartiallyTrustedCallers]
namespace ISafeSerializationDataExample
{
    class Test
    {
        public static void Main()
        {
            try
            {
                // This code forces a division by 0 and catches the
                // resulting exception.
                try
                {
                    int zero = 0;
                    int ecks = 1 / zero;
                }
                catch (Exception ex)
                {
                    // Create a new exception to throw.
                    NewException newExcept = new NewException("Divided by", 0);

                    // This FileStream is used for the serialization.
                    FileStream fs =
                        new FileStream("NewException.dat",
                            FileMode.Create);

                    try
                    {
                        // Serialize the exception.
                        BinaryFormatter formatter = new BinaryFormatter();
                        formatter.Serialize(fs, newExcept);

                        // Rewind the stream and deserialize the exception.
                        fs.Position = 0;
                        NewException deserExcept =
                            (NewException)formatter.Deserialize(fs);
                        Console.WriteLine(
                        "Forced a division by 0, caught the resulting exception, \n" +
                        "and created a derived exception with custom data. \n" +
                        "Serialized the exception and deserialized it:\n");
                        Console.WriteLine("StringData: {0}", deserExcept.StringData);
                        Console.WriteLine("intData:   {0}", deserExcept.IntData);
                    }
                    catch (SerializationException se)
                    {
                        Console.WriteLine("Failed to serialize: {0}",
                            se.ToString());
                    }
                    finally
                    {
                        fs.Close();
                        Console.ReadLine();
                    }
                }
            }
            catch (NewException ex)
            {
                Console.WriteLine("StringData: {0}", ex.StringData);
                Console.WriteLine("IntData:   {0}", ex.IntData);
            }
        }
    }

    [Serializable]
    public class NewException : Exception
    {
        // Because we don't want the exception state to be serialized normally,
        // we take care of that in the constructor.
        [NonSerialized]
        private NewExceptionState m_state = new NewExceptionState();

        public NewException(string stringData, int intData)
        {
            // Instance data is stored directly in the exception state object.
            m_state.StringData = stringData;
            m_state.IntData = intData;

            // In response to SerializeObjectState, we need to provide
            // any state to serialize with the exception.  In this
            // case, since our state is already stored in an
            // ISafeSerializationData implementation, we can
            // just provide that.

            SerializeObjectState += delegate(object exception,
                SafeSerializationEventArgs eventArgs)
            {
                eventArgs.AddSerializedState(m_state);
            };
            // An alternate implementation would be to store the state
            // as local member variables, and in response to this
            // method create a new instance of an ISafeSerializationData
            // object and populate it with the local state here before
            // passing it through to AddSerializedState.       

        }
        // There is no need to supply a deserialization constructor
        // (with SerializationInfo and StreamingContext parameters),
        // and no need to supply a GetObjectData implementation.


        // Data access is through the state object (m_State).
        public string StringData
        {
            get { return m_state.StringData; }
        }

        public int IntData
        {
            get { return m_state.IntData; }
        }

        // Implement the ISafeSerializationData interface
        // to contain custom  exception data in a partially trusted
       // assembly. Use this interface to replace the
       // Exception.GetObjectData method,
        // which is now marked with the SecurityCriticalAttribute.
        [Serializable]
        private struct NewExceptionState : ISafeSerializationData
        {
            private string m_stringData;
            private int m_intData;

            public string StringData
            {
                get { return m_stringData; }
                set { m_stringData = value; }
            }

            public int IntData
            {
                get { return m_intData; }
                set { m_intData = value; }
            }

            // This method is called when deserialization of the
            // exception is complete.
            void ISafeSerializationData.CompleteDeserialization
                (object obj)
            {
                // Since the exception simply contains an instance of
                // the exception state object, we can repopulate it
                // here by just setting its instance field to be equal
                // to this deserialized state instance.
                NewException exception = obj as NewException;
                exception.m_state = this;
            }
        }
    }
}

또는, 코드의 수정을 최소화하기 위하여 설정 파일 (app.config이나 web.config)에 LegacyCASMode Property를 사용하도록 설정을 구성할 수 있습니다. 이에 대한 내용은 http://msdn.microsoft.com/ko-kr/library/tkscy493.aspx 의 내용을 참고하시면 됩니다. 아래는 MSDN Library에서 발췌한 사용 예시입니다.

<location allowOverride="false">
  <system.web>
    <securityPolicy>
      <trustLevel name="Full" policyFile="internal" />
      <trustLevel name="High" policyFile="web_hightrust.config" />
      <trustLevel name="Medium" policyFile="web_mediumtrust.config" />
      <trustLevel name="Low"  policyFile="web_lowtrust.config" />
      <trustLevel name="Minimal" policyFile="web_minimaltrust.config"/>
    </securityPolicy>
  </system.web>
</location>

<location allowOverride="false">
  <system.web>
    <trust level="Medium" originUrl="" />
  </system.web>
</location>

<location allowOverride="true" path="Default Web Site/Temp">
  <system.web>
    <trust level="Medium" originUrl="" />
  </system.web>
</location>

 

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

최근 발표된 Windows Azure SDK 1.2에 추가된 Visual Studio 2010을 위한 IntelliTrace 기능은 여러모로 Windows Azure의 개발 과정과 시행 착오를 최소화할 수 있는 효과적인 도구입니다. 그렇지만 이 기능을 적용하기 위해서 필요한 요구 사양이 있는데 다음과 같습니다.

  • IntelliTrace는 Visual Studio 2010 Ultimate 이상의 버전에서만 사용이 가능합니다. (이 점이 IntelliTrace에 관해서 가장 많이 놓치게 되는 부분일것 같습니다.)
  • Visual Studio Tools for Windows Azure 1.2 버전에서만 가능합니다.
  • 64비트 버전의 OS에서만 사용이 가능합니다. (이 부분에 대한 설명이 충분하지 않았기 때문에 많은 착오가 있을 수 있습니다.)
  • IntelliTrace로 추적할 대상 Web Role - 또는 - Worker Role은 반드시 .NET Framework 4.0 기반으로 컴파일되어야 합니다.

Visual Studio 2010 Ultimate 버전을 설치하고, 최신 버전의 SDK와 Visual Studio Tools를 설치했음에도 불구하고 배포 시에 IntelliTrace 옵션이 활성화되지 않았던 경우에는 32비트 버전의 OS를 사용하고 있기 때문입니다. 이러한 경우, 아래의 Hotfix를 설치하여 문제를 해결하실 수 있습니다.

http://go.microsoft.com/fwlink/?LinkId=191542

다운로드 바로가기: http://code.msdn.microsoft.com/KB983301/Release/ProjectReleases.aspx?ReleaseId=4351

자료 출처: http://msdn.microsoft.com/en-us/library/ff683671.aspx

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

안녕하세요. Visual C# MVP 남정현입니다. 오랫만에 들려오는 Windows Azure Platform의 업데이트 소식을 전하기 위하여 블로그 포스팅을 해봅니다. 요즈음 월드컵 때문에 전국이 후끈 달아올라있네요.

기존에는 SQL Azure에서 추가할 수 있는 데이터베이스가 1GB, 10GB 단위로 제공되었습니다만 SQL Azure에 대한 수요가 지속적으로 증가하면서 1GB 데이터베이스는 5GB 데이터베이스 단위로, 10GB 데이터베이스는 50GB 데이터베이스 단위로 상품이 확대됩니다. 기존과 동일한 방식으로 과금되지만 추가되는 용량만큼 더 많은 금액이 과금된다는 점만 유의하시면 될 것 같습니다.

그리고 8월 1일부터는 SQL Azure Development Accelerator Core 프로모션 상품이 추가됩니다. SQL Azure Business Edition 상품을 기반으로 하지만, 이 프로모션 상품을 통하여 서비스를 이용할 경우 매달 10GB당 74.95$가 과금되며 일반 요금제보다 25% 저렴합니다. 이에 대한 자세한 내용은 http://www.microsoft.com/windowsazure/offers/popup.aspx?lang=en&locale=en-US&offer=MS-AZR-0013P 에서 참고하실 수 있습니다.

날씨가 점점 더워지고 있습니다. 뜨거운 월드컵 열기를 바탕으로 우리 대한민국 축구팀이 16강에 진출할 수 있었으면 좋겠습니다. 그리고 저희 이매진컵 소프트웨어 설계 부문 한국 대표팀 WeRain에게도 많은 관심과 응원 부탁드립니다. 감사합니다. :-)

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

Phone'N Use database enables NGOs and governments to find and register unregistered children who are living in poor remote areas. Mobile Registration Units operated by NGOs can use Phone'N Use application to register anyone. There are approximately 23 million children who are not registered in in South Asia and 20 million in Africa who are vulnerable to exploitation and abuse.

Please vote us: http://www.msstudentlounge.com/studentrally/tabid/81/Default.aspx - Team WeRain, Korea

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

'남정현' 카테고리의 다른 글

Welcome to WeRain Phone'N Use Information Page  (0) 2010/06/14
Posted by Windows Azure MVP 남정현 (rkttu.com)

많은 Windows Azure Application 개발자들의 피드백을 수용한 최신 버전의 Windows Azure Tools for Visual Studio와 Windows Azure SDK가 새롭게 출시되었습니다. 이제 비로소 Visual Studio 2010의 모든 기능을 Windows Azure 개발에도 직접 활용할 수 있게 되었습니다.

Windows Azure SDK 1.2에서는 최근 발표된 .NET Framework 4.0 런타임을 내장한 Windows Azure OS 2010년 4월 버전에 대한 요구 사항을 모두 반영하고 있습니다. .NET Framework 4.0 기반의 응용프로그램을 작성 중이신 분들도 이제는 Windows Azure 환경 위에서 직접 응용프로그램을 호스팅할 수 있습니다. 그리고, Visual Studio 2010에서 새로 추가된 향상된 디버깅 기법인 IntelliTrace를 직접 지원하기 때문에 이전보다 더욱 쉬운 디버깅이 가능합니다.

다음은 Windows Azure Tools for Visual Studio 1.2의 변경 사항들입니다.

  • Visual Studio 2010 RTM 지원: Visual Studio 2010 RTM 버전을 지원합니다.
  • .NET Framework 4.0 지원: 이제는 .NET Framework 3.5와 4.0을 빌드 타겟으로 동시에 지정할 수 있습니다. 단, 4.0을 빌드 타겟으로 지정하게 되는 경우, Windows Azure OS의 이미지 중 2010년 초반의 일부 버전은 사용할 수 없습니다.
  • Cloud storage explorer 추가: 읽기 전용 기능이 지원되는 Windows Azure Table 및 BLOB 컨테이너 보기 프로그램이 서버 탐색기 패널을 통하여 제공됩니다. SQL Azure를 데이터베이스 목록에 추가하고 동시에 관리할 수 있어 편리합니다.
  • 통합 배포 환경: 솔루션 탐색기에서 Windows Azure 프로젝트를 오른쪽 버튼으로 클릭하여 'Publish' 메뉴를 클릭하면 이제는 직접 배포가 가능합니다. 이전 1.0 및 1.1 버전의 경우, CSPKG 파일과 CSCFG 파일이 생성된 디렉터리의 폴더가 Windows 탐색기에서 열리고, Windows Azure Portal Web Site가 웹 브라우저로 열렸기 때문에, 브라우저에서 로그인하고 여러 단계에 걸쳐서 배포할 파일을 찾아가야했기 때문에 Deploy 절차가 복잡했습니다.
  • 서비스 모니터링: 서비스의 상태를 웹 제어판이 아닌 "서버 탐색기"의 compute 노드에서 실시간으로 모니터링할 수 있습니다.
  • IntelliTrace 기능 지원: Visual Studio 2010을 사용하는 경우, IntelliTrace 기능을 Windows Azure 서비스에 배포한 이후에 "직접" 사용할 수 있습니다. 이 기능은 앞에서 설명한 통합 배포 환경의 일부로 동작하며, 배포가 끝난 이후에 자동으로 이 기능이 시작되어 서비스 모니터링과 함께 실시간으로 로그가 모니터링됩니다.

그간 Windows Azure 기반의 개발이 어려우셨다면 이제는 최신 버전의 SDK와 개발 도구를 이용하여 좀 더 편안하게 Visual Studio 2010을 통해 클라우드 기반 응용프로그램 개발을 시작해보세요. 참고로 Visual Studio 2010의 데이터베이스 탐색기는 SQL Azure 데이터베이스에 대한 탐색도 지원하므로 이전처럼 별도의 SSMSE를 필요로 하지 않습니다. 그리고 이번 버전의 SDK 역시 1.0과 1.1과 마찬 가지로 처음 설치하는 경우에는 OS와 개발 도구의 환경에 따라 패치와 핫 픽스들을 적용하셔야 합니다.

다운로드 바로가기

 

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

2005년 이후로 줄곧 Microsoft를 깊이있게 심층취재하는 기자들 사이에서 Microsoft의 차세대 운영 체제에 대한 이야기가 자주 회자되고 있습니다. 그 중 가장 많은 화제거리를 제공하는 소재는 단연 MIDORI 였습니다. 클라우드 컴퓨팅 기술과도 엮이면서 한층 더 궁금증을 증폭시키기도 했었지요. 그러나, 오늘 글에서는 MIDORI에 대한 이야기는 잠시 뒤로 미루고, 지금 볼 수 있는, 한창 개발 중인 운영 체제 두 종류를 대신 이야기해보기로 하겠습니다. Singularity는 현재 Codeplex에 게시되어있는 RDK를 실행하고 분석해본 후 제 나름대로 경험해본 특이한 사항들을 요약해서 적어놓은 것입니다.

Singularity는 2008년경에 Microsoft Research (이하 MSR)에서 Research Development Kit (이하 RDK)의 형태로 Codeplex 홈페이지에 올렸습니다. Singularity는 하드 디스크의 MBR 영역에 설치되는 작은 크기의 부트 로더 프로그램을 제외하고 모든 것이 관리 영역 안에 속하는 독특한 운영 체제입니다. 컴퓨터 과학에서 표현하는 3단계 Ring Protection Layer로 말할 것 같으면, 가장 핵심 부분인 Ring 0부터 가장 외부적인 부분인 Ring 3까지 전부 가비지 컬렉터와 관리되는 런타임 아래에서 관리되는 셈입니다.

Singularity RDK에는 OS의 소스 코드 외에도, Singularity에서 사용할 수 있는 응용프로그램을 제작할 수 있는 Bartok 컴파일러와 Singularity OS에 최적화된 CLR/CLI 라이브러리가 포함되어있습니다. Singularity 기반으로 실행되는 응용프로그램을 만들기 원한다면, C# 1.0의 문법을 기초로 하는 Spec#을 확장한 Singularity의 시스템 프로그래밍 언어인 Sing#을 사용할 수 있으며, Sing#으로 작성된 소스 코드를 Bartok 컴파일러로 컴파일하면 해당 프로세서 아키텍처에 맞는 직접적인 응용프로그램 코드가 생성되는 형태입니다. C/C++ 컴파일러와 다른점이 있다면, Bartok 컴파일러가 생성하는 코드에는 D 언어와 마찬가지로, 그러나 Java나 우리가 기존에 알고 있던 .NET Framework와는 달리, 자체적인 가비지 컬렉터를 내장하고 있다는 점입니다.

Sing# 언어의 경우는, 모든 경우를 다 살펴볼 수 없지만, Rotor Framework를 통해서 실체가 밝혀진 C#의 hidden keyword 중 하나인 __arglist와 같이 ECMA 규격 상에 포함되지 않은 특수 키워드들이 다수 포함되어있습니다. __arglist는 C/C++의 varargs와 대응되는 의미로 사용되었지만, Singularity 환경 아래에서는 관리 형식의 배열보다 좀 더 최적화된 (어떤 의미에서는 불안정한) 배열 타입을 제공하기 위한 것으로 보입니다.

Singularity는 연구 목적으로 활용되는 것 이상으로는 이용할 수 없는 라이선스 제약이 있습니다. 상용으로 채택할 경우 라이선스 위반이 됨을 유의해야 합니다. 이러한 제약 사항 아래에서, 자유롭게 소스 코드를 살펴보고, ISO 이미지를 다운로드받아서 VMware나 Windows Virtual PC에서 부팅시켜보시려면, http://singularity.codeplex.com/ 페이지에 제공된 소스 코드나 ISO 이미지를 다운로드받으시면 되겠습니다. :-)

그리고 오늘 아티클에서는 Singularity 외에 MSR과 관련되어있는 또 다른 연구형 운영 체제 한 종류를 더 짚어보기로 하겠습니다. 바로 Barrelfish입니다. Barrelfish는 캠브릿지 MSR과 스위스 취리히의 취리히 연방 공과대학교 산하 Systems가 공동으로 2007년 10월부터 진행 중인 오픈 소스 프로젝트이며, 변형된 BSD 라이선스인 3-clause-BSD 라이선스를 제시합니다. 기본 BSD 라이선스와는 달리, 소스 코드 / 바이너리와 관계없이 원저자의 이름을 명시해야 하고, 원저자의 이름을 Barrelfish 기반의 소프트웨어에 관하여 사용할 수 없다는 제약이 붙습니다.

Barrelfish OS는 C 언어와 어셈블리를 주로 사용하며, 현재 스냅샷 기준으로 x64 (AMD64) 모드를 대상으로 하며, 멀티 코어 프로세서에 최적화된 OS를 만드는 것에 관한 다양한 기술적 이론이 집약된 고성능 운영체제이지만, 리눅스나 윈도우와는 전혀 별개의 브랜치를 가집니다. 어떤 형태로 발전하게 될지는 알 수 없지만, 향후 출시될 Windows Server Family에도 영향을 줄 수 있는 부분처럼 보입니다. 그리고 Barrelfish 자체로도 연구 목적에 맞는 고성능 서버OS로 업그레이드할 계획이 있다는 것이 프로젝트 설명 페이지에 제시된 내용입니다.

Barrelfish의 홈페이지 (http://www.barrelfish.org)는 Barrelfish OS를 기반으로 운영되는 웹 서버에서 서비스 중이라는 특징적인 문구가 홈페이지 하단의 footer에 붙어있습니다. Public Domain에서 서비스할 수 있을만큼 OS가 고성능이고 안정적이라는 뜻으로 받아들여도 될 것입니다.

Barrelfish의 소스 코드를 구경하고 싶으시다면, http://www.barrelfish.org/barrelfish-20091219.tar.bz2 에서 다운로드하실 수도 있습니다.

앞으로 어떤 형태로 새로운 운영 체제들이 나타날지 아직은 아무도 알 수 없습니다만, 미래를 조심스럽게 예측해 보는 것은 참 의미있는 일이라고 생각합니다. 짧은 글이었지만, 클라우드 컴퓨팅, 그리드 컴퓨팅, 멀티코어 컴퓨팅 등 새로운 컴퓨팅 패러다임에 걸맞는 새 시대의 운영 체제를 미리 탐험해 보았습니다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

최근에 Windows Azure의 Hosting Service Control Web Page에 유용한 기능이 하나 추가되었습니다. 이전에는 Deploy하는 Windows Azure Package의 설정 파일에 직접 기술해야 했던 Windows Azure OS 버전을 배포하기 직전이나 배포한 이후에 손쉽게 변경할 수 있는 기능이 추가되었습니다. 아래는 해당 기능에 대한 스크린샷입니다. :-)

위의 그림에서, "OS Settings..." 버튼을 클릭하면, 현재 배포된 응용프로그램에서 사용할 OS의 종류를 선택할 수 있는 옵션 페이지가 아래 그림과 같이 따로 나타납니다. 현재 사용중인 OS의 정보는 그림에서 보시는 것처럼 Windows Azure Guest OS 1.3 (Release 201004-01)로 나타나고 있습니다.

기본적으로, 모든 Role이 항상 최신의 버전을 택할 수 있도록 Automatic Upgrade Mode를 사용하는 것이 좋습니다. 그러나, 특정 Windows Azure OS에서 테스트가 필요한 경우이거나 진단을 해야 할 필요가 있을 때에는 Manual Upgrade Mode를 사용하여 직접 원하는 OS 버전을 선택할 수도 있습니다. 이에 대한 설명은 http://msdn.microsoft.com/en-us/library/ff729420.aspx 에서 자세히 제공하고 있습니다.

OS 업그레이드는 위와 같이 포털 사이트에서 진행할 수도 있고, 작업 시간을 단축하기 위하여 프로젝트와 함께 생성되는 설정 파일 상에서도 미리 구성할 수 있습니다. 앞으로 Windows Azure OS는 최신 보안 패치들과 사용 빈도나 요청이 많은 닷넷 어셈블리들을 포함하여 매달 정기적으로 업데이트가 이루어질 예정이라고 합니다. 웹 포털에 자주 방문하셔서 최신 OS로 업그레이드하는 작업도 꾸준히 하시는 것이 Windows Azure 기반의 서비스를 최상의 상태로 유지하는데에 도움이 되실 것입니다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

최근 Microsoft 제품군이 새롭게 발표되면서, IIS 6.0과 같이 오래된 웹 서버에는 등록되지 않은 새로운 유형의 MIME Type으로 인해서 호환성에 문제가 발생하는 경우가 자주 있습니다. 특히 IIS 6.0의 경우는 의도된 동작 (By Design)임을 설명하는 기술 문서 (http://support.microsoft.com/kb/326965/ko)로 이에 대한 해명을 하기도 하였습니다.

IIS 6.0 뿐만 아니라, 최근에는 실버라이트 컨텐츠를 개인 웹 호스팅 계정에 올려서 테스트하시는 분들도 많이 계신데요, 단순히 실버라이트 컨텐츠를 재생하기 위함이라면 필요가 없겠지만, 실버라이트 컨텐츠와 상호작용하는 기능을 구현할 때에는 반드시 MIME 설정이 웹 서버에 올바르게 구현되어있어야 합니다.

아래는 Microsoft가 근래에 들어서 발표한 최신 기술에서 사용하는 파일 형식들의 MIME Type 목록들을 정리한 것입니다. 아래의 목록을 참조하여 IIS 6.0이나 Apache 등의 웹 서버에서 설정을 변경할 수 있습니다.

MIME 확장명

파일 확장명 

 application/x-silverlight-app  .xap
 application/manifest  .manifest 
 application/x-ms-application  .application 
 application/x-ms-xbap  .xbap
 application/octet-stream  .deploy
 application/vnd.ms-xpsdocument  .xps 
 application/xaml+xml  .xaml
 application/vnd.ms-cab-compressed  .cab
 application/vnd.openxmlformats-officedocument.wordprocessingml.document  .docx
 application/vnd.openxmlformats-officedocument.wordprocessingml.document  .docm
 application/vnd.openxmlformats-officedocument.presentationml.presentation  .pptx
 application/vnd.openxmlformats-officedocument.presentationml.presentation  .pptm
 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet  .xlsx
 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet  .xlsm
 application/msaccess  .accdb
 application/x-mspublisher  .pub
 image/svg+xml  .svg
 application/xhtml+xml  .xht
 application/xhtml+xml  .xhtml

아래는 Apache 기반의 웹 호스팅에서 서버의 설정을 변경하지 않고 손쉽게 MIME 형식을 추가할 수 있는 .htaccess 파일입니다. 다른 .htaccess 파일이 있을 경우 적당한 위치에 파일을 병합하시고, 다른 응용프로그램을 사용하지 않고 있는 경우 이 파일을 그대로 업로드하면 곧바로 반영됩니다.

IIS 7.x (Windows Vista 및 Server 2008 이상)에서는 위의 형식들 중 상당수가 이미 기본으로 등록되어있으므로 IIS 7.x 이상의 웹 응용프로그램 서버를 사용하고 있을 경우에는 문제가 되지 않습니다. 자체적인 웹 서버를 구현하고 있을 경우 (예를 들어 WCF나 .NET Framework based HTTP Listener 같은 경우) MIME Type에 대해서 올바른 처리가 추가 구현되어있어야 합니다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)