[StartD2D-8] 투명 이미지 다루기

DirectX 11 2011. 9. 28. 08:00 Posted by 알 수 없는 사용자


이번 시간에 다룰 것은 투명 이미지 입니다.
얼마 전 댓글로 문의하신 내용인데 답변을 달기가 조금 부족한 듯 싶어서,
이렇게 별도로 아티클(?)로 남깁니다.

예전에 Win32 API 로 알파가 있는 이미지를 표현하는 작업은 무척 번거로운 작업이였습니다.
이미지 색상에 알파가 고려되어지면, 각 색상 성분마다 알파 연산을 해주어야 합니다.
또한 RGB 각 성분이 8비트씩 사용하는데 A성분이 추가되어지면서,
다시 8비트의 추가 데이터들이 각 색상값들에 필요하게 됩니다.
용량이 커지면 성능에 문제가 생기게 되는 것은 당연한 일입니다.

그래서 이를 흉내내기 위한 대안으로 마련된 것이 ColorKey 라고 불리는 기법입니다.
이 기법은 이미지 내의 특정 색상을 표현하지 않음으로써 구현됩니다.
아래의 그림을 예로 들어보겠습니다.



이미지 내에서 배경이 모두 붉은 색으로 되어있습니다.
이런 경우에 붉은 색을 ColorKey로 지정해서 데이터를 읽지 않는 것입니다.
그러면, 캐릭터 관련 색상만 메모리에 기록되게 됩니다.
이 방법을 사용하면 24비트 비트맵만으로 캐릭터를 표현할 수 있습니다.
주의해야 할 점은,
ColorKey 에 해당하는 색상 값을 아티스트들에게 사용하지 말 것에 대한
사전 협의가 있어야 겠지요.

아쉽게도(?) Direct2D에서 이 ColorKey 사용에 대한 API를 찾지 못했습니다.
( Direct3D 에는 있습니다.^^ )

사실 ColorKey 방식이 널리 이용되긴 하지만,
근본적으로 알파 처리를 이용하며 관련 효과를 모두 구현할 수 있습니다.
그렇기 때문에, 굳이 ColorKey 를 염두할 필요성은 없습니다.

이번에 샘플에 사용한 이미지는 알파가 있습니다.

 


우측의 흑백 이미지가 알파 성분만 표현한 이미지 입니다.
당연히 검은 부분은 알파 성분이 0 이기 때문에
해당 영역은 화면에 표현되지 않을 것입니다.

이번에 살펴볼 샘플은 아래와 같습니다.



똑같은 이미지 파일에서 데이터를 읽었지만,
위의 그림은 알파 처리가 되어서 동물 부분만 출력이 되었습니다.
하지만 아래 부분은 알파처리가 이루어지지 않아서 이미지 영역이 모두 출력되었습니다.

이번 결과의 차이는 WIC를 이용한 것입니다.
우리가 지금껏 무심코(?) 지나쳤던 WIC의 컨버터를 기억하십니까?


제가 이번 샘플을 위해서 약간 개량을 했습니다.
두 사용법에 별 차이는 없지만, GUID_WICPixelFormat... 부분이 보일 것입니다.
이 인자가 바로 두 이미지의 차이를 만들어낸 부분입니다.
즉, 컨버터에서 데이터를 어떤 포맷으로 읽어들일지를 설정하는 부분입니다.

첫번째는 알파처리를 수행하는 방법으로 데이터를 읽어들입니다.
GUID_WICPixelFormat32bppPBGRA는
4개의 색상 채널을 가지고 채널당 8개의 비트를 가지고 있으며,
픽셀 당 32비트를 표현하며 UINT로 각 색상이 저장되어 있는 포맷을 의미합니다.

두번째 알파처리를 하지 않는 GUID_WICPixelFormat32bppBGR은
3개의 색상 채널과 8비트로 각 채널을 표현하는 32비트 픽셀 포맷을 의미합니다.
이 포맷도 UINT로 각 색상 성분을 표현합니다.
이 경우에는 알파 채널이 존재하지만, 실제로 읽어들이지 않습니다.
즉, 알파 채널을 무시하는 것입니다.

관련 포맷이 매우 방대하기 때문에, 여기서 더 이상 자세히 다루지 않습니다.
중요한 것은 이 컨버터 덕분에 별다른 수고 없이 알파 처리를 쉽게 수행할 수 있습니다.

Direct2D 가 사실 많은 부분을 우리가 모르게 자동적으로 처리하는 부분이 많이 있습니다.
Direct2D에서는 프로퍼티를 생성하는 부분들이 많이 있습니다.
예를 들면 다음과 같은 것들입니다.



사실 이 프로퍼티 정보들을 별도로 설정하지 않으면,
자동적으로 Direct2D에서 처리를 해버립니다.
혹은 디폴트 생성자들이 모두 들어있습니다.
자동적으로 처리되는 부분들 이외의 기능이 필요하다면,
이들을 잘 제어해야만 하겠지요..^^

부족하지만 샘플을 참조해 드립니다..^^

외부 콘텐츠 형식(3)-Visual Studio 2010

SharePoint 2010 2011. 9. 27. 08:30 Posted by 알 수 없는 사용자

외부 콘텐츠 형식(3)-Visual Studio 2010

외부 콘텐츠 형식을 Visual Studio 2010에서 구성해보도록 하겠습니다. Visual Studio 2010을 이용하여 SharePoint 빈 프로젝트를 생성하고 새 항목 추가에서 비즈니스 데이터 연결 모델을 선택하고 “ProductModel” 로 이름을 지정합니다.

생성된 결과는 아래와 같습니다.

BDC 디자인 창의 Entity1“Product”로 변경합니다. 그리고 Identifier1 속성을 “ProductID” 로 변경하고 속성 창에서 System.Int32로 데이터 형식을 변경합니다.

솔루션 탐색기의 Entity1.cs 파일을 Product.cs 로 변경하고 아래와 같이 속성을 추가합니다. 실제 외부 목록이나 외부 데이터 열에서 표시할 데이터의 속성이며 외부 데이터 원본으로부터의 데이터를 가져와서 ReadList, ReadItem 메서드에서 처리될 클래스 속성입니다.

BDC 탐색기로 이동해서 ReadItem, ReadList 속성을 위의 클래스에 맞게 수정하면 ProductService.cs 클래스의 메서드가 변경되게 됩니다.

BDC 탐색기가 안보인다면 보기 메뉴의 다른 창에서 BDC 탐색기를 클릭하거나 bdcm 파일에서 BDC 탐색기 링크를 클릭합니다.

ReadItem 메서드의 @id 부분을 @ProductID로 변경하고 Identifier1 ProductID 로 변경하고 속성 창에서 데이터 형식을 System.Int32로 변경합니다.

@returnParameter 를 확장해서 Entity1 Product 로 변경하고 속성 창에서 데이터 형식은 현재프로젝트의 Product 클래스를 선택합니다. 그리고 BDC 탐색기의 Product 를 오른쪽 클릭하여 TypeDescriptor 추가를 클릭하여 속성을 추가하고 이름과 데이터 형식을 Product 클래스의 속성과 일치시켜줍니다.

그리고 BDC 탐색기의 ReadList 메서드 아래의 EntityList ProductList로 이름을 변경하고 형식 이름을 현재 프로젝트의 Product 클래스를 지정합니다. 그리고 위에서 생성된 Product 를 오른쪽 클릭하여 복사하고 ReadList 메서드 아래 ProductList 에 붙여넣기 합니다.

이제 솔루션 탐색기의 ProductService.cs 클래스의 코드로 이동하면 Entity1에 대한 기존 메서드 에 해당하는 부분은 삭제합니다.

이제 외부 데이터 원본을 연결하여 해당 제품과 제품 목록을 반환되도록 ADO.NET 코드를 아래와 같이 작성합니다.

프로젝트를 배포하고 BCS 서비스 응용 프로그램에 보면 Product가 아래처럼 생성된 것을 알 수 있습니다. 크롤링은 아니오로 되어 있으며 검색을 위해서는 추가 메서드를 구성해야만 합니다.


Visual Studio 2010을 통해 비즈니스 데이터 연결 모델을 통해 생성한 외부 목록 결과입니다.

Visual Studio 2010의 비즈니스 데이터 연결 모델에 대한 내용을 간단하게 알아보았습니다. 필터와 검색 등에 대한 내용은 더 추가해야 합니다. 다양한 외부 데이터 원본에 대해서 Visual Studio 2010을 통해 복잡한 로직을 구성하여 외부 데이터를 손쉽게 연결할 수 있습니다.



[StartD2D-7] 변환의 중심과 확대/축소/찌그러짐

DirectX 11 2011. 9. 26. 08:00 Posted by 알 수 없는 사용자


< 변환의 중심 점은 어디인가? >

Direct2D의 변환과 관련된 API는 모두 변환을 수행할 중심점을 함수 인자로 요구를 합니다.
그렇다면, 이 중심점은 스크린 기준에서 정의되어지는 것일까요?

다음과 같은 다람쥐 그림이 있다고 가정해 보겠습니다.


이 그림은 ( 100, 100 ) 의 크기로 그려지기를 원한다고 가정해 보겠습니다.

 


그리고 우리의 모니터에 ( 300, 200 ) 위치에 그려지기 원하도록 설정하겠습니다.
그러면, 우리에게 변환을 위한 중점을 설정하기 위한 기준 좌표는 어떻게 설정되어야 할까요?
그림의 좌측 상단을 변환의 중점으로 원한다면 ( 300, 200 )으로 설정하면 될까요?
그림의 좌측 상단이 변환의 중점이 된다는 말의 의미를 잘 되새겨 보시기 바랍니다.

그림의 중심을 기준으로 중점을 설정해 두는 것이 훨씬 쉬운 개념으로 변환할 수 있습니다.
즉, 위의 그림에서 변환의 중심이 되는 좌측 상단은 좌표는 ( 0, 0 ) 이 되는 것입니다.
만약, 우측 하단이 변환이 중심이 되길 원한다면 ( 100, 100 )을 설정하면 됩니다.

앞서 살펴 보았던 샘플에는 이 의미를 그냥 넘겼지만
이번에 제공되는 샘플에서는 이를 고려해서 모두 작성했으니,
유심히 살펴보시기 바랍니다.^^

우리는 이 개념을 다음과 같이 지금까지 사용하고 있었습니다.


