[Internet Explorer에 대한 내용을 정정하였습니다.]

이전부터 포터블 응용프로그램을 만들기 위한 시도는 많이 있었고 최근들어서는 이러한 시도들이 가상화 기술의 한 장르로 발전하게 되었습니다. 대표적으로 Thinstall이 과거에 있었는데 이 솔루션은 VMware ThinApp으로 재탄생했지요. 그리고 Microsoft 역시 App-V 기술을 제공하고 있습니다. 그런데 오늘은 이러한 응용프로그램 가상화 솔루션에 클라우드 기술, 그리고 적절한 사용자 인터페이스까지 결합한 해외 서비스 하나를 소개해볼까 합니다. 바로 roozz입니다.


roozz는 Firefox와 Google Chrome 브라우저에서 사용할 수 있는 전용 플러그인을 다운로드받아 설치하고, Application Feed 페이지를 방문하기만 하면, Application이 Windows 기반이었든, Linux 기반이었든 관계없이, 거기에 roozz 플러그인을 설치하고 실행하는 컴퓨터 역시 Windows이든 Linux이든 관계없이 가상화된 소프트웨어가 별도의 격리된 공간 안에서 실행됩니다. 뿐만 아니라, 응용프로그램 가상화를 기반으로 하기 때문에 3D 게임까지 지원됩니다.

제가 평소에 애용하는 개발 도구 중 하나인 LINQpad 역시 roozz에서 호스팅되는 응용프로그램 중 하나입니다. 시험 삼아서, roozz에서 호스팅되는 LINQpad를 직접 실행해보았습니다. 그리고 편의를 위하여, Google Chrome의 웹 어플리케이션 생성 기능을 LINQpad roozz feed page에 대해 적용하여 실행해보았습니다. 그 결과 아래와 같이, 마치 Native application과 같은 UI가 구현되는 것을 볼 수 있습니다.


.NET Framework를 사용하는 응용프로그램임에도, LINQ expression을 잘 실행하고 있는 것이 보입니다. .NET Framework 기반의 응용프로그램을 이와 같이 가상화를 통하여 원활하게 사용할 수 있다는 것은 Windows 개발자에게도 굉장한 메리트가 아닐 수 없습니다. 그런데 여기서 한 가지 궁금한 점이 생깁니다. 지금 이렇게 보는 화면이 원격지 서버의 화면을 기반으로 하는 것은 아닐까 하는 것이지요. 시험삼아서 파일 저장과 로드 기능을 테스트해보았습니다.


터미널 서비스나 Citrix Xen과 같은 VDI나 Remote Session 서비스와는 달리, 로컬 컴퓨터에 직접 저장하는 대화 상자가 나타납니다. 그리고 한 가지 더 확실한 증거가 있는데, 작업 관리자의 메모리 사용량을 보면 알 수 있습니다.


커서를 가져다 놓은 부분에서 알 수 있듯이, LINQpad 자체는 원격지가 아닌 현재 컴퓨터의 메모리를 사용하고 있습니다. 단, 응용프로그램 가상화를 기반으로 하므로 .NET Framework를 메모리에 올려서 사용하기 때문에 다소 메모리 사용량이 많은 것이 보입니다. 하지만, 메모리 사용량과는 별개로 이러한 수준의 기능을 제공할 수 있는 서비스라고 한다면 상당히 괜찮지 않을까 생각합니다.

roozz에 이와 같이 소프트웨어를 게시할 수 있는 방법은, 소스 코드가 아닌, 컴파일된 - 혹은 - 패키징된 소프트웨어 사본을 roozz에 전송하는 것입니다. 이렇게 전송된 사본은 roozz Conversion Tool에 의하여 재배포 가능한 형태로 구성되며 이것을 사용자가 받아볼 수 있는 형태로 게시됩니다. 좀 더 자세한 내용은 http://www.roozz.com/node/3 에서 확인할 수 있습니다.

Roozz로 게시된 LINQpad를 사용해보시려면, Google Chrome이나 Firefox로 아래 웹 사이트를 방문해 보시면 됩니다. 최초에 Roozz Plugin을 설치한 후 페이지를 새로 고치면 됩니다. 아쉽게도, 현재 Internet Explorer는 지원되지 않는다고 합니다. Internet Explorer의 경우 보호 모드때문에 roozz 플러그인이 곧바로 실행되지는 않으며, 적어도 신뢰할 수 있는 사이트 목록에 http://prod.roozz.com 을 추가한 이후에야 아래와 같이 동작합니다. Internet Explorer 9에서도 잘 동작합니다. :-)

