MTProto Mobile Protocol

 

https://core.telegram.org/mtproto

 

General Description


이 프로토콜은 모바일 디바이스에서 서버로 접근하는 API로 디자인 되었다. 웹 브라우저에서 사용하는 것이 아님을 강조한다.

이 프로토콜은 3개의 독립된 컴포넌트로 세분화 되어 있다.
. 하이레벨 컴포넌트(API query language) : API쿼리와 메시지가 바이너리로 변환된 내용이 정의 되어 있다.
. 암호화 계층(인증) : 전송되기 전에 암호화된 메시지의 내용이 정의 되어 있다.
. 전송 컴포넌트 : 클라이언트와 서버간의 전송을 위해 다른 기존의 네트워크 프로토콜(예: http, https, tcp, udp)에 대한 내용이 정의되어 있다.

 

노트 1:
일반 텍스트 메시지를 MTProto에서 항상 암호화하고, 시스템 구성 요소와 알려진된 문제에 대해 강력하도록 암호 해독 시 검사할 다음 데이터를 포함한다.
•server salt (64-Bit) : 서버슬랫
•session id : 세션아이디
•message sequence number : 메시지 순번
•message length : 메시지 길이
•time : 시간

 

노트 2:
추가 커맨트를 보려면 링크 클릭

 

 

Brief Component Summary : 구성 요소 요약
High-Level Component (RPC Query Language/API) : 하이레벨 컴포넌트
하이레벨 컴포넌트 관점에서 보면, 클라이언트와 서버 세션안에서 메시지 교환하는 것이다.
세션은 특정 http/https/tcp 연결 보다는 오히려 클라이언트 장치 (더 정확 하 게, 응용 프로그램)에 연결 된다.
또한, 각 세션은 실제 인증완료된 사용자 키 ID에 연결되어 있다.

여러 서버에 연결을 열릴 수 있고, 메시지는 어떤 컨넥션이든지 양방향으로 전송이 가능하다.
(응답은 동일한 연결을 통해서 반환되지 않을 수 있으며, 자주 발생하는 경우이다. 그러나, 다른 세션을 통해서라도 메시지가 반환 될 수 있다.)
UDP 프로토콜을 사용하는 경우 응답 쿼리가 다른 IP 주소에 의해 반환 될 수 있다.

몇개의 메시지 유형
•RPC calls (client to server): 클라이언트가 서버 API호출
•RPC responses (server to client): 클라이언트 호출에 대한 결과 반환
•Message received acknowledgment (or rather, notification of status of a set of messages) : 메시지 수신 승인(또는 알림 메시지 집합)
•Message status query : 메시지 상태 쿼리
•Multipart message or container (a container that holds several messages; needed to send several RPC calls at once over an HTTP connection, for example; also, a container may support gzip).
멀티파트 메시지 또는 컨테이너(컨테이너는 여러개의 메시지를 홀드 할 수 있고, 서버로 한번에 보낼 수 있다. 예를 들어 컨테이너가 gzip을 지원하는 경우다)

 

낮은 레벨 프로토콜의 관점에서 메시지는 이진 데이터 스트림 4 또는 16 바이트 경계에 따라 정렬된다.
메시지의 첫부분 몇 가지 필드는 암호화/인증 시스템에 의해 사용되도록 고정되어있다.

각 메시지는, 독립적이거나 컨테이너 내부는 메시지 식별자(64비트, 아래 참조), 메시지 세션의 순번(32비트), 길이(바이트;메시지 본문의 길이 32비트), 본체(4바이트의 배수)로 구성되어진다.
또한, 컨테이너 또는 단일 메시지를 보낼 때 내부 헤더가 상단에 추가 되고(아래 참조), 메시지가 암호화되고, 외부헤더가 메시지 상단에 들어 갑니다.(64-비트 키 식별자와 128-비트 메시지 키)

메시지 본체는 일반적으로 종속 매개 변수 뒤에 32비트 메시지 유형으로 구성되어있고,
특히 각 RPC 함수는 해당 메시지 유형이 있다. 자세한 사항은 링크 참고

모든 숫자는 리틀 엔디안으로 작성 된다. 그러나, 매우 큰 숫자 (2048 비트) RSA와 DH는 큰 endian 형식으로 작성 된다. 왜냐하면 OpenSSL 라이브러리이기 때문이다.

 

Authorization and Encryption : 인증과 암호화

 

이전 메시지 (또는 다중 파트 메시지) 전송 프로토콜을 사용 하여 네트워크를 통해 전송 되고, 암호화된 외부 헤더는 메시지의 위쪽에 추가 된다. 암호화된 내용은 64-비트 키 식별자 (고유 하 게 식별 인증 키 서버 뿐만 아니라 사용자에 대 한) 및 128 비트 메시지 키이다. 사용자키와 메시지키 256비트 키를 정의하고, 실제 메시지를 AES-256 방식으로 암호화한다.
메시지 암호화의 초기 부분 메시지 키(및 그러므로 AES 키 및 iv)와 명백 하게 영향을 미치는 변수 데이터(세션, 메시지 ID, 시퀀스 번호, 서버 소금) 포함 되어 있있다. 메시지 키가 메시지 본문의 SHA1 128 하위 비트로 정의 (포함 한 세션, 메시지 ID, 등.). 다중 파트 메시지를 단일 메시지 암호화

기술 사양에 대한 모바일 프로토콜(링크)을 참조

클라이언트 응용 프로그램이 처음으로 해야하는 것은 인증키를 생성해야한다. 일반적으로 이 과정은 변하지 않는다.

 

