Namespace와 LINQ to XML

Posted 2008/07/24 22:13 by 길버트
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="ButtonStyleSample.App"
             xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
             >
    <vsm:Application.Resources>
         <Style x:Key="myButtonStyle" TargetType="Button">
             ...생략
         </Style>
         <Style x:Key="yourButtonStyle" TargetType="Button">
             ...생략
         </Style>
         <Style x:Key="herButtonStyle" TargetType="Button">
             ...생략
         </Style>
         <Style x:Key="hisButtonStyle" TargetType="Button">
             ...생략
         </Style>
    </vsm:Application.Resources>
</Application>

string xml에 위의 내용이 들어있다고 가정하고,

XDocument xDoc = XDocument.Parse(xml);

위와 같이 xDoc을 준비해 놓고,

XML데이터에서 Style을 돌면서 x:Key의 Value값만 쏙쏙 뽑아내는 LINQ구문을 작성한다면
어떻게 하시겠습니까?


오답

첨엔 막연히 이렇게 해봤습니다.

var result = from c in xDoc.Descendants("Style")
                select (string)c.Attribute("x:Key").Value;

네, 에러가 납니다.
Attribute의 이름에는 콜론(:)을 추가할 수 없습니다.

Attribute메서드의 파라미터는 XName이구요.
XName을 생성할 때 콜론(:)이 들어간 문자열을 허용하지 않기 때문입니다.

정답

XNamespace x = "http://schemas.microsoft.com/winfx/2006/xaml";
var result = from c in xDoc.Descendants("Style")
                select (string)c.Attribute(x + "Key").Value;

XNamespace + string이 XName이 되도록 연산기호 +에 대해
오퍼레이트 오버라이딩이 잘 되어있더라구요.

x + "Key" 이런 식으로 사용하는 것은 썩 직관적이지 않아서 맘에 안드는데,
알고 나니까 잘 쓸 수는 있겠더라구요. ^^

하지만 역시 LINQ는 쓰면 쓸수록 편한 것 같습니다.

Enjoy your LINQ!



Tag : LINQ, namespace, Silverlight, xml, 실버라이트

코멘트를 남겨 주세요. (Write your message and submit)

[SL2 B2] Socket 사용을 위한 Policy Server 만들기

Posted 2008/07/03 17:10 by 길버트

개요

Silverlight 2 Beta 2에서 Socket을 사용할 때 Cross-Domain에 있는 소켓 서버에
접속을 하려면 서버 측의 정책을 확인하는 과정이 필요하게 된 것 아시죠?

다시말해, 실버라이트 런타임이 943번 포트를 통해 실버라이트 정책 파일을 요청하면,
서버 쪽에서는 정책파일을 보내줘야 하는데요.

며칠 전 공도씨[MSDN] 네트워크 보안 접근 제약란 제목의 장문의 번역글을 포스팅했습니다.

그 내용의 하단에 보시면 그런 역할을 하는 서버를 만드는 방법이 소개되어 있습니다.
[소켓을 위한 정책 파일 예제][소켓을 위한 정책 서버의 샘플 코드] 내용이 있구요.
Mike SnowsTip of the Day #12 - Full Implementation of a Silverlight Policy Server.
참고하면 정책 파일 서버를 만들 수 있다고 설명해 놓았습니다.


다운로드

아래는 그것을 그대로 따라서 만들어 놓은 프로젝트구요.

제가 조금 코드를 바꿔서 정책 파일 요청시 Socket Client의 IP를 화면에서 알 수 있도록
하였습니다.

PolicyConnection.cs

public PolicyConnection(Socket client, byte[] policy)
{
    _connection = client;
    _policy = policy;

    _buffer = new byte[_policyRequestString.Length];
    _received = 0;

    try
    {
 // receive the request from the client
 //_connection.BeginReceive(_buffer, 0, _policyRequestString.Length, SocketFlags.None,
 //    new AsyncCallback(OnReceive), null);

 _connection.BeginReceive(_buffer, 0, _policyRequestString.Length, SocketFlags.None,
       new AsyncCallback(OnReceive), client.RemoteEndPoint.ToString());
    }
    catch (SocketException)
    {
 _connection.Close();
    }
}

