GSI

24 시즌 7!!

내 일상 2009. 1. 30. 02:24 |


좀 늦은감 있지만 난 24 미드가 참 좋다.

24시간을 한시간씩 분할해서 한편씩 만들어낸 아이디어도 높이 살만하다 ^^
한주 한주 건담 더블오와 함께 미드 24시 시즌 7에 빠져 보아요 ^^
Posted by gsi
:


저번 강좌 까지 해서 DB 만들고, 웹 서비스 까지 기본으로 만들어 봤습니다.
여기서 해볼건 실버라이트 프로젝트에 웹 서비스로 등록 해 놓은 서비스를 추가 하고 바인딩 하는걸 해볼께요.

우선 기본 코드를 작성 합니다.
-- page.xaml--
<UserControl x:Class="TestBoard.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <UserControl.Resources>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="0.852*"/>
            <RowDefinition Height="0.148*"/>
        </Grid.RowDefinitions>
        <ListBox Width="Auto" Margin="2,2,2,2" x:Name="boardList" Grid.Row="1"  />
        <Button HorizontalAlignment="Left" Margin="2,2,0,2" Width="100" Content="Load Test" Click="Button_Click" />
        <TextBox Margin="2,8,146,8" Grid.Row="2" Text="TextBox" TextWrapping="Wrap" d:LayoutOverrides="Height" x:Name="TextValue"/>
        <Button HorizontalAlignment="Right" Margin="0,8,40,8" Width="102" Grid.Row="2" Content="Input" Click="Input_Click"/>
    </Grid>
</UserControl>
-- page.cs--
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace basicBoard01
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
        }

        public void Read2()
        {
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
        }

        private void Input_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}


위의 기본 코드는 아래의 화면처름 나오게 됩니다.

이제 작업을 시작해 볼께요.

서비스 참조 추가를 통해서 웹서비스를 게시한 주소를 추가한 다음에 참조를 추가 합니다.


추가한 다음에 다음과 같이 구성해 봤습니다.
"Input" 버튼을 누르면 TextBox의 값이 웹 서비스 메소드를 통해서 DB에 저장되고 완료된 후 메소드가 호출되면 ListBox에 해당 DB 리스트 정보가 보이도록 해봤습니다.

"Input" 버튼의 Click 이벤트 메소드에 아래와 같이 작성합니다.

        private void Input_Click(object sender, RoutedEventArgs e)
        {
            boardService.Service1SoapClient client =
                new basicBoard01.boardService.Service1SoapClient();

            client.AddValueCompleted += new EventHandler<basicBoard01.boardService.AddValueCompletedEventArgs>(client_AddValueCompleted);
            client.AddValueAsync(TextValue.Text);
        }

위의 코드의 내용은 웹 서비스의 Client 객체를 생성하고 웹 서비스에서 값을 추가 하기 위해서 AddValue(string value) 에 해당하는 메소드 AddValueAsync()를 호출해 줍니다.
이때 완료된 후 콜백 형태로 받기 위해서 AddValueCompleted() 라는 이벤트 함수를 하나 추가 합니다.

        void client_AddValueCompleted(object sender, basicBoard01.boardService.AddValueCompletedEventArgs e)
        {
            Read2();
        }

위와 같이 값을 DB에 기록한 후 완료가 되면 Read2()를 호출해서 값을 ListBox에 뿌리도록 했습니다.

        public void Read2()
        {
            boardService.Service1SoapClient client =
                new basicBoard01.boardService.Service1SoapClient();

            client.GetListCompleted += new EventHandler<basicBoard01.boardService.GetListCompletedEventArgs>(client_GetListCompleted);

            client.GetListAsync();
        }


마무리...
조금 장황하게 설명을 해봤지만 역시나 좀 두서가 없네요 ^^.
우선 확인되는 부분은 웹 서비스에서 AddValue, GetList 등의 메소드를 만들어 놓고 나서
웹 서비스를 참조 추가를 해서 보게 되면 위와 같이 항상 두개의 메소드가 생성 됩니다.

