Windows 8 스타일 개발이 한창 유행이다. 물론 모바일 생태계 전반전인 유행은 아니더라도 Microsoft 기술을 하는 사람들에게는 관심 대상이다. Windows 8 운영체제가 탑재되는 테블릿도 출시가 되고, New iPad 보다 하드웨어 스팩이 좋은 테블릿 출시도 준비중인 곳이 많다고 들었다. 새로운 마켓이 열리는 만큼 테블릿 사용자에게는 새로운 재미를 선사해줄 것은 분명한 사실일 것이다.

Windows 8 스타일 ! 개발을 위해 가지 알아야 구조적인 개념이나 유의사항 정도만 언급하기 위해 글을 나간다. C++/CX, C#,VB XAML(eXtensible Application Markup Language) 이용하여 WPF 데스크탑 응용 프로그램처럼 프로그래밍을 있다. 그리고 HTML/JavaScript 조합으로 개발 환경과 유사하게 개발을 있다. 아마 대부분의 Windows 8 스타일 개발자라면 알고 있는 내용일 것이다. 그리나 포스팅에서는 C++/CX C# 개발 언어를 기준으로 아티클 내용을 채울 것이다.

 

Windows 8 스타일 런타임 관점의 구조

[이미지 링크]

   

WinRT(Windows Runtime) 플랫폼의 구조적 아키텍처 이미지이다. 기존 Windows Desktop 응용 프로그램 환경과 다른점은 WinRT APIs 중간에 끼어있다. WinRT Windows 8 스타일 앱의 핵심이며, Windows 시작하는 Namespace 모두 WinRT 이다.

C#,VB 개발 환경은 그나마 편리한 Library Subset 제공한다. .NET Framework 최소화 버전이라고 보면 된다. 이를 .NET for Windows Store apps 이라고 부르며, 위의 이미지에는 내용이 빠져있다.

C++/CX 잘라 .NET for Windows Stores apps 제공되지 않는다. .NET 개발자라면 System(mscorlib.dll) 으로 시작하는 Namespace 얼마만큼 편한지 알텐데, Library Subset 제공되지 않으니 다른 방법을 사용해야 한다. 쉬운 예로 HttpClient 같은 클래스도 C++/CX MsXml COM 컴포넌트를 이용하는 편이 낫다. 그렇다고 모든 C++ 라이브러리를 사용할 있는 것도 아니다. 이 부분에서 특히 라이브러리의 제한이 있으므로 C:\Program Files (x86)\Windows Kits\8.0\Include\shared 폴더에서 사용가능한 Header 파일을 확인해보도록 하자.

만약 Header 파일의 pragma 선언이 Dektop Family 라면 Windows 8 스타일 앱에서는 사용할 없는 라이브러리이며, 상당한 Header들이 Desktop Family 속하여, 당장 .NET for Windows Stores apps 만큼 쓸만한 클래스들이 없다는 것이 조금 슬프다. 다만, 좋은 소식이라면 C++ boost Library 등이 C++/CX 용으로 컨버전을 시도하는 분들이 많으므로, 조금만 기다려보면 쓸만한 라이브러리들이 대거 출연할 것으로 보인다.

   

더불어 C#, C++ 개발자들도 알고 있어야 하는 중에 하나가 WinRT COM 컴포넌트 기반의 라이브러리라는 것쯤은 들어보았을 것이다. 그래서 Windows 8 스타일 개발자들은 COM 대한 개념과 나아가 이를 구현할 있다면 좋다. 특히 C#, VB 에서 WinRT 컴포넌트를 만드는 것은 가지 지켜야할 제약이 있으므로 다음의 링크를 참고하는 것이 좋다.

C# Visual Basic으로 Windows Runtime 구성 요소 만들기 http://msdn.microsoft.com/ko-kr/library/windows/apps/br230301.aspx

   

