고용량의 텍스트 파일(25기가가 넘는 로그파일)을 보려니 일전에 올렸던 LTF 역시 답답해서 파일 분할, 검색 하기로 했다.

사실 결국 컴퓨터 사양이 좋으면, 로그를 꼭 필요한 것만 출력해서 용량차지가 적도록, 혹은 애초에 로그를 분석할 필요가 없는 코드를 짰다면 이런 일이 발생하지 않는데 아무튼 상황을 이지경으로 만든 사람은 누군지도 이 자리에 있지도 않으니 이런 잡 기술만 늘어가는 중이다.

PowerShell은 Linux 명령어랑은 많이 다르고 뭔가 맘에 안듦...

형식

$i=0; Get-Content 원본파일경로 + 파일명 -ReadCount 분할할_라인_수 | %{ $i++; $_ | Out-File 출력경로_파일명-$i.log; Write-Host $i }

 

$i=0; Get-Content .\WAS-29-20220325.log -ReadCount 1000 | %{ $i++; $_ | Out-File D:\cat_log\WAS-29\20220325-$i.log; Write-Host $i }
728x90
반응형
  sudo apt-get update || sudo apt-get full-upgrade

apt-get update : 현재 사용하는 패키지와 그 버젼에 대해 리스트 업데이트
apt-get full-upgrade : 해당 리스트의 패키지들을 최신 버젼으로 재설치
두 명령어 모두 관리자 권한으로 실행해야 하기 때문에 sudo를 붙여야 함


  sudo rpi-eeprom-update -a

라즈베리 파이의 rpi-eeprom 패키지 의 사용 가능한 업데이트 설치

728x90
반응형

'OS > Linux' 카테고리의 다른 글

[Linux] 라인 수 카운트 하기  (0) 2021.06.23
[Linux] There are stopped jobs  (0) 2021.05.28
[Linux] 인터넷 속도 확인  (0) 2021.05.28
[Linux] top  (0) 2021.05.06
[Linux] 리눅스 서버 60초 안에 상황 파악하기  (0) 2021.05.06
-- 락 걸린 테이블 확인
SELECT
    DO.OBJECT_NAME
  , DO.OWNER
  , DO.OBJECT_TYPE
  , DO.OWNER
  , VO.XIDUSN
  , VO.SESSION_ID
  , VO.LOCKED_MODE
FROM
    V$LOCKED_OBJECT VO
  , DBA_OBJECTS DO
WHERE VO.OBJECT_ID = DO.OBJECT_ID
;


-- 해당 테이블에 락이 걸렸는지 확인
SELECT
  A.SID
  , A.SERIAL#
  , B.TYPE
  , C.OBJECT_NAME
FROM
    V$SESSION A
  , V$LOCK B
  , DBA_OBJECTS C
WHERE A.SID = B.SID
  AND B.ID1 = C.OBJECT_ID
  AND B.TYPE='TM'
  AND C.OBJECT_NAME IN (${위 쿼리에서 가져온 OBJECT_NAME});


-- 락 발생 사용자, SQL, OBJECT 조회
SELECT
  DISTINCT X.SESSION_ID
  , A.SERIAL#
  , D.OBJECT_NAME
  , A.MACHINE
  , A.TERMINAL
  , A.PROGRAM
  , B.ADDRESS
  , B.PIECE
  , B.SQL_TEXT
FROM
    V$LOCKED_OBJECT X
  , V$SESSION A
  , V$SQLTEXT B
  , DBA_OBJECTS D
WHERE X.SESSION_ID = A.SID
  AND X.OBJECT_ID = D.OBJECT_ID
  AND A.SQL_ADDRESS = B.ADDRESS 
ORDER BY B.ADDRESS, B.PIECE;


-- 현재 접속자의 SQL 확인 
SELECT
    DISTINCT A.SID
  , A.SERIAL#
  , A.MACHINE
  , A.TERMINAL
  , A.PROGRAM
  , B.ADDRESS
  , B.PIECE
  , B.SQL_TEXT
FROM
    V$SESSION A
  , V$SQLTEXT B
