Development2010. 6. 9. 14:37


바쁘다고 정리를 안하고 넘어가다 보니 자꾸 잊어버려서, 두서는 좀 없더라도 가끔 이것저것 다시 등록해볼까 합니다.
그 첫번째로 .NET Framework 4.0의 기능 중 하나인 URL Routing을 Windows 2008 R2에 세팅하면서 겪은 문제해결 방법을 포스팅합니다.



1. 개요

  - .NET Framework 4.0 에서 제공되는 Routing기능을 이용하기로 함

  - 응용 프로그램 속성에서 ASP.NET 4.0환경으로 설정하고 빌드해야 함

  - 본 기능은 ASP.NET MVC2에 포함된 기능을 가볍게 이용할 때 유용할 것으로 보임

 

2. 웹프로그램 설정

  2.1 Global.asax 가 없다면 추가함

  2.2 Application_Start 메소드에 라우팅 함수호출 추가

 

        protected void Application_Start(object sender, EventArgs e)

        {

            // 여기에 라우팅 작성 하거나

            RouteTable.Routes.MapPageRoute("이름", "{패턴}", "~/{패턴}.aspx");

 

            // 별도 함수로 작성하거나

                RegisterRoutes(RouteTable.Routes);

 

        }

 

             void RegisterRoutes(RouteCollection routes)

        {

                routes.MapPageRoute("Search", "search/{service}", "~/{service}.aspx", false, new RouteValueDictionary { { "service", "test" } });

            /*

            routes.MapPageRoute("", "SalesReport/{locale}/{year}/{*queryvalues}", "~/sales.aspx");

            routes.MapPageRoute("SalesSummaryRoute", "SalesReportSummary/{locale}", "~/sales.aspx");

            routes.MapPageRoute("SalesDetailRoute", "SalesReportDetail/{locale}/{year}/{*queryvalues}", "~/sales.aspx", false);

            routes.MapPageRoute("SalesCurrentYearRoute", "SalesReportCurrent/{locale}/{year}/{*queryvalues}", "~/sales.aspx", false, new RouteValueDictionary { { "locale", "US" }, { "year", DateTime.Now.Year.ToString() } });

            routes.MapPageRoute("ExpenseCurrentYearRoute","ExpenseReportCurrent/{locale}", "~/expenses.aspx", false,

                new RouteValueDictionary { { "locale", "US" }, { "year", DateTime.Now.Year.ToString() } },

                new RouteValueDictionary { { "locale", "[a-z]{2}" }, { "year", @"\d{4}" } });

 

            routes.MapPageRoute("ExpenseDetailRoute", "ExpenseReportDetail/{locale}/{year}/{*queryvalues}", "~/expenses.aspx", false,

                new RouteValueDictionary { { "locale", "US" }, { "year", DateTime.Now.Year.ToString() } },

                new RouteValueDictionary { { "locale", "[a-z]{2}" }, { "year", @"\d{4}" } },

                new RouteValueDictionary { { "account", "1234" }, { "subaccount", "5678" } });

            */

           

        }

 

3. 서버 설정

  3.1 Windows 2008 R2 .NET Framework 4.0은 별도 설치해야 함

    다운로드 : http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992

 
  
3.2 .NET Framework 4.0
설치만으로 UrlRouting이 잘 된다면 별도의 과정이 필요 없지만, 문제가 있다면 아래와 같이 추가적인 등록 후 실행이 가능

 

   3.3 IIS 7.5를 실행해서 서버 홈 화면이나 웹사이트의 IIS항목 중 [처리기 매핑]으로 이동한 뒤, 오른쪽 상단의 [작업] [관리되는 처리기 추가..]를 실행해 아래와 같이 등록

 

   

 

        형식 : System.Web.Routing.UrlRoutingModule

 

       위의 방식은 Visual Studio에서 게시를 할 때마다, [처리기 매핑]의 항목이 초기화 되는 문제가 있어서, 아래와 같이 web.config에 등록과 관련한 코드를 추가하도록 함

 

<system.webServer>

      <handlers>

        <add name="UrlRouting" path="*" verb="GET,POST" type="System.Web.Routing" preCondition="integratedMode" />

      </handlers>

</system.webServer>

 

 

    3.4 다음으로 웹사이트의 응용 프로그램 풀의 설정을 체크해야 함

      : 사용하는 풀의 .NET Framework 버전과 ID 항목이 아래와 같이 되어 있는지 확인 필요   

 

    

 

