퇴근5분전


프로젝트를 만들고 아래와 같은 조건에 따른 메서드를 호출하는 방법임.

해당 프로젝트에 대해 호출되는 메서드가 달리 됨.

public class ModuleClass
    {
        [Conditional("DEBUG"), Conditional("A"), Conditional("B")]
        public static void CallMessage()
        {
            MessageBox.Show("DEBUG");
            CallMessage1();
            CallMessage2();
        }

        [Conditional("A")]
        static void CallMessage1()
        {
            MessageBox.Show("AA");
        }
        [Conditional("B")]
        static void CallMessage2()
        {
            MessageBox.Show("BB");
        }
    }


프로젝트의 속성에 가서 [빌드] -> [조건부컴파일 기호]에
A, B를 넣으면 CallMessage1, CallMessage2가 호출이 되고
A만 넣으면 1, B만 넣으면 2가

아무것도 없으면 쌩..
 

'# 1) 프로그래밍' 카테고리의 다른 글

컨트롤 마우스 이동 처리  (0) 2012.03.14
.Net 2008 ] XML 직렬화  (0) 2012.03.13
서버 모니터링 프로그램~~  (0) 2011.06.26
로그 시스템...  (0) 2011.06.09
알람!! 메세지 팝업 처리..  (0) 2011.06.09


 굿센테크날러지에서 마지막 프로젝트? ~ .NET 2.0을 대상으로 개발되었음.

서버 모니터링 프로그램을 만들었다.

많은 테스트와 짧은 시간때문에 아직도 헷갈리긴 하지만...

마지막으로 스샷 찍어본다.

내 데스크탑에서 모니터링을 3개( 윗줄 ), 뷰어 1개( 왼쪽 하단 ), 프로세스 시그널테스트( 오른쪽 하단 )
테스트한 것이다.

우하단 시그널에서 발생시킨 신호를 좌상단은 받아서 상태표시를 하고 중앙 모니터링으로 데이타를 전달하면
중앙모니터링은 데이타를 받아 표시 하고 다시 우상단 모니터링으로 데이타를 보낸다.

이때 우상단 다음 모니터링이 존재하면 그쪽으로 보낼수 있으며,
우상단은 좌하 모니터링뷰에 전체데이타를 보낼수 있다.

뷰어를 통해 모든 서버의 상태를 직접 확인이 가능함.

아 피곤해~



아래는 시그널이 정지된다거나, 프로그램이 실행되지 않았을때... 표시된다.


'# 1) 프로그래밍' 카테고리의 다른 글

.Net 2008 ] XML 직렬화  (0) 2012.03.13
Conditional 속성 사용!!!  (0) 2011.10.26
로그 시스템...  (0) 2011.06.09
알람!! 메세지 팝업 처리..  (0) 2011.06.09
컨트롤 배율 조정 공식...  (0) 2011.06.09


 전에 있던 로그 모듈은 조금 사용하기 복잡했었는데...

머리좀 굴려서 완전 개편하였다. 


 개념은 모든 로그 관련 메세지를 특정 객체로 전달하도록 구성하고

사용하는 폼에서 수신이벤트를 추가하는 형태로 메세지를 수신받을 수 있게 만들어졌다. 

이로써 예외/ 일반메세지/ 코멘트 등을 로그 메세지 타입으로 구분지어 메세지를 로그모듈에 전달하게 되면

수신이벤트를 통해 메세지를 분류획득할 수 있다.
 
 싱글톤 + 또한번에 싱글톤.. 팩토리... 등의 패턴들 적절히 섞어서... 완성된 모듈... 

오늘도 자뻑!?ㅋㅋ

수신 이벤트 등록!!
LogDataMessage.Manager.DataTransEvt += new DataReturnDelegate(Manager_DataTransEvt);

수신 메세지 처리 
void Manager_DataTransEvt(LogTrans_EventArgs e)
{
           //로그 메세지 수신...
            if(e.LogType == LogTypeCode.Exception)
                Invoke( new Action( delegate{ arm.Add(e.LogType.ToString(),  e.LogMessage); } ));       
}
 
// 메세지 전달!!!
LogDataMessage.CreateLog_ExceptionMessage( new Exception("에러라공!! ") );  

구체적인 소스는 안붙임..

'# 1) 프로그래밍' 카테고리의 다른 글

Conditional 속성 사용!!!  (0) 2011.10.26
서버 모니터링 프로그램~~  (0) 2011.06.26
알람!! 메세지 팝업 처리..  (0) 2011.06.09
컨트롤 배율 조정 공식...  (0) 2011.06.09
큐 자원 재활용!!  (0) 2011.06.07



 전에 만들었던 알람 메세지 팝업기는 ThreadTimer를 이용해서 해당 시간까지 체크해서

