• 카테고리
    • 전체 글

    • 카테고리1
    • 카테고리2
    • 카테고리3
    • 카테고리4
  • 태그
  • 방명록

'기술자료'에 해당되는 글 351건

  • 2009.08.11 VBScript를 이용한 XmlHttpRequest 하기.
  • 2009.08.04 CCNet 에서 MS Test 동작시키기 2
  • 2009.08.04 CCNet 구성하기
  • 2009.08.04 .NET Continuous Integration
  • 2009.07.20 삼각함수를 이용한 좌표계 계산 4
  • 2009.07.13 BuildForge심화교육 1
  • 2009.07.09 FireFox 고급 설정 방법
  • 2009.07.09 Windows Kernel 전체 메모리 올리기 및 L2 캐쉬 사이즈 결정하기.

VBScript를 이용한 XmlHttpRequest 하기.

기술자료/Web 2009. 8. 11. 13:01
지금 ClearQuest로 XMLHttpRequest를 해야 되는 경우가 발생되어 적용하는 중,
예제로 준 방법이 Perl 방법이라 난해 한데다 제대로 수행되지 않는 경우가 발생했다.
그래서 VBScript로 적용 선회를 했고 간신히 성공했다.
여기저기 사이트를 통해 알아본 결과 내용을 정리하면 아래와 같다.


맨 먼저 VB에서 HttpRequest 처리를 하려면, XMLHttpRequest를 지원하는 Object를 만들어야 한다.

Dim xmlhttp

xmlhttp = CreateObject("Microsoft.XMLHTTP")


위의 내용을 보면 Microsoft.XMLHTTP라는 오브젝트를 생성하게 되는데, 대개 위의 오브젝트를 생성하면 크게 버전문제와 상관 없이 동작할 것이다. 간혹 유사한 이름이긴 한데, 다른 형태의 XMLHTTP를 부르려면, XML 버전에 따라 지원하기도 하고 안하기도 하는 변덕을 구경하기 때문에, 그냥 위의 내용 처럼 적용해주면 된다.

xmlhttp.open "POST" "http://localhost/ReceiverForData.aspx", false


이번엔 위에서 정의해서 만든 HttpRequest 오브젝트로 실제 호출하기 위한 구성을 해준다.
POST 부분은 데이터가 어떻게 HttpRequest를 타고 전달되는지를 결정하게 되는데,
GET으로 하게 되면 주소값 내에 전달할 데이터가 담기게 되고, POST를 하게 되면 별도로 데이터를
추가해 넣을 수 있다. 이 때 데이터가 크거나 다양한 경우 가급적 POST로 전달하는게 좋다.

xmlhttp.setRequestHeader "Content-Type","application/x-www-form-urlencoded"

  
사실 HttpRequest는 일종의 숨겨진 웹브라우저를 띄워 웹서버를 호출 하는 것이다. 단지 사용자 눈에 브라우저가 뜬 것을 보지 못할 뿐, 뒤쪽에서는 마치 그런 짓을 하고 있는 것이다. 이 때 웹 서버를 호출하는 순간 웹서버에게 자신의 신분을 알려주는 작업을 해야 하는데, 이 작업에 해당하는게 바로 Header에 데이터를 넣는 것이다.
여기서는 현재 웹서버에 데이터를 전달 할때, form 기반으로 데이터를 전달하는 형태라는 것을 알리게 된다.

xmlhttp.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)"

  
위와 동일한 역할을 한다. 단지 이 부분은 현재 웹브라우저나, 컴퓨터 설정 상태들을 담는 내용이다. 완전히 웹서버를 속이고 자신이 마치 IE 8.0 인양 알려주는 작업이다. 간혹 일부 웹서버에서는 위와 같이 브라우저 버전이 IE, FireFox, 같은게 아니면 튕기는 작업을 당할 수 있기 때문에, 가급적 자신의 신분을 저렇게 숨겨 놓는게 제일 좋다.
xmlhttp.send "ID=OKSK&Name=OsakuSakurazo"

Post 형태의 데이터를 전송할 때 저렇게 한다. 보낼 데이터가 없으면 빼면 되고, 있다면, 변수이름=값 형태로 쭉 나열한다. 2개 이상의 값을 전송할 때는 사이에다 "&"를 넣어주도록 한다.

만일 결과물이 필요하다면....

xmlhttp.responseText


에서 빼오면 된다.(웹페이지 내에서 Text만 쭉 긁은 값이 나오게 된다.)

이 자료를 만드는데 사용한 Reference들은 다음과 같다.
http://web5.w3.org/TR/XMLHttpRequest/
http://msdn.microsoft.com/en-us/library/ms535874%28VS.85%29.aspx

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

CCNet 에서 MS Test 동작시키기

기술자료/개발도구 2009. 8. 4. 17:44

MS Test 연동하기
요즘 TDD 학습에 피치를 올리고 있기 때문에, MS Visual Studio 안의 Test Unit을 사용중이다.

(NUnit이 .NET을 위한 Unit 테스트 프레임으로 다양한 기능을 제공한다고 한다. 또한 이 CCNet 안에서도 자체 지원되며 결정적으로 CCNet Config에서 간단하게 추가할 수 있다..

그러나 아직 NUnit을 한번도 사용해 본적이 없다. )

 

그런데 CCNet 에서는 MS Test를 적용하는 방법이 직접적으로 설정 할 수 없었다. (최소한 1.4.4 버전에선....)

대신 MS Test를 일종의 작업으로 돌려, 그 결과 값을 Report에 적용해줄 수 있었다.

그 중 googling을 통해 얻은 자료 중 하나가 바로 이것이다. (CCNet 에서 MS Test 결과를 적용하는 방법이 담긴 링크)

 

시작하기 전에

이 작업을 하려면 먼저 MS Test를 실행하는 방법을 어느정도 이해해야 한다.

IDE 도구에서야 Test의 Test 실행 버튼 한번이면 되지만, 여기서 작업이라는 형태로 만들려면, 외부에서 프로그램을 어떻게 띄워야 하는지 등을 알아야 한다.

  • 솔루션 전체를 한번 빌드 한다
  • 이전에 Test 결과 값이 있는 경우 삭제하는 배치 파일을 만든다. 그리고 그 배치를 실행할 수 있게 한다.
  • MSTest를 동작시키는 프로그램을 실행하며 동작시킨다.
  • 테스트 결과물을 CCNet에 연동한다.

이제 이런 방법으로 차근 차근 하나씩 적용하도록 한다.

 

준비 작업

맨 먼저 준비해야 될 작업은 작업의 기준이 되는 CCNet 설정파일이다.

이 설정 파일을 기준으로 하나씩 추가해야 하며 각 단계를 아래에서 계속 설명할 것이다.

이전 단계에서 설명한 내용을 기반으로 CCNetConfig를 이용해 구성했다면 다음과 같은 .config 파일을 열어볼 수 있다.

(.config 파일은 C:\Program Files\CruiseControl.NET\server\ccnet.config 를 의미한다. )

<!--<ccnetconfig><configurationVersion>1.4</configurationVersion></ccnetconfig>-->
<cruisecontrol>
  <project name="CQWorkflowViewer">
    <workingDirectory>E:\Builds\CQWorkflowViewer\Works</workingDirectory>
    <artifactDirectory>E:\Builds\CQWorkflowViewer</artifactDirectory>
    <sourcecontrol type="svn">
      <trunkUrl>file:///D:/Works/000.MySVN/CQWorkflowViewer</trunkUrl>
      <workingDirectory>E:\Builds\CQWorkflowViewer\Works</workingDirectory>
      <executable>C:\Program Files\VisualSVN\bin\svn.exe</executable>
    </sourcecontrol>
    <triggers />
  </project>
</cruisecontrol>

 

 

솔루션 전체 빌드하기.

맨처음에 난 이 내용을 이해하지 못했다. 그냥 MS Test를 동작시키면 되지 않을까 했다.

하지만, MS Test가 동작하려면, 테스트 코드가 컴파일되어 있는 DLL이 필요했는데, 이 DLL은 결국 솔루션 전체 Build가 되어야 생성될 수 있다.
(Unit 테스트 자체가 이곳 저곳의 클래스와 컴포넌트들을 거의 직접 연결하므로 어쩔 수 없는 것 같다.)

이 빌드 방법은 솔루션 파일(*.sln)을 직접 컴파일 해야 되기 때문에, Visual Studio의 힘을 빌릴 수 밖에 없다.

그래서 이 Task를 하나씩 조립해서 하나의 Task로 만들면 다음과 같다.

