AppDomain.CurrentDomain의

기본 폴더 정의값 가져오기



var applicationBasePath = AppDomain.CurrentDomain.BaseDirectory;
applicationBasePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

[코드1] 실행 되는 폴더의 기본 폴더를 가져온다.


 위 코드는 프로그램이 실행되는 환경의 폴더 위치를 가져오는 방법이다. 이 방법을 통해 디버깅이나 다른 용도로 로그를 사용할 때 쉽게 찾을 수 있도록 할 수 있을 것이다. 사용 방법을 "코드2"와 같이 할 수 있을 것이다.



public static object logLock = new object();
 
/// <summary>
/// 로그 저장
/// </summary>
/// <param name="str"></param>
/// <remarks>
/// 로그를 저장하고 쓰레드 안정성을 가지고 있다.
/// </remarks>
public void WriteLog(string str)
{
    var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory"log.txt");
    lock (logLock)
    {
        var sw = File.AppendText(path);
        sw.WriteLine(str);
        sw.Flush();
        sw.Close();
        sw = null;
    }
}

[코드2] 로그 저장 메소드



 이와 같이 사용하면 실행 폴더의 가장 상위에 "log.txt" 파일이 생성되며 로그가 저장이 될 것이다.


Log4Net 간단 사용법


참조 URL
  1. http://blog.daum.net/joshuajh/5671007




1. 설정 초기화


Assembly.cs 파일을 이용 한 초기화 작업 수행


[코드1] Assembly.cs


 로그를 사용하려는 클래스에서 초기화 작업 수행


[코드2] 해당 클래스에서 초기화



2. 로그 설정 파일


 기본적인 설정 파일을 log4net.xml 파일이지만 웹 서버에서 호스팅을 할 때 URL을 직접 치고 들어오면 사용자가 설정 파일을 받을 수 있기 대문에 제외되어 있는 config 파일 형식으로 수정하였다.


[코드3] Log4Net 설정 파일 - log4net.config


 '코드3'에서의 설정 파일로 로그에 저장할 수 있는 형식과 저장 방법을 설정할 수 있다. 위 설정 파일을 root 노드에서 'RollingFile'을 사용하도록 설정하였으며 'appender name="RollingFile" '을 찾아가 보면 Log4Net에서 제공해주는 'log4net.Appender.RollingFileAppender' 형식으로 저장하도록 기본 제공하고 있다.



3. 로그 사용


 해당 클래스에서의 객체 생성 하기


[코드4] 해당 클래스에서 객체 인스턴스 화 작업



 위 '코드4'에서와 같이 로그를 사용할 해당 클래스에서 초기화를 수행하면 로그를 사용할 수 있게 된다. '코드5'를 통해 이제 로그를 저장하여 보자.


[코드5] Log4Net으로 로그 저장


 '코드5'와 같이 필요한 곳에서 필요한 로그 저장 메소드를 추가하면 될 것이다. 그리고 추가로 '코드4'에서 주석 처리된 '로그네임'을 사용하여 초기화를 하면 설정파일에 '로그네임'의 노드를 찾아서 추가적인 로그 저장 방법을 추가할 수 있다.





Chocolatey - package manager
( Windows에 특정 패키지를 쉽게 설치 하도록 지원 )


참조 URL
  1. http://chocolatey.org/
  2. https://github.com/chocolatey/chocolatey
  3. http://www.hanselman.com/blog/IsTheWindowsUserReadyForAptget.aspx
  4. http://chocolatey.org/packages - Chocolatey를 통해 설치할 수 있는 패키지 리스트
  5. http://devnote.tistory.com/241
  6. http://mz2guild.tumblr.com/post/45821046802/http-chocolatey-org


 Visual studio의 Nuget은 필요한 라이브러리를 온라인을 통해 최신의 버전을 받아 추가할 수 있도록 해주는 편리한 도구이다. 이것과 같은 방식으로 Windows에 최신 프로그램을 손 쉽게 설치 할 수 있도록 지원해 주는 도구다. 리눅스의 apt-get과 같은 역할을 담당한다. 이 프로그램을 통해 설치할 수 있는 프로그램이 1000여가지가 넘고 있다. 리스트 확인은 'http://chocolatey.org/packages'으로 확인해 보면 된다. '그림3'에서 설치 가능한 리스트의 첫 페이지를 올려 놓았으니 확인해 보자.


