퇴근5분전


 
  지금 서버모니터링 프로그램을 구현하는데...

프로세스에서 상태신호를 직접 받을수 있게 설계되었는데....

황당한...일이 발생하였다.


 모니터링 프로그램과 신호를 발생시키는 프로그램간에 IPC 객체 리모팅을 통해서 값전달을 하는데...

이게 일정 시간 쉰 후 다시 시그널을 발송해주면 모니터링 프로그램에서 시그널을 받지 않는다... 

깨워보려고 노력했는데 다 허사로.. ㅠㅠ;..

그래서 생각한게 더미로.. 부 프로그램을 만들어서 이넘을 일정 시간마다 깨워주는 것이다.
 
 이런 경우는 테스트가 더 짜증낭 ㅠㅠ;..

이 부프로그램엔 메인 프로그램을 항상 감시하며.. 이넘 죽으면 같이 죽고,

메인 프로그램은 부 프로그램을 감시하여 죽으면 살려준다!!

종속프로그램...

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

[정규식] Replace~  (0) 2010.09.14
이미지 미리보기~  (0) 2010.08.31
글꼴 폰트 관련 MSDN 링크  (0) 2010.08.10
소수 구하기 소스...  (0) 2010.08.06
[GDI+] Matrix 객체 사용해보기...  (0) 2010.07.27


 -> TextBox 2개 , 버튼 1개
 
  변환 대상 문자열 : "<div>나&너&우리</div>"

  음 훈스에 올렸는데 더 간단한것이..

소류님 글...
01. 참조에 System.Web을 추가합니다.
02. MessageBox.Show(System.Web.HttpUtility.HtmlEncode("<>&"));


// 이하 소스~~~ 

    private void button1_Click(object sender, EventArgs e)
        {
            string pttr = "<|&|>";
            Regex rx = new Regex(pttr);

            this.textBox2.Text = rx.Replace(this.textBox1.Text, new MatchEvaluator(ReplaceString));

        }

        //http://msdn.microsoft.com/en-us/library/cft8645c.aspx
        static string ReplaceString(Match m)
        {
            string mString = m.ToString();

            switch (mString)
            {
                case "<":
                    mString = "&lt;";
                    break;
                case ">":
                    mString = "&gt;";
                    break;
                case "&":
                    mString = "&amp;";
                    break;

            }

            return mString;
       
        }

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

IPC... 리모트 객체 수명이 5~6분?  (0) 2011.06.24
이미지 미리보기~  (0) 2010.08.31
글꼴 폰트 관련 MSDN 링크  (0) 2010.08.10
소수 구하기 소스...  (0) 2010.08.06
[GDI+] Matrix 객체 사용해보기...  (0) 2010.07.27




음 소스는 이미지 사이즈에 따라 조금 우측 픽쳐박스랑 싱크가 안맞기도 한데...

이건 이미지pixel값 가져올때 좌표계산이 살짝!!! 미스 나는것 같다..

머 그냥 쓸것도 아닌 구현해본정도니... 넘어감..

훈스 C# 질문게시판에 비슷한 게시글이 올라와서 구현해봤음.

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

IPC... 리모트 객체 수명이 5~6분?  (0) 2011.06.24
[정규식] Replace~  (0) 2010.09.14
글꼴 폰트 관련 MSDN 링크  (0) 2010.08.10
소수 구하기 소스...  (0) 2010.08.06
[GDI+] Matrix 객체 사용해보기...  (0) 2010.07.27


http://msdn.microsoft.com/ko-kr/library/a3a2bads(VS.90).aspx

Windows/Font 폴더가 아닌 다른 위치에 폰트파일을 읽어서 사용할수 있는가? 라는 질문이 훈스 게시판에 올라왔기에
잠깐 뒤져보다가 찾았다.

privateFontCollection 이란 객체가 있고
AddFontFile( "파일경로" ); 를 통해 추가해서 사용할 수 가 있다.
 
