KnockOut MVC framework


참조 URL
  1. http://knockoutmvc.com/
  2. https://github.com/AndreyAkinshin/knockout-mvc



 ASP.NET MVC에서 Knockoutjs를 사용하는 프로젝트에서 UI 컨트롤들을 쉽게 KnockOut와 바인딩이 되도록 Generated 된 코드를 만들어 주는 라이브러리다. 서버의 Model을 기반으로 브라우저에서 사용하는 ViewModel과 View Data를 자동으로 만들어 주고 있다. 사용방법은 아래 코드와 같이 사용하면 된다.



 아래 코드는 KnockOutMVC 프레임웍에서 샘플 코드인 HelloWorld이다.


[코드] Model




[코드] Razor




[코드] Controller




[코드] HTML (autogenerated)


 이와 같은 HTML의 Knockoutjs에서 사용하는 View데이터와 ViewModel을 서버에서 자도으로 만들어서 내보내 준다. 이제 웬만한 기능을 모델 설계 만으로 브라우저까지 일관되게 내려 받을 수 있게 되었다. ViewModel을 연결 시켜주는 노가다성 작업을 상당부분 줄여 줘 야근모드가 없어 지지 않을까 생각해 본다. 



 위와 같은 코드의 예제 말고도 다른 예제들이 있다. 관심이 있다면 직접 확인해 보도록 하자.







Newtonsoft.Json lowercase keys


참조 URL
  1. http://stackoverflow.com/questions/6288660/net-ensuring-json-keys-are-lowercase
  2. http://nyqui.st/json-net-newtonsoft-json-lowercase-keys
  3. notation (헝가리언, 카멜, 파스칼 표기법)

 


JSON 타입으로 통신을 하면 Key와 Value로 변환을 해야 한다. 그렇지만 Newton에서는 기본적으로 클래스와 같은 형식으로 대소문자로 Key값을 변환하여 준다. C#에서 객체를 만들때 사용하는 네이밍 규칙과 JSON ( or Javascript) 에서 사용하는 네이밍 규칙이 서로 달라 혼선이 빚어 질 수 있다. 그래서 JSON타입으로 변환 할 때 소문자로 변환 할 수 있는 방안을 적용하면 일괄적으로 적용이 될 것이다. 적용 방법은 아래와 같다.



C# 네이밍 규칙


 C#에서는 파스칼식과 카멜식을 적절히 사용할 것을 권장하고 있다. 특별한 명명 규칙이 없다면 암묵적으로 프로퍼티는 파스칼식으로, 내부 필드 변수는 카멜식으로 명명한다.


- 파스칼 식 : PropertyName

- 카멜 식 : propertyName 


JSON or Javascript 네이밍 규칙


 Javascript는 기본적으로 카멜식으로 명명하여 사용하고 있다. 





[코드2] LowercaseContractResolver 클래스 코드


[코드3] 소문자로 변환



 위 방법은 '코드1', '코드2' 방법은 세팅 값을 바꿔서 치환하는 방법이고 이와는 다른 방향으로 치환해서 사용하는 방법도 있다. 



[코드3]  Static 클래스로 만듬



[코드4] 선언된 Static 클래스를 사용



 이런 방법으로 자바스크립트와 호환성을 같도록 하면서 일관적으로 사용할 수 있다.




[그림1] Newton JSON.NET의 성능 비교표



codepen.io



웹 상에서 실시간으로 개발해 배포할 수 있는 사이트다


JSFiddler와 JSBin과 같은 역할을 하는 사이트라고 보면된다.


Check out this Pen!





Check out this Pen!

Processingjs

Windows 8, Windows Phone multi-touch interactions


참조 URL
  1. http://processing.org/
  2. http://processingjs.org/
  3. https://processingjs.codeplex.com/
  4. http://processingjs.org/download/
  5. https://github.com/processing-js
  6. https://github.com/processing-js/processing-js
  7. http://channel9.msdn.com/Series/SketchbookTutorial
  8. http://apps.microsoft.com/windows/ko-KR/app/processing-for-windows/27e8a073-f881-45fc-b887-ef739ed7095a
  9. http://www.windowsphone.com/ko-kr/store/app/processingjs-reader/734ea3b3-d4db-46c3-b46c-45131fb748af?appid=734ea3b3-d4db-46c3-b46c-45131fb748af


 Windows 8, Windows Phone에서 멀티 터치 interaction 관련 개발 라이브러리다.


Coding4Fun