[그림1] 메인 이미지


[그림2] 로고




[그림3] 패키지 리스트

Nancy Framework


참조 URL
  1. http://nancyfx.org/
  2. http://samples.nancyfx.org/
  3. https://github.com/NancyFx - Source code
  4. http://www.hanselman.com/blog/OneASPNETNancyTemplatesForVisualStudio.aspx
  5. https://github.com/NancyFx/Nancy/wiki/View-engines
  6. https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-asp.net
  7. http://hoons.net/Board/asptip/Content/50727
  8. http://blogs.lessthandot.com/index.php/All/nancy:



Nancy is a lightweight, low-ceremony, framework for building HTTP based services on .Net and Mono. The goal of the framework is to stay out of the way as much as possible and provide a super-duper-happy-path to all interactions.

Nancy is designed to handle DELETE, GET, HEAD, OPTIONS, POST, PUT and PATCH requests and provides a simple, elegant, Domain Specific Language (DSL) for returning a response with just a couple of keystrokes, leaving you with more time to focus on the important bits.. your code and your application.


 Nancy는 가볍고, 작은 격식과 Mono와 .Net의 HTTP 서비스 기반 개발 프레임웍이다. Nancy는 Delete, Get, Head, Options, Post, Put 요청 처리를 간단하고 명쾌하게 처리되도록 디자인 되었다.



 아래 코드는 NancyModule를 상속 받아 '/greet/{name}'로 주소로 요청을 했을 때 해당 값을 리턴하는 예제다. 이렇게 간단하게 Restful을 구현할 수 있는 프레임웍이다.


[코드1] Nancy에 소개된 예제 코드 



[코드2] Hanselman에 소개된 에제 코드



 ASP.NET MVC나 일반적이 MVC 스타일의 프레임웍이다.



[코드3] Hanselman에 소개된 JSON 리턴 예제 코드


 Json으로 리턴되기를 바란다면 '코드3'과 같이 진행하면 될 것이다. 이 밖에도 Nancy.template, Nancy.Website, Nancy.Demo, View Engine 같은 도구나 데모도 있으니 살펴 보기를 바란다. ( https://github.com/NancyFx )

끝으로 ASP.NET과 같이 호스팅을 할 수 있는 페이지 링크로 마무리 하도록 하겠다. 

https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-asp.net )


Features

  • Built from the bottom up, not simply a DSL on top of an existing framework. Removing limitations and feature hacks of an underlying framework, as well as the need to reference more assemblies than you need. keep it light
  • Run anywhere. Nancy is not built on any specific hosting technology can be run anywhere. Out of the box, Nancy supports running on ASP.NET/IIS, WCF, Self-hosting and any OWIN
  • Ultra lightweight action declarations for GET, HEAD, PUT, POST, DELETE, OPTIONS and PATCH requests
  • View engine integration (Razor, Spark, dotLiquid, our own SuperSimpleViewEngine and many more)
  • Powerful request path matching that includes advanced parameter capabilities. The path matching strategy can be replaced with custom implementations to fit your exact needs
  • Easy response syntax, enabling you to return things like int, string, HttpStatusCode and Action elements without having to explicitly cast or wrap your response - you just return it and Nancy will do the work for you
  • A powerful, light-weight, testing framework to help you verify the behavior of your application
  • Content negotiation
  • And much, much more








Monodevelop


