Visual Studio Hotfix List

Visual Studio 2010 2010. 11. 2. 09:00 Posted by 알 수 없는 사용자
사람이 만드는 소프트웨어에 버그 ‘0’이라는 것은 무척이나 힘들고 특히 Visual Studio 같은 대형 프로그램은 자잘한 버그가 있습니다. 하지만 Visual Studio는 마이크로소프트의 주력 제품인 만큼 버그가 알려지면 패치가 재빨리 나오니 자잘한 버그에 대해서는 걱정하지 않으셔도 됩니다.


Visual Studio의 자잘한 버그로 피곤하신 분들을 위해 일본인 프로그래머인 kkamegawa씨가 개인적으로 마이크로소프트 사이트에서 수집하여 만든 Visual Studio Hotfix 링크 모음집을 소개합니다.


Visual Studio 2010 Hotfix

http://mist.clueup.org/VSHotFixLists/

 

Visual 2008 SP1 Hotfix 

http://mist.clueup.org/VSHotFixLists/default.aspx?Product=VS2008

 

사용하고 있는 Visual Studio에 버그가 있다면 당장 위의 사이트에 가서 확인해 보시기 바랍니다.

 

[Step. 16] array 클래스에 non-CLI 오브젝트 사용

C++/CLI 2010. 10. 27. 09:00 Posted by 알 수 없는 사용자

C++/CLI은 네이티브 C++과 다르게 자료구조 배열을 사용하기 위해서는 array 컨테이너를 사용합니다.

array 컨테이너는 기본적으로 non-CLI 오브젝트는 사용할 수가 없습니다. 그러나 non-CLI 오브젝트가 포인터라면 사용할 수 있습니다.

 

아래는 array 컨테이너에 non-CLI 오브젝트를 사용한 경우입니다.

using namespace System;

 

class CNative

{

public:

           CNative()

           {

                     Console::WriteLine(__FUNCTION__);

           }

           ~CNative()

           {

                     Console::WriteLine(__FUNCTION__);

           }

};

 

int main(array<System::String ^> ^args)

{

           array<CNative>^ arr = gcnew array<CNative>(2);

           return 0;

}

 빌드하면 위에 이야기 했듯이 아래와 같은 빌드 에러가 발생합니다.


 

그럼 이번에는 non-CLI 오브젝트의 포인터를 사용해 보겠습니다.

#include "stdafx.h"

#include <iostream>

using namespace System;

 

class CNative

{

public:

           CNative()

           {

                     Console::WriteLine(__FUNCTION__);

           }

           ~CNative()

           {

                     Console::WriteLine(__FUNCTION__);

           }

};

 

int main(array<System::String ^> ^args)

{

           array<CNative*>^ arr = gcnew array<CNative*>(2);

           for(int i=0; i<arr->Length; i++)

           {

                     arr[i] = new CNative();

           }

 

           getchar();

           return 0;

}


이번에는 빌드에 문제가 없어서 아래와 같이 실행결과가 나옵니다.


 

그러나 위의 실행 결과를 보면 이상한 점을 발견하실 수 있을 것입니다. 그것은 CNative 오브젝트의 생성자는 호출하지만 파괴자는 호출되지 않은 것입니다. 이것은 array 컨테이너는 CLI 객체이므로 GC에서 관리하지만 non-CLI 오브젝트를 포인터 타입으로 사용한 것은 GC에서 관리하지 않으므로 만약 array GC에서 소멸 되기 전에 array에 담겨있는 non-CLI 오브젝트를 메모리(new로 할당한)를 해제하지 않으면 메모리 해제가 되지 않아서 메모리 릭이 발생합니다.

 

그래서 아래와 같이 array GC에서 소멸되기 전에 메모리를 해제하도록 해야합니다.

#include "stdafx.h"

#include <iostream>

using namespace System;

 

class CNative

{

public:

           CNative()

           {

                     Console::WriteLine(__FUNCTION__);

           }

           ~CNative()

           {

                     Console::WriteLine(__FUNCTION__);

           }

};

 

int main(array<System::String ^> ^args)

{

           array<CNative*>^ arr = gcnew array<CNative*>(2);

           for(int i=0; i<arr->Length; i++)

           {

                     arr[i] = new CNative();

           }

 

           for(int i=0; i<arr->Length; i++)

           {

                     delete arr[i];

           }

          

           getchar();

           return 0;

}

 

실행 결과


이번에는 CNative의 파괴자가 제대로 호출되고 있습니다.



출처

도서 "C++/CLI In Action"

C++/CLI를 공부하시는 분들은 "C++/CLI In Action" 책을 꼭 한번 보시기를 추천합니다.

안녕하세요. 방수철입니다.
이번 글에서는 copy_if, copy_n, find_if_not에 대해서 알아보도록 하겠습니다.

copy_if

MSDN에 등록된 copy_if에 대한 선언은 다음과 같습니다.

template<class InputIterator, class OutputIterator, class BinaryPredicate>
    OutputIterator copy_if(
        InputIterator_First, 
        InputIterator _Last,
        BinaryPredicate _Comp
    );

copy_if는 _First 가 가리키는 위치부터 _Last가 가리키는 위치까지 _Comp조건을 만족하는 element를 copy하게 됩니다.
그런데 뭔가 허전하죠? 이 선언에는 copy를 수행해서 저장될 container가 빠져있습니다. 아마 MSDN의 오류인 것 같습니다.
copy인 만큼 당연히 source가 되는 container에는 변화가 없습니다.

VC2010에 포함된 헤더파일에 있는 선언은 다음과 같습니다.

template<class _InIt,
	class _OutIt,
	class _Pr> inline
	_OutIt copy_if(_InIt _First, _InIt _Last, _OutIt _Dest,
		_Pr _Pred)

_Dest 인자가 선언되어 있는 것을 확인할 수 있습니다.

아래 코드는 20의 약수를 골라내는 프로그램입니다.

	const int N=12;
	list<int> src;
	list<int> dest;
	// 데이터 초기화
	for(int i=1 ; i<=N ; i++)
		src.push_back(i);
 
	// 약수만을 복사
	copy_if(src.begin(), src.end(), back_inserter(dest), [=](int n){ return N % n == 0; });
 
	// 결과 출력
	cout<<N<<"의 약수 : ";
	for_each(dest.cbegin(), dest.cend(), [](int n){cout << n << " ";});



copy_if는 내부적으로 _Dest 반복자에 ++ 연산을 해서 위치를 이동시킵니다. 따라서 dest list는 미리 충분한 공간을 확보해두거나
예로든 코드 처럼 back_inserter로 반복자를 넘겨주어야 합니다.



copy_n

MSDN에 등록된 copy_n에 대한 선언은 다음과 같습니다.

template<class InputIterator, class Size, class OutputIterator>
    OutputIterator copy_n(
        InputIterator  _First, 
        Size _Count,
        OutputIterator _Dest
    );


copy_n은 _First 위치에서 _Count 개수만큼 element를 _Dest에 복사합니다. 다음과 같이 사용할 수 있습니다.

  1 	copy_n(src.begin(), 3, back_inserter(dest));

find_if_not

MSDN에 등록된 find_if_not에 대한 선언은 다음과 같습니다.


template<class InputIterator, class Predicate>
    InputIterator find_if_not(
        InputIterator _First, 
        InputIterator _Last,
        BinaryPredicate _Comp
    );



_First 위치부터 _Last위치까지 _Comp를 수행해서 false를 반환하는 첫번째 위치의 반복자를 return하게 됩니다.
아래의 프로그램은 copy_if에서 사용한 프로그램을 약간 수정한 것입니다.
12의 약수가 아닌 가장 작은 자연수를 구하는 과정입니다.

	const int N=12;
	list<int> src;
	list<int> dest;
	// 데이터 초기화
	for(int i=1 ; i<=N ; i++)
		src.push_back(i);
 
	// 약수만을 복사
	copy_if(src.begin(), src.end(), back_inserter(dest), [=](int n){ return N % n == 0; });
	// 3개만 복사
	auto pos = find_if_not(src.cbegin(), src.cend(), [=](int n){ return N % n == 0; });
 
 
	// 결과 출력
	cout<<N<<"의 약수 : ";
	for_each(dest.cbegin(), dest.cend(), [](int n){cout << n << " ";});
	cout<<endl;
	cout<<N<<"의 약수가 아닌 가장 작은 자연수 : "<< *pos <<endl;


출력은 다음과 같습니다.



ASP.NET Chart Control

ASP.NET Chart 컨트롤은 닷넷 프레임워크 안의 데이터 시각화를 확장하여 제공했습니다. Chart 컨트롤을 사용하면서, 당신은 쉽게 차트가 있는 ASP.NET 페이지들을 생성할 수 있습니다. 그차트는 복집한 통계 혹은 재무적 분석을 위하여, 직관적이고 시각적으로 강력한 차트입니다. ASP.NET 차트 컨트롤은 닷넷 프레임워크 3.5 SP1 배포에서 추가되어 소개되었습니다. 그리고 그것은 닷넷 프레임워크 4.0 배포의 일부가 될 것입니다.

차트 컨트롤의 주요 특징은 다음과 같습니다:

  • 35 개의 서로 다른 차트 유형.
  • 제한 없는 차트 범위, 제목, 설명 그리고 주석.
  • 모든 차트 요소들을 위한 아주 다양한 표현 설정.
  • 대부분의 차트 유형들에 지원하는 3-D.
  • 데이터 포인트 주변에 자동적으로 들어 맞는 스마트 데이터 레이블
  • 선 제거, 눈금 생략, 대수의 눈금.
  • 데이터 분석과 가공을 위한 50개 이상의 재무적, 통계적 공식.
  • 간단한 바인딩과 차트 데이터의 조작.
  • 날짜, 시간, 통화 같은 공통 데이터 양식을 위한 지원.
  • AJA를 사용하는 클라이언트 클릭 이벤트를 포함하면서, 상호작용과 이벤트 중심의 커스터마이즈 지원.
  • 상태 관리.
  • 이진 문자열.

다음의 표들은 ASP.NET 차트 컨트롤에 의하여 생성된 재무 차트의 예를 보여줍니다.

Figure 2: ASP.NET 차트 컨트롤의 예들

ASP.NET 차트 컨트롤을 사용하는 법의 더 많은 예를 위하여, MSDN의 웹사이트에서 다음의  Samples Environment for Microsoft Chart Controls 샘플 코드를 다운로드 하세요. 당신은 Chart Control Forum 에서 커뮤니티 내용에서 더 많은 예를 찾을 수 있습니다.

Adding the Chart Control to an ASP.NET Page

다음의 예는 마크업을 사용하여 ASP.NET 페이지에 Chart 컨트롤을 추가하는 법을 보여줍니다. 예를 들어, Chart 컨트롤은 정적 데이터 포인트를 위하여 컬럼 차트를 생성합니다.

 
<asp:Chart ID="Chart1" runat="server"> <Series> <asp:Series Name="Series1" ChartType="Column"> <Points> <asp:DataPoint AxisLabel="Product A" YValues="345"/> <asp:DataPoint AxisLabel="Product B" YValues="456"/> <asp:DataPoint AxisLabel="Product C" YValues="125"/> <asp:DataPoint AxisLabel="Product D" YValues="957"/> </Points> </asp:Series> </Series> <ChartAreas> <asp:ChartArea Name="ChartArea1"> <AxisY IsLogarithmic="True" /> </asp:ChartArea> </ChartAreas> <Legends> <asp:Legend Name="Legend1" Title="Product Sales" /> </Legends> </asp:Chart>

 

Using 3-D Charts

Chart 컨트롤은 ChartAreas 콜렉션을 포함합니다. 그것은 차트 영역의 특성을 정의 하는 ChartArea 객체를 포함 할 수 있습니다. 예를 들어, 차트 영역을 위하여 3-D를 사용하고, 다음의 예에서 처럼 Area3DStyle 속성을 사용합니다: 

 
<asp:ChartArea Name="ChartArea1"> <area3dstyle Rotation="10" Perspective="10" Enable3D="True" Inclination="15" IsRightAngleAxes="False" WallWidth="0" IsClustered="False" /> <%-- Additional markup here --%> </asp:ChartArea>
 

아래의 표는 Bar 차트 유형의 4개의 시리즈와 함께 3-D 차트를 보여줍니다.

Figure 3: 3-D Bar Chart

 

Using Scale Breaks and Logarithmic Scales

눈금 생략과 대수의 눈금은 차트에 세련미를 더하는 두가지 차가적인 방법이 있습니다. 이 특징들은 차트 영역에서 각각의 축에 명시합니다. 예를 들어, 차트 영역의 첫번째 Y 축에 이 특성을 사용하려면, ChartArea 객체안의 AxisY.IsLogarithmicScaleBreakStyle 속성을 사용하세요. 다음의 코드 조각은 첫번째 Y 축상에서 눈금 생략을 사용하는 법을 보여줍니다.
 

<asp:ChartArea Name="ChartArea1"> <axisy> <ScaleBreakStyle BreakLineStyle="Wave" CollapsibleSpaceThreshold="40" Enabled="True" /> </axisy> <%-- Additional markup here --%> </asp:ChartArea>







아래의 표는 눈금 생략을 활성화시켜 Y축을 보여줍니다.



Figure 4
: Scale Breaks

데이터 기반 웹페이지를 만드는 개발자들에게 데이터를 필터링은 아주 일반적인 작업입니다. 이것은 전통적으로 데이터 소스 컨트롤 안의 where 구문을 빌드하는 것에 의하여 처리되었습니다. 이 접근은 복잡하게 될 수 있고, 어떤 경우에는 where 문법이 기초 데이터의 모든 기능에 불이익을 주기도 합니다. 더 쉽게 필터링 하기 위하여, 새로운 QueryExtender 컨트롤이 ASP.NET 4에서 추가 되었습니다. 이 콘트롤들에 의하여 반환된 데이터를 필터링 하기 위하여, QueryExtenderEntityDataSource 혹은 LinqDataSource 에 추가 되었습니다. QueryExtender 는 LINQ에 의존하기 때문에, 그 필터는 데이터가 페이지에 보내지기 전에 데이터베이스 서버에 제공됩니다. 그 결과 아주 효율적인 처리가 이루어집니다. QueryExtender 컨트롤은 다양한 필터 옵션들을 제공합니다. 다음의 섹션은 이 옵션들을 설명하고, 그 사용법의 예시를 제공합니다.

Search

검색 옵션을 위하여, QueryExtender  컨트롤은 지정된 필드 안의 레코드들을 찾기위하여, 텍스트 검색을 사용합니다. 다음의 예에서, 이 컨트롤은 TextBoxSearch 컨트돌 안에 들어가는 텍스트를 사용합니다. 그리고 LinqDataSource 컨트롤로 부터 반환된 데이터의 ProductNameSupplier.CompanyName 컬럼 안의 내용에서 검색을 합니다.

<asp:LinqDataSource ID="dataSource" runat="server"> TableName="Products">
</asp:LinqDataSource>
<asp:QueryExtender TargetControlID="dataSource" runat="server">
  <asp:SearchExpression DataFields="ProductName, Supplier.CompanyName"
      SearchType="StartsWith">
    <asp:ControlParameter ControlID="TextBoxSearch" />
  </asp:SearchExpression>
</asp:QueryExtender>
 

Range