프로토콜의 주요한 결점은 침입자가 수동적으로 메시지를 차단하고, 어떻게든 인증키(예를 들어 장치를 훔쳤을 때)를 도용하여 메시지를 가로체고 해독할 수 있다. 아마도 이건 너무 많은 문제(장치를 훔치면 저장된 모든 정보를 모두 해독할 수 있다)를 가지고 있다. 그러나, 이 약점을 극복하기 위해 다음 단계를 수행하면 된다.

 

* 세션키는 Diffie-Hellman 프로토콜에 의해 생성하고, 인증과 메시지키는 AES 파라메터에서 선택해서 사용한다.
이 것을 만든 후 클라이언트는 첫번째로 새로운 세션을 생성하고 RPC서버로 전송하면, 서버가 생성된 세션키를 반환해준다.그 후 모둔 후속 메시지는 세션 키를 사용하여 암호화 된다.

 

* 클라이언트 장치에 저장된 키를 택스트 암호로 보호한다. 이 패스워드는 메모리에 저장되지 않고 사용자에 응용프로그램이 시작될 때 입력 받는다.

 

* 사용자 장치에 저장된 데이터 또한 인증키를 이용해서 암호화해서 보호해야 한다. 패스워드는 그 데이터에 접근할 때도 필요하다

 

Time Synchronization : 시간 동기화

 만약 클라이언트 시간과 서버 시간이 차이가 많이 난다면, 서버는 클라이언트 메시지를 무지하거나, 그 반대의 경우가 발생할 수 있다. 왜냐하면, 메시지 식별자가 잘못되었기 때문이다(생성시간과 밀접한 관련이있다)

이러한 상황에서 서버는 클라이언트에게 정확한 시간을 포함하는 특별한 메시지와 128-bit salt를 보낸다.
(클라이언트 특정 RPC 동기화 요청을 받거나 현재 세션 중에 받은 마지막 메시지의 키와 같은지 비교해서 명시적으로 제공한다.)

이 메시지는 다른 메시지를 포함하는 컨테이너의 첫번째가 될 수 있다.(시간 차이가 중요하지만 클라이언트의 메시지가 발생하지 않은 경우 무시된다.)

 

그러한 메시지 또는 그것을 포함한 컨테이너를 수신한 경우, 클라이언트는 우선 시간 동기화를 수행(서버시간과 미래의 올바른 시간을 계산하고 차이를  이용해서 보정)하고 메시지 식별자가 정확한지 검사한다.

 

보정이 무시 경우, 클라이언트는 메시지 식별자 단순성을 보장하는 새로운 세션을 생성한다.

 

Transport : 전송

클라이언트에서 서버로나 그 반대로 암호화된 컨테이너와 외부 헤더(이하 페이로드)의 전달이 가능하다. 세가지 전송 타입이 있다.
. HTTP

. TCP

. UDP
우선 두가지 종류를 살펴보자

 

HTTP Transport

HTTPS를 사용하지 않고 기존의 TCP 포트 80을 이용하는 HTTP/1.1(with keepalive)로 구현; 위의 암호화 방법이 대신 사용된다.

 

HTTP 연결은 가장 최근에 수신된 사용자 쿼리에 지정된 세션(아니면 세션 + 키 식별자)에 붙어있다. 일반적으로 세션은 모든 쿼리에서 동일하지만, HTTP 프록시에 의해 손상될 수 있다. 서버는 HTTP 연결에서 동일한 세션이 아니거나, 서버의 차례가 아니면 메시지를 반환하지 않는다.(클라이언트의 HTTP 요청을 받고 응답을 하지 않은 상태)

다음은 전반적인 사항이다. 클라이언트는 서버에 하나 이상의 keepalive HTTP 연결을 연다.만약 하나나 그 이상의 메시지를 보내야 하는 경우, POST 요청을 포함하는 페이로드를 만들고 전송한다. 페이로드에는 컨텐츠길이, Keepalive와 호스트의 유효한 HTTP헤더를 추가한다.

 

쿼리를 수신하면, 서버는 조금 기다리거나(만약 쿼리가 짧은 타임아웃 응답을 요구하면) 즉시 더미 응답(오직 컨터이너가 인정된 경우)을 반환한다. 어떤 경우에는, 응답 메시지에 임의의 수를 포함 할 수있다. 서버는 동시에 세션에서 홀딩 중이던 다른 메시지를 전송할 수 있다.

 

또한, 최대 전송 타임아웃 T가 지정된 특정 long poll RPC쿼리(유효한 HTTP 연결만 가능)가 존재한다. 일반적으로 서버가 세션에 메시지를 가지고 있다면 즉시 반환한다. 그러나 long poll RPC쿼리가 존재하면, T second가 흐르기 전까지 서버는 메시지를 대기 상태로 만든다. 만약 T seconds가 흐른 후 이벤트가 발생하지 않으면 더미 응답을 반환한다(특별 메시지).

 

만약, 서버가 클라이언트에서 메시지를 보내야할 필요가 있다면, 필요 세션과 "HTTP 요청에 응답가능" 상태, HTTP연결을 확인하고, 메시지를 응답 컨테이너에 넣은 후 사용자에게 보낸다. 전형적으로 서버에서 또 다른 메시지를 보내기 위해서는 추가 시간(50밀리세컨드)이 필요하다. 

 

만약 어떤 적합한 HTTP 연결을 사용할 수 없다면, 메시지는 현재 세션의 송신 큐에 담긴다. 그러나, 그 메시지들은 명시적이든 간접적으로 클라이언트에 확인될 때까지 어떻게든 자신의 길을 찾는다. HTTP 프로토콜에서, 동일한 HTTP 연결안에서 다음 쿼리를 전송하면 암묵적 확인 응답으로 간주한다.(아무것도 없다면 HTTP 프로토콜은 명시적 승인을 요청을 보낸다), 다른 경우에, 클라이언트는 일정 시간 내에 명시적 확인 응답을 반환해야한다(그것이 다음 요청을 컨터이너에 추가할 수 있다)

 