WHERE A.SQL_ADDRESS = B.ADDRESS
ORDER BY A.SID, A.SERIAL#, B.ADDRESS, B.PIECE;


-- 락 세션 죽이기위한 sid 와 serial
SELECT
    A.SID
  , A.SERIAL#
  , A.SID || ', ' || A.SERIAL#
FROM
    V$SESSION A
  , V$LOCK B
  , DBA_OBJECTS C
WHERE A.SID = B.SID
  AND B.ID1 = C.OBJECT_ID
  AND B.TYPE = 'TM'
-- AND C.OBJECT_NAME IN ('${락 걸린 테이블 명}');


-- 해당 세선 kill
SELECT
    DISTINCT X.SESSION_ID
  , A.SERIAL#
  , D.OBJECT_NAME
  , A.MACHINE
  , A.TERMINAL
  , A.PROGRAM
  , A.LOGON_TIME
  , 'ALTER SYSTEM KILL SESSION '''||A.SID||', '||A.SERIAL#||''';'
FROM
    GV$LOCKED_OBJECT X
  , GV$SESSION A
  , DBA_OBJECTS D
WHERE X.SESSION_ID = A.SID
  AND X.OBJECT_ID = D.OBJECT_ID
ORDER BY LOGON_TIME
;


-- 최근 실행된 쿼리 찾기
SELECT 
    SQL_FULLTEXT
  , SQL_ID
  , PARSING_SCHEMA_NAME
  , SERVICE
  , MODULE
  , FIRST_LOAD_TIME
  , LAST_LOAD_TIME
FROM V$SQL
WHERE 1 = 1
  AND PARSING_SCHEMA_NAME = '${스키마 명}'
  AND SERVICE = '${서비스 명}'
ORDER BY LAST_LOAD_TIME DESC
;


-- 최근 실행된 쿼리에 바인팅 변수 찾기
SELECT
    NAME
  , POSITION
  , DATATYPE_STRING
  , VALUE_STRING 
FROM V$SQL_BIND_CAPTURE
WHERE 1=1
  AND SQL_ID = '${위 쿼리에서 가져온 SQL_ID}'
;

SELECT * FROM V$SQL;

SELECT 
  last_active_time
  ,parsing_schema_name
  ,sql_text 
FROM v$sqlarea
WHERE 
  parsing_schema_name <> 'SYS'
  AND parsing_schema_name <> 'SYSMAN'
  AND parsing_schema_name <> 'DBSNMP'
  AND parsing_schema_name <> 'MDSYS'
  AND parsing_schema_name <> 'EXFSYS'
ORDER BY 
  last_active_time DESC;

 

 

안타깝게도 어떤 쿼리가 락을 걸었는지는 알기 쉽지 않다.

특히나 Oracle DB S/W update를 주기적으로 하지 않는다면 유지보수가 쉽지 않다.

728x90
반응형

문자열이 정해진 날짜 포맷에 맞는지 확인해야하는 로직이 종종 필요하다