http://prod.roozz.com/apps/61/LINQPad.htm

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

그동안의 Microsoft Windows 서버 환경에 대한 일반적인 오해와 편견, 그리고 불편한 부분까지 일거에 해소시켜줄 새로운 아이템이 하나 등장했습니다. 바로 Microsoft /web Platform Installer와 Microsoft /web Application Installer (이하 Web PI, Web AI)가 그 주인공들입니다. 양쪽 솔루션은 모두 Windows Vista SP1 이상, Windows Server 2008 이상의 시스템에서 동작하도록 설계되어있습니다.

1. Microsoft Web Platform Installer

Microsoft 및 관련 커뮤니티에서는 지속적으로 웹 환경에 알맞는 소프트웨어를 개발하고 테스트합니다. 그 덕분에 최근에 IIS 7.0에서는 Apache의 URL Rewriting 모듈과 호환 수준이 높은 자체적인 무료 URL Rewriting Engine이 배포되어 절찬리에 채택중입니다. 이것은 예전에 ASP .NET 기반 사이트에서만 자체적으로, 그리고 제한적으로 구현하였던 URL Rewriting Engine보다 더 성능이 좋고 범용적이며 검증이 많이 된 것입니다. 또 그 이외에도 계속해서 새로운 프로젝트와 기술들이 발표되곤 합니다.

이제는 이러한 기술들에 대한 정보를 놓치거나 테스트해보지 못할 걱정을 더 이상 하지 않으셔도 됩니다. Web PI가 이러한 부분을 일정 부분 이상 보충해 줄 것입니다. Web PI는 한 번 실행하고 마는 설치 프로그램이 아니라 개발자 PC에서는 주기적으로 새로운 시스템에 대한 정보를 확인하고 설치할 수 있도록 해줄 것입니다.

다음은 소개 동영상입니다.

WebPI는 http://www.microsoft.com/web/channel/products/WebPlatformInstaller.aspx 에서 받아보실 수 있습니다. 위의 도구를 이용하여 필요한 모든 플랫폼 도구를 설치한 다음에는 실제 테스트해보고 싶은 여러분만의 웹 어플리케이션을 바로 설치해볼 수 있는 Web AI를 써보실 차례입니다.

2. Microsoft Web Application Installer

아직 국내에서 많이 사용되는 PHP 기반 응용프로그램들 중 하나인 텍스트큐브가 IIS 7.0을 Apache + PHP 조합처럼 네이티브하고 자연스럽게 처리해주지는 않고 있지만, IIS 7.0을 기준으로 실행하는 것이 가능할 정도로 IIS 7.0은 이전의 IIS 6.0과는 다르게 유연해지고 강력해졌습니다. Web AI는 ASP.NET 기반 응용프로그램들 뿐만 아니라 PHP 기반 응용프로그램의 설치도 지원하며 PHP 해석 엔진과 MySQL 설치도 종속성 검사를 통하여 자동으로 이루어질 수 있도록 돕습니다.

Web PI에서 권장하는 모든 설치 요소를 설치한 다음에 이 설치 도구를 이용하여 필요한 웹 응용프로그램을 설치하셔야 합니다. Web AI는 http://www.microsoft.com/web/channel/products/WebApplicationInstaller.aspx 에서 받아보실 수 있습니다. Web AI로 설치할 수 있는 웹 어플리케이션들 중 DotNetNuke, phpBB, Wordpress 블로그는 특히 주목할만한 부분입니다. :-)

위의 두 가지 도구를 이용하여 멀리 발품팔지 않고도 손쉽고 빠르게 IIS의 기능을 업그레이드하고 필요한 모든 개발 도구와 웹 응용프로그램을 쉽게 구하고 설치할 수 있습니다. 이제부터는 여러분도 IIS로 마음껏 원하는 일을 해보시면 어떨까요? ^^

ps. http://www.microsoft.com/web 에 가시면 인스톨러 이외에 더 많고 풍부한 정보들을 얻으실 수 있습니다. :-)

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)
지난번 강좌에 이어서 디스어셈블 기능과 분석 기능을 살펴보기로 합니다. Reflector가 인기있는 이유는 사실 강력한 내장 디스어셈블러 때문입니다. 디스어셈블링 작업은 소스 코드를 역으로 되가져올 수 있다는 것을 의미하는데 이것은 양날의 칼과 같습니다. 어떻게 쓰느냐에 따라서 유용할 수도 있지만 아주 치명적일 수 있습니다.

