shell script로 구현하는 URL 상태 체크

Shell Script로 특정 URL의 상태를 체크하고자 합니다.


curl을 이용하면 간단 하네요.

curl은 결과를 exit code로 리턴 합니다.

exit codes list는 아래 man page를 참고하세요.

http://curl.haxx.se/docs/manpage.html )


#! /usr/bin/sh

function check {
     if [ $? -ne 0 ] ; then
         echo "Error occurred getting URL $1:"
         if [ $? -eq 6 ]; then
             echo "Unable to resolve host"
         fi
         if [$? -eq 7 ]; then
             echo "Unable to connect to host"
         fi
         exit 1
     fi

}
curl -s -o "/dev/null" $1
check;


[ 출처 ]

http://answers.google.com/answers/threadview/id/276934.html

shell script로 구현하는 multi tail


multi tail 유틸은 이미 있습니다.


http://www.vanheusden.com/multitail/


하지만, 설치를 해야 하죠


간단하게 shell script로 구현 하는 방법이 있어서 소개 합니다.



$ vi multitail.sh

#!/bin/ksh

function sig_int
{
   echo 'sig_int'
   kill `jobs -p`
}

for file in "$@"
do
  tail -f $file &
done
trap 'sig_int' 2

wait


이상입니다.

Javascript로 만드는 CVS 로그 파서.

업무상 소스의 버전관리 소프트웨어로 CVS를 사용합니다.

( 남들은 SVN 이나 git 를 사용하던데, 장비가 구형 sun 장비다 보니.. )


개발 과정에서 commit을 날리다보면, 내가 무슨 파일을 수정했는지 잊을 때가 있습니다.

개발 건별 패치리스트를 작성할 수 있도록 웹페이지를 하나 만들기로 했습니다.


[ 설계 ]

  1. cvs log 명령을 실행하는 shell script를 작성한다.

  2. Shell Script 를 실행하여 로그를 읽어 전달하는 jsp 파일을 작성한다.

  3. html에서 jsp를 호출 하고, cvs log를 파싱하여 웹 페이지에 보여준다.



[ 개발 ]

1. shell script - ( cvs_log.sh )


#!/usr/bin/ksh

cd $1
cvs log -N -S -d ">=$2"  2>& 1 | grep -v "^cvs log" | grep -v "^?"


파라미터로 이동할 cvs 디렉토리와 검색할 날짜를 받습니다.


cvs log -N -S -d ">=2013-06-07"

-. 위 명령은 2013/06/07이후 수정된 파일에 대한 log를 출력해 줍니다.


2>& 1 

-. 위 내용은 STDERR을 STDOUT으로 리다이렉션 합니다.


grep -v "^cvs log" | grep -v "^?"

-. 위 명령은 불필요한 로그를 제거 합니다.



2. shell을 실행할 jsp - ( cvsLog.jsp )

소스 보기


jsp 소스는 간단 합니다.

ProcessBuilder, Process 클래스를 이용하여 실행 하고, StreamReader 클래스로 출력된 로그를 입력받습니다. 



3. html 파일 - ( patchList.html )


cvs log는 아래와 형식으로 남습니다.


cvs log 포멧 보기


내용을 보면 특정 패턴이 있는 것을 알 수 있습니다.



-. 로그를 파싱하여, json 객체에 담는 javascript는 아래와 같습니다.


소스 보기


String 검색은 정규식을 사용했습니다.


-. cvs log를 위 함수에 파라미터에 넣고 실행하면, json 객체를 return 합니다.

    chrome의 javascript console에서 확인 하면 아래와 같습니다.




-. 완성된 cvs 파서 테스트용 html을 받으려면, 아래 파일을 다른이름으로 저장 하세요.


cvs.html



[ 추가 작업 ]

이렇게 하면 패치 리스트 작성에 문제 있습니다.

실무에서는 개발건이 많기 때문에, 날짜로만 검색하게 되면 불필요한 파일들이 포함 됩니다.


특정 개발건만 구분 하기 위해, 소스를 commit 할때, 아래와 같은 포멧으로 comment를 작성합니다.

duid: D0000145

title: 테스트 타이틀 입니다.

comment: 이런이런 내용을

블라블라 수정한다.


개발 건 마다 uniqe한 ID를 발급하여 할당 하고, 할당한 id를 검색 조건에 포함 하면, 원하는 개발 건으로 수정된 파일 리스트를 얻을 수 있습니다.