<devenv>
                <solutionfile>"E:\Builds\CQWorkflowViewer\Works\CQWorkflowViewer.sln"</solutionfile>
                <configuration>Debug</configuration>
                <buildtype>Build</buildtype>
                <executable>"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.com"</executable>
                <buildTimeoutSeconds>90</buildTimeoutSeconds>
 </devenv>

뭔가 낯선 이상한 XML 엘리멘트들이 튀어 나왔다.

이 작업 devenv라는 컴파일 구성요소를 설정하는 내용으로 위의 내용은 특정 솔루션을 전체 빌드하기 위한 내용이다. 

각 부품들을 하나씩 살펴보자.

solutionfile 부분은 이 프로젝트의 솔루션 파일의 위치를 정해준다. 작업 디렉토리를 기준으로 해당 솔루션 파일이 어디 있는지 확인해서 해당 내용을 적용해주면 된다.

configuration 부분은 전체 빌드 형태를 결정해준다. Debug 모드인지 Release 모드인지 등을 결정하는 것이다.

excutable에는 이 빌드 작업을 수행할 프로그램을 선택한다. x64나 기타 다른 위치에 설치 하지 않았다면 위의 경로로 넣으면 된다. 만일 틀리다면 devenv.com이 있는 위치를 찾아

넣어주도록 한다.

나머지는 필자도 잘 모르지만 일단 테스트해 본 결과 저 정도로 마무리 지으면 일단 제정신으로 도는 것 같다.

 

위의 XML 부품을 구성하고 이해했다면, 이제 ccnet.config 안에 끼워 넣도록 한다.

이 부품은 다음의 경로에 추가해주면 된다.

//cruisecontrol/project/tasks

경로라고 말한 부분은 바로 엘리멘트 트리 순서이다.

XML로 표현하면 다음과 같은 구성이 되어줘야 한다는 것이다.

     <cruisecontrol>

        <project ...>

           <tasks>(여기를 의미하는 것)</tasks>

        </project>

     </cruisecontrol>

우리 원본 ccnet.config에 보면 tasks 라는 엘리멘트를 볼 수 없는데, 이 부분은 추가해줘야 한다.

자, 이렇게 해서 조립하면 다음과 같은 ccnet.config가 된다.

 

<!--<ccnetconfig><configurationVersion>1.4</configurationVersion></ccnetconfig>-->
<cruisecontrol>
  <project name="CQWorkflowViewer">
    <workingDirectory>E:\Builds\CQWorkflowViewer\Works</workingDirectory>
    <artifactDirectory>E:\Builds\CQWorkflowViewer</artifactDirectory>

    <tasks>

<devenv>
                <solutionfile>"E:\Builds\CQWorkflowViewer\Works\CQWorkflowViewer.sln"</solutionfile>
                <configuration>Debug</configuration>
                <buildtype>Build</buildtype>
                <executable>"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.com"</executable>
                <buildTimeoutSeconds>90</buildTimeoutSeconds>
 </devenv>

    </tasks>
    <sourcecontrol type="svn">
      <trunkUrl>file:///D:/Works/000.MySVN/CQWorkflowViewer</trunkUrl>
      <workingDirectory>E:\Builds\CQWorkflowViewer\Works</workingDirectory>
      <executable>C:\Program Files\VisualSVN\bin\svn.exe</executable>
    </sourcecontrol>
    <triggers />

  </project>

</cruisecontrol>

 

테스트 결과 파일 삭제하기.

MS Test를 돌리게 되면 그 결과물을 XML 형태로 만들어 주게 되는데, 이 파일이 위치해 있으면 MS Test가 무조건 실패하게 된다.

그래서 MS Test를 동작 시키기 전에 반드시 해당 파일이 있으면 낼름 지워주는 기능을 하는 배치 파일(.Bat 또는 .Cmd)을 만들어 주도록 한다.

실제 이 결과물이 어디에 저장되는지는 다음에 정의할 MS Test 관련 설정을 할 때 결정되는데, 여기서는 그 결과물이 테스트 프로젝트가 있는

위치에 저장된다는 가정하에 설정하도록 하겠다.

먼저 적당한 위치에 .Bat 도는 .Cmd를 만든다. 여기서는 E:\Builds\CQWorkflowViwer 폴더에 deleteReport.bat라는 파일을 만들도록 하겠다.

그 내용은 다음과 같다.

IF EXIST E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer\testResults.trx DEL /f E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer\testResults.trx

원리는 간단하다. 파일이 있으면 지우고 없으면 지우지 않는다. 뭐 그정도?

그리고 난 뒤에 위에서 만든 작업 처럼 이번 것도 작업으로 만들어 준다.

이번에는 단순히 실행만 하면 되므로 devenv 엘리멘트가 아닌 exec 엘리멘트를 사용한다.

이 엘리멘트로 구성하면 다음과 같이 만들 수 있다.

<exec executable="deleteReport.bat">
   <baseDirectory>E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer</baseDirectory>
   <buildArgs></buildArgs>
</exec>

특별한 설명은 필요 없지만, 일단 간단하게 각 엘리멘트 및 속성 값을 설명하면 아래와 같다.

exec는 이 작업이 단순 실행하는 작업을 의미하는 것이다. 실행할 내용은 executable 이라는  속성값에 값을 넣으면 된다.

baseDirectory는 이 실행이 진행되는 위치를 의미한다.

이 내용을 지금까지 만든 설정 파일이 추가해 보자. tasks는 앞서 만들었으니 이제 그 다음에 넣어주면 될 것이다.

<!--<ccnetconfig><configurationVersion>1.4</configurationVersion></ccnetconfig>-->
<cruisecontrol>
  <project name="CQWorkflowViewer">
    <workingDirectory>E:\Builds\CQWorkflowViewer\Works</workingDirectory>
    <artifactDirectory>E:\Builds\CQWorkflowViewer</artifactDirectory>

    <tasks>

<devenv>
                <solutionfile>"E:\Builds\CQWorkflowViewer\Works\CQWorkflowViewer.sln"</solutionfile>
                <configuration>Debug</configuration>
                <buildtype>Build</buildtype>
                <executable>"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.com"</executable>
                <buildTimeoutSeconds>90</buildTimeoutSeconds>
 </devenv>   

      <exec executable="deleteReport.bat">
         <baseDirectory>E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer</baseDirectory>
         <buildArgs></buildArgs>
      </exec>

</tasks>   

<sourcecontrol type="svn">
      <trunkUrl>file:///D:/Works/000.MySVN/CQWorkflowViewer</trunkUrl>
      <workingDirectory>E:\Builds\CQWorkflowViewer\Works</workingDirectory>
      <executable>C:\Program Files\VisualSVN\bin\svn.exe</executable>
</sourcecontrol>

      <triggers />

  </project>

</cruisecontrol>

 

MS Test 동작시키기.

모든 준비작업은 끝났다. 이제 실제적으로 동작해야하는 작업을 수행한다.

이번에는 MSTest를 동작시킨다. 이를 위해서 하는 방법은 위의 방법과 거의 동일하다.

단지, 몇가지 MSTest를 동작시키기 위한 파라미터 값만 조정하면 된다.

<exec executable="C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\mstest.exe">
   <baseDirectory>E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer</baseDirectory>
   <buildArgs>/testcontainer:bin\debug\TestProjectCQWorkflowViewer.dll  /resultsfile:testResults.trx</buildArgs>
   <buildTimeoutSeconds>90</buildTimeoutSeconds>
</exec>  

 

앞서 테스트 결과 삭제 목록의 내용 중에서 특이 점은 buildArgs 부분에 파라미터 값들이 정의된다는 사실이다.

테스트를 동작시키기 위한 DLL 정보와 테스트 결과를 저장하기 위한 그 리포트 출력용 파일 이름 정도이다.

실행할 주체가 mstest.exe 인 C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\mstest.exe 정도 뿐이다.

여기서 경로등을 주의해서 넣어주면 된다.

만일 mstest의 특별한 기능들이 더 필요한 경우 http://msdn.microsoft.com/en-us/library/ms182489%28VS.80%29.aspx 를 참고해서

파라미터 값들을 조정해주면 된다.

이를 추가하면 아래와 같이 된다.

<!--<ccnetconfig><configurationVersion>1.4</configurationVersion></ccnetconfig>-->
<cruisecontrol>
  <project name="CQWorkflowViewer">
    <workingDirectory>E:\Builds\CQWorkflowViewer\Works</workingDirectory>
    <artifactDirectory>E:\Builds\CQWorkflowViewer</artifactDirectory>

    <tasks>

