2010. 1. 29. 09:00

1.RichTextArea Part 1
2.RichTextArea Part 2
3.Accessing Web Camera and Microphone
4.Right Click Mouse Events

5.MouseWheel API

6.Using Silverlight Controls As Drip Targets
7.DataGrid Enhancements
8.Printing API Basics 
9.Hosting HTML Content

10.Accessing the Global Clipboard Programmatically

11.Using the ViewBox Control

12.Asynchronous Data Validation 
13.BiDi and Right-to-Left Support 
14.Notification API
15.Local File Access 
16.RIA Services support in Visual Studio 2010 

블로그 이미지 김영욱 차장 Microsoft Korea  .NET Evangelist
Enterprise UX 를 위한  UI 기술과 SOA, Cloud Computing, NUI등 다양한 분야의 접목과 응용을 통해 최적의 IT 인프라 구축을 위해서 노력하고 있다.
Email: iwinkey@hotmail.com
Blog: http://winkey.tistory.com

 

경고창을 띄울 수 있는 방법을 물으면 혹자는 자바스크립트의 Alert()을 이야기 할 것 이고 또 다른 분은 MessageBox.Show()를 이야기 할 것 입니다. 하지만 두 가지 방법 모두다 웹 브라우저 기반의 방법으로 시스템 기반의 경고창을 띄우지는 못합니다. 시스템 기반의 경고창은 Silverlight를 사용해서 모니터링 시스템을 만든다든지 할 경우에 꼭 필요한 기술 입니다. 시스템 기반의 경고창을 이용하면 다른 창들에 의해서 경고창이 가려져서 인지하지 못하는 경우가 없어지기 때문입니다.

 

<그림1>Notification API 샘플

 

이미 눈치를 채신 분들이 계실지 모르겠습니다만 시스템 차원에서 경고창을 띄우는 것은 시스템 API에 대한 접근이 필요로 합니다. 그래서 이 기능은 OOB에서만 사용 가능합니다. 앞서서 설명한 적이 있는 방법으로 로컬에 설치를 해줘야 실행이 가능합니다.

 

 

Silverlight 4에서는 Notification을 위한 방법을 제공해 주고 있습니다. 기본적으로는 Window만 제공해주고 있는 방법으로 아주 심플하게 사용할 수 있는 방법입니다.

 

<그림2> NotificationWindow 사용 예

 

시스템 차원의 경고창을 지원하는 객체로 NotificationWindow라는 객체가 제공 됩니다.

 

<소스1>NotificationWindow의 사용 예

 

사용하는 방법은 NotificationWindows 객체를 하나 만들고 거기에 화면에 보여줄 객체를 넣고 Show()를 호출하면 됩니다. 여기서는 Show(3000)이라고 되어 있는데 이는 3초를 의미합니다.

 

그런데 보기 싫기도 하고 사용자가 원하는 타입이 아닐 확률이 대단히 대단히 높습니다. 그래서 사용자가 좀 더 예쁜 레이아웃을 정의해서 사용할 수 있는 방법을 <소스2>에서 볼 수 있습니다.

 

 

<소스2>Custom 디자인을 보여주는 NotificationWindows

<소스2>에서 보면 중간에 CustomNotification이라는 객체가 나오는데 이는 기본으로 제공 해주는 객체는 아니고 예쁜 디자인을 위해서 사용자가 추가한 커스텀 컨트롤입니다. 첨부된 샘플을 보시면 디자인 소스를 보실 수 있습니다.

2010. 1. 28. 09:00

1.RichTextArea Part 1
2.RichTextArea Part 2
3.Accessing Web Camera and Microphone
4.Right Click Mouse Events
5.MouseWheel API
6.Using Silverlight Controls As Drop Targets
7.DataGrid Enhancements
8.Printing API Basics
9.Hosting HTML Content
10.Accessing the Global Clipboard Programmatically 
11.Using the ViewBox Control 
12.Asynchronous Data Validation 
13.BiDi and Right-to-Left Support 
14.Notification API
15.Local File Access 
16.RIA Services support in Visual Studio 2010  
 

블로그 이미지 김영욱 차장 Microsoft Korea  .NET Evangelist
Enterprise UX 를 위한  UI 기술과 SOA, Cloud Computing, NUI등 다양한 분야의 접목과 응용을 통해 최적의 IT 인프라 구축을 위해서 노력하고 있다.
Email: iwinkey@hotmail.com
Blog: http://winkey.tistory.com

 

이번에 설명할 기능은 RTL(Right To Left)라고 불리는 기능이다. <그림1>에서 볼 수 있듯이 아랍권 언어들은 글자의 방향이 우리와는 반대 반향으로 흘러간다. 우리가 보기에는 이해하기 힘든 방식이기도 하고 글씨를 쓰다 보면 이미 쓴 글씨가 손에 묻거나 할 텐데 그래도 아랍권의 많은 사람들은 RTL 방식으로 글을 쓰고 읽는다. 

 

 
<그림1>RTL Sample

 

이번에는 RTL을 별도로 지원하는 방법이 없어서 전용 컨트롤을 사용하거나 혹은 온갖 꼼수를 동원하기도 했다. 하지만 Silverlight 4에서는 드디어 RTL이 기본으로 지원되기 시작했다.

 

하나 하나의 컨트롤 상에서 글씨의 흐름을 제어하기 위해서는 다음과 같이 사용할 수 있다.

 

<TextBlock FlowDirection="RightToLeft" Text="BiDi and RTL Sample" FontSize="20"  />

 