그리고 지난번에 Text 관련해서 라인 번호 넣는 처리 할때 폰트별 라인 공백이라든가 위치값에 필요한 인자값들에 대한 정보도 Font.FontFamily 의 메서드로 지원이 되는것을 확인하였다.  

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

[정규식] Replace~  (0) 2010.09.14
이미지 미리보기~  (0) 2010.08.31
소수 구하기 소스...  (0) 2010.08.06
[GDI+] Matrix 객체 사용해보기...  (0) 2010.07.27
IFormattable  (0) 2010.07.15


다음 닷넷 카페에서 소수구하기 2~ 30000 내의 소수 구하기 타임어택을 해본다고 하기에... 나도 한번 해봤다

if와 continue가 소비시간을 그렇게 먹을줄 몰랐넹...

추가하면 할수록 느려지다뉭...

            long dt = DateTime.Now.Ticks;
            bool print = true;         
            for (short i = 2; i < 30000 ; i++){               
                for (short j = 2; j < i ; j++){
                    if (i % j == 0){
                        print = false;break;
                    }
                }
                if (print == true){
                    Console.WriteLine( i.ToString());
                }
                print = true;
            }
            TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - dt);
            MessageBox.Show( ts.ToString() );

VS2005 , CPU : 쿼드 Q8300 , 램 : 4G, OS : XP

이게 가장 빠른 시간이   0.4218750 초이답...    0.4375000...
할때마다 다른데...
릴리즈로 하면 0.1초 빨라짐.

추가 : ...
워... 2~3만이 아니라 2부터 소수 3만개였다.
 3만개 띠웠더니 8초 좀 안되넹..

다른 방법을 찾아봤더니 제곱근 이용하는 방법이 있었다.


        //제곱근을 이용하여 체크. http://hisjournal.net/blog/128
        bool CheckByRoot(int num){
            int rootNum = (int)Math.Sqrt((double)num);
            int div = 0;
            bool value = false; 
            for(div = rootNum; num % div != 0; div--);  
            if(div == 1) value = true;
            else value = false;  
            return value;
            /*http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Board&no=8479
                "모든 정수는 대칭하는 두수의 곱으로 나타낼수 있다"의 특성을 이용해
                연산시간을 획기적으로 줄였습니다 -_-;;
                예를들어 18이란 정수는 1*18 2*9 3*6 6*3 9*2 18*1 로 나타낼수 있죠.
                여기서는 두 정수의 곱으로만 나타냈지만 실제로는 실수로도 가능합니다.
                3루트3 * 2루트3 로도 나타낼수 있죠.
                이처럼 대칭되어지는 두수의 곱으로 나타낼수 있기때문에 실제로 소수인지 확인
                하기위해서는 대칭되어지는 점[입력값의 루트값 즉 sqrt()함수를 이용한 결과값]
                까지만 연산을 해주면 된다는 결론이 나옵니다.
                그래서 두번째 방법에 하나의 변수를 더 추가하여[sqrt_number] sqrt값을 만들어
                내고 for문의 범위를 이 변수의 값까지로 한정시켰습니다.
                속도는....가히 눈부시군요 -_- 2번째 버젼에서 39초나 걸렸던 "1234567891" 란
                정수의 소수확인시 1초도 안걸립니다.....
                결론: 알고리즘이란게 재밌군요. 이제 다른 주제로 알고리즘 연구를 해봐야겠습니
                      다.
                */
        }

이거 적용해도 ... 그닥.. 0.0625초는 안나온다.