...

private void OnReceive(IAsyncResult res)
{
    try
    {
 _received += _connection.EndReceive(res);

 // if we haven't gotten enough for a full request yet, receive again
 if (_received < _policyRequestString.Length)
 {
     _connection.BeginReceive(_buffer, _received, _policyRequestString.Length - _received,
  SocketFlags.None, new AsyncCallback(OnReceive), null);
     return;
 }

 // make sure the request is valid
 string request = System.Text.Encoding.UTF8.GetString(_buffer, 0, _received);
 if (StringComparer.InvariantCultureIgnoreCase.Compare(request, _policyRequestString) != 0)
 {
     _connection.Close();
     return;
 }

 // send the policy
 Console.Write(string.Format("Sending policy to {0}\n", res.AsyncState));
 _connection.BeginSend(_policy, 0, _policy.Length, SocketFlags.None,
     new AsyncCallback(OnSend), null);
    }
    catch (SocketException)
    {
 _connection.Close();
    }
}


미리보기


사용자 삽입 이미지


주의사항

컴파일 전에 Program.cs의 한부분을 수정하셔야 합니다.
색깔 있는 부분을 실제 clientaccesspolicy.xml 파일이 위치한 곳의 경로로 변경하셔야 합니다.

Program.cs

static void Main(string[] args)
{
    Console.Write("Starting...\n");
    PolicyServer ps =
 new PolicyServer(@"D:\clientaccesspolicy.xml");
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);

}

감사합니다.


보너스

Beta1 시절 포스팅 되었던 스캇구 형님의 소켓 예제를 오늘 다시 한 번 찾아보니!
Beta2 버전으로 포팅이 되었습니다. 여기에도 Policy Server를 포함하고 있습니다.
한 번 훑어 보시면 도움이 되실 거라고 생각합니다.

Pushing Data to a Silverlight Client with Sockets: Part I
Pushing Data to a Silverlight Client with Sockets: Part II

Part I에서는 Socket Server를 Part II에서는 Socket Client를 설명하고 있습니다.

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : 943포트, clientaccesspolicy.xml, Silverlight, socket, 소켓, 실버라이트, 정책파일

코멘트를 남겨 주세요. (Write your message and submit)

Silverlight WebService Team 블로그에 제가 관심있어 하는 부분에 대한 포스트가 올라와서 번역을 해보았습니다.

원문 : http://blogs.msdn.com/silverlightws/

Duplex Communication (Server Push)
LINQ over JSON (번역 전)
Configuration Support (번역 전)
Tooling Improvements (번역 전)
SOAP Improvements (번역 전)

Scott이나 Tim의 포스트에서 아마도 읽은 바와 같이, 실버라이트 2 Beta 2는 새롭고 향상된 Web Service 기능들을 제공한다. 이 포스트는 우리 Beta 2 시나리오들을 좀더 상세하고 다룰 것이며, 두 주 가량 이어서 진행하면서, 특정한 기능들을 파 보도록 하겠다.

Duplex Communication (Server Push)

이것은 Beta 1 릴리즈 이후, 고객들이 최고로 많이 요청한 기능으로 채팅과 모니터링 프로그램 같은 몇몇 유용한 시나리오를 가능하게 만든다. Duplex는 클라이언트로 하여금 서버가 클라이언트에게 정보를 보내기(push) 위해서 호출할 수 있는 오퍼레이션들의 세트를 노출할 수 있게 합니다. Web Service 스택을 이용하여 브라우저 기반(Browser-based)의 클라이언트에 말을 거는 것은 이전에는 불가능 했기 때문에 우리는 이 기능을 Beta 2에 탑재하는 것에 매우 흥분했다.