하지만 모든 컨트롤에 일일이 이렇게 지정할 수는 없기에 상위 레벨에서 지정하면 페이지 전체에 영향이 가게끔 할 수 있다.

 

<UserControl x:Class="BiDiRTL.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" FlowDirection="RightToLeft">

 

위와 같이 UserControl Level에서 RTL을 지정하게 되면 이 페이지에 포함된 모든 객체들이 RTL방식으로 출력되게 된다.


2010. 1. 27. 09:00

1.RichTextArea Part 1
2.RichTextArea Part 2
3.Accessing Web Camera and Microphone
4.Right Click Mouse Events

5.MouseWheel API

6.Using Silverlight Controls As Drip Targets
7.DataGrid Enhancements
8.Printing API Basics 
9.Hosting HTML Content

10.Accessing the Global Clipboard Programmatically

11.Using the ViewBox Control
12.Asynchronous Data Validation 
13.BiDi and Right-to-Left Support 
14.Notification API
15.Local File Access 
16.RIA Services support in Visual Studio 2010 

블로그 이미지 김영욱 차장 Microsoft Korea  .NET Evangelist
Enterprise UX 를 위한  UI 기술과 SOA, Cloud Computing, NUI등 다양한 분야의 접목과 응용을 통해 최적의 IT 인프라 구축을 위해서 노력하고 있다.
Email: iwinkey@hotmail.com
Blog: http://winkey.tistory.com

 

이번 시간에 설명해 드리는 내용은 Silverlight에서 비동기적으로 데이터의 내용을 검증하는 것에 대한 내용입니다.

ASP.NET 등에서는 데이터의 내용을 검증하는 컨트롤들이 제공되고 있어서 비교적 쉽게 데이터의 내용을 검증하는 작업이 가능하지만 Silverlight에서는 아직 검증(Validation)과 관련된 컨트롤이 따로 제공되지 않고 있습니다.

 

<그림1> 비동기 검증에 대한 기법을 보여주는 샘플

 

검증 작업을 자동으로 처리해주는 컨트롤이 없으면 일일이 코딩으로 처리해 주어야 하기 때문에 이번에 설명할 내용은 꽤 코드 위주로 진행 될 예정입니다. 또 대부분은 Silverlight 4가 아니더라도 적용 가능하기 때문에 본 내용은 Silverlight를 사용하는 대부분의 개발자들에게 도움이 되는 내용입니다.

 

 

1. 왜 비동기 적인 검증을 하는가?

 

비동적인 검증을 하는 이유는 여러 가지 이유가 있을 수 있지만 가장 중요한 이유는 사용자들의 작업을 최대한 방해하지 않는다는 것입니다. 사용자의 작업을 최대한 방해 하지 않으면서 자연스럽게 잘못된 입력을 알려는 방법으로 비동기 검증을 이야기 하고 있습니다.

물론 경고 창이 별도로 팝업되고 사용자들의 확인을 요구하는 것은 부적절하고 쓸데 없는 클릭을 유발합니다.

 

<그림2>자연스러운 입력 오류의 안내

 

<그림2>를 보면 팝업이 발생하지 않는 방법으로 사용자들에게 입력 오류가 발생한 컨트롤의 위치와 오류의 내용을 설명하고 있는 것을 볼 수 있습니다. 이런 작업을 가장 적절하게 해결 할 수 있는 방법은 바로 사용자 정의 컨트롤을 제작하는 것입니다. 여기서는 EditCustomer라는 사용자 정의 컨트롤을 제작하겠습니다.

 

 

2. 사용자 정의 컨트롤을 만들어 보자.

 

사용자 정의 컨트롤을 만들 때는 반복적으로 사용되거나 혹은 동적으로 변화하는 UI영역, 혹은 이벤트 핸들링이 필요한 경우 등 다양한 목적으로 인해서 만들게 됩니다. 여기서는 이벤트 핸들링을 목적으로 EditCustomer라는 사용자 정의 컨트롤을 만들어 보려고 합니다.

 

<그림1>에서 볼 수 있는 영역 자체가 지금 만들려고 하는 EditCustomer 컨트롤 입니다. 메인 페이지에서 해당 폼을 불러서 사용하기 위해서 아래와 같이 코드를 이용할 수 있습니다.

 

EditCustomer wind = new EditCustomer();
wind.VerticalAlignment = System.Windows.VerticalAlignment.Top;
wind.Margin = new Thickness(0, 50, 0, 0);
wind.Show();

 

본격적으로 코딩에서 들어가기 전에 EditCustomer는 System.Windows.Controls.ChildWindow로 부터 상속을 받게 합니다. ChildWindow는 Silverlight 안에서 하나의 팝업 창의 역할을 할 수 있게 해주는 컨트롤로 앞으로 많이 활용 될 것으로 기대되는 컨트롤 중 하나 입니다.

 

<소스1>ChildWindow로 부터 상속

 

EditCustomer 사용자 컨트롤이 Load되고 나면 기본적인 이벤트 핸들러 들을 붙이기 시작하는데 그 이전에 보면 theWindow, theCustomer에 각 각 값을 대입하고 있는 것을 볼 수 있습니다.

<소스2>theWindow와 theCustomer의 사용

 

그런데 자세히 보면 theWindow에는 자기 자신을 집어 놓고 있고 theCustomer에는 CCustomer.RandomCustomer를 대입하고 있는 것을 볼 수 있는데 여기서 theWindow는 정적인 맴버 변수로 외부에서 자기 스스로를 잘 참조할 수 있게 추가한 구문입니다.

 

