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 에서 테스트 해봤다.
 

TISTORY 에서 SyntaxHighlighter 사용하기.

블로그 특성상 소스 코드를 자주 올리게 되는데, 보기 좋게 올리기 위해 
SyntaxHighlighter 를 사용하기로 했다.

1. SyntaxHighlighter 다운 받기.
    http://alexgorbatchev.com/SyntaxHighlighter/ 에서 다운 받는다.
    포스팅 당시 최신 버전은 3.0.83 이었다.
    다운로드 받아 압축을 풀면 아래와 같이 있는데, 
    필요한 파일은 styles, scripts 디렉토리에 있는 것들이다.


2. 필요한 파일을 UPLOAD.
   TISTORY 관리자 페이지에 로긴해서, [ 스킨 ] / [ HTML/CSS편집 ] / [ 파일 업로드 ] 화면에서
   필요한 파일을 모두 올린다. 
   필요한 파일은 압축푼 파일 중에 styles, scripts 디렉토리 밑에 있는 모든 파일이다.


   올려진 파일을들 보면, images 디렉토리 밑으로 올라간 것을 알 수 있다.

3. TISTORY 스킨 파일 편집.
   [ 스킨 ] / [ HTML/CSS편집 ] / [ HTML/CSS 편집 ] 화면에서 skin.html 파일에 내용을 편집한다.
   


    밑줄에 아래의 내용을 추가한다.
























  
   위 내용 처럼 압축을 풀었을때 경로가 아닌, 파일이 올라간 images로 경로를 바꾸어야 한다.

   두번째 "shThemeEmacs.css" 파일은 보여줄 테마를 지정한 것이다.
   테마 css 파일을 이것저것 지정해보고 마음에 드는 것으로 결정하면 된다.
   (사실 맘에 쏙 드는 것이 없었는데. Emacs 테마가 가장 나은 것 같다.)

   동일한 방법으로 skin.html 파일 가장 하단 </body> 위쪽에 아래와 내용을 넣어 준다.



     여기서 필요한 코드는 맨 밑줄 함수 실행부 이고, 그외 설정 부분이다.
     stripBrs를 true로 설정하면, TISTORY 에서 자동으로 <br> 태그를 붙이는 걸 무시 할 수 있다.

   4. TISTORY에서 글쓰기.
     글을 쓸때에는 소스 코드가 들어갈때는 html 모드에서 글을 써야한다.


   위와 같이 html 체크박스를 체크하면, html 모드에서 글을 입력할 수 있다.
   소스 코드를 넣을때 아래와 같은 문법으로 넣는다.

<pre class="brush: sql">
CREATE TABLE CVS_COMMIT
(
   SEQ              NUMBER(10) NOT NULL,
   USERID           VARCHAR2(20) NOT NULL,
   REG_DATE         DATE DEFAULT SYSDATE,
   PROJECT          VARCHAR2(50) NOT NULL,
   FILENAME         VARCHAR2(500) NOT NULL
);
</pre>
    
  소스의 내용은 <pre></pre> 태그 사이에 넣어주고, class의 brush 속성에 원하는 문법을 지정한다.
  지정 가능한 문법은 아래와 같다. 
ActionScript3 as3, actionscript3 shBrushAS3.js
Bash/shell bash, shell shBrushBash.js
ColdFusion cf, coldfusion shBrushColdFusion.js
C# c-sharp, csharp shBrushCSharp.js
C++ cpp, c shBrushCpp.js
CSS css shBrushCss.js
Delphi delphi, pas, pascal shBrushDelphi.js
Diff diff, patch shBrushDiff.js
Erlang erl, erlang shBrushErlang.js
Groovy groovy shBrushGroovy.js
JavaScript js, jscript, javascript shBrushJScript.js
Java java shBrushJava.js
JavaFX jfx, javafx shBrushJavaFX.js
Perl perl, pl shBrushPerl.js
PHP php shBrushPhp.js
Plain Text plain, text shBrushPlain.js
PowerShell ps, powershell shBrushPowerShell.js
Python py, python shBrushPython.js
Ruby rails, ror, ruby shBrushRuby.js
Scala scala shBrushScala.js
SQL sql shBrushSql.js
Visual Basic vb, vbnet shBrushVb.js
XML xml, xhtml, xslt, html, xhtml shBrushXml.js

첫번째 컬럼이 문법, 두번째 컬럼이 brush에 지정할 속성 상수, 
세번째 컬럼이 필요한 Javascript 파일로써 TISTORY에 UPLOAD되어 있어야 한다.

문법 뿐 아니라 추가 속성을 지정할 수 있는데, 아래와 같이 ";" (세미콜론) 로 구분한다.

<pre class="brush: js; ruler: true; first-line: 10; highlight: [2, 4, 6]">...</pre>

지정 할 수 있는 속성 목록은 아래와 같다.
속성
기본값
설명
auto-links true URL을 클릭하면 페이지 이동이 가능하도록
하이퍼링크를 자동으로 걸어준다.
class-name '' 그외 사용자 지정 class를 추가하고 싶을때 사용한다.
collapse false "펼치기" 기능을 사용하고 싶을 때
(티스토리의 "더보기" 기능이 더 나은것 같다)
first-line 1 시작 Line Number를 지정한다.
gutter true Line Number를 켜고 끌수 있다.
highlight null 강조할 라인을 배열로 넘긴다.
(예 : "brush: plain; highlight: [1, 3]")
html-script false php, asp, jsp 등과 같이 소스 코드안에 html이 포함되는 경우
html도 하이라이팅하고 싶으면 사용한다
smart-tabs true 스마트탭 기능의 활성화 여부를 지정한다
(무슨 기능인지 잘 모르겠다)
tab-size 4 TAB 크기를 지정한다.
toolbar true 툴바를 켜거나 끌 수 있다.

이제 TISTORY에서 깔끔한 코드를 볼 수 있다.

<주의 사항>
-. SyntaxHighlighter 3.0.83 버전에 버그가 하나 있다.
   일부 코드에 대해 Line Number가 어긋나 보이는 경우가 있다.
   한 Line 에 긴 코드가 포함된 경우 wrapped(자동줄바꿈) 처리를 하면서 잘못 처리하는 것 같다.
   소스 코드를 무조건 올리지 말고, 적당히 줄바꿈 처리를 해주고 올리는 것이 좋다. 
-. html모드에서 <pre></pre> 태그를 사용할 경우 소스 코드에 포함된 "<", ">"의 파싱을 잘못하는
   경우가 발생하는 것 같다. 
   소스 코드를 올리기 전에 "<"를 "&lt;"로, ">"를 "&gt;"로 변환 해서 올리는 것이 좋다.