참조 URL
  1. Coding4Fun


 Channel9에서 흥미로운 소재로 개발된 동영상을 소개하고 있다. 개발하면서 쉬는 시간을 달래기 위해 찾아가 보는것도 좋을 것이다.





SignalR Cross browser Compatibility over WebSocket


목차
  1. http://www.asp.net/signalr/overview/introduction/supported-platforms
  2. SignalR example ( WPF, Silverlight, ...)


 SignalR은 Microsoft에서 WebSocket을 지원할 수 있도록 해주는 프레임 웍이다. SignalR은 WebSocket 프로토콜 위에서 돌아 가는 방식이며 WebSocket을 지원하지 않는 브라우저에서도 호환될 수 있도록 지원하고 있다. 그냥 단순히 WebSocket을 사용하는 웹 페이지를 만든다면 HTML5를 지원하는 브라우저 여부를 판단하여 그렇지 않은 브라우저는 다른 방식으로 구현을 해야 할 것이다. 그렇지만 SignalR을 사용하여 편리하고 일관되게 하위 호환성을 확보 할 수 있을 것이다.



 SignalR을 지원하는 브라우저에 대해서 알아 보자


 jQuery는 1.6.4 이상 지원

  • Microsoft Internet Explorer versions 8, 9 and 10. Desktop, and Mobile 지원.
  • Mozilla Firefox: current version - 1, both Windows and Mac versions.
  • Google Chrome: current version - 1, both Windows and Mac versions.
  • Safari: current version - 1, both Mac and iOS versions.
  • Opera: current version - 1, Windows only.
  • Android browser

  jQuery 1.6.4이상의 버전과 브라우저만 있으면 SignalR이 제공해주는 일관된 방법으로 개발 할 수 있을 것이다.




WebSocket - FlashSocket


참조 URL
  1. WebSocket과 Socket
  2. Socket.io 소개
  3. Socket.io - Cross browser WebSocket for realtime apps on node.js



 WebSocket는 HTML5을 지원하는 브라우저에서만 사용할 수 있는 통신 방식이고, FlashSocket은 Flash가 설치된 브라우저에서 사용할 수 있는 통신 방식이다. WebSocket를 지원하지 않는 브라우저에서 WebSocket과 같은 방식으로 통신을 할 수 있게 지원할 수 있는 방안을 모색하던중 FlashSocket에 대해서 알게되었다. FlashSocket를 이용하여 실시간 반응 웹을 일관성 있게 개발 할 수 있을 것이다.


 WebSocket -> FlashSocket -> LongPolling -> Polling과 같은 방식으로 점점 하위 개발 방법으로 지원하여 웹 서버간의 데이터 통신을 지원하는 애플리케이션 프레임웍 개발을 진행하면 될것이다.


 WebSocket 지원 브라우저를 한번 알아 보자


[그림1] WebSocket Compatibility table 
http://caniuse.com/#feat=websockets )


 위와 같이 특정 하위 브라우저에서는 WebSocket를 사용할 수 없게 된다. 그렇다면 차선책으로 SSE(Server sent events), LongPolling, Polling과 같은 방식으로 서버와 통신을 해야 하는데 프로그램 코딩 방식이 많이 다르게 되어 Client의 코드 복잡도가 증가하게 된다. 그 대신 차선책으로 Flash가 설치된 브라우저에서 사용할 수 있는 FlashSocket를 사용해서 차선책으로 선택할 수 있는 폭을 넓힐 수 있을 것이다.


 모바일에서는 최신 모든 브라우저는 HTML5를 지원하므로 WebSocket도 지원하기에 호환성에서도 괜찮을 것으로 예상한다.


 만약 node.js 플랫폼에서 개발한다면 통신에 대해서 추상화된 라이브러리가 있다. Socket.IO에서 배포하고 있는 라이브러리는 웹 브라우저의 상태와 관계없이 일관된 방식으로 개발할 수 있도록 하고 있다.



Socket.IO에서 지원하는 방식은 아래와 같다.

  • WebSocket

  • FlashSocket

  • Ajax LongPolling

  • Ajax Multipart streaming

  • Forever IFrame

  • JSONP Polling


지원 브라우저는

  • Internet Explorer 5.5+
  • Safari 3+
  • Google Chrome 4+
  • Firefox 3+
  • Opera 10.61+
  • iPhone Safari
  • iPad Safari
  • Android WebKit
  • WebOs WebKit


[그림2] Socket.IO site


HTML Template


2013.09.24 Update