중요 : 만약 응답 시간에 승인 메시지가 도착하지 않을 경우, 메시지를 재정송할 수 있다.(다른 컨테이너를 이용해서). 당사자들은 자율적으로 이에 대한 준비를해야하고, 가장 최근의 수신된 메시지 식별자를 저장해야한다.(반복된 동작에 의해 발생되는 중복은 무시) 저장된 영원한 식별자는 가질 수 없기 때문에, 메시지 식별자의 단순성을 활용 특수 가비지 컬력션 메시지가 존재한다.

만약 송신 큐가 오버플로우가 발생하거나 메시지가 큐에 10분이상 남아있다면 서버는 그것들을 지운다.(아니면 스왑한다.) 이 것은 서버의 버퍼 공간이 부족한 경우 더 빠르게 발생할 수 있다.(예를 들어 네트워크 이슈가 발생했다거나 할 때)

 

TCP Transport

이것은 HTTP 전송과 매우 유사하다. 또한 포트 80(모든 방화벽을 통과하기 위해)과 동일한 IP 어드레스를 사용한다. 이 상황에서, 서버는 HTTP또는 TCP프로토콜 중 어떤 것을 사용해야하는지 처음 4바이트를 기준으로 판단한다.(HTTP POST방식)

 

TCP연결이 생성되면, 이 세션(과 인증키)을 사용자 메시지 전송에 할당하고, 이어서 독점적으로 이용한다.(다중화 배열이 허용되지 않는다)

 

만약 페이로드가 서버에서 클라이언트, 혹은 클라이언트에서 서버로 전송될 필요가 있는 경우에 다음과 같이 캡슐화: 4바이트(길이, 순번, CRC32;4로 나누어지는)를 앞에 추가, TCP 컨넥션에서의 패킷 순번 4바이트(처음건 0, 다음은 1..), 4 CRC32 바이트(길이, 순번, 페이로드)를 뒤에 추가

 

동일한 프로토콜의 축소된 버전이 있다: 만약 클라이언트가 0xef를 첫번째 바이트로 보내면(**중요** 첫데이터 패킷이전에), 패킷 길이는 암호화 된다.(0x01..0x7e = 데이터 길이는 4로 나누거나 0x7f 다음 3바이트를 4로 나눈). 이 경우 서버는 동일한 응답을 보낸다.

 

프로토콜의 전체 및 축소 버전의 빠른 응답을 지원해야한다. 이 경우, 클라이언트는 질의 패킷에서 가장 높은 차수 비트 길이를 설정하고, 서버는 개별 패킷의 특정 4바이트로 응답한다. 그것들은 정규 서버 응답 패킷이 아니라는 것을 명확하게 설정하는 최상위 비트를 가진 패킷의 암호화 부의 고차 SHA1비트이다; 축소 버전의 경우 4바이트에 적용된다.

 

TCP 전송에에는 묵시적 승인은 없다 : 모든 메시지를 명시적으로 승인해야한다: 컨테이너나 응답을 빠르게 승인해야한다. 예를 들어 거의 항상 RPC쿼리를 포함하는 클라이언트 메시지 : 확인 응답은 보통 RPC 응답으로 처리

 

에러가 발생하면, 서버는 페이로드 에러 코드로 4 바이트로 구성 패킷을 전송할 수있다. 예를 들어, 오류 코드 (403)는 해당 HTTP 에러가 HTTP 프로토콜에 의해 반환 될 상황에 대응한다.

'Windows 8&8.1 > ETC' 카테고리의 다른 글

MTProto Mobile Protocol 번역 중  (2) 2014.06.03
Image Note  (0) 2014.05.12
Now FocusedElement, CurrentPage  (0) 2013.08.29
Custom ConfirmBox create  (0) 2013.08.21
patterns & practices: Prism for the Windows Runtime  (0) 2013.07.10
Microsoft .Net Framework 4.5 Quickstart Cookbook Review  (0) 2013.07.05
블로그 이미지

MVP kaki104

* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

Image Note

Windows 8&8.1/ETC 2014.05.12 23:53

간단하게 이미지의 스케일을 변경한다. Bound와 Flip 등의 기능이 가능, 예제에서 찾아서 남김

 

        private async void OnDeferredImageRequestedHandler(DataProviderRequest providerRequest, StorageFile imageFile)
        {
            // In this delegate we provide updated Bitmap data using delayed rendering.

            if (imageFile != null)
            {
                // If the delegate is calling any asynchronous operations it needs to acquire the deferral first. This lets the
                // system know that you are performing some operations that might take a little longer and that the call to
                // SetData could happen after the delegate returns. Once you acquired the deferral object you must call Complete
                // on it after your final call to SetData.
                DataProviderDeferral deferral = providerRequest.GetDeferral();
                InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream();

                // Make sure to always call Complete when done with the deferral.
                try
                {
                    // Decode the image and re-encode it at 50% width and height.
                    IRandomAccessStream imageStream = await imageFile.OpenAsync(FileAccessMode.Read);
                    BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(imageStream);
                    BitmapEncoder imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, imageDecoder);
                    imageEncoder.BitmapTransform.ScaledWidth = (uint)(imageDecoder.OrientedPixelWidth * 0.5);
                    imageEncoder.BitmapTransform.ScaledHeight = (uint)(imageDecoder.OrientedPixelHeight * 0.5);

                    await imageEncoder.FlushAsync();

                    providerRequest.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream));
                }
                finally
                {
                    deferral.Complete();
                }
            }
        }

 

'Windows 8&8.1 > ETC' 카테고리의 다른 글