4. 테스트

  4.1 Global.asax 2번째 인자를 "test/{service}", 3번째 인자를 "~/{service}.aspx" 설정했고, 웹사이트 루트에 abc.aspx 있다면, 브라우져에서 http://localhost/test/abc 라고 호출 , abc.aspx 내용이 확인될 것임

 

5. 비고

  5.1 아래의 URL 참조하면 실제 파일명을 직접 호출하지 못하도록 제한도 가능

      http://jack-fx.com/csharp/routetable-routes-mappageroute-tag/

Posted by Blue*
Development2007. 10. 16. 09:33

워드 파일에서 전체 텍스트의 내용을 특정 페이지 단위로 텍스트 파일에 저장해주는 매크로입니다.
워드 파일일 전체를 텍스트로 변환해 주는 프로그램은 많지만, 페이지 단위로 깔끔하게 나눠주는 프로그램이 없어서 W. Polmann(www.ecm-e.de) 이란 분이 작성한 doc_splitter() 매크로를 참조하여 작성해 봤습니다.
이 분의 코드가 독일어(?)로 되어있고, 워드에서 복사/붙여넣기를 통해 분할된 doc파일을 생성하다 보니 속도가 너무 느려서 FileSystemObject를 이용해서 바로 텍스트 파일에 저장되게 하였습니다.
이미지를 포함해 워드를 분할하실 분은 W. Polmann씨의 매크로와 좀 수정하시는게 빠를 것 같습니다.
필요하신 분이 과연 있을지는 모르겠지만 오랫만에 포스팅합니다. ^_^;

Sub Doc2Text_Splitter()
    Dim origDoc, splitFileName
    Dim Message, dlgTitle, dlgDefault
    Dim curPage, pageCount, pageSize
    Dim FSO, FileObject
   
    origDoc = ActiveDocument.Name
    Message = "몇 페이지씩 자를까?"
    dlgTitle = "Doc Splitter"
    dlgDefault = "2"
    pageSize = InputBox(Message, dlgTitle, dlgDefault)
    pageCount = ActiveDocument.ActiveWindow.Panes(1).Pages.Count
   
    Set FSO = CreateObject("Scripting.FileSystemObject")
   
    '// 문서의 처음으로 돌아감
    Selection.HomeKey Unit:=wdStory
   
    For curPage = 1 To pageCount Step pageSize
           
        '// 문서명_xxxx.txt 형식의 파일로 저장
        splitFileName = Left(origDoc, Len(origDoc) - 4) & "_" & Right("000" & curPage - 1, 4) & ".txt"
        '// 자르기를 시작할 페이지로 이동
        Selection.GoTo What:=wdGoToPage, Name:=curPage
        startPosition = Selection.Start
       
        '// 페이지의 마지막 위치로 이동해서 커서 위치를 확인
        Selection.GoTo What:=wdGoToPage, which:=wdGoToNext, Name:=(curPage + pageSize)
        Selection.MoveRight Unit:=wdCharacter, Count:=1
        endPosition = Selection.End
        '// 복사할 위치값 체크
        If startPosition < endPosition Then
           
        '// 선택영역을 반전
            ActiveDocument.Range(startPosition, endPosition - 1).Select
           
        '// 파일을 생성하고 저장
            Set FileObject = FSO.CreateTextFile(ActiveDocument.Path & "\" & splitFileName, True, True)
            'FileObject.WriteLine (Selection.FormattedText.Text)
            FileObject.WriteLine (Selection.Text)
            FileObject.Close
            Set FileObject = Nothing
       
        End If
    Next curPage
   
    Set FSO = Nothing
End Sub
Posted by Blue*
Development/Visual C++2007. 3. 19. 21:00

Visual C++에서 IE객체를 이용할 때 URL 히스토리 삭제에 사용한 코드입니다.
워낙에 VC++ 실력이 바닥이라 삽질끝에 작성했네요.;;
데브피아와 웹서핑 등등을 참고했습니다.;;
잘하시는 분들은 필요없겠지만, 저같은 초짜를 위해 올려봅니다.

// 요청 URL의 IE History 제거
static HRESULT ClearHistory(CString strClearUrl)
{
 HRESULT hr;
 CoInitialize(NULL);
 
 //AfxMessageBox(strClearUrl);
 IUrlHistoryStg2* pUrlHistoryStg2;// = NULL;
 hr = CoCreateInstance(CLSID_CUrlHistory, NULL, CLSCTX_INPROC, IID_IUrlHistoryStg2, (void**)&pUrlHistoryStg2);
 if (SUCCEEDED(hr)) {
  USES_CONVERSION;
  LPCOLESTR pstrCode = T2COLE(strClearUrl);
  //hr = pUrlHistoryStg2->ClearHistory();
  hr = pUrlHistoryStg2->DeleteUrl(pstrCode,0);
  pUrlHistoryStg2->Release();
 } else {
  return S_FALSE;
 }
 return hr; //S_OK
}
static HRESULT ClearHistory(char* szClearUrl)
{
 CString strClearUrl;
 strClearUrl.Format("%s",szClearUrl);
 return ClearHistory(strClearUrl);
}
Posted by Blue*
Development/JavaScript2007. 1. 9. 17:01
정규표현식

1. 각 문자와 숫자는 해당 문자 또는 문자열이 테스트할 문자열에 있을경우 true 가된다.
<script>
// 'a' 가 있는 문자열 모두가 TRUE (대소문자 구분)
var filter = /a/
if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); }
</script>