소인수분해를 이용해서 소스를 작성했으나...  실패했다.
이유인즉 소수를 찾기위해 수를 소수로 인수분해하려면 소수값을 가지고 있어야 하는데 꾀나 많은 소수들이 있어야 한다는... 벽에 부딪혔다. 30개를 가지고 131까지도 계산 못한다..

 int CheckBy(int num)
        {
            /*소인수분해 .
             
소인수분해를 할때는 가장 작은 소수부터 나누는게 좋습니다.
60을 소인수분해 한다고 하면,
60는 2의 배수죠? 그러면 2*30이 됨니다
그런데 30도 2의 배수죠? 그러면 2*2*15가 되죠..
15는 3의 배수입니다. 그러면 2*2*3*5
5는 소수이므로 더 이상 할 필요가 없습니다.
따라서 60을 소인수분해 하면 2²*3*5가 되는 것입니다
*/
            int[] primeNum = new int[] {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127};
            List<int> ar = new List<int>();
            int primeIndex = 0;
            int TempValue = 0;
            int modTempValue = 0;
            int primeCount = 0;
            TempValue = num;
            do
            {
               if( TempValue == 1 )
               {
                   ar.Add(TempValue);
                   break;
               }
               if (TempValue % primeNum[primeIndex] == 0)
               {
                   ar.Add(TempValue);
                   TempValue = TempValue / primeNum[primeIndex];
               }
               else
               {
                   primeIndex++;
               }
               
            } while (true); // 3개부터는 ~
            return ar.Count;
        }

줸장 ㅡ,.ㅡ;;


0.0625초는 대체 어떻게 나온거쥐?


실패했따 ㅡ.,ㅡ;;; 슬프다.. 



추가

카페에 갔더니 소스가 올라왔다... 봤더니 ~~ 와!! 대박!...
출력까지 포함시켜도 2초 정도 나온다.

제곱근과 소인수분해를 복합적으로 적용시켜놓은 소스였다... 

감탄뿐이 안나옴... 알고리즘 공부 좀 다시 해야겠다.





'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

이미지 미리보기~  (0) 2010.08.31
글꼴 폰트 관련 MSDN 링크  (0) 2010.08.10
[GDI+] Matrix 객체 사용해보기...  (0) 2010.07.27
IFormattable  (0) 2010.07.15
트리노드 검색해서 확장하기...  (0) 2010.03.17

 나에게 행렬이란? 계산방법이나 결과값을 구하는건 알겠는데... 그래픽에 막상 적용해놓고도 이게 뭔가... 싶은것?
역시 수학 기초가 딸리면 멍때리는건 시간문제얌 ㅡ.,ㅡ;;;


얼마전 훈스에 올라온 행렬 구하는 객체가 있는가에 대해 검색좀 해보니 Matrix란게 있었는데...

또 마침 별그리는것... 선 이동시하는것등... 갑자기 또 관심종목이 ㅡ.,ㅡ;;;


 오늘 저녁엔 Matrix를 가지고 놀아보자 해서 별그리는데 써보기로 했다.

그럼 이 Matrix는 뭐하는 놈인고 하니 MSDN 에 보니 이 놈이 좌표변환 하는데 쓰이는 놈이었다.

3D 구현때보다는 머 나름 편했다.  3D는 아직도 이해 불가..( 절두체 ㅡ.,ㅡ;; )

2D로 별을 그린다고 했을때

  private void DrawStar(Graphics g, double r, PointF p)
        {
            PointF[] ps = new PointF[6];
            double RadianTheta = 0d;
            int cnt = 0;
            for (double i = 0; i <= 720d; i += 144d)
            {
                RadianTheta = (angle + i) * Math.PI / 180d;
                ps[cnt] = new PointF(p.X + (float)(r * 1d * Math.Cos(RadianTheta)),
                                                  p.Y + (float)(r * 1d * Math.Sin(RadianTheta)));
                cnt++;
            }
            g.DrawLines(Pens.Red, ps);
            g.DrawEllipse(Pens.Blue, p.X - 5, p.Y - 5, 10, 10);
        }

말할것도 없이 이거답... angle은 회전각인데.. 별을 빙글~빙글~ 돌려봤다..