범위 옵션은 검색 옵션과 비슷합니다. 그러나 범위를 정의하기 위하여 한 쌍의 값을 지정합니다. 다음의 예에서, QueryExtender 컨트롤은 LinqDataSource 컨트롤로 부터 반환된 데이터 안의 UnitPrice 컬럼을 검색합니다. 범위는 페이지의 TextBoxFrom 과 TextBoxTo  컨트롤에서 읽어옵니다.

 
<asp:LinqDataSource ID="dataSource" runat="server"> TableName="Products"> </asp:LinqDataSource> <asp:QueryExtender TargetControlID="dataSource" runat="server"> <asp:RangeExpression DataField="UnitPrice" MinType="Inclusive" MaxType="Inclusive"> <asp:ControlParameter ControlID="TextBoxFrom" /> <asp:ControlParameter ControlID="TexBoxTo" /> </asp:RangeExpression> </asp:QueryExtender>

 

PropertyExpression

PropertyExpression 옵션은 속성값에 비교를 정의 할 수 있도록 합니다. PropertyExpression이 참이라면, 설명된 데이터가 반환 됩니다. 다음의 예에서, QueryExtender 컨트롤은 페이지의 CheckBoxDiscontinued 컨트롤의 값으로 Discontinued 컬럼의 데이터를 비교하여 필터링합니다.

 
<asp:LinqDataSource ID="dataSource" runat="server" TableName="Products"> </asp:LinqDataSource> <asp:QueryExtender TargetControlID="dataSource" runat="server"> <asp:PropertyExpression> <asp:ControlParameter ControlID="CheckBoxDiscontinued" Name="Discontinued" /> </asp:PropertyExpression> </asp:QueryExtender>

CustomExpression

마지막으로, QueryExtender 컨트롤에서 사용하는 CustomExpression을 설명합니다. 이 옵션은 사용자 정의 필터 로직을 정의하는 페이지 안의 함수를 호출 할 수 있게 합니다. 다음의 예는 QueryExtender 컨트롤 안의 사용자 정의 표현식을 선언적으로 지정하는 법을 보여줍니다.

 
<asp:LinqDataSource ID="dataSource" runat="server" TableName="Products"> </asp:LinqDataSource> <asp:QueryExtender TargetControlID="dataSource" runat="server"> <asp:CustomExpression OnQuerying="FilterProducts" /> </asp:QueryExtender>
 

다음의 예는 QueryExtender 컨트롤에 호출된 사용자 정의 함수를 보여줍니다. 이 경우에, Where 구문을 포함한 데이터베이스 쿼리를 사용하는 것 대신에, 이 코드는 데이터를 필터링 하기 위하여 LINQ 쿼리를 사용하였습니다.

 
protected void FilterProducts(object sender, CustomExpressionEventArgs e) { e.Query = from p in e.Query.Cast<Product>() where p.UnitPrice >= 10 select p; }

이 예는 QueryExtender 컨트롤에서 사용되고 있는 단지 하나의 표현을 한 번에 보여준 것입니다. 그러나, QueryExtender 컨트롤 내부에 다양한 표현식을 사용하는 것도 가능합니다.

 


RValue Reference에 의한 STL의 성능향상 테스트

C++0x 2010. 10. 18. 07:00 Posted by 알 수 없는 사용자

트위터에서 @All2one님을 통해서 GCC 컴파일러에서 RValue Reference Move Semantics를 사용했을 경우와 그렇지 않은 경우 STL에서 얼마만큼의 성능 차이가 나는지 테스트를 한 결과를 보았습니다.

사이트 주소는 http://cpp-next.com/archive/2010/10/howards-stl-move-semantics-benchmark/

입니다.

 

이것은 GCC 컴파일러를 사용한 경우라서 저는 VC++을 사용하여 어떤 결과가 나오는지 궁금해서 테스트 해 보았습니다.

RValue Reference을 사용하지 않는 가장 최신의 컴파일러는 VC++ 9(VS2008)이므로 VC++10 VC++9를 같은 코드로 컴파일한 후 실행하였습니다.

 

먼저 테스트한 컴퓨터의 하드웨어 사양은 아래와 같습니다.


 

테스트 코드는 아래와 같습니다(GCC로 테스트한 것과 같은 코드입니다).

#include <vector>

#include <iostream>

#include <time.h>

#include <set>

#include <algorithm>

 

const unsigned N = 3001;

 

extern bool some_test;

 

std::set<int>

get_set(int)

{

    std::set<int> s;

    for (int i = 0; i < N; ++i)

        while (!s.insert(std::rand()).second)

            ;

    if (some_test)

        return s;

    return std::set<int>();

}

 

std::vector<std::set<int> >

generate()

{

    std::vector<std::set<int> > v;

    for (int i = 0; i < N; ++i)

        v.push_back(get_set(i));

    if (some_test)

        return v;

    return std::vector<std::set<int> >();

}

 

float time_it()

{

    clock_t t1, t2, t3, t4;

    clock_t t0 = clock();

    {

    std::vector<std::set<int> > v = generate();

    t1 = clock();

    std::cout << "construction took " << (float)((t1 - t0)/(double)CLOCKS_PER_SEC) << std::endl;

    std::sort(v.begin(), v.end());

    t2 = clock();

    std::cout << "sort took " << (float)((t2 - t1)/(double)CLOCKS_PER_SEC) << std::endl;

    std::rotate(v.begin(), v.begin() + v.size()/2, v.end());

    t3 = clock();

    std::cout << "rotate took " << (float)((t3 - t2)/(double)CLOCKS_PER_SEC) << std::endl;

    }

    t4 = clock();

    std::cout << "destruction took " << (float)((t4 - t3)/(double)CLOCKS_PER_SEC) << std::endl;

    std::cout << "done" << std::endl;

    return (float)((t4-t0)/(double)CLOCKS_PER_SEC);

}

 

int main()

{

    std::cout << "N = " << N << '\n';

    float t = time_it();

    std::cout << "Total time = " << t << '\n';

}

 

bool some_test = true;

 

 

< 결과 >


 


 


이 결과를 보면 생성과 알고리즘을 사용했을 때 많은 차이가 나는 것을 알 수 있습니다.

기존에 STL의 알고리즘을 자주 사용한 경우라면 VC++ 10으로 컴파일만 해도 어느 정도의 성능 향상을 얻을 수 있을 것 같습니다.

 

지난 2010년 9월 28일, Visual Studio Korea 에서 처음으로 진행한 Visual Studio Seminar #1 이 있었습니다. 이 날 세미나를 위해 많은 분들이 ONOFFMIX 사이트를 통해 등록을 해 주셨고, 모든 분들이 오신 것은 아니지만 재미있는 주제로 세미나를 진행하였습니다.

이 날 발표했던 자료를 공유해 드립니다. 세미나 후기가 궁금하신 분은 여기를 클릭하세요^^

   

발표 내용 소개

현실적인 클라우드 컴퓨팅 이야기 / 남정현 C# MVP

클라우드 컴퓨팅, 말로만 들어봤지 실제로 어디에 어떻게 사용이 될 수 있는지 알려주는 사람이 없어 답답할 때가 많습니다. 이번 세션에서는 클라우드 컴퓨팅에 관한 실질적인 이야기, 그 중에서도 특별히 마이크로소프트의 윈도 애저 플랫폼에 대한 이야기를 나누면서, 클라우드 컴퓨팅의 현실적인 사례를 간단히 들어보기로 하겠습니다.

   

Expression Blend 와 함께하는 윈도우 폰 7 개발 입문 / 조진현

윈도우 폰7 개발에 대한 간단한 소개와 방법에 대해서 살펴본다. 그리고 더 쉽고 편한 개발을 위한 고민을 해보며, 이를 위해서 Expression Blend 의 활용에 대해서 고민해 본다.

   

Razor 로 열어가는 새로운 ASP.NET - 김시원 ASP.NET MVP

Razor 는 차세대 ASP.NET 의 새로운 View Engine 으로써 , 이것 때문에 요즈음 ASP.NET 이 한창 주목 받고 있습니다. 이번 시간에는 Razor 의 등장배경과 함께 Razor 로 인해 개발 환경이 어떻게 변화하였는지 살펴보고 , 기본적인 Razor 의 사용법을 익혀보도록 하겠습니다.

     

발표자 소개

   

남정현 C# MVP

(주)코아뱅크에 재직 중이며, Microsoft Visual C# MVP로 활동 중입니다. DEVPIA C# Forum SYSOP, Windows Azure Cafe SYSOP을 맡고 있습니다. 여러 커뮤니티와 개인 블로그, 트위터 (@rkttu)를 통하여 윈도 애저 플랫폼에 대한 다양한 이야기를 전파하고 있습니다.

   

조진현