Duplex 지원은 두 어셈블리에 있다 :하나는 WCF 서비스에, 다른하나는 Silverlight 클라이언트에 들어있다. 일단 Beta 2 SDK를 깔면, 다음 어셈블리를 얻을 수 있다.

  • C:\Program Files\Microsoft SDKs\Silverlight\v2.0\Libraries\Server\Evaluation\System.ServiceModel.PollingDuplex.dll

    이것은 서버측 어셈블리다. 사용법과 Duplex WCF 서비스를 어떻게 만드느냐 하는 것은 여기를 보면 자세히 알 수 있다. 이 어셈블리는 서버측 PollingDuplexBindingElement를 제공하며, 그것은 custom binding을 만들 수 있게 해주어, service contract를 호스트 하기 위해 custom binding을 사용하는 custom ServiceHost를 만들 수 있게 해 준다.
    이런 식으로 호스트된 service contract는 ServiceContractAttribute.CallbackContract를 제공할 것이고, 이것은 service가 호출할 수 있는 클라이언트 오퍼레이션들을 어떻게 규정할 것인가 하는 것이다. 이 주제는 이 모든 것을 참조하면서 완성된 duplex WCF Service를 보여준다.

    당신은 어쩌면 경로 안에 Evaluation 폴더 이름을 알아챘을 것이다. 이 어셈블리는 Beta 2의 나머지와는 다른 라이센스를 제공한다. 이것은 어플리케이션을 만들기 위한 용도가 아니다. 우리는 개발 환경을 위해 준비가 되기 전에 그 API에 좀 더 작업을 하고, 성능을 튜닝하려고 한다.
  • C:\Program Files\Microsoft SDKs\Silverlight\v2.0\Libraries\Client\System.ServiceModel.PollingDuplex.dll

    이것은 클라이언트측 duplex 어셈블리다. 사용법과 WCF duplex service를 위한 Silverlight 클라이언트 만드는 방법은 여기를 참조하면 된다. 이 어셈블리는 클라이언트측 PollingDuplexHttpBinding을 제공하며, 이것은 WCF dulplex service와 대화하기 위한 채널을 생성하려고 사용한다. 이것은 이미 위에서 다루었다.

여러분은 아마 typed "receiver" 경험과 deserialization에 대해 말한 Eugene의 포스트를 기억할 것이다. 우리는 이것을 가지고 일하고 있고, 몇 주 내에 silverlight.net에 샘플코드를 공개할 수 있을 것 같다.

Tag : Duplex, PollingDuplexBindingElement, PollingDuplexHttpBinding, Push, Silverlight, WebServiceTeam, 실버라이트, 웹서비스팀

코멘트를 남겨 주세요. (Write your message and submit)
실버라이트 어플리케이션을 <object>단위로 자기 블로그 등으로(External로) 퍼가기 했을 경우,
원 서비스에서는 잘 되던 기능들이 잘 작동 안하는 경우가 있습니다.

애용하는 MouseWheelHelper의 휠 이벤트가 발생 안하고,
WebClient 사용시 메서드 수행후 비동기 콜백이 발생하지 않는 문제
가 있었습니다.

박스마일이 해결책을 찾아보려 백방으로 뛰어 보았지만, 쉽게해결이 되지 않아,
실버라이트 포럼에 질문을 올렸고, Sergey Volk MSFT가 답변을 올려줬네요.

그 해결책에 대한 내용을 이과장님이 네이버 실버라이트 카페에 정리를 해주셨는데요.
http://cafe.naver.com/ArticleRead.nhn?clubid=13624133&articleid=2537

약간 내용을 달리하여 정리해 보았습니다.

해결책

AppManifest.xml 파일의 Deployment 엔티티의
ExternalCallersFromCrossDomain 속성값을 FullAccess로 설정합니다.


행동

솔루션 탐색기(Solution Explorer)에서 해당 실버라이트 프로젝트의 Properties 노드 아래의
AppManifest.xml (Manifest File Template)을 엽니다.

사용자 삽입 이미지

그리고  ExternalCallersFromCrossDomain 속성 (붉은 글자 부분)을 추가합니다.

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        ExternalCallersFromCrossDomain="FullAccess"
>
    <Deployment.Parts>
    </Deployment.Parts>
</Deployment>