문자열이 날짜 형식인지 유효성 검사하기

    /**
     * 입력받은 문자열이 날짜형식으로 변환이 가능한지 확인한다.
     *
     * @param str2cmp    날짜형식 변환 가능여부 확인 대상
     * @param dateFormat 비교할 날짜 형식
     * @return
     */
    public static boolean isDateFormat(String str2cmp, String dateFormat) {
        try {
            //  검증할 날짜 포맷 설정
            SimpleDateFormat dateFormatParser = new SimpleDateFormat(dateFormat);
            //  parse()에 잘못된 값이 들어오면 Exception을 리턴하도록 setLenient(false) 설정
            dateFormatParser.setLenient(false);
            // 대상 인자 검증
            dateFormatParser.parse(str2cmp);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static boolean isDateFormat(String str2cmp) {
        return isDateFormat(str2cmp, "yyyyMMdd");
    }

setLenient( false );로 설정하면, 잘못된 형식의 데이터가 들어올 경우 Exception을 리턴하도록 설정함.

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] 성능을 고려한 try-catch 문  (0) 2020.12.16
[Java] Map 반복문  (0) 2020.12.08
[JAVA] 구 버젼 설치  (0) 2020.11.02
[Java] ArrayList Sort  (0) 2020.05.22

SVN으로 버젼관리중인 소스를 이러저러한 이유로 git으로 로컬에서 버젼관리를 해야하는 상황이 되었다.

SVN에서 먼저 disconnect 해야 했는데 종종 필요한 작업일 것 같아서 기록한다.

Windows 10, TortoiseSVN 기준이다.

 

1. 파일 탐색기에서 해당 소스 경로로 이동한다.

2. 해당 소스 폴더를 우클릭한다.

3. TortoiseSVN -> Export를 선택한다.

4. Export 할 경로를 해당 소스의 경로와 동일하게 설정한다.

5. 경고창과 함께 Remove from version controll, Cancel 을 선택하게 나오는데 전자를 선택.

6. SVN을 통한 버젼관리가 삭제됨.

 

 

728x90
반응형

'VCS' 카테고리의 다른 글

[GIT]  (0) 2024.04.10
[VCS] 좋은 커밋 메세지 간단 작성법  (0) 2023.07.14
[GIT] 브랜치, 커밋 간 다른 파일 목록 조회  (0) 2022.04.05
[GIT] remote branch 가져오기  (0) 2022.04.05
[GIT] 윈도우에 Git 설치하기  (0) 2020.01.26

윈도우 10 IIS 및 클래식 ASP 설정

IIS 란

IIS는 Internet Information Service의 약자로 MS에서 만든 윈도우 OS 상에서 동작하는 웹서버임.
Windows에서 GUI 기반이라 설정도 편하고 Httpd에 비해서 기능이 많다고는 하는데, 사실 나는 Httpd가 더 편한 것 같음.

IIS 장점

  • Windows OS 상에서 설치가 쉬움,
  • GUI라서 편하다고 함(본인은 동의하지 않음)
  • 플러그인을 쉽게 설치 관리가 가능하다고 함.

IIS 단점

  • Windows OS 상에서만 사용 가능,
  • 구글링 시 정보의 질과 양이 Apache httpd보다 떨어짐.
  • 윈도우 버젼에 따라, IIS 버젼에 따라 디테일하게 다른점이 있어서 검색 결과가 나랑 맞지 않은 경우가 많음.

 


IIS 설치

  1. "Windows 기능 켜기/끄기" 찾아 실행
    • 제어판 > 프로그램 추가 제거 > "Windows 기능 켜기/끄기" 로 실행할 수도 있지만,
    • 키보드 ctrl과 alt 사이에 있는 "win" 단축키를 열어 "Windows 기능 켜기/끄기"를 검색해서 실행할 수 있다
  2. Windows 기능 켜기/끄기에서 "인터넷 정보 서비스"찾기
  3. 다음 선택된 항목들 모두 체크하기
  4. 활성화 완료 후 확인버튼 클릭시 설치가 시작 됨.
  5. "win" 단축키를 열어 "IIS"를 검색하여 실행시킬 수 있다면 설치가 완료된 것 임.
  6. IIS 실행
  7. 브라우져 주소창에 localhost로 접근해서 IIS 정상 작동 확인
  8. IIS에 설정된 사이트의 기본 경로는 C:\inetpub\wwwroot이다. 해당 경로의 폴더에 들어가면 다음과 같은 파일이 있음은 볼 수 있다
  9. 테스트 웹 사이트이므로 포트 변경이 가능하지만 방화벽 설정이 귀찮으므로 나는 80포트를 그대로 사용하기로 함.
    •  
  10. ASP 동작 테스트를 하기 위해 8의 기본 경로 C:\inetpub\wwwroot아래에 ex-01.asp파일을 만듦.
    • <!DOCTYPE html>
      <html lang="ko">
      <head>
        <title>First ASP</title>
      </head>
      <body>
        <%
          response.write("<h1>Hell The World!</h1>")
          response.write("<p>빌어먹을 레거시 ASP!</p>")
        %>
      </body>
      </html>
  11. ASP 동작 테스트로 브라우져에서 http://localhost/ex-01.asp로 접속.
    역시나 한글이 깨지긴 하지만 다행히 ASP가 정상 작동 한다는 것을 알 수 있음.
    •  

 


참고

728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP] AJAX  (0) 2021.08.30
[ASP] global.asa  (0) 2021.08.30
[ASP] #include  (0) 2021.08.27
[ASP] 어플리케이션  (0) 2021.08.27
[ASP] 세션  (0) 2021.08.27

