Search

'it'에 해당되는 글 167건

  1. 2011/10/31 core 파일이 생성되는 한가지 상황 (1)
  2. 2011/08/04 Javascript로 폭포수 바이러스 효과 구현..
  3. 2011/05/16 TISTORY 에서 SyntaxHighlighter 사용하기. (4)
  4. 2011/05/04 CVS Commit 로그를 남겨보자 (4)
  5. 2011/04/05 iPhone 4.3.1 완탈후 mobileterminal 설치 방법. (4)
  6. 2011/03/22 내 인생을 하루로 계산 하면..
  7. 2011/03/18 allow_url_fopen off 일때, proxy 구현 방법. (2)
  8. 2011/02/01 JQuery를 이용한 둥근 테두리 테이블 만들기
  9. 2010/09/28 iTunes 없이 iPhone에 음악 전송 (2)
  10. 2010/04/09 한글 변환기 ( Chrome Extensions ) (9)
  11. 2010/02/24 오라클에서 조회한 결과를 Text 파일로 저장하기
  12. 2010/02/01 오라클에서 다른 계정으로 데이터 마이그레이션 방법
  13. 2009/10/09 : no such repository
  14. 2009/08/27 Oracle Bulk Loader
  15. 2009/05/21 Oracle import / export
  16. 2009/04/10 Pro*c를 이용한 오라클 PL/SQL function 호출
  17. 2009/03/13 Pro*C/C++ Precompiler Programmer's Guide
  18. 2009/02/16 한글이 포함된 문자열을 특정 byte로 자르기
  19. 2008/11/13 DisplayHex
  20. 2008/08/26 ssh socks 터널링을 이용한 방화벽 탈출 (2)
  21. 2008/07/30 Vista 에서 볼륨 조절 (2)
  22. 2008/07/11 3G iPhone 에는 한글 키보드가 기본으로??
  23. 2008/07/11 ORA-01002 fetch out of sequence
  24. 2008/07/09 core 파일 분석
  25. 2008/07/08 Oracle 에러코드 (1)
  26. 2008/07/08 Visual Studio 2008 설치 (4)
  27. 2008/06/11 SUN 장비 route 조회/추가/삭제
  28. 2008/05/14 grep로 특수문자 찾기
  29. 2008/04/30 c ini 읽는 모듈.. (2)
  30. 2008/04/23 prototype을 이용한 Ajax 멀티 request

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

it/c 2011/10/31 20:41 Posted by newtype
오늘 하루종일 삽질한 내용이 있어서 기록을 남긴다.

[ 상황 ]
패킷 내용이 추가되어서 기존 모듈을 수정하게 되었다.
컴파일을 잘되는데, 실행하면 계속 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 


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

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

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

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

 Chrome 에서 테스트 해봤다.
 

TISTORY 에서 SyntaxHighlighter 사용하기.

it/www 2011/05/16 15:12 Posted by newtype
블로그 특성상 소스 코드를 자주 올리게 되는데, 보기 좋게 올리기 위해 
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;"로 변환 해서 올리는 것이 좋다. 





CVS Commit 로그를 남겨보자

it/etc 2011/05/04 13:17 Posted by newtype
-. 요구사항 파악 및 설계

적용 패키지 작성을 위해 수정된 파일 목록을 추출 할 방법을 찾아 보기로 했다.
업무 때문에 소스 관리를 CVS 로 하고 있다. CVS의 단점은 개별 파일이력은 확인 할 수 있는데, 
수정된 파일 목록을 뽑기가 쉽지 않다는 것이다.

구글링을 해보니 CVS에서 Commit 시점에 뭔가 처리할 수 있다는 것을 알았다.

먼저, CVS 서버에 접속해서 저장소의 CVSROOT 디렉토리를 보자

-rwxrwxr-- 1 cvs cvs       544  4월 22 09:23 checkoutlist

-rwxrwxr-- 1 cvs cvs       694  3월 21  2009 checkoutlist,v

-rwxrwxr-- 1 cvs cvs       882  4월 26 16:03 commitinfo

-rwxrwxr-- 1 cvs cvs       959  3월 21  2009 commitinfo,v

-rwxrwxr-- 1 cvs cvs       993  3월 21  2009 config

-rwxrwxr-- 1 cvs cvs      1192  3월 21  2009 config,v

-rwxrwxr-- 1 cvs cvs       602  2월  8 16:32 cvswrappers

-rwxrwxr-- 1 cvs cvs       801  3월 21  2009 cvswrappers,v

-rwxrwxr-- 1 cvs cvs      1025  3월 21  2009 editinfo

-rwxrwxr-- 1 cvs cvs      1224  3월 21  2009 editinfo,v

-rwxrwxr-- 1 cvs cvs 292081967  4월 29 18:14 history

-rwxrwxr-- 1 cvs cvs      1245  4월 21 11:32 loginfo

-rwxrwxr-- 1 cvs cvs      1367  3월 21  2009 loginfo,v

-rwxrwxr-- 1 cvs cvs      1151  3월 21  2009 modules

-rwxrwxr-- 1 cvs cvs      1350  3월 21  2009 modules,v

-rwxrwxr-- 1 cvs cvs       564  3월 21  2009 notify

-rwxrwxr-- 1 cvs cvs       763  3월 21  2009 notify,v

-rwxrwxr-- 1 cvs cvs       640  4월 25 12:43 passwd

-rwxrwxr-- 1 cvs cvs       649  3월 21  2009 rcsinfo

-rwxrwxr-- 1 cvs cvs       848  3월 21  2009 rcsinfo,v

-rwxrwxr-- 1 cvs cvs       879  3월 21  2009 taginfo

-rwxrwxr-- 1 cvs cvs      1078  3월 21  2009 taginfo,v

-rwxrwxrw- 1 cvs cvs       187 11월 10 17:15 val-tags

-rwxrwxr-- 1 cvs cvs      1026  3월 21  2009 verifymsg