이렇게 하고 나면 빌드 할 때마다 생성되는 xap 패키지 안에 내용물로,
ExternalCallersFromCrossDomain 속성을 가진 AppManifest.xml 파일이 생성됩니다.
다음과 같이!

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ExternalCallersFromCrossDomain="FullAccess" EntryPointAssembly="DeepView" EntryPointType="DeepView.App" RuntimeVersion="2.0.30523.6">
  <Deployment.Parts>
    <AssemblyPart x:Name="DeepView" Source="DeepView.dll" />
    <AssemblyPart x:Name="UXLib" Source="UXLib.dll" />
    <AssemblyPart x:Name="HFLib" Source="HFLib.dll" />
    <AssemblyPart x:Name="System.Xml.Linq" Source="System.Xml.Linq.dll" />
  </Deployment.Parts>
</Deployment>

이 문제는 한동안 실버라이트 개발자를 귀찮게 하겠지만,
결국 시간이 깔끔하게 해결해 주리라 믿습니다. (차기 버전에서...)
이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : AppManifest.xml, Beta2, ExternalCallersFromCrossDomain, MouseWheelHelper오동작, Silverlight, WebClient먹통, 실버라이트, 퍼가기

코멘트를 남겨 주세요. (Write your message and submit)

CPR for DeepZoom Data of Silverlight 2 Beta1 era.


서론

Beta2가 릴리즈 되고나니 보이시던 DeepZoom Data가 보이시지 않으십니까?
새 DeepZoom Composer로 다시 Export를 하려고 했는데 원본이미지가 없으십니까?
걱정하지 마십시오! 다음과 같은 방법으로 예전 딥줌이미지를 재활용 하실 수 있습니다. :)

이 포스트는 원본이 없어져서 새로운 DeepZoom Composer로 다시 Export 하실 수 없는 분이나,
이미 대량의 이미지를 생성해 놓은 상태여서 재활용하고 싶으신 분에게 유익합니다.

주의. Composition 방식으로 Export된 데이터에 대한 변환 팁입니다.
(Collection에 대한 변환 팁이 아닙니다.)


데이터 변환

사용자 삽입 이미지

Step1. 새폴더나 원래 폴더에 dzc_output_files 폴더를 생성합니다.
Step2. 각 레벨의 이미지가 저장되어 있는 레벨 폴더들(그림의 예를 들어 0~12)을 dzc_output_files 폴더로 복사합니다.
Step3. info.xml의 데이터를 dzc_output.xml로 변환합니다.

Step3는 변환이라기 보다 dzc_output.xml 파일 내용이 초간단 하므로,
다음의 기본형에 붉은색 글자 부분을 info.xml 파일의 내용을 참고하여 수정해서 쓰는 것을
권해드립니다.
Overlap 같은 경우는 값을 정하기가 상당히 애매합니다.

<?xml version="1.0" encoding="UTF-8"?>
<Image TileSize="513" Overlap="2" Format="jpg" xmlns="http://schemas.microsoft.com/deepzoom/2008">
<Size Width="2496" Height="1664"/>
<DisplayRects>
<DisplayRect MinLevel="0" MaxLevel="12">
<Rect X="0" Y="0" Width="2496" Height="1664"/>
</DisplayRect>
</DisplayRects>
</Image>

dzc_output.xml 파일

변환해야하는 데이터가 많을 때는 이 과정을 자동화하시면 되겠죠?
어떤 영웅이 나와서 Converter를 곧 제공하지 않을까 생각합니다.


코드 수정

마지막으로, 만약 MultiScaleImage의 Source를 XAML이 아닌,
비하인드 코드에서 동적으로 할당해 주고 계시다면... (현실적으로 그렇게 많이 하고 계시죠)

Breaking Change에 언급된 다음과 같은 코드 수정이 필요합니다.

Beta 1