<소스3>맴버 변수인 theWindow

 

이와는 상관없이 theCustomer는 LayoutRoot.DataContext에 설정하는 것을 볼 수 있는데 이는 해당 되는 Entity Class를 해당 폼에 바인딩 시키기 위함입니다.  하지만 그냥 Entity class가 아닌 게 데이터만 가지고 있지 않고 이벤트도 가지고 있기 때문입니다. 해당 되는 Customer의 값이 바뀌면 발생되는 이벤트로 ChangeStatus를 가지고 있습니다.

 

<소스4>theCustomer_ChangeStatus 이벤트 핸들러

폼에 해당 Entity class가 바인딩 되어 있는 상태에서 사용자의 폼의 내용을 수정할 경우 Entity class도 변경되고 이와 관련된 이벤트가 발생되게 되는데 이는 그냥 되지는 않고 Customer class에서 해당 이벤트를 정의해 주었기 때문에 가능한 것입니다.

 

어찌되었던 변경이 감지되면 해당 상태에 맞추어서 메시지를 출력할 수 있게 해주는 코드가 <소스4>에 나와있습니다.

메시지를 내보는 메소드인 WriteToLog( )는 Log라는 ListBox에 아이템을 추가하는 방식으로 구현되어 있습니다.

 

<소스5>WriteToLog ( )

 

이제 Customer Class의 내용을 살펴보면 아까 사용했던 이벤트를 정의하는 부분이 있습니다.

<소스6>Customer class의 이벤트 델리게이트

 

이제 검증과 관련된 작업이 거의 끝났습니다.

정리해 보면 다음과 같이 요약 할 수 있습니다.

 

검증이 필요한 컨트롤을 사용자 정의 컨트롤로 만들고 Entity class를 설계하고 이때 이벤트 델리게이트를 사용해서 이벤트를 추가하고 해당 이벤트가 비동기적으로 발생할 때 마다 검증과 동시에 사용자에게 검증 결과를 알려주는 것입니다.

 

사소 소스가 불편하고 어려운 점들이 있어 보이는데 후에 좀 더 사용하기 쉬운 소스를 만들어볼까 합니다.

 

역시 나머지 내용은 첨부된 소스를 참조해 주시기 바랍니다.

2010. 1. 26. 09:00

1.RichTextArea Part 1
2.RichTextArea Part 2
3.Accessing Web Camera and Microphone
4.Right Click Mouse Events

5.MouseWheel API

6.Using Silverlight Controls As Drip Targets
7.DataGrid Enhancements
8.Printing API Basics 
9.Hosting HTML Content

10.Accessing the Global Clipboard Programmatically

11.Using the ViewBox Control

12.Asynchronous Data Validation 
13.BiDi and Right-to-Left Support 
14.Notification API
15.Local File Access 
16.RIA Services support in Visual Studio 2010  

블로그 이미지 김영욱 차장 Microsoft Korea  .NET Evangelist
Enterprise UX 를 위한  UI 기술과 SOA, Cloud Computing, NUI등 다양한 분야의 접목과 응용을 통해 최적의 IT 인프라 구축을 위해서 노력하고 있다.
Email: iwinkey@hotmail.com
Blog: http://winkey.tistory.com

 

  이번에 설명 해 드릴 내용은 매우 짧은 내용입니다. ViewBox 는 자기 자신 위에 다른 컨트롤을 올려 놓을 수 있는 일종의 컨테이너 역할을 하는 레이아웃과 관련된 컨트롤입니다. 한 가지 특이한 점은 ViewBox는 자기 자신의 크기가 바뀔 때 자기 위에 있는 컨트롤의 크기도 함께 변화시키는 특징이 있습니다.

그래서 크기를 자연스럽게 변화시키거나 할 때 유용하게 사용할 수 있는 컨트롤입니다.

 

<그림1> ViewBox 샘플

 

ViewBox를 사용할 경우에 잘 지정해야 하는 속성이 두 가지가 있는데 StretchDirection과 Stretch 입니다.

StretchDirection의 경우 크기가 변화 될 때 어느 정도까지 변화되는가에 대한 상한 혹은 하한선을 결정할 때 사용하는 속성인데 여기에서 설정할 수 있는 옵션은 다음과 같습니다.

 

UpOnly : 내용이 부모보다 작은 경우에만 크기가 커집니다. 내용이 부모보다 크면 크기가 줄어들지 않습니다.

DownOnly : 내용이 부모보다 큰 경우에만 크기가 줄어듭니다. 내용이 부모보다 작으면 크기가 커지지 않습니다.

Both : Stretch 모드에 따라 내용이 부모에 맞게 늘어납니다.

 

또 Stretch 속성은 ViewBox안에 있는 컨트롤이 ViewBox내에 채워지는 형태를 지정할 수 있게 되었는데 아래와 같이 4가지 방식으로 채워 질 수 있게 되어 있습니다.

 

None : 내용의 원래 크기가 유지됩니다.

Fill : 내용의 크기가 조정되어 대상 크기를 채웁니다. 가로 세로 비율은 유지되지 않습니다.

Uniform : 원래 가로 세로 비율을 유지하면서 대상 크기에 맞게 콘텐츠의 크기가 조정됩니다.