<devenv>
                <solutionfile>"E:\Builds\CQWorkflowViewer\Works\CQWorkflowViewer.sln"</solutionfile>
                <configuration>Debug</configuration>
                <buildtype>Build</buildtype>
                <executable>"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.com"</executable>
                <buildTimeoutSeconds>90</buildTimeoutSeconds>
 </devenv>   

      <exec executable="deleteReport.bat">
         <baseDirectory>E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer</baseDirectory>
         <buildArgs></buildArgs>
      </exec>

<exec executable="C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\mstest.exe">
   <baseDirectory>E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer</baseDirectory>
   <buildArgs>/testcontainer:bin\debug\TestProjectCQWorkflowViewer.dll  /resultsfile:testResults.trx</buildArgs>
   <buildTimeoutSeconds>90</buildTimeoutSeconds>
</exec>

</tasks>   

<sourcecontrol type="svn">
      <trunkUrl>file:///D:/Works/000.MySVN/CQWorkflowViewer</trunkUrl>
      <workingDirectory>E:\Builds\CQWorkflowViewer\Works</workingDirectory>
      <executable>C:\Program Files\VisualSVN\bin\svn.exe</executable>
</sourcecontrol>

      <triggers />

  </project>

</cruisecontrol>

 

 

리포트 결과를 CCNet에 보고하기.

이제 마지막 부분이다. 위의 내용 까지는 최종 테스트 결과물을 만드는 과정이다. 이제 그 테스트 결과물을 빌드 결과물로써 나타내게 해주면 된다.

지금까지는 tasks 안에 들어갔지만, 이번에는 tasks 밖에서 publishers 라는 엘리멘트 안에 작업을 해주어야 한다.

기본적인 작업들이 들어가는데, 그 중 추가적인 작업 결과물은 여기서 처리해주어야 한다.

결론적으로 해당 처리를 위한 XML은 아래와 같다.

<publishers>
   <merge>
      <files>
         <file>E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer\testResults.trx</file>
       </files>
   </merge>
   <xmllogger />

</publishers>

 

publishers 나, merge, files은 XML 형식에 맞추기 위해 필요한 내용이고, xmllogger는 다른 기능을 위해 준비된 내용이다.

우리가 집중할 부분은 file 부분으로 이 안에 xml 형식으로 된 리포트 파일만 걸어주면 된다. 앞에서 예제로 설정한 내용을 기준으로 본다면,

테스트 작업 후, E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer\testResults.trx 라는 파일이 생기게 된다.

 

자 이것을 추가하면 아래와 같이 정리된다.

<!--<ccnetconfig><configurationVersion>1.4</configurationVersion></ccnetconfig>-->
<cruisecontrol>
  <project name="CQWorkflowViewer">
    <workingDirectory>E:\Builds\CQWorkflowViewer\Works</workingDirectory>
    <artifactDirectory>E:\Builds\CQWorkflowViewer</artifactDirectory>

    <tasks>

<devenv>
                <solutionfile>"E:\Builds\CQWorkflowViewer\Works\CQWorkflowViewer.sln"</solutionfile>
                <configuration>Debug</configuration>
                <buildtype>Build</buildtype>
                <executable>"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.com"</executable>
                <buildTimeoutSeconds>90</buildTimeoutSeconds>
 </devenv>   

      <exec executable="deleteReport.bat">
         <baseDirectory>E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer</baseDirectory>
         <buildArgs></buildArgs>
      </exec>

<exec executable="C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\mstest.exe">
   <baseDirectory>E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer</baseDirectory>
   <buildArgs>/testcontainer:bin\debug\TestProjectCQWorkflowViewer.dll  /resultsfile:testResults.trx</buildArgs>
   <buildTimeoutSeconds>90</buildTimeoutSeconds>
</exec>

</tasks>   

<sourcecontrol type="svn">
      <trunkUrl>file:///D:/Works/000.MySVN/CQWorkflowViewer</trunkUrl>
      <workingDirectory>E:\Builds\CQWorkflowViewer\Works</workingDirectory>
      <executable>C:\Program Files\VisualSVN\bin\svn.exe</executable>
</sourcecontrol>

      <triggers />

<publishers>
   <merge>
      <files>
         <file>E:\Builds\CQWorkflowViewer\Works\TestProjectCQWorkflowViewer\testResults.trx</file>
       </files>
   </merge>
   <xmllogger />

</publishers>

 

  </project>

</cruisecontrol>

 

이제 실제로 서버를 실행해 보면, MSTest까지 수행하고 그 결과 값에 따라 Build 성공 실패가 보이기 시작할 것이다.

 

PS. 웹에서 이 결과 리포트를 보고 싶을때.

굳이 필요한 기능은 아니지만, 빌드 결과물을 보여주는 웹화면에서 이 Test 결과 내용도 보고 싶다면 추가적인 작업을 해야 한다.

CCNet의 웹을 띄우기 위해서는 http://<<서버이름>>/ccnet 이라고 치면 된다.(설치 중 Web Url을 변경하거나 조작한 경우 다른 이름이 될 수 있다.)

그래서 화면이 뜨면 각종 리포트를 위한 웹 화면을 볼 수 있는데, 그 중 이 Test 결과도 볼 수 있다.

그러나 MS Test는 기본 값이 아니기 때문에, 이 리포트용 웹사이트에 한가지 작업을 더 수행해주어야 한다.

 

작업을 하려면, 맨 먼저 해당 웹사이트가 있는 폴더로 이동한다.

CCNet이 설치된 폴더에서 webdashboard 라는 폴더이며, 그 안에 있는 dashboard.config 파일을 열도록 한다.

 

그리고 <xslReportBuildPlugin description="....... > .... </xslReportBuildPlugin> 항목들이 쭉 늘어선 곳에다 다음 줄을 추가한다.

    <xslReportBuildPlugin description="MSTest Report" actionName="MSTESTReport" xslFileName="xsl\MsTestSummary.xsl"/>

SNAG-0050.png

 

이제 다시 웹을 띄운 후 프로젝트를 클릭해서 들어간다.

SNAG-0053.png

오른편쪽에 항목들 중 자신이 실패한 빌드 번호를 클릭한다.

SNAG-0054.png

이번엔 왼편에 Report나 Log 목록들이 있는데 그 중 MsTest Report를 클릭한다.

SNAG-0055.png

 

오른편에 해당 오류가 발생한 내용이 표시된다.

SNAG-0056.png

 

이 글은 스프링노트에서 작성되었습니다.

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

CCNet 구성하기

기술자료/개발도구 2009. 8. 4. 17:44

설치 및 구성하기.

설치 쪽은 최재훈 님께서 마이크로스프트웨어에 기고했던 글을 참고하면 된다.

http://kaistizen.net/EE/index.php/imaso/continuousintegration_2008_04/

 

일단 기본적으로 설치하면 각 사용할 파일들은 C:\Program Files 위치에 저장된다.(x64에서는 다른 위치에 저장될 수 있지만, 아직 테스트 해보지 않았음)

맨처음 CCNet 서버를 설치하면 설치 완료 후 별다른 반응을 보이지 않는다.

시작 -> 모든 프로그램 -> CruiseControl.NET -> CruiseControl.NET 을 실행하면 도스 창에 무언가 버글 버글 뜨고, 화면이 멈춰 있는 것을 볼 수 있다.

SNAG-0030.png
이게 콘솔 화면으로 띄우는 CCNet 인데, 설정 디버그나 결과들을 확인하고 싶을 때 이렇게 해서 확인하면 된다.

만일 설정 파일이나 설정 정보가 안정적으로 동작한다고 생각된다면, 이런 식의 도스 창 같은 것을 띄우지 않고 서비스로 동작하게 할 수 있다.

시작 -> 제어판 -> 관리 도구 -> 서비스 에 들어가서 CruiseControl.NET Server 서비스를 시작해 주면 된다.

SNAG-0031.png

만일 서버 리붓후에도 계속 켜지게 하고 싶은 경우에는 시작 유형을 수동에서 자동으로 변경해주면 된다.

 

주의 : 만일 서비스 상태로 띄우다가, 도스창(디버그용)을 띄우면 안된다. 만일 도스창용으로 띄우고 싶으면, 반드시 서비스로 동작 중인 CCNet을 죽이고수행해야 한다.

 

설정 파일 구성하기

CCNet 의 설정파일은 C:\Program Files\CruiseControl.NET\server 폴더 안에 있다. 파일 이름은 ccnet.config 라는 이름으로 되어 있으며, 이 안의 값을 어떻게 정의하냐에 따라, 빌드 서버가 어떻게 동작하는지를 결정하게 된다. 모든 내용은 XML 기반으로 구성되어 있어, 가독성에서 꿀리는 부분은 없다.