MTProto Mobile Protocol 번역 중  (2) 2014.06.03
Image Note  (0) 2014.05.12
Now FocusedElement, CurrentPage  (0) 2013.08.29
Custom ConfirmBox create  (0) 2013.08.21
patterns & practices: Prism for the Windows Runtime  (0) 2013.07.10
Microsoft .Net Framework 4.5 Quickstart Cookbook Review  (0) 2013.07.05
블로그 이미지

MVP kaki104

* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

1. GetFocusedElement

Windows.UI.Xaml.Input.FocusManager.GetFocusedElement()

현재 화면에서 포커스를 받고 있는 엘리 먼트를 반환 한다.

 

2. Window.Current.Content

Windows.UI.Xaml.Window.Current.Content

여러가지 활용이 가능

 

Frame인 경우

var frame = Frame ?? Windows.UI.Xaml.Window.Current.Content as Windows.UI.Xaml.Controls.Frame;

var page = (Windows.UI.Xaml.Controls.Page)frame.Content;

현재 페이지를 알 수 있음

 

var result = frame .Navigate(navigationType, navigationParameter);

페이지 네비게이션을 시킬 수 있음

 

3. Window.Current.Bounds

Windows.UI.Xaml.Window.Current.Bounds;

현재 윈도우의 크기, 해상도를 알 수 있음

 

4. GetRuntimeProperty

오브젝트에서 특정 프로퍼티 값 축출

public T GetPropertyValue<T>(object source, string propertyName)
{
    T returnValue = default(T);
    var pinfo = source.GetType().GetRuntimeProperty(propertyName);
    if (pinfo != null)
    {
        object[] indexArgs = {};
        var result = pinfo.GetValue(source);
        if (result != null)
        {
            returnValue = (T)result;
        }
    }
    return returnValue;
}

 

 

'Windows 8&8.1 > ETC' 카테고리의 다른 글

MTProto Mobile Protocol 번역 중  (2) 2014.06.03
Image Note  (0) 2014.05.12
Now FocusedElement, CurrentPage  (0) 2013.08.29
Custom ConfirmBox create  (0) 2013.08.21
patterns & practices: Prism for the Windows Runtime  (0) 2013.07.10
Microsoft .Net Framework 4.5 Quickstart Cookbook Review  (0) 2013.07.05
블로그 이미지

MVP kaki104

* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

사용자 정의 Confirm 박스를 만드는 방법에 대해 알아보자

 

앱을 개발하다 보면, Confirm을 해야 하는 경우가 발생하는데, 현재는 개발자가 만들어서 사용하는 방법 말고는 존재하지 않는다. ConfirmBox를 만들때 중요한 것은 사용자가 비동기 메소드를 만들고, 실행해서, 결과를 반환해야 한다는 것인데, 이 것을 만들기 위해서는 IAsyncInfo에 대한 내용을 알 필요가 있다.

 

1. IAsyncInfo Interface

참고 링크

http://msdn.microsoft.com/ko-kr/library/windows/apps/windows.foundation.iasyncinfo

 

Async 메소드의 결과를 처리하기 위해서는 기본적으로 IAsyncInfo 인터페이스를 반환해야한다. 이 인터페이스는 4개의 자식 인터페이스를 가진다.

 

 

* IAsyncAction 인터페이스

리턴 값이 없고, 비동기 Action이 완료되면 종료 한다.


* IAsyncActionWithProgress<TProgress> 인터페이스

리턴 값은 없는데, 진행 상황을 표시할 수 있는 프로그레스를 지원한다.


* IAsyncOperation<TResult> 인터페이스

리턴 값이 있는 비동기 작업을 지원한다.


* IAsyncOperationWithProgress<TResult, TProgress> 인터페이스

리턴 값이 있고, 진행 상황을 표시할 수 있는 프로그래세를 지원한다.


참고 링크

http://msdn.microsoft.com/ko-kr/library/windows/apps/br211924.aspx

 

위의 4개 중 3번째에 있는 IAsyncOperation을 이용해서 메시지 박스를 만들어 보자

 

2. SimpleConfirmBox.xaml

간단하게 UserControl를 이용해서 UI를 만들어 준다.

 

* Popup에 넣어서 사용하기 때문에 크기 계산을 위해 Height, Width를 입력했다.

* ViewModel은 화면이 생성되면서 함께 만들어 진다.

* ListBox의 ItemsPanel을 수정해서 가로로 표시 되도록 했다.

* ViewModel과의 Binding을 잘 살펴 본다.

 

<UserControl
    x:Class="PushpinSample.SimpleConfirmBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:PushpinSample"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Height="200"
    Width="400"
>
   
    <UserControl.DataContext>
        <local:SimpleConfirmBoxViewModel/>
    </UserControl.DataContext>

 

    <Grid Background="Gray">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="31*"/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>

 

        <TextBlock Text="{Binding Title}" Style="{StaticResource HeaderTextStyle}"/>
        <Border Grid.Row="1" Background="DarkGray" >
            <TextBlock Text="{Binding Message}" Style="{StaticResource ItemTextStyle}"/>
        </Border>
       
        <ListBox Grid.Row="2" ItemsSource="{Binding Buttons}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" HorizontalAlignment="Right">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>
    </Grid>
</UserControl>

3. SimpleConfirmBoxViewModel.cs

* ListBox의 SelectedItem과 바인딩이 되어있다.