D2D1_RECT_F 정의의 변수가 보이시나요?
바로 이 dxArea 를 기준으로 변환이 되는 중점을 설정하는 것이 이해하기가 편리합니다.^^

이번 샘플은 지난 번 샘플의 연장에 있습니다.
지난 번 샘플에서 이번 내용과 관련된 부분을 추가 했습니다.

 




< Scale( 확대/축소 ) >

확대/축소 작업은 1.0을 기준으로 이루어집니다.
1.0 보다 작으면 축소가, 1.0보다 크다면 확대가 이루어 집니다.
이 작업은 D2D1::Matrix3x2F::Scale() API를 통해서 이루어 지는데,
역시나 변환의 중점을 요구합니다.^^



만약 좌측 상단을 기준으로 확대를 하면 다음과 같은 개념입니다.






< Skew( 찌그러뜨리기 ) >

마지막 변환은 찌그러뜨리기 작업입니다.
이는 Matrix3x2F::Skew() API를 통해서 설정할 수 있습니다.
함수 인자로 받는 것은 X축과 Y축의 찌그러질 각도와 역시나 기준이 되는 중점입니다.



역시나 변환이 되는 중점에 따라 결과가 변합니다.
아래의 그림은 30도씩 찌끄러뜨린 결과입니다.
첫번째는 X축만 적용한 것이고, 두번째는 Y축을,
세번째는 X와 Y축 모두를 30도씩 찌그러뜨린 결과입니다.



부족하지만, 제가 작성한 샘플을 첨부해 드립니다.^^


 

[미리 보는 C++11] 4. constexpr - 2

C++0x 2011. 9. 23. 09:30 Posted by 알 수 없는 사용자

constexpr를 클래스에 사용


constexpr을 클래스에서 사용하면 클래스를 정수로 사용할 수도 있으며 메타 템플릿 프로그래밍에서는 이전에는 복잡하게 처리하던 것을 아주 간단하게 처리할 수도 있습니다. C++ 메타 템플릿 프로그래밍에 관심이 많구나 자주 사용하고 있는 분들에게는 constexpr 덕분에 프로그래밍이 한결 편해지리라 생각합니다.

 

아래의 코드는 Integer 이라는 클래스를 constexpr을 사용하여 정수처럼 사용 합니다.

class Integer

{

private :

    int value ;

 

public :

    constexpr Integer() : value() { }

    constexpr Integer( int value ) : value(value) { }

 

    constexpr operator int() { return value ; }

} ;

 

int main()

{

    constexpr Integer size = 5 ; // 컴파일 타임에 정수로

 

    int x[size] ; // Integer::operator int()가 호출된다

 

    Integer object ; // 일반적인 클래스 인스턴스 화. 실행 시에 처리

    int y[object] ; // 당근 에러

}

출처 : http://cpplover.blogspot.com/2010/11/gccniconstexpr.html

 


또 메타 템플릿 프로그래밍에서는 아래와 같이 사용할 수도 있습니다.

#include <iostream>

 

struct pi {

    static constexpr double value = 3.14;

};

 

template <const double& r>

struct circle_area {

    static constexpr double value = r * r * pi::value;

};

 

struct radius {

    static constexpr double value = 2.5;

};

 

int main()

{

    constexpr double result = circle_area<radius::value>::value;

 

    static_assert(result == 19.625, "not equal");

    std::cout << result << std::endl;

}

출처 : http://d.hatena.ne.jp/faith_and_brave/searchdiary?word=constexpr&.submit=%B8%A1%BA%F7&type=detail

 

 

constexpr은 컴파일 할 때 결과가 이미 결정 나는 것은 컴파일 타임 때 처리를 해주어 실행 시에 불필요한 처리를 막아주고, 기존의 메타 템플릿 프로그래밍으로 까다롭게 만들었던 것을 아주 쉽게 구현할 수 있게 해줍니다.

 

C++11에서는 constexpr을 잘 사용하면 기존 보다 더 뛰어난 프로그래밍을 할 수 있으니 깊게 파고들 가치가 있다고 생각합니다.

SQL Azure Data Sync (3) – 고려사항

Cloud 2011. 9. 22. 08:30 Posted by 알 수 없는 사용자

SQL Azure Data Sync (3) – 고려사항

SQL Azure Data Sync에 대한 고려사항을 한번 뽑아보았습니다.

l 비용

현재 SQL Azure Data Sync CTP2 이며 현재 시점에서는 별도 비용은 없습니다. SQL Azure Data SyncHub 데이터베이스로 반드시 SQL Azure가 필요합니다. SQL Azure 데이터베이스의 비용은 제쳐두더라도 데이터 동기화 때문에 네트워크 트래픽이 발생하므로 트래픽 비용은 발생하게 됩니다.

l 데이터 형식

자세한 정보는 아래 주소를 참고하시면 됩니다.

http://social.technet.microsoft.com/wiki/contents/articles/1922.aspx

구분

내용

Exact Numbers

Supported: bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint.

Approximate Numbers

Supported: float, real.

Date and Time

Supported: date, datetime2, datetime, datetimeoffset, smalldatetime, time.

Character Strings

Supported: char, varchar, text.

Unicode Character Strings

Supported: nchar, nvarchar, ntext.

Binary Strings

Supported: binary, varbinary, image.

Spatial

Supported: no supported spatial data types

Other Data Types

Supported: sql_variant, table, uniqueidentifier, xml.

Spatial Data Types

Not supported: geography, geometry.

FileStream

Not supported

CLR UDT

Not supported

SQL UDT

Not supported

XML Data Types

Not supported: XmlSchemaCollection

Other Data Types

Not supported: cursor, timestamp, hierarchyid

l 백업과 복원

SQL Azure Data Sync 는 백업 용도는 아닙니다. 저장 프로시저와 같은 SQL 개체를 백업해주시는 않습니다. 속도도 빠르지 않습니다. 물론 복원도 마찬가지 입니다.

l 데이터 보안

데이터 암호화: 암호화된 연결이 기본

데이터 액세스 인증: SQL 계정만 지원

에이전트 인증: HTTPS로 통신, Management Portal에서 생성된 토큰을 통해 인증


[StartD2D-6] 이동/회전 변환 이해하기

DirectX 11 2011. 9. 21. 08:00 Posted by 알 수 없는 사용자


 

행렬의 등장

기존의 윈도우 애플리케이션 개발자가 Direct2D를 접할 때,
가장 생소한 개념은 행렬( Matrix ) 일 것입니다.

즉, 아래의 API 이겠죠?

<코드>

::g_ipRT->SetTransform( ::D2D1::Matrix3x2F::Identity() );

</코드>

우리는 항상 렌더링 작업을 하기 전에, 이 작업을 해주었습니다.
이것은 과연 무슨 의미를 가지고 있는 것일까요?  

불행하게도(?) Direct2D에서 각종 변환 작업을 위해서는 행렬( Matrix )을 사용합니다.
저는 고등학교 2학년 학기 초에 배웠던 기억이 있습니다.
그 때는 주로 연립 방정식의 해를 구하기 위해서 풀이 방법을 익혔습니다.
아마 대부분 저와 비슷하실 것이라 생각이 듭니다.

왜 뜬금없이 행렬이 등장했는지를 언급하고자 하면, 상당히 고통스럽습니다.^^
저는 이 행렬에 대한 깊은 이해를 원하지 않습니다.
제가 원하는 것은 이 행렬 관련 API를 이용해서 화면 상에 나오는 오브젝트들의
이동이나 회전 등과 같은 변환을 표현 할 수 있다는 것만 아셨으면 좋겠습니다.^^


Direct2D 에서는 3ⅹ2 행렬을 사용합니다.
행렬의 각 성분들은 아래와 같습니다.  

M11

Default : 1.0

M12

Default : 0.0

M21

Default : 0.0

M22

Default : 1.0

M31

OffsetX : 0.0

M32

OffsetY : 0.0

 

이 행렬은 D2D1_MATRIX_3X2 라는 구조체로 표현됩니다.
Direct2D에서는 이 행렬을 손쉽게 다루기 위해서 Matrix3x2F 라는 유틸리티 기능을 지원합니다.
우리는 주로 이 Matrix3x2F 의 기능을 이용해서 변환 정보를 설정할 것입니다.
행렬의 M11, M12, M21, M22 성분은 회전과 확대/축소와 관련된 수치가 입력됩니다.
M31과 M32에는 이동과 관련된 수치가 입력됩니다.
행렬의 수치를 통해서 우리가 원하는 변형을 하고자 할 때,
이들 수치를 직접 입력해서 행렬을 제어하기는 무척 어렵습니다.

그래서 Direct2D 에서 제공하는 개발자 편의를 위한 여러 클래스들을 사용해서 이들 수치를 제어합니다.

 

스크린 좌표계  

변환의 이해를 위해서는 좌표계에 대한 이해가 필수적입니다.
우리가 가장 많이 사용하는 좌표계는 당연히 2차원 좌표계입니다.
바로 모니터가 2차원이기 때문입니다.
하지만 이전에도 언급드린 적이 있지만,
컴퓨터 모니터의 좌표계는 우리가 일반적으로 알고 있는
2차원 좌표계가 아닙니다.

 

좌측이 우리가 흔히 학창시절에 배우는 2차원 데카르트 좌표계( 2D Cartesian coordinate system ) 입니다.
우측이
컴퓨터 모니터가 사용하는 스크린 좌표계입니다.
이점 숙지 하시고, 다음 내용을 보시기 바랍니다.^^

 

이번에 제공되는 샘플의 결과는 다음과 같습니다.

 

이동( Translate )

먼저 살펴 볼 것은 이동( Translate ) 입니다.
가장 위에 있는 이미지가 바로 이동만 적용된 형태입니다.
샘플에서는 단순히 ( X,Y ) 축으로 +20씩만 움직였습니다

<코드>
D2D1::Matrix3x2F matTranslation; 
matTranslation = ::D2D1::Matrix3x2F::Translation( 20.0f, 20.0f );
::g_ipRT->SetTransform( matTranslation );                    
::g_ipRT->DrawBitmap( ::g_ipD2DBitmap, dxArea );    
</코드 

D2D1::Matrix3x2F::Translation() 를 통해서 우리가 원하는 이동을 수행하고 있습니다.
쉽죠? 이런 식으로 하면 행렬에 대한 깊은 이해도 필요하지 않을 것이라 생각합니다.^^  


