천객만래 [千客萬來] (It has an interminable succession of visitors)

지식 근로자들은 원시 숫자들이 그래프 형식으로 표현되었을 때 좀더 데이터를 효율적으로 이해할 수 있습니다. 웹 페이지에서 데이터베이스 정보를 보여줄 때 특히 차이가 납니다. 해당 데이터를 보여줄 때 간단한 차트일지언정 그것을 사용하고, 사용하지 않고의 차이는 분명합니다. 과거에 ASP 의 경우, 데이터 기반의 차트를 동적으로 생성하려면 서드파티 업체에서 만든 이미지 생성 COM 컴포넌트를 구매해야 했습니다. ASP.NET 이 나온 지금, 개발자들은 C# 언어로 .NET Framework에서 제공되는 그리기 관련 클래스를 이용하여 동적 이미지나 차트를 쉽게 생성할 수 있습니다. 
--------------------------------------------------------------------------------

ASP의 놀라운 성공을 이끈 가장 중요한 요소는, 개발자들이 쉽게 데이터중심의 웹 페이지를 개발할 수 있다는 점이었습니다. 특히 인트라넷에서, 데이터를 다루는 웹 페이지의 일반적인 예는 보고서 페이지입니다. 그런 페이지들은 데이터베이스로부터 가져온 데이터를 방문자가 쉽게 이해할 수 있는 방식으로 표현을 해줍니다. ASP 페이지에서 텍스트 기반의 보고서 정보를 출력하는 것은 너무 쉬운 일이지만, 그러한 정보를 그래픽적인 요소까지 곁들여 차트양식으로 보여주는 것은 ASP의 영역을 넘는 전혀 새로운 기능입니다. 
필자가 ASP를 시작한 것은 지난 1998년 1월 이었습니다. 아마도 바로 그날, 한국에선 눈이 왔을지도 모르겠습니다. 주어진 과제는 제가 근무하고 있던 컨설팅 회사를 위해 사내 보고서 시스템을 개발하는 것이었습니다. 하루 업무가 끝날 때 쯤, 각 컨설턴트들은 회사 인트라넷 시스템 개발 착수와 관련해서 의논을 했습니다. 각 컨설팅 그룹의 관리자들은, 개별 컨설턴트와 그룹단위로 지나간 수익을 보여주는 보고서 양식을 원했습니다. 정보를 보여주기 위해, 텍스트 양식으로 된 숫자를 단순히 나열하는 것이 아닌, 다양한 차트와 그래프로 지나간 수익과 앞으로 기대되는 수익을 보고 싶다고 요청했습니다. 
필자가 ASP를 시작한 것은 지난 1998년 1월 이었습니다. 아마도 바로 그날, 한국에선 눈이 왔을지도 모르겠습니다. 주어진 과제는 제가 근무하고 있던 컨설팅 회사를 위해 사내 보고서 시스템을 개발하는 것이었습니다. 하루 업무가 끝날 때 쯤, 각 컨설턴트들은 회사 인트라넷 시스템 개발 착수와 관련해서 의논을 했습니다. 각 컨설팅 그룹의 관리자들은, 개별 컨설턴트와 그룹단위로 지나간 수익을 보여주는 보고서 양식을 원했습니다. 정보를 보여주기 위해, 텍스트 양식으로 된 숫자를 단순히 나열하는 것이 아닌, 다양한 차트와 그래프로 지나간 수익과 앞으로 기대되는 수익을 보고 싶다고 요청했습니다. 
클라이언트에 독립적이기 위해 좀 더 나은 구상은 ASP 페이지에서 GIF 또는 JPG 이미지 파일을 생성해 내서 클라이언트의 브라우저에 파일로 보내주는 것이었습니다. 그러한 작업은 COM 컴포넌트를 사용하지 않고는 ASP 에서 불가능한 작업입니다. 다행히도, ASP 개발자들을 위해 서버측 그래프를 생성해 주는 수많은 서드파티 업체들이 COM 개체를 제공해 주고 있습니다. 필자가 발견한 ASPIn.com(http://www.aspin.com/home/components/graphics/charts (영문))만 해도 16 종류의 컴포넌트에 대한 링크를 제공해 줍니다. 
그러나 ASP.NET의 등장으로, 여러분들은 동적 차트와 그래프를 서드파티 COM 컴포넌트의 도움을 받지 않고도 생성할 수 있습니다. 마이크로소프트의 .NET Framework는 System.Drawing 네임스페이스에서 그래프와 관련된 많은 클래스를 제공해 주고 있습니다. 거기서 제공되는 클래스들을 이용해서 독립 윈도우 기반 응용 프로그램이나 ASP.NET 웹 페이지 모두에서 다양한 포맷으로 된 이미지를 생성하고 편집할 수 있습니다. 클라이언트로부터 요청이 들어왔을 때, 이러한 클래스들을 이용하여 여러분들은 데이터베이스 정보에 기반한 차트를 보여주는 ASP.NET 웹 페이지를 생성할 수 있습니다. 요청에 대한 응답으로 이미지를 보내줄 수가 있는 것입니다. 
완벽한 동적 차트를 목표로 하기 전에, 우선 어떻게 ASP.NET 페이상에서 프로그램적인 방법으로 이미지를 생성할 수 있는지에 대해서 살펴보겠습니다. 

간단한 이미지를 보여주는 코드 작성
.NET Framework에서 제공되는 System.Drawing 네임스페이스는 이미지를 생성/편집하는 데에 필요한 모든 클래스를 포함합니다. 이미지 생성과 관련해서는 2가지 클래스, Bitmap, Graphics 가 제공됩니다. Bitmap 클래스는 캔버스로, Graphics 클래스는 화필로 생각해 볼 수 있습니다. 잠시 후에, 팔레트 생성을 위해 Bitmap 클래스를 어떻게 사용하는 지에 대한 방법과, 그림이 완성되었을 때 Bitmap 클래스에서 제공되는 Save 메서드를 이용해서 파일로 저장 또는 스트림으로 직접 전송하는 것을 둘 다 보여드리겠습니다. Graphics 클래스는 이미지, 도형, 문자열을 그리기 위해 필요한 모든 메서드를 포함합니다. 
캔버스를 생성하기 위해서, 아래와 같이 Bitmap 클래스의 새 인스턴스를 생성하는 것이 필요합니다. 

Bitmap myBitmap = new Bitmap(width, height); 
이제 필자는 캔버스 하나를 가지게 되었고, Graphics 클래스의 인스턴스와 페인트 브러쉬를 생성합니다. 이어서 사용해야 할 캔버스를 지정하기만 하면 됩니다. 이를 위해 Graphics 에서 제공되는 정적 메서드 FromImage를 사용할 수 있습니다. 그 메서드는 단 하나의 Image 인스턴스를 인자로 받아서 Graphics 인스턴스를 반환해 줍니다. (필자의 경우, Bitmap 클래스의 인스턴스를 전달했습니다. 참고로, Bitmap 클래스는 Image 클래스로부터 상속받았습니다.) 

Graphics myGraphics = Graphics.FromImage(myBitmap); 
이젠, 이미지, 도형, 문자열 등을 캔버스 위에 그릴 수 있는 준비가 되었습니다. 잠시 .NET Framework 설명서를 실행시키고 Graphics 클래스를 살펴보십시오. 도형 그리기와 관련된 방대한 분량의 메서드가 제공되는 것을 알 수 있습니다. 그러한 메서드들은 크게 2 가지로 쌍으로 존재하는 것이 눈에 뜨입니다. DrawShape와 FillShape에 대해서 각각 DrawEllipse와 FillEllips가 있습니다. Draw 류는 간단하게 도형의 외곽선을 그려주고, Fill 류는 도형을 그리고 내용 역시 채워줍니다. 예를 들어, 표 1에서 보는 것처럼 468×60 픽셀 규격의 광고 문구를 생성하고 싶다고 하면,표 2와 같은 코드를 사용할 수 있습니다. Page_Load 이벤트 처리기에 구체적인 코드가 구현되어 있습니다. 


표 1 표준 광고 배너

ASP.NET 웹 페이지에서 이미지 보기 
표 2 의 코드에서는 한가지 기능이 빠져 있습니다. 이미지를 저장하는 방법에 관해서입니다. 예제에서의 코드는 "MSDN


ASP.NET_Draw.zip


Posted by SB패밀리

.NET Framework 클래스 라이브러리
GlobalizationSection 클래스

참고: 이 클래스는 .NET Framework 버전 2.0에서 새로 추가되었습니다.

웹 응용 프로그램의 전역화 인프라를 지원하는 데 사용되는 구성 설정을 정의합니다. 이 클래스는 상속될 수 없습니다.

네임스페이스: System.Web.Configuration
어셈블리: System.Web(system.web.dll)

 

C#
public sealed class GlobalizationSection : ConfigurationSection
 
 
설명

GlobalizationSection 클래스를 사용하면 구성 파일의 globalization 섹션에 있는 내용을 프로그래밍 방식으로 액세스하고 수정할 수 있습니다.

이 예제에서는 GlobalizationSection 클래스의 멤버로 액세스할 수도 있는 globalization 섹션의 몇 가지 특성에 대한 값을 선언적으로 지정하는 방법을 보여 줍니다.

다음 구성 파일 예제에서는 globalization 섹션의 값을 선언적으로 지정하는 방법을 보여 줍니다.

 

<system.web>
  <globalization 
    requestEncoding="utf-8"
    responseEncoding="utf-8"/>
</system.web>
다음 코드 예제에서는 GlobalizationSection 클래스를 사용하는 방법을 보여 줍니다.
C#
#region Using directives

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Web;
using System.Web.Configuration;

#endregion

namespace Samples.Aspnet.SystemWebConfiguration
{
  class UsingGlobalizationSection
  {
    static void Main(string[] args)
    {
      try
      {
        // Set the path of the config file.
        string configPath = "";

        // Get the Web application configuration object.
        Configuration config = WebConfigurationManager.OpenWebConfiguration(configPath);

        // Get the section related object.
        GlobalizationSection configSection =
          (GlobalizationSection)config.GetSection("system.web/globalization");

        // Display title and info.
        Console.WriteLine("ASP.NET Configuration Info");
        Console.WriteLine();

        // Display Config details.
        Console.WriteLine("File Path: {0}",
          config.FilePath);
        Console.WriteLine("Section Path: {0}",
          configSection.SectionInformation.Name);

        // Display Culture property.
        Console.WriteLine("Culture: {0}",
          configSection.Culture);
        
        // Set Culture property.
        configSection.Culture = 
          System.Globalization.CultureInfo.CurrentCulture.ToString();
         
        // Display EnableClientBasedCulture property.
        Console.WriteLine("EnableClientBasedCulture: {0}", 
          configSection.EnableClientBasedCulture);

        // Set EnableClientBasedCulture property.
        configSection.EnableClientBasedCulture = false;

        // Display FileEncoding property.
        Console.WriteLine("FileEncoding: {0}", 
          configSection.FileEncoding);

        // Set FileEncoding property.
        configSection.FileEncoding = 
          System.Text.Encoding.UTF8;

        // Display RequestEncoding property.
        Console.WriteLine("RequestEncoding: {0}",
          configSection.RequestEncoding);

        // Set RequestEncoding property.
        configSection.RequestEncoding = 
          System.Text.Encoding.UTF8;

        // Display ResponseEncoding property.
        Console.WriteLine("ResponseEncoding: {0}",
          configSection.ResponseEncoding);

        // Set ResponseEncoding property.
        configSection.ResponseEncoding = 
          System.Text.Encoding.UTF8;

        // Display ResponseHeaderEncoding property.
        Console.WriteLine("ResponseHeaderEncoding: {0}", 
          configSection.ResponseHeaderEncoding);

        // Set ResponseHeaderEncoding property.
        configSection.ResponseHeaderEncoding = 
          System.Text.Encoding.UTF8;

        // Display UICulture property.
        Console.WriteLine("UICulture: {0}",
          configSection.UICulture);

        // Set UICulture property.
         configSection.UICulture = 
           System.Globalization.CultureInfo.CurrentUICulture.ToString();

        // Update if not locked.
        if (!configSection.SectionInformation.IsLocked)
        {
          config.Save();
          Console.WriteLine("** Configuration updated.");
        }
        else
        {
          Console.WriteLine("** Could not update, section is locked.");
        }
      }

      catch (Exception e)
      {
        // Unknown error.
        Console.WriteLine(e.ToString());
      }

      // Display and wait
      Console.ReadLine();
    }
  }
}
 
상속 계층 구조 
System.Object
   System.Configuration.ConfigurationElement
     System.Configuration.ConfigurationSection
      System.Web.Configuration.GlobalizationSection
이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

.NET Framework

2.0에서 지원
Posted by SB패밀리

비주얼스튜디오 2008을 사용하여 작업을 하고 있다.
비주얼스튜디오 2008은 닷넷 프레임워크 3.5를 지원하고 사용한다.
이번에 윈도우즈 서비스를 제작하면서
윈도우즈 서비스 프로젝트를 제작할 때 사용할 닷넷 버전을 프로젝트 속성에서 설정하는데
.NET Framework 3.5가 아닌 .NET Framework 2.0으로 설정을 했다.
하지만 웬일인지 설치 프로젝트를 제작할 때 위의 프로젝트를 추가하여 발견된 종속성에서는 .net framework 3.5를 계속 사용하려고 하는 것이다.

그래서, .csproj 파일을 직접 살펴보고 수정을 하였다.
3.5 라는 숫자를 검색해 보니 Microsoft.Net.Framework.3.5에 True라고 체크가 되어 있다.
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
      <Visible>False</Visible>
      <ProductName>.NET Framework 3.5</ProductName>
      <Install>True</Install>
    </BootstrapperPackage>

그래서 이부분을 아래와 같이 수정하였다.
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
      <Visible>False</Visible>
      <ProductName>.NET Framework 3.5</ProductName>
      <Install>False</Install>
    </BootstrapperPackage>


그리고  Microsoft.Net.Framework.2.0 에서는 아래와 같이 수정하였다.

<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
      <Visible>false</Visible>
      <ProductName>.NET Framework 2.0%28x86%29</ProductName>
      <Install>true</Install>
    </BootstrapperPackage>

그리고 난 후

<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
      <Visible>false</Visible>
      <ProductName>.NET Framework 2.0%28x86%29</ProductName>
      <Install>true</Install>
    </BootstrapperPackage>


그리고 설치배포 프로젝트에서도
추가 프로젝트를 다시 하고 .NET Framework Version 정보를

3.5.21022   -->>  2.0.50727

로 수정하였다.

.csproj 파일을 수정후 두번에 걸친 Build와 setup.exe를 생성하고 나니 .net framework 3.5를 설치하지 않는 것이다.

이래서 XP버전상에 .net framework 3.5가 설치되지 않은 컴퓨터에서 불필요하게 설치되는 것을 막을 수 있었다.
Posted by SB패밀리