참조 URL
  1. http://monodevelop.com/
  2. http://monodevelop.com/Documentation/Feature_List
  3. http://www.mono-project.com/Compatibility



 MonoDevelop is a cross-platform IDE primarily designed for C# and other .NET languages. MonoDevelop enables developers to quickly write desktop and ASP.NET Web applications on Linux, Windows and Mac OSX. MonoDevelop makes it easy for developers to port .NET applications created with Visual Studio to Linux and Mac OSX maintaining a single code base for all platforms.

 

 MonoDevelop는 C#과 .NET 언어 개발을 위한  다중 플랫폼을 지원 IDE 도구다. 리눅스, 윈도우, 맥에서 Desktop와 ASP.NET Web application을 지원한다. 하나의 코드로 다중 플랫폼 지원을 지원할 수 있다.

Feature Highlights

  • Multi-platform
    Supports Linux, Windows and Mac OS X.
  • Advanced Text Editing
    Code completion support for C# 4, code templates, code folding.
  • Configurable workbench
    Fully customizable window layouts, user defined key bindings, external tools
  • Multiple language support
    C#, Visual Basic.Net, C/C++, Vala
  • Integrated Debugger
    For debugging Mono and native applications
  • GTK# Visual Designer
    Easily build GTK# applications
  • ASP.NET
    Create web projects with full code completion support and test on XSP, the Mono web server.
  • Other tools
    Source control, makefile integration, unit testing, packaging and deployment, localization


 아쉽게도 ASP.NET MVC는 기능 리스트에서 확인할 수 없네요. 이 도구와 Mono에 관계된 프로젝트를 진행해 보지 않아 많은 부분에 대해서 모르지만 조만간 Mono와 이 툴에 대해서 사용하며 테스트를 해봐야 겠습니다. 그리고 Xamarin으로 안드로이드나 iOS 앱 개발에 대해서도 흥미가 생기고 있습니다.

^^. 할일은 많은데 몸은 하나라 바쁘기만 하네요. 혹 멀티 플랫폼을 지원해야 하는 프로젝트가 있다면 한번 검토해 보시면 되겠습니다.


 페이스북에서 엄준일 블로거(http://blog.powerumc.kr/)님이 친절하게 알려주신 정보입니다. Mono 프로젝트 호환성 페이지에서 살펴 보면 Mono 자체는 ASP.NET MVC4 ( - .Net framework 4.5까지 )까지 지원한다고 되어 있었습니다.

 - http://www.mono-project.com/Compatibility ( 아직은 일분 기능만 구현됨 )

 - http://www.mono-project.com/Main_Page 모노 프로젝트 홈페이지



















 CultureInfo로 모든 언어의 

DateFormat, TimeFormat 알아내기



 Exchange에 타임존과 언어설정시 TimeFormat와 DateFormat 설정을 같이 해줘야 세팅이 되기 때문에 검색을 하였으나 구글리에서는 검색이 되지 않아 직접 파워쉘로 언어별로 세팅된 정보를 알아내 진행하다가 같이 프로젝트 하시는 이사님이 아래 코드를 보내 주셨다.


// 언어 리스트 가져오기
CultureInfo[] cinfo = CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures);
 
// 언어 리스트
foreach (CultureInfo cul in cinfo)
{
    Console.WriteLine("Language={0}"cul.Name);
    Console.WriteLine("DateFormat={0}"cul.DateTimeFormat.ShortDatePattern);
    Console.WriteLine("TimeFormat={0}"cul.DateTimeFormat.ShortTimePattern);
    Console.WriteLine("----------------------");
}

[코드1] 모든 언어 객체를 가져와 DataFormate, TimeFormate 뿌려주기


 이 코드를 실행하면 아래와 같이 결과가 나온다.


Language=chr-Cher

DateFormat=M/d/yyyy

TimeFormat=h:mm tt

----------------------

Language=iu-Latn

DateFormat=d/MM/yyyy

TimeFormat=h:mm tt

----------------------

Language=tzm-Latn

DateFormat=dd-MM-yyyy

TimeFormat=H:mm

----------------------

Language=ff-Latn

DateFormat=dd/MM/yyyy

TimeFormat=HH:mm

----------------------

Language=ha-Latn

DateFormat=d/M/yyyy

TimeFormat=h:mm tt

----------------------

Language=ku-Arab

DateFormat=yyyy/MM/dd

TimeFormat=hh:mm tt

----------------------