그.러.나. 이 안의 각 Element 들이 어떻게 들어가는지 값들이 어떻게 들어가는 지에 대한 설명은 모두 영어로 된 도움말의 도움을 받아야 한다.

http://confluence.public.thoughtworks.org/display/CCNET/Configuring+the+Server 를 보게 되면, 설정 파일 내에 설정할 수 있는 다양한 내용들이 있다.

간단하게 테스트 하는 수준이였다면, 내가 찾아들어간 방식대로 한번 시도 해보자.

 

  1. CCNetConfig 프로그램 실행하기.

    앞서 언급한 프로그램 중 하나이다. 설정 파일인 XML 파일을 설정하는데 Visual Studio의 속성값 편집하듯이 편하게 구성되어 있다.
    물론 전체적인 내용이 딱 한눈에 안들어오긴 하지만, 이 정도의 가이드가 있다면 큰 도움이 될 것이다.

    실행하면 아래와 같은 화면이 떨렁 나올 것이다.
    SNAG-0032.png
    당황하지 말고 File -> Open을 해서 C:\Program Files\CruiseControl.NET\server 폴더 안의 ccnet.config 파일을 선택한다.

    Open 할때, OpenFileDialog 에서 아래쪽에 있는 Version을 꼭 선택해주시기 바란다. 현재 CCNet이 설치된 버전을 확인해서,
    1.1인지, 1.2 인지..아니면 1.4 인지를 꼭 체크해서 그에 맞는 버전을 선택한다.
    SNAG-0033.png

    열리면 아래와 같이 왼쪽에 트리 형태의 내용이 뜨게 된다.
    SNAG-0034.png

  2. 새로운 프로젝트를 추가하기.
    자 이제 실제 Build 작업을 수행할 프로젝트를 선택한다. File 이라는 메뉴 아래에 있는 아이콘을 선택하거나 CruiseControl 이라는 항목에서 오른쪽 버튼을 눌러 컨텍스트 메뉴에서 프로젝트 추가를 하던 어떤 식이든 Add Project를 하도록 한다.
    SNAG-0035.png
    프로젝트 이름을 입력하는 창에 이번에 Build 할 솔루션 이름을 넣는다. (달라도 되는지는 테스트 해본적이 없어서 -_-;;)
    SNAG-0036.png
  3. 프로젝트 기본 속성값 넣기.
    이제 프로젝트에 대한 기본 속성값을 넣도록 한다. 왼쪽 트리에서 입력한 프로젝트 명을 클릭하면 오른쪽에 속성 창이 뜬다.
    SNAG-0038.png  
    언어적 장벽이 큰 문제가 없다면 아래쪽 간단한 설명을 도움받아 값을 넣어주면 된다. 
    이 중 최소 컴파일이 되기 위한 내용들을 채워보자면 다음과 같다.
    여러가지 내용들이 들어갈 수 있지만 최소 다음 내용 정도를 채우면 된다.

    • (Name) : 이름. 제일 중요하기도 하지만, 프로젝트 만들때 결정되니까 가급적 손대지 말았으면 좋겠다.
    • ArtifactDirectory : 프로젝트에 대한 산출물 디렉토리. 상대 경로로 설정되어 있다면 CruiseControl.NET 서버가 설치되어 있는 디렉토리에 프로젝트 이름을 기준으로 구성된다. 산출물 디렉토리는 빌드 로그, 배포물 등등 빌드의 결과물로 저장될 내용들이 저장되는 장소이다. 가급적 이 폴더는 프로젝트 별로 틀리게 설정해주어야 빌드에 대한 각종 결과물들이 정상적으로 보이게 된다. 단 경로를 입력할 때 중간에 공백이 들어가 있더라도 쌍따옴표 표시(")는 필요없다.
    • SourceControl : 소스 버전 관리 도구에 대한 설정을 한다. 이 CCNet에서 자동으로 최신버전을 받아서 빌드를 수행할 때 소스를 받게되는 위치를 의미한다.
    • WorkingDirectory : 프로젝트에 대한 작업 디렉토리. The Working Directory for the project (this is used by other blocks). 상대 경로로 설정되어 있다면 CruiseControl.NET 서버가 설치되어 있는 디렉토리에 프로젝트 이름을 기준으로 구성된다. 작업 디렉토리는 통합 수행을 하는 프로젝트에서 체크아웃된 버전을 포함한다. 이 경로는 프로젝트 별로 틀리게 설정해주어야 빌드시 오류가 발생되지 않는다.  단 경로를 입력할 때 중간에 공백이 들어가 있더라도 쌍따옴표 표시(")는 필요없다.    
  4. 채운 내용을 예제로 캡처한 내용이 다음과 같다.
    (각 값은 필자 프로젝트를 기준으로 맞춘 내용이므로 적절히 자신의 환경에 맞게 구성해 주어야 한다. )
    프로젝트 명 : CQWorkflowViewer

    산출물 디렉토리 : E:\Builds\CQWorkflowViewer
    작업 디렉토리 : E:\Builds\CQWorkflowViewer\Works
    소스버전관리 : SubVersion,
        - 서브 버전 프로그램 위치(소스버전관리 형태에 따라 다름) : C:\Program Files\VisualSVN\bn\svn.exe
        - 서브버전 URL : file:///D:/Workfs/000.MySVN/CQWorkflowViewer
        - 소스 처리 경로 : E:\Builds\CQWorkflowViewer\Works
    SNAG-0039.png

  5. 저장 버튼을 눌러 저장한다.

 

동작 확인

구성이 완료되었으면 이 빌드가 정상적으로 동작하는지 꼭 확인하도록 한다.

서버를 무작정 동작시키진 말고, 콘솔 모드로 동작하게 끔 한다.

    시작 -> 모든 프로그램 -> CruiseControl.NET -> CruiseControl.NET

을 클릭해서 실행한다. 

일단 서버는 레디상태. 자 이제 실제 빌드를 강제 동작시켜 본다.

 

이 때 간단하게 시도해 볼 수 있게 해주는 도구가 바로 CCTray 이다.

CCTray를 일단 설치해 놓고 무조건 실행해보자. 그러면 화면 오른쪽 아래에 CC 라는 아이콘이 보인다.

SNAG-0040.png

거기서 오른쪽 버튼을 클릭해서 열어 보면 메뉴가 나오는데 그 중 Settings에 들어간다.

SNAG-0041.png

설정 화면이 뜨면 거기서 Add 버튼을 클릭해서 들어간다.

SNAG-0042.png

 

빌드 서버가 몇개든, 프로젝트가 몇개든, 여기서 Add를 통해 계속 추가해주면 된다.

이제 설정 화면이 뜨는데, 그 안에 서버를 추가해주면 된다. Add Server 버튼을 클릭한다.

SNAG-0043.png

Add Server 버튼을 클릭하면 총 3가지 유형의 서버를 선택할 수 있다. 원격에서 CCNet 서버를 접근하는 방법을 넣는 방법들인데,

IIS를 이용하여 접속하여 CCNet에서 제공하는 Dashboard 사이트를 통해서 접근하는 방법.

.NET Remote 기법을 이용하여 직접 연결하는 방법(이 때는 포트를 21234를 사용한다.)

CCNet 이 아닌 CC for Java 같은 솔루션  접근을 위해 HTTP GET 메소드를 사용하는 특별한 페이지들을 이용하여 접근하는 방법이 있다.

대개의 경우는 2번째 방법을 통해 접근하는게 좋다. (첫번째 방법으로 해보지는 못했다.)

SNAG-0045.png

자 그럼 서버 목록에 서버가 하나 추가되었고, 그 서버에서 Build 처리가 가능한 프로젝트가 하나 뜨게 된다.

즉 CCTrary에서 제어할 프로젝트(빌드 서버내에 다양한 프로젝트를 넣을 수 있으므로)를 선택적으로 적용할 수 있게 된다.

SNAG-0046.png

자 OK 해서 일단 설정 창을 닫고 다시 CCTray 아이콘을 더블 클릭하거나 메뉴에서 Show Status Window를 클릭하도록 한다.

그러면 아래와 같은 창이 뜨면서 아까 선택한 서버의 프로젝트가 트리형식으로 나타난다.

SNAG-0047.png

자 이제 추가한 프로젝트를 선택한 후 Force Build를 클릭하도록 한다.

만일 실패하면 CC 아이콘이 빨개 지고, 성공하면 녹색으로 나오게 된다.

 

도스 창을 보게 되면 처음에 대기화면에서 무언가 화면 가득 쌓여 있다. 아이콘이 빨갛게 된 경우에는 반드시 그 오류 내용을 도스창을 통해 찾아보도록 한다.

SNAG-0048.png

 

주의!

여기서는 설정 오류 뿐만 아니라, 빌드 하다가 발생되는 오류나, 기타 등등 다양한 사유에서 발생되는 모든 형태의 오류로 인해 아이콘이 빨개진다.

반드시 정상적으로 빌드 되는 소스를 가지고 테스트를 진행하도록 한다.

그래야 설정이 정상적이라는 것을 믿고 진행할 수 있는 것이다.

하다 못해 윈도우 창만 떨렁 띄우는 프로젝트라도 미리 컴파일 해서 아무 이상이 없는지 꼭 확인해주도록 한다.

 

성공하면 아래화면 처럼, 맨 믿줄에 Integration complete: Success로 뜨고 아이콘도 녹색으로 바뀐다.

SNAG-0049.png

이 글은 스프링노트에서 작성되었습니다.

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

.NET Continuous Integration

기술자료/개발도구 2009. 8. 4. 17:44

애자일 방법론들을 가만히 보면 몇가지 공통 사항이 있다.

가장 특징적인 하나는 TDD(Test Driven Developing)이고 다른 하나는 CI(Continuous Inegration)이다.

전자는 일단 범위도 넓고, 중요도도 무척 높지만, 여기까지 언급하기에는 범위외이기 건너간다.

 

CI란  지속적인 통합 빌드로 주기적으로 계속 통합하여 빌드를 유지하는 것이다.

이게 중요한데, 개인이 만드는 소프트웨어에 자신의 IDE 도구들을 사용하여 필요할 때마다 빌드를 하고 테스트를 하겠지만,

팀 단위의 개별 개발을 할 때는 전혀 다른 문제다. 대부분 CI를 하지 않는 곳에서는  BingBang 빌드라고 하여,

특정시점(중간 통합 단계)에 다른 이들의 코드를 한꺼번에 싣는 작업을 수행하곤 한다. 운좋으면 짧은 시간에 완성할 수 있겠지만,

대부분은 컴파일 부터 오류가 발생되어 모두 나자빠지고 그 부분의 수정에 온 힘을 기울이게 된다.

(특히 의존성이 높은 클래스나 컴포넌트의 수정으로 인해 발생되는 오류들이 무척 많은 편이다.)

그렇다고, 매번 누군가가 최신버전을 다운 받은 후 매일 매일 빌드하는 짓도 곤혹스럽다. 바로 이런 작업을 수행하는 도구를 필요로 했다.

 

맨 처음에는 이 도구를 개발할까 생각했다.

혼자 이런 저런 기능을 파악하고, Visual Studio의 프로젝트 파일을 열어 이런 저런 조사를 하면 뭔가 나오지 않을까 했다.

하지만, 생각보다 내용도 많고, 범위도 컸다. 최소한의 기능만으로 만든다고 해도, SCRUM - 30d 기준으로 2~3 sprint(약 3달)정도의

개발 공정이 필요했다. 게다가 당장 확장을 하려면 이 또한 큰 작업이 될 공산이 컸다.

이 때 우연히 찾은 도구가 있는데, 바로 CruiseControl.NET 이였다.

 

링크 따라가기

아무 생각 없이 찾았던 도구인데, 링크에 링크를 따라가다 찾게 되었다.

맨 처음에는 SCRUM 관련 자료를 찾는 도중 애자인 인 여의도라는 블로그에서 허드슨(CS Server Hudson) 이라는 도구를 보여주었다.

이건 뭐야 하는 마음에 허드슨 관련 자료를 찾다가 이번엔 Toby's Epril 이라는 블로그를 통해  Atlassian 이라는 회사를 알게 되었다.

이건 또 뭐야 하면서 무슨 솔루션 이름인 줄 알았는데 알고 보았더니 각종 제품 및 도구를 만드는 회사였다.
게다가 이번에 읽고 있는 Scrum and XP from the Trenches에 보면 각 Sprint와 Task 정보를 Jira 라는 도구로 일부 저장 관리 한다고 했다.

그 Jira라는 도구를 만든 회사가 바로 이 Atlassian 이라는 회사였다.  이번에는 이 회사에서 만든 CI 도구가 있는데,

애석하게도 라이센스가 있었다. 가격을 지불해야 했고, 몇가지 조정적인 작업이 필요했다.

지금 있는 회사에서도 범용적으로 빌드 관리할 때 사용되는 Build Forge라는 제품을 판매하고 있다. - 즉 굳이 이런 도구 찾을 필요는 없었을 것이다. -

 

하지만, 애석하게도 그 놈의 Build Forge가 다양한 플랫폼에 다양한 형태의 Build를 제공해야 하기 때문에, 조작이 감이 딱 오지 않았다.

더 결정적인 것인 그 놈의 툴의 가격이 예술을 넘어 사치품에 가깝게 만들어 버렸다. 많아봐야 나 혼자쓰는데 이건 좀 너무 하다 싶었다.

 

결국 Atlassian에서 만든 CI나 Build Forge나 일단, 가볍게 동작하며 라이센스에 연연하지 않아도 될법한 제품을 찾아야 됬다.

어차피 개인 내지 많아봐야 1~2명만 쓸 예정이기에 굳이 다양한 기능 보다는 어느 정도 통합빌드를 지속적으로만 할 수 있으면 되겠다는 생각에 찾기 시작했다.

검색어를 Continuous Integration .NET 으로 찾아보았고,

그 결과 찾은 것이  CruiseControl.NET 이였다.

 

특징.

일단 Open Source License 정책을 가지고 있다. 그래서 배포나 구성에 있어 제약이 없었다. 그리고 .NET 기반의 프로젝트를 간단하게 빌드 할 수 있고,

설치 프로그램도 의외로 작았다. 다양한 버전 관리 도구들과 연결 되어 Build 전 최신 버전, Base Line의 Source를 알아서 가져와, 필요할 때 원하는 만큼

Build를 수행할 수 있다. 다양한 외부도구들을 지원해 가장 마음에 드는게 바로 Tray Icon으로 나오는 CCTray라는 프로그램이였다.

필요시 원격에서 강제로 Build를 할 수도 있고, 현재 맨 마지막 Build 결과도 바로 확인할 수 있다.

관리자들이 참 좋아하는 빌드 깨트린 자가 누구인지도 명확히 찾을 수 있다. ㅋ

 

다운 받는 곳.

CCNet은 SourceForge 중 CCNet 프로젝트에서 다운 받는다.

    http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET

각 버전 별로 나열되어 있는데, 특정 버전을 선택하면 아래 쪽에 관련 프로그램 별로 다운 받을 수 있는 링크들이 나온다.

CruiseControl.NET-1.X.X-Setup.exe 라고 적힌 파일이 바로 이 CCNet 서버의 내용으로 이 파일은 반드시 다운 받도록 한다.

CruiseControl.NET-CCTray-1.X.X-Setup.exe라고 적힌 파일도 다운 받는데, 이 파일이 원격에서 CCNet 서버의 정보를 확인하거나 강제 빌드 시킬 수 있도록 하는 실시간 원격 확인 도구이다.

 

일단 위의 파일들이 준비되었으면 이번에는 CCNet 설정을 쉽게 도와주는 도구인 CCNet Config라는 도구를 다운받는다.

  http://ccnetconfig.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=17322#DownloadId=43769

CCNet 서버 설정은 모두 XML 형식으로 정의하게 끔 되어 있는데, 처음부터 이 XML 형식의 내용을 넣기에는 메뉴얼 보면서 넣기가 영 귀찮고 힘들다.
(어느정도 익숙해지면 쉽다고는 하는데, 그닥... 감은 안온다.) 그래서 위의 도구를 다운 받아 설치하도록 한다.

 

 

이 글은 스프링노트에서 작성되었습니다.

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

삼각함수를 이용한 좌표계 계산

기술자료/.NET 2009. 7. 20. 19:08
삼각함수를 이용하여 좌표계를 계산하는 로직을 정리했다.
리펙토링 건덕지가 무척 많아 솔직히 손을 많이 대야 겠지만,
그래도 나름대로 작성한 부분이 있어 정리한다.

만든 내용을 정리하자면, 사각형 두개를 그린 뒤, 해당 사각형의 중심좌표를 구한다.
그리고 그 중심좌표들을 양끝으로 하는 선을 긋는다.
이 때, 선과 사각형이 만나는 좌표를 구하는 공식을 만들어봤다.


이 작업의 시작은 시작점과 끝점으로 연결된 직선을 빗변으로한 삼각형이라고 생각한 뒤,
각도를 구해야 한다. 삼각형의 특정 부위의 값만 구하면 각도 구하는 방법이 무척많다.
이 때 바로 등장하는게 삼각함수 였던 것이다.

맨 먼저 가정 부터 시작한다.
2개의 사각형이 있고, 좌표계에서 위치와 크기를 정확히 알고 있다는 데서 시작한다.
사각형은 총 4개의 점에서 출발하는데, 반드시 직각사각형이며,
각 좌표 값은 직관적 계산을 통해 얻어 올 수 있어야 한다. (한 점과 너비, 높이만 알면 사각형이 만들어진다.)
아래의 그림의 사각형은 특정좌표 값을 이미 가지고 있다는 가정에서 출발한다.
(컴퓨터로 그래픽 객체를 다루어보았다면 쉽게 알 수 있다.)

각 좌표나 값들이 정의되었으면, 이제 해야 하는 것은 각도를 구하는 것이다.
구해야 되는 각도는 radian 이라고 하는 삼각함수 계산용 각도다.
(일반 각도랑 틀림 : 참고 -> 위키피아 라디안 )



이 라디안을 구하기 위해서는 아크 탄젠트라고 불리는 삼각함수를 써야 한다.
보통 탄젠트 = 높이 / 밑변 으로 계산된다. 이 때 탄젠트에 걸친 각도 값을 구하기 위해서는 그의 역함수인
아크 탄젠트를 써야 한다. 즉 arctan(높이/밑변) 하면 radian 값이 나오게 된다.


자 이제 각도를 구했으니, 실제 목적인 사각형과 직선과 만나는 위치에 대한 좌표를 구해야 한다.
최소한 좌표 중 X 좌표는 구할 수 있다. 사각형의 중심점에서 사각형 너비/2 를 빼면 된다.
그러면 X 좌표가 나온다. 그러나, Y 좌표는 그냥 찍으면 모를까, 정확한 값은 나오지 않는다.
이 때 실제적인 삼각함수를 적용한다.

여기서 우리가 아는 값은 알고 싶은 좌표의 X 좌표. 그리고 각도(Radian 값이다.)이다.
이 두개의 값을 이용해서 뽑는 방법을 찾아보자.


먼저 알고 싶어하는 Y 좌표를 길이로 생각하자. 중심점을 기준으로 일정 양만큼 올라가면,
Y 좌표가 나오게 된다. 이 때 일정 양을 b' 라고 한다. 즉 좌표 값이 아닌 길이로 생각하는 것이다.

마찬가지로 중심점을 기준으로 X 좌표간의 차이를 a' 라고 한다.

잘 보면, 삼각형이 다시 만들어진다. a'가 밑변, b'가 높이인 형태의 삼각형인 것이다.
이를 tangent를 이용해서 값을 구하는 것이다.

tangent의 공식을 보면 이렇다.
tan(radian) = 높이 / 밑변.

이 중 우리가 구해야 할 값이 높이라고 할 때, 그 값을 b' 라고 하면,

tan(radian) = b' / 밑변.

이 값들을 우리가 알고 있는 값들로 치환하면,

tan(R < -이건 앞의 아크 탄젠트로 구했다.) = b' / a'

이걸 양변에 a'를 곱하면,

a' * tan(R) = b'

끝.

그래서 구한 b' 값을 중심점 좌표의 Y에서 b' 만큼 빼거나 더하면 된다.


앗.. 여기서 중요한 점.
b' 값을 더하거나 빼야 한다고 했는데, 그 기준이 무척 중요하다.
언제 빼고 언제 더해야 할까?

사각형을 수평으로 반으로 나눈 다음, 직선이 위를 바라보면 뺀다.
역으로 아래를 바라보면 더하면 되는 것이다.
(이 부분은 수학적으로 판단하기 보다, 컴퓨터 그래픽 좌표계로 판단하면 쉽다.)

아래의 그림은 위의 공식을 이용해 계산된 결과 값이다.
까만색 상자에서 출발해서 흰색 상자에서 끝난다.
직선은 각 상자의 중심점을 연결했다.
위의 계산식의 결과로 나온 점을 찍어보면,
직선과 검은색 상자가 만나는 부분이 빨강색 점처럼 나타나게 된다.






protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    Graphics gc = e.Graphics;

    Pen pen = new Pen(Color.Green, 1.5f);

    int nDirection = -1;

    float nWidth = 150f;
    float nHeight = 80f;

    PointF posBox1 = new PointF(30f, 40f);
    PointF posBox2 = new PointF(330f, 110f);

    gc.DrawRectangle(Pens.Black, posBox1.X, posBox1.Y, nWidth, nHeight);
    gc.DrawRectangle(Pens.Ivory, posBox2.X, posBox2.Y, nWidth, nHeight);

    PointF centerBox1 = GetCenter(posBox1.X, posBox1.Y, nWidth, nHeight);
    PointF centerBox2 = GetCenter(posBox2.X, posBox2.Y, nWidth, nHeight);

    nDirection = GetDirection(centerBox1, centerBox2);

    PointF newPos = GetSourcePos(centerBox1, centerBox2, nWidth, nHeight, nDirection);

    gc.DrawRectangle(Pens.Red, newPos.X - 2, newPos.Y - 2, 4, 4);

    gc.DrawLine(Pens.Salmon, centerBox1, centerBox2);


    pen.Dispose();

}

PointF GetCenter(float X, float Y, float Width, float Height)
{
    PointF point = new PointF(X + Width / 2, Y + Height / 2);
    return point;
}

int GetDirection(PointF pos1, PointF pos2)
{
    // Direction Number.
    //
    //            0
    //         7     1
    //       6         2
    //         5     3
    //            4
    //
    // Direction을 판단 할 수 없는 경우 ( 같은 좌표위에 있는 경우 ) -1을 돌림.


    if (pos1.X == pos2.X)
    {
        if (pos1.Y > pos2.Y)
            return 0;   // North
        if (pos1.Y < pos2.Y)
            return 4;   // South
    }
    if (pos1.Y == pos2.Y)
    {
        if (pos1.X < pos2.X)
            return 2;   // East
        if (pos1.X > pos2.X)
            return 6;   // West
    }
    if (pos1.X < pos2.X)
    {
        if (pos1.Y > pos2.Y)   
            return 1;   // North-East
        if (pos1.Y < pos2.Y)
            return 3;   // South-East
    }
    if (pos1.X > pos2.X)
    {
        if (pos1.Y < pos2.Y)
            return 5;   // North-West
        if (pos1.Y > pos2.Y)
            return 7;   // South-West
    }
    return -1;
}

float GetDeltaY(float a, float b, float nWidth)
{
    double rad = Math.Atan((double)(b / a));
    float result = (float)((nWidth / 2) * Math.Tan(rad));
    return result;
}

PointF GetSourcePos(PointF srcCenter, PointF tgtCenter, float Width, float Height, int nDirection)
{
    PointF pos = new PointF(srcCenter.X, srcCenter.Y);
    float a = Math.Abs(tgtCenter.X - srcCenter.X);
    float b = Math.Abs(srcCenter.Y - tgtCenter.Y);
   
    switch (nDirection)
    {
        case 0:
            pos.Y -= Height / 2;
            break;
        case 1:
            pos.X += Width /2;
            pos.Y -= GetDeltaY(a,b, Width);
            break;
        case 2:
            pos.X += Width / 2;
            break;
        case 3:
            pos.X += Width / 2;
            pos.Y += GetDeltaY(a, b, Width);
            break;
        case 4:
            pos.Y += Height / 2;
            break;
        case 5:
            pos.X -= Width / 2;
            pos.Y += GetDeltaY(a, b, Width);
            break;
        case 6:
            pos.X -= Width / 2;
            break;
        case 7:
            pos.X -= Width / 2;
            pos.Y -= GetDeltaY(a, b, Width);
            break;
        default:
            break;
    }
    return pos;
}
PS. 예전에 삼각함수 따위는 어디다 써~ 하면서 내팽겨 쳤는데, 아주 곤혹스러운 상태다.
(특히 그래픽 할때.). 결국 삼각함수 책을 하나 사서 봤는데 은근 도움이 많이 되었다.
그래도 한 때 배운 가락이 있어 기억 되살리면서 하나씩 조립해보고 있다.
(삼각함수에 대한 값은 컴퓨터가 알아서 계산 해주니깐 공식만 잘 알면 된다. )

나중에 그래픽 관련(게임을 만들든 뭘 하든) 프로그래밍을 할 생각이면 삼각함수 기초 부터 한번 다시 살펴봐야 할 것 같다.
728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

BuildForge심화교육

기술자료/개발도구 2009. 7. 13. 22:42

1회차 교육

  • 2009/07/13 오전 9:30 ~ 오후 5:30
  • 교육자 : 강승억 차장
  • 장소 : 동부 CNI 지하 1층 수성관
  • 교육 내용.

    • Build Forge(이하 BF)의 기본적인 정리.
    • Project 생성 방법.
    • Project Step 구성.

      • Build 시에 동작하는 순서를 정의
      • 예전 7.0에 비해 비교(If) 반복(Loop) 기능 추가.

        • 7.1 부터 사용가능.
        • If : 조건에 따라 Ture일때, False(Else)일때 명령어 창을 구분하여 처리. (.runwait 사용하여 처리가능). 환경 변수를 잘 활용.
        • loop : 조건이 False가 될때 까지 계속 실행됨.
      • Command 방식의 명령어를 안에 넣어서 동작.

        • Unix에서는 특정 Shell, Windows에서는 Dos 창 명령어들이 사용가능.
        • Batch 파일을 호출하는 방식으로 적용가능.
        • dot Command 라고 해서 BF 자체적으로 제공하는 명령어들이 있음.
        • dot Command는 대략 30개 정도 존재. ( Console의 Help 참고)
        • .bset, .run .runwait 등이 자주 쓰임.
      • 실행 결과관련.

        • 단계 실행 결과가 Pass 혹은 Fail 표시. 결과 값이 0이면 Pass.
        • exit 상태에 따라 적용되는 형태를 변화. 필터 적용도 가능. Filter는 정규표현식으로 적용,
    • Library

      • Project의 실행 안되는 형태.
      • Selector 설정이 되면 Project, 안되면 Library
      • 각종 Step 정의 내용 중 Build에 직접적으로 참여하지 않는 경우, Step만 저장하는 경우 사용.
    • 환경 변수 적용 범위

      • Scope는 총 3가지로 Server > Project > Step.
      • 같은 범위 - 예를 들면 Step 1, Step 2 등등 -에서는 환경변수 영향을 받지 않음.
      • 상위 범위는 하위 범위에 영향을 받음.
      • 단, 하위 범위의 특정 변수의 이름이 상위 범위와 겹치면 하위 범위의 값으로 대체.
      • 환경 변수 Array 스타일은 Unix의 경우 ":" Windows의 경우 ";" 임.
      • Chain은 Step과 Scope가 동일하지만, Chain의 부모 Step의 환경변수를 그대로 받음.
      • 만일 프로젝트 내 변경이 심할 경우(Unix -> Windows -> HP 등등 ) 환경 변수를 모두 set 처리하여
        값이 Reset 될 수 있도록 해야 함.
      • Chain 자체도 별도 환경변수를 가질 수 있다.
      • 환경 변수 설정 방법

        • .bset 인 경우 값을 설정.
        • .append 인 경우 현재 있는 값에서 뒤쪽에 붙임.
        • .prepend 인 경우 현재 있느 값에서 앞쪼겡 붙임.
    • Server

      • Logical Server와 Physical Server는 분명 다름.
      • BF에서의 Server는 Logical Server로 Physical 설정과 다름.
      • Abstract 특성으로 Physical 서버의 설정이 바뀌거나 추가/삭제 되더라도 Build의 큰변경없이 적용가능. ( 물리적인 서버에 대한 의존성이 낮게 구성될 수 있음 )
      • 서버 별로 인증정보를 만드는 것이 추후 편함.
      • .get , .put 명령을 사용하여 Agent <--> Server 간에 파일 전송 가능( 만일 FTP 같은 포트가 막힌 경우 사용. 단, 속도가 그다지 빠른편은 아니고, 파일에 대한 안정성도 떨어짐 )
    • Collector

      • 서버의 물리적 상태 조사.
      • CPU, RAM, HDD 뿐만 아니라, 네트워크 정보, 운영체제 타입, 컴파일러, 링커, 그 밖에 추가적으로 정의된 정보들을 수집.
      • 여기서 수집된 정보는 manifest 라는형태로 남겨짐.

        • 서버의 상세 정보가 담김.
        • 일종의 환경 변수 처럼 각종 조건을 설정할 때 귀중한 조건 데이터가 됨.
        • 이 정보는 Selector에서 활용.
      • 7.0 까지는 Server 상에 환경 변수로 추가적인 환경변수 처리를 했으나, 7.1 부터 collector 자체적으로 환경변수를 설정할 수 있음.
      • 운영체제에 의존적. 운영체제나 설정에 따라 N개의 collector 존재.
      • 필요시 Collector에서 추가적으로 수집해야 될 값을 정의할 수 있음.

        • 수집할 때, Command Line을 이용하여 값을 가져온 후 정규표현식으로 다듬는다.
      • BF_ 이나, _로 시작하는 값들은 설정없이도 가져옴.
      • 7.1 부터 .include라는 명령을 통해 다른 Collector 정보를 가져올 수 있음.

        • 같은 이름의 값이 있는 경우, append 면 array 스타일로 set 이면 덮어쓰게 됨.
    • Selector

      • Collector에서 설정된 값 또는 환경 변수의 값들의 조건에 따라 Project가 동작할지 말지를 선택.
      • Selector 설정되면 Project. 안되면 Library가 됨.
    • Chain

      • Step에 대한 특정 분기나 하위 작업을 구성할 때 사용.
      • Step의 조건에 따라 독자적으로 실행되거나 Sub rootain 처럼 동작될 수 있게 함.
      • .run을 쓰면 비동기(Chain의 동작의 결과와는 상관 없이)로 동작하고, .runwait을 쓰면 동기(Chain의 동작이 실패하면 실패, 성공하며 계속 진행)
      • Step의 분기 작업에 보통 이용.
      • Console의 Property를 사용하면 목록에 각 Chain 적용 정보가 표시되나, 만일 Step내의 Command로 처리할 시에는 Chain 적용정보가 전혀 표시되지 않음.
      • Loop 처리는 바로 이 Chain의 기능을 이용하여 조건이 False가 될때까지 계속 동작하게 된다.
    • Thread

      • Thread는 Step의 속성 중 하나로 No, Yes, Join 세가지.
      • Yes 부터 Join까지의 각 Step이 한 그룹

        • 예를 들면 아래의 경우 Step 1~3이 그룹 A, Step 4가 그룹 B가 됨.
          Step 1 ( Thread : Yes )
          Step 2 ( Thread : Yes )
          Step 3 ( Thread : Join )
          Step 4 ( Thread : Yes )
        • 그룹 A가 모두 실행이 완료되어야 그룹 B가 실행됨.
        • 만일 Max Job이 만들어지는 Thread 숫자보다 작으면 Thread의 숫자도 제한을 받는다.
          예) Max Job이 1인 경우 Step ! -> Step 2 -> Step 3 로 실행된다.
      • 응용 : Thread를 Build 서버별로 만들면 동시에 여러 빌드 서버가 동작할 수 있음.
        Server1 - Selector [ Inline ] - Step 1
        Server1 - Selector [ Inline ] - Step 2
        Server1 - Selector [ Inline ] - Step 3
        Server2 - Selector [ Inline ] - Step 1
        Server2 - Selector [ Inline ] - Step 2
        Server2 - Selector [ Inline ] - Step 3
        Server3 - Selector [ Inline ] - Step 1
        Server3 - Selector [ Inline ] - Step 2
        위와 같을 때 Inline 자체에 Thread로 걸면 Server 별로 Thread 동작.
        만일 Thread 설정이 없다면 Step 순서대로 동작(물리적으로 서버가 분리되어 있어도 마찬가지)
    • Apdator

      • 명령 실행 방법, 결과 값을 표시해줄 수 있도록 만드는 I/F의 일종.
      • XML(정확히는 XAML 형태)형태로 정의
      • 설정 되는 순간 모든 Step의 0순위로 실행됨.
        ( 만일 Adaptor의 동작 결과 아무런 결과 값이 없는 경우 더 이상 실행되지 않음 - 로그 조차 안남음 : 예. 소스 변경 여부에 따라 빌드 할 지 말지를 결정할 때. )
      • Adpator의 Link를 통해 설정가능.
        필요시에는 Command Line에서 직접 실행가능.
        .source {어뎁터이름} {파라미터} : 소스 버전 관리
        .defect ㅖ어뎁터이름} {파라미터} : CQ계
        .Test {어뎁터이름} {파라미터}  : 테스트용
      • XML Format Schema

        • Interface 이름 및 기본 설정 정의 <interface/>
        • 실행 명령어 정의 <execute/>
        • 결과값 뽑아내기 : 정규식 활용 <resultblock/>
        • BOM(Bill Of Material)로 결과 전달 내용 <bomformat />

 