UniformToFill : 원래 가로 세로 비율을 유지하면서 대상 크기를 채우도록 콘텐츠의 크기가 조정됩니다. 대상 사각형의 가로 세로 비율이 소스와 다른 경우에는 소스 내용이 대상 크기에 맞게 클리핑됩니다.

 

여러 TileBrush Stretch 설정

<그림2>Stretch의 4가지 형태

 

첨부된 파일을 실행시켜서 여러 가지 옵션을 잘 실행시켜 보시기 바랍니다.

2010. 1. 25. 09:00

1.RichTextArea Part 1
2.RichTextArea Part 2
3.Accessing Web Camera and Microphone
4.Right Click Mouse Events

5.MouseWheel API

6.Using Silverlight Controls As Drip Targets
7.DataGrid Enhancements
8.Printing API Basics 
9.Hosting HTML Content
10.Accessing the Global Clipboard Programmatically 
11.Using the ViewBox Control 
12.Asynchronous Data Validation 
13.BiDi and Right-to-Left Support 
14.Notification API
15.Local File Access 
16.RIA Services support in Visual Studio 2010 

블로그 이미지 김영욱 차장 Microsoft Korea  .NET Evangelist
Enterprise UX 를 위한  UI 기술과 SOA, Cloud Computing, NUI등 다양한 분야의 접목과 응용을 통해 최적의 IT 인프라 구축을 위해서 노력하고 있다.
Email: iwinkey@hotmail.com
Blog: http://winkey.tistory.com

 

일시적으로 어떤 데이터를 잠시 보관해 두는 영역을 클립보드라고 부릅니다. 사용자의 의지에 따라서 다른 곳의 내용을 복사해서 붙여 넣기 등의 작업을 할 때 임시로 보관해 두는 메모리 영역도 역시 클립보드 입니다.

 

사용자의 의지라고 제가 명시한 이유는 클립보드의 내용을 접근할 때 일반적으로는 사용자들이 Ctrl + C, V 등을 사용해서 클립보드의 작업을 하지만 그렇지 않은 경우도 있을 수 있기 때문입니다. 우리가 만들려고 하는 응용프로그램에서 클립보드의 내용에 직접 접근해야 할  필요가 있을 수도 있습니다.

 

Silverlight 3까지는 코드 상에서 클립보드에 접근할 수 있는 방법을 제공해 주지 않고 있었지만 Silverlight 4에서는 방법을 제공하고 있습니다.

 

<그림1>클립보드 샘플 프로그램

 

<그림1>에 나오는 샘플에서 첫 번째 RichTextArea 안에 포함되어 있는 내용을 Ctrl + C를 통해서 Copy 하고 두 번째 RichTextArea에 Ctrl + V를 통해서 붙여 넣기 했을 경우에는 아무런 메시지 없이 잘 실행됩니다.

하지만  하단에 있는 Copy 혹은 Paste를 사용할 경우 다음과 같은 경고 메시지가 나타나게 됩니다.

 

<그림2> 클립보드 접근시 나오는 메시지

 

이렇게 코드에서 클립보드에 접근할 경우에 메시지가 뜨는 이유는 클립보드 역시 로컬의 자원이기 때문에 보안 모델을 위반할 수 있기 때문에 사용자에게 적절하게 메세지를 주는 것 입니다.

 

클립보드에 실제로 접근하기 위해서 사용할 수 있는 객체는 System.Windows.Clipboard 입니다.

클립보드에  선택된 텍스트를 저장하기 위해서는

 

Clipboard.SetText( LeftTextBox.Selection.Text );

와 같이 사용할 수 있으며 반대로 클립보드에 있는 내용을 가져오기 위해서는

 

RightTextBox.Selection.Text = Clipboard.GetText();

와 같이 사용할 수 있습니다.

 

여기서 한 가지 더 알아두면 좋은 메소드는 현재 클립보드에 내용이 있는지 없는지 확인하는 Clipboard.ContainsText() 입니다. Clipboard.ContainsText()의 경우 내용 유무를 bool 형태로 돌려주게 되어 있습니다.

  • yarak 2010.06.10 11:35

    안녕하세요
    clipboard관련하여 궁금한 점이 있는데 image를 clipboard에 저장하거나 가져올수 있는 방법이 있는지요??

2010. 1. 23. 00:44

시작하기 전에 이 의견은 절대(!) 제 개인적인 의견임을 밝혀 둡니다.

 

세종시가 도데체 뭘까요? 이름도 참 여러 가지였지만 지금의 모습은 이름만 바뀌는 것이 아니라는 것 정도는 누구라도 알고 있습니다. 한나라당과 청와대에서는 홍보 부족이라고 이야기 하지만 홍보는 이미 충분한 것 같습니다.  홍보가 부족하다기 보다는 본인들의 이야기가 잘 먹히지 않는다는 이야기를 그렇게 하는 것일지도 모른다는 생각이 듭니다.

 

이름이 바뀌는 것도 자주 있는 일은 아니겠지만 이제는 원래 그 일이 시작된 동기마저 바뀌어가고 있는 것 같습니다.

 

우리나라의 수도권 과밀화는 큰 사회적인 문제 입니다. 과밀화는 지속적이고 과다한 사회적 자원의 투입이 반복되는 악순환을 부르게 됩니다. 그리고 해당 과밀화 지역을 제외한 나머지 지역의 사회적 인프라의 빈곤을 필 수적으로 부르게 됩니다.  부산만 가보더라도 해운대 신도시를 제외하면 대부분 집값은 무척 저렴합니다. 서울에서 전세 살 비용이면 부산에서는 집을 사고도 남습니다. 단순히 집값을 잣대 삼는 것은 아닙니다. 하지만 서울 경계만 벗어나도 인프라가 떨어집니다. 산업/교육/교통/서비스/공공 모든 분야에서 제대로 된 곳이 손에 꼽을 정도 입니다.