* SelectedItem 프로퍼티가 변경되었을 때 Parent에 결과를 저장하고 팝업을 닫아 준다.

 

    public class SimpleConfirmBoxViewModel : PushpinSample.Common.BindableBase
    {
        public Popup Parent { get; set; }

        public string Title { get; set; }

        public string Message { get; set; }

        public IList<string> Buttons { get; set; }

 

        private string _selectedItem;
        /// <summary>
        /// Selected Item Test
        /// </summary>
        public string SelectedItem
        {
            get { return _selectedItem; }
            set { SetProperty(ref _selectedItem, value); }
        }

 

        public SimpleConfirmBoxViewModel()
        {
            if (Windows.ApplicationModel.DesignMode.DesignModeEnabled == true)
            {
                Title = "Test Title";
                Message = "Select your text";
                Buttons = new List<string>
                    {
                        "Test1",
                        "Test2",
                        "Test3",
                    };
            }
            else
            {
                this.PropertyChanged +=
                    (s, e) =>
                    {
                        switch (e.PropertyName)
                        {
                            case "SelectedItem":
                                if (SelectedItem != null)
                                {
                                    Parent.Resources.Add("Result", SelectedItem);
                                    Parent.IsOpen = false;
                                }
                                break;
                        }
                    };
            }
        }

    }

 

4. SimpleConfirmBox Method

 

        /// <summary>
        /// Simple ConfirmBox
        /// </summary>
        public Windows.Foundation.IAsyncOperation<string> SimpleConfirmBox(string title, string message, IList<string> buttons)
        {
            var bounds = Windows.UI.Xaml.Window.Current.CoreWindow.Bounds;

 

            //buttons가 null이면 바로 종료
            if (buttons == null)
            {
                return AsyncInfo.Run<string>(_ => Task.Run<string>(() => string.Empty) );
            }

 

            popup = popup ?? new Windows.UI.Xaml.Controls.Primitives.Popup();

            //UI 생성
            var content = new SimpleConfirmBox();

          //ViewModel
            var viewModel = (SimpleConfirmBoxViewModel)content.DataContext;
             //프로퍼티 설정

            viewModel.Title = title;
            viewModel.Message = message;
            viewModel.Buttons = buttons;

            viewModel.Parent = popup;
            //위치지정

            popup.VerticalOffset = (bounds.Height - content.Height) / 2;
            popup.HorizontalOffset = (bounds.Width - content.Width) / 2;
            popup.Child = content;

            //팝업이 닫혔을 때 이벤트 등록
            popup.Closed +=
                (s, e) =>
                {
                    object result;

                    //결과 확인
                    if (popup.Resources.TryGetValue("Result", out result) == true)
                    {

                        //task 종료
                        _taskCompletionSource.TrySetResult(result.ToString());
                    }
                    if (popup != null) popup = null;
                };

            //팝업 열기
            popup.IsOpen = true;

            //task 생성, 완료 될 때까지 대기

            return System.Runtime.InteropServices.WindowsRuntime.AsyncInfo.Run(token => WaitForClose(token));
        }

 

        //작업 완료 소스

        private System.Threading.Tasks.TaskCompletionSource<string> _taskCompletionSource;

 

        //작업 완료 테스크

        private System.Threading.Tasks.Task<string> WaitForClose(System.Threading.CancellationToken token)
        {
            _taskCompletionSource = new System.Threading.Tasks.TaskCompletionSource<string>();

            //취소 처리 등록
            token.Register(() =>
            {
                //CancelTokenRegister
                popup.IsOpen = false;
                _taskCompletionSource.SetCanceled();
                popup = null;
            });
            return _taskCompletionSource.Task;
        }

 

5. 사용하기

 

        private async void pushpinTapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
        {
            var result = await SimpleConfirmBox("Confirm", "Select your phone", new List<string> { "Windows Phone", "iPhone", "Android", "Etc" });
            MessageDialog dialog = new MessageDialog(string.Format("Your phone is {0}", result), "Information");
            await dialog.ShowAsync();
        }

 

 

 

 

블로그 이미지

MVP kaki104

* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

1. 서론

 

 

우선 프리즘에 대해서 이야기를 하기전에 patterns & practices라는 부분에 대해 살펴 보기로 하자.

http://msdn.microsoft.com/en-us/library/ff921345.aspx

한마디로 정의를 해보자면 Microsoft platform으로 디자인과 개발을 할때 사용할 패턴과 사례를 추천하는 것이다.

솔루션 개발, 클라우드 개발, 데스크탑 개발, 폰 발, 서비스 개발, 웹 개발 등 각 부분별로 여러가지 내용들이 있는데 그 중에서도 Prism이 중요하게 다루어 지고 있다는 것을 알아야 할 것이다.(한마디로 왕추천이라는 것이다)

patterns & practices의 자세한 내용은 위의 링크를 통해 알 수 있다.

 

Prism 4.1 - Developer's Guide to Microsoft Prism

http://msdn.microsoft.com/en-us/library/gg406140.aspx

프리즘의 현제 버전이다. 프리즘 4.1로 개발 가능한 환경은 Visual Studio 2010, .Net Framework 4.0, WPF, Silverlight, Window Phone 7 이라는 설명이 적혀 있다. 그런데.. 얼마전 Store app 개발에 사용가능 한 Prism nuget package가 등록 되었다.

 

patterns & practices: Prism for the Windows Runtime

http://prismwindowsruntime.codeplex.com/

문서 링크로 하단부에 pdf로 메뉴얼을 제공한다.

http://msdn.microsoft.com/en-us/library/windows/apps/xx130643.aspx

위의 링크 페이지에서 소스를 다운로드 받아서 실행하면 위와 같은 앱이 동작 된다. 가상 회사에서 운영하는 쇼핑몰 앱으로 기본 적인 상품 목록 조회, 장바구니, 결제, 배송에 이르기까지 모든 작업을 앱에서 처리하고 있다.

 

2. 왜 Prism에 대해서 이야기를 하려고 하는가?

처음 프리즘을 접하게된 계기는 교육센터를 통해서 알게되었고, Silverlight, ERP 프로젝트를 진행하면서 처음으로 Prism 4.1 MEF Container를 적용한 프레임웍을 만들었다. 새로운 개념, 사용 방법 등을 익히고, 개발했기 때문에 처음에는 고생을 많이 했다. 개발 시작 후 적응 기간이 끝나고나니, 여러가지 좋은 점들이 눈에 들어오면서.. 아 이래서 사용하는 구나..라고 생각했다.

 