디스어셈블러로 Base Class Library의 버그를 찾은 사례가 있습니다. 바로 System.Windows.Forms.WebBrowser 클래스에서 "덜 구현된" 프로퍼티의 문제점을 찾을 수 있었는데 HTML 문서가 저장된 스트림을 이 클래스의 어떤 프로퍼티에 넘기면 무조건 서유럽언어의 인코딩으로만 처리하려는 문제점이었습니다. 이 문제를 파악한 이후부터는 이 프로퍼티를 직접 사용하지 않고 Document Object Model 객체를 직접 가져와서 접근하는 방식을 이용하기 시작하였습니다. (이 클래스의 프로퍼티들 중에서 Dom~이라는 접두어가 붙는 프로퍼티들이 Internet Explorer의 COM 객체를 직접 노출하는 프로퍼티들입니다.)

하지만 디스어셈블러를 사용하기에 따라서는 소스 코드의 취약점을 파악하거나 소스 코드의 저작권을 보호할 수 없게된다는 문제도 같이 안고 있습니다. 그래서 나온 것이 Obfuscation, 즉 코드 난독화 기술입니다. 다행히 Reflector는 코드 난독화 기술을 정복하면서까지 디스어셈블을 시도하는 해킹 도구는 아니기 때문에 코드 난독화 기술이 적용된 어셈블리에 대해서는 "잘못된 결과"를 나타내거나 작업 자체를 실패로 처리합니다.

디스어셈블러를 이용하여 다른 어셈블리를 살펴볼 때에는 주의할 점이 있습니다. 디스어셈블러로 얻어진 결과는 어디까지나 기술적인 진단을 위한 목적으로서 "개인적"으로 사용하여야 합니다. 이러한 결과를 상업적으로 재구성하여 판매하거나 무단으로 공개하는 경우 저작권 분쟁이나 EULA 계약 위반에 대한 법적 조치에 놓일 수 있습니다. 일반적으로 EULA 계약에는 디스어셈블에 대한 금지 조약이 포함되어있기 때문입니다. 그리고 디스어셈블한 내용을 특정 언어의 문법에 맞게 재구성하는 기능을 너무 신뢰하지는 마십시오.

서두가 좀 길었습니다만 충분히 이야기하고 넘어가야 할 부분들이었으니 숙지해주시길 바랍니다. 이제 Reflector를 이용하여 Base Class Library를 한 번 분석해 보도록 하겠습니다.

"그림 펼치기" 버튼을 눌러서 핵심 라이브러리의 System 네임스페이스 안에는 무엇이 들어있는지 쭉 살펴봅시다.

그림 펼치기

간간히 전에는 보이지 않았던 낯설은 이름들이 보입니다. __Canon, __ComObject, MDA와 같은 것들인데, 이것들은 공식적으로 문서화되지 않은 내부 클래스입니다. 접근 제한자는 internal이 주로 많을 것이고 중첩 형식의 경우 private, protected, internal 중 하나일 수 있습니다.

Reflector를 이용하면 이와 같이 밖으로 드러나지 않는 형식들도 쉽게 파악할 수 있습니다. 우리가 지금 살펴볼 디스어셈블 기능 역시 밖으로 드러나는 형식이든 아니든 상관없이 작동합니다.

위의 그림에서처럼 트리를 확장한 상태에서 Object 클래스를 찾아서 이름 앞의 "+" 기호를 클릭하면 다음 그림과 같이 됩니다.

사용자 삽입 이미지
Object 클래스 안에도 전에는 보이지 않았던 숨겨진 멤버들을 보실 수 있습니다. 특히 재미있는 부분은 Equals, GetHashCode, GetType과 같은 기본 멤버 메서드들입니다. 이 메서드들을 디스어셈블링하기 위하여 위의 트리뷰에서 Object 클래스의 노드를 펼치면 됩니다. 그리고 해당 멤버 위에서 Space 키를 누르면 디스어셈블러가 작동하여 특정 언어로 변환된 결과를 트리뷰 왼쪽편에 크게 펼쳐서 나타냅니다.

막상 살펴보면 이들 메서드들은 MSIL로 구현된 것이 아니라는 걸 알 수 있는데 다음과 같습니다.

사용자 삽입 이미지

사용자 삽입 이미지

Equals 메서드를 디스어셈블링한 결과를 보면 InternalEquals라는 메서드를 호출한 것을 볼 수 있습니다. 그런데 이 메서드는 우리가 알고 있는 플랫폼 호출 메서드와는 다른 양상을 띄고있는데 MethodImplAttribute만이 지정되어있습니다. 이것의 실제 구현은 .NET Framework 안에 숨겨져 있다는 것을 뜻합니다. 재미있는 사실은 성능과 관련이 깊거나 혹은 사용 빈도가 높은 유형의 기능들은 모두 이와 같은 방식으로 처리된다는 점입니다.