GetList 인 경우를 보게 되면 리턴만 받는것이기 때문에 GetListAsync() 라는 메소드만 호출하면 됩니다.
이때 호출후 리턴되는 데이터를 받는건 GetListCompleted 라는 이벤트 함수가 담당 하게 됩니다.

AddValue 인 경우를 보게 되면 리턴도 받지만 값을 인자로 받게 되는데요 AddValueAsync(TextValue.Text) 와 같이 해당 스트링 값을 입력 할 수 있게 됩니다.
이때도 AddValueCompleted 를 통해서 결과를 확인할 수 있습니다. 에러가 났는지 정상인지를 판단할 수 있다고 보여 집니다.

잘 적지는 못했지만 실버라이트에서 웹 서비스를 통해서 바인딩 하는 부분에서는 조금 접근한듯 합니다.
조금이나마 도움이 되면 좋겠네요 ^^.

지적질, 질문질 다 환영해요 ^^

Posted by gsi
:


step 1에서 기본 프로젝트를 생성 했습니다.
DB 테이블도 생성 했구요.
이제 할일은 실버라이트 프로젝트랑 DB를 연결 시켜줄 웹 서비스를 구성하는 일입니다.

웹 서비스 제작

  1. 웹 서비스 프로젝트 생성
    1. Visual C# > Web > ASP.NET 웹 서비스 응용 프로그램 을 누릅니다.
    2. 이름은 boardService로 정했습니다.
    3. 아래와 같은 프로젝트가 하나 생성 됩니다.
      이제 프로젝트가 만들어 졌으니 DB를 가져 오는 부분을 추가하고 DB 내용을 담아서 실버라이트로 넘기기 위해서 클래스를 하나 제작 합니다.
  2. DB 바인딩
    1. 데이터 집합 을 하나 생성합니다. 이름은 "dsBoard"로 정했습니다.
    2. DB 를 바인딩 하기 위해서 저 같은 경우는 서버 탐색기를 이용 합니다.
      서버 탐색기 창에서 이전 강좌에서 만들어 놓은 board 데이터 베이스를 바인딩 합니다.
      ( 이 부분 설명은 우선 생략 할께요.)
    3. 위의 memo 테이블을 dsBoard.xsd 파일의 화면으로 드래그 해서 놓으면 테이블 내용이 포함됩니다.
  3. Data.cs 클래스 파일 생성
    1. 이제 DB 연결이 준비 되었으니 위의 데이터를 받아 들일 클래스를 하나 제작했습니다.
      이름은 Data.cs 파일로 클래스 파일을 준비 하구요.
      내용은 아래와 같이 Value를 프로퍼티로 구성했어요.
  4. 웹 서비스로 노출할 메소드를 정의 하고 아래와 같이 코드를 추가 했습니다.
    1. 메소드는 리스트를 리턴해 주는 것과 해당 값을 입력 받는 메소드를 정의하고 아래와 같이 코드를 추가 했습니다.

       using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;
      using System.Web.Services;

      namespace boardService
      {
          /// <summary>
          /// Service1의 요약 설명입니다.
          /// </summary>
          [WebService(Namespace = "http://tempuri.org/")]
          [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
          [System.ComponentModel.ToolboxItem(false)]
          // ASP.NET AJAX를 사용하여 스크립트에서 이 웹 서비스를 호출하려면 다음 줄의 주석 처리를 제거합니다.
          // [System.Web.Script.Services.ScriptService]
          public class Service1 : System.Web.Services.WebService
          {
              [WebMethod]
              public string GetDate()
              {
                  return DateTime.Now.ToString();
              }

              [WebMethod]
              public List<Data> GetList()
              {
                  List<Data> datas = new List<Data>();

                  dsBoardTableAdapters.memoTableAdapter adapter = new boardService.dsBoardTableAdapters.memoTableAdapter();
                  dsBoard.memoDataTable table = new dsBoard.memoDataTable();

                  adapter.Fill(table);

                  foreach (dsBoard.memoRow row in table.Rows)
                  {
                      datas.Add(new Data(row.value.ToString()));
                  }

                  return datas;
              }

              [WebMethod]
              public bool AddValue(string value)
              {
                  try
                  {
                      dsBoardTableAdapters.memoTableAdapter adapter = new boardService.dsBoardTableAdapters.memoTableAdapter();
                      adapter.Insert(value);
                  }
                  catch (Exception ex)
                  {
                      return false;
                  }
                  return true;
              }
          }
      }

위와 같이 구성하고 localhost에 게시를 해서 하나 등록을 해 놨습니다.
이제 다음 강좌에서는 실버라이트에서 화면을 구성하고, 데이터를 연동하는 곳을 해볼께요.
위의 웹 서비스를 테스트 하고 하는 부분들은 설명이 좀 길어 질거 같아서 추가를 하지 않았습니다.
이 부분은 웹 서비스 관련 책에 많이 나오기 때문에 생략 했습니다.

Posted by gsi
:

실버라이트와 웹 서비스를 연동해서 DB의 값을 바인딩 하는 부분을 한번 해보고 있습니다.
블랜드나 기타 XAML에서 바인딩 하는건 사실 잘 못하겠구요 ^^
그래서 비하인드 코드에서 바인딩 하는 것을 테스트 해보았습니다.

주제 : 기본 프로젝트 생성, DB 테이블 생성

  1. 프로젝트 생성
    1. Visual C#>Silverlight>Silverlight 응용 프로그램 을 클릭한다.
    2. 테스트를 위해서 "솔루션에 Silverlight를 호스팅할 새 ASP.NET 웹 프로젝트 추가" 를 선택한다.
    3. 두개의 프로젝트가 생겼다. 대충 봐도 하나는 기존 WPF 형태의 프로젝트이고, 다른 하나는 웹 페이지를 표시하는거 같다.
    4. 이제 준비 작업은 끝났으니 작업을 시작해 볼께요.
  2. DB 테이블 생성
    1. DB 테이블 생성

      - 데이터 베이스 이름은 "board"로 정했고, "테이블 이름은 "memo"라고 정했다.
      - 그리고 idx 은 인덱스를 의미 하며, 1씩 증가 하도록 설정하였다.
      - 이 부분은 다 알고 있다고 가정하고 그냥 DB 부분은 스킵 ^^
Posted by gsi
:


글라스 느낌에 반짝이는 버튼 이미지가 좋다.
그래서 샘플을 보고 대충 만들어 봤다.

주변 배경이나 색상에 대해서는 아직까지 조화를 이루는 건 잘 모르겠다.

Posted by gsi
:


일을 너무 많이 벌렸나봐..

하지만 조금씩 짝이 맞아 지는듯 한 느낌이 든다.
새로운 걸 만들어 내야 하고, 그것들을 위한
준비를 해야 한다.

그중에 이미지 작업이 제일 크게 문제시 되는거 같다.
시간이 좀 남아서 책장 넘기는 이미지를 만들어 봤다.
이거 같은 경우에는 트랜스폼과 그라데이션의 적절한 효과를 통해서 구현이 가능한거 같다.


실버라이트 및 WPF 등의 소스를 만들때 이런 효과들은
참 중요한 UI 결과물을 내주는거 같다.

조금더 공부해서 효과적인 UI를 구사할 수 있도록 처리해야 할거 같다.
Posted by gsi
:

XP IIS 에 PHP 설치 하기

Etc 2009. 1. 5. 18:20 |


1. php 설치 파일을 받아서 원하는 폴더(c:\php)에 압축을 푼다.
http://www.php.net/downloads.php
(반드시 zip으로 묶인걸 받으세요. 그게 편해요)
2. c:\php\php5ts.dllC:\WINDOWS\system32 에 복사한다.
3. c:\php\dev\php5ts.libC:\WINDOWS\system32 에 복사한다.
4. php.ini-dist, php.ini-recommended 둘중에 하나를 php.ini로 바꾼 다음에 C:\WINDOWS 에 복사한다.
5. iis 설정을 한다.
5.1. 사이트 등록정보에서 ISAPI 필터 탭에서 필터이름 : phptest, 실행파일 : C:\php\php5isapi.dll 로 등록한다.
5.2. 홈디렉토리 탭에서 "구성" 버튼을 클릭한 후에 "추가" 버튼을 누른다.
5.2.1. 실행파일 : C:\php\php5isapi.dll
        확장자명 : .php
        모든 동사를 다음으로 제한 변경후 GET,HEAD,POST,DEBUG 를 추가한다.
6. IIS를 재시작 한다.

이후에는 가상디렉토리를 잡던 해당 wwwroot에 추가를 하던 아래의 파일을 하나 제작해서
테스트를 하면 된다.
    -- phpinfo.php--
       <? phpinfo()?>
Posted by gsi
:

MultiThread 예제 분석

C++ 2008. 12. 30. 14:56 |

/*  file Main.cpp
 *
 *  This program is an adaptation of the code Rex Jaeschke showed in
 *  Listing 4 of his Nov 2005 C/C++ User's Journal article entitled
 *  "C++/CLI Threading: Part II".  I changed it from C++/CLI (managed)
 *  code to standard C++.
 *
 *  One hassle is the fact that C++ must employ a free (C) function
 *  or a static class member function as the thread entry function.
 *
 *  This program must be compiled with a multi-threaded C run-time
 *  (/MT for LIBCMT.LIB or /MTd for LIBCMTD.LIB).
 *
 *                                      John Kopplin  7/2006
 */

#include <stdio.h>
#include <windows.h>          // for HANDLE
#include <process.h>          // for _beginthread()

static bool interlocked = false;    // change this to fix the problem

const int maxCount = 100000000;
static LONG value = 0;              // under Windows Server 2003 you
                                    // could use LONGLONG here

unsigned __stdcall TMain(void* arg)
{
    if ( interlocked )
    {
      for ( int i = 1; i <= maxCount; i++ )
      {
        InterlockedIncrement(&value); // under Windows Server 2003 you
                                      // could use InterlockedIncrement64() here
      }
    }
    else
    {
      for ( int i = 1; i <= maxCount; i++ )
      {
        ++value;
      }
    }

    return 3;  // thread exit code
}


int main()
{
    // In this program we create 3 threads and request that their
    // entry-point-function be the TMain() function which is a
    // free (C) function and hence causes no problems for
    // _beginthreadex()

   
    HANDLE   hth1;
    unsigned  uiThread1ID;

CreateThread() 함수를 사용했을 때 스레드에서 Win32 함수만을 사용한다면 문제가 없지만 C 런타임 라이브러리 호출을 하려면 _beginthread()나 _beginthreadex() 를 사용해야 한다.

(원형) unsigned long _beginthread( void (*lpThreadEntryPoint)(void* lpArgList), unsigned uStackSize, void* lpArgList );

lpThreadEntryPoint 는 스레드가 시작된 함수의 주소인데, 이 함수에는 CreateThread()와 같이 한 개의 32비트 인자인 lpArgList가 있으며 이 값을 _beginthread()에 전달해야 한다. 이 함수는 void 타입으로 정의되어 CreateThread()와 조금 차이가 있다. 이 함수는 종료시까지 실행되는데 값을 반환하지는 않는다. uStackSize는 CreateThread()에서와 동일한 의미를 가지는데 스레드 스택의 베이스에서 커멧될 바이트 수이며, 이 값을 0으로 하면 윈도우는 부모 스레드에서 커멧된 것과 동일한 양의 메모리를 커멧힌다.

_beginthreadex() 는 CreateThread()와 완전히 같고 SECURITY_ATTRIBUTES 포인터와 시작 플래그(0이나 CREATE_SUSPENDED), 스레드 ID를 받는 포인터를 인자로 받는다. 일시 정지된 상태에서 스레드를 시작하거나 PostThreadMessage()에 스레드 ID를 사용하려면 _beginthreadex()를 사용해야 한다. _beginthread()
로 시작한 스레드만이 종료 코드를 설정할 수 있으므로 이때에도 필요하다.

    hth1 = (HANDLE)_beginthreadex( NULL,         // security
                                   0,            // stack size
                                   TMain,        // entry-point-function
                                   NULL,         // arg list
                                   CREATE_SUSPENDED,  // so we can later call ResumeThread()
                                   &uiThread1ID );

    if ( hth1 == 0 )
        printf("Failed to create thread 1\n");

    DWORD   dwExitCode;

 스레드가 수행되는 동안에 GetExitCodeThread()를 호출하면 종료 코드 STILL_ACTIVE를 반환한다.
 스레드에서 return 문이 등장하면 윈도우는 ExitThread()를 대신 호출해서 return 문에 전달된 값을 전달해 주는데, 이 때문에 입구 함수는 DWORD의 반환값을 갖는다.
 스레드를 시작하는 방법이 여러가지 있고 각각의 종료 함수도 다르므로 스레드에서는 단순히 return문을 사용하는 것이 좋다.

    GetExitCodeThread( hth1, &dwExitCode );  // should be STILL_ACTIVE = 0x00000103 = 259
    printf( "initial thread 1 exit code = %u\n", dwExitCode );

    HANDLE   hth2;
    unsigned  uiThread2ID;

    hth2 = (HANDLE)_beginthreadex( NULL,         // security
                                   0,            // stack size
                                   TMain,        // entry-point-function
                                   NULL,         // arg list
                                   CREATE_SUSPENDED,  // so we can later call ResumeThread()
                                   &uiThread2ID );

    if ( hth2 == 0 )
        printf("Failed to create thread 2\n");

    GetExitCodeThread( hth2, &dwExitCode );  // should be STILL_ACTIVE = 0x00000103 = 259
    printf( "initial thread 2 exit code = %u\n", dwExitCode );

    HANDLE   hth3;
    unsigned  uiThread3ID;

    hth3 = (HANDLE)_beginthreadex( NULL,         // security
                                   0,            // stack size
                                   TMain,        // entry-point-function
                                   NULL,         // arg list
                                   CREATE_SUSPENDED,  // so we can later call ResumeThread()
                                   &uiThread3ID );

    if ( hth3 == 0 )
        printf("Failed to create thread 3\n");

    GetExitCodeThread( hth3, &dwExitCode );  // should be STILL_ACTIVE = 0x00000103 = 259
    printf( "initial thread 3 exit code = %u\n", dwExitCode );

    // If we hadn't specified CREATE_SUSPENDED in the call to _beginthreadex()
    // we wouldn't now need to call ResumeThread().

인자 dwFlags는 스레드의 초기 스케쥴링을 결정하는데 0의 값으로 설정하면 윈도우는 스레드가 바로 수행되도록 스케쥴 하고, 0이 아닌 CREATE_SUSPENDED의 값은 핸들을 ResumeThread()에 전달할 때까지 스레드가 실행되지 않도록 한다.

    ResumeThread( hth1 );   // Jaeschke's   // t1->Start();
    ResumeThread( hth2 );   // Jaeschke's   // t2->Start();
    ResumeThread( hth3 );   // Jaeschke's   // t3->Start();

    // In C++ the process terminates when the primary thread exits
    // and when the process terminates all its threads are then terminated.
    // Hence if you comment out the following waits, the non-primary
    // threads will never get a chance to run.

    WaitForSingleObject( hth1, INFINITE );  // Jaeschke's t1->Join()
    WaitForSingleObject( hth2, INFINITE );  // Jaeschke's t2->Join()
    WaitForSingleObject( hth3, INFINITE );  // Jaeschke's t3->Join()

    GetExitCodeThread( hth1, &dwExitCode );
    printf( "thread 1 exited with code %u\n", dwExitCode );

    GetExitCodeThread( hth2, &dwExitCode );
    printf( "thread 2 exited with code %u\n", dwExitCode );

    GetExitCodeThread( hth3, &dwExitCode );
    printf( "thread 3 exited with code %u\n", dwExitCode );

    printf( "After %d operations, value = %d\n", 3 * maxCount, value );
                                         // under Windows Server 2003 you
                                         // could use %I64d

    // The handle returned by _beginthreadex() has to be closed
    // by the caller of _beginthreadex().

대부분의 스레드 관리 함수는 스레드 핸들을 필요로 하는데 그 중 몇몇만이 스레드 ID를 필요로 하고 가장 필요로 하는 함수는 PostThreadMessage()이다. 모든 Win32 핸들과 같이 스레드 핸들의 사용이 끝나면 CloseHandle() 함수를 사용하여 스레드 핸들을 닫아야 한다. 이것은 스레드 자체에는 아무런 영향을 미치지 않는다. 스레드 핸들을 닫는 것은 스레드를 끝내는(Kill) 것과는 다르며, 이렇게 하지 않을 경우 프로그램이 종료할 때까지 시스템 자원이 할당된 채로 남게 된다.

    CloseHandle( hth1 );
    CloseHandle( hth2 );
    CloseHandle( hth3 );

    printf("Primary thread terminating.\n");
}

Posted by gsi
:

안녕하세요, 아이템거래 중개몰을 판매하고 있습니다.

http://www.visualg.kr/item <~~~ 우선 여기를 오픈해서 한번 보세요 ^^


사이트 소개

1. 어디서든 볼수 없다. 마일리지 잠금 서비스

:아이템거래시장을 석권하고 있는, 아이템매니아 . 베이 등에서도 마일리지 잠금장치는 보실 수 없습니다.
마일리지 잠금장치는 저희 싸이트에만 있는 특출된 서비스입니다.
한번 보시길 바랍니다~^^!

2. 자동 통장인증 시스템.

:출금이 완료되면 자동으로 계좌인증이 되도록 만들었습니다.
따로 회원정도 수정없이 간편하게 됩니다.

3. 편리한 관리자페이지

:관리자 페이지가 매우 손쉽습니다.
때문에, 혼자서 운영 가능하십니다.


개발 유지보수 특징

1. APS로 제작되어 있어서 수정이 손쉽게 됩니다.
2. FTP 및 DB 설정등 기본적인 셋팅을 지원해 드립니다.
3. 풀 소스를 이전해 드립니다.

한번 보시고 판단해 주세요.

1. 리뷰 홈페이지 : http://www.visualg.kr/item
2. 연락처 : gsi451@naver.com
 

판매 가격

판매가격 : 80만원
  : 소스비용 + DB셋팅

궁금한 점은 연락 주세요.
일반회원 아이디와 관리자 아이디를 지원해 드리겠습니다.
한번 구경하시고 판단해 주시기 바랍니다.

Posted by gsi
:

<설명>
1. ASP 쇼핑몰 구축 프로젝트 의 DB 스크립트 입니다.
2. www.hanb.co.kr/exam/1390 에 소스 자료가 있습니다.
3. 책 제목은 "Asp 쇼핑몰 구축 프로젝트 모듈 기반 쇼핑몰 개발 실무"

 Table

 Member

 Product

 Category

 Cart

 Btable

Porder
Posted by gsi
:

System.Object & 오버라이딩

C# 2008. 12. 6. 17:25 |

System.Object

System.Object는 모든 .NET의 최상위 클래스이다.
즉, .NET에 있는 모든 참조 타입은 이 클래스를 상속하게 된다.

근데 상속이라고 하면
class A : Object
{
...
이런걸 생각 하겠지만 사실 이렇게 하지 않아도 내부적으로는 Object를 상속 받게 되는 것이다.

우선 기본 멤버들을 보게 되면,
  • Equal : 두 객체 인스턴스가 서로 같은지를 검사한다. 값이 아닌 참조를 비교한다.
  • Finalize : 객체가 제거될때 자동으로 실행되는 protected virtual 메소드
    이 메소드는 오버라이딩이 되지 않으며, C++과 비슷하게 소멸자를 통해서 처리가 됨
  • GetHashCode : 객체에 대한 해쉬 코드를 생성
  • GetType : 객체의 타입을 리턴한다.
  • MemberwiseClone : 객체의 일부분에 대한 복사본을 리턴한다.
  • ReferenceEquals : 두 객체 인스턴스가 동일한 인스턴스를 가리키는지 테스트 하는 public static 메소드
  • ToString() : 객체를 표현하는 스트링을 리턴

System.Object 오버라이딩

public class Pixel {
  public Pixel (byte x, byte y) {
    this.x = x;
    this.y = y;
  }

  private byte x;
  private byte y;

  public override string ToString() {
    return "(" + x + "," + y + ")";
  }

  public override bool Equal(object o) {
    try {
      Pixel p = (Pixel)o;
      return p.x = x && p.y == y;
    } catch (Exception) {
      return false;
    }
  }

  public override int GetHashCode() {
    return (x<<8) + y;
  }
}

ToString() 내부에서 x, y 좌표값을 콤마로 구분해서 보여줍니다.
만약 이게 선언되어 있지 않다면, 클래스 이름만을 리턴합니다.

Pixel p = new Pixel(200, 250);
Console.WriteLine(p); //"(200,250)" 을 출력한다.

Equal() 메소드는 내부에서 해당 값들을 비교해서 같다면
true를 리턴하게 됩니다.

Pixel을 선언한 두개의 변수가 있다고 하지만 이것은 어디까지나 참조 타입으로
참조 주소가 두개가 틀리게 되기 때문에 내부의 값이 같은지 비교 하기 위해서는
Equal을 오버라이딩 해줘야 하는 것입니다.

Finalization
참조 타입은 힙에 생성된다. 힙은 런타임이 알아서 관리 한다.
힙 공간을 좀 더 확보할려면 사용하지 않는 객체에 대해 가비지 컬렉션을 수행해야 한다.
System.Object에 있는 Protected visual 인스턴스 메소드인 Finalize를
"오버라이드" 하여, 가비지 컬렉션에 의해 객체가 제거되기 전에 사용한 자원을 리턴할 수 있다.
하지만 ToString(), Equal()등의 메소드와 같이 일반적으로 오버라이드가 불가능하며
소멸자 기호를 사용해야 한다.

Finalization & Dispose 메소드
객체를 제거하기 전, 사용한 리소스를 명시적으로 해제해야 할 경우, .NET 관련 문서에서는
Dispose 메소드를 작성한 후 이를 호출해 주는 방법을 권장하고 있다.
이때 System.IDisposable 인터페이스를 사용하게 된다.

Dispose 메소드에서는 GC.SuppressFinalize(this) 라는 static 메소드를 호출함으로써 더 이상의
finalization이 진행되지 못하도록 할 수도 있다.


결과적으로 Dispose를 통해서 특정한 자원을 리턴하거나, finalization 을 사용해서
프로세스에 맏기도록 선택할 수 있다.

즉, 더이상 사용할 필요가 없는 객체를 완전히 제거하려는 경우에는 Dispose 메소드를 이용하는 것이 좋다.
Finalization은 어느정도의 시간이 소모되기 때문에 가급적 명시적으로 자원을 리턴해야 하는 경우만 사용하자.


이잉
Posted by gsi
:

저번주에 값, 참조 타입에 대해서 스터디를 했다.
한번더 복습의 경험이 된거 같다.

우선 여기서 적을 것은 참조 타입의 주소 참조를 통해서 일어나는
몇가지를 적을 생각이다.

string 의 경우 값을 여러개 대입하거나 += 연산자를 통해서
해당 값들을 추가 할때 참조타입이기 때문에 메모리 공간에 값이 추가 되면서
string의 변수가 참조를 하게 된다.

이때 값을 대입하거나, += 을 통해서 대입되는 값들은
새로운 메모리 공간을 또 요구 하게 된다. 즉, 나머지 이전의 참조 값들은
더이상 참조가 되지 않는 것 뿐이며, 그 값은 가비지 컬렉터를 통해서
지워지게 된다.
그렇다 보니 그 값은 지워지지 않은 상태에서 많은 메모리를 소비 하게 된다.

string은 대입을 한번만 하고 해당 정보를 가져다 쓸때만 사용하는 것이 좋다.
만약 여러번의 대입을 사용할 경우는 StringBuilder 을 쓰는게 좋다.
이건 메모리를 충분히 잡아 놓은 상태에서 해당 값들을 계속해서
추가 하더라도 string보다는 메모리 소비가 적게 된다.

Posted by gsi
:

XP 정품 시리얼 번호 변경

Etc 2008. 11. 22. 00:52 |

레지스트리수정을 통한 Windows XP시리얼 번호 변경

1. 시작 > 실행 에서 regedit 입력하고, HKEY_Local_Machine+Software+Microsoft+WindowsNT+Current Version+WPAEvents 이걸 찾아서 오른쪽 창에 있는 "oobetimer" 항목에 대고 마우스 오른쪽 눌러서 값을 아무거나 바꿔 인증상태를 Deactivation 상태로 변경한다. (값에서 CA만 지워도 가능)
 


2. 레지스터리 편집창 닫고, 다시 시작 > 실행에서  %systemroot%\system32\oobe\msoobe.exe /a  을 입력하면, 인증창이 뜨는데, 
리스트중 두번째 전화를 걸어 인증할 수 있는 옵션을 선택한다.
 
 
3. 두번째 옵션을 선택하고 next 누르면 새창이 뜨는데 다른것은 무시하고 하단 메뉴의 '제품 key 변경' 버튼을 누른다. 그러면 또 새로운 key 입력 창이 뜨는데, 거기에 정식 시리얼키를 입력하고 화면 하단의 '나중에 알림'버튼을 눌러 인증과증을 종료한다.

Posted by gsi
:

부팅 USB 제작하기

Etc 2008. 11. 15. 17:21 |


1. USB TOOL SETUP.exe 를 사용해서 설치 한다.
2. USB의 데이터는 모드 백업한 후에 위의 설치된 프로그램을 사용해서 생성 가능합니다.
3. 설치후에 해당 내용은 도움말을 참조 하세요.

전 위의 내용을 사용해서 win98의 부팅 이미지가 복사되도록 하고 나서
부팅 해보니 제대로 되네요. (단, BIOS에서 USB 부팅이 지원되어야 합니다.)

설치 파일 :
.
Posted by gsi
:

조인 테이블 테스트시 필요한 쿼리문
학생, 동아리 테이블은 기본으로 생성됨
학생동아리 테이블은 FK로 구성되어짐
-------------------------------------------------------------------------------------------
use sqlDB
create table stdTbl
(
 stdName nvarchar(10) not null primary key,
 addr nchar(4) not null
)
go

create table clubTbl
(
 clubName nvarchar(10) not null primary key,
 roomNo nchar(4) not null
)
go

create table stdclubTbl
(
 num int identity not null primary key,
 stdName nvarchar(10) not null
  foreign key references stdTbl(stdName),
 clubName nvarchar(10) not null
  foreign key references clubTbl(clubName)
)
go

insert into stdTbl values('박지성', '서울')
insert into stdTbl values('박주영', '경기')
insert into stdTbl values('조재진', '충북')
insert into stdTbl values('이천수', '인천')
insert into stdTbl values('안정환', '강원')
go
insert into clubTbl values('수영', '101호')
insert into clubTbl values('바둑', '102호')
insert into clubTbl values('축구', '103호')
insert into clubTbl values('봉사', '104호')
go
insert into stdclubTbl values('박지성', '바둑')
insert into stdclubTbl values('박지성', '축구')
insert into stdclubTbl values('조재진', '축구')
insert into stdclubTbl values('이천수', '축구')
insert into stdclubTbl values('이천수', '봉사')
insert into stdclubTbl values('안정환', '봉사')
go

Posted by gsi
: