반응형

Vector 3 추가/삭제/변경


-swap

같은 타입의 두 벡터의 엘리먼트들을 바꾼다. 크기는 상관없다.

std::vector<int> foo(3,100) ;     // 100을 값으로 갖는 요소 3개

std::vector<int> bar(5, 200) ;    // 300을 값으로 갖는 요소 5개


foo.swap(bar);    // foo와 bar 두 개의 벡터들이 서로 바뀐다.

foo ; ==> 200 200 200 200 200

bar ; ==> 100 100 100


-push_back ; 벡터 마지막에 요소 추가. 복사(새롭게) 추가됨. 벡터 크기가 자동으로 증가. 메모리도 부족하면 자동으로 추가 할당됨.

std::vector<int> v1 ;

v1.push_back(100) ;

v1.push_back(200) ;

-pop_back ; 벡터 마지막 요소를 제거한다. 리턴값 없음.

마지막 요소값을 확인하려면 pop_back()하기 전에 back()으로 확인 가능.

while( !v1.empty() ) {

   sum+=v1.back() ;

  v1.pop_back() ;

}

v1벡터가 빌때까지 하나씩 요소들을 제거함. 요소 제거 전에 제거할 값을 얻어 총 합을 구한다.


-insert

특정 위치가 새로운 요소를 삽입한다.

insert ( const_iterator position,  const value_type & val) ;