-rwxrwxr-- 1 cvs cvs      1225  3월 21  2009 verifymsg,v


위와 같은 파일들을 볼 수 있는데.. 
여기서 commitinfo 란 파일이 CVS에서 Commit 하기 바로전에 실행되는 파일이다.

방향은 정해졌다. 
작업 구성은 아래와 같은 순서로 하기로 했다.

     1. CVS가 Commit 되는 시점에 파일명을 DB에 저장한다.
         -> CVSROOT/commitinfo에 등록할 쉘 스크립트를 작성.
     2.  저장된 DB를 조회할 간단한 WEB Page 제작
         -> 평소 관심을 갖고 있던, jQuery를 이용.

[ 1. CVS가 Commit 되는 시점에 파일명을 DB에 저장한다 ]

commitinfo 파일에 아래와 같이 내용을 추가 한다.

$ vi CVSROOT/commitinfo 

ALL /home/cvs/myproject/CVSROOT/cvscommitlog.sh 


DB에 테이블을 생성 한다.

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
);

* index는 REG_DATE, TO_CHAR(reg_date, 'YYYY/MM/DDHH24:MI'), USERID, PROJECT 를 걸었다.

commitinfo 파일이 실행할 쉘스크립트를 작성한다.

#!/bin/sh
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=ORACLE_SID
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_OWNER=oracle
export LANG=c
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib;

DATE=`date "+%Y-%m-%d %H:%M:%S"`
DT=`date "+%Y%m%d"`
LOG_FILE="/home/cvs/cvs_log/commit.$DT.log"
DIR=$1
USER=$USER
PROJECT=`echo $DIR | cut -d/ -f4`
#(echo ""; id;) >> $LOG_FILE
shift
for file in $*
do
    echo "$PROJECT, $USER, $DATE, $DIR/$file" >> $LOG_FILE
        result=`$ORACLE_HOME/bin/sqlplus oracle_user/oracle_pwd@oracledb <<EOF 
        INSERT INTO CVS_COMMIT 
        VALUES ( (SELECT NVL(MAX(SEQ), 0) +1 FROM CVS_COMMIT), 
                       '$USER', TO_DATE('$DATE', 'YYYY-MM-DD hh24:mi:ss'), 
                       '$PROJECT', '$DIR/$file');
        COMMIT;
        EOF
        `
done



[ 2.  저장된 DB를 조회할 간단한 WEB Page 제작 ]
jsp 파일 하나와 html파일 하나로 이루어졌고, jQuery와 JSON을 이용 했다.
DATE Picker는 jQuery Plugin 중에 하나를 이용했다.

html 내용 보기


jsp 내용 보기



iPhone 4.3.1 완탈 후 몇몇 시디아 어플이 정상적으로 설치가 되지 않았다.

iFile, SBSettings, mobileterminal 등이 설치를 하려면, 
다른 툴들과의 종속성 에러가 발생하는 것이다. ( DEPENDS xxxxx )

Cydia / Manage / Sources 에서 불필요해 보이는 소스를 삭제하니 정상적으로 설치가 되었다.
소스 아이콘이 ?(물음표) 로 나오는 것 위주로 삭제하니 되었다.

필요한 어플들을 설치 하기는 했는데, 
mobileterminal 을 실행하면 바로 죽어버린다.

구글링을 해보니, 소스에 [ http://www.ijailbreak.com/repository/ ]를 추가하고,
시디아를 Refresh하면, upgrade를 진행한다.

터미널을 띄우면 정삭으로 동작한다.

[ 참조 ]
http://www.ijailbreak.com/cydia/learn-how-to-install-mobileterminal-for-up-to-the-ios-4-3-1-firmware-mobileterminal-520-1/ 
http://www.ijailbreak.com/cydia/introducing-the-official-ijailbreak-repository/
http://tiny2n.tistory.com/80

내 인생을 하루로 계산 하면..

it/www 2011/03/22 09:29 Posted by newtype
김난도 교수의 "아프니까 청춘이다" 라는 책에 보면 "인생 시계"라는 말이 나온다.
평균 수명 80살을 하루로 계산해서,  1년을 18분 쯤으로 계산 한 것인데..

내 인생 나이는 얼마나 될까?
내 인생은 오전 10시 43분 이란다.

인생 시간을 계산 해보자.

http://host.newtype.pe.kr/1day/ 

  

소스 보기


jQuery를 이용했고,
테스트를 해보니, 약간의 오차가 있는 듯 하다.
 

allow_url_fopen off 일때, proxy 구현 방법.

it/www 2011/03/18 14:33 Posted by newtype
jQuery에 관심이 생기면서, javascript 만으로 RSS 리더기를 만들어 보기로 했다.
jQuery가 워낙에 많은 Plugin들을 지원하고 있어서, rss Parser도 금방 찾을 수 있었다.
jFeed 라는 것인데, 소스도 간단하고.. 복잡한 기능이 필요없는 용도로는 적당했다.

그런데, 예상치도 못한 문제가 있었다.
Ajax에서 다른 도메인의 페이지를 읽기 위해 proxy를 구현 해야 하는데..
셈플 소스에 포함된 것이 정상적으로 동작하지 않는 것이다.

셈플 소스에 포함된 코드는 아래와 같다.
<?php
header('Content-type: application/xml');
$handle = fopen($_REQUEST['url'], "r");

if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        echo $buffer;
    }
    fclose($handle);
}
?>

원인은 호스팅을 받고 있는 cafe24 에서는 보안상의 이유로 php.ini 파일에서 fopen 함수의 사용을 막아 놓은 것이다.