현재 게임 개발자로 재직 중이며  Visual Studio 2010 공식 팀 블로그 (http://vsts2010.net) 에서 DirectX 관련 분야에서 활동 중이다. 최근에는 '김탁구'와 '나는 전설이다' 라는 드라마에 빠져서 살고 있다.

   

   

   

김시원 ASP.NET MVP

ASP/ASP.NET MVP를 2009년 부터 계속 유지해오고 있으며 다양한 형태의 웹 어플리케이션 개발 경험과 세미나 경험을 가지고 있다. 현재 Hugeflow 웹 솔루션 개발팀에서 개발의욕을 불사르고 있다. 세상을 풍요롭게 하고 사람들에게 강한 종속성을 부여하는 프로그램을 개발하는 것이 목표이다.

   

[[김시원]]

   

   

지난 2010년 9월 28일, Visual Studio Korea 에서 처음으로 진행한 Visual Studio Seminar #1 이 있었습니다. 이 날 세미나를 위해 많은 분들이 ONOFFMIX 사이트를 통해 등록을 해 주셨고, 모든 분들이 오신 것은 아니지만 재미있는 주제로 세미나를 진행하였습니다.

세미나 아젠다

시간

세션 내용

19:00 ~ 19:30

등록

19:30 ~ 20:10

현실적인 클라우드 컴퓨팅 이야기

남정현 C# MVP

20:20 ~ 21:00

Expression Blend 와 함께하는 윈도우 폰 7 개발 입문

조진현

21:10 ~ 21:50

Razor 로 열어가는 새로운 ASP.NET

김시원 ASP.NET MVP

     

 

 

     

발표 내용 소개

현실적인 클라우드 컴퓨팅 이야기 / 남정현 C# MVP

클라우드 컴퓨팅, 말로만 들어봤지 실제로 어디에 어떻게 사용이 될 수 있는지 알려주는 사람이 없어 답답할 때가 많습니다. 이번 세션에서는 클라우드 컴퓨팅에 관한 실질적인 이야기, 그 중에서도 특별히 마이크로소프트의 윈도 애저 플랫폼에 대한 이야기를 나누면서, 클라우드 컴퓨팅의 현실적인 사례를 간단히 들어보기로 하겠습니다.

   

Expression Blend 와 함께하는 윈도우 폰 7 개발 입문 / 조진현

윈도우 폰7 개발에 대한 간단한 소개와 방법에 대해서 살펴본다. 그리고 더 쉽고 편한 개발을 위한 고민을 해보며, 이를 위해서 Expression Blend 의 활용에 대해서 고민해 본다.

   

Razor 로 열어가는 새로운 ASP.NET - 김시원 ASP.NET MVP

Razor 는 차세대 ASP.NET 의 새로운 View Engine 으로써 , 이것 때문에 요즈음 ASP.NET 이 한창 주목 받고 있습니다. 이번 시간에는 Razor 의 등장배경과 함께 Razor 로 인해 개발 환경이 어떻게 변화하였는지 살펴보고 , 기본적인 Razor 의 사용법을 익혀보도록 하겠습니다.

  

   

첫 번째 세션인 남정현님의 '현실적인 클라우드 컴퓨팅 이야기' 입니다. 우리 나라에서 클라우드라는 큰 주제로 Windows Azure 플랫폼 기술을 전파하시고 계시는 MVP 분입니다.

 

세미나를 하시면서도 표정 관리에 들어가시고, 사진을 요염하게 의식하시는 모습이 역시 프로답습니다. ^^

   

두 번째 세션은 게임 개발자이신 조진현님의 'Expression Blend 와 함께하는 윈도우 폰 7 개발 입문' 세션입니다. 게임 영역이 아닌 윈도우 폰과 Expression Blend 세션인데, 처음으로 윈도우 폰7에 입문하시는 분을 위해 개인적으로 공부하셨던 부분을 발표해 주셨습니다.

 

조진현님은 KGC와 같은 큰 무대에 여러 번 발표를 해 보신, 경험이 많으신 분인데 이 날 데모 귀신이 왔다 갔다 했다는 후문이… ^^

   

마지막 세션은 김시원 ASP.NET MVP 님이 새로운 뷰 엔진인 Razor 에 대해 매우 재치있고 재미있게 발표를 해 주셨습니다. ASP.NET을 줄곧 파 오셨고, 새로운 기술과 실전 경험에 이미 도가 트신 분이죠^^ 

 

오잉.. 김시원님도 카메라를 요염하게 의식하고 계시군요..

   

   

세미나 접수대에서는 저희 운영진 두 분이 항시 대기 중입니다. (좌측 ASP.NET 4.0 박종혁님, 우측 WCF의 오태겸님)

   

그리고 많은 분들이 참여해 주셔서 이 날 모두 알차게 세미나를 준비했고 마친 것 같습니다. 이하 사진 더 공유하고 마칩니다.^^

   

   

Concurrency Runtime
– Task Scheduler 5. ( Context blocking )

작성자: 임준환( mumbi at daum dot net )

 

시작하는 글

 이번 글에서는 컨텍스트를 제어할 수 있도록 도와주는 wait() 와 Context 클래스에 대해서 알아보도록 하겠습니다.

 

void Concurrency::wait( unsigned int _Milliseconds )

 현재 컨텍스트를 지정된 시간 동안 지연시킵니다.

 Windows API 의 Sleep() 과 같은 기능을 합니다. 하지만 Sleep() 과 달리 협조적 스케줄링을 한다는 것이 다릅니다. 컨텍스트가 지연되는 동안 컴퓨팅 리소스( core ) 는 다른 작업을 수행합니다.

 매개변수로 0을 전달하면 다른 모든 활성화된 컨텍스트들이 작업을 수행할 수 있을 때까지 현재 컨텍스트를 지연시킵니다. 다른 작업들에게 양보한다는 뜻입니다.

 

Context

 Context 클래스는 현재 컨텍스트를 나타냅니다. Context 클래스는 크게 2 가지의 기능을 가지고 있는데 그 중 첫 번째는 컨텍스트의 블러킹( blocking ) 이고, 두 번째는 초과 스레드 생성입니다.

이번 글에서는 컨텍스트의 블러킹에 대해서 알아보록 하고, 초과 스레드 생성은 다음 글에서 살펴보도록 하겠습니다.

 

Block & Unblock

 현재 컨텍스트를 블럭킹하려면 Context::Block() 을 호출하면 됩니다. 이렇게 되면 현재 컨텍스트는 수행을 멈추고 다른 작업들에게 리소스를 양보하게 됩니다.

 블러킹을 해제하려면 Context::Unblock() 을 호출하면 됩니다. 하지만 블러킹된 컨텍스트에서 스스로 블러킹을 해제할 수 없습니다. 블러킹된 컨텍스트에서 자기의 컨텍스트의 블러킹을 해제하려고 하면 context_self_unblock 예외가 던져집니다.

 실제로 Context 객체를 사용해 블러킹과 해제를 하려면 Context::CurrentContext() 를 호출하여 현재 스레드에 연결된 Context 객체를 참조하여 블러킹하고, 다른 컨텍스트에 그 참조를 전달하여, 나중에 참조를 사용하여 블러킹을 해제해야 합니다.

 Block() 과 Unblock() 은 항상 쌍을 이루어 호출되어야 합니다. 만약 같은 함수가 연속으로 호출되면 context_unblock_unbalanced 예외를 던집니다.

 또한 Context 객체는 스케줄링 양보를 위한  Context::Yield() 를 제공합니다. Context::Block() 을 사용하면 스케줄링되지 않습니다.

 

예제

 Context 클래스를 이용한 세마포어( semaphore ) 의 구현을 보도록 하겠습니다.

 

시나리오

 구현된 세마포어를 사용한 parallel_for() 를 사용하여 작업이 어떻게 진행되는지 살펴보겠습니다.

 

코드

#include <Windows.h>
#include <concrt.h>
#include <concurrent_queue.h>
#include <iostream>
#include <sstream>
#include <ppl.h>

using namespace std;
using namespace Concurrency;

class semaphore
{
public:
	explicit semaphore( long capacity )
		: semaphore_count( capacity ) { }

	void acquire()
	{
		if( InterlockedDecrement( &this->semaphore_count ) < 0 )
		{
			this->waiting_contexts.push( Context::CurrentContext() );
			Context::Block();
		}
	}

	void release()
	{
		if( InterlockedIncrement( &this->semaphore_count ) <= 0 )
		{
			Context* pWaitingContext = nullptr;
			while( !this->waiting_contexts.try_pop( pWaitingContext ) )
				Context::Yield();

			pWaitingContext->Unblock();
		}
	}

	class scoped_lock
	{
	public:
		~scoped_lock()
		{
			this->s.release();
		}

		scoped_lock( semaphore& s )
			: s( s )
		{
			this->s.acquire();
		}

	private:
		semaphore&	s;
	};

private:
	long							semaphore_count;
	concurrent_queue< Context* >	waiting_contexts;
};

int main()
{
	semaphore s( 3 );

	parallel_for( 0, 10, [&]( int i )
	{
		semaphore::scoped_lock lock( s );

		wstringstream ss;
		ss << L"In loop interation " << i << L"..." << endl;
		wcout << ss.str();

		Concurrency::wait( 2000 );		
	} );
}

[ 코드1. Context 객체를 이용한 세마포어 구현 예제 ]

 Parallel Patterns Library( 이하, PPL ) 의 acquire() 호출 시, 남은 자원이 없다면 해당 Context 객체를 블러킹하고 concurrent_queue 를 사용하여 관리합니다.

 release() 호출 시, 남는 자원이 생기면 관리 중인 Context 객체를 꺼내서 블러킹을 해제합니다.

 parallel_for() 를 사용해 10개의 작업을 수행하는데 세마포어에 의해 3 개의 작업 단위로 수행하게 됩니다.

 

[ 그림1. Context 객체를 이용한 세마포어 구현 예제 실행 결과 ]

[ 그림1. Context 객체를 이용한 세마포어 구현 예제 실행 결과 ]

 

마치는 글

 Context 클래스를 이용해서 어떻게 컨텍스트를 제어할 수 있는지 알아보았습니다.

 다음 글에서는 Context 클래스의 두 번째 기능인 초과 스레드 생성이란 무엇인지 알아보겠습니다.

[JumpToDX11-17] DirectX9 세대의 테셀레이션( ATI 라이브러리편 )

DirectX 11 2010. 10. 11. 08:30 Posted by 알 수 없는 사용자

오늘은 DX9 세대의 테셀레이션 마지막입니다.
ATI 는 DirectX9를 지원하는 일부 그래픽카드들은 하드웨어 기반의 테셀레이션 작업을 지원합니다.
( HD 2000 시리즈 이후 지원되었다고 합니다. )
이 방법은 왜 DirectX11의 테셀레이션 작업이 강력한지를 이해하는 좋은 출발점이 될 수 있습니다.

이 경우에는그래픽 파이프라인 구조가 다음과 같습니다.




이는 현재 X-BOX 360 에도 동일하게 적용되는 그래픽 파이프라인 구조입니다.
주목할 만한 것은 Tessellator의 위치입니다.
즉, 버텍스 쉐이더( VertexShader ) 스테이지의 앞단계에 위치하고 있습니다.
이 위치는 DX11 세대에서는 버텍스 쉐이더 다음 단계로 변경됩니다.


아래의 그림은 ATI 카드에서 지원되는 DX9 기반의 테셀레이션 작업을 보여줍니다.



DirectX9의 테셀레이션을 위해서 총 3번의 패스를 통과해야 합니다.
즉, 3번의 렌더링 작업이 필요합니다.
이렇게 많은 패스가 필요한 이유는 테셀레이션을 위해서 인접한 정점의 정보가 필요하기 때문입니다.
DX9 의 시대에서는 VertexShader 단계에서 인접한 정점의 정보를 쉽게 확인할 수 있는 방법이 없습니다.
그래서 인접한 정보를 구성하는 단계가 첫번째 패스입니다.

첫번째 패스의 렌더타겟은 백버퍼가 아니라, 텍스쳐입니다.
이 텍스쳐에 정점 정보와 정점의 인덱스를 기록하게 됩니다.
즉, rgb 에는 위치 정보가 기록되며 a 에는 정점의 인덱스 정보가 기록됩니다.

이 때, 주의할 것은 메시가 인덱스 버퍼 기반으로 렌더링 되어지는 경우입니다.
이 경우에는 인덱스 버퍼를 모두 풀어서 새로운 버텍스 버퍼를 만들어야 합니다.
우리가 필요한 것은 폴리곤을 렌더링하는 작업이 아닙니다.
인접정보를 구성하는 일임을 잊지 말아야 합니다.
첫번째 패스에서의 렌더링은 TRIANGLELIST가 아니라, POINTLIST 로 수행하게 됩니다.

또 하나 주의할 것이 있습니다.
POINTLIST 로 렌더링을 수행할 때는 WVP( World-View-Projection ) 변환이 아니라,
World-View까지만 변환
을 해야 합니다.
이유는 간단합니다.
테셀레이션은 주로 시점에 근거해서  얼마나 많은 폴리곤을 생성할지를 판단해야 합니다.
이를 앞 시간들을 통해서 Adaptive 한 방식이라고 언급을 했었습니다.
이후의 패스에서는 이들 정점에 근거해서 LOD를 판정해서 Tessellation Factor 를 연산하게 되니다.
그래서 View 좌표계까지만 변환을 합니다.
첫번째 패스에서는 이렇게 View 공간으로 POINTLIST들을 텍스쳐에 렌더링 합니다.

이렇게 생성된 텍스쳐를 기반으로 해서 두번째 패스를 진행할 수 있습니다.
DX9 를 지원하는 모든 그래픽카드가 VertexShader 단계에서 텍스쳐 데이터를 읽어올 수 있는 것은 아닙니다.
이런 제약 사항들은 이제 큰 의미가 있는 것이 아니기 때문에,
개념적인 것에 포커스를 두시기 바랍니다.^^

두번째 패스의 목적은 Tessellation Factor를 구하는 것입니다.
즉, 얼마나 폴리곤을 세분화 할지를 결정합니다.
두번째 패스도 역시 POINTLIST 로 렌더링을 합니다.
그리고 첫번째 패스에서 생성해둔 인접 정점 정보를 가진 텍스쳐를 바인딩 합니다.
인접 정보가 있기 때문에 현재 정점을 기준으로 Tessellation Factor 를 계산할 수 있습니다.
두번째 패스에서 주의할 것은 이들 Tessellation Factor 를 저장하기 위해
R2VB 라는 일종의 버퍼에 렌더링
을 한다는 것입니다.
이는 ATI 테셀레이션 라이브러리에만 존재하는 개념입니다.

세번째 패스는 실제로 지오메트리(Geometry)를 렌더링 하는 단계입니다.
실제 렌더링 작업은 TRIANGLELIST 로 렌더링 합니다.
인덱스 기반의 렌더링이 아니라,
우리가 인덱스를 풀어서 생성한 버텍스버퍼로 렌더링 하는 것에 주의해야 합니다.
이때 스트림(Stream) 을 하나 더 연결하는데,
이것은 앞서 우리가 렌더링 했던 R2VB 라는 버퍼
입니다.

결과적으로 VertexShader 에는 Barycentric coordiate 기반의 가중치 값이 전달됩니다.
즉, 무게 중심 좌표입니다.

float3 vPosTessOS = i.vPositionVert0.xyz * i.vBarycentric.x +
                              i.vPositionVert1.xyz * i.vBarycentric.y + 
                              i.vPositionVert2.xyz * i.vBarycentric.z;


정점을 구성하는 방법은 위처럼 해야 합니다.

이상으로 DX9 세대의 테셀레이션 작업들에 대해서 아주 간단히 살펴보았습니다.
메인으로 다룰 내용이 아니라서, 쉽게 넘어간 부분이 많습니다.
아무래도 거의 사용하지 않기 때문에, 깊이있게 다루는 것은 의미가 없다고 생각합니다.

하지만, DX9 세대의 테셀레이션 작업은 이렇게 복잡한 방법과 절차를 통과해야 합니다.
DX11 의 테셀레이션 작업은 상대적으로 빠른 성능으로 구현이 됩니다.
왜냐하면 1 Pass 이기 때문입니다.


ATI 는 DX9 세대의 테셀레이션 작업을 위해서, 라이브러리를 제공하고 있습니다.
더 필요한 정보가 있으시면, 아래의 링크를 참고하시기 바랍니다.

http://developer.amd.com/gpu/radeon/Tessellation/Pages/default.aspx#d3d9

Setting Client IDs

  ASP.NET 4.0의 새로 생긴 ClientIDMode 속성은, ASP.NET에서 컨트롤 ID의 네이미을 결정합니다. 랜더링된 HTML 요소의 ID속성을 자바스크립트에서 랜더링된 HTML을 ID 로 참조하기 위해 꼭 필요합니다.
  기존의 서버 컨트롤은 ClientID 속성을 통해 HTML 요소이 id를 생성하였습니다. 기존의 알고리즘은 컨테이너 기반으로 순차적으로 HTML 요소의 id를 생성하였고, 데이터그리드 같은 컨트롤은 기존ClientID+순번을 추가하여 랜더링 하였습니다. 그래야 HTML 페이지에서 ID 가 유일하다는 보장을 할 수 있었죠. 이런 문제로 컨트롤ID는 매우 복잡해져서 클라이언트 스크립트에서 HTML요소로 접근하기 매우 까다로웠습니다.

  새로운 ClientIDMode 속성은 당신이  클라이언트 ID가 컨트롤을 위하여 어떻게 발생될지를 더 정확하게 지정 할수 있게합니다.당신은 어떤 컨트롤을 위하여 ClientIDMode  속성을 해당 페이지에서 설정이 가능합니다. 가능한 설정들은 다음과 같습니다:

  • AutoID — 이것은 ASP.NET 초기 버전에서와 같이 ClientID  속성 값을 발생하는 알로리즘과 같습니다.
  • Static — 이것은 ClientID 값이 ID와 같게 지정합니다. 단 상위에서 지명하는 컨테이너들 중에 ID들을 연관짓는 것이 없을 경우입니다.
  • Predictable — 이 옵션은 본래 반복적인 템플릿을 사용하는 데이터 컨트롤 안에서의 사용을 위한 것입니다. 그것은 컨트롤의 이름있는 컨테이너의 ID 속성과 연관을 맺습니다. 그러나  ClientID 값은 "ctlxxx"와 같은 문자열은 포함하지 않습니다. 이 설정은 컨트롤의 ClientIDRowSuffix 속성과 연계하여 동작합니다.  당신은 데이터 필드의 이름으로 ClientIDRowSuffix  속성을 설정합니다. 그리고 그 필드의 값은 발생된 ClientID  위한 접미사로 사용됩니다.
  • Inherit — 이 설정은 컨트롤들을 위한 기본 속성입니다. 그리고 그것은 컨트롤ID 발생이 상위의 것과 같게 지정합니다.

  ASP.NET 4.0에서는 Page 지시자를 통해 ClientIDMode 속성을 설정할 수 있습니다. 이 속성을 통해 페이지의 모든 컨트롤의 랜더링 방식의 기본값을 설정할 수 있습니다.

  Page의 ClientIDModel의 기본값은 AutoID이며, 컨트롤 측면에서는 ClientIDMode 의 기본값은 Inherit입니다. 그래서 이 속성을 굳이 설정하지 않으면 AutoID 가 기본값이 됩니다.

 @ Page 지시문 안에서 페이지 레벨상의 값을 설정 할 수 있습니다. 다음의 예를 보세요:

<%@ Page Language="C#" AutoEventWireup="true"
  CodeFile="Default.aspx.cs"
  Inherits="_Default"
  ClientIDMode="Predictable" %>

당신은 또한 머신 레빌 혹은 어플리케이션 레벨의 구성 파일안에서 ClientIDMode 값을 설정 할 수 있습니다. 이것은 어플리케이션 상에서 모든 페이지의 코든 컨트롤들의 ClientIDMode 의 기본값을 설정을 정의합니다. 당신의 머신 레빌에서 값을 설정한다면, 그것은 그 컴퓨터의 모든 웹사이트의 ClientIDMode 값을 기본 설정합니다. 다음의 예는 구성 파일에서 ClientIDMode 를 설정하는 것을 보여드립니다:

<system.web>
  <pages clientIDMode="Predictable"></pages>
</system.web>

앞에 예제를 보면, ClientID 속성의 값은 컨트롤 상위의 네이밍 컨테이너로 부터 상속을 받습니다.어떤 시나리오에서
당신이 마스터 페이지를 사용하고 있는 상황이라면, 컨트롤들은 다음의 렌더링된 HTML 안의 그것들 처럼 ID와 함께 끝날
것입니다:

 

<div id="ctl00_ContentPlaceHolder1_ParentPanel">
<div id="ctl00_ContentPlaceHolder1_ParentPanel_NamingPanel1">
<input name="ctl00$ContentPlaceHolder1$ParentPanel$NamingPanel1$TextBox1" type="text" value="Hello!"       id="ctl00_ContentPlaceHolder1_ParentPanel_NamingPanel1_TextBox1" />
</div>
</div>

비록 마크업 안에서 보여진 (TextBox 컨트롤로 부터) input 요소가 (내포된 ContentPlaceholder  컨트롤들)페이지 깊숙한 곳에
단지 두 개의 네이밍 컨트롤이 있더라도, 마스터 페이지가 처리되는 방식 때문에, 마지막 결과물은 다음과 같은 컨트롤
아이디입니다.


ctl00_ContentPlaceHolder1_ParentPanel_NamingPanel1_TextBox1
 
이것은 긴 아이디입니다. 그것은 페이지 안에서 유니크한 것을 보장합니다. 그러나 대부분의 목적에는 불필요하게 깁니다.
생각해보라 당신이 랜더링된 아이디의 길이를 줄이기 원하고, 아이디가 어떻게 발생하는지를 더 말하기 원한다면...(예를들어, 당신은 앞에 붙은 'ctlxxx' 제거하기 원합니다.) 이것을 해결하는 가장 쉬운 방법은 다음의 예처럼 ClientIDMode 속성을 설정하는 것입니다:
<tc:NamingPanel runat="server" ID="ParentPanel" ClientIDMode="Static">  
<tc:NamingPanel runat="server" ID="NamingPanel1" ClientIDMode="Predictable">    
<asp:TextBox ID="TextBox1" runat="server" Text="Hello!"></asp:TextBox>  
</tc:NamingPanel>
</tc:NamingPanel>

   
   이 샘플에서 ClientIDMode 속성은 가장 바깥쪽에 있는 NamingPanel  요소를 위하여 Static 으로 설정하였습니다. 그리고 내부의 NamingControl  요소를 위하여 Predictable 으로 설정하였습니다. 이 설정은 다음의 마크업 같은 결과를 만듭니다.(나머지 페이지와 마스터 페이지는 이전의 예처럼 같게 되는 것을 취하게 됩니다. )

<div id="ParentPanel">
  <div id="ParentPanel_NamingPanel1">
    <input name="ctl00$ContentPlaceHolder1$ParentPanel$NamingPanel1$TextBox1"
      type="text" value="Hello!" id="ParentPanel_NamingPanel1_TextBox1" />
  </div>

 
   Static
설정은 가장 바깥 쪽의 NamingPanel 요소 안의 어떤 컨트롤들을 위한 네이밍 계층을 리셋하는 효과를 같고, 발생된 아이디로 부터 ContentPlaceHolderMasterPage 아이디의 제거를 합니다. (랜더링된 요소의 name 속성은 영향받지 않는다. 그 결과 정상적은 ASP.NET 기능은 이벤트, 뷰 스테이드 등을 유지하게 됨을 기억해라. ) 네이밍 계층을 리셋하는 멋진 부수 효과는 당신이 만약 다른 ContentPlaceholder 컨트롤로 NamingPanel  요소를 마크업을 이동하더라도, 랜더링된 클라이언트 아이디는 같게 남습니다.

   Note:  랜더링된 컨트롤 아이디들이 유니크한 것을 확실히 하는 것은 당신에게 달려 있습니다. 그것들이 유니크 하지 않다면, 그것은 개별적인 HTML 요소들을 위한 유니크 아이디들을 요구하는 기능이 깨질 수 있습니다. 예를들면 클라이언트의 document.getElementById  함수같은 것입니다.

 

Creating Predictable Client IDs in Data-Bound Controls

    레거시 알고리즘에 의한 데이터 바운드 리스트 컨트롤안의 컨트롤들이 발생 될 때의 ClientID 값은 길고 전혀 예상하지 못하게 될 수 있습니다. ClientIDMode 기능은 이 아이디들이 어떻게 발생되는지를 넘어서 당신이 더 많은 컨트롤을 같는데 도움을 줍니다.  ListView 컨트롤을 포함한 다음의 마크업을 보세요:

<asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource1"
    OnSelectedIndexChanged="ListView1_SelectedIndexChanged"
    ClientIDMode="Predictable"
    RowClientIDRowSuffix="ProductID">
</asp:ListView>


이전의 예에서 ClientIDModeRowClientIDRowSuffix 속성은 마크업 안에 설정이 됩니다. ClientIDRowSuffix 속성은 단지 데이터 바운드 컨트롤들 안에서 사용될 수 있습니다. 그리고 그것의 수행은 당신이 사용하는 컨트롤에 의존적이지 않게 합니다. 차이점은 이것들입니다:

  • GridView control —  당신은 데이터 소스 안에 하나 혹은 더 많은 컬럼들의 이름을 명기 할 수 있습니다.그리고 그것들은 클라이언트 아이디들을 창조하는 실행 시간에 조합이 됩니다. 예를들어 당신이 RowClientIDRowSuffix 를  "ProductName, ProductId"로 설정한다면, 랜더링된 요소들을 위한 클라이언트 아이디들은 다음과 같은 형식을 가질 것입니다:
 rootPanel_GridView1_ProductNameLabel_Chai_1
  • ListView control — 당신은 클라이언트 아이디에 덧붙여진 데이터 소스안의 한 컬럼을 명시 할 수 있습니다. 예를 들어, 당신이 ClientIDRowSuffix 속성을 "ProductName"으로 설정한다면, 랜더링된 컨트롤들의 아이디들은 다음과 같은 형식을 가질 것입니다:
 rootPanel_ListView1_ProductNameLabel_1


이 경우에, 1의 흔적은 현재 데이터 아이템의 product ID로 부터 상속을 받습니다.

  • Repeater control —  이 컨트롤은 ClientIDRowSuffix 속성을 지원하지 않습니다.  Repeater 컨트롤에서 현재 행의 인덱스가 사용되었습니다. 당신이  Repeater  컨트롤에서  ClientIDMode="Predictable" 를 사용 했을 때, 클라이언트 아이디들은 다음의 형식으로 발생 될 것입니다:
Repeater1_ProductNameLabel_0


0의 흔적은 현재 행의 인덱스 입니다. FormViewDetailsView 컨트롤들은 다중 행을 보여주지 않습니다. 그래서 그것들은 ClientIDRowSuffix 지원하지 않습니다.

Persisting Row Selection in Data Controls


   GridView
ListView 컨트롤들은 사람들에게 행을 선택하게 할 수 있습니다. 이전의 ASP.NET 버전에서, 선택은 페이지 상의 행 인덱스에 기반하였습니다.  예를 들어, 당신이 페이지 1의 세번째 아이템을 선택하고, 페이지 2로 넘어가면, 두번째 페이지의 세번째 아이템이 선택됩니다.  지속된 선택은 .NET Framework 3.5 SP1의 동적 데이터 프로젝트안에서만 초기에 지원이 되었던 새로운 특성입니다. 이 특성을 활성화 했을 때, 현재 선택된 아이템은 그것들을 위한 데이터키에 기반합니다. 이것이 의미하는 것은 당산이 1 페이지의 세번째 행을 클릭한 다음 2 페이지로 이동하더라도 2 페이지에는 어떤 것도 선택된 것이 없습니다. 당신이 1 페이지로 돌아 갔을 때, 세번째 행이 여전히 선택되어 집니다.

   이 것은 초기 ASP.NET 버전에서의 수행 보다 훨신 더 자연스러운 선택 방법입니다. 지속된 선택은 지금 EnablePersistedSelection 속성을 사용하는 모든 프로젝트 상의 GridViewListView 에 지원이 됩니다. 다음의 예를 보세요.

<asp:GridView id="GridView2" runat="server" EnablePersistedSelection="true">
</asp:GridView>

VSTS2010 에서 Razor 코드 하이라이팅 지원하기

ASP.NET MVC 2010. 10. 7. 17:27 Posted by 알 수 없는 사용자
ASP.NET MVC3 Beta 가 나왔음에도 불구하고 아직 Razor 에 대한 코드 하이라이팅은 지원하지 않고 있습니다. ㅠ

그래서 이리저리 찾아보니까 , 인텔리센스는 아직 안되지만 코드하이라이팅은 웹 메트릭스 수준으로 지원하는 애드온이

존재하더군요 ^^ 사용법도 간단하니 한번 설치해보시기 바랍니다.

다운은 이곳에서

[다운로드 클릭만으로 바로 설치가 이루어 집니다.]

[드디어 VSTS2010에서 코드하이라이팅이 됩니다. 감격의 순간!]

 

안녕하세요. 알콜코더 민군입니다. ^^

이번에 올리는 아티클은 일본의 게임 기술 분석가(?)로 유명한 '니시카와 젠지'씨의 저서 '게임 개발자가 되기 위한 3D 그래픽스 기술' 이라는 책에 나온 부분을 발췌, 번역해 보았습니다.

 

DX11에서 변경된 부분에 대해서 쉽고 간결하게 설명하고 있어서 공부하시는 분들에게 큰 도움이 될 것 같은 내용이라서 직접 번역해서 발췌 하였습니다.

 

DX11 이전의 DX10까지의 역사에 대해서는 알로샤님의 블로그에 매우 잘 번역이 되어 있습니다. 이전의 내용은 그 쪽을 참조하여 주시면 이해하는데 큰 도움이 될겁니다.

 

그리고, 그 후에 마이크로소프트는 Window7의 릴리즈와 동시에 DirectX 11을 릴리즈한다.

DirectX 11은 DirectX 9 대응 GPU, DirectX 10.x 대응 GPU 양쪽 모두를지원한다. 다만, 사용 가능한 API나 하드웨어 가속되는 기능은 각 베이스 구조에 의존한다. 즉, DirectX11의 풀구조를 실제로 구현한 것은 DirectX11 지원 GPU이지만, 모든 구조/기능이 아닌 DirectX 9/10.x 지원 GPU에서도 DirectX 11은 이용 가능하다…즉 하위 호환성을 보증하는 것이다. DirectX 10이 DirectX 9 지원 GPU를 지원하지 않는것과는 조금 상황이 다르다는 것이 재미있다.

DirectX11에서의 프로그래머블 셰이더는 Shader Model 5.0(SM 5.0)로의 버전업이 이루어져서, 새로운 4개의 셰이더 스테이지가 추가 되었다. 4개 중에서 3개는 프로그래머블 셰이더이고, 1개가 고정기능 셰이더가 추가 되었다. 새로운 프로그래머블 셰이더는 [헐 셰이더](Hull Shader)[도메인 셰이더](Domain Shader), [계산 셰이더](Compute Shader)이고, 고정기능 셰이더는 [테셸레이터](Tessellator)이다. 각각의 기능에 관해서는 Chapter 2와 Chapter 6에서 설명한다.

(역주* 물론 위 챕터들은 번역하지 않았습니다.. -_-;)

 

이것으로 DirectX 11의 그래픽스 파이프라인에 주어진 셰이더 스테이지는 정점 셰이더->헐 셰이더->테셸레이터->도메인 셰이더->지오메트리 셰이더->픽셀 셰이더->계산 셰이더라고하는 흐름이 되었다. 현행 게임기인 XBOX360과 PS3에 정점 셰이더와 픽셀 셰이더밖에 없다는 것을 생각해보면, 상당히 복잡한 진화를 한것이 되었다.

 

 

SM5.0은 새로운 셰이더가 추가 되었을 뿐만 아니라, 프로그래머빌리티가 향상된 것도 주목할만한 부분이다.

우선 첫번째로, 셰이더 프로그램에 서브 루틴의 사용이 가능하게 되어서, 동적링크(Dynamic Shader Linkage)가 지원된다.

DirectX 10까지는 똑 같은 기능의 셰이더라 할지라도 사용하는 변수셋트(예를 들어 광원의 종류와 개수)가 다를 경우등에서는 별도의 셰이더로 만들지 않으면 안되었다. 이 때문에 거의 기능이 똑같은데도 셰이더의 수가 알게 모르게 증가하게 되어, 셰이더의 관리가 어려워지는 패해가 발생하였다. DirectX 11에서는 셰이더의 기능 블록을 모듈화하는 것이 가능해져서, 각각을 흔히 C언어에서 이야기하는 함수포인터식으로 호출하는 것이 가능해졌기 때문에 효율 좋은 다기능 셰이더를 구성할 수 있게 되었다.

또한 각종 버퍼, 텍스쳐, 정수버퍼, 텍스쳐의 샘플러등의 셰이더의 입력 리소스에 대해서 인덱스 참조가 가능해졌다. 단지 지정 인덱스값은 정수로 한정되었다.

64비트 배정도부동소수점에 관해서는, 현행의 DirectX 10.x 지원 GPU에서도 DirectX와는 별개로 각 제조사 독자의 GPGPU모드에 한해서는 이미 지원되고 있었지만, DirectX 11에서는 Direct3D 그래픽스의 구조로 정식 지원이 된다. 다만 지원은 필수가 아니라, [옵션 지원]이라는 위치이다. 그래서 노트북용 GPU, 메인스트림 이하의 통합 칩셋GPU, 혹은 일부의 제조사의 GPU에서는 이것을 지원하지 않을 가능성이 있다.

부동소수점관련에서는, 이외에 32비트 부동소수점(FP32)와 16비트 부동소수점(FP16)의 상호 형 변환이 하드웨어 레벨에서 지원된다.

DirectX 10 때에 충실화가 이루어졌던 논리계산명령도 더욱 확장되었다.

새로 추가된 Gather()명령도 재미있다. 이것은 1개의 텍스쳐 명령으로 동시에 4곳의 텍셀의 값을 읽어 낼 수 있는 명령이다. 이것은 이전에 ATI RADEON X1900계열에서 지원되고 있던 [Fetch4]기능을 일반화시켜서 DirectX 11의 표준구조로 집어넣은 것이다. RADEON X1900의 Fetch4는 1개의 텍스쳐에 대해서 4 텍셀을 읽어낼 수 있는 기능으로, NVIDIA의 뎁스버퍼(Depth Buffer)의 특수참조기능 [NVIDIA SHADOW] 기능의 대항 기능이라고 하는 역할이었지만, SM 5.0의 Gather() 명령은 임의의 개수의 텍스쳐의 4군데 위치로부터 임의의 요소(a/R/G/B)를 읽어 내는 것이 가능하게 되었다. 이것은 구체적으로는 앞에 이야기한것처럼 뎁스쉐도우계열의 그림자생성의 고효율 실행은 물론이고, 최근 유행하고 있는 스크린 스페이스 엠비언트 오클루젼(SSAO:Screen Space Ambient Occlusion)과 같은 심도갚을 이용한 복잡한 포스트 프로세싱의 고효율화 실행에 도움이 된다.

DirectX 11에서는 뒤에 설명하는 DirectX 계산 셰이더의 지원에 싱크로하는 형태로, GPGPU적인 잠재 가능성이 픽셀 셰이더에도 추가되었다. 이것이 DirectX 11의 픽셀셰이더에 신기능으로 추가된 [Unordered Access View](UAV)라고 하는 신개념이다. Unordered Access 라는 것은 랜덤 액세스라는 뜻이다. 즉 픽셀 셰이더로부터 비디오 메모리로의 랜덤 액세스가 가능해진 것이다. 지금까지 픽셀 셰이더는 별수 없이 그 픽셀 좌표에 대응하는 비디오 메모리로의 쓰기(출력)밖에 되지 않았지만, 이 제약이 없어지게 된것이다.

UAV는 원래 DirectX 계산 셰이더를 위해서 확장된 개념이기 때문에, 당연히 DirectX 계산 셰이더에서도 이용 가능하다. 이 UAV로 인해서 값을 확산하는 것 같은 스캐터(산란) 형태의 필터 처리, A-Buffer같은 멀티 레이어형의 특수한 프레임퍼버에서 렌더링 순서에 의존하지 않고 반투명렌더링(OIT:Order Independent Transparency)등을 구현 가능하게 되었다.

A-Buffer의 개념도.
"A"에는 anti-aliased、area-averaged(영역평균화)、accumulation(연산)이라는 복수의 의미가 들어 있다.

 

이 UAV 도입에 의해서, DirectX 11/SM 5.0에서는 멀티렌러타겟(MRT:Multi Render Target)의 개수는 DirectX 10 때의 10개 그대로지만, 픽셀 셰이더에서는 8MRT와는 별대로 UAV 1개가 이용 가능하게 되었다. 또한 DirectX 계산 셰이더는 8UAV까지 이용 가능하다.

픽셀 셰이더와 DirectX 계산 셰이더에서 랜덤 메모리 액세스가 가능하게 된 관계로, 귀찮아 진 것이 복수 스레드로부터의 동일한 메모리 어드레스 엑세스의 관리다. 실행 타이밍에 의해 메모리의 내용이 변경되어버릴 가능성이 생기기 때문에, 이것은 멀티 스레드 프로그램에서 일어나는 디버그 곤란한 현상이 생길 수 밖에 없다. 그래서 DirectX 11에 있어서 픽셀 셰이더와 DirectX 계산 셰이더에서는 Atomic Operation(단위조작)을 지원하는 명령이 추가되었다.

 

이런 것들을 보면 DirectX 11은 새로운 프로그래머블 셰이더가 추가되고, 거기에 GPGPU지원으로 인한 기능강화가 픽셀 셰이더에 대해서 이루어 졌다는 느낌으로, 덕분에 복잡도가 상당히 높아지게 되었다. 이 복잡한 처리체계(파이프라인구조)는 CPU와 비교도 되지 않을 정도이다.

PS3, XBOX360등의 지금 세대(사실상 DirectX9 세대) 게임기의 다음 세대의 게임기등은 DirectX 10을 넘어서, DirectX 11 새대 이후의 아키텍쳐를 채용하게 되지 않을까.



DirectX SDK February 2010  버전까지는 'EnhancedMesh' 라는 샘플이 있었습니다.
아쉽게도 2010 June 버전에서 이 샘플은 사라졌습니다.
메시의 퀄리티를 향상시키는 샘플인데, 실제로는 폴리곤 갯수를 증가시키고 있습니다.
굳이 실행을 실켜보실 이유는 없습니다. ^^

ID3DXMesh 인터페이스에는 멤버함수로 CloneMeshFVF() 를 가지고 있습니다.
이 멤버함수의 옵션으로 D3DXMESH_NPATCHES 을 사용하게 되면,
하드웨어 가속을 받아서 폴리곤을 증가시킬 수 있습니다.
물론 내부적으로는 많은 연산을 수행할 것입니다.



만약 테셀레이션 작업이 그래픽카드에서 지원을 해주지 않는다면,
이는 CPU 기반으로 작업을 수행해야 합니다.
바로 이를 도와주는 API 가 D3DXTessellateNPatches() 입니다.



이렇듯 DirectX9 세대에도 테셀레이션을 위해서 API들을 지원해 주고 있었습니다.
물론 정식으로 그래픽카드에서 지원을 하지 않았기 때문에,
성능에 많은 문제점을 가지고 있었습니다.
테셀레이션 자체가 근본적으로 많은 연산을 수반하기 때문입니다.

다음 시간에는, 마지막으로 ATI의 DirectX9 기반의 테셀레이션 작업에 대해서 살펴보도록 하겠습니다.^^

안녕하세요. 이번 Visual Studio Korea 에서 만 2년이 가깝게 Visual Studio 에 대한 모든 정보를 제공하는 한국 유일의 블로그로 활동하였습니다. 많은 분들에게 보다 좋은 정보를 제공하기 위해 많은 운영진과 필자 분들이 고생하셔서 적으신 포스팅을 총 정리하였습니다.

아직도 국내에는 Visual Studio 와 관련된 많은 정보가 부족하지만, 앞으로 빠르고 고품질의 정보를 전달해 드리기 위해 더욱 정진하겠습니다.^^

 

Visual Studio Korea 소식

VSTS 2010 팀 블로그 Visual Studio Team System 2010 공식 팀 블로그 맴버소개
VSTS 2010 팀 블로그 Visual Studio Team System 2010 팀 블로그 소개
VSTS 2010 팀 블로그 VSTS 2010 팀 블로그/스터디 맴버를 모집합니다.
VSTS 2010 팀 블로그 VSTS 2010 팀 맴버 지원을 마감합니다
VSTS 2010 팀 블로그 Visual Studio Team System 2010 Beta 1 공개
VSTS 2010 팀 블로그 [MSDN 주간 세미나] 발표자료 / .NET Framework와 Visual Studio : 현재와 미래 1, 2
VSTS 2010 팀 블로그 VSTS 2010 팀 3분기 맴버 모집
VSTS 2010 팀 블로그 VSTS 2010 팀 세미나 동영상 - 6월 10일
VSTS 2010 팀 블로그 VSTS 2010 팀 맴버 추가 모집
VSTS 2010 팀 블로그 VSTS 2010 팀 트위터를 오픈하였습니다.
VSTS 2010 팀 블로그 TECH DAY 2009 행사 오픈!!!
VSTS 2010 팀 블로그 VSTS 2010 공식 블로그 Viva 2010팀 멤버 추가 모집 공고
VSTS 2010 팀 블로그 [세미나] 차세대 응용 프로그램 구축 방법 및 사례 소개 세미나
VSTS 2010 팀 블로그 Visual Studio 2010 팀에서 팀원 모집합니다.
VSTS 2010 팀 블로그 한국 Visual Studio 2010 사용자를 위한 트위터 커뮤니케이션
VSTS 2010 팀 블로그 C++ 개발자와 함께하는 Visual Studio 2010
VSTS 2010 팀 블로그 [무료 세미나] ReMIX 10
VSTS 2010 팀 블로그 6월 1일, 대한민국 웹 컨퍼런스의 지존 ReMIX 10가 개최됩니다!
VSTS 2010 팀 블로그 REMIX10 의 VS2010 팀 후기
VSTS 2010 팀 블로그 6월 1일, REMIX10 세미나 세션 공개
VSTS 2010 팀 블로그 [세미나] Visual Studio Camp #1
VSTS 2010 팀 블로그 [세미나 후기] Visual Studio Camp #1
VSTS 2010 팀 블로그 [세미나 발표 자료] Visual Studio Camp #1
VSTS 2010 팀 블로그 [세미나] Visual Studio Seminar #1 / 2010년 9월 28일
VSTS 2010 팀 블로그 9월 13일에 개최하는 KGC에서 강연을 합니다.
VSTS 2010 팀 블로그 KGC10에서의 VS2010 스터디 팀의 활약 모습

 

Visual Studio 2010

Visual Studio 2010 Visual Studio Team System 2010 CTP 만료 해결하기
Visual Studio 2010 Visual Studio 2010 의 특징
Visual Studio 2010 Visual Studio 2010 내부 빌드 최신 동영상: C# 4.0 Language + IDE + WPF Shell + Editor
Visual Studio 2010 Visual Studio 2010 & .NET 4.0 참고 자료들
Visual Studio 2010 Visual Studio 2010 Beta 1 설치부터 살펴보기
Visual Studio 2010 멀티 모니터 사용
Visual Studio 2010 Visual Studio 2010 Beta 2 출시
Visual Studio 2010 Visual Studio 2010 Beta 2 설치 미리 보기
Visual Studio 2010 VS 2010 Beta 2 설치 과정에서 Silverlight SDK 문제
Visual Studio 2010 VS2010 베타2의 WPF & Silverlight 디자이너 성능 향상 팁
Visual Studio 2010 VS 2010 기능 소개 01 인텔리 센스 기능의 변화
Visual Studio 2010 Visual Studio 2010과 Blend Preview for .NET 4 통합 문제
Visual Studio 2010 VS 2010 기능 소개 02 - IDE의 기능 추가
Visual Studio 2010 VS 2010 기능 소개 03 - IDE의 변화
Visual Studio 2010 Visual Studio 2010 출시 일정
Visual Studio 2010 VS 2010 기능소개 04 - Visual C#&VB 개발자 IDE Tips & Tricks 첫번째
Visual Studio 2010 VS 2010 기능소개 05 - Visual C#&VB 개발자 IDE Tips & Tricks 두번째
Visual Studio 2010 Visual Studio 2010 RC 공개 임박!
Visual Studio 2010 Visual Studio 2010 RC 공개
Visual Studio 2010 C#에서 IntelliSense가 동작하지 않을 때 문제 해결 방법
Visual Studio 2010 똑똑한 검색을 지원하는 VSTS 2010의 "Navigate To" 검색
Visual Studio 2010 실버라이트4 RC와 블렌드 4 베타 공개
Visual Studio 2010 윈도우폰 7 개발환경 공개
Visual Studio 2010 Visual Studio 2010! 나랑 놀아보자 ? 기본편 (2회) - VS IDE
Visual Studio 2010 Visual Studio 2010! 나랑 놀아보자 ? 기본편 (3회) - Box Selection
Visual Studio 2010 Visual Studio 2010! 나랑 놀아보자 ? 기본편 (4회) - Call Hierarchy
Visual Studio 2010 Visual Studio 2010 출시와 완소 정보 총 정리
Visual Studio 2010 Visual Studio 2010 e-book 무료로 다운로드 하세요
Visual Studio 2010 Visual Studio 2010! 나랑 놀아보자 ? 기본편 (5회) - Navigate To
Visual Studio 2010 Visual Studio 2010 RTM 추가 완소 정보
Visual Studio 2010 Visual Studio 2010! 나랑 놀아보자 ? 기본편 (6회) - Generate from Usage
Visual Studio 2010 VS 2010 기능소개 05 - Visual C#&VB 개발자 IDE Tips & Tricks 두번째
Visual Studio 2010 Visual Studio 2010, 2008, 2005 에서 .NET Framework 1.1 개발하기
Visual Studio 2010 Visual Studio 2010, 2008, 2005 에서 .NET Framework 1.1 개발하기
Visual Studio 2010 Just for fun! / Visual Studio Express Edition
Visual Studio 2010 왜 Visual Studio 2010 이여야 하는가?
Visual Studio 2010 Visual Studio 2010 최신 PDF 자료를 MSDN 에서 다운로드 받으세요
Visual Studio 2010 Just for fun! / DreamSpark는 대학생 여러분을 위한 솔루션입니다.
Visual Studio 2010 VS2008 을 VS2010 에서 동시에 개발하기
Visual Studio 2010 VS2008 과 VS2010 동시에 개발하기 : 테스트 프로젝트가 포함 될 경우
Visual Studio 2010 Introducing Visual Studio LightSwitch! - Enjoy your development

VIsual Studio Extensibility [Blueprints] S+S Blueprints
VIsual Studio Extensibility Visual Studio 2010 SDK 와 Readme
VIsual Studio Extensibility Visual Studio 2010 Extension Manager
VIsual Studio Extensibility [VSIX] 1. What is different from before version?
VIsual Studio Extensibility [VSIX] 2-1. How to start VSIX programming
VIsual Studio Extensibility [VSIX] 2-2. How to start VSIX programming
VIsual Studio Extensibility MousePresentationTracker - MEF 세미나 예제
VIsual Studio Extensibility [VSX] 1. Visual Studio Extensibility,, 그 시작
VIsual Studio Extensibility Visual Studio 2010 확장 모델인 VSIX 버그
VIsual Studio Extensibility VSGesture v2.0 for VS2010 is now available for download

 

.NET Framework 4.0

.NET Framework .NET 의 과거와 현재, 그리고 미래
.NET Framework .NET Framework 4.0 의 특징
.NET Framework .NET Framework 4.0 마이그레이션 이슈
.NET Framework .NET 스마트클라이언트 한계 극복 [1]
.NET Framework .NET 스마트클라이언트 한계 극복 [2]

Managed Extensibility Framework [MEF] 1. Managed Extensibility Framework 이란?
Managed Extensibility Framework [MEF] 2. Parts 와 Contracts 선언
Managed Extensibility Framework [MEF] 3. Export 선언
Managed Extensibility Framework [MEF] 4. Import 선언
Managed Extensibility Framework [MEF] 5. Catalog 사용
Managed Extensibility Framework [MEF] 6. Lazy Exports
Managed Extensibility Framework [MEF] 7. Exports and Metadata
Managed Extensibility Framework [MEF] 8. Strongly Typed Metadata
Managed Extensibility Framework [MEF] 9. Recomposition
Managed Extensibility Framework [MEF] 10. Querying the CompositionContainer
Managed Extensibility Framework MEF Preview 6 공개
Managed Extensibility Framework MEF 는 Generic Type 을 지원하지 않는다!
Managed Extensibility Framework MEF 에 Generic Type 을 지원하기 위해서..?
Managed Extensibility Framework MEFGeneric 코드 플랙스에 공개합니다.

WCF WCF란 무엇인가?
WCF 기본 WCF 프로그래밍 - 첫 WCF 서비스 만들기
WCF 기본 WCF 프로그래밍 - 첫 WCF 서비스 만들기 2
WCF WCF의 기본 - Service Contract
WCF WCF의 기본 - Data Contract
WCF WCF 서비스의 동시성(Concurrency) - 1
WCF WCF 서비스의 동시성(Concurrency) - 2
WCF WCF - Serialization
WCF WCF Hosting - WAS를 이용한 Hosting
WCF 도메인을 여러개 등록했을때 WCF 서비스를 호스팅 할수 없어요 ㅠㅠ
WCF WCF Hosting(2) - ASP.NET 호환성(Compatibility)
WCF WCF Hosting (3) - Windows Service를 이용한 Hosting
WCF WCF Security (1) - SSL을 이용한 전송계층에서의 보안 설정
WCF WCF Security (2) - 전송 계층에서의 메세지 인증 (사용자 지정 인증)

WPF WPF 4의 향상된 기능과 Windows 7 지원
WPF WPF Features Preview (1) ? DataGrid
WPF WPF Features Preview (2) ? DatePicker
WPF WPF Features Preview (3) - Styling the DataGrid
WPF WPF 리본 컨트롤 RTW 출시

 

C# 4.0

C# [C# 4.0] Named and Optional Parameters
C# [C# 4.0] Duck Typing
C# [C# 4.0] New Extension Method "Zip"
C# [C# 4.0] Generic Covariance And Contra Variance
C# Welcome to Dynamic C#(1) - 첫만남.
C# Welcome to Dynamic C#(2) - Wanna be a polyglot.
C# Welcome to Dynamic C#(3) - 마음이 넒어진 C#
C# Welcome to Dynamic C#(4) - 극과극 비교체험.
C# Welcome to Dynamic C#(5) - Return to Dynamic.
C# Welcome to Dynamic C#(6) - Return to Dynamic (2)
C# Welcome to Dynamic C#(7) - 아낌없이 표현해 주는 나무
C# Welcome to Dynamic C#(8) - DLR이 나무를 사랑하는 이유
C# Welcome to dynamic C# 외전(1) - Generate From Usage.
C# Welcome to dynamic C# 외전(2) - Generic Method.
C# Welcome to dynamic C# 외전(3) - 감시하는 자와 감시당하는 자.
C# Welcome to Dynamic C#(9) - Dynamic Returns Again.
C# Welcome to Dynamic C#(10) - Dynamic Returns Again.(2)
C# Welcome to Dynamic C#(11) - The Phantom of The Dynamic
C# Welcome to Dynamic C#(12) - dynamic은 외로운 아이.
C# Welcome to Dynamic C#(13) - 아직도 가야할 길.
C# Welcome to Dynamic C#(14) - 철지난 만우절에 낚여서 파닥파닥.
C# Welcome to Dynamic C#(15) - A/S for dynamic.
C# Welcome to Dynamic C#(16) - dynamic이라도 이건 안되는 거임.
C# Welcome to Dynamic C#(17) - 필요한 말만 하고 삽시다.
C# Welcome to Dynamic C#(18) - 이름을 붙이면서 벌어진 일들.
C# Welcome to Dynamic C#(19) - 위너 고르기.
C# Welcome to Dynamic C#(20) - 어르신과 대화하는 법.
C# Welcome to Dynamic C#(21) - 인덱스의 힘.
C# Parallel Programming [C# 4.0] Parallel Extension - [1] 병렬 처리
C# Parallel Programming [C# 4.0] Parallel Extension - [2] 병렬 처리 아키텍처
C# Parallel Programming [C# 4.0] Parallel Extension - [3] TPL(Task Parallel Library)
C# Parallel Programming Welcome to Parellel world(1) - Here comes a new challenger!
C# Parallel Programming Welcome to Parallel C#(1) - 굿바이, 그리고 안녕~~?
C# Parallel Programming Welcome to Parallel C#(2) - 계속 되는 개념 찾기.
C# Parallel Programming Welcome to Parallel C#(3) - 작업의 기본.
C# Parallel Programming Welcome to Parallel C#(4) - 작업의 기본 Part 2.
C# Parallel Programming Welcome to Parallel C#(5) - 병렬작업에서 예외가 생기면 어케...?
C# Parallel Programming Welcome to Parallel C#(6) - To be continue...
C# Parallel Programming Welcome to Parallel C#(7) - Excuse me.
C# Parallel Programming Welcome to Parallel C#(8) - 취소 쉽게 하기.
C# Parallel Programming Welcome to Parallel C#(9) - 백지장은 맞들지 말엉.
C# Parallel Programming Welcome to Parallel C#(10) - 이보게, 잠깐 뒤를 돌아보지 않겠나.
CLR 1. Hello 世界
CLR 2. CLR! CLR! CLR!
CLR 3. MSCorLib & Metadata
CLR 4. Assembly
CLR 5. Assembly - Strongly named assemblies
CLR 6. Assembly - GAC(Global Assembly Cache)
CLR 7. System.Object
CLR 8. System.Object (2)
CLR 닷넷4.0에서 네이티브코드와 매나지드코드의 동거 part 1.
CLR 닷넷4.0에서 네이티브코드와 매나지드코드의 동거 part 2-1.
CLR 닷넷4.0에서 네이티브코드와 매나지드코드의 동거 part 2-2. 네이티브 랩퍼 만들기

 

ASP.NET

ASP.NET ASP.NET 의 WebMatrix & Razor 신 기술 소개
ASP.NET Razor in WebMatrix(2) 코드의 재 사용
ASP.NET Razor in WebMatrix(3) ? WebMatrix Helper

ASP.NET 4.0 [ASP.NET 4.0] 1. Core Service - Extensible Output Caching
ASP.NET 4.0 [ASP.NET 4.0] 2. AJAX - Declarative Client Template Rendering
ASP.NET 4.0 ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Dynamic Data(1)
ASP.NET 4.0 ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Dynamic Data(2)
ASP.NET 4.0 ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Web Designer & Deployment
ASP.NET 4.0 ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Core Services
ASP.NET 4.0 ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - New Features in the Microsoft Ajax Library
ASP.NET 4.0 ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Web Forms(1)
ASP.NET 4.0 Razor in WebMatrix
ASP.NET 4.0 ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Web Forms(2)
ASP.NET 4.0 ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Web Forms(3)
ASP.NET MVC M, V 그리고 C의 각방생활(1) - ASP.NET MVC vs ASP.NET WEB FORM
ASP.NET MVC M, V 그리고 C의 각방생활(2) - ASP.NET MVC와 인사나누기
ASP.NET MVC M, V 그리고 C의 각방생활(3) - 초간단 사이트 만들기(1)
ASP.NET MVC M, V 그리고 C의 각방생활(4) - 유효성 검사
ASP.NET MVC M, V 그리고 C의 각방생활(5) - 초간단 사이트 만들기(2)
ASP.NET MVC M, V 그리고 C의 각방생활(6) - 유효성 검사(2)
ASP.NET MVC M, V 그리고 C의 각방생활(7) - 함께 즐겨요~ jQuery
ASP.NET MVC M, V 그리고 C의 각방생활(8) - jQuery와 탭메뉴 그리고 파샬뷰
ASP.NET MVC M, V 그리고 C의 각방생활(9) - jqGrid 사용해보자
ASP.NET MVC M, V 그리고 C의 각방생활(10) - jqGrid를 이용한 paging과 sorting
ASP.NET MVC ASP.NET MVC 3 Preview 1 이 릴리즈 되었습니다.
ASP.NET MVC M, V 그리고 C의 각방생활(11) - jqGrid로 데이터 추가,편집,삭제해보기
ASP.NET MVC M, V 그리고 C의 각방생활(12) - 테스팅 그거, 아무나 하나?
ASP.NET MVC JailBreak From Controllers and Actions

 

RIA

RIA Expression Blend3 preview - 1.인터페이스
RIA Expression Blend3 preview - 2. Photoshop import
RIA Silverlight 3 & Blend 3 RC 공개!!!
RIA Silverlight 4 Beta 공개
RIA .Net Ria Service + IIS6 + Silverlight 4 Troubleshooting!!
RIA 실버라이트 비하인드 코드에서 바인딩하기.
RIA .Net Ria Service 와 Entities 그리고 Stored Procedure 하다가 생긴일..
RIA 실버라이트 프로그래머가 할 수 있는 최소한의 블랜드 디자이너를 위한 배려

 

F#

F# Welcome to F#(1) - 첫만남.
F# Welcome to F#(2) - 두번째 만남.
F# Welcome to F#(3) - 사소한 탐색전.
F# Welcome to F#(4) - 과거와 배경을 좀 더 알고싶어.
F# Welcome to F#(5) - 아주 조금씩 심화되는 탐색전.
F# Welcome to F#(6) - 비교본능.
F# Welcome to F#(7) - 클리프 행어.
F# Welcome to F#(8) - 은총알과 엄친아.
F# Welcome to F#(9) - 메이져 데뷰.
F# Welcome to F#(10) - 인도음식 카레.....?
F# Welcome to F#(11) - 차별을 권장하는 언어인거임?!?!
F# Welcome to F#(12) - 공동작업 좋치아니항가

 

C++0x / C++/CLI

C++/CLI C++/CLI는 미운 오리새끼 or 백조
C++/CLI .NET에서의 C++/CLI의 의미
C++/CLI [Step 01] 'C++/CLI가 뭐야?'에 답하기 && 가장 많은 프로그래밍 언어로 만드는 프로그램 만들기
C++/CLI [Step 02-1] 클래스(class), 핸들(^), 그리고 구조체(struct)
C++/CLI [Step.02-2] 클래스(class), 핸들(^), 그리고 구조체(struct)
C++/CLI [step.03] 배열
C++/CLI [Step. 04] nullptr, interior_ptr, pin_ptr
C++/CLI [Step. 05] 관리 코드의 array를 비관리 코드에 포인터로 전달
C++/CLI [Step. 06-1] 관리코드의 문자열과 비관리코드의 문자열 변환
C++/CLI [Step. 06-2] 관리코드의 문자열과 비관리코드의 문자열 변환
C++/CLI [Step. 07] 비관리 클래스에서 관리 클래스를 멤버로, 관리 클래스에서 비관리 클래스를 멤버로
C++/CLI [Step. 08] 프로퍼티 ( property )
C++/CLI [Step. 09] 델리게이트 (delegate)
C++/CLI [Step. 10] 이벤트 ( event )
C++/CLI [Step. 11] 열거형( enum )
C++/CLI [Step. 12] for each
C++/CLI [Step. 13] parameter array
C++/CLI [Step. 15] static 생성자, initonly, literal
C++/CLI [Step. 14] 인터페이스 ( interface )
C++/CLI array에 네이티브 클래스 넣기
C++/CLI 네이티브 함수 포인터를 델리게이트에 설정
C++/CLI WPF 사용하기
C++0x [VC++] 1. 큰 변화가 기대되는 Visual C++( VC++ )
C++0x [VC++] 2. C++0x의 auto
C++0x [VC++] 3. static_assert
C++0x [VC++] 4. 우측 값 참조( RValue Reference ) - 첫 번째
C++0x [VC++] 5. 우측 값 참조( RValue Reference ) ? 두 번째
C++0x [VC++] 6. 우측 값 참조( RValue Reference ) - 세 번째
C++0x [VC++] 7. 우측 값 참조( RValue Reference ) - 네 번째
C++0x [VC++] 8. 우측 값 참조( RValue Reference ) ? 다섯 번째
C++0x [VC++] 9. Lambda ( 람다 ) - 첫 번째
C++0x [VC++] 11. Lambda - 두 번째
C++0x [VC++] 12. Lambda - 세 번째
C++0x [VC++] 13. Lambda - 네 번째
C++0x [VC++] 14. decltype
C++0x 대용량 파일 조작을 위한 C++0x의 변화
C++0x nullptr
C++0x VC++ 10에 구현된 C++0x의 코어 언어 기능들
C++0x C++0x 관련 책 "Visual C++ 10과 C++0x"
C++0x "Visual C++ 10과 C++0x" pdf 파일
C++0x [Plus C++0x] 람다(Lambda) 이야기 (1)
C++0x [Plus C++0x] 람다(Lambda) 이야기 (2)
C++0x [Plus C++0x] 람다(Lambda) 이야기 (3)
C++0x [Plus C++0x] 람다(Lambda) 이야기 (마지막회)
C++0x [STL] 1. What's new in VC++ 2010?
C++0x [STL] 2. unique_ptr (1/2)
C++0x [STL] 3. unique_ptr (2/2)
C++0x [STL] 4. make_shared
C++0x [STL] 5. 에 추가된 새로운 함수들 (1/5)
C++0x [STL] 6. 에 추가된 새로운 함수들 all_of, any_of, none_of (2/5)
C++0x VS2010에서 nullptr의 알려진 버그

VC++ 10 Concurrency Runtime C++ 개발자를 위한 병렬 프로그래밍 동영상 [0]
VC++ 10 Concurrency Runtime C++ 개발자를 위한 병렬 프로그래밍 동영상 [1]
VC++ 10 Concurrency Runtime C++ 개발자를 위한 병렬 프로그래밍 동영상 [2]
VC++ 10 Concurrency Runtime C++ 개발자를 위한 병렬 프로그래밍 동영상 [3]
VC++ 10 Concurrency Runtime C++ 개발자를 위한 병렬 프로그래밍 동영상 [4]
VC++ 10 Concurrency Runtime C++ 개발자를 위한 병렬 프로그래밍 동영상 [5]
VC++ 10 Concurrency Runtime C++ 개발자를 위한 병렬 프로그래밍 동영상 [6/7] 완결!
VC++ 10 Concurrency Runtime PPL task를 이용한 피보나치 수 계산
VC++ 10 Concurrency Runtime 인사 및 Multi Core, Multi Thread...그리고 VC++ 10
VC++ 10 Concurrency Runtime Concurrency Runtime
VC++ 10 Concurrency Runtime Parallel Patterns Library (PPL)
VC++ 10 Concurrency Runtime 양보할 줄 아는 Concurrency Runtime의 event
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - Task
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - 병렬 알고리즘
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - parallel_for 알고리즘
VC++ 10 Concurrency Runtime Asynchronous Agents Library로 Dining Philosophers 문제 해결하기 - 1
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - parallel_for_each 알고리즘
VC++ 10 Concurrency Runtime Asynchronous Agents Library로 Dining Philosophers 문제 해결하기 - 2
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - parallel_invoke
VC++ 10 Concurrency Runtime Asynchronous Agents Library로 Dining Philosophers 문제 해결하기 - 마지막회
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - combinable
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - task group에서의 병렬 작업 취소 - 1
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - task group에서의 병렬 작업 취소 - 2
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - concurrent_vector - 1
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - concurrent_vector - 2
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - concurrent_queue - 1
VC++ 10 Concurrency Runtime Parallel Patterns Library(PPL) - concurrent_queue - 2
VC++ 10 Concurrency Runtime Concurrency Runtime(ConcRT)의 디버그 모드에서 메모리 leak 문제
VC++ 10 Concurrency Runtime Asynchronous Agents Library 소개
VC++ 10 Concurrency Runtime Asynchronous Agents Library - agent. 1 ( 상태 )
VC++ 10 Concurrency Runtime Asynchronous Agents Library ? agent. 2 ( 기능 )
VC++ 10 Concurrency Runtime Asynchronous Agents Library - message 전달 함수. 1 ( 전송 )
VC++ 10 Concurrency Runtime Asynchronous Agents Library ? message 전달 함수. 2 ( 수신 )
VC++ 10 Concurrency Runtime Asynchronous Agents Library ? message block 1. ( 인터페이스 )
VC++ 10 Concurrency Runtime Asynchronous Agents Library ? message block 2. ( unbounded_buffer )
VC++ 10 Concurrency Runtime Asynchronous Agents Library ? message block 3. ( overwrite_buffer & single_assignment )
VC++ 10 Concurrency Runtime Asynchronous Agents Library ? message block 4. ( call )
VC++ 10 Concurrency Runtime Asynchronous Agents Library ? message block 5. ( transformer )
VC++ 10 Concurrency Runtime Asynchronous Agents Library ? message block 6. ( choice )
VC++ 10 Concurrency Runtime Asynchronous Agents Library ? message block 7. ( join & multitype_join )
VC++ 10 Concurrency Runtime Asynchronous Agents Library ? message block 8. ( timer )
VC++ 10 Concurrency Runtime Concurrency Runtime ? 동기화 객체 1. ( critical_section & reader_writer_lock )
VC++ 10 Concurrency Runtime Concurrency Runtime ? 동기화 객체 2. ( event )
VC++ 10 Concurrency Runtime Asynchronous Agents Library ? message block 9. ( custom )
VC++ 10 Concurrency Runtime Concurrency Runtime - 만델브로트 프랙탈 ( Mandelbrot Fractal ) 예제
VC++ 10 Concurrency Runtime Concurrency Runtime ? Task Scheduler 1. ( Scheduler )
VC++ 10 Concurrency Runtime Concurrency Runtime ? Task Scheduler 2. ( SchedulerPolicy )
VC++ 10 Concurrency Runtime Concurrency Runtime ? Task Scheduler 3. ( ScheduleGroup )
VC++ 10 Concurrency Runtime Concurrency Runtime ? Task Scheduler 4. ( ScheduleTask )
Visual C++ 10 About Visual C++ 10
Visual C++ 10 디버깅 모드에서 역어셈블리 코드 보기
Visual C++ 10 Visual C++ 10의 변화
Visual C++ 10 [Upgrade to VC++ 10] _WIN32_WINNT 버전 문제
Visual C++ 10 VS2010 C++ 프로젝트의 디렉토리 설정

 

MFC

MFC [MFC] 리스타트 매니저(Restart Manager) - (1/3) : 기능 소개
MFC [MFC] 리스타트 매니저(Restart Manager) - (2/3) : 사용하기
MFC [MFC] 리스타트 매니저(Restart Manager) - (3/3) : 활용하기
MFC [MFC] 태스크 대화상자(Task Dialog) - (1/3) : 기능 소개
MFC [MFC] 태스크 대화상자(Task Dialog) - (2/3) : 사용하기
MFC [MFC] 태스크 대화상자(Task Dialog) - (3/3) : 활용하기
MFC [MFC] 태스크 대화상자(Task Dialog) - 예제 코드 올립니다.
MFC [MFC/윈도우 7 멀티터치] #2 : 제스처(gesture)를 이용한 구현()
MFC [MFC/윈도우 7 멀티터치] #3 : 제스처(gesture)를 이용한 구현()
MFC [MFC/윈도우 7 멀티터치] #4 : WM_TOUCH 메세지를 이용한 구현()
MFC [MFC/윈도우 7 멀티터치] #5 : WM_TOUCH 메세지를 이용한 구현()
MFC [MFC/윈도우 7 멀티터치] #6 : 예제 코드 올립니다

 

DIRECT X

[알콜코더의 미리 배워보는 DirectX11-입문편] 1.튜터리얼 01 : 다이렉트 3D 기초 #2

Direct3d Mobile [d3dm 기초] 1. wm6.x 개발환경 세팅
Direct3d Mobile .NET 기반에서 공개소스 게임엔진 포팅하기
DirectX 11 [JumpToDX11-1] 사라진 Direct3D 오브젝트를 찾아서...
DirectX 11 [JumpToDX11-2]DeviceContext...넌 누구냣!!
DirectX 11 [JumpToDX11-3] Feature Level
DirectX 11 [JumpToDX11-4] ID3D11View
DirectX 11 [DX11_#1]D3D Buffer( 1 / 2 )
DirectX 11 [DX11_#2]D3D Buffer( 2 / 2 )
DirectX 11 [DX11_#3]기본적인 설정
DirectX 11 [JumpToDX11-5] 새로운 시대를 여는 DirectX11...
DirectX 11 [JumpToDX11-6] 커맨드(Command)...
DirectX 11 [DX11_#4]텍스트, 버튼 출력
DirectX 11 [JumpToDX11-7] 간편해진 리소스 처리.
DirectX 11 [JumpToDX11-8] Deferred Contexts
DirectX 11 [JumpToDX11-9] Multi-threaded Rendering 을 위한 API.
DirectX 11 [JumpToDX11-10] GPGPU 를 위한 DirectCompute.
DirectX 11 [JumpToDX11-11] DirectCompute 를 위한 한걸음!
DirectX 11 [JumpToDX11-12] DirectCompute 의 절차.
DirectX 11 [JumpToDX11-13] Tessellation 등장.
DirectX 11 [DX11_#5]DirectX11의 활용 사례(1/3)
DirectX 11 [JumpToDX11-14] DirectX9 세대의 테셀레이션( ID3DXPatchMesh 편 )
DirectX 11 [JumpToDX11-15] DirectX9 세대의 테셀레이션( IDirect3DDevice9::DrawXXXPatch편 )
DirectX 11 [알콜코더의 미리 배워보는 DirectX 11 - 입문편] 0. 누구를 위한 연재인가
DirectX 11 [알콜코더의 미리 배워보는 DirectX11-입문편] 1.튜터리얼 01 : 다이렉트 3D 기초 #1

 

CLOUD

Cloud 구름 속의 미래 : Windows® Azure™ Platform [1]
Cloud SQL Azure - CTP1
Cloud SQL Azure 알아보기 (1) - 데이터베이스 개체 생성
Cloud SQL Azure 알아보기(2) ? 데이터베이스 스키마 마이그레이션, 데이터 전송
Cloud 구름 속의 미래 : Windows® Azure™ Platform [2]
Cloud SQL Azure 사용 시 주의점(1) - 방화벽 설정
Cloud SQL Azure 알아보기(3) ?SQL Server 2008 R2 Nov CTP
Cloud SQL Azure 알아보기(4) ? SQL Azure Cloud App
Cloud SQL Azure 알아보기 (5)- SQL Azure 이점과 T-SQL 지원
Cloud [MS@클라우드컨퍼런스] MS 클라우드 기술과 플랫폼
Cloud 클라우드 기반 분산 컴퓨팅을 위한 AppFabric (1) : 아하! App 분산!
Cloud Hello Windows Azure / Windows Azure Platform의 이해
Cloud Hello Windows Azure / Gallery of 'Powered by Windows Azure Platform'
Cloud Hello Windows Azure / Windows Azure 개발 환경의 구축
Cloud Hello Windows Azure / Understanding Windows Azure Development Process
Cloud Hello Windows Azure / Windows Azure Tools for Visual Studio 1.2 출시
Cloud Hello Windows Azure / Windows Azure Platform 최신 소식 업데이트 (종합) [수정]
Cloud Hello Windows Azure / Twitter 스타일 방명록 만들기 #1
Cloud Windows Azure Update: Microsoft Project Code-Named "Houston" CTP 1
Cloud SQL Azure와 Excel 2010의 PowerPivot
Cloud Hello Windows Azure / Twitter 스타일 방명록 만들기 #2
Cloud Windows Azure Update: CloudStorageAccount 클래스 사용 시 주의 사항
Cloud SQL Azure Update: Dynamic Management View
Cloud Hello Windows Azure / Twitter 스타일 방명록 만들기 #3
Cloud Windows Azure Update: myAzureStorage
Cloud SQL Azure 와 SQL Reporting Service
Cloud Windows Azure Update: Windows Azure CDN의 활용

 

WINDOWS 7

Windows 7 Windows SDK 설치 후 XAML 인텔리센스 문제
Windows 7 Windows 7을 위한 Windows XP 모드
Windows 7 [Windows7] Win32를 이용해 윈도우7 멀티터치 프로그래밍하기
Windows 7 사람이 기계와 만나는 진정한 방법 - 멀티터치
Windows 7 [멀티터치]멀티터치 프로그래밍 환경 구축하기
Windows 7 [윈도우 7 멀티터치] #1 : 멀티터치 UX를 적용하는 3단계 전략

 

WINDOWS MOBILE 7

Windows Mobile 7 WindowsMobile 6 Native 개발자가 WindowsMobile 7 개발자로 변신하기
Windows Mobile 7 WM7 개발에 들어가기전에
Windows Mobile 7 Expression Blend와 함께 하는 윈도우폰7 개발 이야기 - 1편 -
Windows Mobile 7 Expression Blend와 함께 하는 윈도우폰7 개발 이야기 - 2편 -
Windows Mobile 7 Expression Blend와 함께 하는 윈도우폰7 개발 이야기 - 3편 -
Windows Mobile 7 Windows Phone Developer Tool Release

 

SHAREPOINT 2010

SharePoint 2010 Visual Studio 2010 에게 바란다 - SharePoint 14 Development
SharePoint 2010 SharePoint 2010 Overview
SharePoint 2010 SharePoint 2010 개발 환경 구성
SharePoint 2010 SharePoint 2010 개발 환경- Hello World 웹 파트 생성 및 배포하기
SharePoint 2010 SharePoint 2010 Web Part 생성
SharePoint 2010 SharePoint 2010 Visual Web Part
SharePoint 2010 SharePoint 2010 Feature
SharePoint 2010 SharePoint 2010 Event Receiver
SharePoint 2010 SharePoint 2010 데이터 기술
SharePoint 2010 SharePoint 2010 Server Object Model
SharePoint 2010 Visual Studio 2010 출시에 따른 SharePoint Developer Tools
SharePoint 2010 SharePoint 2010 LINQ to SharePoint
SharePoint 2010 Client Object Model - .NET
SharePoint 2010 Client Object Model ? Silverlight (1)
SharePoint 2010 Client Object Model ? Silverlight (2)
SharePoint 2010 Client Object Model - Javascript(1)
SharePoint 2010 Client Object Model - Javascript(2)
SharePoint 2010 Client Object Model ? 정리
SharePoint 2010 SharePoint 2010 개발환경 구축 가이드
SharePoint 2010 REST -.NET
SharePoint 2010 REST ? Silverlight
SharePoint 2010 REST - jQuery
SharePoint 2010 SharePoint 2010 프로젝트 디버깅
SharePoint 2010 SharePoint 2010 Developer Dashboard

 

ARCHITECTURE

Architect Development Architect Development ?
Architect Development 몽당연필과 함께하는 VSTS 2010 모델링 0/4
Architect Development 몽당연필과 함께 하는 VSTS 2010 모델링 1/4
Architect Development Windows Server AppFabric - Velocity 란?
Architect Development WCF=SOA 에 대한 고찰

 

AGILE DEVELOPMENT

Agile Development [Better Code]TDD의 개념이 완벽히 녹아 들어간 VSTS 2010
Agile Development [Better Code]Visual Studio 2010 Code Analysis Enhancements - 1.개요
Agile Development [Better Code]Visual Studio 2010 Code Analysis Enhancements - 2. Rule Sets Feature
Agile Development [Better Code]PEX, Automated Whitebox Testing for .NET - 1. 개요
Agile Development [Better Code]Visualize Code Relationships
Agile Development [Testing] TDD (Test-Driven Development-테스트 주도 개발)
Agile Development [Testing] BDD (Behavior-Driven Development?행위 주도 개발)
Agile Development [Testing] Moq.NET (T/B Driven Development)
Agile Development [Better Code]Visual Studio Code Analysis Enhancements - 3. Data Flow Rules and Phoenix Engine
Agile Development 애자일에 대한 고찰
Agile Development [ALM-Test] 1. 왜 단위 테스트를 해야 하는가?
Agile Development [ALM-Test] 2. 한국적인 애자일 모델의 필요성
Agile Development [협업 1] 협업 도구의 통일성과 협업 인프라 관리
Agile Development [ALM-Test] 3. 테스터에 대한 오해와 진실
Agile Development [ALM-Test] 4. 테스터(SDET) 의 역할
Agile Development [ALM-Test] 5. 테스트 계획
Agile Development [ALM-Test] 6. Load Runner vs Visual Studio 2010 테스팅 비교 분석 - http://willstory.tistory.com/4 제공

 

TEAM FOUNDATION SERVER 2010

Team Foundation Server Visual Studio Team System 2010 (CTP10) - 작업 항목 링크
Team Foundation Server TFS 2010 설치 하기
Team Foundation Server TFS 2010 Build Service 설치
Team Foundation Server TFS 2010 설치 과정 중에 TF255040 문제
Team Foundation Server Visual Studio 2010을 활용한 ALM (1-5) - ALM 이란 무엇인가
Team Foundation Server Team Foundation 트러블 슈팅 가이드
Team Foundation Server Visual Studio Team Foundation Server 2010 를 설치해보자
Team Foundation Server Visual Studio Team Foundation Server 2010 설치 전 할일
Team Foundation Server VS TFS 2010 설치편 - 설치전 IIS, .NET 설치
Team Foundation Server VS TFS 2010 설치편 - 설치 시작
Team Foundation Server VS TFS 2010 구성편 - 설치 후 TFS 구성으로 점심 얻어먹기 편
Team Foundation Server VS TFS 2010 사용편 - SourceSafe? 버려~
Team Foundation Server [HowTo] Team Foundation Server 의 로컬 매핑 캐시 제거하기
Team Foundation Server [HowTo] SharePoint 2010 Beta 깨끗하게 제거하기
Team Foundation Server [HowTo] SCVMM 의 Install Virtual Guest Service 작업 중 2941 오류
Team Foundation Server [HowTo] TFS2010 의 Tfs_Analysis 웨어하우스 데이터베이스가 망가졌을 경우

Concurrency Runtime – Task Scheduler 4. ( ScheduleTask )

VC++ 10 Concurrency Runtime 2010. 10. 4. 08:30 Posted by 알 수 없는 사용자

Concurrency Runtime
– Task Scheduler 4. ( ScheduleTask )

작성자: 임준환( mumbi at daum dot net )

 

시작하는 글

 Concurrency Runtime 에서는 기존의 멀티스레드 프로그래밍할 때, 필수적인 스레드를 생성하는 함수( CreateThread(), _beginthread() 등 )와 같은 기능을 제공합니다.

이 글에서는 어떻게 위와 같은 기능을 제공하고, 어떻게 사용하면 되는지 알아보도록 하겠습니다.

 

ScheduleTask

 이 전에 설명했던 Parallel Patterns Library( 이하, PPL ) 이나 Asynchronous Agents Library( 이하, AAL ) 을 사용하게 되면 암묵적으로 스레드가 생성되고, 관리되기 때문에, 아주 간단한 작업을 처리할 때에는 비교적 높은 오버헤드( overhead )를 갖게 됩니다.

 그래서 Concurrency Runtime 에서는 간단한 작업들을 처리하기에 비교적 적은 오버헤드를 갖는 기능을 제공합니다.

 이 간단한 작업을 처리하는 방법은 기존의 스레드를 생성하는 방법과 유사합니다. 즉, 직접 스레드 코드를 제어하고 싶을 때, 사용할 수 있습니다.

 아쉬운 점은 간단한 작업의 처리를 완료했을 때, 알려주지 않습니다. 스레드 핸들을 사용하지 않기 때문에 WaitForSingleObject() 와 같은 함수도 사용할 수 없습니다.

 그렇기 때문에 스레드로 수행될 함수의 인자를 넘길 때, 스레드 종료를 알리는 메커니즘에 필요한 데이터를 포함해주어야 합니다.( 또는 전역적으로.. )

 Concurrency Runtime 에서는 위와 같이 스레드를 생성하는 기능을 제공하지만, 간단한 작업이 아니라면 PPL 또는 AAL 을 사용하는 것을 권하고 있습니다.

 이러한 기능은 ScheduleGroup::ScheduleTask(), CurrentScheduler::ScheduleTask(), Scheduler::ScheduleTask() 를 호출하여 사용합니다.

 

ScheduleGroup::ScheduleTask( TaskProc _Proc, void* _Data );

 일정 그룹 내에 간단한 작업을 추가합니다.

 첫 번째 매개변수의 타입인 TaskProc 는 다음과 같이 정의되어 있습니다.

typedef void (__cdecl * TaskProc)(void *)

[ 코드1. TaskProc 의 정의 ]

 그렇기 때문에 위와 같은 모양( signature ) 를 갖는 함수 포인터를 인자로 넘기면 됩니다.

두 번째 매개변수는 위에서 인자로 넘긴 함수 포인터의 인자로 넘길 데이터입니다.

 

CurrentScheduleer::ScheduleTask( TaskProc _Proc, void* _Data );

 호출하는 컨텍스트와 연결된( attached ) 스케줄러에 간단한 작업을 추가합니다.

매개변수의 내용은 위의 ScheduleGroup::ScheduleTask() 와 같습니다.

만약 호출하는 컨텍스트에 연결된 스케줄러가 없을 경우에는 기본 스케줄러에 추가합니다.

 

Scheduler::ScheduleTask( TaskProc _Proc, void* _Data );

 해당 스케줄러에 간단한 작업을 추가합니다.

매개변수의 내용은 위의 ScheduleGroup::ScheduleTask() 와 같습니다.

 

예제

 위에 언급된 내용과 함수들을 어떻게 사용하는 알아보도록 하겠습니다.

 

시나리오

 새로운 스레드를 생성하고, 그 스레드에서 인자로 전달 받은 구조체의 내용을 출력하는 내용입니다.

 

코드

#include <iostream>
#include <concrt.h>

using namespace std;
using namespace Concurrency;

void __cdecl MyThreadFunction( void* pParam );

// 스레드에서 사용할 데이터
struct MyData
{
	int val1;
    int val2;
    event signal;
};

int main()
{
	MyData* pData = new MyData;

	if( nullptr == pData )
		return 1;
	
	pData->val1 = 50;
	pData->val2 = 100;
	
	// _beginthreadex() 처럼 스레드를 생성하고 인자로 넘어간 함수를 생성된 스레드에서 수행한다.
	CurrentScheduler::ScheduleTask( MyThreadFunction, pData );

	// 수행 중인 작업이 끝날 때까지 대기.
	pData->signal.wait();

	// 작업이 끝난 후, 자원 해제.
	delete pData;	

	return 0;
}

[ 코드2. CurrentScheduler::ScheduleTask() 를 사용하여 스레드를 생성하는 예제 ]

 간단한 구조체를 생성하고, 스레드에서 수행될 함수에 전달합니다.

 스레드에서는 구조체의 정보를 출력합니다.

 스레드의 수행이 종료되기 전에 구조체를 제거하면 안되므로, event 객체를 이용해 스레드가 종료될 때까지 기다린 후, 제거합니다.

 

마치는 글

 Concurrency Runtime 을 사용 중에 간단하게 스레드를 생성해야 한다면, 기존의 스레드 생성 함수를 사용하는 것보다 일관성 있게 ScheduleTask 를 사용하는 것이 좋습니다.

 하지만 이 글에서 언급했듯이 간단하지 않은 작업이라면 PPL 이나 AAL 을 사용하는 것이 좋습니다.

 다음 글에서는 Scheduler 에서 제공하는 Context 에 대해서 알아보도록 하겠습니다.

Windows Azure Update: Windows Azure CDN의 활용

Cloud 2010. 10. 1. 22:00 Posted by 알 수 없는 사용자

공지: 티스토리 편집기 조작 상의 문제로 완성되지 않은 글이 일찍 노출되는 문제가 있었습니다. 다음부터는 이러한 일이 없도록 하겠습니다. 불편을 드려서 대단히 죄송합니다.

안녕하세요. Visual C# MVP 남정현입니다. 지난달 13일부터 15일까지 성황리에 개최된 Korea Games Conference에서 보여주신 Social Game and Windows Azure Platform 세션에서, Windows Azure CDN에 관하여 말씀을 드린 부분이 있었습니다. 이번 아티클에서는 Windows Azure CDN의 구체적인 내용을 설명하고, Windows Azure CDN을 어떤 방법으로 활용할 수 있는지에 대한 내용을 소개합니다. 최근에 Windows Azure CDN도 Amazon Web Service CDN과 마찬가지로 서울을 경유하는 회선을 추가하여 비약적인 속도 발전이 있었기 때문에, 정식 출시가 이루어지지는 않았지만 미리 알아두시면 상당히 유용한 정보가 될 것이라 봅니다. :-)

CDN이란 무엇인가?

CDN은 일정한 크기의 파일들을 지역별로 Mirroring하여 동시에 많은 사용자가 같은 파일을 다운로드하려고 하는 상황에서도 안정적으로 파일 다운로드 서비스를 제공할 수 있도록 도와주는 서비스로, 인터넷 사용자의 비약적인 증가와 더불어서 CDN 서비스에 대한 수요가 증가하였습니다. 일반적으로 CDN 서비스는 대화형 웹 인터페이스 (CGI)를 경유하지 않고 정적인 컨텐츠를 퍼다나르기 위한 방법으로 많이 사용되며, 이미지, 동영상, 다소 크기가 큰 클라이언트용 설치 파일과 같이 "자료"의 성격을 띄는 데이터들을 위한 것이 일반적입니다.

Windows Azure CDN에 대한 소개

이전 방명록 샘플 강좌에서 파일을 업로드하기 위하여 사용한 저장 공간인 Windows Azure Storage에 최근에 CDN 서비스가 추가되었습니다. Windows Azure Storage에서 CDN을 사용하는 것은 별도의 과금이 이루어지는 서비스이며, 기본적으로 제공되는 Storage Service 주소와는 별개로 CDN 서비스만을 위한 전용 도메인이 구분되어있습니다. 물론 Storage 서비스와 마찬가지로 CDN 서비스도 Custom Domain 구성이 가능합니다.

Windows Azure CDN의 동작 원리

Windows Azure CDN은 Windows Azure Storage의 컨텐츠를 기준으로 만들어지는 서비스로, 여러분이 수집하거나 배포하기 위하여 Storage에 올려놓은 자료들 중에서도 "Public Access" 퍼미션이 지정된 컨테이너내의 Block BLOB들을 자동으로 검색하여 CDN 배포 에이전트가 일정 주기로 미러링을 수행합니다. 이렇게 미러링된 파일은 지역별로 제일 빠른 서버에 의하여 클라이언트로 다운로드될 수 있도록 자동 구성됩니다.

참고로, 특별히 Block BLOB이라고 언급한 까닭은, Windows Azure Storage에서 취급할 수 있는 BLOB이 두 종류가 있기 때문인데, 크기가 매우 크기 때문에 한번에 취급할 수 없어서 마치 Win32의 메모리 맵 처럼 부분별로 나누어서 데이터를 저장하거나 관리해야하는 거대한 파일을 위한 Paged BLOB은 미러링 대상으로 적합하지 않기 때문입니다.

Windows Azure CDN의 과금 정책

Windows Azure CDN의 과금 정책은 2010년 10월 현재 다음과 같이 공시되어있습니다. (출처: http://www.microsoft.com/windowsazure/offers/popup/popup.aspx?lang=en&locale=en-US&offer=MS-AZR-0003P)

  • $0.15 per GB for data transfers from European and North American locations
  • $0.20 per GB for data transfers from other locations
  • $0.01 per 10,000 transactions
  • 그리고 CDN 서비스의 사용을 위하여 전제가 되는 Storage 서비스의 요금은 다음과 같습니다.

  • $0.15 per GB stored per month
  • $0.01 per 10,000 storage transactions
  • 위의 요금들을 기준으로 하였을 때, 동아시아 지역의 데이터 센터를 이용하도록 구매하였을 경우, 매 달 과금되는 요금은 1GB 당 0.15$이고, 아시아 내에서의 트래픽이 많이 발생할 것이므로 전송량 1GB당 0.2$가 과금될 것이며, CDN 서비스를 통하여 매 1만건의 트랜잭션이 발생할 때 마다 0.01$가 과금될 것입니다.

    이러한 기준으로 볼 때, 한달에 30MB 정도의 파일 5개가 각각 기간 내 누적 다운로드 회수가 10000여회 정도 된다고 가정하면, 약 1464GB의 트래픽이 발생한 것으로 볼 수 있고 금액은 약 292.81$, 대미환율이 1200원이라고 가정하였을 때 한달 35만원 정도의 비용이 과금되는 셈입니다. 어떤 CDN 서비스를 사용하는지에 따라서 이 가격에 이점이나 단점이 제각기 있을 수 있지만 확장성이나 사용 편리성 관점에서 보았을 때 그리 나쁘지 않은 가격대일 수 있습니다.

    결론

    Windows Azure CDN은 다른 Windows Azure 서비스와 마찬가지로 프로그래밍 방식으로 제어가 가능한 범위 안에 있는 솔루션입니다. 기존의 CDN으로 충족되지 않는 기능성을 모두 포함하면서도, World-wide class의 서비스를 제공할 수 있으므로 사업 영역을 확장하거나, 초기 투자 비용을 적게 만들 수 있는 방안으로서는 매우 이상적인 서비스입니다. 최근에는 대한민국 서울을 경유하는 회선도 추가되어 서비스 수준이 더욱 높아졌습니다.

    이는 동영상 서비스 제공, 자료실 운영과 같은 일반 사용자를 위한 서비스 제공에도 대응이 가능하면서, 좀 더 복잡한 요구 사항을 만족시킬 수 있는 방법을 제공함을 뜻합니다. 사용한 만큼 돈을 지불하는 과금 모델이므로 호스팅과는 달리 사용량이 적을 때에는 적은 운영 비용을 유지하는 것도 가능합니다.

    CDN 서비스의 특성상 기술적으로 이해하거나 학습해야 할 내용이 많은 것은 아니나 성공적으로 비즈니스를 시작할 수 있도록 도움을 주는데에는 그 가치가 충분하다고 생각되는 바 Windows Azure CDN 서비스의 배경과 특징을 설명하는 내용을 이번 시간에다루었습니다.

    감사합니다. :-)

    'Cloud' 카테고리의 다른 글

    SQL Azure Update (2)  (0) 2011.02.11
    SQL Azure Update (1)  (0) 2011.01.28
    SQL Azure 와 SQL Reporting Service  (0) 2010.09.30
    Windows Azure Update: myAzureStorage  (0) 2010.09.06
    Hello Windows Azure / Twitter 스타일 방명록 만들기 #3  (0) 2010.09.04

    [Step. 14] 인터페이스 ( interface )

    C++/CLI 2010. 10. 1. 09:30 Posted by 알 수 없는 사용자

    인터페이스는 비관리코드에서는 순수가상함수만을 가진 클래스와 같습니다. ‘interface class’라는 키워드를 사용하여 정의하면 이 클래스에는 아래와 같은 형만 멤버로 가질 수 있습니다.

     

    함수

    프로퍼티

    이벤트

     

    또한 선언만 가능하지 정의는 할 수 없습니다.

     


    C++/CLI ref class C#이나 Java와 같이 다중 상속은 할 수 없지만 인터페이스를 사용하면 다중 상속(즉 인터페이스를 상속)을 할 수 있습니다.

     

    interface class IA {

    public:

        void funcIA();

    };

    interface class IB {

    public:

        void funcIB();

    };

    interface class IC {

    public:

        void funcIC();

    };

    ref class A {

        int i;

    };

    ref class B : A, IA, IB, IC {

    public:

        virtual void funcIA() {   }

        virtual void funcIB() {   }

        virtual void funcIC() {   }

    };

    int main() {

        B^ b = gcnew B;

     

        IA^ ia = b;

        IB^ ib = b;

        IC^ ic = b;

        b->funcIA();

        ia->funcIA();

        ib->funcIB();

        ic->funcIC();

        return 0;

    }

     



    출처

    http://cppcli.shacknet.nu/cli:interface

     

     

    VS2010에서 nullptr의 알려진 버그

    C++0x 2010. 9. 30. 23:57 Posted by 알 수 없는 사용자
    안녕하세요.
    이 글에서는 VS2010에서 nullptr의 버그를 간단하게 언급하겠습니다.
    아래 코드는 문제 없이 컴파일 되고 실행이 됩니다.

    #include "stdafx.h"
    
    
    template<int> void f(){};
    
    void g()
    {
        f<nullptr>();
    }
    
    template<template <class> class> class C {};
    
    void test()
    {
        auto x = nullptr;
        x++; // should give error
        x += 1; // should give error
    }
    
     int _tmain(int argc, _TCHAR* argv[])
    {
        C<nullptr> c;
        test();
    
        return 0;
    }


    하지만 다음과 같은 세가지 버그가 존재합니다.

    1. nullptr이 함수 템플릿의 non-type argument로서 사용이 됩니다. ( f<nullptr>(); )
    2. nullptr이 template template argumen로서 사용이 됩니다. ( template<template <class> class> class C {}; )
    3. nullptr에 대해서 몇몇 수학적 operation이 동작합니다. ( in test() )

    Windows Phone Developer Tool Release

    Windows Mobile 7 2010. 9. 30. 22:28 Posted by 알 수 없는 사용자

    MSDN 영문 사이트의 Main Page에 보면 Windows Phone Developer Tool Release 라는 내용에 대한 이미지를 볼 수 있습니다. 릴리스 시점은 추석 연휴 시작하기 전인 9 16일입니다.

    아직 관련 소식에 대한 업데이트가 없어 릴리스에 대한 내용을 알아보도록 하겠습니다.

    이미지를 클릭하면 블로그로 이동해서 내용을 살펴보시면 여러 유용한 정보를 알려주고 있으니 Windows Phone 7에 관심 있는 분은 방문해보시기 바랍니다.

    http://windowsteamblog.com/windows_phone/b/wpdev/archive/2010/09/16/windows-phone-developer-tools-are-final.aspx

     

    도구가 새로 릴리스 되었으니 다운로드 받아 설치해보도록 하겠습니다. 개발도구 등의 사이트는 아래 사이트를 방문하면 됩니다.

    http://developer.windowsphone.com/windows-phone-7/

    이전 버전의 도구(Beta) 가 설치되어 있다면 제거합니다. 도구를 다운로드 받아 설치를 진행합니다. 이전 버전보다는 더 많은 구성요소가 설치됩니다. Expression Blend 4 가 있다면 Expression Blend 4 Add-in for Windows Phone 도구도 설치됩니다.

    현재는 Windows Phone Developer Tool 은 영문 버전만 제공되고 있습니다.

    설치가 다 되고 나면 Visual Studio 2010에서 새 프로젝트를 생성하려고 하면 Silverlight for Windows Phone에 대한 내용을 볼 수 있으며 아래와 같은 프로젝트 템플릿을 확인할 수 있습니다.

    Expression Blend 4 에서도 마찬가지로 Windows Phone에 대한 프로젝트 템플릿을 확인할 수 있습니다.


    프로젝트 템플릿을 보면 이전 버전(Beta)와 다르게 CodePlex에서 소개하던 Panorama, Pivot 에 대한 프로젝트 템플릿이 나타나는 것을 알 수 있습니다.

     

    아직 설치를 하지 않으셨다면 설치해서 Windows Phone 개발을 시작해보시기 바랍니다.

    앞으로의 블로깅은 모바일에 대한 새로운 기능 위주로 작성할 예정입니다.

     


    SQL Azure 와 SQL Reporting Service

    Cloud 2010. 9. 30. 22:24 Posted by 알 수 없는 사용자

    현재 SQL Azure에서는 Business Intelligence 에 대한 내용을 제공해주고 있지 않지만 향후에는 지원이 될 예정입니다. SQL Azure를 활용하는 방법 중의 하나로 SQL Reporting Service에서 SQL Azure를 이용하는 방법을 다루어보도록 하겠습니다.

    사실 데이터 원본에 대한 내용이 SQL Azure 이며 나머지 보고서를 작성하는 것은 별 다른 차이가 없습니다.

    보고서 서버 프로젝트를 생성해서 보고서를 추가하고 데이터 원본을 생성합니다.

    데이터 원본의 서버이름은 SQL Azure의 서버 이름을 입력하고 SQL 계정과 비밀번호를 입력하고 데이터베이스 이름은 직접 입력합니다.


    SQL Azure
    에 있는 테이블과 뷰로 보고서 집합을 생성합니다.

    여기서는 Category, SubCategory, Product 테이블에 대한 뷰를 생성하도록 하겠습니다.

    쿼리 디자이너를 통해 테이블을 추가하려고 하면 아래와 같은 메시지를 볼 수 있습니다.

    그래서 직접 쿼리문을 작성하거나 SQL Server Management Studio에서 쿼리문을 작성해서 데이터 집합을 생성합니다.

    쿼리문은 아래와 같습니다.

    아래와 같이 보고서를 디자인합니다.

    미리보기를 클릭해서 결과를 확인합니다.


    현재의 SQL Azure Business Intelligence를 제공하고 있지 않아 SQL Azure를 활용하는 방법으로 SQL Server Reporting Service에서 SQL Azure 데이터를 표시하는 것을 다루어 보았습니다.