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

S/W 구입..

막글 2011/03/29 22:49 Posted by newtype
처음으로 PC용 S/W 를 구입했다.
부끄러운 얘기지만, S/W 개발자 이면서도 처음이다.

 
주인공은 EmEditor라는 놈으로, Windows용 Text이다.
태생이 일본산이라, 멀티바이트 문자를 완벽하게 지원한다.


http://www.emeditor.com



지난 10여년간 써온 에디터 중에 가장 만족도가 높았고, 4-5년 정도 써온것 같다.

내가 느낀 장점을 나열하자면..
   
     -. 이제까지 써본 Text Editor 중에 가장 완벽한 멀티바이트 문자 지원
        ( 국산 Editor + 보다도 완벽하다 )
     -. 대용량 파일 지원 (빠른 속도)
     -. 강력한 메크로 지원
     -. Column 블록 선택 기능 지원
     -. 정규식 지원
     -. 다양한 플러그 인


등이다. 4만원이 넘는 금액이었지만, 전혀 아깝지 않다. ^^



짜잔~!
 

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

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>



[ 참고 ] 

새해 복 많이 받으세요.

막글 2011/01/03 14:25 Posted by newtype

2011년 새해가 밝았습니다.

올 한 해도 좋은일만 생기고, 
늘 웃을 수 있는 한해가 되었으면 좋겠습니다.

돈 많이 버시고, 새해 복 많이 받으세요. 


[ 이미지 출처 ]

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을 초기화 했다는 글들이 보이는 걸로 봐서는 아직은 불안한 어플인것 같기도 하다. 



아이폰4 구매

막글 2010/09/21 15:03 Posted by newtype
아이폰4를 사용한지 일주일...
처음엔 기대가 컷던것인지 쨍한 느낌이 없었는데
사용할수록 맘에 든다 (사실 일주일이란 시간이 길진 않지만 ^^;)
나름 이제까지 많은 PDA, 스마트폰을 접해 봤다고 생각하는데 이번 만큼 만족도가 높았던 적이 없었던것 같다

안드로이드 기반의 폰도 사용 해보고 싶다. 나야 이제 아이폰을 구매 했지만, 아이폰에서 안드로이드로 넘어가고 있는 상황이니 말이다



iPhone 에서 작성된 글입니다.

달..

막글 2010/08/10 23:08 Posted by newtype


  이윽고 구름이 끊기고, 달이 하늘에 모습을 드러낸다.
  달은 하나뿐이다. 항상 익숙하게 보던 그 노랗고 고고한 달이다. 억새 들판 위에 말없이 떠오르고, 온화한 호수면에 희고 둥근 접시가 되어 떠돌고, 조용히 잠든 집의 지붕을 조용히 비추는 그 달이다. 만조의 물결이 한결같이 바닷가 모래사장으로 밀어 보내고, 짐승들의 털은 부드럽게 빛나게 하고, 밤의 여행자를 감싸안아 보호해주는 그 달이다. 때로는 예리한 그믐달이 되어 영혼의 살갗을 깍아내고, 초승달이 되어 어두운 고절(孤絶)의 물방울을 지표면에 소리도 없이 떨구는, 늘 보던 그 달이다.
- 1Q84 3권, 제 31장 덴고와 아오마메
TAG 1Q84,

MacBook 을 지르다.

막글 2010/06/28 21:59 Posted by newtype

가슴에 구멍을 매꾸고자 MacBook Pro를 질렀다. 
요 몇년 현실에 너무 안주하는것 같아서, 아이폰 어플 공부를 해보려고 한다.

윈도우랑 얼마나 틀리겠어, 개발용으로만 써야지.... 라는 생각 이었는데, 
써보니 편하다(!).  왜 진작 안질럿을까 생각이 들 정도로 개인용으로는 아주 안성 맞춤이다. 
전체적인 GUI 편의성, 단순함, 멀티 터치 패드의 매력(마우스는 연결도 안한다 ㅎㅎ)등등..  
애플빠가 생길만 하다.

요즘은 집에 들어와도 데스크탑은 아예 켜지를 않는다.