업체에서 제안하는 방법은, fsockopen 이용하는 방법으로 셈플 소스는 아래와 같다.
function get_url_fsockopen( $url ) {
	$URL_parsed = parse_url($url);

	$host = $URL_parsed["host"];
	$port = $URL_parsed["port"];
	if ($port==0)
		$port = 80;

	$path = $URL_parsed["path"];
	if ($URL_parsed["query"] != "")
		$path .= "?".$URL_parsed["query"];

	$out = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";

	$fp = fsockopen($host, $port, $errno, $errstr, 30);

	if (!$fp) {
		echo "$errstr ($errno)<br>\n";
	} else {
		fputs($fp, $out);
		$body = false;
		while (!feof($fp)) {
			$s = fgets($fp, 128);
			if ( $body )
			$in .= $s;
			if ( $s == "\r\n" )
			$body = true;
		}

		fclose($fp);
		echo $in;
	}
}

하지만,  이방법도.. connection, write는 성공하지만, read 부분에서 데이터를 가져오질 못했다.
업체 문의 결과, www 폴더안에 ".htaccess" 파일을 만들고 파일 내용으로, 
php_flag allow_url_fopen 1

를 넣어 주면 된다고 한다. 단, 취약점을 통한 보안적 위험에 대한 책임을 보장할 수 없단다.
왠지 찝찝하다. 

좀 더 뒤져보니, curl 이란 php 라이브러리가 있다. 이넘이 물건이다. 좀 잡다한 기능들이 많아 무거워 보이긴 한데.. 일단 동작은 잘 된다.

curl 라이브러리를 이용한 소스는 아래와 같다.
<?php

function get_url_content($url) {

	$ch = curl_init();

	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
	curl_setopt($ch, CURLOPT_HEADER, true);
   
	$html = curl_exec($ch);  
	$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
  
  	$inc=1;
	while ($http_code == 301 || $http_code == 302)
	{
		$header = curl_getinfo($ch, CURLINFO_HEADER_OUT);
		curl_close($ch);

		list($header, $html) = explode("\n\n", $html, 2);
		preg_match('/Location: (.*?)\n/', $header, $matches);
		$url = $matches[1];
		if (strlen(trim($url)) <= 0 )
			return "[".$http_code."] forwarding error, not found url.<br/>";

		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL,$url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$html = curl_exec($ch);
		$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

		if ( $inc++ > 5 ) {
			curl_close($ch);
			return "to many forwarding...<br/>";
		}
	}

	curl_close($ch);

	return substr($html, strpos($html, '<?xml'));;
}

echo get_url_content( $_REQUEST['url'] );

?>

소스의 기능은 아래와 같다.
   
    1. HTTP CODE가 301, 302의 Forwarding 관련된 것이면 해당 URL로 이동.
        : CURLOPT_HEADER 옵션, while문 안의 해더 파싱 부분.
    2. Forwaring이 5번 이상이면, 에러 처리.
        : while문 안의 if문 
    3. HTTP 해더 부분 제거.
        : return 전의 substr 구문. rss 리더를 위한 proxy 이므로 필요 하다.

마지막 소스를 이용해 proxy 문제를 해결 했다.
웹눈 님의 Round Table 소스를 JQuery를 이용하는 소스로 수정해봤습니다.

JQuery를 요 몇일 보고 있는데, 재미있네요..
이제 막 시작한 단계로 더 깔끔하게 다듬을 수 있을 것도 같은데..
아직은 내공이 부족하네요.

좋은 방법 있으면 공유 해주시면 고맙겠습니다.

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>
function roundTable(objID) {
	var $obj = $("table#" + objID);
	var s, r;
	var y, x, MAX;
	var w, h;

	r = parseInt($obj.attr('radius'));
	if (r == null || r < 1) r = 1;
	else if (r > 6) r = 6;

	MAX = r * 2 + 1;

	$obj.before("<TABLE id='tmpRoundTbl'></TABLE>")
	$("table#tmpRoundTbl")
		.attr("cellSpacing", 0)
		.attr("cellPadding", 0)
		.append("<TBODY></TBODY>");

	for (y=0; y < MAX; y++) {
		$("table#tmpRoundTbl TBODY").append("<TR></TR");
		s = Math.abs(y - parseInt(r));
		for (x=0; x < MAX; x++) {
			
			$("table#tmpRoundTbl TBODY TR:eq("+y+")")
				.append("<TD></TD>");

			w = '1px'; h = '1px';
			if (x == 0 || x == MAX - 1) h = null;
			else if (y == 0 || y == MAX - 1) w = null;
			else if (r > 2) {
				if (Math.abs(x - r) == 1) w = '2px';
				if (Math.abs(y - r) == 1) h = '2px';
			}

			if (w != null) 
				$("table#tmpRoundTbl TBODY TR:eq("+y+") TD:eq("+x+")")
					.css("width", w);
			if (h != null) 
				$("table#tmpRoundTbl TBODY TR:eq("+y+") TD:eq("+x+")")
					.css("height", h);

			if (s == x || s == MAX - x - 1) 
				$("table#tmpRoundTbl TBODY TR:eq("+y+") TD:eq("+x+")")
					.css("backgroundColor", $obj.attr('rborder') );
			else if (x > s && s < MAX - x - 1) 
				$("table#tmpRoundTbl TBODY TR:eq("+y+") TD:eq("+x+")")
					.css("backgroundColor", $obj.attr('rbgcolor') );
		}
	}

	$("table#tmpRoundTbl TBODY TR:eq("+s+") TD:eq("+r+")").append( $obj );
}
</script>


<table id="ta" width="300" height="100" border="0" 
    radius="3" rborder="#999999" rbgcolor="#F8F8F8">
<tbody><tr>
<td valign="top">테스트입니다</td>
</tr>
</tbody></table>
<span>
<script>roundTable("ta");</script>
</span>



[ 참고 ] 

iTunes 없이 iPhone에 음악 전송

it/etc 2010/09/28 17:36 Posted by newtype

나같은 경우 MacBook, 업무용 Notebook, 집 Desktop 이렇게 3개의 컴퓨터를 사용하고 있다.

MacBook에는 주소록과 사진, 집 Desktop에는 동영상, 업무용 Notebook에는 음악들을 
iPhone과 동기화 하고 싶은데, 이런xx!! iPhone은 하나의 iTunes에만 동기화가 가능하다.
( 시도 했다가, iPhone의 음악과 Apps를 몽창 말아 먹었다 ㅡㅡ; )