ERP 프로젝에서 Out 후 몇 개월 후에 다시 Silverlight 프로젝트를 시작했다.

보안회사의 모니터링 시스템으로 많은 개발 인원과 시간을 들여서 만들어 놓은 시스템이였고, 성능개선과 추가 개발을 위한 투입이였다. 처음 ERP 프로젝트와 모니터링 시스템은 서로 다른 개발사와 인력이 진행한 프로젝트였다.

 

여기서 생각해 보자, 만약 여러분이 알고 있는 프로젝트였다면, 두개의 프로젝트 프레임웍이 어떨 것이라고 생각이 되나? 아마, 각 프로젝트의 프레임웍은 서로 많이 달라서 적응하는데 시간이 필요할 것이라고 생각될 것이다.

하지만, 다행히 두개의 프로젝트는 모두 Prism을 기반으로 만들어진 것이였고, 그렇기 때문에 적응기간이나 내용 파악하는 것이 무척 쉬웠다. 

처음 고생을 해서 Prism을 익혀 놓지 않았더라면? 보안회사 프레임웍의 기본이 Prism이 아니였더라면? 생각하기도 싫을 정도다.

 

닷넷을 이용한 큰 프로젝트에는 개발 시작전에 프레임웍을 만들고 진행을 하게되는데, 대부분은 그 프레임웍이 서로 달라 개발자 경험을 이어나가기 어려운 것이 현실이다. 개발자는 프로젝트에 투입이 될 때 마다 새로운 프레임웍을 익히고, 배워야 한다. 과거에는 이런 것이 당연시 되었지만, 이제 시대는 변하고 있다. Prism이 모든 프로젝트의 기본이 된다면, 개발, 유지보수 하기위한 인적자원을 확보하는 것은 어렵지 않을 것이라 생각한다.

 

 

3. Prism for Windows Runtime을 사용해서 얻을 수 있는 이점

. 일반적인 Windows 스토어 앱 개발 시나리오를 알 수 있다.

. 앱을 독립적, 협업전 조각들로 구성하여 만들 수 있다.

. MVVM을 지원하는 프리젠테이션, 프리젠테이션 로직, 그리고 모델을 구성할 수 있다.

. 일관되고 높은 품질의 을 생산하는 기초 인프라를 사용할 수 있다.

. Microsoft.Practices.Prism.StoreApps 클래스 라이브러리는 lifecycle 관리, Windows store app의 코어 서비스,  MVVM을 지원한다.

. Microsoft.Practices.Prism.PubSubEvents는 Portable Class Library이며, 앱에서 loosely coupled로 구성된 각 컴포넌트 사이에 커뮤니케이션을 담당한다. 이 라이브러리는 다른 라이브러리에 대한 종속성이 없고, Microsoft.Practices.Prism.StoreApps 라이브러리가 없어도 사용이 가능하며, PCL로 만들어져있어서 다른 플랫폼에서도 사용이 가능하다.

 

 

이번 포스트는 전체적인 내용을 정리하는 용도로 보면 될 것 같다. 시간이 허락하는 대로, 실제 구현 방법에 대해서 알아보는 포스트를 추가하도록 하겠다.

 

 

 

 

블로그 이미지

MVP kaki104

* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

 

 

Microsoft .Net Framework 4.5 Quickstart Cookbook

http://link.packtpub.com/ehKdj3

 

요즘은 최신 기술에 대한 국내 번역본 책이 잘 나오지 않고 있어서, 원서를 바로 읽는 경우가 많이있다. 그 중에 .Net Framework 4.5에 대한 책이 출판이되었다. 영문 책에 대한 리뷰이지만 많은 도움이 되는 리뷰를 작성해 보려고 한다.

 

0. Overview

나는 새로운 기술에 대해 배워야 하는 경우 필히 2권을 구입하는데, 한권은 얇고 읽기 쉬운 책이고, 다른 하나는 두껍고 자세하게 나온 책이다.

 

이 책은 처음 이야기한 얇고 읽기 쉬운 책으로 총 226 Page 분량이다. 각 단원마다 시작하기 좋은 간단한 예제들을 담고 있다. 따라하기 쉽게 하나 하나 자세하게 그림과 소스 코드로 작성을 해 놓았고, 원리가 어떻게 돼는지와 추가사항 까지도 기술되어 있어, 처음 읽는 독자들이 쉽쉽고 빠르게 이해할 수 있도록 배려한 것이 느껴진다. 또한 .Net Framework 4.5를 사용하는 여러 플랫폼들에 대해 다루었기 때문에 처음 접근하는데 많은 도움을 줄 수 있는 책인것 같다.

 

약간 아쉬운 점은 화면 중 몇몇 그림이 Visual Studio 2012 Update 2의 화면이 아니라는 점이다. 그런 부분은 다음 버전에서는 Update 2의 화면과 이전 화면을 각각 표시하는 배려가 필요할 것 같다.

 

이 책은 .Net Framework 4.0까지는 사용을 해본 개발자에게 유용할 것같다.

 

1 Windows Store Apps

기본적인 Store App을 개발하는 과정을 하나하나 화면으로 설명을 하고 있다. 또한, 중요하지만 개발 하면서 잘 생각하지 못했던 lifecycle에 대한 내용과 Tile, Toast Notification 등에 대해 설명되어 있다.

처음 Store app을 개발을 하기위한 지침서로 활용하면 좋을 것 같다.

 

2 Exploring the Top New Features of the CLR

Portable Class Library, ZipArchive, Async and await 등에 대해 설명되어 있다.