insert( " , size_type n, const value_type &val) ;

insert(", InputIterator first, InputIterator last) ;

insert(", value_type&& val) ;

insert(", initializer_list<value_type> il) ;

리턴값 ;새로 추가한 첫번째 요소 위치 이터레이터

std::vector<int> v1(3,100) ;    // 100 100 100

std::vector<int>::iterator it ;

it = v1.begin() ;

it = v1.insert(it, 200) ;    // 200 100 100 100

v1.insert(it, 2, 300) ; // 300 300 200 100 100 100 

std::vector<int> v2(2, 400) ;    // 400 400 

v1.insert(v1.begin()+2, v2.begin(), v2.end()) ;    // 300 300 400 400 200 100 100 100 

(v2.end() 전 위치까지만 추가함).

int arr[]={501,502,503};

v1.insert(v1.begin(), arr, arr+3 ) ;    // 501 502 503 300 300 400 400 200 100 100 100 

 (arr+3 전 위치까지 추가함.)


 -erase

특정 위치 또는 위치 범위의 요소들을 제거

v1.erase(v1.begin()+5) ;    // 6번째 요소를 제거함. (인덱스는 0부터시작)

v1.erase(v1.begin(), v1.begin()+3) ;    // 앞에서 부터 3개를 제거. (두 번째 파라미터로 지정한 위치 전까지만 제거됨)

-clear ; 전체 요소 삭제


-emplace

할당과 삽입. insert는 복사하여 삽입이지만, emplace는 할당된 것을 그대로 사용하여 성능면에서는 낫다.

std::vector<int> v1={10,20,30} ;

auto it = v1.emplace(v1.begin()+1, 100) ;    // 10, 100, 20, 30

v1.emplace(it, 200) ;    // 10, 200, 100, 20, 30

v1.emplace(v1.end(), 300) ;    // 10, 200, 100, 20, 30, 300


-emplace_back

push_back()과 거의 똑같다. push_back()은 복사하여 사용하는데, emplace_back은 construct 한 것을 그대로 사용하기 때문에 성능면에서 좀 낫다.

v1.emplace_back(100);    // v1 마지막에 100 추가.





'Develop > C&CPP' 카테고리의 다른 글

List 1  (0) 2018.05.28
Array 1  (0) 2018.05.25
Vector 2  (1) 2018.05.18
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
반응형

cpp Vector 2


+ vector의 element 탐색

-std::vector::begin

첫번째 엘리먼트를 가리키는 이터레이터를 리턴한다.

컨테이너가 empty이면 리턴값은 dereference할 수 없다.

-std::vector::end

마지막을 지난 엘리먼트의 위치를 가리키는 이터레이터를 리턴한다.

past-the-end 엘리먼트는 벡터의 마지막 엘리먼트 뒤의 이론적 엘리먼트다. 따라서 dereference할 수 없다.

컨테이너가 empty이면 리턴값은 vector::begin의 리턴값과 같다.


ex)

std::vector<int> my ;

for (int i=1; i<=5; i++) my.push_back(i) ;

for(std::vector<int>::iterator it=my.begin(); it!=my.end(); ++it) 

   std::cout << " " << *it ;

my vector의 모든 엘리먼트 탐색하여 출력. 1,2,3,4,5


+ 역방향 탐색

vector::rbegin()    ,   vector::rend()

int i=0 ;

std::vector<int> my(5) ; 

std::vector<int>::reverse_iterator rit = my.rbegin() ;

for (; rit!=my.rend(); ++rit)  *rit = ++i ;

출력하면 5,4,3,2,1 을 갖는다.


+첫번째 값, 마지막 값

vector::front()    , vector::back()

begin(), end()는 iterator로 위치를 의미하지만, front(), back()은 위치가 아니라 엘리먼트의 값을 참조로 리턴한다.

std::vector<int> my ;

my.push_back(50) ;

my.push_back(20) ;

my.front() -= my.back() ;    // 첫번째 엘리먼트에 첫번째 - 마지막 값으로 할당한다.

std::cout << my.front() << std::endl ;

첫번째 값이 30으로 변경되어 30이 출력된다.


std::vector<int> my ;

my.push_back(10) ;

while ( my.back()!=0 ) my.push_back(  my.back() -1 ) ;

출력하면 10, 9, 8, ..., 2, 1, 0


+const iterator

vector::cbegin()        vector::cend()

vector::crbegin()        vector::crend()

begin(), end()와의 차이점은 리턴값이 const_iterator 로써 iterator를 통한 엘리먼트의 값을 변경할 수 없다. (*it=value --> compile error)

+data

value_type *data()

첫번째 엘리먼트 배열 메모리의 포인터를 리턴한다.  벡터는 엘리먼트들이 연속적인 메모리에 위치되도록 보장한다. 따라서 주소로 접근 가능.

std::vector<int> my(5) ;

int *p = my.data() ;

*p=10 ;

p++ ;

*p=20 ;

p[2]=40 ;

출력하면 10, 20, 0, 40, 0


+ [] operator

벡터의 n번째 위치의 엘리먼트를 참조로 리턴한다.

my[i] 이렇게 배열처럼  읽고 쓰기가 사용가능.




 



'Develop > C&CPP' 카테고리의 다른 글

Array 1  (0) 2018.05.25
Vector 3  (0) 2018.05.23
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
gdb로 디버깅하기  (0) 2018.03.06
반응형

cpp의 vector (std::vector)


크기를 변경할 수 있는 배열로 표현된 컨테이너

배열처럼 인덱스로 접근이 가능.

배열과 다르게 동적으로 크기 변화가 되며 메모리가 자동으로 관리

엘리먼트들의 순서가 있는 컨테이너. 엘리먼트의 위치 인덱스로 접근

#include <vector>


+초기화

std::vector<int> a1;    // 빈 객체

std::vector<int> a2(4, 100) ; // 100의 값을 갖는 엘리먼트들을 4개만들어 초기화.

std::vector<int> a3(a2.begin(), a2.end());  // a2의 이터레이터를 통한 복사.

std::vector<int> a4(a3) ;     // a3 복사

 

-배열을 복사

int array1={1,2,3,4,5} ;

std::vector<int> a5(array1, array1+sizeof(array1)/sizeof(int)) ;  // 두 번째 파라미터는 배열의 마지막 노드의 다음 노드의 포인터.

-출력/탐색

for(std::vector<int>::iterator it = a5.begin(); it!=a5.end(); it++)

    std::cout << " " << *it ;    // *it ; 이터레이터가 가리키는 엘리먼트의 값.(int)

=>  a5.end()는 a5의 마지막 노드의 위치 다음으로 끝을 가리키는 위치로 볼 수 있다. 따라서 위에서 마지막까지 빠짐없이 전체의 값을 출력할 수 있다.


+ 복사

= operator : 다른 컨테이너의 내용을 기존 내용에 덮어쓴다. (크기도 수정됨.)

std::vector<int> a1(3, 0) ;

std::vector<int> a2(5, 0) ;

a2 = a1 ;

a1=std::vector<int>();

a2의 크기는 5에서 3으로 변경되고, 기존 a1의 elements들로 바뀜.

a1은 다시 초기화하여 empty가 된다.


+할당

assign()

std::vector<int> a1, a2, a3 ;

a1.assign(5, 1) ;    // 5개의 노드를 만들고, 전부 1로 초기화.

std::vector<int>::iterator it = a1.begin()+1 ;    // a1의 두 번째를 가리킴.

a2.assign( it, a1.end()-1 ) ; //위의 이터레이터 부터 a1의 끝 하나 전까지 a2로 할당(복사). a1에서 앞, 뒤 하나씩뺀 3개가 복사됨.

a3.assign( arr1, arr1+3 ) ;   // arr1 배열에서 3개를 복사.


+벡터 크기와 크기 변경.

-벡터의 크기.

a1.size();   // 엘리먼트의 개수를 리턴함.

-벡터의 용량

a1.capacity();    // 메모리가 할당된 크기. (엘리먼트 크기 단위)

capacity는 size와 다를 수 있다. 실제 데이터 크기보다 메모리를 reserve로 더 많이 할당될 수도 있다.  (  size <= capacity )

벡터는 데이터 추가시에 알아사 자동으로 메모리가 확장되기 때문에 할당문제를 고려할 필요가 없지만 성능상 미리 메모리 할당이 필요한 경우 reserve()를 통해 최대로 받을 아이템 개수를 파라미터로 설정해 두는 것도 좋다.


-벡터 크기 변경

void resize(size_type n ) ;

void resize(size_type n , const value_type &val) ;

벡터의 크기를 n으로 변경. 현재 컨테이너 크기보다 작게 설정하면, n개의 엘리먼트까지만 유효하다. (나머지는 삭제).

현재 컨테이너 크기보다 크게 설정하면, 기존 데이터를 유지하고 크기가 확장. val값을 지정하면 해당 값으로 채운다.

현재의 capacity보다도 크면, 알아서 메모리 할당까지 해준다.

std::vector<int> a1 ;

for(i=0 i<10; i++) a1.push_back(i) ;    // 0~9까지 10개의 노드 추가.

a1.resize(5);    // 크기를 5로 지정. 데이터는 0~4까지만 존재.

a1.resize(8, 10);    //크기를 8로 확장. 뒤에 3개의 공간이 더 생기고 10으로 초기화됨.

a1.resize(12);     // 크기를 12로 확장. 뒤에 4개의 공간이 더 생기고 빈 값(0으로 초기화).

a1 전체 출력

for (int i=0; i<a1.size(); i++) std::cout << " " <<a1[i] ;

0 1 2 3 4 10 10 10 0 0 0 0 








'Develop > C&CPP' 카테고리의 다른 글

Vector 3  (0) 2018.05.23
Vector 2  (1) 2018.05.18
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
gdb로 디버깅하기  (0) 2018.03.06
mutex 동기화 예제  (1) 2018.03.06
반응형

tomcat7 서비스 시작 스크립트. update 버전!

전에 restart 스크립트가 장애발생 위험이 있어서 개선이 필요하다고 했다.
catalina.sh에서 CATALINA_PID 경로를 지정했으면, tomcat 구동시 pid 파일이 생성된다.

톰캣 pid 구하는 방법


PID=`cat "$CATALINA_PID"`

현재 pid가 떠 있는지 확인


ps -p $PID > /dev/null 2>&1
if [ $? -eq 0 ] ; then
     echo "process is alive."
else
     echo "process is not found."
fi
  • 주의! ; 스크립트에서 주석도 써줘야 함. (chkconfig에서 인식문제)
  • 아래 스크립트를 /etc/init.d에 생성 (파일명은 서비스명)
  • 서비스 자동시작 추가
  • tomcat 계정으로 서비스를 구동하므로 tomcat 계정이 시스템에 있어야 한다 .

#chkconfig --add tomcat7
#chkconfig --level 2345 tomcat7 on
#chkconfig --list tomcat7

# cat tomcat7
---------------------------------------------------
#!/bin/bash
#
# tomcat     This shell script takes care of starting and stopping Tomcat
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Provides: tomcat
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start:
# Default-Stop:
# Short-Description: start and stop tomcat
### END INIT INFO

TOMCAT_USER=tomcat
TOMCAT_HOME="/usr/tomcat7"
CATALINA_PID=/usr/tomcat7/bin/tomcat.pid
SHUTDOWN_WAIT=45

tomcat_pid() {

#톰캣 pid 구하는 방법
PID=`cat "$CATALINA_PID" 2>&1`
#현재 pid가 떠 있는지 확인
ps -p $PID > /dev/null 2>&1
if [ $? -eq 0 ] ; then
        #     echo "process is alive."
        echo $PID
else
        #     echo "process is not found."
        echo ""
fi
}


start() {
    pid=$(tomcat_pid)
    if [ -n "$pid" ]
    then
        echo "Tomcat is already running (pid: $pid)"
    else
        # Start tomcat
        echo "Starting tomcat"
        /bin/su - -c "cd $TOMCAT_HOME/bin && $TOMCAT_HOME/bin/startup.sh" $TOMCAT_USER
    fi
    return 0
}

stop() {
    pid=$(tomcat_pid)
    if [ -n "$pid" ]
    then
        echo "Stoping Tomcat"
        /bin/su - -c "cd $TOMCAT_HOME/bin && $TOMCAT_HOME/bin/shutdown.sh" $TOMCAT_USER

    let kwait=$SHUTDOWN_WAIT
    count=0
    count_by=5
    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
    do
        echo "Waiting for processes to exit. Timeout before we kill the pid: ${count}/${kwait}"
        sleep $count_by
        let count=$count+$count_by;
    done

    if [ $count -gt $kwait ]; then
        echo "Killing processes which didn't stop after $SHUTDOWN_WAIT seconds"
        kill -9 $pid
    fi
    else
        echo "Tomcat is not running"
    fi

    return 0
}

case $1 in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
       pid=$(tomcat_pid)
        if [ -n "$pid" ]
        then
           echo "Tomcat is running with pid: $pid"
        else
           echo "Tomcat is not running"
        fi
        ;;
esac

exit 0
반응형




+톰캣을 root 계정이 아닌 tomcat 계정으로 실행 하기

우선 tomcat 계정을 생성한다.
# useradd -M tomcat

톰캣 계정 설정 확인
계정을 생성하면 home 디렉토리가 /home/tomcat으로 설정 되며, 이를 CATALINA_HOME으로 변경해준다.

# grep tomcat /etc/passwd
tomcat:x:503:503::/usr/local/tomcat:/bin/bash

실행 스크립트 작성하기 (간략버전)
# vi /etc/rc.d/init.d/tomcat

아래 내용을 작성한다.  ==> 서비스 재시작(restart)시 문제가 발생할 수 있음!!! 주의! (binding fail.) => 서비스 shutdown이 완전히 완료되었는지 확인하는 작업이 필요함.

(아래는 간략 버전이므로 restart는 정확성이 보장 안됨. 다음에 나오는 update 버전 참고)
#!/bin/bash
# Startup script for the Tomcat Server
# chkconfig: 345 50 50
# description: Tomcat is a Web application server.
# processname: java
# directory : CATALINA_HOME=/usr/local/tomcat
. /etc/profile
case "$1" in
    start)
        echo "Starting tomcat: "
        su - tomcat -c $CATALINA_HOME/bin/startup.sh
        ;;
    stop)
        echo "Shutting down tomcat: "
        su - tomcat -c $CATALINA_HOME/bin/shutdown.sh
        ;;
    restart)          # 안전하지 않으니 restart는 하지 말 것.
        echo "Restarting tomcat: "
        su - tomcat -c $CATALINA_HOME/bin/shutdown.sh; su - tomcat -c $CATALINA_HOME/bin/startup.sh
        ;;
    *)
        echo "Usage: service tomcat {start|stop|restart}"
        exit 1