아직은 iTunes에 적응을 못해서 인지, 불편하기만 하다.

웹 서핑중 iTunes 없이 iPhone에 음악을 전송할 수 있는 어플이 있어서 소개 한다.


CopyTransManager라는 프로그램으로 무료다!

설치시 기본언어로 설치하면, 한글도 지원된다.

일단 업무용 Notebook을 이용하여, 앨범 생성도 해보고, 음악도 전송하여 봤는데.. 잘 된다. ^^
( iPhone 버전 4.1(8B117), iTunes 버전 10.0.1.22, CopyTransManager(Free) 버전 v0.924 )

웹을 통해 사용기를 훑어 보니, 이 어플을 사용했다가 iPhone을 초기화 했다는 글들이 보이는 걸로 봐서는 아직은 불안한 어플인것 같기도 하다. 



한글 변환기 ( Chrome Extensions )

it/www 2010/04/09 16:34 Posted by newtype
크롬 확장 프로그램을 만들었습니다.
예전에 만들어준 한글 변환기 스크립트를 이용하여 만들었습니다.

한글 입력기가 설치되지 않은 환경에서 한글 입력이 가능 합니다.
1시간 미만으로 뚝딱 만든 건데, 대부분 시간이 아이콘 만드는 시간이었네요. ^^;

* History 
2010-04-23  한글 키보드 레이아웃 이미지 추가 ( 옵션에서 출력 여부 결정 )



SELECT 결과를 CSV 포멧으로 저장 하려면 아래와 같이 처리 한다.


sqlplus에 로긴 하여 위와 같이 입력하면, output.lst 파일에 원하는 내용이 저장된다.

다른 방법으로 파이프를 이용하는 방법이 있다.


쉘에서 이렇게 입력을 하면, 원하는 결과를 얻을 수 있다.

[출처]

오라클에서 다른 계정의 테이블을 Import 해오고자 한다.
테이블 이름만 동일하고 계정 및 테이블 스페이스가 다른 경우의 Import 과정이다.

oraid 계정에서 devdb 계정으로 Import 하는 과정을 설명한다.

1. Table Space 생성
SQL> CREATE TABLESPACE TS_DEV_DATA
DATAFILE '/home/dba/oradata/ts_dev_data.dbf' SIZE 2048M
AUTOEXTEND OFF;

SQL> CREATE TABLESPACE TS_DEV_IDX
DATAFILE '/home/dba/oradata/ts_dev_idx.dbf' SIZE 1024M
AUTOEXTEND OFF;

Data를 위한 TS_DEV_DATA아 Index를 위한 TS_DEV_IDX 를 생성 했다.
개발 목적의 테이블 스페이스 이므로 용량 자동 증가는 꺼두었다.

2. devdb 계정 생성 
SQL> CREATE USER devdb IDENTIFIED BY devdb
DEFAULT TABLESPACE TS_DEV_DATA
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON TS_DEV_DATA;

SQL> GRANT CONNECT,RESOURCE TO FRDEV;

계정을 생성하고, 필요한 권한을 부여 했다.

3. Export
$ exp oraid/orapwd file=tbl_exp_20100201.dmp tables="tbl_test1, tbl_test2, tbl_test3" ignore=y

Source DB에 접속 하여 필요한 테이블을 Export 한다.

4. Table 생성
SQL> CREATE TABLE TBL_TEST1 
(
SEQ              NUMBER(10) NOT NULL,
CODE             VARCHAR2(10) NOT NULL,
DATA             VARCHAR2(20) NOT NULL
CONSTRAINT PK_TEST1
    PRIMARY KEY (SEQ) USING INDEX 
    TABLESPACE TS_DEV_IDX
)
TABLESPACE TS_DEV_DATA;

SQL> CREATE TABLE TBL_TEST2
 - 생략 - 
SQL> CREATE TABLE TBL_TEST3
 - 생략 - 

Export를 하게 되면 테이블 생성 정보까지 포함된다. 
그대로 Import 하게 되면, 새로 생성한 테이블 스페이스에 저장되는 것이 아니고, 
기존 테이블 스페이스에 저장 되므로 원하는 공간에 미리 테이블을 생성 해 둔다.

5. Import
$ imp oraid/orapwd fromuser=oraid touser=devdb file=tbl_user.dmp tables=tbl_user ignore=y

Import 받고자 하는 devdb 계정을 touser 파라미터로 지정한다.
테이블 생성시 발생하는 오류를 건너 뛰기 위해 ignore 파라미터를 추가한다.




: no such repository

it/etc 2009/10/09 17:59 Posted by newtype
cygwin은 이제 필수 설치 툴이 되어 버렸다.

업무를 하면서 자연 스럽게 cvs, cygwin, Eclipse 조합을 사용하게 되었는데,
Eclipse에서 cvs로 프로젝트를 내려 받은 것은 cygwin에서 cvs가 정상적으로 동작하지 않았다.

로긴 시도를 하면 아래와 같이 에러가 발생하는 것이다.
newtype@newtype-PC ~/test
$ cvs login
Logging in to :pserver:newtype@127.0.0.1:2401/project/test
CVS password:
: no such repository

에러 발생 이유에 대해 구글링을 해보니
CVS를 내려 받을때 생기는 세가지 파일 Entries, Root, Repository 들이
Unix 형식이 아닌, Windows 형식으로 생성되기 때문이란다.

cygwin에서 아래와 명령을 내리면 간단히 해결된다.
newtype@newtype-PC ~
$ find . \( -name Entries -o -name Root -o -name Repository \) -exec dos2unix {} \;

명령을 내리면 현재 디렉토리 및 모든 서브 디렉토리를 검색하여 CVS 관련 3가지 파일을 Unix 형식으로 바꾸어 준다. (정확히 말하자면 Windows 형식의 개행문자 "\r\n"을 Unix형식의 개행문자 "\n"으로 치환 해준다)