ASP AJAX

AJAX는 전체 페이지를 다시 로드하지 않고 웹 페이지의 일부를 업데이트 하는 것임.

AJAX = Asynchronouse JavaScript ans XML의 약자로 동적인 웹페이지를 만드는 기술임.
AJAX는 인터넷 표준을 기반으로 다음을 조합하여 사용함.

  • XMLHttpRequest 객체 : 서버와 비동기적으로 데이터 교환
  • JavaScript/DOM : 정보 표시 / 상호작용
  • CSS
  • XML : 종종 데이터 전송 형식으로 사용됨.

나머지 기초적인 설명은 패스하도록 함.

 

Example 1

  <% @CODEPAGE="65001" language="vbscript" %>
  <% session.CodePage = "65001" %>
  <% Response.CharSet = "utf-8" %>
  <% Response.buffer=true %>
  <% Response.Expires = 0 %>
  <!DOCTYPE html>
  <html lang="ko">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
      * { background-color : black; color : white; margin : 1em; }
    </style>
    <title>The XMLHttpRequest Object</title>
  </head>
  <body>
    <head>
      There are <%=application( "visitors" )%> on online now!
    </head>
    <h1>Start typing a name in the input field below</h1>
    <br/><hr/><br/>

    <form action="">
      <label for="txt">INPUT</label>
      <input
        type="text" name="txt" id="txt"
        onkeyup="showHint(this.value)"
      />
    </form>

    <p>Suggestions : <span id="hint"></span></p>

    <script>
      const showHint = ( str ) => {
        let xhttp;

        if( str.length == 0 ) {
          document.getElementById( 'hint' ).innerHTML = '';
          return;
        }

        xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function () {
          if( this.readyState == 4 && this.status == 200 ) {
            document.getElementById( 'hint' ).innerHTML = this.responseText;
          }
        };

        xhttp.open( 'GET', '01-getHint.asp?q=' + str, true);
        xhttp.send();
      }
    </script>

  </body>
  </html>
  <% @CODEPAGE="65001" language="vbscript" %>
  <% Response.buffer = true %>
  <%
    response.expires = -1

    ' array 선언
    dim arr(30)
    arr(1) = "Anna"
    arr(2) = "Brittany"
    arr(3) = "Dianna"
    arr(4) = "Eva"
    arr(5) = "Fiona"
    arr(6) = "Gunda"
    arr(7) = "Hege"
    arr(8) = "Inga"
    arr(9) = "Johanna"
    arr(10) = "Kitty"
    arr(11) = "Linda"
    arr(12) = "Nina"
    arr(13) = "Ophelia"
    arr(14) = "Petunia"
    arr(15) = "Amanda"
    arr(16) = "Raquel"
    arr(17) = "Cindy"
    arr(18) = "Doris"
    arr(19) = "Eve"
    arr(20) = "Evita"
    arr(21) = "Sunniva"
    arr(22) = "Tove"
    arr(23) = "Unni"
    arr(24) = "Violet"
    arr(25) = "Liza"
    arr(26) = "Elizabeth"
    arr(27) = "Ellen"
    arr(28) = "Wenche"
    arr(29) = "Vicky"
    arr(30) = "cinderella"


    ' QueryString에서 q의 값 가져오기
    q = ucase( request.querystring( "q" ) )

    if len( q ) > 0 then
      hint = ""
      for i = 0 to 30
        if q = ucase( mid( arr( i ), 1, len( q ) ) ) then
          if hint = "" then
            hint = arr( i )
          else
            hint = hint & ", " & arr( i )
          end if
        end if
      next
    end if

    ' hint가 없다면 "No Suggestion"
    ' 있다면 hint
    if hint = "" then 
      response.write( "No Suggestion" )
    else
      response.write( hint )
    end if

  %>

 

 