맥북 사용후 달라진 생활 패턴이라면, 
게임을 하는 횟수가 많이 줄었다. 아주 바람직하다. 

가슴에 구멍은 매꿔지는듯 한데..
내 지갑의 구멍은 어쩌나..ㅜ.ㅠ

불면증..

막글 2010/06/16 04:56 Posted by newtype

언제부터 인지 생각에 빠져들기 시작하면
잠을 들수가 없다.

이렇게 말라간다.

iPhone 4 7월 18일 국내 출시

불펌 2010/06/08 11:00 Posted by newtype

올해 말 쯤이려나 예상을 했는데, 완전 대박이네요.

국내 출시는 7월 18일이라는데, 애플이 저에게 생일 선물을 하려나 봅니다. ^^;

[ 출처 ] 

TAG 아이폰

방황..

막글 2010/05/29 02:18 Posted by newtype

 
지친 다리를 끌며
이제야
여기까지 왔는데
어디로 가야하는지
얼마나 더 가야 하는지

알.수.가. 없.다.

이 길의 끝이 있기나 하는 걸까?


한글 변환기 ( 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 파라미터를 추가한다.




冬のうた(겨울노래) - Kiroro

불펌 2010/01/02 00:54 Posted by newtype
冬のうた(겨울노래) - Kiroro


こんな遠い町にも 夢を與えてくれる
코은나 토오이 마치니모 유메오 아타에테 쿠레루
이런 먼 도시에서도 꿈을 안겨주네

白い粉雪が降って 心に屆くよ winter song
시로이 코나유키가 훗테 코코로니 토도쿠요 winter song
하얀 눈송이가 내려 마음에 닿아요 winter song

ふと息をかけるだけで
후토 이키오 카케루다케데
우연히 문득 숨을 내쉰것만으로

消えそうに搖れる燈り
키에소-니 유레루 아카리
꺼질듯이 흔들리는 등불

空に輝く星達よりも たくましく生きてる
소라니 카가야쿠 호시타치 요리모 다쿠마시쿠 이키테루
하늘에 빛나는 별들보다도 씩씩하게 살아가고있어

どんなに離れていても
돈나니 하나레테이테모
아무리 떨어져있어도

あなたが側にいてくれる
아나타가 소바니이테 쿠레루
당신이 곁에 있어줘

同じ夜でも信じることで 優しい風が吹いてる
오나지 요루데모 신지루 코토데 야사시이 카제가 후이테루
똑같은 밤이라도, 믿고있다는것만으로 부드러운 바람이 불고있어

廣い空に向かって 兩手高く廣げ
히로이 소라니 무캇테 료-테 타카쿠 히로게
드넓은 하늘을 향해서 양손을 높이 펼쳐.

白い粉雪が優しく 心に屆くよwinter song
시로이 코나유키가 야사시쿠 코코로니 토도쿠요 winter song
하얀 눈송이가 부드럽게 마음에 닿아요 winter song

忘れかけていた夢を 心の中に描いた
와스레카케테이타 유키오 코코로노 나카니 에가이타
잊혀졌던 꿈을 마음속에 그렸어

あなたの聲が聞きたくて 瞳を閉じてみる
아나타노 코에가 키키타쿠데 히토미오 토지테미루
당신의 목소리가 들려 눈을 감아보네

かすかに聞こえてくるよ
카스카니 키고에테 쿠루요
희미하게 들려와요

銀世界のオルゴ-ル
킨세카이노 오루고루
은빛세상의 오르골

まつげにとまった一粒の音符がひびいている
마츠게니토맛타 히토츠부노 온푸가 히비이테이루
속눈썹에 머문 하나의 음표가 울려 퍼지고있어요

こんな遠い町にも 夢を與えてくれる
코은나 토오이 마치니모 유메오 아타에테 쿠레루
이런 먼 도시에서도 꿈을 안겨주네

白い粉雪が降って 心に屆くよ winter song
시로이 코나유키가 훗테 코코로니 토도쿠요 winter song
하얀 눈송이가 내려 마음에 닿아요. winter song

廣い空に向かって 兩手高く廣げ
히로이 소라니 무캇테 료-테 타카쿠 히로게
드넓은 하늘을 향해서 양손을 높이 펼쳐.

白い粉雪が優しく 心に屆くよ winter song
시로이 코나유키가 야사시쿠 코코로니 토도쿠요 winter song
하얀 눈송이가 부드럽게 마음에 닿아요. winter song

こんな遠い町にも 夢を與えてくれる
콘나 토오이 마치니모 유메오 아타에테 쿠레루
이런 먼 도시에서도 꿈을 안겨주네

白い粉雪が降って 心に屆くよ winter song
시로이 코나유키가 훗테 코코로니 토도쿠요 winter song
하얀 눈송이가 내려 마음에 닿아요. winter song

廣い空に向かって 兩手高く廣げ
히로이 소라니 무캇테 료-테 타카쿠 히로게
드넓은 하늘을 향해서 양손을 높이 펼쳐.

白い粉雪が優しく 心に屆くよ winter song
시로이 코나유키가 야사시쿠 코코로니 토도쿠요 winter song
하얀 눈송이가 부드럽게 마음에 닿아요. winter song

こんな遠い町にも 夢を與えてくれる
콘나 토오이 마치니모 유메오 아타에테 쿠레루
이런 먼 도시에서도 꿈을 안겨주네

白い粉雪が降って あなたに屆けて winter song
시로이 코나유키가 훗테 아나타니 토도케테 winter song
하얀 눈송이가 내려 당신에게 전해져요. winter song   









강한 Visual 팝이 대세였던 '98년 Acoustic한 사운드와 맑은 음색으로 
기계적인 음향 효과 하나없이 보컬과 피아노 두가지 만으로 사람들의 
마음을 사로잡은 1977년생 여성듀오 Kiroro.

맑고 편안한 아름다운 목소리와 밝은 내용의 가사, 청량감이 느껴지는 
피아노 음색으로 데뷔이래 수많은 히트곡을 냈고, 이제 두 멤버가 모두 
한 아이의 엄마가 되어 잠시 활동 중단에 들어가며 팬들을 배려해 만든 
키로로의 [Kiroro - best: Kiroro의 가장 좋은 노래를 모았습니다] (2006. 
04) 앨범입니다. 행복에 가득찬 키로로 두 사람이 그들의 행복을 듣는 
이에게 나누어주고 있는 것 같은 느낌을 주는 멋진 노래 선곡합니다



: 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;
}