이제, cygwin cvs에서도 정상적으로 로긴이 되고,
Eclipse 에서도 아무런 부작용없이 정상적으로 cvs 관련 명령을 사용할 수 있다.

Oracle Bulk Loader

it/db 2009/08/27 02:47 Posted by newtype
Oracle DB의 특정 테이블에 대용량의 데이터를 Insert 하고 싶을때,
Oracle Bulk Loader를 사용한다.

Loader를 사용하기 위해서는 컨트롤 파일과, 데이터 파일이 필요하다.

컨트롤 파일은 데이터 파일 정보와 테이블 정보를 가지고 있고,
데이터 파일은 DB에 넣고자 하는 데이터 목록을 가지고 있다.

1. 테이블 생성
CREATE TABLE TEST_TBL (
    NAME CHAR(20),
    SCORE NUM(5),
    UPDATE DATE );

2. 컨트롤 파일 생성
$ cat test.ctl
LOAD DATA
INFILE test.dat
INTO TABLE TEST_TBL
FIELDS TERMINATED BY ','
(NAME, SCORE, UPDATE SYSDATE)
3. 데이터 파일 생성
$ head test.dat
USER1,70
USER2,80
USER3,90
USER4,100

4. 로더 실행
$ sqlldr tiger control=test.ctl log=test.log
 * Oracle 계정명은 tiger

보다 상세한 사용법은 아래 링크를 참고 하세요
http://infolab.stanford.edu/~ullman/fcdb/oracle/or-load.html
http://www.orafaq.com/wiki/SQL*Loader_FAQ



Oracle import / export

it/db 2009/05/21 17:20 Posted by newtype

Export

 * 사용자 지정
$ exp oracle_id/oracle_pwd file='dump_filename.dmp' owner=oracle_id compress=y log=log_filename.log

 * 테이블 지정
$ exp oracle_id/oracle_pwd file='dump_filename.dmp' tables=table_name

 * 테이블 조건 지정
$ exp oracle_id/oracle_pwd file='dump_filename.dmp' tables=table_name query=\"where seq=\'007\'\"


Import

 * 사용자 지정
$ imp oracle_id/oracle_pwd file='dump_filename.dmp' fromuser=oracle_id touser=oracle_id log=log_filename.log

 * 테이블 지정
imp oracle_id/oracle_pwd file='dump_filename.dmp' tables=table_name ignore=y

 * 테이블 조건 지정
  테이블 조건 별로 Insert를 할 수가 없다.
  ignore=y 옵션을 주면 에러가 발생해도 계속 진행한다.
   -> DB오류가 발생하면 해당 레코드는 Insert 하지 않는다. (PK가 중복등..)

Pro*c를 이용한 오라클 PL/SQL function 호출

it/db 2009/04/10 10:28 Posted by newtype
Proc*c를 이용해 Sub Program(Procedure or Function)을 호출 하는 방법에 대해 설명한다.

자료를 되져보면 대부분의 샘플 코드가 Procedure 로만 되어 있다.
여기서는 Function을 호출 해 보기로 한다.
사실 호출 방법은 거의 비슷 하다.

- 컴파일 방법
PL/SQL 구문을 사용하기 때문에 proc 컴파일 옵션을 주어야 한다.
그런데, 컴파일 옵션을 주면 다른 Pro*c 구문에서 컴파일이 안되는 일이 발생을 한다.
따라서, PL/SQL 구문을 사용하는 소스는 별도 .pc 파일로 때어 내어서 별도 컴파일을 해야한다.

$ proc include=../inc iname=sub.pc SQLCHECK=SEMANTICS userid=oracleid/oraclepwd

여기서 기존 컴파일 방법과 다른 부분은 "SQLCHECK=SEMANTICS" 옵션이 추가된 것과,
userid 옵션이 추가된 것이다.
userid 옵션에는 오라클 로긴을 위한 ID와 Password를 넣어 준다.


- 샘플 소스
/** @file       sub.pc
 * @brief       Remote Function Call  
 * @author    newtype
 * @date    2009-04-10
 */

#ifndef _SUB_PC_
#define _SUB_PC_

#include "common.h"

EXEC SQL INCLUDE SQLCA;

/** @brief 오라클 Function을 호출 한다.
 * @param in [IN] 오라클 Fucntion Parameter
 * @param out [OUT] 오라클 Fucntion Return 값을 반환
 * @return 0     정상처리
 * @return 그외  오라클 에러 코드
 * @remarks 참고 사항
 * @warning 주의 사항
*/
int CallOracleFunction(char* in, char* out)
{    
    EXEC SQL BEGIN DECLARE SECTION;
        char szOut[MAX_BUF] = "";
    EXEC SQL END DECLARE SECTION;

    EXEC SQL EXECUTE
    BEGIN
        :szOut := ORA_SAMPLE_FUNC( in );
        IF szOut = 'newtype' THEN
            strcpy( out, szOut) ;
            COMMIT;
        ELSE
            strcpy( out, 'newtype.pe.kr');
            ROLLBACK;
        END IF;
    END;
    END-EXEC;

    return nErrCode;
}

#endif

Pro*C/C++ Precompiler Programmer's Guide

it/c 2009/03/13 15:03 Posted by newtype

[ 원문 링크 ]

http://download.oracle.com/docs/cd/A58617_01/server.804/a58233/toc.htm

[ 다운로드 링크 ]


TAG oracle, Pro*C

한글이 포함된 문자열의 경우에 한글 중간에 끊기지 않도록 left 함수를 구현 했다.
유니코드 한글을 구분하기 위해서는 메크로 함수를 수정해 주어야 한다.

#include <stdio.h>
    
#define IsHangle(c)  ((unsigned char)(c) > 0x7f)