멀티 플랫폼 개발에 꼭 필요한 Portable Class에 대해 기본적인 내용과 Async, await 사용 방법에 대해서는 간단한 예제로 구성되어 있으며, 개발자 스스로 생각할 수 있도록 만들어 준다.

 

3 Understanding the New Networking Capabilities

HttpClient에 대해 설명되어 있다.

기존 WebClient에 비해 사용하기 좋은 HttpClient를 사용하기 쉽게 설명해 놓았다.

 

4 Understanding the  new features of  Entity Framework 5.0

Code-First에 대한 기본적인 내용과 Code-First Migrations 방법에 대해 설명되어 있다.

기존 Code-First 방법으로 개발을 하던 개발자에게, Code-First Migrations은 여러가지 도움이 될 수 있는 내용이다.

 

5 Understanding the New Features of ASP.NET

ASP.Net의 새로운 기능에 대해 설명되어 있다.

 

6 Implementing WPF's new features

WeakEvent, Data binding to static properties, Throttling data source update delays, LiveShaping 등에 대해 설명되어 있다.
Store app이나 Silverlight에서도 사용이 되면 좋을 것 같은 내용들로 기존 WPF 개발자들에게 많은 도움이 될 것 같다.

 

7 Applying the New  WCF Features

Using the asynchronous features of WCF, Using WebSockets, Using Contract First development에 대해 설명되어 있다.

WCF Service를 비동기로 처리하고, WebSocket을 이용하는 방법은 서비스를 개발하는 개발자에게 많은 도움이 될 것 같다.

8 Creating and Hosting Our First ASP.NET  Web API

WebAPI에 대해 설명되어 있다.

HTTP Service를 기반으로 만들어 졌으며, 내가 가장 많이 사용하는 서비스이다. 처음 접하는 개발자에게 도움이 될 것 같다.

 

9 Using the New Capabilities of WF

Workflow Foundation에 대해 설명되어 있다.

WF는 프로세스 관리를 비주얼하게 만들어 주는 툴인 것 같다. 나도 사용을 해보아야 하는 부분이다.

 

블로그 이미지

MVP kaki104

* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

다음 카페 (닷넷 프로그래머 모임)에 올린 내용입니다.(신청은 아래 링크를 이용하시기 바랍니다.)

http://cafe321.daum.net/_c21_/bbs_read?grpid=8C6Q&mgrpid=&fldid=5wZP&page=1&prev_page=0&firstbbsdepth=&lastbbsdepth=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz&contentval=0008Mzzzzzzzzzzzzzzzzzzzzzzzzz&datanum=518&listnum=20&listSortType=

 

안녕하세요. 윈8앱 개발에 관심이 있는 분들이 많이 계신 것을 알게 되었습니다. 리플 남겨주신 분들께 감사드립니다.

그래서, 앞으로의 방향을 먼저 이야기를 하려고 합니다.

 

1. 목표 :

1-1. 2013년내 자신의 앱을 스토어에 1개 이상 등록하는 것

1-2. Korea Bus Information 앱에 지방 정보 추가(옵션)

 

2. 앱종류 :

Windows 8 Store app XAML

 

3. 방향 :

3-1. 우선 스터디 형태로 시작을하려고 합니다. 처음부터 세미나를 하게 되면, 주제를 정하기도 어렵고, 어느 레벨에 맞춰야 할지도 모르기 때문입니다.

3-2. 스터디 맴버가 정해지면, 개발에 필요한 사항을 정리해서 공유하고, 그 부분을 우선 공부를 합니다.(포스트가 필요한 부분은 제가 하겠습니다) 그리고, 기본이 끝나면 공통 셈플 프로젝을 진행하고, 다음에 개인 프로젝을 진행하도록 계획을 잡고 있습니다.

3-3. 스터디 중심은 게시판에 두어서, 지방에 거주하시는 분들도 함께 참여할 수 있도록 하겠습니다.

3-4. 오프라인 모임은 맴버 구성 후 한번하고, 한달에 한번 정도 토요일 하루 종일(10시-6시) 강남 포스코 사거리에 있는 MS 미팅룸을 빌려서 할 예정입니다.

 

4. 스터디 참여 신청전 고려 하실 사항 :

4-1. 매일 하루에 2시간 이상 작업이 가능하신 분이면 좋겠습니다. (공부는 꾸준히 길게..)

4-2. 개발하려는 이유가 확실한 분이면 좋겠습니다. (저는 노후대비를 위해 만들고 있습니다.)

4-3. 스터디 과정에서 생산된 게시물들은 모든 회원에게 공개를 할 예정이오니, 스터디에 가입되어야지만 배우실 수 있는 것은 아님을 미리 알려드립니다.

4-4. 저의 구박과 괴롭힘이 있을 수 있습니다. (공부 않하고 노는 것은 포기하셔야 합니다.)

4-5. 공부할 내용 많습니다. 단순히 앱 개발만 하는 것이 아니라, 그 것을 만들기 위한 기반 지식에 대해서 대부분 다룰 생각입니다. MVVM pattern,  Nuget packages, Portable Class Libraries,

 

5. 스터디 참여 신청 :

스터디 참여를 원하시는 분은 리플로 신청을 해주시기 바랍니다. 1월 19일까지 신청을 받고, 26일 정도에 오프라인 모임을 한번 하도록 하겠습니다.

블로그 이미지

MVP kaki104

* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

Error message :

An exception of type 'Windows.UI.Xaml.Markup.XamlParseException' occurred in UPax.exe but was not handled in user code

WinRT information: E_UNKNOWN_ERROR [Line: 45 Position: 99]

Additional information: Unspecified error

If there is a handler for this exception, the program may be safely continued.

 

에러 메시지만으로 감을 잡기가 좀 어렵다.

지난번에 해결한 문제인 것 같은데, 기억이 나지 않음.

 

에러가 난 부분

