반응형

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

보통은 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  (0) 2018.05.18
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 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  (0) 2018.05.18
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 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=="" )








반응형



+ 이클립스 버그

+ javax.servlet을 못 찾을 때.

해당 프로젝트의 속성(config)에서 runtime server를 다시 추가하고,
라이브러리 우선 순위를 위로 올려준다. (주로 우선순위 문제이다.)


+ tomcat 서버 추가가 안 될 때.
It is a bug in Eclipse. I had exactly the same problem, also on Ubuntu with Eclipse Java EE Juno.

Here is the workaround that worked for me:

Close Eclipse
In {workspace-directory}/.metadata/.plugins/org.eclipse.core.runtime/.settings delete the following two files:
org.eclipse.wst.server.core.prefs
org.eclipse.jst.server.tomcat.core.prefs
Restart Eclipse

+ ADT Manager가 안보일때
Windows - customize perspective
tool bar visibility와 command groups avaliavility에 adroid sdk and avd manager를 체크한다.


+이클립스 로드시 'd:skin' 요소로 시작하는 부적합한 콘텐츠가 발견되었습니다... 라고 오류날때

오류 메시지에도 보이듯이, "Android Ware(시계같은 Wareable 장치 개발)" 에서 오류가 나는거니, 이거 다 지워 주면된다.
이건 "Android Ware" 의 버그로 알려져 있는데, 나의 경우는 필요가 없으니 지워 버린거고, 필요할 경우 재 설치하면 해결 된다고 한다.

device.xml 에서 "<d:skin>" 항목을 지워주기만 해도 된다는 얘기가 있기도 하다...

주로 삭제해야될 패키지 2개
Android wear arm eabi v7a system image ; 22 1
Android wear intel x86 atom system image ; 22 1



+ 이클립스 실행 실패시.
eclipse.ini 파일을 열고 아래에서 javaw 경로명을 맞추고 -vm 부분을 추가한다.  (주의! -vm 옵션은 반드시 -vmargs보다 위에 있어야 된다.)

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20140116-2212
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
1024M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
1024m
--launcher.defaultAction
openFile
--launcher.appendVmargs

-vm
C:\Program Files\Java\jdk1.7.0_60\bin\javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=1.7
-Xms512m


-Xmx1024m



반응형




+tomcat7


-주의 ; tomcat6에서는 war 배포시 서블릿에 대한 정의를 tomcat6에서는 web.xml에서 지정해주어야 한다.
그러나, tomcat7에서는 web.xml이나 코드내에 @WebServlet 지정자 둘 중에 하나만 지정해야 한다. 중복시, 웹앱이 실행이 되지 않을 수 있다.
/usr/tomcat7/logs/catalina.날짜.log 파일을 열어보면 알 수 있다.

-CentOS에서 java는 오라클 사이트에서 따로 구하지 않아도, 그냥 yum에서 jdk7 버전 깔고, 환경 설정만 해주면 된다.

: /etc/profile에 다음의 스크립트를 추가
# java7
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk.x86_64
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/*:.

# tomcat7
export CATALINA_HOME=/usr/tomcat7

export PATH=$PATH:$CATALINA_HOME/bin:$JAVA_HOME/bin

+ 시작 방식도 좀 다름
tomcat6에서는 service tomcat6 start/stop/restart 등으로 했으나, tomcat7에서는 

startup.sh start/stop  
shutdown.sh

아니면 서비스 스크립트 만들면 동일하게 사용 가능.



+ 서비스 데몬 등록 (부팅시 자동 시작)


# vi /etc/init.d/tomcat 를 실행하여 아래내용을 입력하자  (tomcat7 init.d script 검색)


#!/bin/sh
#
# Tomcat7 auto-start
#
# chkconfig: 2345 90 90
# description: Auto-starts tomcat7
# processname: tomcat7
# pidfile: /var/run/tomcat7.pid
case $1 in
start)
    sh /usr/tomcat7/bin/startup.sh
    ;;
stop)
    sh /usr/tomcat7/bin/shutdown.sh
    ;;
restart)  # 신뢰할 수 없으니 restart 는 사용하지 말 것.
    sh /usr/tomcat7/bin/shutdown.sh
    sh /usr/tomcat7/bin/startup.sh
    ;;
esac
exit 0   


chmod 755 /etc/init.d/tomcat
실행권한 설정

chkconfig --add tomcat


-참고; tomcat 서비스가 안 죽으면 java 프로세스를 죽이면 된다. 주의!!!!
위 restart 커맨드는 절대 신뢰하면 안 됨!!!!! 주의!!!! 가끔 포트를 잡은 상태로 서비스가 종료 될 수 있다. 서비스 시작이 address in use로 되어
실패될 수 있음 !!! 스크립트 변경 필요!!!!!



반응형



+ 톰캣/Java 프로세스 모니터링 감시 / 내려가면 다시 실행. respawn

# cat tomcat_respawn.sh

#!/bin/sh
#tomcat PID 추출
PID=`lsof -itcp:8080 | grep LISTEN | awk 'NR==1 {print $2}'`
NEEDRUN=false

if [ ${PID} > 0 ]
then
     wget -q http://localhost:8080/test/test.jsp
     if [ -f test.jsp ]
     then
          rm -f test.jsp
     else
          NEEDRUN =true
     fi
else
     NEEDRUN =true
fi

if [ ${NEEDRUN} == "true" ]
then
     service tomcat7 restart
fi

위 스크립트를 crontab에 등록한다.
#chkconfig 로 crond가 운영중인지 확인한다.

#crontab -e
또는
/etc/crontab을 수정
  •  * /2 * * * * /etc/tomcat_respawn.sh > /dev/null 2>&1
2분마다 실행됨.


+ 다른 스크립트 (참고)
#!/bin/sh

            while true ; do
                /bin/date
                echo 'checking tomcat'
                if /bin/ps -elf | /bin/grep 'java' | /bin/grep 'j2sdk' then
                :
                echo 'WAS GOOD'
                else
                echo 'WAS BAD'
                /usr/local/tomcat/bin/startup.sh
                fi
                sleep 60
            done



+ Recent posts