반응형




+톰캣을 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>



반응형

gdb 사용하기(디버깅)

C/CPP로 작성한 프로그램을 실시간 디버깅할 때 사용한다.
또는 에러 발생으로 core dump가 떨어지면 그 상태의 메모리 정보를 로딩하여 디버깅도 할 수 있다.

- gdb 실행
gdb [core]나 [실행 파일]
gdb a.out core
gdb a.out 1234 (attach to pid)
r [parameter]

- 파라미터
r [parameters]
l (file:function or line#) ; 소스

- break
break [function name]
break function1

- 다음 코드로 계속 진행
c ; continue
n ; next (step over)
s ; step (step into)

- bt ; back trace
call 스택 보기. 어느 함수에서 죽었는지 확인 가능. 디버깅 정보가 포함되어 있으면 코드 라인까지 나온다.

-q ; quit


1. 먼저 컴파일시 -g 옵션을 주어, 디버그 정보가 남도록 한다.
gdb [program]

2. 소스보기
l (list)  ; 파일:함수명, 함수명, 라인번호
set listsize 20 (20줄씩 나오게한다.)
l main
l 25
l file.c:func:

3. 실행
r (run) [arg1] [arg2] ...
k (kill) ; 프로그램 종료
s (step) ; trace into.
n (next) ; next line. (function skip...)
c (continue)
u (until) ; 현재 루프를 빠져나감
finish ; 현재 함수를 수행하고 빠져나감
return ; 현재 함수를 수행하지 않고 빠져나감.
return (x) ; 리턴함.

4. BP (break point)
b 19
b main
b file.c:10
b -2
b 10 if tmp==0  ; tmp가 0일때 10라인에 bp 설정

cl hello   ; BP 삭제
cl 10
cl file.c:20
d  ; BP 모두 해제

info breakpoints ; BP 목록
줄여서 i b  (TAB키 사용 가능)
enable 2
disable 2

5. w (watch)
watch i ; i값이 변경될때마다 알려줌. bp

info locals ; 지역변수 보기
info variables ; 전역 변수 리스트
p (printf) ; 개별 변수 보기

p *p ; 포인터 값 보기
p $eax ; 레지스터 값

display i ; 변수값을 항상 display
undisplay i;

6. 스택
bt (backtrace) ; 스택 출력
info f (frame)
info args
info locals

bt
frame 3
up ; 상위 스택 프레임으로 이동
down ; 하위 스택 프로임으로 이동

+ 쓰레드 정보
info threads

-디버깅 쓰레드 전환
t 쓰레드인덱스번호


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

Vector 3  (0) 2018.05.23
Vector 2  (1) 2018.05.18
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (1) 2018.03.10
mutex 동기화 예제  (1) 2018.03.06
반응형
아래는 std::mutex를 이용한 C++ 동기화 예제 코드이다.
C 방식으로 동기화하는 것은 아래쪽에 pthread_mutex 예제를 참고하세요.
C++11 기준.
+std::mutex
#include <mutex>
#include <thread>
std::mutex mtx ;

void ThreadFunc(int nID, int &nVal) {
mtx.lock() ;
동기화 블록
mtx.unlock() ;
}

int main() {
int nVal=0 ;
std::thread th1(ThreadFunc, 0, std::ref(nVal)) ;
std::thread th2(ThreadFunc, 1, std::ref(nVal)) ;
th1.join() ;
th2.join() ;
return 0 ;
}
 
 
 
+ linux C mutex
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_COND_INITIALIZER ;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER ;
int pthread_mutex_lock(pthread_mutex_t *mutex) ;
     다른 thread에서 mutex_lock을 해제할 때 까지 블록된다.
int pthread_mutex_unlock(pthread_mutex_t *mutex) ;
     mutex lock을 돌려준다.
int pthread_cond_signal(pthread_cond_t *cond) ;
     조건변수cond로 시그널을 보낸다. cond에서 wait하고 있는 쓰레드를 깨움.
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) ;
     조건변수 cond 시그널을 기다림. 블록.
ex)
void ThreadA(void *arg) {
pthread_mutex_lock(&mutexa) ;
to do
pthread_mutex_unlock(&mutexa) ;
}

pthread_t threada ;
int thra ;
int status ;
thra = pthread_create( &threada, NULL, ThreadA, (void*)NULL) ;
pthread_join(threada, (void**) &status) ;
컴파일시
gcc ......  -lpthread
 
 
 

 

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

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


자바스크립트에서 입력필드값을 타이핑시마다 검증하는 방법이다.


예) textarea의 최대 글자수 체크하여 넘지 못하도록 하기. 

이것은 간단하게 속성으로 설정할 수 도 있지만, 여기서는 예제로 해 본 것이다.

검사 부분을 원하는 입력값 형식체크로 변경하여 사용할 수 있다.


<html>

<head>

<script language="javascript">


function checkLength(obj) {

var maxlen = 10; 

if(obj.value.length > maxlen) {

obj.value = obj.value.substring(0,maxlen);

}

}


</script>

</head>

<body>



<form name="form">

<textarea name="content" cols="20" rows="5" onKeyUp="checkLength(this);"></textarea>

<textarea name="content2" maxlength="10"></textarea>

</form>

<body>


</html>




반응형

자바스크립트에서 폼 데이터를 전송시에 입력값 검증을 하는 방법이다.


보통 폼 데이터를 submit(전송, 확인 버튼)을 할 때, 검증을 수행하게 한다.


<form action="aaa.html" method="POST" onsubmit="return formChk();">

<input id='aname' type="text" name="aname">


위와 같이 form에 onsubmit 이벤트에 검사 할 함수를 추가한다.

return은 onsubmit의 리턴값으로 formChk()의 반환값을 그대로 사용하게 한다.

리턴값이 false이면 submit을 취소하게 된다. 


<script>

function formChk() {

// to do : 입력값 검증

if ( $('#aname').val()=='' ) {

alert("input data!") ;

return false ;

}

return true;

}

위와 같이 입력값을  id로 찾을때는 jquery를 사용하여 변수에 접근하면 편리하다.

순수 js를 사용하려면 name으로 element를 찾아 접근하면 된다.

document.forms[0].aname.value

또는

document.getElementByName("aname").value


입력값 검증에서 입력값을 다시 받도록 할 때는 보통 포커스를 입력필드로 이동시킨다.



변수명이 길어지므로 간단하게 함수로 파라미터를 받아 처리하기도 한다.

function formCheck(frm) {

if ( frm.aname.value=="") {

alert("이름을 입력해주세요.") ;

frm.aname.focus() ;

return false ;

}

return true ;

}


<form name="myform" onsubmit="return formCheck(this);">

이렇게 사용한다.


+폼체크에서 많이 체크하는 루틴

var fVal = frm.aname.value;


수(integer) 범위 체크

if ( parseInt(fVal) < 8   || parseInt(fVal)>10 )


빈값 체크

if ( fVal=="" )








+ Recent posts