리스트를 멋있게 보여주기 위해 Jquery EasyUI를 사용 했습니다.

이것 저것 끼워 넣느라 소스가 좀 길어 졌지만, 깔끔하게 결과가 잘 나오네요.

 

최종 소스는 아래와 같습니다.


소스 보기


솔라리스 메일 전체 삭제

솔라리스에서 메일 전체 삭제 벙법.

콘솔에서 아래와 같이 입력하면 된다.


$ printf "d*q"|mailx -N


[출처] 

http://www.unix.com/unix-dummies-questions-answers/38598-delete-all-mails-solaris.html

IOS 토글 버튼

HTML, jquery 로 구현한 IOS 토글 버튼 입니다.

특별한 말이 필요 없이 아래 링크 클릭

http://jsfiddle.net/newtype/jhgrD/


[ link ]

   http://jsfiddle.net : javascript WEB IDE

   http://imageshack.us : 외부 링크가 가능한 Image 공유 사이트


[ 출처 ]

http://stackoverflow.com/questions/6934785/jquery-effect-of-iphone-toggle-button

http://jsfiddle.net/GzL87/1/


오라클 테이블의 레코드 사이즈 계산을 쉽게하자

오라클 DB 테이블의 레코드 사이즈 계산을 할 필요가 있었다.

구할려고 보니, 데이터 형별로 계산 공식이 틀리다.


쉽게 계산하기 위해 HTML 로 작성해봤다.

사용방법은 DB테이블 Description의 레코드별 사이즈 부분을 TextArea에 붙여 넣고 실행하면 된다.


주요 소스 내용은 아래와 같다.


<head>
	<title>테이블 레코드 계산</title>
	<script src="http://code.jquery.com/jquery-1.5.min.js" type="text/javascript" 
                      charset="utf-8"></script>
    <script>
        /* 계산 공식 출처 
        	http://epoonet.egloos.com/4479971
        */
    	var pTable = [
    		{ type: "char", 	calc:function(n){ return n; }},
    		{ type: "varchar2", calc:function(n){ return n; }},
    		{ type: "nchar",	calc:function(n){ return 2 * n;  }},
    		{ type: "nvarchar2",calc:function(n){ return 2 * n; }},
    		{ type: "number",   calc:function(n){ return 1+ Math.ceil(n/2); }},
    		{ type: "date",		calc:function(n){ return 7; }},
    		{ type: "raw",		calc:function(n){ return n; }},
    		{ type: "long",		calc:function(n){ return n; }},
    		{ type: "long raw", calc:function(n){ return n; }},
    		{ type: "bfile", 	calc:function(n){ return 530; }},
    		{ type: "rowid", 	calc:function(n){ return 6; }},
    		{ type: "timestamp",calc:function(n){ return 13; }}
    	];
    	
        $(document).ready(
            function(){
            $("#DoIt").click(function() {
				var resultText = "";
				var inputText = $("textarea#src").val().toLowerCase().split("\n");
				var lineString;
				var size =0, sum =0;
				var buf;
				
				for(var i=0; i<inputText.length; i++) {
				
					size = 0;
				
					if ( lineString=$.trim(inputText[i]) ) {
						for(var j=0; j<pTable.length; j++) {
							if ( lineString.substr(0, pTable[j].type.length) 
                                                              == pTable[j].type ) {
								try {
								   size = Number(lineString.split("(")[1].split(")")[0]);
								} catch (e) { 
								   size = 0;
								}

								size = pTable[j].calc(size);
								break;
							}
						}
					}
					
					sum += size;
					resultText += lineString + " : " + size + "<br/>";
					
				}
				
				resultText += "<br/><b>sum: " + sum + "</b>";
				$("#result").html( resultText );
				
            });
        });
    </script>
	<style type="text/css">
        * { font-size:12px; font-family:맑은고딕 }
    </style>
</head>


<body>
<textarea id="src" rows="20" cols="80"></textarea>
<br/>
<input type="button" value="Do It!" id="DoIt">
<br/>
<br/>
<span id="result"></span>


직접 실행을 위한 URL은 아래와 같다.

http://host.newtype.pe.kr/tools/ora_table_size.htm 

Apache 특정 IP만 접근 가능하게 허용.

Apache의 임의의 URL에 대해 특정 IP만 접근할 수 있도록 셋팅 하고자 한다.