안 그래도 작은 나라에서 모든 인프라를 한 곳에 모아두니 당연히 문제가 많을 수 밖에 없습니다. 균형 발전이라는 용어를 굳이 사용하지 않더라도 수도권 이외의 지역에서도 온 국민이 같이 열심히 노력하고 잘 살 수 있도록 하는 사회적인 합의가 정책에 반영 될 수 있어야 합니다. 그리고 그런 시대적인 합의에 의해서 균형 발전 정책이 나오게 되었고 지방 혁신 도시라는 청사진이 나오게 된 것입니다.

 

지방 혁신 도시라고 땅만 개간해 놓으면 기업과 학교들이 몰려들어서 열심히 그 위에 공장도 짓고 학교도 짓고 아파트도 지을까요? 지방 혁신 도시 이전에도 지방 자치 단체 혹은 중앙 정부에서 진행했던 실패한 신도시의 사례는 쉽게 찾아 낼 수 있습니다. 그래서 가장 효과적인 방법으로 정부에서 먼저 움직이고 이를 통해서 기본 사회적 인프라를 확보하면 기업도 학교도 서비스 산업도 함께 움직여야 하기 때문에 행정 중심의 도시를 설계 했던 것입니다.

인구가 분산되고 핵심 인프라가 골고루 분배되면서 작은 나라지만 크게 쓸 수 있게 하는 그것이 바로 균형발전이라고 생각합니다.

 

<그림1>인구밀도에 대한 수도권 비수도권의 비교 2007년 거의 50%가 되어가고 있다. (출처 통계청)

 

산업에 흘러 들어가고 재투자되어야 하는 비용이 수도권에 집중되면서 부동산 자산 가치만 올라가고 있습니다. 수도권 부동산 불패 신화에는 산업자금을 원활하게 사용하지 못하고 사라져간 중소기업들의 애환이 함께 하고 있다고 생각됩니다. 하지만 이런 애환은 반도체/자동차/조선/석유화학과 같은 대표적인 산업에 가려져서 잘 보이지 않게 되어 있습니다.

중소기업은 고용효과가 매우 큽니다. 일반적으로 대기업은 고용효과도 매우 크다고 생각할 수도 있지만 사실과는 거리가 있습니다.


<표1>실업률 증가 추이 (출처 통계청)

 

<표1>을 보면 알겠지만 2004년부터 꾸준히 취업자 숫자는 줄어오고 있습니다.

취업률의 저하와 함께 살펴봐야 하는 게 중소기업 신설법인 숫자 입니다.

<표2>신설법인 및 부도 법인 수 (출처 중소기업청 신설법인 현황)

 

신설법인 수가 꾸준히 줄고 있습니다. 한 가지 다행인 것은 부도 법인 수도 함께 줄고 있다는 점입니다. 하지만 그와는 상관없이 꾸준히 중소기업들 시장이 약해지고 있다는 지표로 삼을 수 있습니다. 이쯤 되면 부동산 가치의 상승과 중소기업과는 어떤 연관이 있는지 증명하라고 하실 분이 있을지 모르겠습니다. 사실 제가 무슨 경제/사회 전문가는 아니기 때문에 딱히 연결해서 보여드릴 수 있는 자신은 없습니다. 하지만 확실한 것은 주택담보 대출의 증가치가 사회적 물가 상승률을 과도하게 뛰어 넘고 있다는 사실이고 그 돈은 은행에서 빌린 거라는 것입니다.

 

<차트1> 주택담보 대출의 증가 추세

출처 매일경제 “늘어나는 주택대출 문제없나?”

 http://news.mk.co.kr/outside/view.php?year=2010&no=35033

 

 

 

 

작지만 큰 한국을 위해서는 사회적 자원이 골고루 분산될 수 있어야 합니다.

 

하지만 지금 한나라당과 정운찬 총리를 포함한 정부의 정책은 균형 발전보다는 충청도 퍼주기라는 컨셉을 잡은 것 같습니다.

 

‘사실상 이건 충청도의 특혜다!’

‘가기 싫어하는 서울대와 대기업들도 유치했다’

 

하지만 수도권에 있는 기업을 제외하고 우선 유치하라는 이명박 대통령의 지시는 왠지 씁쓸합니다. 좋게 생각하면 기존에 잘하고 있는 기업이 옮겨가게 하지 말고 신규 산업을 육성하라 정도의 의미일 것으로 생각됩니다만 신규산업이 그렇게 램프의 요정에게 빌면 나오는 것도 아니고 시간과 비용의 투자가 일정 시간이상 필요한 것이데 그럼 방법은 수도권 이외의 지방에 있는 기업이거나 혹은 수도권 이외의 지역에 들어갈 투자가 세종시에 투입되게 되는 것입니다.

 

결국 수도권은 그대로 경쟁은 지방끼리라는 모양세가 될 수도 있다는 말이겠지요.

단언코 저는 경제/정치 이런거 잘 모른 사람입니다. 하지만 이 두서없는 글을 쓰는 이유는 ‘정치’라는 단어는 알고 있기 때문입니다.

 

‘정치’란 한정된 사회적 자원을 효율적으로 사용하기 위해서 하는 사회적 활동 입니다.

 