esac
exit 0

소유권을 tomcat으로 변경
# chown tomcat:tomcat tomcat 

tomcat 스크립트에 실행권한 주기
#chmod 755 tomcat

runlevel에 등록
chkconfig에서 add 될 수 있도록 스크립트에 "# chkconfig: 345 50 50" 를 추가한다.
#chkconfig --add tomcat


실제로 리부팅시 톰캣이 tomcat 계정으로 실행되는지 확인한다
# reboot

톰캣 실행시 데몬실행이 tomcat으로 되어 있는지 확인한다.  tomcat이 아닌 root인경우는 잘못된 경우임
# ps -ef | grep tomcat

톰캣 프로세스 수동 시작 및 종료
# service tomcat start
# service tomcat stop



반응형

+정규식으로 스트링의 일부를 찾아 추출한다.

cpp 정규식 검색/매칭
- 스트링에서 특정 class명으로 나온 태그에서 href의 url 부분만 추출하기.
-1단계
class="i-e" 로 시작하고, <, > 문자가 나오기 전까지 중간 부분 추출.
-2단계
추출된 부분에서 href=으로 시작하고 ", " 사이에 있는 중간 부분 추출.
 
regex_search() 함수로 찾는다. match 결과의 [0]은 패턴이 맞는 부분의 전체 스트링을 추출.
[1], [2], 등은 그 다음에 패턴에서 ()로 싸인 부분 순서대로 추출.
#include <iostream>
#include <string>
#include <regex>