회전( Rotate ) 

두 번째는 회전입니다.
샘플에서는 두 번째 그림과 세 번째 그림이 바로 회전 변환에 대한 결과물입니다.
사실 회전은 행렬의 성분들을 굉장히 복잡한 수치로 변경시킵니다.
왜냐하면 이들 회전 수치들은 삼각함수 값들이기 때문입니다.

하지만, 두려워하지 마시기 바랍니다.
Direct2D 에서는 이를 편리하게 수행하기 위해
::D2D1::Matrix3x2F::Rotation() 를 제공하고 있습니다.
회전 시킬 때, API 에 입력되는 값이 회전량과 회전 중점입니다.
회전량의 경우에는 라디안 값이 아닌, 각도 값이 입력됨을 주의하시기 바랍니다. 
즉, Degree 값입니다.
그리고 이 회전량의 경우 음의 값과 양의 값을 모두 입력이 가능합니다.
음의 값이 입력이 되면 시계 반대 방향으로 회전을 수행하게 됩니다.
( 양수면 시계방향으로 회전 합니다. )

 

또한 회전 중점의 경우도 유의해야 하는데, 아래의 그림을 보시기 바랍니다.

 

좌측 그림의 경우에는 물체의 중점 위치를 기준으로 회전을 수행한 것입니다.
반면에, 우측 그림의 경우에는 물체의 좌측 상단을 기준으로 회전을 수행한 것입니다.
결과물이 다르죠?
이처럼 회전 변환을 할 때는 이 두 가지를 잘 고려해서 수행해야 합니다.  

<코드>
matRot = ::D2D1::Matrix3x2F::Rotation( -30.0f,
                                       D2D1::Point2F( 120.0f, 320.0f ) );
 

::g_ipRT->SetTransform( matRot );                           
::g_ipRT->DrawBitmap( ::g_ipD2DBitmap, dxArea );    
</코드>


이동과 회전의 결합 

지금까지 이동과 회전을 각각 수행해 보았습니다.
만약에 이동 작업과 회전 작업이 모두 한 오브젝트에 필요하다면 어떻게 해야 할까요?
그런 경우가 필요하다면 바로 행렬의 곱셈 작업을 적용합니다.
그러면 이 두 가지 작업을 모두 표현 할 수 있습니다.
그런데 이 때 주의 할 부분이 있습니다.
행렬은 교환 법칙이 성립하지 않습니다.
즉 행렬 A, B 가 있을 때, A * B != B * A 라는 것입니다.

<코드>
matTranslation = ::D2D1::Matrix3x2F::Translation( 20.0f, 220.0f );         matRot = ::D2D1::Matrix3x2F::Rotation( -30.0f,
                                       D2D1::Point2F( 120.0f, 320.0f ) );
matTM = matTranslation * matRot;            
::g_ipRT->SetTransform( matTM );
                          
::g_ipRT->DrawBitmap( ::g_ipD2DBitmap, dxArea );     

 
matTranslation = ::D2D1::Matrix3x2F::Translation( 300.0f, 220.0f );         matRot = ::D2D1::Matrix3x2F::Rotation( -30.0f, 
                                       D2D1::Point2F( 400.0f, 320.0f ) );

matTM = matRot * matTranslation;                        
::g_ipRT->SetTransform( matTM );
::g_ipRT->DrawBitmap( ::g_ipD2DBitmap, dxArea ); 
</코드>

 

이 코드가 우리의 샘플에서 두 번째와 세 번째 그림의 차이를 보여주는 것입니다.
두 번째 그림은 이동을 한 후에 회전 작업을 수행한 것이고,
세 번째 그림은 회전 작업을 수행한 후에 이동 작업을 수행한 것입니다.  

실제로 우리가 수행하는 모든 변환은 좌표계 변환입니다.
위에서 우리가 했던 변환은 모두 실제로 오브젝트들의 좌표계를 변환시켜서 얻은 결과물들입니다.
이 개념들은 분명히 이해하기 어려운 부분들입니다.
굳이 이렇게 어려운 부분까지 이해하실 필요는 없습니다.
샘플을 올려드리니, 수치를 바꿔보면서 여러 결과들을 눈으로 확인해 보시기 바랍니다.^^


 

 

 

외부 콘텐츠 형식(2)-SharePoint Designer 2010 (3)

SharePoint 2010 2011. 9. 20. 08:30 Posted by 알 수 없는 사용자


외부 콘텐츠 형식(2)-SharePoint Designer 2010 (3)

이번 내용은 필터를 생성하는 내용을 다루어 보도록 하겠습니다.

SharePoint 2010에서의 열 만들기의 경우 외부 데이터 형식을 선택할 수 있습니다. 그러면 사용자들은 제품 ID나 제품 이름으로 검색해서 데이터를 사용할 수 있습니다. 외부 데이터를 사용하지 않는다면 별도의 목록으로 만들어두어야 하며 데이터를 동기화 해주어야 하고 통합시켜주어야 해서 작업이 더 많아질 수 있습니다. 또한 직접 입력한다면 오타 등으로 인해 데이터 무결성이 떨어지게 됩니다.

SharePoint Designer 2010을 통해 열의 외부 데이터 형식을 손쉽게 접근해 볼 수 있습니다.

자 그러면 SharePoint Designer 2010의 외부 콘텐츠 형식을 생성하고 데이터 원본에 연결합니다.

외부 콘텐츠 형식의 이름은 ProductsFilter로 지정했습니다. 데이터 원본은 SQL Server를 선택하고 AdventureWorks 데이터베이스를 연결했습니다.


데이터 원본 탐색기에서 Product 테이블을 오른쪽 클릭해서 새 항목 읽기 작업”,”새 목록 읽기 작업을 선택합니다. 열의 외부 데이터 형식이므로 생성, 삭제 , 수정에 대한 작업은 필요 없습니다.

새 항목 읽기 작업에서는 별다른 설정이 없으므로 화면은 생략하겠습니다. 관련 데이터를 설정하는 내용입니다.

Product 테이블을 오른쪽 클릭하여 새 목록 읽기 작업을 선택합니다. 목록 읽기 마법사의 처음 화면에서는 다음을 클릭합니다.

필터 매개 변수 구성 화면에서는 필터 매개 변수 추가를 클릭합니다. ProductID 에 대해 필터를 설정하기 위해 추가하려면 클릭링크를 선택합니다. 목록에서 항목을 작성할 때 해당 제품의 ID로 검색하면 해당 외부 데이터가 나타나게 하려고 합니다.

필터 설정 화면에서는 필터 형식은 비교”, 연산자는 같음을 선택하고 확인을 클릭 합니다.

필터 매개 변수 추가를 한번 더 클릭하고 “Name” 필드를 선택합니다. 목록에서 항목을 작성할 때 키워드가 포함된 제품 이름으로 외부 데이터를 검색하려고 합니다.

추가하려면 클릭링크를 선택하여 아래와 같이 필터 형식은 와일드 카드를 선택하고 기본값 여부를 체크하고 확인을 선택합니다. 그리고 기본값에 “*” 를 입력합니다.

아래와 같이 필터 두 개를 추가했고 연산자는 OR로 지정합니다. 아래 오류 및 경고는 제한 필터로 개수를 제한하고 ProductID 필터에 기본값을 설정하면 됩니다만 여기서는 다음으로 넘어가도록 하겠습니다.

다음을 클릭해서 선택 화면에 나오는 내용을 체크해주도로 하겠습니다.

불필요한 열은 체크를 해제하고 ProductID, Name은 선택 컨트롤에 표시를 체크해주고 마침을 선택하고 저장을 해서 외부 콘텐츠 형식을 생성합니다.

새로운 외부 콘텐츠 형식에 대해서 Business Data Connectivity Services 에서 권한을 할당해주어야 합니다. 외부 콘텐츠 형식을 일부 수정해서 저장하면 버전이 달라져 권한 설정을 새로 해주어야 합니다.

제품평가라는 사용자 지정 목록을 생성하고 제품명이라는 열을 추가하면서 열 형식을 “ProductsFilter”로 선택하고 추가 열을 체크해서 화면에 같이 표시되도록 합니다.

제품명을 하나 추가하면 아래와 같은 외부 데이터 화면을 보실 수 있습니다. 제한 필터를 추가해서 200여개 정도로 제한을 해준다면 아래와 같은 붉은색 메시지는 나타나지 않습니다.

필터를 이용해서 제품을 선택한 후 항목을 추가해봅니다. 제품명에 대해서 외부 데이터를 이용해서 효과적으로 관리할 수 있습니다.

제품명에 대해서 외부 데이터를 이용해서 효과적으로 관리할 수 있습니다.

외부 데이터 형식의 필터를 생성하는 내용을 간단히 다루어보았습니다.

[짤막소식] Direct3D 11.1 릴리즈 소식과 Visual Studio 11 소식

DirectX 11 2011. 9. 19. 14:00 Posted by 알 수 없는 사용자


안녕하세요..^^

잠잠하던 DirectX 게시판에 이번 달에 작은 소식이 몇 가지 발표되었습니다.
먼저 Direct3D 11.1 이 릴리즈가 되었습니다.
아래 링크를 보시면 특징들을 확인하실 수 있습니다.
큰 기능의 추가는 다행이(?) 없으니 안심하시기 바랍니다.^^

http://msdn.microsoft.com/en-us/library/hh404562%28v=VS.85%29.aspx


다른 소식은 Visual Studio 11 소식입니다.
이번 Visual Studio 11 에서는 게임 개발 관련한 편의를 위해서
몇 가지 비쥬얼 적인 에디팅을 지원하는 듯 합니다.

아래는 관련 링크입니다.
http://blogs.msdn.com/b/jasonz/archive/2011/09/14/announcing-visual-studio-11-developer-preview.aspx


특히나 이번에 주목한 부분은 쉐이더 에디터가 Visual Studio 11로 통합되어진 것입니다.
( 설마 나중에 빠지는 것은 아니겠지요? ^^ )
앞으로 더 정보를 지켜봐야 하겠지만, 상당히 기대되는 부분인 것은 분명한 것 같습니다.^^





SQL Azure Data Sync (2) – Sync Group

Cloud 2011. 9. 16. 08:30 Posted by 알 수 없는 사용자


SQL Azure Data Sync (2) – Sync Group

전 편에 이어 Sync Group을 생성해서 SQL Server - SQL Azure로 동기화를 해보도록 하겠습니다.