<script>
// "about" 가 있는 문자열 모두가 TRUE (대소문자 구분)
var filter = /about/
if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); }
</script>


2. 대소문자 구분없이 해당 문자 또는 문자열을 검색할 경우 끝에 i 를 붙인다.
<script>
// 'a' 또는 'A' 가 있는 문자열 모두가 TRUE (대소문자 구분 안함)
var filter = /a/i
if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); }
</script>


3. 여러개의 이어지는 내용들을 검색할 경우는 '-' 를 넣어 표현한다.
<script>
// 'a' 에서 'z' 까지중 하나만 있으면 모두가 TRUE (대소문자 구분)
var filter = /[a-z]/
if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); }
</script>


4. 여러가지의 문자 또는 문자열을 검색할 경우 '|' 를 넣는다.
<script>
// 'a' 또는 'b' 또는 'c' 가 있는 문자열 모두가 TRUE (대소문자 구분)
var filter = /a|b|c/
if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); }
</script>

<script>
// 'a' 에서 'z' 까지 또는 '0' 에서 '9' 까지중 하나만 있으면 모두가 TRUE (대소문자 구분)
var filter = /[a-z]|[0-9]/
if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); }
</script>


5. 해당 문자또는 문자열이 없는 경우를 검색할 경우 브래킷('[', ']') 안에 '^' 를 넣는다.
<script>
// 'a' 에서 'z' 까지의 문자가 아닌 문자가 있을 경우 TRUE (대소문자 구분)
var filter = /[^a-z]/
if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); }
</script>


6. 문자열의 첫번째 글자가 일치해야할 경우는 '^' 를 브래킷('[', ']') 밖에 넣는다.
<script>
// 'a' 에서 'z' 까지의 문자로 시작하는 문자열일 겨우 TRUE (대소문자 구분)
var filter = /^[a-z]/
if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); }
</script>


7. 문자열의 끝쪽 글자가 해당 문자 또는 문자열과 일치해야할 경우는 '$' 를 넣쨈?
<script>
// 'a' 에서 'z' 까지의 문자로 끝나는 문자열일 겨우 TRUE (대소문자 구분)
var filter = /[a-z]$/
if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); }
</script>


8. 특수문자('\', '^', '$', '*', '+', '?', '.', '(', ')', '|', '{', '}', '[', ']')를 검색할 경우는 '\' 를 넣는다.
<script>
// '\' 가 있는 문자열일 겨우 TRUE (대소문자 구분)
var filter = /\\/
if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); }
</script>


출처: http://edn.episode.co.kr/language/js/faq/

'Development > JavaScript' 카테고리의 다른 글

MS 익스플로러 명령 실행 자바스크립트  (0) 2006.03.19
Posted by Blue*
Development2006. 12. 11. 00:10
자바스크립트의 라이브러리 중 하나인 Prototype에서 제공해주는 기능 중 하나입니다.
Ajax를 이용해 얻어진 결과를 해당 객체.innerHTML의 값으로 사용한다랄까요;;
긴 설명은 패스~ ㅡ_ㅡa

  var url = 'request.asp'; //데이터를 담당할 페이지
  var pars = 'code='+변수;
  var target = 'PlaceHolder'; // <- 해당 객체
  var myAjax = new Ajax.Updater(target, url, {method: 'post', parameters: pars});


Posted by Blue*