2회차 교육

  • 2009/07/14 오전 9:30 ~ 오후 4:30
  • 교육자 : 강승억 차장
  • 장소 : 동부 CNI 지하 1층 수성관
  • 교육 내용

    • Build 유형.

      • 통합 빌드 : 일반적인 형태. 버전을 통합하여 처리.
      • Continus Build : 변경 사항에 따른 일부 빌드 처리. - 근래 대세를 이루는 형태.
    • Job

      • 동작될 Project 혹은 Library의 활동 내역.
      • Job의 Start에서 혹은 Project의 Run Command를 통해 실행.
      • Job 목록에서 Filter 처리가능. 만일 Fail 시에 (Fail 갯수/Warning 갯수)로 전체 갯수 표시.
      • Job -> Start 에서 표시되는 항목 중 Selector 조건에 합당한 Job에 한하여 Start 가능한 항목 표시
      • 특정 Job만을 독자적으로 실행할 수 있음

        • 원칙적으로 Library는 독자 실행이 불가능하나(Selector 때문) Job에서 전제조건을 넣어 독자 실행가능.
        • ntegration 단계도 설정 가능.
        • 주의 : 7.1에서 설정 내용 중 "PATH" 항목이 중복되어 표시되는데, 그 중 맨 아래쪽의 Path 내용으로 Set 되어 처리됨.
      • Job의 Step 목록에서 특정 Step에 대해 처리 중지 및 일시 정지 처리 가능.
      • Job의 실행 순서.

        • 서버 DB 데이터 조건별 Select 처리.
        • Waiting 처리 ( Server Selector의 할당 처리 / 세마포 설정에 따른 대기 )
        • Job Queuing
        • Job Excution.
      • Job의 All 탭에 있는 항목은 수정/제어 불가능 -> Complete 항목에서 적용가능 ( Lock / Purge )
      • 완료된 Job을 클릭해서 들어가면 상세 정보를 볼 수 있음 ( 왼쪽 아래 Pane에 표시)

        • Bill of Materials
    • Schedule

      • 자동으로 특정 Project를 실행할 때 사용.
      • cron 매커니즘을 이용하여 처리 ( * 이면 매번, / 붙이면 특정 일자별 )

        • 값이 * 이면 매번 수행( day = * 이면 매일, month = * 이면 매월)
        • /? 형태로 값이 매겨지면 ? 주기로 실행 ( day = */2 이면 2일 마다 실행)
        • days는 요일 0이면 일요일 1이면 월요일 ~ 6이면 토요일.
      • UI 상에 달력에 있는 박스 내 숫자는 실행될 Project의 실행 횟수를 의미
    • Plug-in

      • Build Forge Frequency

        • Build Forge 관련 정보 접근 혹은 업데이트 처리.
        • Eclips 뿐만 아니라 VS시리즈도 지원
      • Build Forge Reflector

        • "pre-flight" 방식으로 특정 버전의 소스에서 자신의 Test 코드를 임시적으로 추가 Build 적용 가능.
        • Eclips만 지원.
        • User License가 개발자 만큼 필요할 수 있음.
    • 보안.

      • Role 기반 보안 -> 그룹을 기반으로 구성. 사용자 별 권한 설정을 할 수 없음.
      • 그룹은 하위 그룹을 가질 수 있음
      • 직책(또는 부서)별 Role 별 권한 설정을 해야 추후 구분 구성이 쉬움.
        개발1팀 그룹, Build Engineer 그룹 식으로 별개의 그룹으로 구성하여 묶어 처리.
      • LDAP(및 AD)를 통해 사용자 계정을 가져 올 수 있음

        • 단, LDAP의 정보는 반드시 1회 이상 Login을 해야 정보를 가져옴.
        • 가져 온 뒤, 해당하는 Group에 맞게 설정해야 함.
    • API

      • 7.0 버전 이하는 Perl 만 지원. 더욱이 API가 직접적 접근을 위한 함수 나열식.
      • 7.1 버전 이상에서는 Abstract 형태의 각 기능별 Class 구성.

        • Java, Perl 지원.
      • 라이센스 형태에 따라 지원 여부가 다름
    • Report 기능

      • 독자적인 License가 추가적으로 필요.
      • 주요 리포트

        • 전체 리포트 가짓수는 8가지 정도 있음
        • Capacity : 현재 물리적 서버들의 가용성을 체크하는 Report. 사용량이나, 소모 자원 정보들을 나열.
        • Quality : 프로젝트의 Pass/Fail 의 정도 및 결과 내역을 나열.
    • 제품 Scue 및 라이센스

      • 제품 Scue.
      • Express Edition : 최초 Start Pack 형태로 나온 초소형 버전. 7.0.2 버전 이후로는 사라짐.
      • Standard Edition : 기본 형태로 최대 25명 접속 가능. 비공식적으로 Dynamic Server Management 가능.
      • Enterprise Edition : 150명 접속 가능. Dynamic Server Management 가능
      • Enterprise Plus Pack : 250명 접속가능 및 User License도 포함.
      • 라이센스

        • 제품 Server 및 Console 라이센스 - 접속 가용성에 대한 라이센스.
        • 사용자 라이센스 - 접속 사용자 라이센스. (동시 접속 기준)
  • 기타 발전 내용

    • Adaptor 적용.

      • 형상 관리 등의 BF 내 확장 기능을 붙일 수 있는 I/F .
      • 특정 Schema를 근간으로 한 XML 형식의 데이터.
      • XML 데이터를 생성해주는 도구가 있으면 좋을 듯 싶음.
      • 문제점 : 제품 Scue에 따라 이 Adaptor 기능에 대한 라이센스르 별도로 사야될 수 있음.
    • Express 버전 단종.

      • 더 이상의 지원은 없을 예정. 7.0.2.가 마지막 형태.
    • 운영체제 제약.

      • 2003( XP도 포함 예정 )에 대한 지원도 없앨 예정이라고 함.