char* left(char* sz, int len)
{
    int i = 0;
    
    if ( strlen(sz) <= len ) return sz;
    
    for (i=0; i<len; i++)
    {
        if ( IsHangle(sz[i]) )    
        {
            if ( len-1 < i+1 ) break;
            else  i++;
        }
    }
    
    sz[i] = 0;
    
    return sz;
};

int main()
{
    char *szOrg="11가핳a안녕하세요abcdef우하하1";
    char buf[256]="";
    int i;

    printf("Org: %s(%d)\n", szOrg, strlen(szOrg) );
    for(i=0; i<=strlen(szOrg); i++)
    {
        strcpy( buf, szOrg );
        printf( "%02d, %s\n", i, left(buf, i) );
    }
    return 0;
}

DisplayHex

it/c 2008/11/13 08:59 Posted by newtype

패킷 또는 버퍼를 파라미터로 받아 16진수 형태로 출력을 예쁘게 해준다.

* 사용예
DisplayHex( "Send Packet", szBuf, sizeof(szBuf) );

* 결과
[ Send Packet ] =========
-----------------------------------------------------------------------
ADDR  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF
-----------------------------------------------------------------------
0000  54 65 73 74 20 50 61 63 6B 65 74 20 53 61 6D 70  Test Packet Samp 
0010  6C 65 20 44 61 74 61 2E 2E 2E 2E 2E 20 5E 5E 00  le Data..... ^^. 
0020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
0030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
0040  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
0050  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
0060  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
0070  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 
-----------------------------------------------------------------------

* 소스
void DisplayHex( char *title, char *pPacket, int size )
{
    long    i                   = 0;
    long    j                   = 0;
    long    lTotal              = 0;
    char    szBinBuff[64]       = {0,};
    char    szASCIIBuff[18]     = {0,};
    u_char  byBuff              = 0;
    char    cpWrk[256]          = {0};
	char    szBuf[2048]			= {0,};

    printf("[ %s ] =========\n", title );
    printf("-----------------------------------------------------------------------\n");
    printf("ADDR  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF\n");
    printf("-----------------------------------------------------------------------\n");

    for (i = 0; i * 0x10 < size; i++) 
	{
        memset(szBinBuff  , 0, sizeof(szBinBuff  ));
        memset(szASCIIBuff, 0, sizeof(szASCIIBuff));
        for (j = 0; j < 0x10; j++) 
		{
            byBuff = (u_char)*(((u_char*)pPacket) + i * 0x10 + j);
            sprintf(szBinBuff   + j * 3, "%02X ", byBuff);
            sprintf(szASCIIBuff + j    , "%c"   , 
                ((byBuff >= 32) && (byBuff <= 126)) ? byBuff : '.');
            lTotal ++;
            if (lTotal >= size) 
			{
                break;
            }
        }

		sprintf( szBuf, "%04X  %-47.47s  %-17.16s\n", i * 0x10, szBinBuff, szASCIIBuff);
        printf( szBuf );
    }

    printf("-----------------------------------------------------------------------\n");
}


ssh socks 터널링을 이용한 방화벽 탈출

it/etc 2008/08/26 03:22 Posted by newtype
이곳 저곳 파견을 다니다 보니 네트웍 환경에 따라 메신져를 사용할 수 없다던가,
WEB 서핑을 할 수 없다던가 하는 불편한 점이 있다.

ssh socks 터널링을 이용해 방화벽에 구애 받지 않고, 메신져나 웹서핑을 자유롭게 할 수 있다.

단, 이 방법은 아래와 같은 제약이 있다.


[ 제약 ]
1)  ssh 접속이 가능해야 한다.

2) 접속 가능한 ssh 계정이 있어야 한다.

ssh socks 터널링을 이용한 방법으므로 당연한 얘기다 ^^


[ 적용 방법 ]

1. http://nemesis2.qx.net/software-myentunnel.php 에서 프로그램을 다운 받아 설치한다.
   이 프로그램은 ssh socks 터널링을 간단하게 도와주는 프로그램이다.


2. MyEntunnel 설정

사용자 삽입 이미지

  여기서 [Enable Dynamic SOCKS Port] 설정을 꼭 해주어야 한다.
  설정을 마치고, 접속 한 후 [ Hide ] 버튼을 누르면 TrayBox로 보낼 수 있다.


3. WEB 설정
   Internet Explorer의 경우 [도구] / [인터넷 옵션] / [연결] / [LAN 설정] 화면을 열어 [프록시 서버] 항목을 체크하고, 활성화된 [고급] 버튼을 누르면 프록시 설정을 할 수 있다. 여기서 Socks 항목의 서버 주소를 "localhost"로, 포트를 MyEntunnel에서 지정한 "7070" 포트로 설정 한다.


4. NATEON 설정
   [설정] / [연결(방화벽)] 메뉴에서 [프록시 서버 사용]을 체크하고 아래와 같이 설정한다.
    종류: SOCKS 버전 4
    서버: localhost
    포트: 7070



이렇게만 해주면 해당 네트웍의 방화벽 설정에 상관없이 웹서핑과 메신져 활동을 누릴 수 있다.

이 방법은 장점은 또 있다.
ssh 프로토콜을 이용해 암호화 되어 패킷이 전송되기 때문에 패킷 감시를 할 수 없다는 점이다.

패킷 캡쳐 프로그램을 이용해 네이트온 로긴을 했을때 패킷을 잡아 봤다.

먼저, 평소 로긴을 하게 되면 아래 그림과 같은 패킷이 잡힌다.

사용자 삽입 이미지

그림과 같이 전송 되는 패킷 내용을 눈으로 확인할 수 있다.
(색칠된 부분은 필자의 친구 목록이다)

이제 ssh socks 터널링을 설정한 후의 패킷을 잡아보자
사용자 삽입 이미지

보는 것처럼 패킷이 암호화 되어 눈으로는 확인이 불가능 해진다.
물론 ssh 프로토콜을 사용하기 때문에 눈으로만 확인 불가능 한것이 아니다. ^^