using namespace std ;
string html="<a class=\"i-e\" href=\"DATA IM INTERESTED IN\">\n\
<a class=\"chrome\" href=\"nono chrome\">\n\
<a class=\"i-e\" href=\"ie like1\">\n\
<a class=\"chrome\" href=\"nono chrome\">\n\
<a class=\"i-e\" href=\"ie like2\">\n\
<a class=\"chrome\" href=\"nono chrome\">\n\
<a class=\"chrome\" href=\"nono chrome\">\n\
<a class=\"i-e\" style=\"font-size:10pt;\" href=\"ie like3\">\n\
<a class=\"chrome\" href=\"nono chrome\">\n\
<a class=\"chrome\" href=\"nono chrome\">\n\
<a class=\"i-e\" href=\"ie like4\"> <a class=\"i-e\" href=\"ie like5\">\n\
";

int main() {
    smatch m, m2 ;
    regex e ( "class=\"i-e\"([^<>]+)>" ) ; // get: href="ie like"
    regex e2 ( "href=\"(.+)\"" ) ; // get ie like
    bool r, r2 ;
    string content ;
    int start=0 ;
    cout << "input html : " << html << endl ;
    do {
        content = html.substr(start) ;
        // cout << "content:"<<content<<endl;
        r=regex_search(content, m, e) ;
        if ( r ) {
            // cout << "search: " << r << endl ;
            // cout << "str: " << m.position() << " "<< m.str() << endl ;
            cout << "match : " << m[1] << endl ;
            r2 = regex_search((string)m[1], m2, e2) ;
            if ( r2 ) {
                cout << " URL : " <<m2[1]<<endl ;
            }
        }
        start+=m.str().length()+m.position();
    } while( r );
    return 0 ;
}
g++ test_regex2.cpp
./a.out
input html : <a class="i-e" href="DATA IM INTERESTED IN">
<a class="chrome" href="nono chrome">
<a class="i-e" href="ie like1">
<a class="chrome" href="nono chrome">
<a class="i-e" href="ie like2">
<a class="chrome" href="nono chrome">
<a class="chrome" href="nono chrome">
<a class="i-e" style="font-size:10pt;" href="ie like3">
<a class="chrome" href="nono chrome">
<a class="chrome" href="nono chrome">
<a class="i-e" href="ie like4"> <a class="i-e" href="ie like5">