Example 2 : AJAX 데이터 베이스 연결

DB 연결은 당장 여건이 안되므로 스킵 해둔다.

 


728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP IIS] 윈도우 10 IIS 및 클래식 ASP 설정  (0) 2021.09.06
[ASP] global.asa  (0) 2021.08.30
[ASP] #include  (0) 2021.08.27
[ASP] 어플리케이션  (0) 2021.08.27
[ASP] 세션  (0) 2021.08.27

ASP Global.asa 파일

Global.asa 파일은 ASP 어플리케이션의 모든 페이지에서 엑세스 할 수 있는 객체, 변수 및 메소드의 선언을 포함할 수 있는 선택적 파일임.

유효한 모든 프라우져 스크립트(JS, VBScript, JScript, PerlScript)등 Global.asa 파일내에서 사용 가능.

Global.asa 파일에는 다음 항목만 포함할 수 있음.

  • 어플리케이션 이벤트
  • 세션 이벤트
  • <object> 선언
  • TypeLibrary 선언
  • #include 지시문

Global.asa 파일은 ASP 어플리케이션의 루트 디렉토리에 저장해야 하며 각 어플리케이션에는 Global.asa 파일이 하나만 있을 수 있음

 


Global.asa의 이벤트

Global.asa에서 어플리케이션/세션이 시작될 때 수행할 작업과 어플리케이션/세션이 종료될 때 수행할 작업을 어플리케이션 및 세션 객체에 알릴 수 있음. 이에 대한 코드는 이벤트 핸들러에 배치됨. Global.asa 파일에는 네 가지 유형의 이벤트가 포함될 수 있음.

  • Application_OnStart : First 사용자가 ASP 어플리케이션의 첫 페이지를 호출할 때 발생.
    이 이벤트는 웹 서버를 다시 시작한 후 또는 Global.asa 파일을 편집 후에 발생함.
    Session_OnStart 이벤트는 이 이벤트 직후에 발생함.
  • Session_OnStart : 이 이벤트는 새 사용자가 ASP 어플리케이션에서 첫 페이지를 요청할 때마다 발생.
  • Session_OnEnd : 이 이벤트는 사용자가 세션을 종료할 때마다 발생함.
    사용자 세션은 지정된 시간(기본 20분) 동안 사용자가 페이지 요청하지 않으면 종료됨.
  • Application_OnEnd : 이 이벤트는 마지막 사용자가 세션을 종료한 후에 발생함.
    일반적으로 이 이벤트는 웹 서버가 중지될 때 발생함. 이 절차는 레코드 삭제 또는 텍스트 파일에 정보 쓰기와 같이 어플리케이션이 중지된 후 설정을 정리하는데 사용됨.

Global.asa

  <script language="vbscript" runat="server" >

    sub Application_OnStart
    'some code
    end sub

    sub Application_OnEnd
    'some code
    end sub

    sub Session_OnStart
    'some code
    end sub

    sub Session_OnEnd
    'some code
    end sub

  </script>

 

 


<객체> 선언

<object> 태그를 사용하여 Global.asa에서 세션 또는 어플리케이션 범위의 객체를 만들 수 있음.
<object> 태그는 <script> 태그 밖에 있어야 함.

  <object runat="server" scope="scope" id="id" {porgid="progID" | classid="classID"}>
    ...
  </object>
  • scope :
    Sets the scope of the object (either Session or Application)
  • id :
    Specifies a unique id for the object
  • progId :
    An id associated with a class id. The format for ProgID is [Vendor.]Component[.Version]
    Either ProgID or ClassID must be specified.
  • ClassId :
    Specifies a unique id for a COM class object.
    Either ProgID or ClassID must be specified.

ex

첫 번째 예는 ProgID 매개변수를 사용하여 MyAd라는 세션 범위 객체 생성임.
<obejct runat="server" scope="session" id="MyAd" progId="MSWC.AdRotator" > </object>

두 번째 예는 ClassID 매개변수를 사용하여 MyConnection이라는 어플리케이션 범위 객체 생성임.

  <object
    runat="server" scope="application" id="MyConnection"
    classid="Clsid:8AD3067A-B3FC-11CF-A560-00A0C9081C21">
  </object>

