규칙 클래스 이름: DoNotDeclareStaticMembersOnGenericTypes
규칙 ID: CA1000
분류: 디자인 규칙
메시지 레벨: 에러
확실도: 95% (확실도는 코드 분석에서 이 규칙에 위반 사례를 찾는 것에 대한 것이다. 즉, 이 규칙에 위반되었다는 것에 대해서 95%의 확실도로 보증할 수 있다는 것이다)

원인: 외부에 노출된 제네릭 타입이 정적(static, vb.net에서는 shared) 멤버를 가질 때 이 규칙에 위반된다.

규칙 설명
제네릭 타입의 정적 멤버를 호출할 때는 형식 매개 변수를 반드시 명시되어야 한다. Inference(유추 - 컴파일러가 인자를 통해서 형식 인자를 자동으로 알아내는 것을 말한다)를 지원하지 않는 제네릭 인스턴스 멤버를 호출할 때도, 형식 매개 변수의 형식이 반드시 명시되어야 한다. 이 두 케이스의 형식 매개 변수를 지정하는 구문은 다르지만, 아래 예에서 보듯이 혼동되기 쉽다.

[C#]

// Static method in a generic t.
GenericType<int>.StaticMethod();

// Generic instance method that does not support inference.
someObject.GenericMethod<int>();

[VB]
'Shared method in a generic type.
GenericType(Of Integer).SharedMethod()

'Generic instance method that does not support inference.
someObject.GenericMethod(Of Integer)()

위의 두 가지 코딩 방법은 멤버가 호출될 때 형식 매개 변수를 특정한 형식으로 정하지 않기 위해서 피해야 한다. 위와 같은 코딩을 하면 결과적으로 제네릭 타입을 쓰지 않은 것과 차이가 없다. 이 위반 사항을 고치기 위해서는, 정적 멤버를 없애고 그것을 인스턴스 멤버로 바꾸어야 한다.

관련 규칙
제네릭 타입에 과도한 파라미터를 피한다.
컬렉션 타입은 제네릭 인터페이스를 구현해야 한다
제네릭 리스트를 public으로 노출하지 않는다
제네릭 타입을 중첩하지 않는다

원문: http://www.gotdotnet.com/team/fxcop/Docs/Rules/Design/DoNotDeclareStaticMembersOnGenericTypes.html

Posted by kkongchi
MS office2006. 10. 15. 00:57
Microsoft Office Sharepoint Server 2007(이하 MOSS 2007)에서 기본적으로 블로그 서비스를 제공함에 따라, 그리고 시대의 대세에 따라 Microsoft Word에서도 Blog에 포스트하는 기능을 제공한다.


Blogger, MS Myspace 등은 기본적으로 제공이 되고, 앞서 언급한 MOSS 2007 서버, 그리고 Blogger, MetaWebLog API 등을 제공하는 블로그는 뭐든지 사용할 수 있다.



아래는 블로그에 Publish하기 전의 Preview 화면인데, 여기서 블로그의 제목을 넣을 수가 있다.


물론, 기존 Post 를 수정할 수 있는 메뉴도 있다..

'MS office' 카테고리의 다른 글

[Article]Windows Live Writer  (2) 2006.10.16
[Article]OWA 2007의 모습...  (0) 2006.09.15
[Article]Office 2007 Beta 2  (0) 2006.05.29
Posted by kkongchi
Internet Explorer2006. 10. 14. 02:10

Internet Explorer 7 RC1에는 주소 줄 옆에 검색 박스가 붙어 있다. 그런데, 이 검색 박스는 이전 버전에 비해서 기능이 더 좋아진 부분을 확인할 수 있을 것이다.

그것은, 검색 Provider를 설정할 수 있고, 그 옵션이 더 다양해졌다는 것이다.

일단 아래 그림처럼 검색을 할 때에 검색 Provider를 고를 수 있다.


옵션을 Wikipedia로 하고, CSI를 입력한 후 엔터를 누르면...


이렇게, CSI에 대한 Wikipedia 페이지가 바로 뜬다는 것...


Default 검색 옵션을 세팅할 수도 있다.


그리고, 아래 그림처럼 검색 옵션으로 사용할 수 있는 Provider들이 제법 많다는 것.. 한글판에 네이버가 있다면 좋겠다는...


Posted by kkongchi
디자인 규칙은 클래스 라이브러리 디자인 가이드라인에 따르는 지를 검사하는 규칙들의 모음이다. 닷넷의 기본적인 사상에 부합되는 클래스, 인터페이스, 예외 처리 등의 디자인이 되었는지(예:CA1020 형식이 부족한 네임스페이스를 사용하지 마십시오), .NET Class Library에서 적용된 기본적인 설계 원칙들을 따르고 있는 지(예: CA1056 Uri 속성은 문자열이면 안 됩니다), .NET Framework의 기본적인 규칙을 따로 있는지(예:CA2210 어셈블리에는 올바른 강력한 이름을 사용해야 합니다) 등을 검사하는 것이라고 할 수 있다.

디자인 규칙에는 아래와 같은 규칙들이 있다.

CA1000 정적 멤버를 제네릭 형식으로 선언하지 마십시오
CA1001 삭제 가능한 필드가 있는 형식은 삭제 가능해야 합니다.
CA1002 제네릭 목록을 노출하지 마십시오.
CA1003 제네릭 이벤트 처리기 인스턴스를 사용하십시오.
(추가 예정... 각 규칙을 클릭하면 규칙에 대한 포스트로 이동한다)
Posted by kkongchi
코드분석 규칙2006. 10. 14. 00:52

이 블로그의 이전 글(FxCOP - 비주얼 스튜디오 2005 코드 분석 Custom 규칙 작성하기)에서 이미 소개한 바 있지만, Visual Studio 2005 Team System에서는 아주 강력한 코드 분석 도구를 제공한다. 이 코드 분석 도구는 자체적으로 200개 이상의 규칙을 가지고, 코드를 검사하게 된다. 이 규칙들은 Microsoft가 제안하는 닷넷 클래스 라이브러리에서의 지켜야 할 디자인 가이드라인과 성능 등의 분야에서 검증된 Best Practice 등을 토대로 이루어져있기 때문에, 코딩 시 지켜야 함은 물론이고 .NET Framework을 공부하는 이들에게도 매우 유용한 리소스라고 할 수 있다.

코드 분석의 규칙은 아래의 카테고리로 나누어진다.

디자인 규칙
명명 규칙
보안 규칙
사용 규칙
상호 운용성 규칙
성능 규칙
안정성 규칙
유지 관리 규칙
이동성 규칙
이식성 규칙
전역화 규칙

* 앞으로 각 카테고리 별로 개요와 그 카테고리에 속한 각각의 규칙들에 대해서 하나하나 짚어 볼 생각이며, 글이 업데이트 될 때마다 링크가 연결될 예정이다.

* 그리고, VSTS 한글판에 있는 현재 규칙들의 이름은 너무나 번역이 부실해서...이름만으로는 도저히 그 규칙의 내용에 대해서 알 수가 없다. 이 점도 이 글을 쓰게 된 동기라고 할 수 있다.

'코드분석 규칙' 카테고리의 다른 글

[ETC]FxCop Custom Rule 작성에 대한 좋은 문서  (0) 2008.01.19
Posted by kkongchi
windows2006. 10. 12. 23:18
64bit 윈도우 서버에서 aspnet_regiis.exe를 사용해서 ASP.NET 2.0을 등록하려고 하면 아마도 IIS가 32bit 호환 모드로 동작중이라 할 수 없다는 에러 메시지가 출력될 것이다. 그럴 때는 아래 명령어를 사용해서 IIS를 64bit로만 동작하도록 설정해야 한다.
 
cscript %SystemDrive%\inetpub\AdminScripts\adsutil.vbs set w3svc/AppPools/Enable32bitAppOnWin64 0

그런 다음에 aspnet_regiis.exe를 실행시키면 된다.
Posted by kkongchi
asp.net2006. 10. 1. 17:15

Team Foundation Server에서 제공하는 Team build기능에서, 솔루션을 지정하게 되면 그 솔루션에 포함된 모든 프로젝트가 빌드되게 된다. 그러나 솔루션에 웹 사이트가 포함되어 있을 경우에 문제가 약간 있는데.. 이건 빌드가 되지 않는다.. 결과물에 다른 DLL이나 EXE는 있을 지 몰라도, 웹 사이트는 없을 것이다...-_-;;

이건 VS2003, 닷넷 1.X에서 우리가 쓰던 Web Application과 VS2005의 Web Site가 전혀 다른 개념이기 때문이다. Web Site는 사실 굳이 컴파일할 필요가 없다. Runtime에 자동으로 컴파일이 되기 때문이다. 그러므로 사실 팀 빌드에서 포함시킬 필요도 없긴 하겠지만.. Web Application 과 비교해봤을 때 아무래도 다음과 같은 단점이 있게 된다.

소스가 그대로 서버의 디렉토리에 노출된다.
미리 컴파일된 것보다는 Runtime시에 컴파일되는 것이 느릴 것이다. (물론 처음에 한 번만 하겠지만.., 그리고 이 때문에 소스만 바꿔도 컴파일할 필요없이 운영된다는 것은 아주 좋은 점이긴 하다)
실수로 컴파일 에러가 나는 소스가 올라갈 수도 있다.

Aspnet_compiler.exe와 aspnet_merge.exe를 사용해서 기존의  웹 애플리케이션과 똑같은 형태로 컴파일할 수 있긴 하다. 하지만 과정이 매우 복잡하고, 결정적으로 귀찮다는...-_-;;;; 이 과정을 자동화시킬 수 있는 툴이 있다. 바로 Visual Studio 2005 Web Deployment Project이다. 이건 VS2005에 Add-In으로 간단하게 설치할 수 있고, 아래 주소에서 다운로드 받을 수 있다.

http://msdn2.microsoft.com/en-us/asp.net/aa336619.aspx

사용방법은 간단하다. 아래 그림처럼 웹 사이트에 오른쪽 마우스를 누르면, 컨텍스트 메뉴가 뜨는데 거기서 Add Web Deployment Project를 누르면 된다.

팝업 화면이 뜨는데, 이름과 경로를 입력하면 된다. 입력한 이름은 그 Deployment Project의 이름이 되기도 하지만, 실제 출력되는 웹 DLL의 이름이 되기도 한다.

Debug(혹은 Release - 빌드 옵션에 따라서) 폴더에 가면, ASP.NET 1.X시절과 같은 형태로 출력물이 나온 것을 볼 수 있다. Web Page의 aspx와 bin 폴더 아래의 DLL들.. 이제 이 결과물을 IIS에서 만든 가상 디렉토리에 복사하기만 하면 된다. 아래 그림은 결과물 폴더와 bin 폴더인데, bin 폴더에 보면, 좀 전에 만든 Web Deployment Project의 이름과 똑같이 DLL이 만들어진 것을 볼 수 있다.

Posted by kkongchi
C# & VB.NET2006. 9. 30. 18:32
아직 여기 Tistory는 API를 제공하지 않지만, 대부분의 블로그 서비스는 블로그 API를 제공한다. 이런 API를 써서 꼭 블로그에 접속하지 않고도 블로그의 포스트 리스트를 가져온다거나, 블로그를 작성하거나 할 수 있다. (이를테면 MS Word 2007에서는 Blogger, MSN Space 등의 블로그에 Post할 수 있는 메뉴를 제공한다) 이런 API 중에서 대표적인 것이 Blogger ATOM APIRFC MetaWebLog API이다.

Blogger Atom API에 대한 문서는 다음을 참조하면 된다 ->
http://code.blogger.com/archives/atom-docs.html

다음 샘플은 Blogger Atom API를 써서 자신의 Blogger Blog 목록을 가져오는 C# 샘플이다. 설명은 코드의 주석으로...^^;;


//WebClient 클래스는 간단하게 인터넷 익스플로러라고 생각하면 된다.

//즉, 프로그램 내부에서 인터넷 페이지를 열거나 데이터를 post/get 하는 등의 일을 할 수 있는 객체이다.
//Blogger ATOM API는 XML-RPC를 사용하기 때문에 이 객체를 사용해서 데이터를 가져오거나 쓸 수 있다.
System.Net.WebClient oClient = new System.Net.WebClient();

//Content-type은 반드시 application-xml로 설정해야 한다.
oClient.Headers.Add("Content-type", "application/xml");

//ATOM API는 HTTP SSL 기본 인증을 사용한다.
//기본 인증 token은 아이디:비밀번호를 Base64로 인코딩한 값이 사용된다.
//아래 코드 중 Base64Encode라는 함수는 내 이전 글(
http://kkongchi.net/1602055)을 참조한다
oClient.Headers.Add("Authorization", "BASIC " + this.Base64Encode("YourID:YourPassword", System.Text.Encoding.UTF8));

//자신의 블로그 리스트를 읽어와서 TextBox에 넣는다.
string s = oClient.DownloadString("http://www.blogger.com/atom/");
this.textBox2.Text = s;



이 코드를 통해서 얻어진 결과는 다음과 같다..(내 ID/PW로 쿼리한 결과)

<feed xmlns="http://purl.org/atom/ns#">
<userid title="kkongchi's Blog" xmlns="https://www.blogger.com/atom/23327098" type="application/atom+xml" rel="service.feed">
<link title="kkongchi's Blog" href="http://kkongchi.blogspot.com" type="text/html" rel="alternate">
<link title="kkongchi's GOOGLE Blog" href="https://www.blogger.com/atom/28487731" type="application/atom+xml" rel="service.post">
<link title="kkongchi's GOOGLE Blog" href="https://www.blogger.com/atom/28487731" type="application/atom+xml" rel="service.feed">
<link title="kkongchi's GOOGLE Blog" href="http://kkongchigle.blogspot.com" type="text/html" rel="alternate">
</feed>
Posted by kkongchi
Internet Explorer2006. 9. 30. 16:26

오늘 Internet Explorer 7 Release Candidate 1 버전을 설치했다.



일단 가장 맘에 드는 기능은 당연히..Tab 기능과 Quick Tabs 기능이다.
특히 Quick Tabs 기능은 정말 유용한 것 같다.




ZDNet의 뉴스를 보니, Quick Tabs를 첫 페이지로 하고 싶다는 사용자들의 요구가 상당하다는데..
첫 페이지 몇 개를 설정해놓고 처음에 Quick Tabs가 뜬다면 아주 좋을 것 같다..

Posted by kkongchi
javascript & HTML2006. 9. 27. 22:18

오늘 몰라서..한참을 헤멨던 것....-_-;;

1. 하고자 했던 것은, 평소에는 Mouse Over, Out 시에 이미지가 바뀌는 버튼이 선택되고 나면 바뀌지 않고 선택된 채로 남아있게 하는 . Onmouseover이벤트에 함수가 있는것을 지우는 것은 간단했다. onmouseover=null; 했더니 바로 없어졌으니까. 그런데 이렇게 null버튼에 다시 이벤트를 주는 것에서문제가 발생했다. 처음 코드는 어땠냐면..


button.onmouseover = "changeImage()";


하지만, 이렇게 하면.. changeImage()함수가 아니라, 문자열로 인식되기 때문에 아무런 효과가 없다..-_-;;

구글에서 한참 뒤진 결과..방법을 알게 되었다.


button.onmouseover = function() { changeImage() };


이렇게 function() 붙여줘야, 함수라는 개체로 인식이 된다는 것...


2. 그런데, 이것보다 좋은 방법을 조금 있다가 누군가에게서 배워서 알게 되었다는 것...-_-;;;

attachEvent() 라는 메서드를 쓰면 된다.


,


button.attachEvent('onmouseover',changeImage);

* 그런데, attachEvent는.. IE에서만 된다...FireFox를 생각한다면 쓰면 안 됨...(현재 프로젝트는 Outlook에 있는 IE만을 Target으로 하고 있기 때문에 그냥 뒀다..)

Posted by kkongchi