참조 URL
  1. http://designsbydarren.com/
  2. http://freehtml5templates.com/
  3. https://www.jetstrap.com/ TwitterBootstraper 이용해서 template 제공
  4. http://bootswatch.com/
  5. https://wrapbootstrap.com/  - 유료지만 퀄리티가 높음
  6. http://stylebootstrap.info/
  7. http://builtwithbootstrap.com/
  8. http://www.bootstraptor.com/


 HTML 페이지를 처음부터 설계하고 레이아웃을 잡고, CSS 작업을 하는건 어떤 사람들에게는 중노동이 될 수 있다. 그렇지만 기초 공사가 되어 있는 상태에서 나머지 치장을 조금씩 할 수 있다면 무척 감사할 수 있을 것이다. 지금과 같이 기초 공사가 되어 있는 템플릿을 제공해 주는 사이트가 있어서 소개 하고자 한다. 


 이번에는 JetStrap 사이트에 대해서만 소개하고자 한다. 나머지는 직접 들어가서 확인해 보면 될 것이다. 아래 '그림1'은 JetStrap 사이트의 메인 화면이다. 이 사이트는 TwitterBootStraper을 이용해서 템플릿을 제공해 주고 있으며 '그림2'에서 보는바와 같이 템플릿을 Drag&Drop로 편집하여 다운 받을 수 있도록 하고 있다. 수정된 템플릿을 다운받아 수정 후 배포를 하면 될 것이다.


[그림1] JetStrap 사이트



[그림2] 템플릿 편집 화면



 부디 많은 사람들이 손 쉽게 웹 사이트나 페이지를 만들 수 있었으면 한다. TwitterBootstraper를 이용해 만든 템플릿이라 여러 브라우저에 호환성이 있는 템플릿이다.


 이 밖에도 이와 같이 템플릿을 제공해 주는 사이트가 많이 있으니 자신에게 적당한 곳에서 실험해 보면 될 것이다.

'설치 및 소개' 카테고리의 다른 글

codepen.io - Live HTML dev environment  (0) 2013.05.10
WebSocket - FlashSocket - Cross Browser support  (0) 2013.05.04
[WebMatrix] WebMatrix 3 Preview  (0) 2013.05.01
개발 그룹 사이트 링크  (0) 2012.11.12
WebMatrix 사용하기 #2  (0) 2012.11.09

TaskCompletionSource<T> Async


참조 URL
  1. TaskCompletionSource<TResult> 클래스
  2. C#5, ASP.NET MVC 4, and asynchronous Web applications

 

 이 포스트에 있는 내용이 언제나 확실한 정답은 아닙니다. 진실이라고 생각해 왔던 전제가 시간의 지남에 따라 들어나지 않았던 다른 이면 때문에 좋은 방향으로 이끌어 낼 수 있는 역할로 변환 되는게 역사적으로도 많은 증명 있었습니다. 그렇지만 저는 현재 상황에서 최선의 답을 찾고자 노력하였으며 이 글을 읽는 다른 분들에게 다음 길을 갈 수 있도록 도와주는 디딤돌이 되고자 노력하고자 포스팅을 통해 공유하고자 하는 것입니다. 그리고 프로그래머라는 타이틀을 달고 살아야 한다면 "왜"라는 의문을 항상 가지고 다니면서 자신의 위치에 안주하지 않고 항상 노력하는 모습으로 살아 가고자 합니다. 언제든 지적이나 오류가 있으면 피드백 부탁 드리겠습니다.

ing™       



 Task<T> 객체를 이용해서 비 동기로 작업을 손 쉽게 수행하도록 프로그램을 개발할 수 있다. 그렇지만 TaskCompletionSource<T>를 사용하면 명시적으로 결과값 리턴을 통제할 수 있게 할 수 있다. 우선 프로그램 화면을 보도록 하자.


[그림1] WPF 테스트 화면


 테스트를 해볼 시나리오는 "대기 시작" 버튼을 누르고 대기 종료 버튼을 누르면 그 사이의 대기 시간을 TextBlock 화면에 표시해주는 시나리오를 가지고 프로그램으로 개발해 보도록 하겠다.


[코드1] WPF에서 '대기 시작' 버튼 코드




[코드2] WPF에서 "대기 종료" 버튼 코드



 이번 포스트의 소스 파일을 첨부할테니 직접 실행해 볼 수 있을 것이다.


TaskCompletionSourceWPF.zip