[표1] 결과 화면


 이제 여기서 얻은 값으로 아래의 코드를 통해서 Exchange 2013에서 사용자의 타임존과 언어 설정을 할 수 있게 되었다.


// 파워쉘로 사용자 언어 설정 변경
using (var powershell = Injector.Current.GetInstance<IPowerShellWrapper>())
{
    var results = powershell.PipelineInvoke("Set-MailboxRegionalConfiguration",
        new Dictionary<stringobject>() 
        {
            { "Identity"ui.UserId },
            { "Language"ui.Language },
            { "TimeFormat"ui.TimeFormat },
            { "DateFormat"ui.DateFormat } 
        });
 
    result.ResultState = true;
}

[코드2] Exchange 2013에서 파워쉘로 타임존과 언어설정 코드






Enum을 String에서 변환 하기



 환경 설정에서는 흔히 XML로 저정되어 있어서 일차적으로 읽는 값이 String으로 되어 있다. 그 값으로 Enum 타입의 값으로 변경하기 위해서는 값을 switch 구문이나 if 문으로 구분해서 변환해야 만 했었다. 그렇지만 .Net Framework 4에서 Enum의 Parse, TryParse를 통해서 쉽게 변환할 수 있도록 지원하고 있다. 아래 예제 코드로 확인해 보자 (Enum.Parse는 1.1부터 지원되었음)


var type = EnumType.None;
 