match :  href="DATA IM INTERESTED IN"
 URL : DATA IM INTERESTED IN

match :  href="ie like1"
 URL : ie like1

match :  href="ie like2"
 URL : ie like2

match :  style="font-size:10pt;" href="ie like3"
 URL : ie like3

match :  href="ie like4"
 URL : ie like4

match :  href="ie like5"
 URL : ie like5

 

'Develop > C&CPP' 카테고리의 다른 글

Vector 3  (0) 2018.05.23
Vector 2  (1) 2018.05.18
Vector 1  (0) 2018.05.16
gdb로 디버깅하기  (0) 2018.03.06
mutex 동기화 예제  (1) 2018.03.06
반응형

자주 사용하는 이클립스(eclipse) 단축키


개발툴에서는 단축키 사용이 필수인데, 여러가지를 쓰다보면 가끔 기억이 나지 않을 때가 종종 있습니다. 주로 많이 쓰는 이클립스 단축키들을 정리해봤습니다.



+ 일반적인 기능 단축키

-동일한 파일을 2개 창으로 보기
ctrl+{    ; 좌우로 보기 (ctrl+shift+{) 

-파일2개를 창2개로 보기
추가로 열 파일을 탭에서 드래그하여 원하는 윈도우 박스 위치에 놓는다.


(컨, ^ - 컨트롤 키 ,  쉡-쉬프트 키, @-알트 키)

컨쉽+O ; auto import
컨쉽+T ; 클래스 찾기
컨쉽+위/아래 ; 메소드 이동(위, 아래)
컨쉽+스페이스 ; 파라미터 보기
컨쉽+F ; 자동 코드 들여쓰기 정리. form feed.

컨+O ; 현재소스내에서 메소드나 필드로 이동 ; method
컨+T ; class tree보기/이동 상속관계 ; tree

컨+K ; 찾는 문자열 블록선택후, 연속으로 찾기. 반대방향은 쉽 추가.

컨+D ; delete line
컨+I ; auto indent (one line)



+ 가장 필요한 단축키.  
Code Assit
추적
돌아가기
실행

@+방향키(왼쪽화살표) ; 이전 커서 위치로 이동!!!!!! 소스추적하다가 되돌아갈때 필수!
^+Space ; 코드 파라미터 보기  (sysout 자동풀기)
(리눅스에서는 @+/ )

F3 or  ^클릭 ; 함수 추적
^+F11 ; 실행
^F6 ; 이전 에디터창(소스). 
^Q ; 소스 마지막 수정위치로 이동
^+SHIFT+/ ; 블록 주석처리
^+  / ; 주석처리
^+SHIFT+F ; 코드 정리 (인덴테이션)



+이클립스 (MAC)맥에서 단축키  (Com - 커맨드 키)

(@대신Com)+방향키 ; 이전 커서 위치로 이동
(Com추가)+^+Space ; 코드 파라미터 보기
F3 or  ^+클릭 ; 추적
(FN추가)+^+F11 ; 실행
^F6 ; 이전 에디터창(소스). 
^Q ; 소스 마지막 수정위치로 이동
^H ; 전체 검색

^K ; 다음 찾기. 이전찾기 ^+SHIFT+K




반응형

입력창에 실시간으로 숫자키만 입력 받도록 하고, 출력하는 기능예제입니다.

보통은 onsubmit 이나 onchange에서 처리해도 되지만, 키 타이핑시 마다 즉시 체크하도록 하여 아예 입력이 안 되도록 합니다. 

검사 루틴만 변경하면 원하는 key typing만 받도록 처리할 수 있습니다.

<input id="myinput" onkeypress="javascript:return myFunction(event);" onkeyup="myFunction2();">

</input>

only numbers...

<p id="demo"></p>


<script>

function myFunction(evt) {

  var charCode = (evt.which) ? evt.which : event.keyCode;

        if (charCode > 31 && (charCode < 48 || charCode > 57)) {

            return false;

        }

        return true;

}

function myFunction2() {

    var x = document.getElementById("myinput").value;

    document.getElementById("demo").innerHTML = "You selected: " + x;

}

</script>



반응형


링크 태그인 a를 보면 기본적으로 밑줄이 있고, 방문했던 링크는 색깔도 변한다.

보기에 안 좋을 수 있다.

css를 추가하여 간단하게 깔끔하게 원하는대로 변경할 수 있다.


예)

a:link { color:#0000ff; text-decoration: none;}  

a:visited { color:#0000ff; text-decoration: none;} 

a:hover { color:#cc0000; text-decoration: none;}

a:active { color:#ff0000; text-decoration: none;}


의미는 다음과 같다.

link는 기본 텍스트 색상
visited는 방문했던 적이 있는 링크
hover는 마우스가 해당 링크정보 위로 올라갔을 때
active는 마우스로 클릭하는 순간 짧은 시간 동안.

정리하면 처음에는
link 상태에서 마우스가 위로 올라가면 hover 여기서 클릭하면 active로 짧게 상태로 변경되었다가 visited로 된다.




반응형


frame을 나누어 메뉴페이지와 내용 페이지들을 분리하여 구성하고 있는데, 외부에서 직접 내용 페이지 URL로 접근할때 메뉴 페이지나 상단 타이틀 페이지 등 다른 페이지들이 출력되지 않는 문제가 있다.

frame 내부 페이지 직접 접근시 최상위 페이지로 이동하게 만드는 기능.


서브페이지 코드에 이동할 최상위 페이지를 지정해 둔다. 메뉴 선택을 바로 들어갈 수 있도록 파라미터로 이동 메뉴를 준다.

<script>

// 프레임 페이지 직접 접근 차단. 메인 페이지로 이동

self.onload = function init() {

if ( self==top ) {

self.location = "/?menu=hash" ;

}

}

</script>


최상위 페이지 코드 (index 페이지)
위에서 GET 파라미터로 준 메뉴를 디폴트 페이지로 내용을 설정하는 작업. 
예시)
<frameset cols="200px,*" border="0">
<frame name="menu" src="./menu.php">
<?php
$t = $_GET['menu'] ;
if ( $t && $t!="") {
if ( $t=='link' )
$t='link.php' ;
else if ( $t=='encode')
$t = 'encode.php';
else if ( $t=='hash')
$t = 'hash.php';
else if ( $t=='encrypt')
$t = 'encrypt.php';
else
$t='encode.php' ;
} else
$t='encode.php';
?>
<frame name="right" src=<?php echo "\"$t\"";?> >
</frameset>



+ Recent posts