특정 계층에게 혜택이 일방적으로 돌아가거나 비효율적으로 사회적인 비용과 노력이 낭비되는 것을 우리는 일반적으로 ‘삽질한다’고 표현합니다.

 

세종시는 원안대로 진행되어야 합니다. 그것이 이 시대의 사회적 합의 입니다.


지난번 미디어법 통과가 되었을 때 나이든 택시 기사님과 이야기 한 적이 있었습니다. 기사님은 민주당을 비판하고 있었는데 국회에서 몸 싸움하고 소리지르고 툭하면 국회 뛰쳐나오는 것이 못내 마음에 안 들었는지 비판의 말을 아끼지 않고 계셨습니다.

 

“그래도 방법이 없으면 몸 싸움이라도 해야지 않나요?”

 

라는 제 가벼운 말투에 기사님은

 

“그게 더 국민을 무시하는 처사야 국민들을 바보로 안다고 국민들도 다 보고 있는데 말이지 국회에서 법을 안 지키면 누가 지키냐는 말이지… “

 

기사님의 정곡을 찌르는 한 마디에 저는 살짝 민망해져서

 

“그래도 행여나 잘 못된 법안이라면 그로 인한 사회적 비용이 상당하지 않을까요?”

 

라고 대답하자….

 

“민주주의가 공짜인줄 알어? 민주주의를 위해서는 많은 비용을 지불하고 지켜봐야 하는 거야”

 

저는 나이든 택시 기사님의 한 마디에 더 이상 말을 잇지 못했습니다.

 

세종시 원안이 잘못된 것일 수도 있습니다. 하지만 그것은 우리나라 사회가 합의한 잠재적인 리스크이고 사회적 합의를 위해서 지불 할 수도 있는 비용이라고 생각합니다.

 

노무현 대통령은 지금 이 상황을 미리 보기라도 했을까요?

마지막으로 유튜브에 올라온 동영상을 링크합니다. 서귀포 혁신도시 기공식 연설인데 보고 나면 더 씁쓸해져서 소주 한잔이 생각나실지도 모르겠습니다. ---(*)---

 

  • 이아우 2010.01.25 00:58

    퍼주기 퍼주기, 떼먹기 떼먹기, 망치기 망치기..
    나라를 얼마나 망쳐야 그들의 마음이 풀릴까요.
    고인이 또 그리워지는 글이군요.
    잘봤습니다.

  • 애초에 2010.04.20 12:34

    세종시가 잘못되었다는 가정하에서 택시기사님과 대화를 하셧군요.

    잘못된 정책이라고 폭력을 행하는게 아니라 자기들 뜻에 안 맞는다고 폭력을 행하는걸로만
    보이는데요.

2010. 1. 21. 12:00

1.RichTextArea Part 1
2.RichTextArea Part 2
3.Accessing Web Camera and Microphone
4.Right Click Mouse Events
5.MouseWheel API
6.Using Silverlight Controls As Drop Targets
7.DataGrid Enhancements
8.Printing API Basics
9.Hosting HTML Content
10.Accessing the Global Clipboard Programmatically 
11.Using the ViewBox Control 
12.Asynchronous Data Validation 
13.BiDi and Right-to-Left Support 
14.Notification API
15.Local File Access 
16.RIA Services support in Visual Studio 2010 

블로그 이미지 김영욱 차장 Microsoft Korea  .NET Evangelist
Enterprise UX 를 위한  UI 기술과 SOA, Cloud Computing, NUI등 다양한 분야의 접목과 응용을 통해 최적의 IT 인프라 구축을 위해서 노력하고 있다.
Email: iwinkey@hotmail.com
Blog: http://winkey.tistory.com

 

 
<그림1> Web browser 컨트롤을 사용해서 RSS를 읽어 들인 예

HTML을 Silverlight에서 바로 보여줄 수 있다면…. 할 수 있는 게 엄청 많아 질 것입니다. Silverlight 4 부터는 HTML을 Silverlight에서 바로 보여줄 수 있는 컨트롤이 추가 되어서 Silverlight에서 할 수 있는 게 엄청 많아 졌습니다.

HTML을 불러올 수 있는 방법은 html 파일을 직접 읽어오는 방법 혹은 html 문자열을 이해하는 방법 그리고 타 사이트에 있는 HTML을 직접 읽어오는 방법 등 여러 가지 방법이 있을 수 있는데 HTML 컨트롤의 치명적인 한 가지 제약 사항이 있습니다. 그것은 바로 OOB(Out of browser) 상태에서만 지원되는 점입니다.

 

웹 브라우저 컨트롤을 사용하기 위해서는 다음과 같이 한 줄만 입력하면 됩니다.


 <WebBrowser x:Name="HtmlContent" Height="600" Width="800” />


 하지만 웹 브라우저 컨트롤은 기본적으로 OOB에서만 실행되기 때문에 다음과 같은 코드를 사용해서 OOB 상태에서만 실행되는 것을 확인해야 합니다.


 if (!App.Current.IsRunningOutOfBrowser)
{
    WarningText.Visibility = Visibility.Visible;
}


 두 번째로 현재 실행되고 있는 Silverlight 애플리케이션이 이미 해당 컴퓨터의 로컬에 설치되었는지를 확인하고 설치가 되지 않았으면 설치 버튼을 노출 시켜주기 위해서 다음과 같은 코드가 필요합니다.


 if (App.Current.InstallState == InstallState.Installed)
{
    InstallButton.Visibility = Visibility.Collapsed;
}
else
{
    return;
}


 위의 두 가지 소스에서 보면 알 수 있지만 App 객체는 현재 실행되고 있는 애플리케이션의 정보를 알 수 있게 해준다.