이게 오히려 나에겐 이해하기 쉽다...

  private void DrawStar(PaintEventArgs e)
        {
            PointF[] starPointFs = new PointF[6];
            int cnt = 0;
            double theta = 0f;
            for (double i = 0; i <= 720d; i += 144d)
            {
                theta =( i - 5f) * Math.PI / 180d;
                starPointFs[cnt] = new PointF((float)Math.Cos(theta), (float)Math.Sin(theta));
                cnt++;
            }
            e.Graphics.DrawLines(Pens.Red, starPointFs);

            //Matrix를 이용한 좌표변환 그리기...
            Matrix mx = new Matrix(1f, 0f, 0f, 1f, this.Width/2, this.Height/2);
            mx.Scale(100f, 100f);
            mx.Rotate((float)angle);
            mx.TransformPoints(starPointFs);               
    
            e.Graphics.DrawLines(Pens.Black, starPointFs);
        }

Matrix의 기본 파라미터값( Sx , Rx, Ry, Sy, Dx, Dy ) 임.

Rx, 나 Ry를 값을 주면 왜곡되는데... 왜그런지 모르겠넹... 쩝.

매트릭스로 구현한 소스이다.
기초 메트릭스를 생성하고 여기에 크기변환,  회전값을 주고
별의 각 점좌표를 주고 변환 한다!
그리고 그려주면 별이 그려진다.

소스상에 i - 5f 는  두개의 별을 동시에 그리면 위상이 같아서 겹치므로 위상차를 주었다.

간단하게나마 매트릭스를 그려보았다.

음 어따 써먹쥐?????????????????????????????  이걸 왜했을까?

구현된 스샷!

# 실제 이미지는 타이머로 빙글 빙글 돌리고 있다....



'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

글꼴 폰트 관련 MSDN 링크  (0) 2010.08.10
소수 구하기 소스...  (0) 2010.08.06
IFormattable  (0) 2010.07.15
트리노드 검색해서 확장하기...  (0) 2010.03.17
목록 로테이션???  (0) 2010.03.16

SubComboBoxClass sb = new SubComboBoxClass();
sb.DataCode = "7001";
sb.Value = "V";

object obj = sb;
this.Text = string.Format("{0:KEY}", obj);

  위처럼 따로 정의한 객체가 특정 Format 형식을 지원하고자 할때 사용 할 수 있다.
가끔 다른 인터페이스랑 헷갈릴때가 있어서 기록해둔다.



internal class SubComboBoxClass : IFormattable
        {
            public string Name { get; set; }
            public string Value { get; set; }
            public string DataCode { get; set; }

            public override string ToString()
            {
                return ToString(null, null);
            }

            #region IFormattable 멤버

            public string ToString(string format, IFormatProvider formatProvider)
            {
                if (format == "KEY")
                {
                    return Value + DataCode;
                }

                return Name + ":" + DataCode + "[" + Value + "]";
            }

            #endregion
        }



트리노드 검색해서 확장하기... 

훈스 C#게시판에 올라왔던 질문중에 하나 답글달아본거... 그냥 기록? 해둠..

질문자는 탐색기를 만드는것 같았는데...

아래처럼 자식노드이름을 FullPath로 놓고 Text는 해당 DirectoryName Or FileName으로 두면

[그랑께] 노드의 Name속성은 C:\드라이브\어쩌고\그랑께 을 가지게 되고
Text속성은 그랑께 로 위에 그림처럼 나오게 된다.

이때 탐색기 주소줄에 경로 넣듯이 그랑께 <--를 직접 넣었을때
노드확장을 하고자 하면 아래 소스처럼 하면 간단하게 된다.

위에서 차례 차례 검색하는 것보다는 해당 노드를 직접 찾고 그 부모노드를 열어주면 몇단계 안거치고 빠르게 가능해진다. 

  private void button1_Click(object sender, EventArgs e)
        {
           TreeNode[] t = treeView1.Nodes.Find(@"C:\드라이브\어쩌고\그랑께", true);
           if (t.Length > 0)
           {
               ExpendParent(t[0]);
           }
        }
        private void ExpendParent(TreeNode p)
        { 
            p.Expand();  // 자기노드 확장
            if (p.Parent != null)
            {
                ExpendParent(p.Parent);  // 부모노드를 다음으로 넣어준다.
            }
        }

