HTML5&CSS2012. 8. 26. 17:28

이 페이지는 HTML&CSS3(로드북, 양용석 지음) 책자와 추가적인 구글링을 통해 습득된 정보로 학습을 하며 정리하는중입니다.

1. 웹표준의 등장 배경.

초창기 웹은 지금처럼 복잡하지 않고 매우 간단했습니다.

택스트 형식의 웹에 이미지 몇개 올라가는 정도였습니다.

지금처럼 웹프로그램을 이용한다는 개념조차 없이 단순히 웹사이트(홈페이지)를 만들기 위한 언어로 HTML이 있었습니다.

Netscape라는 브라우저가 세계를 휍쓸던 시절이었습니다.

HTML이란 용어는 1991년 처음 사용되었고 1995년 W3C(www.w3.org  웹기술의 표준화를 담당하는 세계적 기구이며 HTML, CSS, CML등 웹에 관련된 다양한 기술이 논의되고 표준화 작업이 이루어진다)에서 정식으로 HTML2.0 표준안을 발표했었습니다. 

HTML(1991)--> HTML2.0(1995) --> HTML4.0(1997) --> HTML4.01(1999) --> XTML1.0(2000) --> XHTML1.1(2001) --> XHTML2.0(2007) --> HTML5

1999년 HTML4.01 이후로 HTML을 XML형태로 사용할 수 있도록 한 XHTML이 별도로 제정되었지만 2001년 XHTML1.1이후로 표준화 되지 않았습니다.(XHTML2.0은 2007년 포기하엿습니다)

표준이 10년간 머물러 있는 동안에도 웹기술은 더욱 빠르게 발전 되었습니다.

MS에서 독자적으로 만든 ActiveX를 비롯하여 표준화 되지 않는 각종 기능으로 인하여 많은 사용자들이 불편을 격어야 했습니다. 이에 HTML5라는 새로운 표준안이 만들어지고 있습니다.

현재의 브라우저 개발사들은 모두 HTML5를 지원하고 잇습니다.

2. 웹표준의 장점

웹 표준을 지키는 사이트는 구조와 표현, 양식을 분리해서 개발하게 됩니다. 그렇기 떼ㅐ문에 사이트 용량이 에전에 비해 현저하게 작아 집니다. CSS는 HTML과 구조가 분리되어 있기 때문에 한 번 해당페이지를 불러오게 되면 부라우저의 캐시에 CSS가 저장 됩니다. 따라서 다시 불러올 필요가 없기 때문에 HTML코드가 가벼워 지는 것입니다.

물론 구조와 표현을 분리하기 때문에 사이트 개발 기간 및 유지보수에 용이 합니다.

 

 

 

 

'HTML5&CSS' 카테고리의 다른 글

HTML5 와 CSS3 Study #2 (CSS 일반규칙)  (0) 2012.09.02
HTML5 와 CSS3 Study #2 (CSS)  (0) 2012.08.26
HTML5 와 CSS3 Study #2 (구조)  (0) 2012.08.26
Posted by 알 수 없는 사용자
.NET Framework/C#2012. 8. 10. 17:46

안녕하세요. 엉스데브 입니다.


오늘은 .NET/C# 으로 UDF 를 만드는 여러 방법 중 Excel-DNA 라이브러리를 이용하는 방법을 알아보겠습니다.

@Excel-DNA 홈페이지 주소:
http://excel-dna.net/

@Excel-DNA 관련 문서 링크:
http://exceldna.codeplex.com/documentation


엑셀 UDF 를 만드는 방법은 여러가지가 있지만, 그 중 Excel-DNA 라이브러리를 이용하는 방법이 아래 정리한 이유들 때문에 가장 마음에 듭니다. 

1. 심플하고 직관적인 방법으로 개발이 가능 하며, 디버깅도 용이하게 수행 가능합니다.

2. 함수에 대한 설명을 지정 해 줄 수 있고, 함수의 파라미터에 대한 세부 설명까지도 지정이 가능 합니다.

3. 배포에 용이한 형식(.xll 단일 파일)으로 패키징 할 수 있는 패키징 도구를 제공 합니다.


그럼 실제로 어떻게 만드는지 단계별로 알아봅시다.

@Excel-DNA 를 이용한 엑셀 UDF 만들기


이렇게 만든 엑셀 UDF를 비주얼 스튜디오에서 디버깅 모드로 디버깅도 할 수 있습니다.


@Excel-DNA 를 이용한 엑셀 UDF 함수 디버깅 하기


개발하는 동안에는 이렇게 개발과 디버깅을 반복하면 됩니다.