Global.asa 파일에 선언된 개체는 응용프로그램의 모든 스크립트에서 사용 가능함.

  <object runat="server" scope="session" id="MyAd" progid="MSWC.AdRotator">
  </object>
  <%=MyAd.GetAdvertisement("/banners/adrot.txt")%>

 

 



TypeLibrary 선언

TypeLibrary는 COM 개체에 해당하는 DLL 파일의 내용에 대한 컨테이너임. Global.asa 파일에 TypeLibrary에 대한 호출을 포함하면 COM 개체의 상수에 엑세스할 수 있으며 ASP 코드에서 오류를 더 잘 보고할 수 있음. 웹 어플리케이션이 형식 라이브러리에서 데이터 형식을 선언한 COM 객체에 의존하는 경우 Global.asa에서 형식 라이브러리를 선언할 수 있음.

문법

  <!-- METADATA TYPE="TypeLib"
    file="filename" uuid="id" version="number" lcid="localeid"
   -->
Parameter Description
file 유형 라이브러리의 절대 경로를 지정함. 파일 매개변수 또는 UUID 매개변수가 필요함.
UUID 유형 라이브러리의 고유 식별자 지정. 파일 매개변수 또는 UUID 매개변수가 필요함.
version 선택사항으로 버젼을 선택하는데 사용. 요청된 버젼이 없다면 가장 최근 벼전이 사용됨.
lcid 선택사항으로 유형 라이브러리에 사용할 지역 식별자.

오류 값

서버는 다음 오류 메세지중 하나를 반환할 수 있음.

Parameter Description
ASP 0222 잘못된 라이브러리 사양
ASP 0223 라이브러리 찾을 수 없음
ASP 0224 라이브러리 로드 불가
ASP 0225 라이브러리 래핑 불가

METADATA 태그는 Global.sas 파일의 모든 위치에 나타날 수 있음. (<script> 태그 내 외부).
BUT, METADATA 태그는 Global.sas 파일의 상단에 표시하는 것이 좋음.

제한

Global.asa 파일에 포함할 수 있는 항목데 대한 제한 사항 :

  • Global.asa 파일에 작성된 텍스트는 표시할 수 없음. 이 파일은 정보를 표시할 수 없음.
  • Application_OnStart 및 Application_OnEnd 서브루틴에서는 서버 및 어플리케이션 개체만 사용할 수 있음.
    Session_OnStart 서브루틴에서 내장 객체를 사용할 수 있음.
    Session_OnEnd 서브루틴에서 서버, 어플리케이션 및 세션 개체를 사용할 수 있음.

서브루틴 사용법

Global.asa는 종종 변수를 초기화 하는 데 사용함.
방문자가 웹 사이트에 처음 도착한 시간을 감지하는 방법임.
시간을 "started"라는 세션 변수에 저장되며 "started" 변수의 값은 어플리케이션의 모든 ASP 페이지에 엑세스할 수 있음.

  <script language="vbscript" runat="server" >
    sub Session_OnStart
      Session( "started" ) = now()
    end sub
  </script>

아래 예는 모든 신규 방문자를 다른 페이지로 리다이렉션 하는 방법

  <script language="vbscript" runat="server">
    sub Session_OnStart
      response.redirect( "newpage.asp" )
    end sub
  </script>

그리고 Global.asa 파일에 기능을 포함할 수 있음.

Application_OnStart 서브루팅은 웹 서버가 시작될 때 발생함.
그런 다음 Application_OnStart 서브루틴은 "getcustomers" 라는 다른 서브루틴을 호출함.
"getcustomers" 서브루틴은 DB의 "customers" 테이블에서 데이터를 배열로 가져옴.

  <script language="vbscript" runat="server">
    sub Application_OnStart
      getCustomers
    end sub

    sub getCustomers
      set conn = Server.CreateObject( "ADODB.Connection" )
      conn.Provider = "Microsoft.Jet.OLEDB.4.0"
      con.Open "c:/webdata/northwind.mdb"

      set rs = conn.execute( "SELECT NAME FROM customers" )

      Application( "customers" ) = rs.GetRows

      rs.close
      conn.close
    end sub
  </script>

 

 