<ComboBox MinWidth="125" SelectedIndex="0"
      Background="Transparent" BorderBrush="Transparent" Foreground="{StaticResource NONE}"
      Style="{StaticResource TitleComboBoxStyle}" FontSize="21.333" FontWeight="Bold"
      ItemContainerStyle="{StaticResource TitleComboBoxItemContainerStyle}" 
      ItemsSource="{Binding OrderKind}" DisplayMemberPath="CodeName" SelectedItem="{Binding SelectedOrderKind}" />

 

콤보박스, 리스트뷰, 그리드뷰 등의 컨트롤에서 ItemsSource에 binding을 하고 SelectedIndex="0"으로 입력해 놓았을 경우 발생하는 오류

 

블로그 이미지

MVP kaki104

* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

1. Caliburn Micro WPF, Silverlight, WP7 and WinRT-Metro made easy.

http://caliburnmicro.codeplex.com/

 

2. callisto · GitHub

https://github.com/timheuer/Callisto

 

3. CH3COOH-WriteableBitmapEffector

https://github.com/CH3COOH/WriteableBitmapEffector

 

4. Korean String Extension for .NET

http://kstring.codeplex.com/

 

5. MVVM Light Toolkit - Download MVVM Light Toolkit V4 RTM

http://mvvmlight.codeplex.com/releases/view/90815

 

6. WinRT File Based Database

http://winrtdatabase.codeplex.com/

 

7. WinRT XAML Toolkit

http://winrtxamltoolkit.codeplex.com/

 

8. WinRtBehaviors

http://winrtbehaviors.codeplex.com/

 

9. WinRTTriggers - Home

https://winrttriggers.codeplex.com/

 

블로그 이미지

MVP kaki104

* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

앱을 개발할 때 워낙에 여러가지 상황들에 대해서 디버깅을 해야하기 때문에 그동안 찾아 내서 사용하던 방법들을 정리해 보았다.

 

1. Remote Machine Debug

ARM 장비에서 동작하는 것을 디버깅 하기 위해서는 이 방법 뿐이 없다.

 

참고 자료

Remote machine debugging with Windows 8

http://darkgenesis.zenithmoon.com/remote-machine-debugging-with-windows-8/

 

 

 

1) 앱을 실행할 장비에 remote tools를 다운받아서 설치한다. CPU별로 툴이 존재하니 확인해서 사용한다.

 

2) 설치하고 검색 참에서 remove라고 입력하면 디버그 툴 아이콘이 보인다. 눌러서 실행한다.

 

3) Visual Studio Remote Debugging Monitor가 실행되면, 그곳에 표시되는 머신의 주소를 확인한다.

(위의 경우 JACKSON-WIN8이라는 머신이다. 뒤에 4016은 디버깅 툴에서 사용하는 포트 번호인데, 기본적으로는 모두 허용이 되도록 되어 있으니 신경쓰지 않아도 된다.)

 

4) VS2012에서 Local Machine를 누르고, Remote Machine를 선택 한다.

 

5) F5를 눌러서 디버그 실행한다.

 

6) 처음에 실행 할 때는 Remote Debugger Connections라는 연결 창이 뜨는데, address에는 JACKSON-WIN8를 입력하면 된다.

(그런데, 만약 네트워크가 다른 경우에는 연결되지 않는다. 데스크탑과 머신이 동일한 네트워크에 연결되어 있어야지만 가능하다)

 

7) 이 후에 다시 물어보지 않는데, address 부분을 다시 설정하기 위해서 Project -> Properties -> Debug Tab을 눌러서 보면 내용을 입력 할 수 있다.(직접 입력을 하기 보다는 오른쪽에 Find 버튼을 이용해서 찾아내는 것을 권장한다.)

 

 

2. Do not launch, Debug mode

앱이 실행되지 않은 상태에서 검색 참에서 앱으로 검색을 하면, 앱이 구동이 되면서 검색을 실행 시켜야 한다.

이 경우 디버깅을 하기 위해서 사용되는 모드이다.

 

 

Project -> Properties -> Debug Tab -> Start Action -> Do not launch, but debug my code when it starts -> check

 

후 F5를 눌러서 디버그 실행한다.

이 후에 검색 참에서 검색 단어를 입력하고 앱을 선택하면 앱이 시작되는 App.xaml.cs의 OnSearchActivated 메소드에서 부터 디버깅을 할 수 있다.

 

** Uninstall and then re-install my package.....

이 옵션을 체크하면, 앱 디버깅 시작 할때 항상 처음과 같은 환경에서 시작할 수 있다.

 

 

3. Debug Location Toolbar

Visual Studio 2012의 상단 툴바에서 마우스 오른쪽 버튼을 누르면 추가할 수 있는 툴바 목록이 보이는데 그 중에 Debug Location을 선택해서 추가한다.

 

 

툴바를 추가하고 실행하면 위와 같이 표시가되는데 Suspend를 클릭하면 즉시 Suspend 모드로 전환된다.

또한, 오른쪽에 ▼를 누르면, Resume, Suspend and shutdown 등의 상태도 강제로 만들 수 있다.

만약 BackgroundTask를 사용하는 앱이라면 이 곳에서 BackgroundTask의 트리거를 발생 시킬 수도 있다.

 

 

'Windows 8&8.1 > ETC' 카테고리의 다른 글

Windows 8 Store app, xaml - runtime error  (0) 2012.12.18
Recommend Nuget Packages  (0) 2012.11.29
Visual Studio 2012 Debuging tip  (0) 2012.10.26
Windows 8 Store app registing  (0) 2012.10.26
Portable Class Library Tips  (0) 2012.09.19
Windows 8 .Net 4.5 tips  (0) 2012.09.08
블로그 이미지

MVP kaki104

* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

티스토리 툴바