GetType 메서드, GetHashCode 메서드 등은 또 어떻게 구성되어있는지 살펴보도록 하겠습니다.

사용자 삽입 이미지

GetType 메서드는 실제로 위와 같습니다.

사용자 삽입 이미지
사용자 삽입 이미지

그리고 GetHashCode 역시도 Equals 메서드와 같은 방식으로 구현된 것을 볼 수 있습니다.

대강 이와 같은 방법으로 디스어셈블링할 수 있습니다. 만약 평소에 내부 구현이 어떻게 되어있는지 궁금했던 클래스나 형식이 있다면 Reflector에서 열어서 보십시오. 해답이 보이실 겁니다. 그리고 만약 어떤 어셈블리를 여는 도중이거나 특정 멤버를 탐색하려고 할 때 다음과 같은 대화 상자가 나타날 수 있습니다.

사용자 삽입 이미지

현재 Reflector가 로드한 어셈블리들 중에서 관련된 어셈블리가 없으면 GAC를 조사하여 일치하는 어셈블리를 자동으로 추천하는 대화 상자가 위와 같이 나타나게 됩니다. 대개의 경우 저 대화 상자에서 추천하는 내용이 정확하지만 그렇지 않은 경우도 있습니다.

Reflector의 디스어셈블러가 지원하는 재미있는 기능을 또 하나 더 살펴보기로 합시다. 지금까지 본 언어는 C#이 전부인데, C# 말고 다른 언어로도 디스어셈블링 결과를 볼 수 있습니다. 좀 더 복잡한 형식을 이용하여 결과를 살펴보기로 합니다. 살펴보려는 멤버는 System.Environment 클래스의 GetEnvironmentVariable 정적 메서드입니다.

MSIL Version Open

C# Version Open

Delphi Version Open

Visual Basic .NET Version Open

Visual C++ 7.x with Managed Extensions Version Open

RemObject Chrome Version Open


이제 디스어셈블링 외에 또 다른 편리한 기능인 Analyze 기능을 살펴보도록 하겠습니다. Analyze는 다양한 분석 옵션을 지원합니다. 주로 종속 관계를 조사하는 경우가 많으며 다른 유용한 분석 옵션도 제공합니다.

모든 항목에 대하여
* Depends On: 선택한 항목이 필요로 하는 다른 항목들입니다.
* Used By: 선택한 항목이 반드시 필요한 다른 항목들입니다.

클래스/구조체/대리자/나열 상수/인터페이스 전용
* Exposed By: 선택한 형식을 인수로 받아들이거나 반환하는 멤버 함수 및 프로퍼티들을 조사합니다.
* Instaniated By: 선택한 형식의 객체를 생성하는 멤버 함수 및 프로퍼티들을 조사합니다. 여기에는 현재 선택한 형식을 상속받는 자식 클래스의 생성자들도 모두 포함됩니다.

네임스페이스 전용
* Depends On: 현재 선택한 네임스페이스가 아닌 다른 네임스페이스 및 어셈블리들을 대상으로 이 네임스페이스 안의 개체들이 반드시 필요한 항목들입니다.

모듈 및 어셈블리 전용
* P/Invoke Imports: 해당 모듈이 System.Runtime.InteropServices.DllImportAttribute로 가져온 DLL 파일 및 참조한 DLL 함수들의 목록을 나타냅니다. 여기서 조사할 수 있는 내용은 Visual Studio에서 제공하는 Depency Walker나 Binary Dump Utility로는 조사할 수 없는 내용입니다.

Analyze 기능을 사용하기 위하여 다음의 그림과 같이 사용하면 됩니다.

사용자 삽입 이미지

그리고 위와 같은 방식으로 여러 개의 항목을 분석하도록 지정하면 Analyzer 창에 여러 항목을 쌓아둘 수 있습니다.

사용자 삽입 이미지

그리고 한 가지 더 유용한 정보를 알려드리면 위의 팝업 메뉴 가장 끝 항목인 Search MSDN 메뉴도 같이 활용하시면 좋습니다. 물론 MSDN이 모든 내용을 가지고 있는 것은 아니지만 적어도 BCL을 탐색하는 동안 MSDN과 비교하여 내용을 살펴보면 도움이 되는 점이 많습니다.

긴 글을 읽어주셔서 감사합니다. 다음 강좌에서는 Reflector의 리소스 분석 기능과 다양한 플러그인을 소개하는 시간을 가지도록 하겠습니다. :-)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)