ssh 서버를 거치게 되므로 속도가 느릴 수 있고, 서버 부하에 일조하게 되지만
방화벽 탈출이라는 혜택(?)을 누리게 된다.
하지만, 기업에서 보안 정책상 정해 놓은 룰을 어기는 것은 당연히 좋은 않다.
너무 남용하지는 말고 꼭 필요할 때만 사용 할 것이다.

Vista 에서 볼륨 조절

it/etc 2008/07/30 20:46 Posted by newtype
사용자 삽입 이미지

Vista 에서 볼륨 믹서를 열면 Application 별로 볼륨을 조절 할 수 있다는 사실을 알았다.
멋진 기능이다

아, vista에서는 볼륨 크기를 [Windows] + [+] 키로 키우거나, [Windows] + [+] 키로 줄일 수 있다.

오늘따라 Vista가 멋저 보인다 ^^

3G iPhone 에는 한글 키보드가 기본으로??

it/etc 2008/07/11 18:06 Posted by newtype
3G iPhone 개봉 UCC가 올라왔길래 보는데..
한글 키보드가 들어가 있네요 @.@
한국 출시 기대해도 될까봐요.

아래 인증 샷 입니다.
사용자 삽입 이미지

아.. 뽐뿌가.. ㅡㅡ;

ORA-01002 fetch out of sequence

it/db 2008/07/11 17:24 Posted by newtype

ORA-01002 fetch out of sequence 는 여러 경우에 발생을 한다.

그중 한가지에 대한 오류 발생 사례 이다.

DB Link로 Remote 테이블을 참조 하고 있는 프로세스가 작업을 수행하고 있는 상태에서,
Remote DB가 Shotdown 되는 경우 위 에러가 발생 한다.
Remote DB가 Start되고 새로운 세션을 맺어야 프로세스가 정상 동작을 한다.
세션을 유지한 상태에서 Remote DB가 Start 되어도 위 에러가 계속 발생한다.

말이 어렵다 테스트 해보자.

1. ORA TNS에 RemoteDB를 추가한다.

2. DB 링크를 생성한다.
CREATE PUBLIC DATABASE LINK test_link CONNECT TO remoteDBid IDENTIFIED BY remoteDBpwd USING 'remoteDB';
CREATE SYNONYM test_proc FOR test_proc_table@test_link
SELECT * FROM test_proc

3. 데이터를 삽입한다.
insert into test_proc values ( 1, 1 );
insert into test_proc values ( 2, 1 );
~~~~~~
insert into test_proc values ( 33, 1 );
insert into test_proc values ( 44, 1 );

4. 테스트 프로그램을 작성한다.
$ vi t.pc
#include <stdio.h>

EXEC SQL INCLUDE SQLCA;

#define MAX_ARRAY_SIZE 10

int main()
{
    int n;

    EXEC SQL BEGIN DECLARE SECTION;
        int  hSEQ; 
        char hOracleUser[20] = "localDBid";
        char hOraclePwd[20]  = "localDBpwd";
    EXEC SQL END DECLARE SECTION;  
    
    EXEC SQL CONNECT :hOracleUser IDENTIFIED BY :hOraclePwd;
    if(sqlca.sqlcode !=0)
    {
        printf( "login fail\n");  
        return 0;
    }
    
    for (n=0; n<10; n++)
    {
        printf( "start of job\n");  
 
        EXEC SQL DECLARE CUR_TEST_PROC CURSOR FOR  
            SELECT SEQ FROM TEST_PROC;
     
        EXEC SQL OPEN CUR_TEST_PROC;         

        while(1)
        {
            EXEC SQL FETCH CUR_TEST_PROC INTO :hSEQ;
                
            sleep(3);            
                
            if(sqlca.sqlcode != 0) 
            {
                if(sqlca.sqlcode == 1403) 
                {
                    printf( "data not found\n");
                    break;
                }
                else 
                {
                    printf( "fetch Error [%20s]\n" , sqlca.sqlerrm.sqlerrmc);
                    break;
                }
            }

            printf("fetch [%d]\n", hSEQ );
        } 
        EXEC SQL CLOSE CUR_TEST_PROC;      
        printf( "end of job\n");  
        
    } /* for */

    return 0;
}




$ proc iname=t.pc
$ cc -o t t.c -L/home/oracle/app/oracle/product/8.1.7/lib -lclntsh -R/home/oracle/app/oracle/product/8.1.7/lib

5. 프로세스 구동
start of job

6. Remote DB Shutdown

7. 에러 확인
fetch Error [ORA-01002: fetch out of sequence]


이거 원인을 파악하려고, 오늘 하루를 다 보냈다. ㅡ.ㅡ


참고 
DB 링크 조회 쿼리
SELECT * FROM USER_DB_LINKS 

시노님 조회 쿼리
SELECT * FROM TAB WHERE TABTYPE='SYNONYM'

core 파일 분석

it/etc 2008/07/09 11:17 Posted by newtype

- 생성 정보 확인
$ file core


- callstack 정보 확인
$ pstack core


- 전체 메모리 맵 확인
$ pmap core


- 시그널 정보 확인
$ pflags core


- core 발생 Lib 확인
$ mdb core
>
$C
> $q


- 링크한 동적 Lib 확인
$ pldd core


- process id: effective, real, saved (u/g) 확인
$ pcred core


sun 장비에서 확인 한 내용입니다.
TAG core, Solaris, SUN

Oracle 에러코드

it/c 2008/07/08 16:49 Posted by newtype

Visual Sutdio 2008 설치 기념 첫 산출물이다.

Oracle 에러코드를 입력 하면 해당 문구를 출력 해주는
완전 초 간단 프로그램

사용자 삽입 이미지

Visual Studio 2005 보다 체감 속도가 빨라진 듯 하다.

전체 소스는 여기
소스는 사실 볼것 없고,
실행 파일만 사용하시길 ㅎㅎ



Visual Studio 2008 설치

it/etc 2008/07/08 00:00 Posted by newtype
Visual Studio 로 개발 할 일이 없다보니,
이제야 2008 버전을 설치해봤다.