대신 C++/CX WinRT 컴포넌트를 만드는 것이 오히려 간단하다. 앞서 말했다시피 WinRT COM 컴포넌트 기반이지만, 기존 C++ 에서 COM 컴포넌트를 만드는 만큼 어렵지가 않다. C++ COM 구현의 첫번째는 IUnknown 인터페이스를 구현하는 것이지만, WinRT 에서는 Iunknown을 상속하는 IInspectable 인터페이스가 더 중요하다. IInspectable 인터페이스는 C++/CX 개발된 응용 프로그램이 런타임 해당 클래스의 정보를 제공하기 위한 인터페이스이다. 물론 기존 C++ 에서도 런타임상 클래스 정보가 필요하여 이를 직접 구현하는 방법도 있다. 하지만 C++/CX IInspectable 인터페이스는 C++/CX 컴파일 과정에서 자동으로 구현을 해준다. 이는 IUnknown 인터페이스까지 자동으로 구현해준다고 보면 된다. 그렇기 때문에 Iunknown 인터페이스의 AddRef, Release 메서드에 대한 객체 수명주기를 WeakReference 클래스를 통해 위임할 있다. WeakReference 통해 금방 해제될 있는 컴포넌트를 가비지 컬렉터 대상이 되도록 지정한다. 그러므로 사용 빈도가 매우 많고, 매번 자원 해제에 대한 비용이 반복되는 것은 WeakReference 효과적으로 객체 수명 주기를 다룰 있게 한다. 이러한 C++/CX 특별히 제공되는 라이브러리는 Microsoft.WRL Namespace 포함되어 있다.

아직 이러한 개념적인 부분이 어렵게 느껴진다면 월간 마이크로소프트 5월호 특집 기사로 기고한 필자의 다음의 글부터 참고 바란다.

[월간 마이크로소프트 5월호 특집기사] C++ 매트로 개발을 위한 C++/CX 언어 http://blog.powerumc.kr/378

   

   

Windows 8 스타일 응용 프로그램 관점

짧게 말해 Windows 8 스타일 개발은 쉽다. Visual Studio 2012에서 훌륭하게 대부분이 구현된 템플릿을 제공하기 때문에, 메서드 중간 중간 원하는 기능을 추가하고, 클래스나 XAML 만들면 된다. 다만, 이는 만든다는 것이 쉽다는 것이지 응용 프로그램 구조적인 측면에서는 전혀 쉽지 않다.

먼저 알아야 것이, Windows 8 스타일 페이지를 상태 관리 것인지, 것인지부터 결정해야 한다. 상태 관리를 유지할 필요가 없다는 것은 개발(ASP.NET/ASP/PHP/JSP) 같은 서버 사이드 개발 환경과 유사하다. 특히 IIS에서부터 ASP.NET까지 연결되는 Application Pipeline 매번의 Request마다 Pooling Thread 활성화되어 서버 랜더링을 통해 사용자에게 HTML Response 전달이 된다.

   

1. 상태 관리를 개별적으로 유지하고 싶다면

다음의 가지 메서드를 재정의하면 된다. ASP.NET Custom Control 구현해 보았다면 VIEWSTATE 상태 유지를 위해 이런 유사한 코드를 구현해야 하는 것을 것이다.

   

Frame.Navigate 메서드는 Page Type 인자로 받고, 매번 새로운 인스턴스를 생성한다. (구현을 다르게 한다면 인스턴스를 이용하도록 수도 있다.) 페이지의 상태 유지야 위의 메서드를 재정의하는 정도로 끝낼 있지만, 페이지에 포함된 UserControl 있다면 상황은 달라진다. 독자마다 구현하는 방법은 다르겠지만, 효과적으로 상태를 관리하기 위해 UserControl 조금 귀찮아지는 존재이다. 인스턴스의 재사용을 위해 자주 사용하는 UserControl 대한 상태 관리를 고민해야 하다니… (현재 아티클은 내용이 대해 오픈 소스 제공으로 효과적인 방법을 제안하도록 필자는 약속 하겠다.)

   

2. 상태 관리를 자동으로 캐싱하고 싶다면

상태 관리를 자동으로 캐싱하는 방법도 매우 쉽다. Page.NavigationCacheMode 프로퍼티를 Enabled 해주면 된다. 물론 XAML 코드에 속성을 추가해도 된다. 하지만 아쉽게도 Frame.Navigate 메서드를 통해 자동으로 상태 관리를 하도록 Page 새로운 인스턴스가 생성이 된다. 상태 관리 캐싱에 대한 조건은 GoBack(), GoFoward() 같은 Frame 이동에 대해서만 유효하다. 조금 이해할 없는 부분은 Page 포함된 UserControl 상태 관리 캐싱 대상에서 제외된다. (물론, 가능하도록 있지만 개념적으로 깊게 이해하고 구현해야 한다.)

   