이 글은 스프링노트에서 작성되었습니다.

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

FireFox 고급 설정 방법

기술자료/OS 2009. 7. 9. 17:02
FireFox의 상세한 설정을 할때 사용된다.
주소창에 아래의 주소를 입력한다.
about:config

그러면 아래 그림과 같은 항목들이 쭉 나열되는데,여러 항목들 중,  자신이 변경하고자 하는 설정을 적용하면 된다.

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

Windows Kernel 전체 메모리 올리기 및 L2 캐쉬 사이즈 결정하기.

기술자료/OS 2009. 7. 9. 14:38
도아님 글을 읽고 적용해보았다.
Windows NT 4.0의 기능개선( http://qaos.com/article.php?sid=478 )

상세한 내용은 위의 링크를 클릭하여 내용을 보면 된다.

작업의 요지는 아래와 같다.
  1. 레지스트리 내용 중 아래의 경로를 찾는다.
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management
  2. 레지스트리 항목 중 DisablePagingExecutive 에 값을 1로 변경한다.
  3. 레지스트리 항목 중 SecondLevelDataCache 에 값을 L2 캐쉬 사이즈 만큼 적용한다.

현재 보유하고 있는 T2010 이 U7600 CPU인데, 확인 결과 L2가 2M였다. 그래서 2048을 넣으면 됨.
회사용 노트북은 T8300 인데, 캐쉬가 3M였다. 그래서 3072를 넣음.


728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

  • «
  • 1
  • ···
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • ···
  • 44
  • »
250x250

블로그 내에 소스 코드 삽입 이사온 기념 스킨도... RSS 전문 기능 비활성화 관련. 스킨 바꾸어 보았습니다. 서버 파일 정리 좀 했습니다.

«   2025/05   »
일 월 화 수 목 금 토
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

수 MOSS 2007 오류 moss 지름신 2010 me2photo SharePoint WSS Visual Studio 매뉴얼 좀 친구 Tutorial 비스킷 me2sms 것 me2dayzm 협업 불만 블로그 개발환경 twi2me Azure Buscuit Google Apps Engine java 인터파크 windows e-book

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015-2025 Socialdev. All Rights Reserved.

Copyright © 2015-2025 Socialdev. All Rights Reserved.

티스토리툴바