Global.asa 예

현재 방문자수를 계산하는 Global.asa 파일을 만들어 봄

  • Application_OnStart는 서버가 시작될 때 어플리케이션 변수 "visitors"를 0으로 할당.
  • Session_OnStart 서브루틴은 새 접속자가 접근할 때 마다 변수 "visitors"를 1씩 추가.
  • Session_OnEnd 서브루틴은 접속자가 나갈 때 마다 변수 "visitors"를 1씩 감소.
  sub Application_OnStart
    Application( "visitors" ) = 0
  end sub

  sub Session_OnStart
    Application.lock
    Application( "visitors" ) = Application( "visitors" ) + 1
    Application.unlock
  end sub

  sub Session_OnEnd
    Application.lock
    Application( "visitors" ) = Application( "visitors" ) - 1
    Application.unlock
  end sub
  <head>
    There are <%=application( "visitors" )%> on online now!
  </head>

728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP IIS] 윈도우 10 IIS 및 클래식 ASP 설정  (0) 2021.09.06
[ASP] AJAX  (0) 2021.08.30
[ASP] #include  (0) 2021.08.27
[ASP] 어플리케이션  (0) 2021.08.27
[ASP] 세션  (0) 2021.08.27

ASP include file

#include 지시문

#include 지시문을 사용하여 서버가 실행하기 전에 한 ASP 파일의 내용을 다른 ASP 파일에 삽입할 수 있음.
#include 지시문은 여러 페이지에서 재사용될 함수, 머리글, 바닥글, 또는 요소를 만드는 데 사용됨.


#include 지시문 사용하는 방법

  <!DOCTYPE html>
  <html lang="ko">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
      * { background-color : black; color : white; margin : 1em; }
    </style>
    <title>include my page</title>
  </head>
  <body>
    <h1>include my page</h1>
    <br/><hr/><br/>

    <h3>Word of Wisdom :</h3>
    <p><!--#include file="01-wisdom.inc" --></p>

    <br/><hr/><br/>

    <h3>The Time is :</h3>
    <p><!--#include file="01-time.inc" --></p>

  </body>
  </html>

01-wisdom.inc

"One should never increase, beyond what is necessary,
the number of entities required to explain anything."

01-time.inc

<% response.write( time ) %>

파일 포함 구문

ASP 페이지에 파일을 포함하려면 주석 태그 안에 #include 지시문을 넣어야 함.

<!-- #include virtual = "someFileName" -->
of
<!-- #include file = "someFileName" -->

virtual 키워드

virtual 키워드를 사용하여 가상 디렉토리로 시작하는 경로를 나타냄.
"header.inc"라는 파일이 /html 이라는 가상 디렉토리에 있는 경우 다음 줄은 "header.inc"의 내용을 삽입함.
<!-- #include virtual = "/html/header.inc" -->

file 키워드

file 키워드를 사용하면 상대경로를 나타냄. 산대경로는 포함 파일이 포함된 디렉토리로 시작함.
html 디렉토리에 파일이 있고, "header.inc"파일이 html/headers에 있는 경우 다음 줄은 파일에 "header.inc"를 삽입함.
<!-- #include file = "headers/header.inc" -->

포함된 파일의 경로 (header/header.inc)는 포함된 파일에 상대적임. 이 #include 문이 포함된 파일이 html 디렉토리에 없으면 명령문은 작동하지 않음.


기타 참고사항

위 섹션에서는 포함된 파일에 대해서 확장자 .inc를 사용했음. 사용자가 inc 파일을 직접 탐색하려고 하면 해당 내용이 표시됨. 포함된 파일에 기밀 정보나 다른 사용자에게 보여주고 싶지 않은 정보가 포함되어 있다면, ASP 확장자를 사용하는 것이 좋음. ASP 파일의 소스 코드는 해석 후에 보이지 않음. 포함된 파일에는 다른 파일명도 포함될 수 있으며 하나의 ASP 파일에는 동일한 파일이 두번 이상 포함될 수 있음.