설치하면서 엄청난 삽질을 했다. ㅎㅎ

먼저, Visual Studio 2008 RTM 설치를 시도했다.
일단, iso를 zip+ v6.99 로 풀었다.

zip+ 는 데몬이나 알콜을 설치하지 않아도 간단하게 가상 CD를 잡을 수 있어서 애용 중이다.
그런데, 이상하게도 Visual Studio 2008 RTM 버전은 가상 CD로 잡히지를 않는다.

iso를 직접 풀어서 설치를 하니,
"baseline 데이터를 찾을 수 없습니다"라는 오류가 발생하면서 설치가 되지 않는다.
여러 가지 방법으로 시도를 해보았지만, 결국 포기..

하지만, 마음속에 불길은 벌써 걷잡을 수 없이 번져 버렸다.
불길을 잡기 위해서는, Visual Studio 2008 설치 뿐!

Visual Studio 2008 평가판을 다운 받았다.
젠장, 용량이 크다고 파일이 7개로 나눠 져있다.
rar로 묶어서 exe로 만들어 놓은 배포본 이다.
전부 받아 압축을 풀어보니 또 iso 파일..
왠지 불안하다..

역시, 가상 CD로는 잡히지 않고...
iso를 풀어 설치를 시도 했지만.. 역시 설치 실패..
이번엔 무슨 파일이 존재하지 않는단다.
엇, 그런데!!
iso 파일 용량은 4기가 넘는데, 풀어 놓은 전체 용량이 더 작은 것이 아닌가!!
혹시 zip+에서 iso 파일을 제대로 지원하지 않는 것일까??
이제까진 이런 경우가 없었는데... 워낙 용량이 크다보니 그럴수도 있겠다는 생각이 들었다.

하드를 뒤져보니, WinRAR 3.4 버전이 있다.
이걸로 풀어서 설치를 해보니, 역시 설치가 제대로 되질 않는다.
이번엔 무슨 파일이 손상되었단다..

웹을 뒤져보니, 영문 버전은 WinRAR 3.8까지, 한글 버전은 WinRAR 3.6까지 있는 듯 하다.
3.6 버전 평가판을 다운로드 받아 설치하고, iso 파일을 풀어서 설치하니..

설치가 잘된다!!

이렇게 Visual Studio 2008 RTM 버전을 무사히 설치했다 ㅡㅡ;


세줄 요약
1. Zip+ v6.99를 이용 Visual Studio 2008 설치 실패.
2. WinRAR 3.4를 이용한 Visual Studio 2008 설치 실패.
3. WinRAR 3.6를 이용한 Visual Studio 2008 설치 성공.

교훈.
압축 프로그램은 인지도 있고 믿을만한 것으로 최신버전을 사용해야 한다.

SUN 장비 route 조회/추가/삭제

it/etc 2008/06/11 16:28 Posted by newtype
Sun 솔라리스 에서 Route 테이블 조회 / 추가 / 삭제 방법

- route 조회
netstat -r


- default Gateway 지정
route add default 192.168.10.1


- 특정 IP(61.211.7.4)에 대한 Gateway 지정
route add 61.211.7.4 192.168.10.1


- class 전체에 대한 Gateway 지정
route add net 61.211.7.0 192.168.10.1


- route 삭제
route delete 61.211.7.4 192.168.10.1
route delete net 61.211.7.0 192.168.10.1





grep로 특수문자 찾기

it/etc 2008/05/14 15:02 Posted by newtype
grep으로 특수문자를 찾고자 한다.

1. 특수문자를 변수로 설정한다.
찾고하 하는 특수문자를 변수로 저장한다.
$ export ht=$'\t'


2. 찾는다
TAB문자 다음에 "AFTER" 문장을 찾기 위해서 아래와 같이 입력한다.
$ grep "${ht}AFTER" my.log


덧글.
bash에서는 되는데,
ksh에서는 안되는 군요.

c ini 읽는 모듈..

it/c 2008/04/30 19:27 Posted by newtype
급하게 필요해서  c 언어로 된 ini 읽는 모듈을 작성했다.

포함 된 내용은 아래와 같다.
  - trim 함수 사용 (http://newtype.pe.kr/361)
  - windows api의 ini 읽는 함수 원형을 흉내 냈다.(MSDN)

사용 설명
    설정파일을 읽어 들이기 위한 Lib

    Pulibc 함수
    int GetProfileString(FILE *fp, char *app, char *key, char *ret, int size);
    int GetProfileInt(FILE *fp, char *app, char *key, int *ret);

    사용법
    FILE *fp=0;
    if ((fp=fopen("/home/config/sample.ini", "r")) == 0 )
    {
        stdout( "File open error! [/home/config/sample.ini]\n" );
        return 0;
    }

    // 서버 정보를 읽는다.
    GetProfileString(fp, "SERVER", "TYPE", serverType, sizeof(serverType));



ini.h 보기



ini.c 보기




prototype을 이용한 Ajax 멀티 request

it/www 2008/04/23 05:53 Posted by newtype
prototype을 이용해 비동기 방식의 요청을 여러건 해서 순서 상관없이 응답을 받아 처리하는 부분을 구현해 봤다. 

원래 목적은 fund 정보를 웹에서 관리하기 위해 만들려 한것인데...
미완성 프로젝트다..
엑셀에선 간단하던 수식들을 웹으로 옮기려니 만만치 않더라 ㅡㅡ;

소스에는 포함된 내용들은 아래와 같다.
   - Prototype Javascript Lib 사용
   - Javascript Calendar Javascript Lib 사용(한국어 처리 부분 소스 약간 수정)
   - 멀티 Ajax 요청 처리
   - 요청 처리중일때 모래 시계 보여주기
   - Msg 출력을 동적으로
   - select Object에 요청 받은 내용 동적으로 append


common.js 보기



list.html 보기

url
http://www.panghosting.net/~newtype/fund/list.html