환경변수를 이용하여, 여러개의 IP 또는 IP 대역을 설정할 수 있다.


/usr/local/apache/conf/httpd.conf 

파일을 아래와 같이 설정 하고 Apache를 재기동 하면 된다.


SetEnvIfNoCase remote_addr 123.456.789 allow_list

SetEnvIfNoCase remote_addr 987.12.456.35 allow_list

SetEnvIfNoCase remote_addr 192.168.0.1 allow_list


<Directory /home/cms>

    AllowOverride All

    Order deny,allow

    Deny from all

    Allow from env=allow_list

</Directory>


오라클 Plan 정보 보는 방법

보통 set autotrace on 명령으로 plan 정보를 보는데, 회사의 DBA가 추천한 방법이 있어서 기록을 남긴다.

 

1. 사용자 계정으로 DB 접속 ( 시스템 계정의 경우 불필요한 쿼리까지 포함됨 )

$ sqlplus system/

 

2. 쿼리 실행

SQL> alter session set sql_trace = true;

SQL> 쿼리실행 ( 복수의 쿼리 가능 )

SQL> alter session set sql_trace = false;

          ( udump 생성을 위해 필수 )

 

3. 결과 확인

$ cd $ORACLE_BASE

$ cd ./admin/DB명/udump

$ ls ltr

     ( 가장 최근 파일 확인 )

$ tkprof 파일명.trc tt.txt sys=no;

     ( Trace 파일을 사람이 해석 가능 하도록 변환 )

$ cat tt.txt



core 파일이 생성되는 한가지 상황

오늘 하루종일 삽질한 내용이 있어서 기록을 남긴다.

[ 상황 ]
패킷 내용이 추가되어서 기존 모듈을 수정하게 되었다.
컴파일을 잘되는데, 실행하면 계속 core 파일이 생성되면서 프로세스가 죽는다.
수정 한 부분을 전체 주석으로 막아도, Call Stack을 체크 해보면 특정 함수를 진입하는 시점에 죽어 버린다.

[ 원인 ]
원인은 패킷 사이즈가 커지면서, Stack 영역에 할당 할 수 있는 최대 메모리 사이즈를 초과한 것이다.

[ 해결 방안 ]
Stack 영역이 아닌, Heap영역에 메모리를 할당 하면 된다.

원인 밝히느라 오전 내내 삽질, 
정적 메모리 구조를 동적 구조로 바꾸느라고, 오후 내내 디버깅 및 삽질..
오늘 하루도 이렇게 날려 먹었다.

[ Code ]
-. Stack 영역에 할당 할 수 있는 최대 크기 확인 ( 단위 KB )

$ ulimit -s
 8192



-. 테스트 프로그램.

// cc -o maxsize maxsize.c
#include <stdio.h>

typedef char PACKET[5600000];

int main()
{
        PACKET pkt;
        //PACKET pkt2;  
        PACKET *pkt3;

        printf ("\n");
        printf ( "%s: %d\n", "PACKET", sizeof(PACKET) );

        memset ( &pkt, 0, sizeof(pkt) );
        //memset ( &pkt2, 0, sizeof(pkt2) );   // rise core dump  

        pkt3 = (PACKET*)malloc(sizeof(PACKET));
        if ( !pkt3 ) printf("not enough momery\n");
        else memset( pkt3, 0, sizeof(PACKET) );

        return 0;
}

실행 해 보면,  아래와 같은 결과를 얻는다.

$ maxsize
PACKET: 5600000



 하지만, 9, 16 라인의 주석을 풀고 실행해보면, 아래와 같이 core 파일이 생성된다.

$ maxsize
세그멘테이션 결함(Segmentation Fault)(코어 덤프)


[ 참고문서 ]
http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/stack_size 


 

Javascript로 폭포수 바이러스 효과 구현..

얼마전 자바스크립트로 괴혼을 구현한 것을 보았다.

신기 하다 싶어서, 폭포수 바이러스 효과를 구현해 보았다.
스크립트를 실행하면, html 본문 내용을 Char 별로 파싱해서 떨어트린다.

발로짜서 인지, 속도가 엄청 느리다.
본문 내용이 많아지면, 브라우져가 버거워 하기까지 한다.
시간나면, 천천히 개선해 봐야겠다.

http://host.newtype.pe.kr/fall/fall.html

 Chrome 에서 테스트 해봤다.