검색결과 리스트
분류 전체보기 에 해당되는 글 656건
- 2008.01.28 정말 대단한 3인의 디자이너의 작품 (2)
- 2008.01.27 WPF로 미디어 플레이어를 만들는 방법.
- 2008.01.26 WPF 의 커스터 마이징
- 2008.01.25 .NET Framework 3.5 Poster 입니다.
- 2008.01.20 WPF best of best 동영상 (1)
- 2008.01.01 ZAM3D가 정식으로 릴리즈 되었습니다. (7)
- 2008.01.01 세상이 만약 100명이 사는 마을이라면 (1)
- 2007.12.25 C#소스의 문서화 (3)
- 2007.12.23 [가이드]System.Transaction의 활용 (1)
- 2007.12.21 DNC Framework 작업 시작했습니다. (2)
3명의 디자이너 + 4일의 시간 + 그리고 자동차와 약간의 장비만으로
노르망디 상륙작전으로 완벽히 재현했습니다.
이런씩으로 노력하면 태극기 휘날리며도 몇명이서 만들 수 있을 것 같다는 느낌입니다.
Bloody Omaha!!
https://www.youtube.com/watch?v=WRS9cpOMYv0
WPF로 미디어관련 플레이어를 만들때 참조할 수 있는 링크 입니다.
상세하게 설명되어 있고 MediaElement를 사용하는 예제가
자세하게 소개 되어 있습니다.
http://technet.microsoft.com/en-us/library/bb546936.aspx
댓글을 달아 주세요
가장 쉬운 방법은 스타일을 재 정의해서 새로운 컨트롤인것 처럼 만드는 것입니다.
MSDN에 좋은 글이 있어서 링크를 남겨 놓습니다.
http://msdn.microsoft.com/msdnmag/issues/07/01/Foundations/default.aspx?loc=ko
또 다른 글은 Eric Malamisura가 쓴 WPF ListView Cutomization이라는 글입니다.
http://www.elucidweb.com/blog/CommentView,guid,9fc45d4d-8104-458a-92fd-42a6a5d3c662.aspx
댓글을 달아 주세요
하지만 왠만한 사이즈로 프린트 해서는 티도 안나는 사이즈 입니다.
최대한 크게 크게 뽑아서 붙이십시요 ^^
http://download.microsoft.com/download/4/a/3/4a3c7c55-84ab-4588-84a4-f96424a7d82d/NET35_Namespaces_Poster_LORES.pdf
댓글을 달아 주세요
한동안 계속 베타로 잘 사용해왔던 ZAM3D가 정식버전으로 출시되었습니다.
ZAM3D는 3D와 관련한 XAML코드를 생성해주는 툴인데 비슷한 시기에 나온 툴들을 모두 누르고
실질적인 최후의 승자가 될 것으로 생각됩니다.
플래쉬에서 3D인것 처럼 보여주는 툴인 Swift 3D라는 툴을 이미 개발했던 업체라서 그런지
안정성과 완성도, 그리고 편의성 모두 합격점을 받을 만한 프로그램입니다.
내일 부터는 또 노트북 하나 메고 프로젝트 하러 갑니다.
하지만 마음은 기대감과 중압감이 상호 교차되는 상태 입니다.
작년 7월 부터 계속 컨설팅과 교육, 그리고 기술지원으로 계속해서 발을 담그고 있었던
WPF 프로젝트여서 그런지 더더욱 잘해야 겠다는 조바심이 납니다. ^^
뭐 잘되겠지요 모든 것은 마음먹기 나름이니까요 ^^
댓글을 달아 주세요
-
-
winkey 2008.01.02 23:52 신고 EDIT/DEL
안녕하세요 엄준일님~ ^^
새해 복 많이 받으시고 올해도 멋진 히어로로
자리매김 하시기를 바라마지 않습니다.
저도 주로 파견업체를 통해서 일을 구하다가
어느 순간 부터는 주로 소개를 통해서 일하게
되었습니다.
이번에 시작하는 프로젝트는 작년부터 쭈욱
공들여 왔던 프로젝트 이기도 하고
또 WPF쪽에는 아직 그 중요도에 비해서는
관심을 갖는 사람들이 적었던 탓에
상대적으로 좋은 기회들이 있는 것 같습니다.
이번 일은 정말 좋은 일이긴 한데 크게
떠들고 다닐 수 없는 정치적인 이유가 있어서..
다음에 기회되면 자세히 알려 드리겠습니다.
좋은 자리가 생기면 또 추천해 드릴 수 있는
기회가 있었으면 좋겠습니다 ^^
-
-
-
세상이 100명이 사는 마을이라면... 이라는 재미있는 숫자 놀음이 주는 의미는
나름 비장하기까지 합니다.
알고보면 우리들의 삶도 상위권에 사는 삶은 아닐까요?
우리가 받는 월급 몇 백만원이 선진국 기준으로 볼때는 살기 힘들지 모르지만
대부분의 인류가 보는 입장에서는 정말 큰 부자가 아닐런지요
헐리우드식 영웅주의에 보면 항상 강조하는게 있습니다
"모든 힘에는 책임이 따른다..."
우리는 영웅들에게만 책임이 따른다고 생각하는것은 아닐런지요?
선진국이 만들어 놓은 온난화의 피해는 빈국의 사람들이 대부분 받게되는 것은
그냥 어쩔 수 없는 일일까요?
많은 것을 생각해 보게 하는 동영상을 함께 보시면서 마냥 들뜨는 것으로
시작하기 쉬운 한해를 차분히 시작해 봅니다.
C# 소스를 문서화 하기 위한 툴은 여러개 있는 것 처럼 보이지만 막상 사용하려고 하면
생각만큼 선택의 여지는 넓지 않습니다.
닷넷채널 프레임웍의 도움말을 만들기 위해서 소스상의 주석을 가지고 문서화를 할 수 있는
방법들을 찾아 보았습니다.
우선 대부분의 문서툴에서는 Visual Studio에서 지원하고 있는 xml 포멧을 사용합니다.
Visual Studio에서는 주석문으로 잘 달아놓은 것들을 XML포멧으로 출력하는 기능을 가지고 있습니다.
<그림1> 솔류션 탐색기에서 속성을 선택
<그림3>출력된 XML파일
<그림1~3>을 참조하면 Visual Studio 에서 주석문을 정리한 XML파일을 얻을 수 있습니다.
이 XML 파일을 가지고 대부분 문서를 생성할 수 있게 지원하는데
이전까지는 대표적으로 많이 사용했던 것이 바로 NDoc 입니다.
하지만 NDoc은 그 뛰어난 기능에 비해서 오픈소스 프로젝트의 한계인 참여율 저조를
극복하지 못하고 개발이 중단되었습니다. 그래서 닷넷프레임웍 2.0을 지원하지 못합니다.
그래서 두번째로 선택할 수 있는 것이 바로 Doxygen이라는 프로그램입니다.
이 프로그램은 사용하기가 생각보다 까다롭고 불편해서 일단은 사용 불가로 생각했습니다.
결국 제가 선택한 툴은 Sandcastle입니다.
강력하면서도 적절한 툴이며 프레임웍도 2.0을 잘 지원하고 있습니다.
Sandcastle는 UI가 없습니다. 그냥 명령어 기반의 프로그램입니다. 때문에 좀더 원활하게
사용하기 위해서는 Sandcastle Help File Builder가 함께 필요합니다.
사용하는 방법은 아주 쉽기 때문에 일단 패스 합니다. ^^
댓글을 달아 주세요
1차 설계때 포함시켰던 Enterprise Library를 배제하기로 결정했습니다.
Enterprise Library는 일단 그 자체만으로도 상당히 버겁고 또 사용하지 않는 다수의 Class도
함께 가지고 가야 한다는 점 그리고 프레임웍 버전업때의 자유도 등을 고려해서
이번 작업에는 적절하지 않다는 판단을 하게 되었습니다.
그리고 기본적으로 System.EnterpriseService를 사용하는 것을 표준으로 채택하려고 했으나
닷넷 프레임웍 2.0에 새로 추가된 System.Transaction을 활용하는 것도 표준으로 함께 권장한다.
System.Transaction을 우선적으로 사용하고 필요한 곳에는 System.EnterpriseService를
함께 사용할 수 있도록 했습니다.
자료들을 찾아보면 대체적으로 System.Transaction이 좀더 가볍고 유연한 방법이라고 되어 있는
것 같습니다. 아무래도 새버전에 맞쳐서 나온것 이라서 그런것인지 모르겠습니다만
아무튼 우리도 System.Transactions을 우선적으로 사용하는 것으로 결정했습니다.
또 System.Transactions의 경우 SQL Server, ADO.NET, MSMQ, MSDTC를 모두 지원하는
유연함과 강력함을 가지고 있습니다.
System.Transactions의 경우 암시적으로 특정범위안의 모든 Database Handling을 하나의
Transaction으로 묶어서 처리할 수 있는데 <리스트1>소스에서 사용법을 볼 수 있습니다.
// This function takes arguments for 2 connection strings and commands to create a transaction // involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the // transaction is rolled back. To test this code, you can connect to two different databases // on the same server by altering the connection string, or to another RDBMS such as Oracle // by altering the code in the connection2 code block. static public int CreateTransactionScope( string connectString1, string connectString2, string commandText1, string commandText2) { // Initialize the return value to zero and create a StringWriter to display results. int returnValue = 0; System.IO.StringWriter writer = new System.IO.StringWriter(); // Create the TransactionScope to execute the commands, guaranteeing // that both commands can commit or roll back as a single unit of work. using (TransactionScope scope = new TransactionScope()) { using (SqlConnection connection1 = new SqlConnection(connectString1)) { try { // Opening the connection automatically enlists it in the // TransactionScope as a lightweight transaction. connection1.Open(); // Create the SqlCommand object and execute the first command. SqlCommand command1 = new SqlCommand(commandText1, connection1); returnValue = command1.ExecuteNonQuery(); writer.WriteLine("Rows to be affected by command1: {0}", returnValue); // If you get here, this means that command1 succeeded. By nesting // the using block for connection2 inside that of connection1, you // conserve server and network resources as connection2 is opened // only when there is a chance that the transaction can commit. using (SqlConnection connection2 = new SqlConnection(connectString2)) try { // The transaction is escalated to a full distributed // transaction when connection2 is opened. connection2.Open(); // Execute the second command in the second database. returnValue = 0; SqlCommand command2 = new SqlCommand(commandText2, connection2); returnValue = command2.ExecuteNonQuery(); writer.WriteLine("Rows to be affected by command2: {0}", returnValue); } catch (Exception ex) { // Display information that command2 failed. writer.WriteLine("returnValue for command2: {0}", returnValue); writer.WriteLine("Exception Message2: {0}", ex.Message); } } catch (Exception ex) { // Display information that command1 failed. writer.WriteLine("returnValue for command1: {0}", returnValue); writer.WriteLine("Exception Message1: {0}", ex.Message); } } // The Complete method commits the transaction. If an exception has been thrown, // Complete is not called and the transaction is rolled back. scope.Complete(); } // The returnValue is greater than 0 if the transaction committed. if (returnValue > 0) { writer.WriteLine("Transaction was committed."); } else { // You could write additional business logic here, for example, you can notify the caller // by throwing a TransactionAbortedException, or logging the failure. writer.WriteLine("Transaction rolled back."); } // Display messages. Console.WriteLine(writer.ToString()); return returnValue; } <리스트1> 트랜젹션 범위를 사용하여 암시적 트랜잭션을 구현하는 예
새로운 TransactionScope 객체를 만들면 Transaction Scope가 시작됩니다. 위에서 볼 수 있는데로
using문장을 이용해서 사용범위를 한정해 주는게 좋습니다.
Transaction을 확정하기 위해서는 TransactionSope객체의 Complete()호출해야 합니다.
Complete()을 호출하지 않으면 Transaction이 완료되지 않고 Rollback되어 버립니다.
using문장을 이용해서 TransactionScope를 설정할 경우에 어떤 예외가 발생하면
TranscationScope의 Dispose()가 호출됩니다. TransactionScope의 경우 Dispose()가 호출되면
Transaction의 끝으로 간주해서 해당 Tracation의 상태에 따라서 확정이나 취소를 선택하게 됩니다.
void RootMethod() { using(TransactionScope scope = new TransactionScope()) { /* Perform transactional work here */ SomeMethod(); scope.Complete(); } } void SomeMethod() { using(TransactionScope scope = new TransactionScope()) { /* Perform transactional work here */ scope.Complete(); } }<리스트2> 트랜젝션이 중첩
<리스트2>에서 처럼 Transcation을 중첩할 수도 있습니다.
이렇게 중첩했을 경우에는 모든 Transcation이 확정되지 않으면 일괄 취소됩니다.
TrancationOption을 사용했을 경우에는 옵션에 따라서 세가지로 동작이 달라집니다.
Required를 사용하여 범위를 인스턴스화하고 앰비언트 트랜잭션이 있으면 범위는 이 트랜잭션에 참여합니다.
그러나 앰비언트 트랜잭션이 없으면 범위는 새 트랜잭션을 만들고 루트 범위가 됩니다.
이 값은 기본값입니다. Required를 사용하면 범위 내부의 코드는 루트 범위이거나 아니면 단순히 앰비언트 트랜잭션에 참여하는지에 따라 다르게 동작할 필요가 없습니다. 이 코드는
두 경우에 모두 동일하게 작동해야 합니다.RequiresNew를 사용하여 범위를 인스턴스화하면 이 범위는 항상 루트 범위가 됩니다. 이 범위가 새 트랜잭션을
시작하면 해당 트랜잭션은 범위 내부의 새 앰비언트 트랜잭션이 됩니다.Suppress를 사용하여 범위를 인스턴스화하면 앰비언트 트랜잭션이 있는지 여부에 관계없이 이 범위는
트랜잭션에 참여하지 않습니다. 이 값을 사용하여 인스턴스화된 범위에서는 항상 앰비언트
트랜잭션이 null입니다.
이 외에도 시간 제한이나 격리수준을 설정하는 방법으로 세세한 설정이 가능합니다.
자세한 내용은 http://msdn2.microsoft.com/ko-kr/library/ms172152(VS.80).aspx 을
참조하기 바랍니다.
한가지 TransactionScope의 결정적 시간 제한 옵션은 따로 있습니다.
machine.config에서 MachineSettingsSection에서 전체적인 설정이 이미 설정되어 있습니다.
따라서 여러분이 하는 설정도 machine.config의 제한 시간을 넘어가지 못합니다.
http://msdn2.microsoft.com/ko-kr/library/ms172152(VS.80).aspx
기본 타임아웃이 10분으로 잡혀 있다고 합니다. 따라서 여러분들이 시간을 아무리 늘려도
10분 이상을 설정할 수 없습니다. 만약 더 큰 시간이 필요하다면 machine.config의 내용을
수정해야 합니다
<system.transactions>
<defaultSettings distributedTransactionManagerName="NERPSVR" timeout="00:00:00" />
<machineSettings maxTimeout="00:00:00" />
</system.transactions>
<리스트3>Machine.config의 Transaction Timeout 설정
이 내용은 정성태님의 블로그에서 내용을 참조할 수 있습니다.
http://www.sysnet.pe.kr/Default.aspx?mode=3&sub=0&pageno=0&detail=1&wid=716
일단은 그렇게 큰 작업과 복잡한 프레임웍을 제작할 것은 아니기 때문에
우선적으로 Web과 Windows를 동시에 지원하는 것으로 가닥을 잡고 준비하고 있습니다.
우선 간단히 네임스페이만 정리해 보았습니다.
마음으로는 .NET Framework 3.0 이상을 사용하고 싶지만 호스팅 업체 사정상
어쩔 수 없이 프레임웍의 버전은 2.0으로 제한했습니다.
기반 서비스는 Microsoft의 Patterns & practices에서 제공하는 Enterprise Library를
사용하는 것으로 가닦을 잡았습니다.
아참에 Enterprise Library를 공부해 보겠다는 욕심도 함꼐 들었습니다.
아무튼 Enterprise Library는 2006 January Enterprise Libarary for .NET Framework 2.0
버전을 사용하기로 결정했습니다.
http://www.microsoft.com/downloads/details.aspx?familyid=5A14E870-406B-4F2A-B723-97BA84AE80B5&displaylang=en&hash=3U2vJPRkpncc5%2bVHbiTc6Nz9M0nkjlDz73r9Bau1mGj%2bQRcTvra0rLldpzp9TUvW0YgteS5RCuEAUdzILjwrHw%3d%3d
Enterprise Library가 버전이 올라가더니 설치화면도 훨씬 미려하게 잘 수정된것 같다.
<그림3> Enterprise Libarary설치
<그림4> 설치 옵션
지금은 네임스페이스마다 필요한 클래스를 도출하고 있는 중.. ^^
댓글을 달아 주세요
충격적인 영상이네요. ^^;; 갑자기 삼국지를 영화로 만들고 싶다는 생각이 들었습니다. ^^ 한 10명 이면 될라나.. ^^;;
좋은 포스팅 잘 보고 갑니다.
에이~ 주요 인물들의 얼굴은 나와야 하니 한 15명 쯤은 있어야지 않을까요? 쿨럭!!!