// Encryption 변환되는지 테스트
if (!Enum.TryParse("Encryption"out type&& type == EnumType.Encryption)
{
    throw new InvalidCastException("LdapAuthenticationType값이 올바르지 않습니다. 다시 확인하여 주시기 바랍니다.");
}
 
// 2(Encryption)에서 변환되는지 테스트
if (!Enum.TryParse("2"out type&& type == EnumType.Encryption)
{
    throw new InvalidCastException("LdapAuthenticationType값이 올바르지 않습니다. 다시 확인하여 주시기 바랍니다.");
}
 
// ServerBind 변환되는지 테스트
if (!Enum.TryParse("ServerBind"out type&& type == EnumType.ServerBind)
{
    throw new InvalidCastException("LdapAuthenticationType값이 올바르지 않습니다. 다시 확인하여 주시기 바랍니다.");
}
 
// 512(ServerBind)에서 변환되는지 테스트
if (!Enum.TryParse("512"out type&& type == EnumType.ServerBind)
{
    throw new InvalidCastException("LdapAuthenticationType값이 올바르지 않습니다. 다시 확인하여 주시기 바랍니다.");
}

[코드1] 형변환 테스트 코드



 위 코드는 형변환이 제대로 되는지 테스트하는 코드며 원하는 타입으로 변환이 되지 않았을 때는 예외가 발생하도록 하였다.


public enum EnumType
{
    None = 0,
    Secure = 1,
    Encryption = 2,
    SecureSocketsLayer = 2,
    ReadonlyServer = 4,
    Anonymous = 16,
    FastBind = 32,
    Signing = 64,
    Sealing = 128,
    Delegation = 256,
    ServerBind = 512,
}

[코드2] Enum 선언





[Code Snippet]




Zen Coding Visual Studio Plugin


참조 URL
  1. Zen Coding - a new way of writing Html and CSS Code
  2. http://en.wikipedia.org/wiki/Zen_Coding#Text_editors
  3. http://vswebessentials.com/
  4. http://zencoding.codeplex.com/
  5. http://www.johnpapa.net/zen-coding-in-visual-studio-2012/
  6. http://blog.vijay.name/2013/01/zen-coding-for-visual-studio-2012/
  7. http://visualstudiogallery.msdn.microsoft.com/07d54d12-7133-4e15-becb-6f451ea3bea6



Zen Coding으로 아래와 같이 입력을 하면

div#page>div.logo+ul#navigation>li*5>a


아래와 같은 HTML이 자동으로 나오게 하는 코딩 기법이다.

<div id="page">
       
<div class="logo"></div>
       
<ul id="navigation">
               
<li><a href=""></a></li>
               
<li><a href=""></a></li>
               
<li><a href=""></a></li>
               
<li><a href=""></a></li>
               
<li><a href=""></a></li>
       
</ul>
</div>


또 다른 예제

div#header>img.logo[alt=image]+ul#nav>li*2>a:link

HTML 결과 물

<div id="header">
    <img src="" alt="image" class="logo"/>
    <ul id="nav">
        <li>
            <a href="http://"></a>
        </li>
	<li>
            <a href="http://"></a>
        </li>
    </ul>
</div>


위와 같은 결과를 Visual studio에서도 사용할 수 있도록 도와주는 툴이 나왔다. 

Web Essential 2012 Home page 에서 다운바다서 설치하거나 Visual Studio에서 Tool > Extensions and Updates 에서 Online 에서 Web Essentials를 추가할 수 있다. 그런다음 웹 페이지( ASP.NET MVC에서는 cshtml또는 aspx 페이지)에서 잰코딩을 하고 탭을 누르면 위 예제와 같이 젠코딩이 자동으로 HTML을 생성해 준다.


div#page>div.logo+ul#navigation>li*5>a (tap 키를 누른다)

[코드1] Zen Coding


<div id="page">
    <div class="logo"></div>
    <ul id="navigation">
        <li><a href=""></a></li>
        <li><a href=""></a></li>
        <li><a href=""></a></li>
        <li><a href=""></a></li>
        <li><a href=""></a></li>
    </ul>
</div>

[코드2] Zen Coding이 HTML로 변환된 코드



Web Matrix 3에서도 Zen Coding을 지원하니 보다 쉽고 빠르게 HTML을 만들어 낼 수 있을 것이다.


Web Essentials 다운로드 페이지

http://vswebessentials.com/download





-----------------------------------------------------------------------------------------------------------------


만약 이와 비슷한 기능을 추가하고 싶다면

다른 프로젝트에서 추진되다가 지금은 중단된 프로젝트에서 관련 소스를 얻을 수 있다.

http://einaregilsson.com/zen-coding-visual-studio-addin/


ZenCoding.VisualStudio v1.1.0.333

DOWNLOAD ADD-IN || DOWNLOAD SOURCE 


테스트 모드를 64비트에서 테스트

( 64bit COM+ 테스트시 주의 )


참조 URL
  1. http://msdn.microsoft.com/en-us/library/ee782531.aspx
  2. http://msdn.microsoft.com/en-us/library/jj635153.aspx


 유닛 테스트를 진행하는데 있어서 COM+ 관련 테스트도 진행을 할 것이다. 그렇지만 유닛 테스트에서 COM+ 인식 부분에서 아래와 같이 '표1'에 해당하는 에러가 발생하고 있다면 구성문제를 짚어봐야 할 것이다.


"System.Runtime.InteropServices.COMException (0x80040154): 80040154 클래스가 등록되지 않았습니다. (예외가 발생한 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)) 오류로 인해 CLSID가 {0BFBF355-4966-4341-91C9-D08B8DAE73CC}인 구성 요소의 COM 클래스 팩터리를 검색하지 못했습니다." 

[표1] COMException 메세지


 '구성 요소 서비스'에서 정상적으로 COM+를 등록을 시켰는데도 위와 같은 에러가 발생한다면 유닛 테스트를 해 주는 프로세스도 64비트에서 실행해야 한다. 유닛 테스트 모드를 64비트로 수정하면 에러 없이 64비트 COM+을 테스트 할 수 있었다.


 COM+ 64 bit + Test Dll ( Any CPU / x64 ) + Unit Test Dll ( Any CPU + x64 ) + Unit Test Machine ( 64 bit mode ) 와 같이 구성이 되어야 정상적으로 테스트가 가능하다. 이제 테스트 모드를 64 bit로 바꾸는 방법을 '그림1'을 통해 알아 보자.


[그림1] Test mode 바꾸기


 '그림1'과 같이 Test > Test Settings > Default Processor Architecture > x64를 선택하고 유닛테스트를 진행하면 될 것이다.


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의 성능 비교표



+ Recent posts