3. 남발되는 async/await 의한 동기화 문제

Windows 8 스타일 앱을 사용하다가 자주 멈짓 멈짓 한다면 분명 사용자는 짜증날 것이다. 때문에 async / await 키워드를 더욱 자주 사용하는 편이다. 그렇기 때문에 UI 상태에 대한 비동기와 컴포넌트나 인스턴스 메서드 호출에 대한 비동기, 모두 정확하게 Threading 대한 지식이 필요하고, 자유 자재로 Threading 다룰 있다면 더욱 좋다. Windows 8 스타일 앱에서 가장 많이 발생하는 Threading 문제는 Thread 실행 인스턴스 해제에 대한 동기화와 Thread Cancel 대한 동기화다.

문제를 피하기 위해서는 클래스나 라이브러리를 만들때 부터 async / await 대한 고려가 필요하다. 쉽게 이야기하자면 자주 쓰지 않는 편이 좋고, 써야 곳에 써야 한다.

   

이를 판단하려면 Thread 동기화에 대해 적어도 가지는 반드시 익히는 것이 좋다. MSDN 아래의 글들을 번정도 필독하기 바란다.

관리되는 스레딩 기본 사항 http://msdn.microsoft.com/ko-kr/library/hyz69czz
스레딩(C# Visual Basic) http://msdn.microsoft.com/ko-kr/library/ms173178(v=vs.110)

   

      

Windows 8 스타일 배포와 라이브러리 배포 문제

부분은 매우 민감한 부분이고 조심스럽다. 실제 Windows App Store에서 테스트할 없을 뿐더러 개발 환경에서 발생하는 문제이므로, 실제 Windows App Store 통해 발생할 수도 있을 가능성이 있을 같다. COM 기반 라이브러리나 DLL 구성 요소 등은 공유 메모리에 로드가 된다는 것을 것이다. 특히 부분은 COM 컴포넌트에서 민감하게 다루는 IUnknown 인터페이스의 의미와 일맥 상통한다. , COM 객체의 참조 카운트(Reference Cout) 0 되지 않으면, 자원은 해제되지 않는다. 여기에서 COM 가장 고질적인 문제가 발생한다. 바로 DLL 지옥이다. Windows 8 스타일 앱의 메모리 위치는 메모리 영역이 아닌 공유되는 메모리 영역에 위치하고 있고, DLL Verserning 자유롭지 못하다. .NET 처럼 GAC(Global Assembly Cache)에서 DLL 버전별로 관리되지 않는다.

따라서, WinRT 런타임 라이브러리를 개발하여 배포된 Windows 8 앱이 활성화 상태일 새로운 앱에서 버전업 WinRT 런타임 라이브러리 배포시에 다른 프로세스가 점유하고 있다는 오류가 발생한다. 이는 앱이 초절전 유휴 상태에 진입되어도 마찬가지이다.

이찌되었든 개발 환경에서는 충분히 발생된 문제이니, 차후 Windows App Store에서도 발생할지는 지켜보아야 것이다.

   

Windows 8 Windows Runtime 재배포 정책 업데이트

런타임 라이브러리인 만큼 라이브러리 코드가 완벽하지는 않을 것이다. .NET Framework 1.0부터 4.5까지 버전업이 되어왔는데 과연 Windows 8 Windows Runtime 어떻게 버전업이 될까? 사용자의 동의 없이 업데이트나 패치는 불가능하다.

   

Windows 8 Features Pack 1,2,3… 시리즈로 업데이트가 될까?
Windows 8 Service Pack 1,2,3… 시리즈로 업데이트가 될까?

   

만약 이렇게 되면, Windows 8 스타일 간에 호환성 문제가 발생할 것이 분명하다. Apple iPhone 모바일 폰의 운영체제 업데이트가 실시간으로, 온라인으로 이루어진다. Windows 8 iPhone 업데이트와 차원이 달라진다. WinRT 지원하는 ARM 버전과 기존의 Windows 8 Desktop 지원하는 x86 버전 가지의 에디션이 있다.

혹시 부분에 대해서 알고 있는 정보가 있으면 공유 부탁 드립니다.

Posted by 땡초 POWERUMC

댓글을 달아 주세요

Disk2Vhd 는 물리적인 저장소를 Hyper V 의 가상 하드 디스크로 만들어주는 도구입니다. 헌데, 이 도구를 이용하여 실제 부팅 가능한 가상 하드 디스크로 만들기 위해서 한 가지 주의해야 할 점이 있습니다.    

파티션이 여러 개인 하드 디스크의 문제

만약 물리 디스크가 여러 개의 드라이브로 파티션이 나누어져 있을 경우 아래와 같이 파티션 0 인 C 드라이브만 가상 하드 디스크로 만들 경우 문제가 발생합니다.

   

아마도 파티션 정보가 모두 포함되지 않아 아래와 같은 현상이 발생하는 것 같습니다.

   

파티션이 여러 개인 경우 모두 가상 하드 디스크로 변환

이런 문제가 발생할 경우, 실제 C 드라이브의 부팅 가능한 OS 가 있음에도 부팅이 되지 않습니다. 아래와 같이 모든 파티션을 선택한 후 Disk2Vhd 를 이용하여 가상 하드 디스크로 만들면, 부팅 가능한 가상 하드 디스크로 만들 수 있습니다.

   

Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 화정큐삼 2019.12.24 12:41 Address Modify/Delete Reply

    최종버젼인 2.01에서는 물리적1개의 드라이브에서 2개의 파티션중 부팅 파티션1개만 VHD로 만들경우 (WIndows 10 테스트) 동적 확정 VHD로 생성하면서 이 부팅파티션의 용량대로 크기를 잡습니다.
    그래서 VHD를 저장한 드라이브가 원래의 부팅 파티션만큼 충분한 공간이 없으면 역시 부팅이 불가합니다.
    그래서 BOOTICE등으로 VHD압축 과정을 한번더 거치셔야 합니다.

외국의 ZDNET 기사에 Internet Explorer 8 의 성능 향상 방법을 소개 하고 있습니다. 많은 분들이 Microsoft 의 Internet Explorer 의 성능 문제로 불만도 많은 분들이 계실텐데요, 아마도 이 방법을 통해 성능이 웹 서핑 성능이 향상 되길^^    

특히 이미 이 기사에서 언급한 내용이지만, Internet Explorer 의 성능 저하의 주요 원인은 각종 Add-on 과 특히 Adobe Flash Player 가 주요 원인이라고 합니다. 실제로 가장 많이 사용되고 있는 브라우저인 만큼 피드백도 많겠죠. 좋은 피드백이든 나쁜 피드백이든…    

Internet Explorer 8 의 성능을 향상하는 단계는 아래와 같이 수행하라고 합니다.    

Step 1. 현재 설치된 Adobe Flash Player 를 제거하라.

프로그램 추가/제거로 제거하지 말고 아래의 링크를 통해 제거하라고 합니다.
How to uninstall the Adobe Flash Player plug-in and ActiveX control.

웹 사이트 방문이 귀찮으신 분은 이 링크(uninstall_flash_player.exe) 를 클릭해서 설치하세요.

   

Step 2. Internet Explorer 기본 설정으로 변경해라.

도구->인터넷 옵션에서 원래대로 버튼을 클릭합니다.

최소한 이 버튼 클릭만으로 상당한 효과가 있을 듯 하군요. 각종 더미 add-on 까지 모두 싸그리 사용하지 않는 상태로 만들어 버릴테니까요.

   

Step 3. Flash Player 를 다시 설치하라.

Adobe Flash Player 를 설치하는 링크 페이지 입니다.
웹 사이트를 방문하기 귀찮으신 분은 이 링크(Install_flash_player.exe) 를 클릭하여 실행하세요. 설치 중에 오류가 발생한다면, 열려있는 Internet Explorer 를 종료하고 "다시 시도"를 클릭하세요. 

아무래도 구형 Flash Player 보다 최신의 것이 보안 취약이나 성능이 개선이 되었을 듯 합니다.

   

Step 4. Internet Explorer Add-on 을 다시 활성화해라.

주로 사용하거나 필요한 Add-on 만 찾아서 활성화 하시면 됩니다.

 


   

원문 기사의 댓글을 보면 Flash Player 와 Adobe 는 이미 상당한 안티 팬을 거느리고 있네요.^^;

그리고 필자가 위의 과정을 수행한 후 테스트해 본 결과, Internet Explorer 성능이 상당히 빨라진 것 같습니다. 크롬 아이콘 버튼을 클릭하고 메인 홈 페이지(네이버) 가 HTML 랜더링이 완전히 끝나는 시간과, Internet Explorer 에서도 이와 같이 아이콘 클릭하는 시간부터 체크를 했는데... 거의 흡사하네요 ^_^; (제가 좀 관대한가...)
(뭐 크롬은 HTML 텍스트부터 뿌려주고 이미지는 비동기식으로 랜더링하는 방식이라 체감상 차이는 있을 수 있습니다)

Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 재우니 2010.01.29 09:25 Address Modify/Delete Reply

    좋은 내용 보고 갑니다. ^^

    • 땡초 POWERUMC 2010.01.29 12:55 신고 Address Modify/Delete

      재운님 안녕하세요 ^^;
      요즘 커뮤니티 활동이 부재하다보니
      카페를 자주 못 찾아뵈었네요 ^_^;;
      앞으로 자주 방문해서 뵙겠습니다.

  2. 박중석 2010.01.29 11:06 Address Modify/Delete Reply

    Add-in이 많이 설치된 일반사용자들에게 알려지면 좋을 것 같네요~

    • 땡초 POWERUMC 2010.01.29 12:56 신고 Address Modify/Delete

      예,, 맞아요..
      이런저런 툴바도 엄청나게 무겁게 돌아가더군요.
      (알툴바, 구글툴바 등...)

      Lazy 한 방식으로 가볍게 만들면 좋았을걸..
      괜히 IE 만 욕먹는것 같아서 맘이 아프네요.

  3. 하나둘넷 2010.02.01 15:52 Address Modify/Delete Reply

    IE8 성능 향상 완료 !!

  4. ddd 2010.02.08 22:04 Address Modify/Delete Reply

    도움많이 됬어요 고맙습니다!

  5. 김동영 2010.02.14 10:59 Address Modify/Delete Reply

    안녕하세요^^
    좋은글 잘보고 갑니다
    블로그에 가져 가겠습니다
    출처는 밝히겠습니다

미치고 환장할 노릇이었네요. 그리 오래되지 않았지만, 서버 환경을 재구성 하면서 알 수 없는 오류로 고생을 했던 기억이 있어서 이렇게 써봅니다.
 
우선 오류는, 윈도우 통합 인증을 통해 로그인한 계정에 권한이 없다는 것입니다. 분명 Admin 그룹인데 말이죠 ^^; 이벤트 로그에도 특별히 단서를 찾을 만한 것이 없었습니다.
 
[그림1] 윈도우 통합 인증 화면
 
서버 환경은 다음과 같이
 
l Windows Server 2003 SP1
l Active Directory
l IIS 6.0
l Windows Sharepoint Services 3.0 with SP1
l Team Foundatino Server 2008
l Microsoft SQL Server 2005 with SP1
 
이정도로 구성해 놨습니다.
백발백중 윈도우 통합 인증이 안된다고 하면, “계정 등록을 안했겠지!” 라고 생각하지만, 분명히 계정을 등록이 되어 있었답니다.
 
그러던 중에 찾은 KB 문서!!
 

통합 인증을 사용하며 IIS 5.1 또는 IIS 6에 호스트된 웹 사이트를 탐색할 때 오류 401.1이 나타난다

 
뭐 내용은 대충 이러했습니다.
 
컴퓨터에 대한 반사 공격을 방지 하기 위해 루프백 확인 보안 기능이 포함되어 있다, 즉 호스트 헤더가 로컬 컴퓨터 이름과 일치 하지 않으면 인증이 실패한다.”
 
해결책이야 위의 링크를 보시면 되겠지만, 레지스트리 하나 고쳐주고 리붓 해주면 된답니다. 하지만 분명, 의도된 동작이라고 설명하였음에도 제대로된 로그하나 남기지 않는 다는 것이 맘이 안드네요. 위와 같이 인증 실패가 된다면 루프백 기능이 포함되어있어서 그러는 것이니 그렇게 알고 있으라고 설명이 되어 있는데, 이 문서를 보기 전까지 어떻게 알라는 거지?? GG !!

Posted by 땡초 POWERUMC

댓글을 달아 주세요

이번 주말에는 많은 기대를 하게 했던 Windows Server 2008 을 설치해 보았습니다. 설치 과정은 Windows Vista 만큼이나 간결하더군요. Vista 를 한번정도라도 설치를 해 보셨다면, 설치가 마칠 때 까지 어떠한 난관에 부딪힐 일은 없습니다. ^^ 하지만, 기존의 Windows Server 2003과 XP 사용자들에게 몇가지 혼란스러운 부분에 있더군요.
 
 
서버 관리자를 통한 체계적인 서버 관리
 
1.      IIS / 응용프로그램 서버 설치
이전 버전은 프로그램 추가/제거에서 설치할 수 있었지만, Windows Server 2008 에서는 서버 관리자를 통해 설치할 수 있습니다. 역할이라는 부르는 이 영역은 IIS/응용프로그램 서버/AD(Active Directory)/DNS 등의 서버 역할을 구성 할 수 있습니다.

아래와 같이 서버 관리자의 역할 -> 역할 추가 -> 역할 추가 마법사를 통해 서버의 역할을 추가할 수 있습니다
.





2.      Internet Explorer 보안 강화 구성 제거
저 같은 경우는 프로젝트에서 XP 보다 서버군 OS 를 설치하기 때문에, 기본으로 설정된 IE 보안 강화 구성을 해지해야 합니다. 이놈 제거하려고 1시간을 삽질했습니다 ㅠ.ㅠ



3.      방화벽 구성
Windows Server 2008 은 “안바운드” 와 “아웃바운드” 로 나뉘어 집니다. 말 그대로, 받는것과 보내는것에 대해 방화벽을 구성할 수 있습니다.



4.      비스타 테마 사용하기
서비스의 Themes 가 활성화 되면, 비로소 Windows Vista 와 같은 테마를 사용할 수 있습니다. 더불어, Aero 기능도 제공이 되기 때문에 Vista 의 화려하고 부드러운 애니메이션이 부럽지 않답니다.



5.      Microsoft Office 2007 제품 설치
자세한 이유는 잘 모르겠지만, Office 2007 을 설치하려고 하면, 데이터실행 방지(DEP) 때문에 설치를 할 수 있게 됩니다. Office 를 설치하기 위해서 아래의 그림과 같이 Office 설치파일을 등록해 주세요.



Vista 용 드라이버와 응용 프로그램의 호환
 
설치하면서 왠만한 드라이버는 비스타용 가져다 쓰면 되더군요. 그중, OS 버전을 체크하는 드라이브가 있어서 강제적으로 설치가 불가능한 것도 있지만, 우회적으로 잘 알아서 깔면 되긴 됩니다. 아직까지 몇몇 필요한 소프트웨어를 설치하면서 아무런 문제없이 잘 사용하고 있답니다.
 
l 네이트온 – Vista 용
l Visual Studio 2005 / 2008
l Microsoft SQL Server 2005 With SP2
l 알집, 알FTP, 알툴, 알약 등
l 오피스 2007 – DEP 해지 후 설치가능
l DAEMON Tools Lite 4.12.2
l SnagIt, Open Capture …
l 등등
 
다른 분들은 설치하고 굉장히 가볍다고 하는데, 사실 각종 툴과 MS-SQL 서버 제품군 등을 설치하면 체감속도는 타 OS 에 그리 빠르지만도 않습니다. 오히려 Windows Server 2003 보다 빠르다고 하면 좀 이상한것 같구요 ㅋ;
어쨌든 전 Windows Server 2008 을 당분간 꾸준히 써보려고 합니다. 아직 서버 관리자쪽만 훓어 보았지만, 너무 체계적으로 관리가 가능하게끔 되어있는 인터페이스와 Windows Vista 와 비슷한 환경이 마음에 듭니다.
 
시작하는 한주도 파이팅입니다~~
Posted by 땡초 POWERUMC

댓글을 달아 주세요