그럼 해당 컴퓨터에서 자기 자신을 설치하기 위한 코드는 어떤 것일까? 놀랍게도 딱 한 줄만 사용하면 됩니다.


 App.Current.Install();


 Web Browser 컨트롤에서 특정한 페이지로 이동하기 위해서는 다음과 같이 Navigate 메소드를 사용하면 됩니다.


 HtmlContent.Navigate(new Uri(“http://winkey.tistory.com”));


 하지만 Silverlight는 좀 더 재미있는 방법도 제공되고 있는데 로컬에 있는 HTML 파일을 읽어드릴 수도 있습니다. 이럴 경우에는 아래와 같은 방법으로 접근 할 수 있습니다.


 HtmlContent.Navigate(new Uri(App.Current.Host.Source, “./test.html”));


재미있는 사실은 Web Browser 컨트롤에서는 그냥 메모리상에서 문자열로 조합되어 있는 html도 역시 출력할 수 있습니다.


HtmlContent.NavigateToString(“<P>Hello World<P>”);


이럴 경우에는 Navigate 메소드가 아니라 NavigateToString을 사용하셔야 합니다.

 
<그림2> NavigateToString을 사용해서 HTML 문자열을 읽어드린 경우.


이미 이 글을 읽으시는 분들의 머리 속에는 이것을 활용할 아이디어가 무궁무진하게 흘러 나오기 시작하는 느낌이 들 것입니다. 첨부된 샘플을 보시면 XML 타입으로 되어 있는 RSS를 파싱하는 방법도 함께 포함되어 있으니 꼭 참조하시기 바랍니다.

2010. 1. 20. 12:00

Silverlight Mobile에 대한 연기가 모락 모락 올라 옵니다. 조만간 뭔가 나오긴 하려나 봅니다.

자세한 내용은 아래의 주소에서 보실 수 있습니다.

 

http://silverlight.net/learn/mobile/

2010. 1. 20. 09:00

1.RichTextArea Part 1
2.RichTextArea Part 2
3.Accessing Web Camera and Microphone
4.Right Click Mouse Events
5.MouseWheel API
6.Using Silverlight Controls As Drop Targets
7.DataGrid Enhancements
8.Printing API Basics
9.Hosting HTML Content
10.Accessing the Global Clipboard Programmatically 
11.Using the ViewBox Control 
12.Asynchronous Data Validation 
13.BiDi and Right-to-Left Support 
14.Notification API
15.Local File Access 
16.RIA Services support in Visual Studio 2010 

블로그 이미지 김영욱 차장 Microsoft Korea  .NET Evangelist
Enterprise UX 를 위한  UI 기술과 SOA, Cloud Computing, NUI등 다양한 분야의 접목과 응용을 통해 최적의 IT 인프라 구축을 위해서 노력하고 있다.
Email: iwinkey@hotmail.com
Blog: http://winkey.tistory.com

 

웹에서 프린트를 마음 것 할 수 있다면 어떨까? 여러 가지로 편리한 점 들이 많이 있을 것이다. 일반적인 웹 페이지의 경우 레이아웃 자체가 가변적이기 때문에 기본적으로 정해져 있는 모양대로 프린트 되지 못합니다. 그래서 미리 보기를 적절히 사용해 가면서 결과물을 미리 확인하지 않았다가는 엄청난 양의 종이를 낭비하게 됩니다.

 

Silverlight 4에서는 드디어 프린트 기능이 지원됩니다. 시스템에 설치되어 있는 프린트의 목록을 가져오고 가져온 목록을 기반으로 해서 프린트를 선택해서 프린트 할 수 있습니다.

 

<그림1> 프린트 기능을 보여주는 샘플 프로그램

 

프린트 기능을 사용하는 방법은 의외로 심플합니다. 프린트를 사용하는 방법은
System.Windows.Printing.PrintDocument 클래스를 사용하면 됩니다.

 

PrintDocument docToPrint = new PrintDocument();
docToPrint.DocumentName = "Entire Screen Sample";

 

docToPrint.PrintPage += (s, args) =>
    {
        args.PageVisual = this.StackOfStuff;
    };

 

docToPrint.Print();

<소스1>프린트 기능의 사용 예

 

ProntDoucment 클래스의 PrintPage에서 PageVisual 속성에 출력하려고 하는 객체를 지정하고 Print( );를 호출하는 것으로 바로 프린트가 이루어 집니다.

 

<그림2>프린터 선택 화면

 

약간의 기교를 부린다면 프린팅을 시작할 때 혹은 프린팅이 종료 되었을 때 무언가 사용자에게 보여주는 방식으로 코딩하고 싶으면 다음과 같이 StartPrint와 EndPrint 두 개를 잘 활용 할 수 있습니다.

 

PrintDocument docToPrint = new PrintDocument();
docToPrint.DocumentName = "Entire Screen Sample";

docToPrint.StartPrint += (s, args) =>
    {
        ActivityDisplay.IsActive = true;
    };

docToPrint.PrintPage += (s, args) =>
    {
        args.PageVisual = this.StackOfStuff;
    };

docToPrint.EndPrint += (s, args) =>
    {
        ActivityDisplay.IsActive = false;
    };

docToPrint.Print();

<소스2> 시작과 종료를 활용하는 예

 

이외에도 동적으로 객체들을 쌓아서 출력하는 방식도 사용할 수 있는데 이는 첨부된 샘플을 잘 살펴보시면 될 것 같습니다.

  • 순대국밥 2010.06.24 15:58

    음. 실버라이트 내의 컨트롤 말고 특정 HTML 또는 웹페이지는 인쇄할 수 없나요?

    • winkey 2010.06.28 09:29 신고

      그냥 웹 페이지의 출력을 실버라이트가 제어할 수는 없습니다.
      또 다른 방법은 Silverlight내에 있는 HTML 컨트롤을 사용하는 방법이 있지만 이 방법은 Out of browser 일때만 사용 가능합니다.

  • 고기먹고파 2011.10.05 16:10

    실버라이트에서 프린트 기능을 사용할 때, Print Dialog Box가 자동으로 나오는데 이것을 안 보이게 할 수는 없는 걸까요?^^

    • winkey 2011.10.06 08:36 신고

      안타깝게도.. 프린트, 클립보드, 파일 시스템 등등은 모두 로컬 시스템 자원이므로 조용히 접근하게 하면 보안 이슈가 커지기 때문에 아직 경고 없이 사용할 수 있는 방법은 따로 제공되지 않습니다.

2010. 1. 18. 09:00

71.RichTextArea Part 1
2.RichTextArea Part 2
3.Accessing Web Camera and Microphone
4.Right Click Mouse Events
5.MouseWheel API
6.Using Silverlight Controls As Drop Targets
7.DataGrid Enhancements
8.Printing API Basics 
9.Hosting HTML Content
10.Accessing the Global Clipboard Programmatically 
11.Using the ViewBox Control 
12.Asynchronous Data Validation 
13.BiDi and Right-to-Left Support 
14.Notification API
15.Local File Access 
16.RIA Services support in Visual Studio 2010  

블로그 이미지 김영욱 차장 Microsoft Korea  .NET Evangelist
Enterprise UX 를 위한  UI 기술과 SOA, Cloud Computing, NUI등 다양한 분야의 접목과 응용을 통해 최적의 IT 인프라 구축을 위해서 노력하고 있다.
Email: iwinkey@hotmail.com
Blog: http://winkey.tistory.com

 

국내에서 뿐만 아니라 전 세계적으로 많은 데이터를 보여주기 위해서 가장 많이 사용되는 방법은 바로 DataGrid 일 것입니다. Silverlight에서는 기본적으로 DataGrid를 제공하고 있으며 또 상용 컴퍼넌트도 종류가 아주 많이 있습니다.

Silverlight 4에서는 기본 DataGrid도 개선 사항이 있다고 합니다.

 

<그림1> Sample Program

 

Silverlight 4에서는 DataGrid가 좀 더 Windows용 응용 프로그램에 가까워 졌습니다. 앞서서 설명했던 마우스 오른쪽 버튼의 사용이나 마우스 휠 버튼의 사용등과 마찬가지로 DataGrid 역시 기존에는 그냥 데이터를 뿌려주는 것에 불과 했던 것에서 Windows 용 응용 프로그램에서 사용했던 경험을 그대로 활용할 수 있는 방향으로 바뀌었습니다.

 

image

<그림2>DataGrid 컬럼의 설정

 

<그림2>에서 보는 바와 같이 컬럼의 폭을 설정 할 수 있는 방법이 많아 졌습니다. 자동으로 설정되는 Auto, 고정된 폭을 가지고 있는 Pixel, 그리고 나머지 공간을 균등하게 가져가는 Star 마지막으로 Cell이나 Header를 기준으로 설정하는 SizeToCells, SizeTOHeader 등이 있습니다.

 

  1. <data:DataGrid AutoGenerateColumns="False">
  2. <data:DataGrid.Columns>
  3. <data:DataGridTextColumn Header="One" Width="Auto" />
  4. <data:DataGridTextColumn Header="Two" Width="*" />
  5. <data:DataGridTextColumn Header="Three" Width="3*" />
  6. </data:DataGrid.Columns>
  7. </data:DataGrid>

<소스1>DataGrid의 활용 예

<소스1>에서 보면 3~5번 줄에서와 같이 세 개의 컬럼이 추가 되어 있는데 Auto, Star, 등을 지정하고 있습니다.

 

image

<그림3>가변 컬럼의 변화

 

<그림3>의 결과를 보면 25%, 75%사이즈를 가지고 있는 것을 볼 수 있습니다. 또 하나 재미있는 점은 클립보드를 사용할 수 있게 된 점이라고 할 수 있습니다. 클립보드를 사용할 수 있게 되어서

image image image

<그림4>클립보드의 활용

 

<그림4>처럼 DataGrid의 내용을 엑셀에 붙여넣는 것과 같은 작업이 가능하게 되었습니다.

마지막으로 FlowDirectionText 속성을 사용해서 글자의 흐름을 제어할 수 있는 이 기능을 통해서 아랍어와 같은 RTL(Right To Left)기반의 언어들을 지원할 수 있습니다.

새로 추가된 DataGrid의 기능을 테스트 해볼 수 있는 Sample을 첨부합니다.


Sample 소스에서 Customer.cs 파일은 데이터를 바인딩 하기 위해서 추가한 Entity Class의 역할을 합니다.  그리고  DataGridLenthUnitType.cs 는 DataGrid의 Length 옵션을 표현한 Class 입니다.