개발이 완료 된 후 배포를 해야 하는데, Excel-DNA 라이브러리에서 제공하는 패키징 도구를 사용하면 깔끔하게 패키징 할 수 있습니다.

패키징을 하면 단일 .xll 파일이 하나 생기는데, 이 파일은 이름을 마음대로 변경해도 되며, 다른 .dll 파일은 필요가 없게 됩니다.

단일 .xll 파일 하나에 UDF 를 사용하기 위해 필요한 모든 라이브러리(.dll) 을 포함시킨다고 생각하시면 됩니다.



@배포용 통합 패키지 만들기


이상입니다. 감사합니다.

Posted by 알 수 없는 사용자
.NET Framework/C#2012. 8. 3. 17:15

@서론:

안녕하세요. 엉스데브 입니다.

엑셀을 사용하다 보면 가끔 엑셀의 기본 함수가 다소 아쉽게 느껴지는 경우가 있습니다.
이러이러한 함수가 있으면 참 좋을텐데.. 싶을 때가 간혹 있지요.

그래서 엑셀은 사용자가 직접 함수를 만들어서 사용 할 수 있는 기능을 지원하며,
이렇게 사용자가 직접 만든 함수는 "사용자 정의 함수(UDF, User-Defined Function)" 라고 불립니다.

사용자 정의 함수는 여러가지 다양한 방법으로 정의 할 수 있는데,
그 중 제가 가장 익숙한 .NET/C# 으로 함수를 직접 만들어 사용하는 방법을 찾아 봤습니다.

.NET/C# 으로 UDF 를 만드는 방법은 크게 3가지 정도가 있는데, 

1. COM Interop 을 이용하는 방법,
2. Sharepoint Server 제품에 포함되어 제공되는 Microsoft.office.Excel.Server.Udf.dll 을 이용하는 방법,
3. Excel-DNA 라이브러리를 이용하는 방법이 있습니다.

이 중 오늘은 COM Interop 을 활용하는 방식에 대해 정리 해 보겠습니다.

 

 

@C#.NET 으로 엑셀 UDF 만들기 (COM Interop):

* OS 환경:
Windows 7 Enterprise K (Service Pack 1) 64bit

* 사용도구:
Visual Studio 2010 Premium
Microsoft Excel 2010

 

단계1: 클래스 라이브러리 형식의 프로젝트 생성
비주얼 스튜디오를 켜고, 클래스 라이브러리 형식의 새 프로젝트를 만듭니다.

 

 단계2: 엑셀 UDF 용 클래스 생성
엑셀 UDF 용으로 클래스를 만들어 줍니다.
클래스 이름을 적당히 지어주고, 엑셀에서 함수로 사용 될 메소드를 만들어 줍니다.
이번에 필요한 기능은 지정된 도메인의 연결 IP 를 가져오는 기능이기에, 다음과 같이 소스 코드를 작성 했습니다.

using System;
using System.Linq;

namespace InfradevExcelUDF
{
    public class DNSUtil
    {
        public string GetIPAddress(string domain)
        {
            if (string.IsNullOrEmpty(domain) == true)
            {
                return string.Empty;
            }

            try
            {
                if (System.Net.Dns.GetHostAddresses(domain).Length > 0)
                {
                    return System.Net.Dns.GetHostAddresses(domain).First().ToString();
                }
                else
                {
                    return string.Empty;
                }
            }
            catch (Exception)
            {
                return "#ERROR: 예상하지 못한 오류 입니다.";
            }
        }

    }
}

 

 

단계3: System.Runtime.InteropService 네임스페이스 추가(using)

using System;
using System.Linq;
using System.Runtime.InteropServices;

namespace InfradevExcelUDF
{
    public class DNSUtil
    {
        public string GetIPAddress(string domain)
        {
            if (string.IsNullOrEmpty(domain) == true)
            {
                return string.Empty;
            }

            try
            {
                if (System.Net.Dns.GetHostAddresses(domain).Length > 0)
                {
                    return System.Net.Dns.GetHostAddresses(domain).First().ToString();
                }
                else
                {
                    return string.Empty;
                }
            }
            catch (Exception)
            {
                return "#ERROR: 예상하지 못한 오류 입니다.";
            }
        }

    }
}


 

 

단계4: 클래스에 ClassInterface 속성 설정
클래스가 COM 에 노출 될 때 사용 될 인터페이스 속성을 설정 해 줍니다.

using System;
using System.Linq;
using System.Runtime.InteropServices;