시간이 되면 팝업을 시키는 형태였으나... 이번 플젝은 스케쥴기능이 없어서

그냥 바로 노출되도록 만들었는데...

간단히 알람 뷰폼을 만들어서 화면 구석에 배치하고 투명색을 지정해 준후 배경으로 깔아놓는다.

그리고 여기에 팝업 창을 추가하면서 좌표값을 조정하면...



최근순서가 앞으로 오도록 위처럼 쌓이게 된다..

투명폼을 둔 이유는 듀얼 모니터일경우 위처럼 살짝 대각선으로 쌓게 되면 모니터 위치에 따라

다른 모니터로 삐져나온다...

창을 닫을때마다 하나씩 앞으로 땡겨오는 형태로 구현이 되었다.

 80여 라인으로 구현한 것 치곤.. 나름 괜찮음..


AddMessage 메서드.... 소스임.

 AlramForm fm = new AlramForm();
            fm.HeaderText = header + " " + fms.Count.ToString();
            fm.BodyText = body;
            fm.Size = BasicSize;
            fms.Add(fm);
            fm.TopLevel = false;
            fm.TopMost = true;
            MainForm.Controls.Add(fm);
          
            fm.PerformAutoScale();
            fm.FormClosing += delegate
            {              
                foreach (Form _Form in fms)
                {
                    _Form.Left -= 5; 
                    _Form.Top += 3;
                    fm.Activate();
                }
                fms.Remove(fm);
            };

            int cnt = fms.Count;
            foreach (Form _Form in fms)
            {
                _Form.Left = MainForm.Width - fm.Width + ((cnt) * 5) - 5; 
                _Form.Top = MainForm.Height - fm.Height - ((cnt) * 3) + 4;
                cnt--;
                fm.Activate();
            }
            fm.BringToFront();
            fm.Show();           



ZoomInOut을 구현했는데...

int[]  factors = { 50, 100, 200  };

을 combo에 넣고

옛날 값 = 100; 으로 초기값 사용.

현재 선택된 Factor  = 50;
{

float 조정배율 =  현재값/ 옛날값 ;
Control.Scale( new SizeF(  조정배율 , 조정배율  ));
옛날값 = 현재값;

}
추가로 폰트
  => 폰트 사이즈 * 조정배율;

이러면 간단히 된다. ㅡ.,ㅡ;; 아래는 삽질 ? ㅋㅋ


--- 기존 ----------------------------------------------------------------------------------------

컨트롤을 만들다가 적용해보았음.

공식 검토하고 적용해보고 테스트 하는데 30분이나 까먹었음...

아~~ 산수 역시나..

  // 원래 size  / 현재size * 배율

이건 Control.Scale(); 에 들어가는 배율을 구하는 공식임.

곧 처음 사이즈가 100 이었을때

50%로 줄이면 100 / 100 * ( 50 / 100 )  = 0.5 절반

으로 Scale에 들어가는 값으로 구해진다.

다시 50에서 100%으로 늘리면   100 / 50 * ( 100 / 100 )  = 2

다시 200%로 올리면 100 / 100 * ( 200/ 100 ) = 2   로써 2배로 늘어나고

이걸 50% 로 줄이면

 100 / 200 * ( 50 / 100 ) = 0.25 배가 된다.    고로 현재 사이즈에서 0.25배...
 
현재 사이즈 * 0.25 를 하게 되면 50 이란 실제 사이즈가 나오게 된다...




 x축 큐를 500개 Fix 걸고 타이머 간격 50ms 로 잡고 실시간 챠트를 찍었는데...

메모리가 초당 4kb 씩 증가하는걸 보고... 재활용 해야지 싶어.. 아래처럼... 바꾸었다.

환형? 큐던가?...


        long maximum = 1L;
        internal void Add(string x, long y)
        {
            ChartPoint c;
            maximum = maximum < y ? y : maximum;
            if (list.Count > display_xcount)
            {
                c = list.Dequeue(); // 500개이상이면하나 뽑아... 교체
                c._name = x;
                c._ypoint = y;
            }
            else
            {
                c = new ChartPoint(x, y);  // 초반 500개 생성
            }
            list.Enqueue(c); // 집어넣어...
        }


찍어낸 챠트..? ㅋㅋ


demo링크
http://msdn.microsoft.com/en-us/library/ms131016(v=VS.96).aspx

위 링크를 보면 숫자 관련 링크가 나온다.

훈스 닷넷에서 문자열로 된 데이타를 소숫점 이하 3자리 표현을 하고 싶다는 질문에