[C#]

msi.Source = new System.Uri("images/info.bin");

 

Beta 2

[C#]

msi.Source
= new
DeepZoomImageTileSource(new System.Uri("images/dzc_output.xml"));

(단, 여기서 msi는 MultiScaleImage의 인스턴스입니다.)


xml 파일과 폴더명에 대해서

공도씨가 궁금해 하셔서 확인해 본 결과
위에서 언급한 dzc_output.xml과 dzc_output_files란 이름은 얼마든지 다른 이름을 사용할
수 있습니다.

즉 xml 파일의 이름을 hugeflow.xml이라고 하면,
MultiscaleImage는 자동으로 hugeflow_files란 폴더에서 이미지를 찾습니다.


자, 이것으로 끝.


이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : beta1, Beta2, DeepZoom, Silverlight, 데이터재활용, 실버라이트

코멘트를 남겨 주세요. (Write your message and submit)
Regular Expression 써서 다음과 같이 하면 됩니다.

public static string StripTags(string html)
{
    return Regex.Replace(html, @"<(.|\n)*?>", string.Empty);
}

다음의 네임스페이스가 필요합니다.

using System.Text.RegularExpressions;

참고 : http://www.vandamme.com/blog.aspx?id=512&blogid=194

Tag : HTML태그제거, in C#, StripTags

코멘트를 남겨 주세요. (Write your message and submit)

Unix Timestamp와 .NET DateTime 간의 상호변환

Posted 2008/05/09 14:13 by 길버트

Unix Timestamp를 .NET DateTime으로 변환할 때

static DateTime ConvertFromUnixTimestamp(int timestamp)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return origin.AddSeconds((double)timestamp);
}

.NET DateTime을 Unix Timestamp로 변환할 때

static int ConvertToUnixTimestamp(DateTime date)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    TimeSpan diff = date - origin;
    return (int)Math.Floor(diff.TotalSeconds);
}

참고 : http://codeclimber.net.nz/archive/2007/07/10/Convert-a-Unix-timestamp-to-a-.NET-DateTime.aspx

Tag : .net, C#, datetime, unix timestamp

코멘트를 남겨 주세요. (Write your message and submit)

실버라이트에서도 WebClient 이용해서 쉽게 OpenAPI의 XML 데이터 따위를 읽어올 수 있습니다. (실버라이트에서는 비동기만 지원)

그런데 가끔 UTF-8 등으로 인코딩된 XML 파일을 읽을 때 Result의 Unicode 문자들이 깨져 있는 것을 경험하실 겁니다.

이때의 해결방법은 간단합니다.
WebClient에는 Encoding이란 프로퍼티가 있기 때문입니다.

WebClient wc = new WebClient() { Encoding = Encoding.UTF8 };

또는 클래식한 표현으로는 아래와 같이...

WebClient wc = new WebClient();
wc.Encoding = Encoding.UTF8;

해주시면 준비완료!

Tag : encoding, Silverlight, UTF-8, WebClient, 글자깨짐, 실버라이트

코멘트를 남겨 주세요. (Write your message and submit)
On term of use

실버라이트, WPF, 플래시 등에서 버추얼 어스 플랫폼을 이용할 때,
개발자는 각 맵 이미지 타일의 URL을 사용하여 이미지를 직접적으로 호출합니다.

LOGI-CRAFTS도 이미지 직접 호출을 하고 있었습니다.
이때, 사용규약(Term of use)에 문제가 없으려면 어떤 조치를 취해줘야 한다고 합니다.

Chris Pendleton의 블로그에 Tracking Virtual Earth Tile Usage란 포스트를 참고하였습니다.
(Boxmile에게서 전달받았습니다. ^^)

바람직한 맵타일 이미지 URL

사용하는 이미지 타일 주소에 token 이란 파라미터가 추가되어야 하며,

http://h0.ortho.tiles.virtualearth.net/tiles/h023131022213211200.jpeg?g=131&token=1234567

token_id가 같이 입력되어야 합니다.


Token ID 발급받기

token_id는 Virtual Earth Platform Developer Account에서 발급 받을 수 있습니다.

Tag : LOGICRAFTS, Silverlight, token_id, 버추얼어스, 실버라이트

코멘트를 남겨 주세요. (Write your message and submit)

주기 함수(Periodic Function) 엔진(?)

Posted 2008/04/28 15:07 by 길버트