소스 코드 자체에 주석과 직관적인 코딩으로 충분히 파악이 가능할 것으로 예상하므로 별도의 설명을 생략하도록 하겠습니다. 포스트의 내용이 장황한 설명 보다는 주석과 소스코드 자체 만으로도 이해할 수 있도록 하기 위해 노력하였습니다. 실 개발에서도 적용할 수 있도록 간단하면서도 현실적인 예제 프로그램을 통해 각 소스를 만들고 이해 시키고자 하였으며 실무에 필요한 개발요구 사항들을 해결 하는데 도움이 되고자 노력하였습니다. 그리고 소스와 같이 있는 주석을 이용해 nDoc이나 별도의 자동 Document 제작 유틸로 API 문서를 만드는 데에도 도움이 되었으면 한다. 
※ DOC에 대한 프로그램 정보 Util link

ing™       



동적 사용자의 Push Notification 등록


목차
  1. 파워쉘로 사용자 정보 알아내기
  2. Push Notification 등록 요청


 이전 포스트에서 파워쉘로 Active 사용자를 알아 내는 방법을 살펴 보았다. ( 2013/05/03 - [기타] - [Exchange] 동적 사용자의 Push Notification 등록 #1 ) 이제 이번 포스트에서는 Push Notification을 신청하도록 하자.


아래 '코드1'을 통해 Active mode의 Database에서 사용자를 가져와 Push Notification을 요청하는 코드이다.

/// <summary> /// Active Database를 이용해서 사용자 알아 내기 /// </summary> private static void RequestDatabase() {     // 요청자 사용자 리스트     var requestList = new List<string>();     // 요청된 사용자의 SubscriptionId 리스트     var subscriptionIdList = new ConcurrentDictionary<stringstring>();     // Task 리스트     var taskList = new List<System.Threading.Tasks.Task>();     // 파워쉘 명령으로 알아 내기     using (var powershellInvoker = new ExchangePowerShellWrapper(new AppConfigExchangePowerShellConfig()))     {         // 파워쉘 실행         foreach (var databaseItem in powershellInvoker.PipelineScriptInvoke("Get-MailboxDatabaseCopyStatus -active | select-object DatabaseName"))         {             // DatabaseName을 추출한다.             var databaseName = databaseItem.Members["DatabaseName"].Value.ToString();             // Get-Mailbox 파워쉘을 실행하여 사용자의 WindowsEmailAddress를 알아 낸다.             foreach (var user in powershellInvoker.PipelineScriptInvoke("Get-Mailbox -Database \"" + databaseName + "\" | select-object WindowsEmailAddress"))             {                 // 사용자의 이메일 주소                 var windowsEmailAddress = user.Members["WindowsEmailAddress"].Value.ToString();                 var databaseNameTemp = databaseName;                 var temp = System.Threading.Tasks.Task.Factory.StartNew(() =>                 {                     //GetRequest(databaseNameTemp, windowsEmailAddress);                     // List에 관리가 되도록 추가 한다.                     subscriptionIdList.TryAdd(GetRequestNotification(windowsEmailAddress), windowsEmailAddress);                 });                 // waiting 하기 위해 리스트에 넣어 둔다.                 taskList.Add(temp);             }         }     }     // 작업이 완료 될 때까지 대기 하도록 한다.     System.Threading.Tasks.Task.WaitAll(taskList.ToArray()); } /// <summary> /// 웹 서비스로 Subscription 신청 /// </summary> /// <param name="smtpAddress">메일 주소</param> private static string GetRequestNotification(string smtpAddress) {     try     {         string subscriptionId = null;         PushSubscription pushSubscription = null;         var ewsService = new ExchangeService(Microsoft.Exchange.WebServices.Data.ExchangeVersion.Exchange2013)         {             // 인증 정보 세팅             Credentials = new NetworkCredential("domain\\id""password")         };         // 이벤트 종류         var events = new List<EventType>() { EventType.CreatedEventType.Deleted };         // 폴더 범위         var folders = new List<FolderId>() { new FolderId(WellKnownFolderName.Inbox) };         pushSubscription = ewsService.SubscribeToPushNotifications(folders.ToArray(),                                                     new Uri("https://owa.mail.com/ews/exchange.asmx"),                                                     1,                                                     null,                                                     events.ToArray());         // Push Notification 요청하면 관리가 되도록 uniqueId를 반환한다.         subscriptionId = pushSubscription.Id;         return subscriptionId;     }     catch (Exception ex)     {         Console.WriteLine("{0}, {1}, {2}"smtpAddressex.Messagecount++);         throw;     } }

[코드1] Active mode database 사용자 추가


  RequestDatabase() 함수에서는 Database에서 사용자 정보를 추출하고, GetRequestNotification() 함수에서는 Exchange에 Push Notification 요청한다.






+ Recent posts