SQL Azure Data Sync CTP2 에 로컬의 데이터베이스를 등록했으며 이제 SQL Azure를 등록하도록 하겠습니다.

Sync Group SQL Azure Data Sync Service에 의해 상호 동기화되도록 구성된 SQL Azure SQL Server 데이터베이스의 모음으로 볼 수 있습니다. 하나의 HUB 데이터베이스(SQL Azure 데이터베이스)와 여러 Member 데이터베이스로 구성되어 있습니다.

자 로컬의 Demo 데이터베이스와 동기화 하기 위해 SQL Azure 데이터베이스에 연결하여 빈 데이터베이스를 생성합니다.

로컬의 데이터베이스는 SQL Azure Sync Services를 통해 등록하고 SQL Azure 데이터베이스는 SQL Azure Data Sync CTP2 사이트를 통해 등록합니다. SQL Azure Data Sync CTP2 사이트에서 Databases 탭을 클릭하고 Add를 클릭해서 위에서 생성한 SQL Azure Database를 등록합니다.

등록 정보가 이상 없다면 아래와 같이 등록된 것을 확인 가능합니다.

여러 데이터베이스를 등록할 수 있지만 여기서는 SQL Azure, SQL Server 데이터베이스 두 개만 등록합니다. 이제 Sync Group을 생성해보도록 하겠습니다.

SQL Azure Data Sync CTP2 사이트에서 Sync Groups 탭을 클릭하고 New Sync Group를 클릭해서 위에서 SQL Azure Database를 등록합니다.

New Sync Group의 이름은 “HJ” 로 입력하고 Registered Databases 를 통해 등록된 데이터베이스를 추가합니다. 그리고 SQL Azure 데이터베이스 중 하나를 선택해서 “Set HUB”를 클릭해서 Hub 데이터베이스로 지정합니다.


Next 를 클릭해서 동기화할 테이블과 스케쥴링을 아래와 같이 설정합니다. 동기화할 테이블은 하나만 있으며 시간은 5분으로 지정하겠습니다.

아래와 같이 새로운 Sync Group 이 생성된 것을 확인 가능합니다.

Sync Logs 에 보면 진행, 대기, 완료한 작업 등을 알 수 있으며 처음 동기화 작업이 처리된 것을 확인 가능합니다.


실제 SQL Azure Hub 데이터베이스를 보면 아래와 같이 테이블 스키마와 데이터가 동기화된 것을 확인 가능합니다.

n SQL Azure


기본적으로 변경 사항은 양 방향성격으로 Member 데이터베이스로부터의 변경 사항은 hub 데이터베이스로 전파되고 Hub 데이터베이스에서 Member 데이터베이스로 다시 전파되게 됩니다. 변경 사항의 전파는 Bi-directional, Sync to Hub, Sync from Hub 중에서 선택이 가능합니다.

위의 환경에서는 Hub 데이터베이스가 또한 Member 데이터베이스이므로 데이터를 Update 해보겠습니다. 스케뷸링 시간이 되면 아래와 같이 변경된 것을 확인 가능합니다.

n Local SQL Server


Hub 데이터베이스에서는 추적을 위해 아래와 같이 몇몇 테이블이 자동으로 생성되게 됩니다.

데이터베이스를 추가하거나 스케쥴링 시간을 변경할 수도 있으며 Sync Group을 삭제할 수도 있습니다.

이번 글에서 SQL Server to SQL Azure Synchronization 에 대한 Sync Group 생성과 데이터 동기화의 설정에 대한 내용을 정리했습니다. 괜찮은 기능으로 보입니다. 속도,비용 등등 고려사항은 별도로 보더라도

[미리 보는 C++11] 3. constexpr - 1

C++0x 2011. 9. 15. 09:00 Posted by 알 수 없는 사용자

constexpr는 변수, 함수, 클래스를 컴파일 타임에 정수로 사용할 수 있도록 해줍니다. 즉 상수로 취급할 수 있는 작업은 컴파일 타임에 처리하도록 할 수 있습니다.

 

constexpr를 변수에 사용

constexpr int aa = 11;

이것은

const int aa = 11

와 같은 의미를 가집니다.

 

그러나 아래와 같이는 사용할 수 없습니다.

int input_num = 0;

constexpr int aa = input_num;  // 에러


constexpr
로 지정된 변수는 꼭 컴파일 시에 정수가 되기 때문에 변수 선언 시 대입이 정수 식이어야만 합니다. const와의 차이는 const는 컴파일 시에 정수가 아니어도 괜찮고 변수 선언 시 대입 값이 정수 식인 경우 정수 식이 되고, 그렇지 않은 경우는 단순히 const를 수식하는 것이 됩니다(이에 비해 constexpr는 꼭 정수 식이어야만 합니다).

 

 

 

constexpr를 함수에 사용

C++03에서는 아래의 코드는 에러가 됩니다.

int GetNum() { retun 5; }

int Numbers[ GetNum() ];

GetNum 함수는 상수 5를 반환 하는 것으로 이미 컴파일 시에 반환 값을 알 수 있습니다. 그러나 컴파일러는 GetNum 이라는 함수가 정수처럼 사용할 수 있는지 알 수 없으므로 정수로 취급하지 않습니다.

 

위 코드는 C++11constexpr를 사용하면 우리가 원하는 대로 GetNum 함수를 정수로 사용할 수 있습니다.

 

constexpr int GetNum() { retun 5; }

int Numbers[ GetNum() ];

 

constexpr를 함수에 사용할 때는 꼭 함수 본체는 { return expression; } 형태가 되어야만 합니다.

 

 

constexpr 변수는 비 constexpr 변수에 사용할 수 있으므로 아래와 같은 테크닉도 사용할 수 있다.

constexpr double power( double x, unsigned int y )

{

    return y == 1 ? x : x * power( x, y - 1 ) ;

}

 

int main()

{

    // 정수 식

    constexpr double a = power( 2, 32 ) ;

 

    // 정수 식이 아니다

    double x = 2 ; unsigned int y = 32 ;

    double b = power( x, y ) ;

}

(출처) http://cpplover.blogspot.com/2010/11/gccniconstexpr.html

 

 

그리고

const int base_HP = 200;

int NPC_Lv1_HP = base_HP + 0;

int NPC_Lv2_HP = base_HP + 200;

라는 코드는 정수 계산을 하는데 실행 시에 계산되는데 이것을 constexpr을 사용하여 컴파일 시에 계산되게 할 수 있습니다.

 

constexpr int AssignHP( int nPlusHP )

{

 return base_HP + nPlusHP;

}

 

int NPC_Lv1_HP = AssignHP( 0 );

int NPC_Lv2_HP = AssignHP( 200 );



 

요즈음 클라우드 서비스들을 이용하다보면, Windows 서버 운영체제를 통해서 확장성있는 클라우드를 만들고자 하는 경우가 자주 있습니다. 일반적인 웹 사이트를 구축할 때에도 마찬가지이고, 당연히 KT UCLOUD나 Amazon과 같은 환경에서도 같은 노력이 뒷받침이 되어야 하지요. 그리고 제가 주 전공으로 하고 있는 Windows Azure 역시, 첫 배포 때에는 간과하기 쉬운 점이 바로 로드 밸런싱 환경이라는 점입니다.

이러한 로드밸런싱 환경을 만들때에는, 이전에 구축해본 경험이 없는 관리자가 개발자 입장에서는 상당히 어려운 문제에 봉착하게 될 가능성이 많습니다. 특히 요즈음 웹 환경에서는 당연하게 사용하는 세션이나 쿠키에 관련된 설정들이 로드밸런싱 환경에서 기대했던 것과 다르게 동작해서 좌절하는 경험을 많이들 하실텐데요, 제가 오늘 블로그에 올리는 것은 ASP.NET에 관한, 그리고 IIS 7에 관한 내용입니다. (PHP나 JSP 개발자분들께서도 공감하실 수 있는 부분이 있을 것입니다.)

로드밸런싱 환경을 잘 알고 구축할 수 있다면, 앞으로 나오게될 어떤 종류의 클라우드 서비스이든 관계없이 문제를 정확하게 해결할 수 있을 것입니다. 사실 클라우드 기반의 웹 서비스는 달리 표현하면, 기본 골자는 로드밸런싱에 기반을 두고 있는 것이고, 그 이후의 확장성 전략을 클라우드 솔루션으로 채우는 것과 같다고 말할 수 있습니다. (어떤 뼈대를 사용할 것인지는 전적으로 여러분들의 선택에 달린 것입니다.)

로드 밸런싱 환경이란?