namespace InfradevExcelUDF
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class DNSUtil
    {
        public string GetIPAddress(string domain)
        {
            if (string.IsNullOrEmpty(domain) == true)
            {
                return string.Empty;
            }

            try
            {
                if (System.Net.Dns.GetHostAddresses(domain).Length > 0)
                {
                    return System.Net.Dns.GetHostAddresses(domain).First().ToString();
                }
                else
                {
                    return string.Empty;
                }
            }
            catch (Exception)
            {
                return "#ERROR: 예상하지 못한 오류 입니다.";
            }
        }

    }
}

 

단계5: COM 자동 등록/삭제 용 메소드 추가
COM 에 자동 등록/삭제 될 때 사용될 메소드를 추가 해 줍니다.

using System;
using System.Linq;
using System.Runtime.InteropServices;
using Microsoft.Win32;

namespace InfradevExcelUDF
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class DNSUtil
    {
        public string GetIPAddress(string domain)
        {
            if (string.IsNullOrEmpty(domain) == true)
            {
                return string.Empty;
            }

            try
            {
                if (System.Net.Dns.GetHostAddresses(domain).Length > 0)
                {
                    return System.Net.Dns.GetHostAddresses(domain).First().ToString();
                }
                else
                {
                    return string.Empty;
                }
            }
            catch (Exception)
            {
                return "#ERROR: 예상하지 못한 오류 입니다.";
            }
        }

        [ComRegisterFunctionAttribute]
        public static void RegisterFunction(System.Type type)
        {
            Registry.ClassesRoot.CreateSubKey(
                GetSubKeyName(type, "Programmable")
            );

            RegistryKey key = Registry.ClassesRoot.OpenSubKey(
              GetSubKeyName(type, "InprocServer32"),
              true
            );

            key.SetValue(
                "",
                System.Environment.SystemDirectory + @"\mscoree.dll",
                RegistryValueKind.String
            );
        }

        [ComUnregisterFunctionAttribute]
        public static void UnregisterFunction(System.Type type)
        {
            Registry.ClassesRoot.DeleteSubKey(
                GetSubKeyName(type, "Programmable"),
                false
            );
        }

        private static string GetSubKeyName(System.Type type, string subKeyName)
        {
            System.Text.StringBuilder s = new System.Text.StringBuilder();

            s.Append(@"CLSID\{");
            s.Append(type.GUID.ToString().ToUpper());
            s.Append(@"}\");
            s.Append(subKeyName);

            return s.ToString();
        }
    }
}

 

 

단계6: COM Interop 관련 설정.
이제 작성한 클래스를 COM Interop 에 노출시키기 위해 아래와 같이 프로젝트 속성을 설정 해 줍니다.

1. [프로젝트 속성 > 응용프로그램 > 어셈블리 정보 > 어셈블리를 COM에 노출] 옵션 체크

2. [프로젝트 속성 > 빌드 > COM Interop 등록] 옵션 체크

 

단계7: 빌드
클래스 라이브러리를 빌드하면 자동으로 COM Interop 에 빌드 된 어셈블리가 등록 됩니다.
COM Interop 에 등록 된 어셈블리를 엑셀에서 불러와 사용이 가능 합니다.

 

단계8: 엑셀에서 실제 사용 해 보기

1. [개발도구 > 추가기능 > 자동화] 버튼을 클릭하면 "자동화 서버" 창이 표시 됩니다.

2. 사용 가능한 자동화 서버 목록에서 방금 만든 라이브러리를 찾아서 선택 후 "확인" 버튼을 누릅니다.

3. 방금 찾은 라이브러리를 체크 해 주고 확인 버튼을 누릅니다.

4. 계산된 값이 입력 될 셀을 선택 하고 "함수 삽입" 버튼을 누릅니다.

5. "범주선택" 메뉴에서 방금 추가 한 라이브러리를 선택 해 줍니다.

6. 함수 목록 중 사용하고자 하는 함수를 선택 후 확인 버튼을 누릅니다.

7. 대상 값을 지정(마우스로 셀 클릭) 해 주고 확인 버튼을 누릅니다.

8. 직접 만든 UDF 로 원하는 값을 얻어냈습니다. ^^

 

@트러블 슈팅:

1. "올바른 추가 기능이 아닙니다" 오류
빌드까지 마친 후 엑셀에서 추가기능 메뉴를 통해 불러오려 할 때 다음의 메시지가 나오는 경우가 있습니다.

확인 결과 원인은 클래스 이름에 언더바('_') 가 들어가 있어서 인 것으로 확인 되었습니다. 언더바를 제거 해 주면 정상적으로 불러와 집니다.

 

이상입니다. 감사합니다.

Posted by 알 수 없는 사용자