참 쉽돵..  아침 군것질 거리로 딱이네...



간단하게 1,2,3,4,5,6,7,8,9,10 이란 목록을

1~10 ~ 다시 1부터 시작  ~ 10... 계속...

이런식으로 루프 되듯이 자료를 열람하는 로직을 만들때..

예 )   이미지 검색... ,문자열 흘리기등...

페이지 검색등... 도 괜찮을것 같공...

아래는 Source는 위에 나열된 10개의 숫자.

보여줄 View는 TextBox 4개로 지정..

<< 이미지 >>

1,2,3,4 가 처음 보이고 > 누르면 다음 페이지 또는 증가 숫자만큼.. 다음 리스트가 출력
< 반대로... 


간단한 알고리즘이지만... 문득.. 떠올라서 글을 써봄.

처음 문자열 흘리기 할때나. 게임 챗팅처럼 만든다고 index 값을 복잡하게 계산했던때보다는 훨씬 깔끔함..

나중에 class로 묶어두면 요기조기 써먹을데가 있을것도 같은데...

 public partial class Form1 : Form
    {
        const int viewCnt = 4; // 보여줄 View갯수.
        int totalCnt = 0;

        public Form1()
        {
            InitializeComponent();
            string[] source = this.textBox5.Text.Split(',');
            View(source);

        }

     

        int[] ViewArray  = new int[viewCnt] {0,1,2,3};

        private void button1_Click(object sender, EventArgs e)
        {
            LoopItem( +4 );
        }

        private void button2_Click(object sender, EventArgs e)
        {
            LoopItem( -4 );
        }

        private void LoopItem(int leftRight)
        {
            string[] source = this.textBox5.Text.Split(',');
            totalCnt = source.Length;
            for (int i = 0; i < viewCnt; i++)
            {
                ViewArray[i] = (ViewArray[i] + leftRight) % totalCnt;
                if (ViewArray[i] < 0)
                {
                    ViewArray[i] = 10 + ViewArray[i];
                }
            }
            View(source);
        }

        private void View(string[] source)
        {
            this.textBox1.Text = source[ViewArray[0]];
            this.textBox2.Text = source[ViewArray[1]];
            this.textBox3.Text = source[ViewArray[2]];
            this.textBox4.Text = source[ViewArray[3]];
        }

 }

사용자 정의 포멧을 지정할수 있는데
아래와 같음.
지정된 문자열을 해당 포멧으로 만들어 낼수 있음.



string str = "20090201";
string ss = string.Format(new DateTimeString(), "{0:yyyy년 mm월 dd일}", str);
this.textBox2.Text = ss;




public class DateTimeString : IFormatProvider, ICustomFormatter
        {
            #region IFormatProvider 멤버

            public object GetFormat(Type formatType)
            {
                if (formatType == typeof(ICustomFormatter))
                    return this;
                else
                    return null;
            }

            #endregion

            #region ICustomFormatter 멤버

            public string Format(string format, object arg, IFormatProvider formatProvider)
            {
                if (format == "yyyy-mm-dd" && arg.ToString().Length == 8)
                {
                    return arg.ToString().Substring(0, 4) + "-" + arg.ToString().Substring(4, 2) + "-" + arg.ToString().Substring(6, 2);
                }
                else if (format == "yyyy년 mm월 dd일" && arg.ToString().Length == 8)
                {
                    return arg.ToString().Substring(0, 4) + "년 " + arg.ToString().Substring(4, 2) + "월 " + arg.ToString().Substring(6, 2)+"일";
                }   
                return arg.ToString();
            }

            #endregion
        }

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

트리노드 검색해서 확장하기...  (0) 2010.03.17
목록 로테이션???  (0) 2010.03.16
인터페이스 활용?  (0) 2009.08.11
코드리스트 팝업 창 관련 로직.  (0) 2009.08.11
대리자에 대한 색다른 접근?  (0) 2009.08.06