로드 밸런싱 기술 자체는 상당히 오래된 것입니다. 이름에서 알 수 있듯이, 몰려오는 트래픽을 내부적으로 분산하여 특정 서버 컴퓨터로 연결이 몰려 서비스가 사용 불가 상태로 빠지는 것을 "지연"시키거나 "완화"시키는 것에 목적이 있습니다. 로드 밸런싱의 기술적 개념도는 다음과 같습니다. (이미지 출처: http://msdn.microsoft.com/en-us/library/ff650667.aspx)

다양한 상황에서 로드밸런싱이 쓰이겠지만 가장 일반적으로는 웹 환경에서 많이 쓰입니다. 연결을 오래 유지할 필요가 없으면서도, 짧은 시간 내에 빠른 연결 회전을 보이는 웹 프로토콜에서 가장 중요한 것은 바로 신속성인데, 분산 처리를 하지 않는 경우에는 필연적으로 서버 컴퓨터가 받아들일 수 있는 동시 연결 한계치에 금방 치닫게 됩니다. 그러나 로드 밸런싱을 정확히 사용하면 이러한 한계치에 치닫게 되는 속도가 로드 밸런싱에 참가하는 컴퓨터의 댓수만큼 반비례하게 됩니다. 그리고 이 때 하나의 웹 사이트를 위한 로드 밸런싱 서비스에 멤버로 참여하는 서버 컴퓨터들을 묶어서 "웹 팜"이라고 정의를 하는 것이지요. 더 일반적으로는 "서버 팜"이라고도 합니다.

잠시 다른 이야기로 넘어가자면, 요즈음 대두되는 클라우드 컴퓨팅은 관리 측면에서 봤을 때, 충분한 대역폭을 보장하는 연결과 매우 뛰어난 성능을 가진 로드 밸런서를 이용하여 연결을 분산하는 작업을 수행하는 것입니다. 그리고 웹 팜 안에 참여하는 컴퓨터의 유형에 있어서는 이전과 다른 점이 하나 있는데, 마치 구름과 같이 수축과 팽창을 자유자재로 한다는 것입니다. 물론 이런 수축과 팽창이 가능함은 내부적으로 가상화 솔루션을 이용했다거나 여기에 대응할 수 있는 알고리즘을 사용했다는 가정이 깔려있는 것입니다.

정말 완벽하고 정확하게 구축했다면, 적은 전원이나 자원 공급으로도 충분히 웹 팜이 유지가 될 수도 있고, 필요하다면 웹 팜의 크기가 엄청나게 커질 수도 있겠지요. 이걸 여러분이 관리하신다면 프라이빗 클라우드, 신뢰할 수 있는 IT 기업이 관리한다면 퍼블릭 클라우드가 된다고 보실 수 있겠습니다. 그러나, 클라우드 컴퓨팅이 만능약처럼 들릴 수 있는 부분이 있지만 정확히 알아야 할 것은 클라우드 컴퓨팅 역시 이 로드 밸런싱을 기초로 만들어지는 것이고, 여러분이 운영할 수 있는 한계에까지 트래픽이 몰리거나, 이런 일을 하는 IT 업체에게 지불할 수 있는 재정의 한계에까지 트래픽이 몰린다면 이것이 여러분이 생각할 수 있는 클라우드의 한계입니다. 무제한이라고 해서 값이 저렴하거나 무료에 수렴하는게 아님을 명확히 이해하고 있어야 합니다.

웹 로드 밸런싱을 위한 이야기

다시 본론으로 돌아와서, 웹을 로드 밸런싱할 수 있으려면 무엇을 검토해야 할까요? 가장 중요한 것은 웹 서버에 참여하는 각각의 컴퓨터 자체에는 "절대로" 컴퓨터의 고유한 정보를 가지고 있으면 안된다는 점입니다. 매우 단순한 이야기같지만 이러한 원칙을 지키지 않도록 설계되어있는 것이 지금 이 시점까지의 서버 컴퓨팅 기술들의 대다수의 원칙입니다. 간단한 예를 들어볼까요?

여러분이 일상적으로 사용하는, 웹을 통한 파일 업로드 기능을 담당하는 간단한 웹 앱이 있다고 가정해 보겠습니다. 이 웹 앱은 서버가 한 대 일때에는 참 쉽고 빠르게 설치해서 쓸 수 있었습니다. 당연히, 설치를 잘 했다면, 사용자가 웹 페이지를 방문해서 파일을 업로드하면 웹 서버가 그것을 알아보고 파일을 회수해서 하드 디스크 어딘가에 저장하겠지요. 그러나 시간이 지나서 이 웹 앱의 기능을 업그레이드하고 좀 더 많은 사용자들이 파일을 저장하고 다운로드할 수 있도록 만들어보고자 해서 로드 밸런싱 환경을 구축하여 베타 테스트를 시작했습니다. 그런데 어떤 문제들이 생겼을까요?

앞서 이야기한 기술적인 특성때문에, 사용자들은 분명히 조금전까지 파일을 업로드했었는데 페이지를 다시 와서보니 파일이 업로드되지 않은 상태로 페이지가 나와서 혼란스러워합니다. 혹은 파일을 어디로 빼돌린거냐며 분노하는 사람들도 있구요. 그래서 몇 번 F5키를 누르다보면 "어라?"하고 놀라게 됩니다. 조금 전에 업로드했던 파일이 다시 나타나니까요. 그러고나서 그 파일을 다운로드하려고 링크를 클릭하면 이번엔 또 다시 404 오류를 만납니다. 이제 사용자들은 이 서비스에 대해서 대단한 분노와 원성을 쏟아낼 것입니다. 서비스 상태에도 일관성이 없을 뿐 아니라 불안정한것 같다. 믿을 수 없다면서요.

이것이 일선 IT 현장에서 로드 밸런싱이나 클라우드를 처음 접목했을 때 겪는 "가장 흔하고 일반적인 장애"입니다. 더 안타까운 것은, 이것을 신 기술에 의한 책임으로 회피하고 문제시하는 것입니다. 문제의 본질을 정확히 알고 있다면 이렇게 말하는 것이 왜 잘못인지도 금방 알 수 있을 것입니다.

여기서 든 예제처럼, 이 웹 앱의 문제는 단순히 업로드한 파일을 자신의 컴퓨터에 저장하려고 했다는 데에 문제가 있습니다. 로드 밸런싱 멤버로 참여하는 컴퓨터가 자신의 상태를 중요하게 여기면, 다음번에 이어받는 다른 서버 컴퓨터의 입장에서는 이전에 그 컴퓨터가 무엇을 했는지 알 길이 없습니다. 그저, 찾고자 하는 내용이 없음을 이야기하는 수 밖에 없습니다. 이런 상황이 반복되면서 서비스 전체는 들어올때와 나갈때가 전혀 다른, 일관성이 없고 이상한 서비스가 되는 것입니다.

이 문제를 해결하기 위하여 어떻게 수정해야 할까요? 답은 간단합니다. 파일 저장소를 로드 밸런싱 멤버 컴퓨터 내부가 아닌, 여러 멤버 컴퓨터들이 같이 이용할 수 있는 공용 저장소로 바꾸는 것입니다. 가장 간단한 방법은 네트워크 UNC 경로로 이용할 수 있는 스토리지가 있을 수 있습니다.

여기서 궁금한 점이 하나 더 있는데, 그렇다면 로드 밸런싱에 의하여 애써 분산한 서비스가 다시 모이는 것이 아니냐고 반문할 수도 있습니다. 그런데 사실, 생각외로 사용자들이나 웹 크롤러와 같이 인터넷 상에서 발생하는 별 뜻없이 바쁘게 만드는 다양한 유형의 트래픽을 웹 팜 수준에서 한 번은 로드 밸런싱을 해주는 것 만으로도 실제 스토리지에 대한 요구 사항은 획기적으로 감소한다는 점입니다. 거기다, 역할 분담도 정확히 할 수 있으며 스토리지 자체에 대한 요구 사항이 폭증하는 것을 방지하기 위하여 기술적으로는 좀 더 복잡해질 수 있지만 캐싱 기능을 사용할 수도 있습니다. 이렇게 함으로서, 우리가 흔히 잘 아는 클라우드 서비스의 시작을 뗄 수 있게 됩니다.

기술적인 이야기 1 - 세션 처리 방법 바꾸기

그렇다면 IIS와 ASP.NET에서는 이런 이상한 상황을 예방하고 신뢰할 수 있는 서비스를 만들기 위해서 어떤 수정 사항을 반영해야 하는 것일까요? 제가 이제까지 인터넷 상으로 자료 조사를 해왔던 것은 모두 제각기 흩어져있는 정보들이었고 이것을 한 번에 취합할 수 있는 방법을 오늘 블로그 포스팅을 통하여 소개할까 합니다.

기본적으로 ASP.NET은 세션 처리를 IIS 프로세스 안에서 수행하도록 되어있습니다. 가장 동선도 짧고, 신속하게 반응하기 때문입니다. 그러나 로드 밸런싱 환경에서 이는 당연히 "채택하면 안되는" 기법입니다. 이 방법은 web.config 파일 안의 <sessionState> 요소에서 변경할 수 있는 부분으로, <configuration> 요소 아래의 <system.web> 요소 아래에서 없는 경우 새로 지정할 수 있습니다. <sessionState> 요소의 mode 속성의 값을 변경하면 됩니다. 지금 이야기한 부분은 mode 속성이 InProc으로 지정되어있거나, 아무것도 지정되어있지 않을 때 .NET Framework의 글로벌 web.config 설정을 바꾸지 않은 경우 기본으로 지정되는 설정입니다.

IIS 7에서 볼 수 있는 아래 그림과 같은 설정도 이 XML 파일의 수정을 텍스트 에디터 없이 수정하는 것입니다.

로드 밸런싱 환경에서 정상적으로 동작하는 웹 사이트를 만들기 위해서는 mode의 설정 값을 InProc 대신 StateServer나 SQLServer로 바꾸어야 하는데, 양쪽 값 모두 장단점이 있습니다. StateServer의 경우 기본적으로는 꺼져있는 ASP.NET State Service라는 NT 서비스가 제공하는 별도의 서버를 이용하는 방식이고, SQLServer는 이름에서 알 수 있듯이 실제 SQL Server를 사용하여 세션을 구현하는 방식입니다. 데이터베이스 서버의 성능이 세션을 모두 수용할 수 있을만큼 획기적으로 뛰어나거나, 세션 서버가 죽었다가 살아나도 로그아웃 처리가 안되게 한다던가, 혹은 여러 로드 밸런싱 사이트 사이에서 세션 공유를 안전하게 할 방법이 필요하다면 이 모드를 사용할 수 있습니다. 이에 비하여 StateServer는 별도의 SQL 서버 없이도 간편하게 구축할 수 있는 방법을 제공하긴 하지만, 세션 서버가 죽었다 살아날 경우 내용이 없어지는 휘발성 세션입니다.

양쪽 모드 모두 중요한 것은 멤버로 참여하는 웹 서버 컴퓨터 밖에 상태를 보관해야 한다는 것이 키 포인트로, 이것을 지키지 않고 멤버 컴퓨터 안에 이런 설정을 구축하면 전혀 나아지는 것이 없습니다. 그리고 당연한 이야기이지만 멤버 컴퓨터로 참여하는 모든 웹 서버가 같은 설정을 가지고 있어야 합니다.

StateServer와 SQLServer 모드를 구현하는 방법에 대한 자세한 내용은 아래 아티클을 참고하시면 되겠습니다.

http://msdn.microsoft.com/ko-kr/library/ms178586.aspx

기술적인 이야기 2 - ASP.NET 사이트 간에 립싱크 맞추기

세션을 공유하는 것 이외에, ASP.NET은 내부적으로 Machine Key라는 것을 사용합니다. Machine Key의 용도는 ASP.NET 안에서 참 다양한데, 가장 대표적으로는 클라이언트와 서버 사이에 쿠키 정보를 주고 받을 때 암호화하기 위한 수단으로 이용하는 것이 유명한 사례입니다. 쿠키를 이용한 취약점 공격은 웹 세계에서 너무나 당연한 공격 방식 중 하나이기 때문에 ASP.NET은 처음부터 이를 보완하기 위한 전략을 구현하고 있었습니다. 그러나 이것이 지금 와서 로드 밸런싱 환경이 되면서는 또 다른 어려운 문제로 바뀐 것입니다.

이 Machine Key라는 것 역시 서버 컴퓨터마다 고유하게 생성할 뿐 아니라, 매번 연결할 때 마다 다른 값을 생성하여 암호화에 사용합니다. 클라이언트 입장에서야, 서버가 "ABC"라는 쿠키를 주니까 "아 그렇구나. 나중에 돌려주면 서버가 날 알아보겠지?"하며 성실하게 반납합니다. 그런데 로드 밸런싱에 참여하는 A라는 서버 대신 C라는 서버가 이 쿠키를 받아들었을 때는 "이거 내것 아님" 하며 클라이언트에게 퇴짜를 놓습니다. 이것이 문제의 핵심인 것이죠.

이 문제를 해결하기 위해서는 아까전에 이야기한 주제보다 좀 더 많은 노력이 필요합니다. 생각보다, 보안을 완벽하게 유지하기 위하여 ASP.NET이 관리자들에게 요구하는 사항이 까다롭기 때문입니다. 이 Machine Key를 만들기 위해서는 별도의 생성 도구를 사용해야 합니다. 그러나 안타깝게도 이 도구를 구한다거나 만들 수 있으려면 개발자들의 조력이 좀 필요합니다. 그리고 개발자 본인들도 이런 방법을 찾아야 하기때문에 꽤나 귀찮습니다. Codeproject에 가면 이러한 방법을 자세히 설명한 아티클도 있습니다만 간단한 도구도 드리고, 코드 조각도 드리니 프로그램에 넣어 활용하시면 더 편리할 것입니다.

using System;
using System.Text;
using System.Security.Cryptography;

/* 중략 */

        public static string getRandomKey(int bytelength)
        {
            byte[] buff = new byte[bytelength];
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
            rng.GetBytes(buff);
            StringBuilder sb = new StringBuilder(bytelength * 2);
            for (int i = 0; i < buff.Length; i++)
                sb.Append(string.Format("{0:X2}", buff[i]));
            return sb.ToString();
        }

        public static string getASPNET20machinekey()
        {
            StringBuilder aspnet20machinekey = new StringBuilder();
            string key64byte = getRandomKey(64);
            string key32byte = getRandomKey(32);
            aspnet20machinekey.Append("<machineKey\n");
            aspnet20machinekey.Append(" validationKey=\"" + key64byte + "\"\n");
            aspnet20machinekey.Append(" decryptionKey=\"" + key32byte + "\"\n");
            aspnet20machinekey.Append(" validation=\"SHA1\" decryption=\"AES\"\n");
            aspnet20machinekey.Append("/>\n");
            return aspnet20machinekey.ToString();
        }

        public static string getASPNET11machinekey()
        {
            StringBuilder aspnet11machinekey = new StringBuilder();
            string key64byte = getRandomKey(64);
            string key24byte = getRandomKey(24);

            aspnet11machinekey.Append("<machineKey");
            aspnet11machinekey.Append(" validationKey=\"" + key64byte + "\"\n");
            aspnet11machinekey.Append(" decryptionKey=\"" + key24byte + "\"\n");
            aspnet11machinekey.Append(" validation=\"SHA1\"\n");
            aspnet11machinekey.Append("/>\n");
            return aspnet11machinekey.ToString();
        }

위의 코드를 사용하여 프로그램을 만들거나 ZIP 파일 안의 프로그램을 이용하여 값을 만들도록 하면 아래와 같은 XML 코드 조각을 얻을 수 있을 것입니다. 이 코드 조각을 각각의 서버에 들어있는 web.config에 지정하거나, 특정한 값만 인용하여 아래의 IIS 7 설정 아이콘에서 볼 수 있는 설정 도구를 통해서 직접 설정할 수도 있습니다.

<machineKey
 validationKey="FACBB6C89C44CB8BB7165FC4639BAA7267B...EF297D815E1BDD40E883E3451628CB95D34309"
 decryptionKey="4E95057676CC8DBA9AB...AACC1121B6B962E5AFA7849B0C82"
 validation="SHA1" decryption="AES"
/>

기술적인 이야기 3 - IIS에서 놓치면 안되는 것

ASP.NET을 가장 먼저 사용할 수 있게 된 웹 서버가 IIS이다보니 발생한 일종의 특성입니다만 여러 포럼에 걸쳐서 잘 언급되지 않는 문제점이 하나 있습니다. 바로 IIS에서 사용하는 사이트 ID 값을 통해서 정해지는 Application Path를 Machine Key와 같이 활용된다는 사실입니다. 웹 사이트 관리를 하다보면 로드 밸런싱에 참여하는 컴퓨터들을 다음과 같이 관리하게 되는 경우가 있습니다.

  • 서버 A에서는 기본 웹 사이트를 먼저 지우고 새 웹 사이트를 만들었다.
  • 서버 B에서는 새 웹 사이트를 먼저 만들고 기본 웹 사이트를 지웠다.

혹은 아래와 같은 경우도 있을 수 있습니다.

  • 서버 C에서는 사이트 A를 만들고 사이트 B를 만들었다.
  • 서버 D에서는 사이트 B를 만들고 사이트 A를 만들었다.

별 차이 없이 생각할 수 있지만, IIS에서는 이 경우 각각의 사이트들에 다른 ID 값을 부과하게 됩니다. 이 경우, 분명히 Machine Key를 동일하게 지정했음에도 불구하고 로드 밸런싱 환경에서 세션 상태가 일관성없게 변하는 문제를 만나게 됩니다. 제가 이번에 고민하게 된 부분도 바로 이 부분이었는데요, 이 문제를 해결하기 위해서는 IIS 7에서 전체 웹 사이트 목록에 나타나는 내용 중 다음의 ID 값이 멤버로 참여하는 웹 서버마다 차이가 있지 않은지 우선 검토해야 합니다.

위에있는 그림에서 빨간색으로 그린 부분이 서버 컴퓨터마다 차이가 있다면 이 값을 수정해주어야 합니다. 이 값을 수정하기 위해서는 수정할 사이트를 클릭하고, 고급 설정 링크를 아래 그림과 같이 클릭합니다.

이제 아래와 같은 팝업 대화 상자가 나타나면 강조 표시한 속성인 ID 값이 멤버로 참여하는 웹 서버 모두 같은 값을 가질 수 있도록 통일시켜줍니다.

확인 버튼을 누른 다음, ID 값이 바뀐 서버 컴퓨터에 한해서 IIS 전체를 재시작해주시거나 사이트 재시작을 시켜주시면 정상적으로 작동하게 될 것입니다.

Windows Azure 환경에서의 고려 사항

오늘 살펴본 내용은 IIS 7과 ASP.NET에 관한 부분이었지만, Windows Azure Platform의 경우에도 비슷한 문제가 있습니다. Windows Azure Platform에 VM Role로 웹 사이트를 게시를 하든, Web Role로 웹 사이트를 게시하든 세션을 사용하게 될 경우 비슷한 문제가 있을 수 있습니다.

다행히, Web Role을 이용한다면 내부적으로 사용하는 IIS에서 여러분이 몇 개의 웹 사이트를 추가적으로 구성하든 관계없이 같은 순서로 같은 ID를 사용하는 웹 사이트를 만들 것이므로 세 번째로 이야기한 ID 값 수정과 같은 작업은 할 필요가 없을 것입니다. 그러나 Machine Key에 대한 설정이나 세션 공유를 위한 설정은 SQL Azure를 이용한다거나, Worker Role에서 ASP.NET State Service 혹은 써드파티의 Session State Server를 이용해야 할 수 있습니다.

물론, 최근에 Windows Azure Platform의 일부로 Windows Azure AppFabric Cache가 새로 출시되기는 하였습니다만 상당히 이용 가격이 비싼 편입니다. (비싼만큼 확실한 성능을 제공합니다.) 로드 밸런싱 환경에서 특별한 문제를 일으키지 않는 일반적인 세션 공유가 필요하시다면 오늘 이야기한 주제를 응용한 Azure Project를 구축해보는 것도 의미가 있을 것입니다.

'Cloud' 카테고리의 다른 글

SQL Azure Data Sync (3) – 고려사항  (0) 2011.09.22
SQL Azure Data Sync (2) – Sync Group  (0) 2011.09.16
SQL Azure Data Sync (1) – 소개와 Agents 구성  (0) 2011.09.09
SQL Azure Sharding 소개  (0) 2011.09.08
SQL Azure Reporting (3)  (1) 2011.08.25

SPLINQ 를 통한 페이징

SharePoint 2010 2011. 9. 13. 08:30 Posted by 알 수 없는 사용자

SPLINQ 를 통한 페이징

예전 글에서 SPQuery 통한 페이징에 대해서 다루어 보았습니다. 그리고 LINQ to SharePoint 에 대한 내용도 다루어 보았습니다. 앞부분에서 누락되어 정리해둡니다.

SPLINQ 를 통해서 페이징이 가능합니다. 원래 LINQ에 있는 기능일 뿐입니다. 아래에서 간단히 코드를 통해서 살펴보도록 하겠습니다.

간단히 Title 0에서 Tile 49까지 추가되어 있습니다.

SPMetal 을 이용해서 엔티티 클래스를 생성하고 프로젝트에 엔티티 클래스 파일을 추가했습니다.

자 그럼 1 페이지 코드를 살펴보도록 하겠습니다.

SPLINQ의 쿼리에서 Skip, Take를 사용하고 있습니다. 결과는 다음과 같습니다.

2 페이지의 경우는 int Page=2 라고 바꾸면 됩니다. 아래는 3 페이지의 결과입니다.

항목을 하나 더 추가하고 6 페이지로 가보도록 하겠습니다. 맨 마지막 항목 하나가 보입니다.

SPQuery의 경우보다 더 간단한 듯 합니다~


SQL Azure Data Sync (1) – 소개와 Agents 구성

Cloud 2011. 9. 9. 08:30 Posted by 알 수 없는 사용자

SQL Azure Data Sync (1) – 소개와 Agents 구성

이번 글은 SQL Azure Data Sync에 대한 내용을 한번 알아보도록 하겠습니다.
여기서의 버전은 SQL Azure Data Sync CTP 2 를 사용합니다.

SQL Azure Data Sync를 그림 하나로 정의하면 아래와 같습니다. 양 방향 화살표로 SQL Azure – SQL Azure, SQL Server – SQL Azure, SQL Azure – SQL Server로 데이터를 동기화해 주는 내용입니다.


[그림 1]

출처: http://social.technet.microsoft.com/wiki/contents/articles/1085.aspx

아래는 SQL Azure Data Sync CTP2에 등록된 화면입니다.

https://datasync.azure.com/

관련 참조 링크는 아래와 같습니다.

위의 [그림 1]처럼 SQL Azure Data Sync를 위해서는 몇 가지 준비가 필요합니다. 그럼 이제 준비사항에 대한 내용 중에서 첫 번째로 Agents 구성을 정리해보도록 하겠습니다.

1. SQL Azure Data Sync CTP2로 이동하여 Agent Name Key를 생성합니다. 아래 그림에서 Generate Key 버튼을 클릭합니다. Agent Name “hongju” 로 입력합니다.


2.
Agent Name에 대한 Key가 생성된 것을 확인할 수 있으며 현재 상태는 아직 연결되지 않아 노란색 느낌표가 나타납니다.

3. Agent Key를 생성하는 화면의 하단에 Agents 를 다운로드하는 링크가 보이므로 다운로드 해서 실행합니다.



4.
위의 그림에 나온 것처럼 시작, 프로그램에서 Agent Configuration Tool을 시작하여 위에서 생성한 Agent Key를 이용해서 구성해주어야 합니다. 시작, 프로그램에서 SQL Azure Data Sync Agent CTP2를 클릭하면 아래와 같은 화면을 볼 수 있습니다.

5. Encrypt Password 체크 박스를 체크하고 Edit Agent Key를 클릭하여 2 에서의 Key를 복사하여 붙여 넣기 합니다. Ping Sync Service 아이콘을 클릭하여 제대로 연결되는지 확인합니다.

6.
그리고 Add Member 아이콘을 클릭하여 SQL Server Database를 등록하게 됩니다.

7. 잘 등록되었다면 아래와 같은 화면을 볼 수 있습니다.


8. 관리도구의 서비스에서 SQL Azure Data Sync Agent CTP2 서비스를 시작해주고 SQL Azure Data Sync Portal로 이동합니다. 그러면 Agents Database 메뉴에서 연결된 것을 확인 가능합니다.

다음에서 Sync Group을 설정하는 내용에 대해서 알아보도록 하겠습니다.



SQL Azure Sharding 소개

Cloud 2011. 9. 8. 08:30 Posted by 알 수 없는 사용자

SQL Azure Sharding 소개

SQL Azure의 경우 데이터베이스는 비즈니스 형태가 50GB 를 지원하고 있습니다. 이 용량을 넘어가는 경우 접근할 수 있는 방법에 대한 내용을 알아보도록 하겠습니다. SQL Azure Sharding SQL Azure Federation 으로 대용량 데이터에 대한 부분을 접근할 수 있습니다. SQL Azure Federation은 차후 CTP 를 통해 다루어 보고 이번 글에서는 SQL Azure Sharding에 대한 내용을 알아봅니다.

Sharding은 여러 데이터 베이스를 통해 수평으로 파티션된 응용 프로그램 패턴이며 응용 프로그램을 위한 데이터의 수평적인 확장성을 제공해줍니다. Windows Azure Training Kit 의 데모에 SQL Azure Sharding에 대한 내용이 있어 적용해서 테스트해보겠습니다.


참조: http://social.technet.microsoft.com/wiki/contents/articles/how-to-shard-with-sql-azure.aspx

데이터에 대한 Partion을 생성 할 때 아래 관련 코드 중 PartionField 를 이용하여 여러 데이터베이스에 데이터를 파티션 시킵니다.

실제 응용 프로그램에서 파티션한 결과는 아래와 같습니다. 국가별로 SalesOrderHeader 테이블이 파티션되어 있습니다.


실제 데이터를 한번 살펴보도록 하겠습니다.
위 내용을 통해 응용 프로그램에서 ADO.NET을 이용하여 Sharding Library를 통해 처리된 것을 확인 가능합니다. SSMS를 이용하여 해당 데이터베이스에서 SalesOrderHeader SELECT 해보겠습니다. 데이터베이스 별로 Country별로 구분되어 있습니다.

파티션된 결과에 대해서 Select 하는 코드을 접근해보도록 하겠습니다. 아래 코드를 이용하여 Sharding 에 대한 데이터베이스를 병렬로 액세스해서 결과를 병합해주고 있습니다.


SELECT의 웹 페이지 결과는 다음과 같습니다.

Sharding에 대한 INSERT 에 대한 내용도 한번 알아보도록 하겠습니다. 아래 코드를 통해 해당 파티션에 INSERT를 수행하게 됩니다.

위에서 SQL Azure Sharding에 대해서 알아보았는데 SQL Server Partitioned 뷰와 유사하며 ADO.NET을 통해 Sharding 에 대한 생성, 조회, 추가를 처리할 수 있다는 것을 알 수 있습니다.

이를 통해 대용량 데이터에 대해 확장성 있게 SQL Azure를 구성할 수 있습니다.


외부 콘텐츠 형식(2)-SharePoint Designer 2010 (2)

SharePoint 2010 2011. 9. 6. 08:30 Posted by 알 수 없는 사용자

외부 콘텐츠 형식(2)-SharePoint Designer 2010(2)


앞에 글에 이어 나갑니다.

필터 매개 변수 구성에서는 값을 제한 하거나 와일드 카드를 통해 검색하는 것을 설정합니다. 외부 목록의 경우 값을 제한 하지 않으면 화면에 표시가 되지 않으므로 설정해야 합니다.

필터 매개 변수 추가를 클릭합니다. 그러면 오른쪽 상단의 추가하려면 클릭링크를 볼 수 있습니다. 데이터베이스의 열을 적절히 선택하고 링크를 클릭합니다.

필터 구성 창에서는 필터 형식을 선택할 수 있습니다. 여기에서는 외부 목록을 위해 제한을 선택하고 확인을 클릭합니다.

제한에 대해서는 반드시 제한에 대한 기본값을 지정해야 합니다.

마침을 누르고 저장을 하면 외부 콘텐트 형식을 만들게 되고 Business Data Connectivity Services에 추가되게 됩니다.

외부 콘텐트 형식을 생성했다고 바로 외부 목록 등을 생성해서 이용 할 수는 없습니다. 중앙 관리의 Business Data Connectivity Services 서비스 응용 프로그램에서 개체 사용 권한 설정을 해주어야 합니다.

위에서 생성한 Contacts 를 선택하고 리본 메뉴의 개체 사용 권한 설정을 클릭합니다. 사용자나 그룹을 추가하고 권한을 선택합니다.

팀 사이트로 이동하여 사이트 작업, 기타 옵션에서 외부 목록을 선택하고 만들기를 클릭합니다.

이름을 입력하고 데이터 원본 구성에서 적절한 외부 콘텐츠 형식을 선택하고 확인을 클릭합니다.

그러면 아래와 같은 외부 콘텐츠 형식을 볼 수 있습니다.

외부 콘텐트 형식의 모든 작업 만들기를 선택하였으므로 외부 목록에서 수정하면 해당 데이터베이스의 값이 변경되게 됩니다. 그리고 Office 항목 형식과 오프 라인 사용에 따라서 Outlook의 연락처나 SharePoint Workspace 2010에서의 오프라인 사용도 가능합니다.

수정사항이 발생하여 외부 콘텐트 형식을 수정하면 외부 목록까지 같이 변경되는 것은 아닙니다.

중앙 관리에서 만들어지므로 다른 모든 사이트 모음에서 액세스 가능합니다.

필터의 경우 위와는 별도로 만들어야 할 경우도 있습니다.

다음으로는 필터를 생성하는 내용으로 열 만들기에서 외부 데이터를 이용해보도록 하겠습니다.

외부 콘텐츠 형식(2)-SharePoint Designer 2010 (1)

SharePoint 2010 2011. 8. 30. 08:30 Posted by 알 수 없는 사용자

외부 콘텐츠 형식(2)-SharePoint Designer 2010(1)

외부 콘텐츠 형식을 만들기 위해 SharePoint Designer 2010을 이용하여 외부 목록을 생성해보도록 하겠습니다.



외부 콘텐츠 형식을 만들기 위해서는 SharePoint Designer 2010에서 사이트를 열어서 생성하게 됩니다.

위의 화면에서 리본 메뉴중의 외부 콘텐츠 형식을 클릭합니다.

이름과 표시이름은 데이터베이스의 테이블 이름과 동일하게 “Contacts”로 지정합니다. 네임스페이스는 이름보다 한 단계 위의 카테고리 개념으로 보면 됩니다. 또한 Office 항목 형식에서 지정한다면 Outlook의 연락처로 연결도 가능합니다. 그리고 SharePoint Workspace 2010에서 오프라인 동기화 사용을 체크할 수 있습니다.

맨 마지막의 외부 시스템을 클릭해서 데이터 원본 설정과 작업을 생성하게 됩니다.



연결 추가를 클릭하면 아래와 같은 화면을 볼 수 있습니다.



데이터 원본 설정에서는 “.NET 형식”, ”SQL Server”, ”WCF 서비스세 가지만 설정할 수 있습니다. 다른 데이터 원본에 대한 요구사항은 Visual Studio 2010을 통해 생성해야 합니다.

SQL Server를 선택하고 필요한 정보를 입력합니다.



보안 저장소 응용 프로그램 ID는 외부 데이터를 통합하는 Business Data Connectivity Services Secure Store Services 와 연관이 있습니다.

데이터 원본이 잘 연결되었다면 데이터 탐색기에서 데이터베이스를 확장해서 Contact 테이프를 오른쪽 클릭해서 모든 작업 만들기를 선택합니다.

마법사에서 작업에 대한 설정을 하게 됩니다.



다음을 클릭하고 외부 항목 선택 컨트롤에 표시하도록 선택한 필드가 없다는 경고에 따라 데이터원본 요소에서 “LastName” 을 선택하고 선택 컨트롤에 표시를 체크하고 다음을 클릭합니다.

Office 항목 형식에서 선택한 것에 따라 마법사에서 선택해야 하는 것은 달라집니다.

글이 길어 바로 이어 쓰도록 하겠습니다.


[미리 보는 C++11] 2. override와 final

C++0x 2011. 8. 30. 00:18 Posted by 알 수 없는 사용자

현재의 표준 C++에서는 부모 클래스의 특정 멤버를 오버라이드 할 때 virtual을 앞에 붙입니다.

struct Base

{

  virtual void foo( int i );

};

 

struct Derived : Base

{

  virtual void foo( int i );

}

 위의 예제와 같은 작은 코드를 만질 때는 실수를 하지 않지만 실제 일을 할 때는 크고 많은 클래스를 다루다 보면 실수를 할 수 있습니다. 위 예제의 경우 아래와 같은 실수를 할 수 있습니다.

struct Derived : Base

{

  virtual void foo( float i );

}

위와 같이 실수를 하면 Derived의 foo 멤버함수는 Base foo 멤버함수를 오버라이드 하지 않게 됩니다. 이런 실수는 에러가 아니기 때문에 골치 아픈 삽질을 할 수도 있습니다.

이런 문제를 방지하기 위해서 override가 새로 생겼습니다.

struct Derived : Base

{

  virtual void foo( float i ) override;

}

이렇게 override를 사용하게 되면 컴파일 할 때 Base 클래스에

void foo( float i )가 없는데 오버라이드 한다고 에러를 발생시켜 줍니다.

 

 

때로는 Base 클래스의 특정 멤버함수를 Derived 클래스에서 오버라이드 하지 못하도록 막고 싶은 경우가 있을 것입니다. 이때는 final을 사용합니다.

struct Base

{

  virtual void foo( int i ) final;

};

 

struct Derived : Base

{

  virtual void foo( int i );

}

위의 코드에서는 Base 클래스의 foo 멤버함수를 final로 오버라이드 못하도록 해 놓았기 때문에 컴파일을 하면 에러가 발생합니다.

 

 

 

참고

위키피디아 http://en.wikipedia.org/wiki/C%2B%2B0x

 

SQL Azure Reporting (3)

Cloud 2011. 8. 25. 09:57 Posted by 알 수 없는 사용자

SQL Azure Reporting (3)

앞에서 SQL Azure를 데이터 원본으로 하여 보고서를 생성하고 테스트하고 SQL Azure Reporting에 게시해서 결과를 살펴보았습니다.

이번 글에서는 SQL Azure Reporting Windows Azure 웹 역할에서 이용하는 내용을 다뤄보도록 하겠습니다. SQL Azure Reporting 을 이용하는데 Windows Azure에서 ReportViewer 컨트롤을 사용하는 내용입니다.

Visual Studio 2010을 통해 Windows Azure 프로젝트를 생성합니다. 웹 역할의 이름은 “AzureReportingWebRole” 으로 지정하겠습니다.

Default.aspx 의 디자인 화면에 일단 ScriptManager를 추가합니다. 그리고 도구상자의 보고에 있는 ReportViewer를 추가합니다. 적절히 넓이와 높이를 지정합니다.


솔루션 탐색기에서 참조 추가를 해서 Microsoft.ReportViewer.Common을 추가합니다. Microsoft.ReportViewer.WebForms 컨트롤은 자동으로 추가되었을 겁니다. 추가되지 않았다면 추가합니다. 그리고 어셈블리의 속성에서 로컬 복사를 true 지정합니다. Windows Azure로 게시해서 구동하기 위함입니다.

이제 Default.aspx.cs 로 가서 코드를 작성해보도록 하겠습니다.

Page_Init 이벤트에서 작업을 진행하도록 하겠습니다. Page_Load에서 작업할 경우 보고서가 제대로 처리되지 않습니다. Page_Init 때문에 처음에 상당히 고생했었습니다.



ReportViewer 컨트롤의 ReportServerUrl, ReportPath, ReportServcerCredentials 을 처리하면 됩니다.



ReportServerUrl 의 경우는 아래와 같이 지정하면 됩니다. 별도로 Config 파일에서 불러와도 되겠죠.

https://서버이름.ctp.reporting.database.windows.net/ReportServer

ReportPath 의 경우는 위 주소로 로그인하면 경로와 보고서이름을 알 수 있습니다.

/subdir/reportname

ReportServcerCredentials 같은 경우는 IReportServcerCredentials 형식이라 별도의 클래스를 생성해야 합니다. 해당 클래스는 IReportServcerCredentials 인터페이스를 상속해야 합니다. 인터페이스를 구현하면 아래와 같이 구성되게 됩니다. Authority는 서버전체이름 또는 도메인을 나타냅니다.

로컬에서 실행하고 테스트를 진행해봅니다.

이제 Windows Azure로 게시해보도록 하겠습니다. 물론 결과는 잘 나옵니다.

ReportViewer 컨트롤 외에 ReportService2010.asmx 를 통해서도 보고서를 액세스할 수 있습니다.

이상으로 SQL Azure Reporting에 대한 부분을 간략히 살펴보았습니다.

SQL Azure Reporting 은 아직 SSMS를 통해서 액세스가 되지는 않습니다. 또한 관리자 사이트를 별도로 제공하고 있지 않습니다. 보고서 권한, 매개변수, 스냅숏/캐시 등의 내용에는 제약이 있습니다. 지금은 CTP 입니다.

Windows Azure 에서 SQL Azure 데이터를 기반으로 리포팅에 대한 내용을 지원해주고 있는 기능입니다.

SQL Azure Reporting 관련 문서는 아래를 참고하시면 됩니다. 또한 Sample을 다운로드 받을 수 있습니다.

http://msdn.microsoft.com/en-us/library/gg552871.aspx#ReportsandReportViewer

http://social.technet.microsoft.com/wiki/contents/articles/sql-azure-reporting-samples.aspx


'Cloud' 카테고리의 다른 글

SQL Azure Data Sync (1) – 소개와 Agents 구성  (0) 2011.09.09
SQL Azure Sharding 소개  (0) 2011.09.08
SQL Azure Reporting(2)  (0) 2011.08.18
SQL Azure Reporting (1)  (0) 2011.08.11
SQL Azure 데이터 이용(5)  (0) 2011.08.04

외부 콘텐트 형식(1) – 소개

SharePoint 2010 2011. 8. 23. 08:33 Posted by 알 수 없는 사용자

외부 콘텐트 형식(1) – 소개

이번 글에서는 개발자들이 접근해야 하는 외부 콘텐트 형식에 관련된 내용입니다.

이전 버전에서는 Business Data Catalog 라는 기능으로 외부 데이터를 SharePoint에 손쉽게 통합을 할 수 있었는데 XML 파일을 생성하는데 도구를 제공하지 않다가 BDC Definition Editor를 제공해서 작업했었습니다.

SharePoint 2010에서는 Business Data Connectivity Services 를 통해 외부 데이터를 손쉽게 통합할 수 있으며 이전 버전보다는 더 많은 기능을 제공하고 있으며 SharePoint Designer 2010 Visual Studio 2010을 통해 개발 도구를 지원해주고 있습니다.

외부 콘텐트 형식으로 이용할 수 있는 내용들을 먼저 알아보도록 하겠습니다. 아래의 아이콘을 보게 된다면 외부 콘텐트 형식이라고 알 수 있습니다.

l 열 만들기에서 열의 정보 형식을 외부 데이터로 선택



l 비즈니스 데이터 관련 웹 파트의 속성

l 사이트 작업의 기타 옵션에서 외부 목록을 생성할 경우

l 차트 웹 파트에서 차트에 데이터 연결할 경우

l 검색 설정에서 검색 데이터 원본을 설정할 경우 (여기서는 아이콘은 나타나지 않습니다.)


l 사용자 프로필에서 BDC를 선택할 경우

Business Data Connectivity Services 서비스 응용 프로그램에 대한 관리 화면은 아래와 같습니다.

아래 화면에서 개체 사용 권한을 설정하거나 BDC 파일을 가져오기 할 수 있습니다.

외부 콘텐트 형식을 생성할 수 있는 도구는 두 가지가 있습니다.

l SharePoint Designer 2010을 통한 방법입니다.

l Visual Studio 2010 SharePoint 프로젝트에서 구성할 수 있습니다.


위 두 가지 방법의 특징을 알아보는 것은 뒤에서 다루도록 하겠습니다. 또한 외부 목록이나 필터필 만드는 것도 뒤에서 다룰 예정입니다. 본 글은 SharePoint 2010에서의 Business Data Connectivity Services 의 외부 콘텐트 형식에 대한 간단한 소개글입니다.


[미리 보는 C++11] 1. UTF-8, UTF-16(char_16t), UTF-32(char32_t) 문자형

C++0x 2011. 8. 22. 09:00 Posted by 알 수 없는 사용자
앞으로 조금씩이라도 꾸준히 C++11에 새로 추가되는 기능들을 간단하게 소개하려고 합니다.
새로운 라이브러리의 경우 boost 라이브러리에 있는 것은 boost 라이브러리를 통해서 예제와 같이
좀더 자세하게 설명하고 그렇지 못한 것들은 간단한 설명과 코드로만 설명하려고 합니다.

C++ 프로그래머에게 새로운 C++ 표준은 먼 미래의 것이 아닙니다. 지금부터 조금씩 공부해보죠^^
(개인적으로 예전에 STL의 경우를 보면 앞으로 C++11을 아는 C++ 프로그래머와 모르는 프로그래머로 나누어지지 않을까 생각합니다)



현재의 C++에서는 두 가지 종류의 문자형을 지원하고 있습니다. char wchar_t 입니다.

char szName[] = “jacking”;

wchar_t szName2[] = L”jacking”;

 

그러나 C++0x에서는 유니코드를 강력하게 지원하기 위해 새로운 문자형이 추가 됩니다.

 

 

 

UTF-8

UTF-8을 사용하는 문자형은 따로 없고 기존의 char를 사용합니다.

char szName[] = u8”jacking”;

문자열 리터럴(literal) 앞에 u8을 붙입니다.

 

 

UTF-16

UTF-16을 사용하는 문자형 변수를 선언할 때는 char_16t를 사용합니다.

char16_t szName3[] = u”jacking”;

문자열 리터럴 앞에 u를 붙입니다.

 

 

UTF-32

UTF-32을 사용하는 문자형 변수를 선언할 때는 char_32t를 사용합니다.

char32_t szName4[] = U”jacking”;

문자열 리터럴 앞에 U를 붙입니다.