네이버의 코딩용 폰트

불펌 2009/01/23 08:55 Posted by newtype
네이버에서 코딩용 폰트를 발표 했네요.
요즘 들어 네이버를 통해, 
개발자들이 관심 갈만한 소식들을 종종 듣게 되네요.

고정폭에 대문자 아이(I)와 소문자 엘(l) 등의 구분도 가능하다고 하네요.
보다 자세한 폰트 소개와 다운 받을 수 있는 URL은 아래와 같습니다.


Visual Studio에 적용 시켜봤습니다.

터미널에도 적용시켜 봤습니다.


일단 보기에는 괜찮은거 같은데..
당분간 사용해 봐야겠네요.



TAG Font, 폰트

꿈 이야기..

막글 2009/01/20 23:44 Posted by newtype


평소 꿈을 꿔도 확실하게 기억 나는 꿈은 그렇게 많지 않았다.
왠일인지, 2009년 들어 뚜렸한 꿈을 꾸고 있다.
이 중 나름 재미 있는 2가지 꿈에 대해 기록을 남긴다.

1. 고전

더보기


내 소심한 성격과 아씨의 털털한 성격이 너무 뚜렷하다.
너무 현실감있는 꿈이다.



2. 사랑

더보기


이 꿈 역시 나의 우유부단 한 성격이 그대로 들어난다.
이런 상황이 닥친다면.. 아마도 똑같은 행동을 했을 것 같아서 날 슬프게 했다.



2009년 목표!

막글 2009/01/16 23:55 Posted by newtype
매년 하는 연래 행사..

1. 운전 익숙해 지기
2. 운동하기
3. 책 읽기
4. 몸값 올리기
5. 애인 만들기

해가 갈 수록 공통 분모는 늘어만 간다..