중요 : 포함된 파일은 스크립트가 실행되기 전에 처리되고 삽입됨. 다음 스크립틍는 ASP가 변수 값을 할당하기 전에 #include 지시문을 실행하기 때문에 작동하지 않음.

  <%
    filename = "header.inc"
  %>
  <!-- #include file = "<%filename%>" -->

inc 파일에서 스크립트 구분 기호를 열거나 닫을 수 없음. 다음 코드는 작동하지 않음.

  for i = 1 to n
    <!-- #include file = "count.inc" -->
  next
  <% for i = 1 to n %>
    <!-- #include file = "count.inc" -->
  <% next %>

728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP] AJAX  (0) 2021.08.30
[ASP] global.asa  (0) 2021.08.30
[ASP] 어플리케이션  (0) 2021.08.27
[ASP] 세션  (0) 2021.08.27
[ASP] 쿠키  (0) 2021.08.26

ASP 응용프로그램 객체

어떤 목적을 수행하기 위해 함께 작동하는 ASP 파일 그룹을 응용 프로그램이라고 함.

 


응용프로그램 객체

웹상의 응용 프로그램은 어떤 목적을 수행하기 위해 함께 작동하는 여러 ASP 파일로 구성될 수 있음. Application 객체는 이러한 파일을 함께 묶는 데 사용됨.

어플리케이션 개체는 세션 개체와 마찬가지로 모든 페이지의 변수를 저장하고 엑세스하는 데 사용됨. 차이점은 모든 사용자가 하나의 응용 프로그램 개체를 공유한다는 것임. (세션에는 각 사용자에 대해 하나의 세션 개체가 있음.)

어플리케이션 개체는 데이터베이스 연결 정보와 같은 어플리케이션의 많은 페이지에서 사용할 정보를 보유함. 정보는 모든 페이지에 엑세스 가능. 정보 변경도 한 곳에서 가능하며, 변경 사항은 자동으로 모든 페이지에 반영됨.

 

 


어플리케이션 변수 저장 및 검색

어플리케이션 변수는 어플리케이션의 모든 페이지에서 엑세스하고 변경 가능함.
"Global.asa"파일에서 어플리케이션 변수를 만들 수 있음.

  <script language="vbscript" runat="server">
    // vartime, users라는 두개의 응용프로그램 변수 생성
    sub Application_OnStart
      application( "vartime" ) = ""
      application( "users" ) = 1
    end sub
  </script>
  There are <%=application( "users" )%> active connections.

 

 


콘텐츠 컬렉션을 통해 반복문

Contents Collection에는 모든 어플리케이션 변수가 포함됨. 콘텐츠 컬렉션을 반복하여 컬렉션에 무엇이 저장되어 있는지 확인 가능.

  dim ac
  for each ac in application.contents
    response.write( ac & "<br/>" )
  next

contents에 대해 count 속성 사용 가능

  dim acCnt
  acCnt = application.contents.acCnt

  for ac = 1 to acCnt
    response.write( application.contents( ac ) & "<br/>" )
  next

 

 


StaticObjects collection을 통해 반복문

StaticObjects 컬렉션을 반복하여 어플리케이션 객체에 저장된 모든 개체의 값을 볼 수 있음.
세션에선 안 됐는데 이게 될 까?

  dim so

  for each so in application.staticojbects
    response.write( so & "<br/>" )
  next

 

 


잠금 및 잠금 해제

"lock"으로 어플리케이션을 잠글 수 있음. 어플리케이션이 잠긴 경우 사용자는 현재 액세스 중인 변수를 제외한 어플리케이션변수를 변경할 수 없음.
"unlock"으로 어플리케이션의 잠금을 해제할 수 있음.

  application.lock
  ' do come application object operation
  application.unlock

728x90
반응형

'WEB > ASP' 카테고리의 다른 글

[ASP] global.asa  (0) 2021.08.30
[ASP] #include  (0) 2021.08.27
[ASP] 세션  (0) 2021.08.27
[ASP] 쿠키  (0) 2021.08.26
[ASP] form  (0) 2021.08.26

+ Recent posts