주말에 심심해서 한번 만들어 보았습니다.

more..


Tag : Silverlight, 실버라이트, 주기함수

코멘트를 남겨 주세요. (Write your message and submit)

실버라이트 Custom Splash Screen 예제

Posted 2008/04/25 21:27 by 길버트
우리 회사 디자이너 피터씨와 splash screen을 한번 만들어 보았습니다.
splash screen은 재멀(.xaml)파일의 비하인드 코드로 자바스크립트(.js)를 사용해야 해서,
흡사 Silverlight 1.0 시절로 돌아간 듯한 착각에 빠졌습니다.
자바스크립트 쪽에 모르는 부분은 공도씨가 알려줬습니다.


 
학습 자료

공부는 네이버 실버라이트 카페 이과장님이 번역해 놓은 자료를 이용하시면 됩니다.

소스


소스를 다운 받아 여시면 HugeflowSplashScreenSource 프로젝트가 있는데,
그 하위에 Garbage 디렉토리에 5MB 정도의 파일 아무거나 추가하시고, 속성에서
Build ActionContent로 설정하십시오.

컴파일을 하신 다음. Web 프로젝트의 ClientBin 아래에 만들어진 .xap 파일을
ClientBin의 상위 트리로 꺼내어 놓습니다. (종전의 것이 있다면 지워야 할 겁니다.)

왜 이런 행위를 하는지는 티스토리 블로그에 파일 첨부가 10MB이하라서 그런 것도 있지만,
이과장님 번역자료를 한번 훑어보시면 아시게 됩니다.

Tag : intro, Silverlight, splash screen, 실버라이트, 인트로

코멘트를 남겨 주세요. (Write your message and submit)

Deep Zoom의 Thumbnail에 대해서

Posted 2008/04/22 09:56 by 길버트

Deep Zoom 이미지를 위한 Thumbnail은 따로 만들 필요가 없는 것 같아요.
Deep Zoom Composer가 만들어준 파일 중에 이미 쓸 만한 것들이 많이 있으니까요!

알고 계신바와 같이 Deep Zoom Composer는 원본 이미지를 단계적으로 축소해가면서,
단위 이미지들로 쪼개어 위와 같은 구조로 만들어 줍니다.

0~8까지의 이미지 폴더 안에는 쪼개지지 않은 축소 이미지(0_0.jpg)들이 있습니다.

이중 폴더 8 안의 이미지가 쪼개지지 않은 축소 이미지 중 최대 크기 입니다.
그리고 파일 경로는 다음과 같습니다.

{info.bin이 위치한 경로}/8/0_0.jpg

(사실 폴더 9 안의 이미지도 1개로 존재할 때가 있기는 하지만,
이미지에 따라서는 아래 이미지와 같이 쪼개져서 존재하는 경우가 있어
Thumbnail로 활용하기에 안전하지 않습니다.)

 

폴더0~8 안의 이미지들을 살펴 보면 대략 아래와 같습니다.

폴더 이미지 사이즈
0 1x1
1 2x2
2 4x3
3 7x5
4 14x9
5 27x18
6 54x36
7 108x72
8 216x144

각각의 폴더 안에 보시는 바와 같이 축소 이미지들이 존재를 하며,
그림 마다 정확한 사이즈가 보장되지는 않는 이유로,
크리티컬한 사이즈가 요구되는 경우를 제외하고는 유용하게 사용할 수 있습니다.

특히 실버라이트는 이미지 Resize 능력이 Browser에 의한 Resize보다 좋은 편이라
문제없이 사용할 수 있다고 생각합니다.

Deep Zoom Viewer Lite 1.3에서는 미니맵(Minimap)을 구현하기 위해 폴더 8의 이미지를
적극 활용하고 있으며, 앞으로 XML로 이미지 리스트를 Import할 수 있도록 지원할 예정인데,
이 때에도 적극 활용할 계획입니다.


이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : Deep Zoom Composer, DeepZoom, Silverlight, 딥줌, 실버라이트, 썸네일

코멘트를 남겨 주세요. (Write your message and submit)