다시 숫자형으로 바꾸어 지정하면 된다. 라고 답을 했는데 그 이외에 방법을 궁금해 하는 분 같았다.

물론, 이렇게 위 처럼 하는 것이 가장 간단한 방법인디... 음...

특정 포멧 공급자들은 NumberFormatInfo  ,   DateTimeFormatInfo  두가지를 msdn에서 보았고,

또 필요하면 직접 구현하면 된다...




사용자 정의 포멧을 만들때 필요한 건...?

첫번째 방법 .
 내가 주로 사용하는 방법은 IFormattable를 사용하는 방법이다. 

이방법은 간단히 ToString을 오버로딩하는 방법으로 IFormattable의 메서드를 상속 구현을 통해 만든다. 

interface IFormattable{ string ToString(string format, IFormatProvider formatProvider); }

이다. 

어떤 데이타를 문자열 포멧을 지정해야 한다거나 포멧이 여러타입으로 구분되어야 할때 이방법을 사용한다.

그러면 객체.ToString(); 또는 ToString( 포멧, null )을 통해서 멋지게 구현이 된다. 

또한 string.Format( "{0:포멧}" , 객체 ); 로 하면 지정된 포멧을 이용해 문자열 변환이 된다.

두번째 방법 .

 ICustomFormatter 를 MSDN을 검색하여 이용한다. 외울수는 없기에.. ^^; 
그러나 이 인터페이스는 혼자 쓰이기 보다 IFormatProvider  와 함께 구현이 된다.

데모(MSDN)는 http://msdn.microsoft.com/ko-kr/library/system.iformatprovider(v=VS.80).aspx 

간단히 위 두가지 방법을 이용해 객체에 대한 문자열 정보를 원하는 포멧으로 변환이 가능하다.

지금 하고 있는 프로젝트에서는 주로 XML 변환을 하고 있다. 

이전에 작성한 포멧관련 글이 있긴할텐데... 역시 관리상에 문제이려나... 

카테고리가 너무 많은 듯... 한데... 정리정돈이 .. 


추가 : 

http://stackoverflow.com/questions/128618/c-file-size-format-provider

파일 사이즈 포멧터를 만들어놓은게 있네.. 



 

'# 1) 프로그래밍' 카테고리의 다른 글

컨트롤 배율 조정 공식...  (0) 2011.06.09
큐 자원 재활용!!  (0) 2011.06.07
C#] 날짜 2011-04-19 오후 2:45:00 를 DateTime으로 바꾸기  (0) 2011.04.28
[C#] 배열 최대 크기  (0) 2011.04.26
ActiveDirectory] Query  (0) 2011.04.19


 DateTime dt = new DateTime();  
 DateTime.TryParse(       "2011-04-19 오후 2:45:00",
 null,
 System.Globalization.DateTimeStyles.AssumeLocal,
 out dt);
 string strDt = dt.ToString("yyyyMMddHHmmss");

결과 : "20110419144500"

++ 추가

  string s2 = DateTime.ParseExact("2011-02-01 오후 10:11:22", "yyyy-MM-dd tt hh:mm:ss", null, System.Globalization.DateTimeStyles.AssumeLocal).ToString("yyyy-MM-dd HH:mm:ss");

이렇게 하면 쉽게 구해진다.  't' 문자가 오전 오후와 관련된 예약어였음.

++ 추가

  string s2 = DateTime.ParseExact("2011-02-01 오후 5:11:22", "yyyy-MM-dd tt h:mm:ss", null, System.Globalization.DateTimeStyles.AssumeLocal).ToString("yyyy-MM-dd HH:mm:ss");

시각 표시에 따라 포맷도 바뀌어야 한다.


Sql에서 하는 방법도 찾아볼끄낭..



'# 1) 프로그래밍' 카테고리의 다른 글

큐 자원 재활용!!  (0) 2011.06.07
[사용자 지정 포멧 & 숫자 포멧] C# 문자열 포멧 지정...  (0) 2011.05.26
[C#] 배열 최대 크기  (0) 2011.04.26
ActiveDirectory] Query  (0) 2011.04.19
HWP 바이너리 파일...  (0) 2011.03.23



int max = 285211635;
int[] list = new int[max];

음 이게 최고로 만들수 있는것인가 보넹..

에러 OutofMemory가 예외가 안나옴...

음.. 나중에 다시 해봐야지.

굿센에 SM처음와서 AD가 뭥미?

LDAP는 뭥미??...

코드만 있고 아무도 설명해주는 사람이 없는... 황당한 유지보수팀..

여긴 대체... 어디?


다음 카페에 갔더니 관련 링크가 아주 좋은게 있었넹... 굿!!

http://www.codeproject.com/KB/system/everythingInAD.aspx#46

잘 나와있네.