'.NET'에 해당되는 글 21건

  1. 2009/05/01 Silverlight 서버전송메시지 보안방법
  2. 2009/03/14 ASP.Net MVC의 무료eBook 공개되었습니다.
  3. 2009/02/20 Visual Studio추가기능(Add-In) 만들기 - Part3
  4. 2009/02/14 Visual Studio추가기능(Add-In) 만들기 - Part2
  5. 2009/02/12 뮤텍스를 사용한 다중실행 방지(C#)
  6. 2009/02/11 Visual Studio추가기능(Add-In) 만들기 - Part1
  7. 2008/10/22 한방에 예외로그를 처리하기.
  8. 2008/09/30 ClickOnce로 배포된 어플리케이션 버젼 취득. ClickOnce配布アプリのバージョン取得
  9. 2008/07/26 プログラムによるListの作成例。프로그램을 사용한 SPList작성샘플
  10. 2008/05/30 [중요] WSS스케줄 리스트의 심각한 버그, WSSスケジュールリストの深刻なバグ [SharePoint] (1)
2009/05/01 03:50

Silverlight 서버전송메시지 보안방법

잠이안와서 컴터를 키고 드라마를 보던중 불현듯...
실버라이트를 사용한 SSL통신 비스므리한 아이디어가 생각나서 적어봅니다..

네고시에이션
1. 세션 생성시에 해당세션에 해당되는 비대칭키를 서버에서 생성해서 세션에 서버의 개인키를 보존
2. 공개키를 클라이언트에 전송(HTML에 집어넣든..Silverlight상에서 수신하든..)
3. 클라이언트는 비대칭키를 생성해서 자신의 공개키를 서버에 전송(서버의 공개키로 암호화해서)
4. 서버는 세션에 클라이언트의 공개키를 보존
5. 클라이언트는 자신의 개인키를 보존. 보존시에는 페이지이동을 고려해야함..
    (문제는 클라이언트자신의 개인키를 어디에 보존하느냐??? IsolatedStorage가 사용가능하려나)

암호화 전송시(개인정보,패스워드등)
5. 클라이언트가 서버에 데이터 전송시에 자신의 개인키+서버의 공개키로 암호화해서 전송
6. 서버는 클라이언트에게 서버의 개인키+클라이언트의 공개키로 암호화해서 데이터전송

일반적인 비대칭암호화통신의 방법이지만 먼가뿌듯한 이느낌..-.-;;;

물론 실버라이트랑 서버간의 통신이 대부분 WCF나 Webservice로 이루어지니까
일괄적인 보안설정을 하면되지만.. 보안설정하는것도 꽤 많은 지식과 노력을 요하게되니..
위 기능을 구현한 간단한 컴퍼넌트가 있으면 꽤 좋을듯..

어쨋든 세션당 키가 생성되니 일반적인 웹사이트에서 사용하기에는 충분한 보안레벨인듯..
게다가 javascript연동기능도 만들면 궂이 silverlight로 UI를 만들지 않아도 암호화 가능하다는 사실..

혹시 공개된거 있을려나???

저작자 표시 비영리 변경 금지
Trackback 0 Comment 0
2009/03/14 22:58

ASP.Net MVC의 무료eBook 공개되었습니다.

MS의 .Net플랫폼 부사장인 Scott Guthrie씨가 곧 발매예정인 Professional ASP.Net MVC 1.0의 제1장을 집필했는데..
무료로 써주는 대신에 자신의 집필분에 한해 무료공개한다는 전제조건을 달았다고 하네요..
그리하여 제1장이 무료공개 되었는데요..

1장치고는 내용이 충실해서 개발경험있고 MVC에 대한 개념이 잡힌사람한테는
ASP.Net MVC를 처음 접할때에는 굉장히 유용할거 같습니다.

Scott에게 감사드리며 잘읽겠습니다..

근데 누가 번역좀 ??? -.-


원본
http://weblogs.asp.net/scottgu/archive/2009/03/10/free-asp-net-mvc-ebook-tutorial.aspx

PDF다운로드
http://aspnetmvcbook.s3.amazonaws.com/aspnetmvc-nerdinner_v1.pdf

Amazon책정보
http://www.amazon.com/gp/product/0470384611?ie=UTF8&tag=scoblo04-20&linkCode=xm2&camp=1789&creativeASIN=0470384611

저작자 표시 비영리 변경 금지
Trackback 0 Comment 0
2009/02/20 23:03

Visual Studio추가기능(Add-In) 만들기 - Part3

[VS2008,2005,2003] - Visual Studio추가기능(Add-In) 만들기 - Part2
의 부연 설명으로 IDTExtensibility2, DTCommandTarget 인터페이스의 간략한 설명으로 추가기능 만들기 내용을 끝내겠습니다.

IDTExtensibility2
메서드 설명
OnConnection Visual Studio가 추가기능을 로드할때 불려짐. 커맨드를 추가하거나 초기설정을 할때 사용함.
OnDisConnection Visual Studio가 추가기능을 언로드할때 불려짐. 추가기능에서 추가한 커맨드등을 삭제할때 사용함.
OnAddInsUpdate Visual Studio가 추가기능을 로드할때와 추가기능설정이 변경되었을때 불려짐.
OnStartupComplete Visual Studio가 추가기능의 로딩을 끝냈을때 불려짐.
OnBeginShutdown Visual Studio가 종료될때 불려짐.


DTCommandTarget
메서드 설명
Exec 유저가 커맨드를 실행했을때 불려짐. 커맨드의 실제 실행로직에 사용하면 됨.
QueryStatus Visual Studio의 상태가 변경되었을때 불려짐. 상황에 따라서 커맨드의 활성비활성화를 결정지을때 사용하면 됨.


마지막으로...추가기능을 배포에 관한 내용입니다.
기본적인 배포방법은 Add-In을 VS에서 사용하려면 애드인 정의XML을
My Documents\Visual Studio 2005\Addins 또는 My Documents\Visual Studio 2008\Addins에 복사해 넣고
(모든 PC사용자에게 사용가능하게 하려면 Documents and Settings\All Users\My Documents 에 넣으시면 됩니다.)
정의XML에 기입된 DLL의 장소(파일, url, GAC)에 DLL을 집어넣는것으로 배포는 끝입니다.
정말 간단한 방법에 MS에 감사드립니다..-.-

정의 XML과 배포에 대한 보다 자세한 내용은 아래의 링크로 대신하겠습니다.
http://msdn.microsoft.com/ko-kr/library/19dax6cz(VS.80).aspx -> 추가기능 등록

http://msdn.microsoft.com/ko-kr/library/keet1583(VS.80).aspx -> 기타 참고 제어 방법
저작자 표시 비영리 변경 금지
Trackback 0 Comment 0
2009/02/14 01:21

Visual Studio추가기능(Add-In) 만들기 - Part2

2009/02/11 - [VS2008,2005,2003] - Visual Studio추가기능(Add-In) 만들기 - Part1
에 이어서 VS에 간단한 추가기능을 추가해보도록 하겠습니다.

제일중요한 IDTExtensibility2와 IDTCommandTarget의 인터페이스에 대한 정리는 제일 나중에 정리하도록 하고..
일단 툴바메뉴에 버튼을 추가해보죠.


IDTExtensibility2의 인터페이스메서드중 하나인 OnConnection메서드에 아래와같은 코드를 입력해주시고
SetToolBar()라는 함수도 추가해주세요. SetToolBar는 실제 버튼을 등록하는 코드를 서브루틴으로 빼둔겁니다.

  public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
  {
   _applicationObject = (DTE2)application;
   _addInInstance = (AddIn)addInInst;
            switch (connectMode)
            {
                   
                case ext_ConnectMode.ext_cm_Startup:
                    SetToolBar();
                    break;

                case ext_ConnectMode.ext_cm_AfterStartup: 
                    SetToolBar();
                    break;

                case ext_ConnectMode.ext_cm_CommandLine:
                    break;

                case ext_ConnectMode.ext_cm_External:
                    break;

                case ext_ConnectMode.ext_cm_Solution:
                    break;

                case ext_ConnectMode.ext_cm_UISetup:
                    break;

                default:
                    break;
            }
  }

        /// <summary>
        /// 표준Toolbar에 버튼을 등록
        /// </summary>
        private void SetToolBar()
        {
            CommandBar stdCmdBar;
            CommandBarButton cmdBarBtn;
            object[] contextGUIDS = new object[] { };

            //커맨드가 등록되어 있지않다면 새로 등록
            if (ToolbarCommand == null)
            {
                ToolbarCommand = _applicationObject.Commands.AddNamedCommand(_addInInstance,
                  "ANewComment", "코멘트추가", "코멘트를 추가해줍니다.", true, 59, ref  contextGUIDS,
                      (int)vsCommandStatus.vsCommandStatusSupported 
                     | (int)vsCommandStatus.vsCommandStatusEnabled);
            }

            //표준툴바의 객체를 취득
            stdCmdBar =
            (Microsoft.VisualStudio.CommandBars.CommandBar)((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["Standard"];

            //표준툴바에 버튼을 추가
            stdCmdBarCtl = (Microsoft.VisualStudio.CommandBars.CommandBarControl)ToolbarCommand.AddControl(stdCmdBar, stdCmdBar.Controls.Count + 1);

            //버튼에 캡션설정
            stdCmdBarCtl.Caption = "이거 누르면 코멘트가 추가됩니다.";

            //버튼을 아이콘으로 설정
            cmdBarBtn = (CommandBarButton)stdCmdBarCtl;
            cmdBarBtn.Style = MsoButtonStyle.msoButtonIcon;
        }


일단 이것만 하고 실행(F5)를 누르고 디버깅해주시면 아래 그림과 같이 툴바 제일끝에 스마일버튼이 추가된걸 보실수가 있습니다.



근데!!버튼을 누를수가 없네요.
IDTCommandTarget의 인터페이스메서드중 하나인 QueryStatus메서드에 아래와같은 코드를 입력해주세요.
빨간 부분은 프로젝트를 만들때 사용했던 추가기능의 이름을 넣어주세요.


  public void QueryStatus(string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus status, ref object commandText)
  {
   if(neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
   {

                //커맨드명과 현재 활성화된 창의 문서가 Document일 경우에만 사용가능하다는 신호를 보냄
                if (commandName == "MyTestAddin1.Connect.ANewComment" && _applicationObject.ActiveWindow.Type == vsWindowType.vsWindowTypeDocument)
                 {
                    status = (vsCommandStatus) vsCommandStatus.vsCommandStatusEnabled | vsCommandStatus.vsCommandStatusSupported;
                    return;
                 }

   }
  }

QueryStatus메서드는 VS가 자신의 상태가 변하면 각 커맨드들에 사용가능한 상태인지 요청하게 됩니다.
QueryStatus메서드에서 현재 VS의 상황을 파악하여 사용가능여부를 반환합니다.
예를들어 위의 코드에서는 '커맨드명과 현재 활성화된 창의 문서가 Document일 경우에만 사용가능하다는 신호를 보냄'이 상황이 됩니다.

제가 현재 열려진 창의 문서가 Document일 경우에만 사용가능하다는 신호를 보냄이란 조건을 설정한 이유는 스타트페이지가 열려진 상태에서 버튼이 눌러지게 되면 코멘트를 넣을곳이 없기때문에 에러를 발생시키기 때문이죠..
물론 코멘트를 넣어줄때 체크를 하면되지만 유저인터페이스를 고려해서 쓸수 없는 상황에는 아예 안눌려지게 하기위함입니다..
(위의 조건도 완벽한 상태가 아닙니다.실은 vsWindowTypeDocument라는건 파일의 종류와 상관없이 편집가능한 문서-소스코드,HTML,CSS,XML등 모든 문서-를 의미합니다.)



자 이제 마지막으로 버튼을 눌렀을때 문서에 코멘트를 넣는 코드를 추가해보겠습니다.
IDTCommandTarget의 인터페이스메서드중 하나인 Exec메서드에 아래와같은 코드를 입력해주세요.

  public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
  {

   handled = false;
   if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
   {
                switch (commandName) //스위치를 사용하여 불려진 커맨드를 체크.(혹시 하나의 추가기능에 버튼이 여러개 있을수도 있으니까 스위치를 사용합니다.)
                {
                    case "MyTestAddin1.Connect.ANewComment":
                        //현재 열려진 창이 문서인지 재확인을 하고
                        if (_applicationObject.ActiveWindow.Type == vsWindowType.vsWindowTypeDocument)
                        {
                            //열려진 문서의 인스턴스를 취득해서
                            TextDocument textDoc = (TextDocument) _applicationObject.ActiveWindow.Document.Object("TextDocument");
                            textDoc.StartPoint.CreateEditPoint(); //커서위치를 가져오고
  
                            //커맨드를 삽입하고
                            textDoc.Selection.Insert(string.Format("//{0}에 입력되었습니다.",DateTime.Now.ToString()), 0); 

                            //보기좋게 하기위해 개행문자를 넣어줌...
                            textDoc.Selection.EndOfLine(true);
                            textDoc.Selection.NewLine(1);

                            handled = true;
                        }
                        return;

                    default:
                        break;
                }
   }


}


자!!! 이제 다 만들어졌습니다.
다시 실행버튼을 누르시고 대충 아무 cs파일을 여시고.. 파일을 여시면 버튼이 활성화되는걸 보실수 있을겁니다.
그리고 버튼을 누르시면 아래처럼 자동으로 코멘트가 들어가 있을겁니다.



일단 오늘 시간이 좀 늦었으니 담번에 IDTExtensibility2와 IDTCommandTarget에 대해서랑 어떻게 추가기능을 배포할것인지를 정리하도록 하겠습니다..-.-;;


내용 추가
아래 소스코드도 IDTExtensibility2의 OnDisconnection메서드에 집어넣어주세요. 아래의 소스코드는 추가기능이 언로드될때 커맨드와 버튼을 삭제해줄때 사용합니다.이걸 집어넣지 않으면 추가기능을 활성화, 비활성화할때 에러를 발생시킬수 있거든요..^^;
깜박하고 빼먹었습니다..

  public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
  {

            //추가기능이 언로드될 등록한 버튼과 커맨드를 삭제
            try
            {
                if (disconnectMode == ext_DisconnectMode.ext_dm_UserClosed)
                {
                    if (stdCmdBarCtl != null)
                    {
                        stdCmdBarCtl.Delete(null);
                        stdCmdBarCtl = null;

                        ToolbarCommand.Delete();
                        ToolbarCommand = null;
                    }

                    if (MenuToolCommand != null)
                    {
                        MenuToolCommand.Delete();
                        MenuToolCommand = null;
                    }
                }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.ToString());
            }
  }

저작자 표시 비영리 변경 금지
Trackback 0 Comment 0
2009/02/12 22:44

뮤텍스를 사용한 다중실행 방지(C#)

많이 쓰이는건데..
WinApp의 다중실행을 방지하는 샘플입니다.
Program.cs를 아래와 같이 변경해주세요.


    static class Program
    {
        // 어플리케이션의 이름
        private static string strAppConstName = "적당한 어플리케이션의 이름";

        // 다중기동을 방지하는 뮤텍스인스턴스
        private static Mutex mutexObject;

        [STAThread]
        static void Main()
        {
            // Windows 2000(NT 5.0)이후만 글로벌 뮤텍스가 사용가능
            OperatingSystem os = Environment.OSVersion;
            if ((os.Platform == PlatformID.Win32NT) && (os.Version.Major >= 5))
            {
                strAppConstName = @"Global\" + strAppConstName;
            }

            try
            {
                // 뮤텍스를 생성
                mutexObject = new Mutex(false, strAppConstName);
            }
            catch (ApplicationException e)
            {
                // 글로벌 뮤텍스에 의한 다중실행 방지
                MessageBox.Show("이미 실행되고 있습니다.", "다중실행방지");
                return;
            }

            // 뮤텍스를 취득
            if (mutexObject.WaitOne(3000, false))
            {
                //실행
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new frm_SignIn());

                //프로그램사용이 끝났으니 뮤텍스를 해방
                mutexObject.ReleaseMutex();
            }
            else
            {               
                //이미 실행중이니 경고 메시지
                MessageBox.Show("이미 실행되고 있습니다.", "다중실행방지");
            }

            // 뮤텍스를 파기하고 완전종료
            mutexObject.Close();

        }
    }

Trackback 0 Comment 0
2009/02/11 23:47

Visual Studio추가기능(Add-In) 만들기 - Part1

저도 추가기능은 제대로된걸 만들어본적이 없어서 깊게 파고 들수는 없지만 대략적인 지식을 비망록으로써 남겨보려합니다.
Visual Studio에는 3가지 방법으로 개발환경을 커스터마이징할수 있습니다.

매크로
   매크로는 흔히 이용하는 오피스의 매크로와 동일하다고 보시면 됩니다.
   사용자의 액션을 레코딩하여 반복작업을 간단하게 해줄수도 있고 컴파일이 필요없기 때문에 쉽게 편집할수도 있습니다.
   다만 Visual Basic으로만 저장이 가능하고 소스코드가 그대로 저장되어서 배포할때도 소스코드가 배포되니
   통합된 프로젝트에서는 관리하기가 불편하죠.

Add-In
   하나의 어플리케이션형태로 개발되고 배포또한 인스톨러형식으로 배포가능하고 매크로보다 강력합니다.
   매크로는 사용자의 명령을 소스코드가 대신해주는 기능뿐이지만 Add-In은 하나의 어플리케이션처럼
   VS랑 상호작용하니 가능한 작업도 많아집니다.
   
Visual Studio SDK
   이건 저도 사용해본적이 없어서 많은 설명을 드릴수는 없지만 Visual Studio SDK를 사용하면
   VS를 근본부터 제어할수 있습니다. DevParter라든지 각종 서드파티의 개발지원툴들은 이것을 이용하여 개발되었다고
   보시면 됩니다.WF나 WCF의 디자이너또한 마찬가지이고요..
  

3파트 정도로 나뉘어서 간단하게 툴바에 버튼을 하나 추가하여 버튼을 누르면 소스코드에 코멘트를
자동으로 입력해주는 기능을 만들어보도록 하겠습니다.

일단 오늘은 VS가 제공하는 템플릿을 사용하여 기본틀만 만들어보죠.

1. 새 프로젝트를 클릭하셔서 "기타 프로젝트형식" -> "확장성" -> "Visual Studio 추가기능" 순으로 클릭해주세요.
그리고 적당한 이름을 넣으시고 "확인을 눌러주세요.
참고로 옆에 보이는 "공유추가기능"이란건 오피스등에서 사용할수 있는 추가기능을 말합니다.


2. 그럼 위저드가 실행되어 언어를 선택하는 화면이 나옵니다.여기서는 C#을 선택합니다.


3. 그후에는 어떤 형식으로 추가기능을 사용할건지가 나오는데요. Macros를 제외한걸 선택합니다.
(실은 Macros를 선택한것과 안한것이 머가 틀린지는 저도 모르겠습니다...-.-..다만 추가기능의 정의XML에 호스팅되는 환경으로 매크로가 추가될뿐...)



4.그리고 이름과 설명을 대충입력해주시고요...



5. 아래와 같이 체크복스를 체크합니다.
가볍게 설명을 하자면 "도구"메뉴항목을 만듭니다..라는 내용은 VS상단메뉴의 "도구"에 지금 만드는 추가기능의
기본명령을 추가해주는 소스코드를 자동으로 만들어줍니다.
다음으로 호스트 응용프로그램이 시작될때 로드합니다.라는 내용은 추가기능의 정의XML에 옵션설정을 해주어서
별도의 유저액션없이 추가기능을 로드해줍니다.
마지막의 모달UI를 표시하지 않으며...라는 내용은 MSDN에는 추가 기능에 모달 UI(사용자 인터페이스)를 사용하지 않도록 하여 명령줄 빌드에서 안전하게 사용할 수 있도록 할지 여부라고 나오는데 당췌 먼말인지 모르겠습니다..-.-

6. 상단 메뉴의 "도움말" -> "Visual Studio 정보"라는 메뉴를 클릭했을때 나오는 일반적은 정보화면에 추가기능의 정보를 표시할지를 선택합니다. 대충 입력하시고 다음을 눌러주세요..




7. 그럼 프로젝트가 작성되어지고 다음의 소스코드들이 들어가 있을겁니다.


이걸로 템플릿을 사용하여 아무것도 없는 소스코드까지만 만들었습니다.
하지만 다음 내용을 위해 하나 해둬야 할게 있습니다.
현재 Connect는 IDTExtensibility2라는 인터페이스만을 구현하고 있는데 이건 추가기능으로써 필요한 인터페이스입니다.
저희는 도구모음을 버튼을 추가해야하니 IDTCommandTarget라는 인터페이스도 구현해야합니다.
IDTCommandTarget라는 텍스트를 추가하시고 아래그림과 같이 메서드스터브를 자동으로 만들어 주세요.
IDTExtensibility2과 IDTCommandTarget에 대한 설명을 다음 내용에서 설명하도록 하겠습니다.
Trackback 0 Comment 0
2008/10/22 09:41

한방에 예외로그를 처리하기.

어플리케이션에서 발생하는 모든 예외를 한곳에서 로그처리를 하면 굉장히 편리한 경우가 많습니다.
개발자가 많아지거나 규모가 커지면 커질수록 예외처리를 하기가 쉽지않은데요..
아래의 코드를 이용해서 처리가 안된 예외를 자동으로 캐치해서 로그를 남겨줄수있습니다.
이렇게하면 알수없는 에러가 발생했을경우 로그가 남기때문에 수정하기가 쉬워지죠...

try
{
    //여기서 예외가 발생안하면 웹어플리케이션
    //ここで例外が発生しなかったらウェブアプリケーション
    System.Web.HttpContext.Current.ApplicationInstance.Error += new EventHandler(ApplicationInstance_Error);
}
catch (Exception)
{
    //윈도우 어플리케이션의 UnhandledException이벤트에 핸들러를 추가
    //例外が発生したらウィンドウアプリケーション
    System.AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}

static void ApplicationInstance_Error(object sender, EventArgs e)
{
    //로그를 남기는 처리를 집어넣기
    //WriteLog("Exception発生!!!",System.Web.HttpContext.Current.Error.ToString(), LogLevel.Fatal);
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    //로그를 남기는 처리를 집어넣기
    //WriteLog("Exception発生!!!", e.ExceptionObject.ToString(), LogLevel.Fatal);
}


위의 코드로 처리되지않은 에러들이 각각 ApplicationInstance_Error와 CurrentDomain_UnhandledException 이벤트핸들러로 넘어오게됩니다.
그럼 필요한 코드를 집어넣어서 파일 또는 이벤트로그에 로그를 남기시면 에러가 발생했을경우 유저를 붙잡고 어떤 에러가 낳는지 캐물을 필요도 없게됩니다...ㅎ

저는 위의 코드를 별도로 개발한 범용로그컴퍼넌트에 붙여넣어서 Logger가 로딩되면 자동으로 어플리케이션에 붙히도록 해두었습니다.


Trackback 0 Comment 0
2008/09/30 20:42

ClickOnce로 배포된 어플리케이션 버젼 취득. ClickOnce配布アプリのバージョン取得

try
{
    //ClickOnce의 버젼 취득
    //ClickOnceのバージョン取得
    return System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString();
}
catch (System.Deployment.Application.DeploymentException ex)
{
    //ClickOnce배포가 아니므로 어셈블리버젼을 취득
    //ClickOnce配布ではないのでアセンブリのバージョンを取得
    return Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
catch (Exception ex)
{
    return "확인불가";
}
Trackback 0 Comment 0
2008/07/26 16:37

プログラムによるListの作成例。프로그램을 사용한 SPList작성샘플

   SPWeb myweb = SPControl.GetContextWeb(Context);

   myweb.AllowUnsafeUpdates = true;
   Guid listid = myweb.Lists.Add("SomeList", "", SPListTemplateType.GenericList); //静的な名前で登録。정적인 이름으로 일단 등록
   myweb.Update(); //まずWebに登録処理を行わないと修正ができない。SPWeb을 업데이트안하면 수정이 안됨.

   myweb.AllowUnsafeUpdates = true;
   SPList targetlist = web.Lists[listid];
   targetlist.Title = "実際の名前"; //画面に表示される名前を設定 화면에 표시될 이름을 설정
   targetlist.OnQuickLaunch = true; //サイドリンクバーに表示

   targetlist.Fields.Add("SomeFieldName", SPFieldType.Choice, false); //フィールドを1つ追加
   SPFieldChoice fld_historytype = new SPFieldChoice(targetlist.Fields, CONSTActionHistory.ActionType);
   fld_historytype.Title = "タイプ";
   fld_historytype.Choices.Add("A");
   fld_historytype.Choices.Add("B");
   fld_historytype.Choices.Add("C");
   fld_historytype.EditFormat = SPChoiceFormatType.Dropdown;
   fld_historytype.Update();

   targetlist.Update(); //SPListの更新

Trackback 0 Comment 0
2008/05/30 00:05

[중요] WSS스케줄 리스트의 심각한 버그, WSSスケジュールリストの深刻なバグ [SharePoint]

아시는 분들은 아시겠지만 WSS의 스케줄 리스트에는 심각한 버그가 있습니다.
심지어 이문제는 얼마전 릴리스된 WSS3.1에서도 해결이 안되었습니다.
한달에 999개 이상의 아이템이 등록된경우 1000번째 아이템부터 아예 표시가 안된다는 겁니다.
오늘 이문제에 대해서 상세히 조사를 해보았습니다만...해결책은 아직 아무도 못찾은거 같더군요.

조사한것에 대해서 보고를 하죠...
일단 아래 그림을 봐주시죠.

5월 1일 부터 시작하는 정기적인(1일단위) 스케줄을 38개를 등록해봤습니다.
5월 26일까지는 정상적으로 표시 5월 27일부터 반쯤 끊긴 상태로 아예표시가 되지 않습니다.

사용자 삽입 이미지





다음그림은 6월달의 스케줄입니다. 이것이 재미있는데...
6월19일까지만 정상적으로 나오고 6월 20일부터는 아예 표시가 안됩니다.
왜 5월은 999개가 나오고 6월은 999가 안될까요? 이유는 데이터를 뽑아올때 선택된 달의 1주일전의 데이터부터 가져와서 입니다..보통 1달치 달력에는 1일이 수요일이면 29 30 1 2 3 4 5 순으로 표시되기때문이죠..
때문에 6월치 데이터를 불러올때는 5월 24일부터의 데이터를 가져오게됩니다.그래서 아래 화면에서 실제 표시되는 데이터수가 999가 안되는거죠...이건 프로그래밍방식으로 데이터를 취득해보시면 확인해볼수 있습니다.
사용자 삽입 이미지

정확하진 않지만 원인은 Recurrece 즉 반복적인 아이템을 처리하는 방식에 기인하는거 같습니다.
일반적으로 아이템은 1개=1줄의 물리데이터로 이루어졌습니다.
정기적인 아이템역시 똑같이 1줄의 데이터로 들어가있고...DB에서 SPListItem으로 변환되는 어느시점에서 여러개의 메모리아이템으로 전환합니다.
그때 Sharepoint기본의 Maxrow 1000의 적용이 되어버리는것 같습니다. (근데 왜? 999개만 나오지??)

일단 제가 알아낸 바로는 위와 같습니다. 혹시나 ContentDatabase의 스토어드 프로시져를 확인해보기도 했지만 역시 해결이 안되더군요...


실은 이문제를 몇달전에 확인해서 정상적으로 모든 아이템이 표시되도록 스케줄 화면을 전체적으로 뜯어고친적이있습니다. 그후로 별 문제가 없구나...하고 생각했었는데

오늘 클라이언트에게서 연락이와서 스케줄을 클릭하면 에러가 난다고 해서 다시 조사를 해봤습니다.
그랬더니!!! 리스트상에 표시되지 않는 아이템을 상세화면에서 볼때도 에러가 발생하더군요..
일반스케줄은 문제가 없는데 정기적인 스케줄의 경우에만 에러가 생기더군요...

도대체!!!! 멍청하게도 MS는 이런걸 확인도 안하고 릴리스를 하는지....
게다가 왜 패치는 안나오는지....ㅠ.ㅠ.

어여좀 고쳐주시길!!!!!!!!



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

ご存じの方多いと思いますがWSSのスケジュールリストには深刻なバグがあります。
 この問題はこの間リリースされたWSS3.1でも解決がされていません。

問題とは1か月に999件以上のアイテムが登録された場合、1000件から表示がされないという問題です。
今日この問題に関して調べてみましたがまだだれも解決してないようです。

まず私が確認した内容を説明します。
下の図をみてください。

5月1日から始まる定期的(1日単位)のスケジュールを38件登録しました。
5月26日までは正常に表示されますが5月27日からは正常に出てきてくれません。

사용자 삽입 이미지



次の図は6月のスケジュールです。6月20日からは正常に表示されません。これが面白いです。
なぜ5月は999件が表示されるけど6月は足りないでしょうか。理由はデータを取得する際、選択した月の初日-7日のデータから取ってきてくるからです。普通1か月分のカレンダーには先月、来月が少しずつ含まれるからでしょう。
そんなわけで5月24日から取ってきているはずです。試しにプログラミング方式でデータを取得してみるとわかります。
사용자 삽입 이미지

当たりかどうかわかりませんが、原因は Recurrece、すなわち反復型のアイテム処理方式に問題がある気がします。
WSSではアイテム1件=1行の物理データになってます。
定期的なアイテムも同様で、どっかのタイミングでDBの1行のデータを複数のSPListItemに変換しています。
その時にWSS基本のMax行数1000件が適応されてしまうようで、Queryで行制限を増やしもききません。

とりあえず私が確認した内容は以上です。
もしかしても思ってコンテンツデータベースのどっかに設定があるのかなと思って探してみても見当たりませんでしが。

MSはアホみたいにこんなこともテストせずにリリースするんでしょうかね。。。
パッチも出さないし。。。

早く直してくれ!!!!!!!!!!!!



Trackback 0 Comment 1