728x90
/*
Text
jsChangeComma( str ) ' -> ` 로 대치
jsStrCheck(checkStr, checkOK)
  들어가서는 안되는 데이타(checkOK)가 checkStr에 포함되어있는지 체크
jsMoveFocus( varTextObj, varLength, varFocusToObj )
  TextBox에서 조건이 만족하면 특정객체로 포커스를 이동
jsCheckNull( toCheck ) toCheck의 값이 Null값인지를 체크
jsDeleteComma( varNumber ) 컴마를 삭제하고 리턴
jsDeleteChar( varText, varDelete ) 문자열에서 해당 character를 지우고 리턴
CheckBox
jsCheckBoxSelectedCnt( FormObj, checkBoxName )
  FormObj에서 checkBox 가 몇개 선택되었는지  리턴한다.
jsToggle(FormObj, elemNm, checkYn)
  특정 폼안의 체크박스오브젝트를 전체선택하거나 전체반전시킴
 
SelectBox
jsCheckSelectBox ( sb ) SelectBox에서 선택된 값의 value를 리턴
jsCheckSelectBoxNm ( sb ) SelectBox에서 선택된 값의 Text를 리턴
cmInitSelectBox( varObjFullNm, varDeleteCnt )
  해당 SelectBox를 초기화 시킨다. varDeleteCnt가 1이면 첫번째값을 지우지 않는다.
cmMakeSelectBox( varObjFullNm, varText, varValue ) 해당 selectBox에 하나의 값을 추가시킴
   
날짜 
jsCheckYYYY(toCheck) 년도를 체크
jsCheckYYYYMM(toCheck) 년월을 체크
jsCheckMM(toCheck) 월을 체크
jsCheckDD(yyyy,mm,toCheck) 일을 체크
jsCheckDate( dateVal ) 날짜를 체크
jsAddYear( startDt, plusYear ) 날짜에 년수를 더함
jsAddMonths( startDt, plusMonth ) 날짜에 월수를 더함
jsGetBetweenDay( startDt, endDt ) 날짜와 날짜사이의 일수를 리턴
jsCheckTime( toCheck ) 시간포맷인지를 체크
jsMakeYyyyMm( varTextObj )
  해당 텍스트박스 객체필드에 YYYY/MM형식으로 [/]를 찍어서 채워준다.
jsMakeYyyyMmString( varText ) 넘어온 값에 날짜형식으로 [/]를 찍어서 리턴.
jsMakeDate( varTextObj ) 넘어온 Object의 값을 날짜형식으로 채워줌
jsMakeDateString( varText )넘어온 값을 날짜형식으로 리턴
toTimeString( varDateObj ) DateObj를 넘겨주면 년월일을 리턴  20030201
jsAfterThisDate( varStdDate , varYYYY , varMM , varDD )
  날짜형식의 문자열에 특정 년, 월, 일을 더한값을 리턴

날짜 체크 사용 예 호출하는 페이지에 다음 부분을 추가
<input ... omKeyUp='jsChkDate(this,lottSearchForm.txtEdate)' omBlur='compareDate()'>
 
function compareDate(){  
 if( jsCheckNull(document.forms[0].txtSdate.value) ||
     jsCheckNull(document.forms[0].txtEdate.value) )
     return;
 
 var from = document.forms[0].txtSdate.value.replace(/(,|.|-|/|:)/g,'');
 var to   = document.forms[0].txtEdate.value.replace(/(,|.|-|/|:)/g,'');
 if( jsGetBetweenDay(from,to) < 0 ) {
  alert("기간이 잘못 입력되었습니다. 다시입력하세요");
  document.forms[0].txtSdate.value = "";
  document.forms[0].txtEdate.value = "";
  document.forms[0].txtSdate.focus();
  return ;
 }
}
function jsChkDate( valObj, nextPos ){
 if( valObj.value.length == 8 ) {
  if( !jsCheckDate( valObj.value ) ) {
   alert("일자 입력오류입니다. 다시 입력해 주십시요.");
   valObj.value = '';
   valObj.focus();
   return;
  } 
  jsMakeDate( valObj );
  nextPos.focus();
 }
}
            
  
주민등록번호
jsCheckJumin(toCheck) 주민등록번호 체크
사업자등록번호
jsCheckSaupJa(toCheck) 사업자등록번호 체크
문자열길이 체크
getByteLength(s) 한글2바이트, 영문 1바이트로 바이트수를 리턴
쿠키
setCookie( name, value, expireFlag ) Set Cookie
getCookie( name ) get Cookie
숫자
jsParseInt( varStr ) 문자를 숫자로 변환 null일때
jsConvertNumberToHangul( varNum ) 숫자를 한글로 변환
jsMakeCurrency( varTextObj ) 넘어온 숫자에 컴마를 찍어서 리턴 소숫점 허용안함
jsMakeForeignCurrency( varTextObj ) 넘어온 숫자에 컴마를 찍어서 리턴 소숫점 허용함
jsOnlyNumber( varTextObj ) 해당 텍스트박스 객체에 숫자만 입력받을수 있도록
jsOnlyFloat( varTextObj ) 해당 텍스트박스 객체에 숫자와 1개의 point만을 입력받게 해준다.
jsAddComma( varNumber )
  숫자를 받아서 comma를 찍어서 리턴한다 소수점 인식 숫자가 아닌값 -1을 리턴 음수표현가능
jsAddCommaAndZero( varNumber )
  숫자를 받아서 comma를 찍어서 리턴한다 소수점 인식 숫자가 아닌값 -1을 리턴 음수표현 불가능
jsCheckFloat(toCheck) Folat형인지를 체크 정수도 Float으로 인식
jsCheckPoint( toCheck , Positive , Negative ) 자리수 체크 정수 몇자리 소수 몇자리
jsCheckNumber(toCheck) Number타입인지 체크, 소수점은 Number타입으로 인식하지 않음 
getCutNumber(num, place) 소수점 아래 몇자리 이하 절삭
jsOnlyNumberKey() text 입력시 숫자이외의 키를 눌렀을때 무효화시킨다.
jsCheckFloatType( varNum, varLeft, varRight ) 정수부분자리수 소수부분자리수 체크 
 
기타
jsSplitCode(varString, varSplitChar, varIndex) 구분자로 구분해서 index의 문자를 리턴
jsCheckIp(toCheck) toCheck값이 정확한 IP Address인지 체크
jsCheckEmail( emailVal ) 이메일을 체크 - 보완요망
jsShowHelp( helpfile ) helpfile를 팝업으로 오픈
jsGetObjCnt( FormObj, varObjName ) 특정폼에서 해당오브젝트가 몇개인지를 리턴
jsClearFrame( fr ) 특정프레임에 공백 jsp를 띄워줌
jsDeleteCharAll( FormObj )
  해당 폼에 해당하는 모든 오브젝트의 값들에서 ',' and '/'문자를 지워준다.   
isAlphaNum(input) 영문과 숫자로만 이루어졌는지를 체크
IsHangul(field) 입력값에 한글이 있는지 체크
containsCharsOnly(input,chars) 입력값이 특정 문자(chars)만으로 되어있는지 체크
popup1( varAction, varWinName, varWidth, varHeight ) 팝업을 호출
jsBack() 이전 페이지로 이동
jsVisible( str ) 특정조건에 해당하면 모래시계를 보여줌
jsRunAfterTime() 설정한 시간뒤에 특정 function을 호출
trim(text) ltrim(text) rtrim(text) text의 좌우측, 좌측, 우측의 공백을 제거해서 리턴
*/

/*--------------------------------------------------
  기능   : Cookie Setting
  INPUT  : name, value
           expireFg : 'Y' : 2020년 까지 쿠키저장
           expireFg : 'N' : session이 끊어질때 쿠키지움
  RETURN : NONE
----------------------------------------------------*/
function setCookie( name, value, expireFg ) {
    var expireDate = new Date ( 2020, 1, 1, 1, 1, 1 ) ;
    if ( expireFg = 'Y' )
        document.cookie = name + "=" + value + "; expires=" + expireDate.toGMTString() ;
    else
        document.cookie = name + "=" + value + ";" ;
}
/*--------------------------------------------------
  기능   : Cookie Get
  INPUT  : name
  RETURN : 쿠키값( 없으면 "" )
----------------------------------------------------*/
function getCookie( name ) {
    var cookieFound = false ;
    var start = 0 ;
    var end   = 0 ;
    var cookieString = document.cookie ;
    var i = 0 ;
    // name에 해당되는 cookie를 찾는다.
    while ( i <= cookieString.length ) {
        start = i ;
        end = start + name.length ;
        if ( cookieString.substring( start, end ) == name ) {
            cookieFound = true ;
            break ;
        }
        i++ ;
    }
    // cookie를 찾았으면 해당하는 값을 그렇지 않으면 ""을 return ;
    if ( cookieFound ) {
        start = end + 1 ;
        end   = document.cookie.indexOf(";",start) ;
        if ( end < start )
            end = document.cookie.length ;
        return document.cookie.substring( start, end ) ;
    }
    return "" ;
}
/*-----------------------------------------------
 ' ->문자를 쿼리문에 사용시 에러가 발생하므로 `로 대치
 INPUT  : str
 RETURN : 문자열안의 문자중 ' 문자를 ` 로 변경한 문자열
-------------------------------------------------*/
function jsChangeComma( str ){
 while( str.indexOf("'") != -1 ){
  str = str.replace("'","`");
 }
   return str;
}
/*----------------------------------------------------------
  기능   : Split Code RETURN Splited code by varSplitChar
  INPUT  : varString 문자
     : varSplitChar 구분자
   : varIndex 구분자의 위치
  RETURN : Splited code by varSplitChar
  예     : jsSplitCode( "111^222^333", "^", 2 ) == "222"
-----------------------------------------------------------*/
function jsSplitCode(varString, varSplitChar, varIndex) {
 var varArray = varString.split(varSplitChar) ;
 return varArray[eval(varIndex)-1];
}
/*--------------------------------------------------
  기능   : Check Null RETURN T/F
  INPUT  : check  data
  RETURN : true  -> NULL
           false -> NOT NULL
----------------------------------------------------*/
function jsCheckNull( toCheck )
{
     var chkstr = toCheck + "";
     var is_Space = true ;
     if ( ( chkstr == "") || ( chkstr == null ) )
    return( true );
     for ( j = 0 ; is_Space && ( j < chkstr.length ) ; j++)
     {
      if( chkstr.substring( j , j+1 ) != " " )
         {
        is_Space = false ;
         }
     }
     return ( is_Space );
}
/*--------------------------------------------------
  기능   : Check IP address RETURN T/F
  INPUT  : toCheck  -> check data
  RETURN : true  -> IP address
           false -> not IP address
----------------------------------------------------*/
function jsCheckIp(toCheck)
{
     var chkstr = toCheck+"" ;
     var isIp = true ;
     if ( jsCheckNull(toCheck) )
          return false;
     for (j = 0 ; isIp && (j < toCheck.length) ; j++)
     {
          if ((toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9"))
          {
              if ( toCheck.substring(j,j+1) == "." )
                  if ( j == 0 )
                      isIp = false ;
              else
                  isIp = false ;
          }
     }
     return isIp;
}
/*--------------------------------------------------
  기능   : Check Number RETURN T/F ( 소수점"."은 Number로 취급안함 )
  INPUT  : toCheck  -> check data
  RETURN : true  -> number ( "."이 포함안됨 )
           false -> not number
----------------------------------------------------*/
function jsCheckNumber(toCheck)
{
     var chkstr = toCheck+"" ;
     var isNum = true ;
     if ( jsCheckNull(toCheck) )
          return false;
     for (j = 0 ; isNum && (j < toCheck.length) ; j++)
     {
          if ((toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9"))
          {
             if ( toCheck.substring(j,j+1) == "-" || toCheck.substring(j,j+1) == "+")
             {
                if ( j != 0 )
                {
                   isNum = false;
                }
             }
             else
       isNum = false;
     }
     }
     if (chkstr == "+" || chkstr == "-") isNum = false;
     return isNum;
}
/*--------------------------------------------------
  기능   : Check data RETURN T/F
  INPUT  : toCheck  -> check data
           checkOK  -> 들어가서는 안되는 data
  RETURN : false -> 들어가서는 안되는 data가 없다
           true  -> 들어가서는 안되는 data가 있다.
  예1    : jsStrCheck( '12345', 'ABab' )
           string '12345'에는 'ABab'가 없으므로
           false를 리턴
  예2    : jsStrCheck( '12$45', 'ABab$#%' )
           string '12$45'에는 '$'가 있으므로
           true를 리턴
----------------------------------------------------*/
function jsStrCheck(checkStr, checkOK) {
    for (i = 0; i < checkStr.length; i++) {
        ch = checkStr.charAt(i);
        for (j = 0; j < checkOK.length; j++)
        if (ch == checkOK.charAt(j))
           break;
        if (j == checkOK.length) {
                return false;
                break;
        }
    }
    return true;
}
/*--------------------------------------------------
  기능   : Check Float RETURN T/F (정수도 Float로 취급)
  INPUT  : toCheck  -> check data
  RETURN : true  -> number
           false -> not number
----------------------------------------------------*/
function jsCheckFloat(toCheck)
{
     var chkstr = toCheck+"" ;
     var isFloat = true;
     var chkPoint = false;
     var chkMinus = false;
     if ( jsCheckNull(toCheck) )
     {
           return false;
     }
     for (j = 0 ; isFloat && (j < toCheck.length); j++)
     {
         if ( (toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9"))
         {
            if ( toCheck.substring(j,j+1) == "." )
            {
               if ( !chkPoint ) chkPoint = true ;
               else  isFloat = false ;
            }
            else if ( toCheck.substring(j,j+1) == "-" || toCheck.substring(j,j+1) == "+")
            {
               if ( ( j == 0 ) && ( !chkMinus ) ) chkMinus = true ;
               else isFloat = false;
            }
            else isFloat = false;
        }
    }
    return isFloat;
}
/*--------------------------------------------------
  기능   : 자릿수 check RETURN T/F
  INPUT  : toCheck  -> check data
  RETURN : true  -> number
           false -> not number
----------------------------------------------------*/
function jsCheckPoint( toCheck , Positive , Negative )
{
     var strPos = toCheck + "" ;
     var isPoint = true ;
     if ( jsCheckFloat ( toCheck ) )
     {
         var inx = strPos.indexOf(".") ;
         if ( inx == -1 )
         {
              if ( strPos.length > parseInt(Positive) )
                 isPoint = false ;
              else
                 isPoint = true ;
          }
          else
          {
               var pos = strPos.substring( 0, inx ) ;
               var nev = strPos.substring(inx + 1) ;
               if ( pos.length > parseInt(Positive) )
                     isPoint = false ;
               else if ( nev.length > parseInt(Negative) )
                     isPoint = false ;
               else
                     isPoint = true ;
          }
      }
      else if ( jsCheckNumber (toCheck) )
            isPoint = true  ;
      else
            isPoint = false ;
      return isPoint ;
}
////////////////////////////////////////////////////////////////n
////////////    DATE  VALIDATION  CHECK    //////////////////////
/////////////////////////////////////////////////////////////////
/*--------------------------------------------------
  기능   : calender에서 사용할 월별 배열를 만든다.
  INPUT  : 각 인자의 값
----------------------------------------------------*/
function jsMonthArray(m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11)
{
      this[0] = m0;
      this[1] = m1;
      this[2] = m2;
      this[3] = m3;
      this[4] = m4;
      this[5] = m5;
      this[6] = m6;
      this[7] = m7;
      this[8] = m8;
      this[9] = m9;
      this[10] = m10;
      this[11] = m11;
}

/*--------------------------------------------------
  기능   : 년도를 check한다.
  INPUT  : toCheck
  RETURN : NONE
     MSG :
----------------------------------------------------*/
function jsCheckYYYY(toCheck)
{
   return ( ( toCheck.length == 4) && ( jsCheckNumber(toCheck)  ) && ( toCheck != "0000") );
}
/*--------------------------------------------------
  기능   : 년월을 check한다.
  INPUT  : toCheck
  RETURN : NONE
     MSG :
----------------------------------------------------*/
function jsCheckYYYYMM(toCheck)
{
     var isDate  = true ;
     if ( toCheck.length != 6 )
     {
          isDate = false ;
     }
     else
     {
           var yy = toCheck.substring(0,4) +"" ;
           var mm = toCheck.substring(4,6) +"" ;
           if ( !jsCheckYYYY(yy) )
              isDate = false ;
           else if ( !jsCheckMM(mm) )
              isDate = false ;
     }
     return isDate ;
}
/*--------------------------------------------------
  기능   : 월을 check한다.
  INPUT  : toCheck
  RETURN :
    MSG  :
----------------------------------------------------*/
function jsCheckMM(toCheck)
{
      return ((toCheck.length > 0) && (jsCheckNumber(toCheck)) && (0< eval(toCheck)) && (eval(toCheck) < 13));
}
/*--------------------------------------------------
  기능   : 일을 check한다.
  INPUT  : toCheck
  RETURN : NONE
     MSG :
----------------------------------------------------*/
function jsCheckDD(yyyy,mm,toCheck)
{
      var isYMD  = false;
      var monthDD= new jsMonthArray(31,28,31,30,31,30,31,31,30,31,30,31);
      var im     = eval(mm) - 1;
      if ( toCheck.length == 0 )  return false;
      if ( !jsCheckNumber(toCheck)  )  return false;
      var dd     = eval(toCheck);
      if ( ( (yyyy%4 == 0) && (yyyy%100 != 0) ) || (yyyy%400 == 0) )
      {
           monthDD[1] = 29;
      }
      if ( (0 < dd) && (dd <= monthDD[im]) ) isYMD = true;
           return isYMD;
}
/*--------------------------------------------------
  기능   : 날짜를 check한다.
  INPUT  : dateVal '20030321'
  RETURN : NONE
     MSG :
----------------------------------------------------*/
function jsCheckDate( dateVal )
{
     var isDate  = true ;
     if ( dateVal.length != 8 )
     {
          isDate = false ;
     }
     else
     {
           var yy = dateVal.substring(0,4) +"" ;
           var mm = dateVal.substring(4,6) +"" ;
           var dd = dateVal.substring(6,8) +"" ;
           if ( !jsCheckYYYY(yy) )
              isDate = false ;
           else if ( !jsCheckMM(mm) )
              isDate = false ;
           else if ( !jsCheckDD (yy,mm,dd) )
              isDate = false ;
     }
     return isDate ;
}
/*--------------------------------------------------
  기능   : 날짜에 년수를 더한다.
  INPUT  : startDt(YYYYMMDD), year
  RETURN : rtnValue : 날짜에 년수를 더한 날짜
           -1       : ERROR..!
           예) 20000110 + 1년 = 20010110
           예) 20000229 + 1년 = 20010228
     MSG :
----------------------------------------------------*/
function jsAddYear( startDt, plusYear ) {
 var rtnValue = -1 ;
 // input date의 날짜 체크
 if ( !jsCheckDate(startDt) || !jsCheckNumber(plusYear) ) {
  rtnValue = -1 ;
  return rtnValue ;
 }
 var yyyy = startDt.substring(0,4) +"" ;
 var mm   = startDt.substring(4,6) +"" ;
 var dd   = startDt.substring(6,8) +"" ;
 var newYyyy = (eval(yyyy) + eval(plusYear)) ;
 // 윤달(29일) 인 경우 28일로 고침
 // 예) 20000229 에 1년을 더하면 20000228
 var isYoonYear = false ;
 // 4 로 나누어 떨어지면 윤년
 // 100 으로 나누어 떨어지면 윤년 아님
 // 400 으로 나누어 떨어지면 윤년
 if ( (eval(newYyyy)%4) == 0 ) isYoonYear = true ;
 if ( (eval(newYyyy)%100) == 0 ) isYoonYear = false ;
 if ( (eval(newYyyy)%400) == 0 ) isYoonYear = true ;
 if ( (mm == '02') && (dd == '29') && !isYoonYear ) dd = '28' ;
 rtnValue = newYyyy + mm + dd ;
 return rtnValue ;
}
/*--------------------------------------------------
  기능   : 날짜에 월수를 더한다.
  INPUT  : startDt(YYYYMMDD), year
  RETURN : rtnValue : 날짜에 월수를 더한 날짜
           -1       : ERROR..!
           예) 20000110 + 3월  = 20000410
           예) 20000229 + 12월 = 20000228
     MSG :
----------------------------------------------------*/
function jsAddMonths( startDt, plusMonth ) {
 var rtnValue = -1 ;
 // input date의 날짜 체크
 if ( !jsCheckDate(startDt) || !jsCheckNumber(plusMonth) ) {
  rtnValue = -1 ;
  return rtnValue ;
 }
 var yyyy = startDt.substring(0,4) +"" ;
 var mm   = startDt.substring(4,6) +"" ;
 var dd   = startDt.substring(6,8) +"" ;
 var newMm = null;
 // 월수를 더하여 1년이 넘는 경우
 if ( (eval(mm) + eval(plusMonth)) > 12 ) {
  yyyy  = eval(yyyy) + 1 ;
  newMm = eval(mm) + eval(plusMonth) - 12 ;
 } else {
  newMm = eval(mm) + eval(plusMonth) ;
 }
 // 윤년 처리
 var isYoonYear = false ;
 // 4 로 나누어 떨어지면 윤년
 // 100 으로 나누어 떨어지면 윤년 아님
 // 400 으로 나누어 떨어지면 윤년
 if ( (eval(yyyy)%4) == 0 ) isYoonYear = true ;
 if ( (eval(yyyy)%100) == 0 ) isYoonYear = false ;
 if ( (eval(yyyy)%400) == 0 ) isYoonYear = true ;
 // 윤년인 경우
 if ( isYoonYear ) {
  if ( (newMm == '02') && ( dd=='30' || dd=='31' ) ) dd = '29' ;
 // 평년인 경우
 } else {
  if ( (newMm == '02') && ( dd=='29' || dd=='30' || dd=='31' ) ) dd = '28' ;
 }
 // 월의 자리수를 맞춘다. ( 2 월 -> 02 )
 if ( eval(newMm) < 10 ) { newMm = "0" + newMm  } ;
 rtnValue = yyyy + newMm + dd ;
 return rtnValue ;
}
/*--------------------------------------------------
  기능   : 날짜와 날짜 사이의 일수를 리턴한다.
  INPUT  : startDt(YYYYMMDD), endDt(YYYYMMDD)
  RETURN : rtnValue : 날짜와 날짜 사이의 일수
           -1       : ERROR..!
     MSG :
----------------------------------------------------*/
function jsGetBetweenDay( startDt, endDt )
{
     var rtnValue = 0 ;
     // input date의 날짜 체크
     if ( !jsCheckDate(startDt) || !jsCheckDate(endDt) ) {
      rtnValue = -1 ;
     }
     else {
           var yyyy = startDt.substring(0,4) +"" ;
           var mm   = startDt.substring(4,6) +"" ;
           var dd   = startDt.substring(6,8) +"" ;
           var startDate = new Date(yyyy,(eval(mm)-1),dd) ; // 달 은 한달이 느리므로 1을 빼준다.
           yyyy = endDt.substring(0,4) +"" ;
           mm   = endDt.substring(4,6) +"" ;
           dd   = endDt.substring(6,8) +"" ;
           var endDate = new Date(yyyy,(eval(mm)-1),dd) ;
           // 1000분의 1초 단위를 일 단위로 바꾸기
           rtnValue = ((endDate-startDate)/60/60/24/1000) ;
     }
     return rtnValue ;
}
/*--------------------------------------------------
  기능   : Check Time RETURN T/F
  INPUT  : check  time
  RETURN : true  -> TIME
           false -> NOT TIME
----------------------------------------------------*/
function jsCheckTime( toCheck )
{
     var chkstr  = toCheck + "";
     if ( ( chkstr == "") || ( chkstr == null ) )
    return( false );
     var mm = chkstr.substring( 0 ,2 );
     var ss = chkstr.substring( 3 ,5 );
     if (( mm <= "23" ) && ( mm >= "00" ))
     {
         if (( ss <= "60" ) && ( ss >= "00" ))
         {
             if ( chkstr.substring( 2 ,3 ) == ":")
             {
              return( true );
             }
         }
     }
     return( false );
}
/*--------------------------------------------------
  기능   : Check 주민등록번호 RETURN T/F
  INPUT  : toCheck
  RETURN : true  -> 올바른 번호
           false ->
----------------------------------------------------*/
function jsCheckJumin(toCheck) {
    var isJumin = true;
    if ( jsCheckNull(toCheck) ) {
          return false;
    } else if ( toCheck.length < 13 || toCheck.length > 13 ) {
          return false;
    } else if ( toCheck.substring(2,3) > "1" || toCheck.substring(6,7) > "2" || toCheck.substring(6,7) == "0" ) {
          return false;
    } else if ( toCheck.substring(2,3) == "1" && toCheck.substring(3,4) > "2" ){
          return false;
    } else if (!(toCheck.substring(4,6) >= "01" && toCheck.substring(4,6) <= "31")){
          return false;
    }
   for (j = 0; isJumin && (j < toCheck.length); j++) {
       if ( ( (toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9")) ) {
           isJumin = false;
       }
   }

  var a1=toCheck.substring(0,1)
  var a2=toCheck.substring(1,2)
  var a3=toCheck.substring(2,3)
  var a4=toCheck.substring(3,4)
  var a5=toCheck.substring(4,5)
  var a6=toCheck.substring(5,6)
  var check_digit=a1*2+a2*3+a3*4+a4*5+a5*6+a6*7
  var b1=toCheck.substring(6,7)
  var b2=toCheck.substring(7,8)
  var b3=toCheck.substring(8,9)
  var b4=toCheck.substring(9,10)
  var b5=toCheck.substring(10,11)
  var b6=toCheck.substring(11,12)
  var b7=toCheck.substring(12,13)
  var check_digit=check_digit+b1*8+b2*9+b3*2+b4*3+b5*4+b6*5
  check_digit = check_digit%11
  check_digit = 11 - check_digit
  check_digit = check_digit%10
  if (check_digit != b7){
   isJumin = false;
  }
   return isJumin;
}
/*--------------------------------------------------
  기능   : Check 사업자 등록번호 RETURN T/F
  INPUT  : toCheck
  RETURN : true  -> 올바른 번호
           false ->
----------------------------------------------------*/
function jsCheckSaupJa(toCheck) {
    var isSaupJa = true;
    if ( jsCheckNull(toCheck) ) {
          return false;
    } else if ( toCheck.length < 10 || toCheck.length > 10 ) {
          return false;
    }
    for (j = 0; isSaupJa && (j < toCheck.length); j++) {
       if ( ( (toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9")) ) {
           isSaupJa = false;
       }
    }
    return isSaupJa;
}
/*--------------------------------------------------
  기능   : E-Mail를 check한다.
  INPUT  : emailVal
  RETURN : NONE
     MSG :
----------------------------------------------------*/
function jsCheckEmail( emailVal )
{
     if ( jsCheckNull(emailVal) ) return true;
     var inx = emailVal.indexOf("@") ;
     if ( inx <= 0 || inx==emailVal.length-1 ) return false;
     return true ;
}
/*--------------------------------------------------
  기능   :
  INPUT  : varNum : 실수
       varLeft : 정수부분 자리수
       varRight : 소수부분 자리수
  RETURN : true : 실수가 정/소수부분의 자리수를 초과하지 않는다.
       false : 실수가 정/소수부분의 자리수를 초과한다.
----------------------------------------------------*/
function jsCheckFloatType( varNum, varLeft, varRight ) {
 var resultFlag = true ;
 if ( varNum.charAt(0) == "-" ){
  varNum = varNum.substring(1,varNum.length);
 }
 var PointIndex = varNum.indexOf(".");
 if ( PointIndex < 0 ){
  if ( varNum.length > varLeft )
   resultFlag = false ;
 }else{
  var LeftLength = varNum.substring(0,PointIndex).length;
  var RightLength = varNum.substring(PointIndex+1, varNum.length ).length;
  if ( (LeftLength > varLeft) || (RightLength > varRight) )
   resultFlag = false ;
 }
 return resultFlag ;
}
/*--------------------------------------------------
  기능   :
  INPUT  : helpfile
  RETURN :
----------------------------------------------------*/
function jsShowHelp( helpfile )
{
      var helpstr = helpfile + "" ;
      var URL     = "" ;
      var cWin ;
      URL = "/help/"+helpfile+".html" ;
      cWin = window.open(URL,"help","toolbar=0,location=0,directories=0,status=0,menubar=1,scrollbars=1,resizable=1,width=560,height=320");
      cWin.focus();
}
/*--------------------------------------------------
  기능   : 한글이든 영문이든 제대로 갯수 체크를 해준다.
  INPUT  : String
  RETURN :
----------------------------------------------------*/
function getByteLength(s){
   var len = 0;
   if ( s == null ) return 0;
   for(var i=0;i<s.length;i++){
      var c = escape(s.charAt(i));
      if ( c.length == 1 ) len ++;
      else if ( c.indexOf("%u") != -1 ) len += 2;
      else if ( c.indexOf("%") != -1 ) len += c.length/3;
   }
   return len;
}
/*--------------------------------------------------
  기능   : FormObj에서 varObjName이 몇개 존재하는지 리턴한다.
  INPUT  : FormObj : FormName
     : varObjName : 객체명
  RETURN :
----------------------------------------------------*/
function jsGetObjCnt( FormObj, varObjName ){
 var cnt = 0 ;
   for(var inx = 0; inx < FormObj.elements.length ; inx++ ) {
      if ( FormObj.elements[inx].name == varObjName ) {
       cnt++ ;
      }
   }
   return cnt;
}
/*--------------------------------------------------
  기능   :  SELECT OPTION BOX의 값을 RETURN 한다.
  INPUT  : sb = selectBoxName
  RETURN :
----------------------------------------------------*/
function jsCheckSelectBox ( sb )
{
    var temp = sb.options[sb.selectedIndex].value ;
    return ( temp );
}
function jsCheckSelectBoxNm ( sb )
{
    var temp = sb.options[sb.selectedIndex].text ;
    return ( temp );
}
/*--------------------------------------------------
  기능   :  해당 Frame을 공백페이지로 변경
  INPUT  : fr : FrameName
  RETURN :
----------------------------------------------------*/
function jsClearFrame( fr ) {
    fr.location = "/common/blank.jsp";
}
/*--------------------------------------------------
  기능   : checkBox를 전체선택 및 해제를 할수 있게 한다.
  INPUT  : FormObj FormName
       elemNm CheckBox name
       checkYn boolean
  RETURN :
----------------------------------------------------*/
function jsToggle(FormObj, elemNm, checkYn){
 var i =0;
 while (i < FormObj.elements.length)
 {
  if (FormObj.elements[i].name== elemNm )
  {
   FormObj.elements[i].checked= checkYn;
  }
  i++;
 }
}
/*--------------------------------------------------
  기능   : focus 옮기기
  INPUT  : varTextObj : TextBox 객체명
       varLength  : 조건에 맞는 textLength
       varFocusToObj : Focus를 옮겨갈 객체명
  RETURN :
----------------------------------------------------*/
function jsMoveFocus( varTextObj, varLength, varFocusToObj ) {
 if ( varTextObj.value.length == varLength ) {
  varFocusToObj.focus() ;
  varFocusToObj.select() ;
  return ;
 }
}
/*--------------------------------------------------
  기능   : 문자를 숫자로 convert 한다. 단,
       parseFloat 와 다른 점은 null 이 올때 0 으로 인식한다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsParseInt( varStr ) {
 if ( varStr == null || varStr == "" )
  return 0 ;
 else
  return parseInt(varStr) ;
}
/*--------------------------------------------------
  기능   : 숫자를 한글로 변환한다.
   예) 450,000,000 -> 사억오천만
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsConvertNumberToHangul( varNum )
{
 // 리턴할 문자열
 var returnStr = "" ;
 // 음수일 때는 에러
 if ( eval(varNum) < 0 ) {
  return returnStr ;
 }
 // 넘어온 숫자를 문자로 변환
 var numLen = varNum.length ;
 // 변환된 문자를 앞에서 부터 한자씩 잘라서 보관할 변수
 var oneChar = null ;
 var isDone1 = true ;
 var isDone2 = true ;
 var isDone3 = true ;
 var isDone4 = true ;
 var isDone5 = false ;
 for ( var inx = 0 ; inx < numLen ; inx++ ) {
  oneChar = varNum.substring( inx, inx+1 ) ;
  isDone5 = false ;
  if ( oneChar == "0" ) {
   // 아무일도 안함
  } else if ( oneChar == "1" ) {
   returnStr = returnStr + "일" ;
   isDone5 = true ;
  } else if ( oneChar == "2" ) {
   returnStr = returnStr + "이" ;
   isDone5 = true ;
  } else if ( oneChar == "3" ) {
   returnStr = returnStr + "삼" ;
   isDone5 = true ;
  } else if ( oneChar == "4" ) {
   returnStr = returnStr + "사" ;
   isDone5 = true ;
  } else if ( oneChar == "5" ) {
   returnStr = returnStr + "오" ;
   isDone5 = true ;
  } else if ( oneChar == "6" ) {
   returnStr = returnStr + "육" ;
   isDone5 = true ;
  } else if ( oneChar == "7" ) {
   returnStr = returnStr + "칠" ;
   isDone5 = true ;
  } else if ( oneChar == "8" ) {
   returnStr = returnStr + "팔" ;
   isDone5 = true ;
  } else if ( oneChar == "9" ) {
   returnStr = returnStr + "구" ;
   isDone5 = true ;
  }
  if ( ((numLen-inx) % 4) == 0 && oneChar != "0" ) {
   returnStr = returnStr + "천" ;
  } else if ( ((numLen-inx) % 4) == 3 && oneChar != "0" ) {
   returnStr = returnStr + "백" ;
  } else if ( ((numLen-inx) % 4) == 2 && oneChar != "0" ) {
   returnStr = returnStr + "십" ;
  } else if ( ((numLen-inx) % 4) == 1 ) {
   if ( numLen >= 17 && isDone1 && isDone5 ) {
    returnStr = returnStr + "경" ;
    isDone1 = false ;
   } else if ( numLen >= 13  && isDone2 && isDone5 ) {
    returnStr = returnStr + "조" ;
    isDone2 = false ;
   } else if ( numLen >= 9  && isDone3 && isDone5 ) {
    returnStr = returnStr + "억" ;
    isDone3 = false ;
   } else if ( numLen >= 5  && isDone4 && isDone5 ) {
    returnStr = returnStr + "만" ;
    isDone4 = false ;
   }
  }
 }
 return returnStr ;
}
/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 comma를 찍어서 comma 를 찍어서 채워준다.
      소수점 허용 안함
    예) 1000.00 -> 1,000   
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeCurrency( varTextObj ) {
 varTextObj.value = jsDeleteComma( varTextObj.value ) ;
 var varLength = varTextObj.value.length ;
 var varText   = "" ;
 var isPointed = false ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  }
 }
 varTextObj.value = jsAddComma( varText ) ;
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 comma를 찍어서 comma 를 찍어서 채워준다.
      소수점 허용 함   
    예) 1000.00 -> 1,000.00   
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeForeignCurrency( varTextObj ) {
 varTextObj.value = jsDeleteComma( varTextObj.value ) ;
 var varLength = varTextObj.value.length ;
 var varText   = "" ;
 var isPointed = false ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) || (varTextObj.value.substring(inx, inx+1)=='.') ) {
   // 점이 안찍히고 처음으로 점이 들어왔을때
   if ( !isPointed && varTextObj.value.substring(inx, inx+1)=='.' ) {
    isPointed = true ;
    varText = varText + varTextObj.value.substring(inx, inx+1) ;
   // 숫자 일때
   } else if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
    varText = varText + varTextObj.value.substring(inx, inx+1) ;
   }
  }
 }
 varTextObj.value = jsAddComma( varText ) ;
}
/*--------------------------------------------------
  기능   : 파라메터로 넘어온 객체필드에 숫자만을 입력받게 해준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsOnlyNumber( varTextObj ) {
 var varLength = varTextObj.value.length ;
 var varText   = "" ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  }
 }
 // 앞에 붙은 0 없애기 (예) 00200 -> 200
 varLength = varText.length ;
 var varTempReturnNumber = varText;
 var varReturnNumber = "" ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( varTempReturnNumber.substring(inx, inx+1) == '0' ) {
   // '0' 이 넘어왔을 경우 '0'을 그대로 리턴해야 한다.
   if ( varLength == 1 ) varReturnNumber = "0" ;
   else if ( eval(jsDeleteComma(varTempReturnNumber)) == '0' ) {
    varReturnNumber = "0" ;
    break ;
   }
  } else {
   varReturnNumber = varTempReturnNumber.substring(inx, varLength+1) ;
   break ;
  }
 }
 varTextObj.value = varReturnNumber;
}
/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 숫자와 1개의 point만을 입력받게 해준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsOnlyFloat( varTextObj ) {
 varTextObj.value = jsDeleteComma( varTextObj.value ) ;
 var varLength = varTextObj.value.length ;
 var varText   = "" ;
 var isPointed = false ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) || (varTextObj.value.substring(inx, inx+1)=='.') ) {
   // 점이 안찍히고 처음으로 점이 들어왔을때
   if ( !isPointed && varTextObj.value.substring(inx, inx+1)=='.' ) {
    isPointed = true ;
    varText = varText + varTextObj.value.substring(inx, inx+1) ;
   // 숫자 일때
   } else if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
    varText = varText + varTextObj.value.substring(inx, inx+1) ;
   }
  }
 }
 // 앞에 붙은 0 없애기 (예) 00200 -> 200
 varLength = varText.length ;
 var varReturnNumber = "" ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( varText.substring(inx, inx+1) == '0' ) {
   // '0' 이 넘어왔을 경우 '0'을 그대로 리턴해야 한다.
   if ( varLength == 1 ) varReturnNumber = "0" ;
   else if ( eval(jsDeleteComma(varText)) == '0' ) {
    varReturnNumber = "0" ;
    break ;
   }
  } else {
   varReturnNumber = varText.substring(inx, varLength+1) ;
   break ;
  }
 }
 varTextObj.value = varReturnNumber ;
}
/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 YYYY/MM형식으로 [/]를 찍어서 채워준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeYyyyMm( varTextObj ) {
 varTextObj.value = jsDeleteChar( varTextObj.value, '/' ) ;
 var varLength = varTextObj.value.length ;
 var varText   = "" ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  }
 }
 if ( varText.length < 6 ) {
  varTextObj.value = varText ;
 } else {
  varTextObj.value = varText.substring(0,4) + "/" + varText.substring(4,6) ;
 }
}
/*--------------------------------------------------
  기능   : 파라메터로 넘어온 String에 날짜형식으로 [/]를 찍어서 리턴.
    예) 200103 -> 2001/03
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeYyyyMmString( varText ) {
 if ( varText.length != 6 || !jsCheckNumber( varText ) ) {
  return varText ;
 }
 var varReturnText   = "" ;
 varReturnText = varText.substring(0,4) + "/" + varText.substring(4,6) ;
 return varReturnText
}
/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 날짜형식으로 [/]를 찍어서 채워준다.     
    예) 20010301 -> 2001/03/01         
  INPUT  : Text Object
  RETURN :
----------------------------------------------------*/
function jsMakeDate( varTextObj ) {
 varTextObj.value = jsDeleteChar( varTextObj.value, '/' ) ;
 var varLength = varTextObj.value.length ;
 var varText   = "" ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  }
 }
 if ( varText.length < 8 ) {
  varTextObj.value = varText ;
 } else {
  varTextObj.value = varText.substring(0,4) + "/" + varText.substring(4,6) + "/" + varText.substring(6,8) ;
 }
}
/*--------------------------------------------------
  기능   : 파라메터로 넘어온 String에 날짜형식으로 [/]를 찍어서 채워준다.     
    예) 20010301 -> 2001/03/01         
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeDateString( varText ) {
 if ( varText.length != 8 || !jsCheckNumber( varText ) ) {
  return varText ;
 }
 var varReturnText   = "" ;
 varReturnText = varText.substring(0,4) + "/" + varText.substring(4,6) + "/" + varText.substring(6,8) ;
 return varReturnText
}
/*--------------------------------------------------
  기능   : 숫자를 받아서 comma를 찍어서 리턴한다. 음수도 표현가능
    예) 1000.00 -> 1,000.00
    예) 숫자가 아닌 값 -> -1 리턴     
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsAddComma( varNumber ){
 // 숫자가 아니면 -1을 리턴한다.
 if ( jsCheckNull(varNumber) ) return "" ;
 if ( !jsCheckFloat(varNumber) ) {
  return -1 ;
 }
 // 소수 이상, 이하 부분을 따로 보관.
 var PointIndex = varNumber.indexOf(".") ;
 var varUnderPoint = "" ;
 var isPointed = false ;
 // 소수 이하가 없을때
 if ( PointIndex < 0 ) {
  isPointed = false ;
  // 소수 이하 부분
  varUnderPoint = "" ;
  // 소수 이상 부분
  varOverPoint = varNumber ;
 // 소수 이하가 있을때
 } else {
  isPointed = true ;
  // 소수 이하 부분
  varUnderPoint = varNumber.substring(PointIndex+1, varNumber.length ) ;
  // 소수 이상 부분
  varOverPoint = varNumber.substring(0, PointIndex) ;
 }
 // 음수일때 앞의 "-" 따로 보관
 var negativeFlag = false ;
 if ( varOverPoint.substring(0,1) == "-" ) {
  negativeFlag = true ;
  varOverPoint = varOverPoint.substring(1,varOverPoint.length+1) ;
 }
 // 소수 이상 부분에 comma 넣기
 var varLength = varOverPoint.length ;
 var varCnt = 0 ;
 var varTempReturnNumber = "" ;
 for ( var inx = varLength-1 ; inx >= 0 ; inx-- ) {
  varCnt++ ;
  // 소수점 찍기
  if ( varCnt == 4 ) {
   varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + "," + varTempReturnNumber ;
   varCnt = 1 ;
  // 소수점 안찍기
  } else {
   varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + varTempReturnNumber ;
  }
 }
 // 앞에 붙은 0 없애기 (예) 00200 -> 200
 varLength = varTempReturnNumber.length ;
 var varReturnNumber = "" ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( varTempReturnNumber.substring(inx, inx+1) == '0' ) {
   // '0' 이 넘어왔을 경우 '0'을 그대로 리턴해야 한다.
   if ( varLength == 1 ) varReturnNumber = "0" ;
   else if ( eval(jsDeleteComma(varTempReturnNumber)) == '0' ) {
    varReturnNumber = "0" ;
    break ;
   }
  } else {
   varReturnNumber = varTempReturnNumber.substring(inx, varLength+1) ;
   break ;
  }
 }
 // 소수점 이하 붙이기
 if ( isPointed ) {
  varReturnNumber = varReturnNumber + "." + varUnderPoint ;
 }
 // 음수 붙이기
 if ( negativeFlag ) {
  varReturnNumber = "-" + varReturnNumber ;
 }
 return varReturnNumber ;
}
/*--------------------------------------------------
  기능   : 숫자를 받아서 comma를 찍어서 리턴한다.
    예) 1000 -> 1,000.00
    예) 숫자가 아닌 값 -> -1 리턴  
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsAddCommaAndZero( varNumber ){
 // 숫자가 아니면 -1을 리턴한다.
 if ( jsCheckNull(varNumber) ) return "" ;
 if ( !jsCheckFloat(varNumber) ) {
  return -1 ;
 }
 // 소수 이상, 이하 부분을 따로 보관.
 var PointIndex = varNumber.indexOf(".") ;
 var varUnderPoint = "" ;
 // 소수 이하가 없을때
 if ( PointIndex < 0 ) {
  // 소수 이하 부분
  varUnderPoint = "" ;
  // 소수 이상 부분
  varOverPoint = varNumber ;
 // 소수 이하가 있을때
 } else {
  // 소수 이하 부분
  varUnderPoint = varNumber.substring(PointIndex+1, varNumber.length ) ;
  // 소수 이상 부분
  varOverPoint = varNumber.substring(0, PointIndex) ;
 }
 // 소수 이상 부분에 comma 넣기
 var varLength = varOverPoint.length ;
 var varCnt = 0 ;
 var varTempReturnNumber = "" ;
 for ( var inx = varLength-1 ; inx >= 0 ; inx-- ) {
  varCnt++ ;
  // 소수점 찍기
  if ( varCnt == 4 ) {
   varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + "," + varTempReturnNumber ;
   varCnt = 1 ;
  // 소수점 안찍기
  } else {
   varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + varTempReturnNumber ;
  }
 }
 // 앞에 붙은 0 없애기 (예) 00200 -> 200
 varLength = varTempReturnNumber.length ;
 var varReturnNumber = "" ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( varTempReturnNumber.substring(inx, inx+1) == '0' ) {
  } else {
   varReturnNumber = varTempReturnNumber.substring(inx, varLength+1) ;
   break ;
  }
 }
 // 소수점 이하 붙이기
 if ( varUnderPoint.length == 0 ){
  varReturnNumber = varReturnNumber + "." + "00" ;
 }else if ( varUnderPoint.length == 1 ){
  varReturnNumber = varReturnNumber + "." + varUnderPoint + "0";
 }else if ( varUnderPoint.length == 2 ){
  varReturnNumber = varReturnNumber + "." + varUnderPoint ;
 }
 return varReturnNumber ;
}
/*--------------------------------------------------
  기능   : 숫자를 받아서 comma를 없애고 리턴한다
    예) 1,000.00 -> 1000.00    
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsDeleteComma( varNumber ){
 var varLength = varNumber.length ;
 varReturnNumber = "" ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( varNumber.substring( inx, inx+1 ) != "," ) {
   varReturnNumber = varReturnNumber + varNumber.substring( inx, inx+1 ) ;
  }
 }
 return varReturnNumber ;
}
/*--------------------------------------------------
  기능   : 글자를 받아서 param를 없애고 리턴한다.
    예) 2001/01/01 -> 20010101    
  INPUT  : varText 문자열 varDelete 삭제하고자하는 Character
  RETURN :
----------------------------------------------------*/
function jsDeleteChar( varText, varDelete ){
 var varLength = varText.length ;
 varReturnText = "" ;
 for ( var inx = 0 ; inx < varLength ; inx++ ) {
  if ( varText.substring( inx, inx+1 ) != varDelete ) {
   varReturnText = varReturnText + varText.substring( inx, inx+1 ) ;
  }
 }
 return varReturnText ;
}
/*--------------------------------------------------
  기능   : 폼 이름을 받아서 모든 text,hidden값에 comma, / 문자를 없애준다
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsDeleteCharAll( FormObj ) {
 for ( i=0; i<FormObj.elements.length; i++ ) {
  if ( FormObj.elements[i].type == "text" || FormObj.elements[i].type == "hidden" ) {
   if ( !jsCheckNull(FormObj.elements[i].value) && jsCheckFloat(jsDeleteComma(FormObj.elements[i].value)) ) {
    FormObj.elements[i].value = jsDeleteComma(FormObj.elements[i].value);
   } else if ( !jsCheckNull(FormObj.elements[i].value) && jsCheckDate(jsDeleteChar(FormObj.elements[i].value,'/')) ) {
    FormObj.elements[i].value = jsDeleteChar( FormObj.elements[i].value, '/' );
   }
  }
 }
}
/*--------------------------------------------------
  기능   : FormObj에서 checkBox 가 몇개 선택되었는지  리턴한다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsCheckBoxSelectedCnt( FormObj, checkBoxName ){
   var cnt = 0 ;
   for(var inx = 0; inx < FormObj.elements.length ; inx++ ) {
      if ( FormObj.elements[inx].name == checkBoxName && FormObj.elements[inx].checked ) {
       cnt++ ;
      }
   }
   return cnt;
}
/*--------------------------------------------------
  기능   : 영문 과 숫자로만 이루어 졌는지  체크를 해준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function isAlphaNum(input) {
    var chars = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    return containsCharsOnly(input,chars);
}
 
//입력값이 한글이 포함되어있는지 체크
function IsHangul(field)
{
 if ( field == "" ) return false;
    var rtnLen = 0 ;
 
    for (i=0; i<field.length; i++)
    {  
        // 한글인 경우 길이가 UniCode 값은 10000 이상이다.
        if(field.charCodeAt(i) > 10000 )
        {
         rtnLen++;
        }
    }
   
    if ( rtnLen > 0 )
     return true;
    else
     return false;
}
 
/*----------------------------------------------------
  입력값이 특정 문자(chars)만으로 되어있는지 체크
  특정 문자만 허용하려 할 때 사용
  ex) if (!containsCharsOnly(form.blood,"ABO")) {
          alert("혈액형 필드에는 A,B,O 문자만 사용할 수 있습니다.");
      }
------------------------------------------------------*/
function containsCharsOnly(input,chars) {
    for (var inx = 0; inx < input.value.length; inx++) {
       if (chars.indexOf(input.value.charAt(inx)) == -1)
           return false;
    }
    return true;
}
/*--------------------------------------------------
  기능   : POPUP OPEN Script
  INPUT  :
  RETURN :
----------------------------------------------------*/
function popup1( varAction, varWinName, varWidth, varHeight ){
 var win = window.open( varAction, varWinName , "toolbar=0,location=0,directories=0,status=1,menubar=0,scrollbars=1,resizable=1, width=" + varWidth + ",height=" + varHeight + ", left=50,top=50");
 return win;
 
 //var FormObj = document.dataForm;
 //FormObj.target = varWinName ;
 //FormObj.action = varAction ;
 //FormObj.submit() ;
}

function toTimeString( varDateObj ) { //formatTime(date)
    var year  = varDateObj.getFullYear();
    var month = varDateObj.getMonth() + 1; // 1월=0,12월=11이므로 1 더함
    var day   = varDateObj.getDate();
    if (("" + month).length == 1) { month = "0" + month; }
    if (("" + day).length   == 1) { day   = "0" + day;   }
    return ("" + year + month + day );
}
function jsAfterThisDate( varStdDate , varYYYY , varMM , varDD ) {
    var varDateObj = new Date();
    varStdDate = jsDeleteChar( varStdDate, "/" );
    var yyyy = varStdDate.substring(0,4) +"" ;
    var mm   = varStdDate.substring(4,6) +"" ;
    var dd   = varStdDate.substring(6,8) +"" ;
    var startDate = new Date(yyyy,(eval(mm)-1),dd) ; // 달 은 한달이 느리므로 1을 빼준다.
    varDateObj.setFullYear(startDate.getFullYear() + eval(varYYYY) ); //년을 더함
    varDateObj.setMonth(startDate.getMonth() + eval(varMM) );       //월을 더함
    varDateObj.setDate(startDate.getDate() + eval(varDD)  );         //일을 더함
    return toTimeString(varDateObj);
}
/*--------------------------------------------------
  기능   : text 입력시 숫자이외의 키를 눌렀을때 무효화시킨다.
  INPUT  : 없음
  RETURN : 이벤트 무효화
  주의!  : onKeypress 이벤트만 사용할것
          예) <input type="text" omKeypress="jsOnlyNumberKey();">
----------------------------------------------------*/
function jsOnlyNumberKey() {
    if ( event != null) {
      if ( event.keyCode < 48 || event.keyCode > 57 ) {
        event.returnValue = false;
      }
    }
}
/* 이전페이지로 이동 */
function jsBack(){
 history.go(-1);
}
/* 모래시계 보이게 하기 */
function jsVisible( str ){
 if( str == '1' )
  document.body.style.cursor='wait'
 else
  document.body.style.cursor='auto'
}
/* 15초후에 jsRefresh()라는 function을 호출 */
var timeId   = null ;
function jsRunAfterTime() {
 //15초 후에 Refresh
 timeId = setTimeout( "jsRefresh()", 15000 ) ;
}
/**
 * 소수점 아래 몇자리 이하 절삭.
 *
 * @param num 숫자
 * @param place 자리수
 * @return 절삭된 숫자
 */
function getCutNumber(num, place) {
 var returnNum;
 var str = "1";
 return Math.floor( num * Math.pow(10,parseInt(place,10)) ) / Math.pow(10,parseInt(place,10));
}
/* text의 좌우 공백을 제거해서 리턴*/
function trim(text) {
 if (text == "") {
  return text;
 }
 var len = text.length;
 var st = 0;
 while ((st < len) && (text.charAt(st) <= ' ')) {
  st++;
 }
 while ((st < len) && (text.charAt(len - 1) <= ' ')) {
  len--;
 }
 return ((st > 0) || (len < text.length)) ? text.substring(st, len) : text;
}
/* text의 좌측의 공백을 제거해서 리턴*/
function ltrim(text) {
 if (text == "") {
  return text;
 }
 var len = text.length;
 var st = 0;
 while ((st < len) && (text.charAt(st) <= ' ')) {
  st++;
 }
 return (st > 0) ? text.substring(st, len) : text;
}
/* text의 우측의 공백을 제거해서 리턴*/
function rtrim(text) {
 if (text == "") {
  return text;
 }
 var len = text.length;
 var st = 0;
 while ((st < len) && (text.charAt(len - 1) <= ' ')) {
  len--;
 }
 return (len < text.length) ? text.substring(st, len) : text;
}
/*--------------------------------------------------
  기능   : select box 를 CLEAR 시킨다.
  INPUT  : varObjFullNm : select box 객체
           varDeleteCnt : 첫번째 아이템 삭제 여부 결정
  RETURN : NONE
----------------------------------------------------*/
function cmInitSelectBox( varObjFullNm, varDeleteCnt ) {
 varObj = eval( varObjFullNm ) ;
 varObj.length = varDeleteCnt ;
}
/*--------------------------------------------------
  기능   :  select box 를 만든다.
  INPUT  : varObjFullNm :  select box 객체
           varText      :
           varValue     : 
  RETURN : NONE
----------------------------------------------------*/
function cmMakeSelectBox( varObjFullNm, varText, varValue ) {
 varObj = eval( varObjFullNm ) ;
 
 var empOption = null ;
 empOption = document.createElement("OPTION");
 empOption.text = varText ;
 empOption.value = varValue ;
 varObj.options.add(empOption);
}
728x90

'Information' 카테고리의 다른 글

JavaScript 키워드 정리  (0) 2007.02.24
[팁] .NET 로딩페이지 구현하기  (0) 2007.02.23
SOA(Site Open API) 활용법  (1) 2007.02.17
728x90

간만에 팁에 대한 글을 올리게 되네요. 어려운것도 아니지만, 대부분 이런 페이지를 구현하리라 생각은 했을 거라고 판단됩니다. 저두 의외로 쉬운 부분 같은데 아이디어가 잘 안 떠오르더라구요. 근데 이렇게 구현하니깐 상당히 이쁜 페이지가 되네요. 그럼 본론으로 들어가서...

 

페이지가 로딩될때 모든 데이터가 바인딩 되기전에 “페이지 로딩중...” 이런식으로 표현으로 먼저 보여주고 모든 데이터의 바인딩이 끝나게 되면 사라지게 되는거죠. 비스타에서도 이런 부분이 많이 적용된 걸로 알고 있는데요, 아직 많이 사용해보지 않아서 확답은 못하겠네요.

 

그래서 오늘 소개할 것은 비스타 처럼 페이지의 모든 데이터가 바인딩되기 전에 페이지 중간에 비스타에서 적용되는 이미지(동그랗게 돌아가는 gif 이미지죠)를 사용하여 구현해 볼까 합니다. 스텝바이스텝으로 가겠습니다. 죄송하지만 캡처는 귀차니즘이 발동하여 생략하겠습니다.

 

그럼 시작하도록 하죠.

 

참고로, 다음은 ASP.NET 1.1 with C# 기준입니다.

 

 

1. 아무런 이름으로 ASP.NET 프로젝트를 하나 만듭니다. 저는 LodingProject라고 하겠습니다.

 

2. Loading.aspx를 하나 만듭니다.

 

3. Loading.aspx에서는 아무런 작업을 할 필요가 없고, Loading.aspx.cs 파일을 열어봅니다.

 

4. 기본적으로 cs파일의 자동으로 만들어지는 코드에 굵게 된 부분을 주목하여 바꿔주세요.

 

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

 

namespace LoadingProject

{

             /// <summary>

             /// Loading에 대한 요약 설명입니다.

             /// </summary>

             public class Loading : PageBase

             {

                           private void Page_Load(object sender, System.EventArgs e)

                           {

                                        // 여기에 사용자 코드를 배치하여 페이지를 초기화합니다.

                           }

 

                           #region Web Form 디자이너에서 생성한 코드

                           override protected void OnInit(EventArgs e)

                           {

                                        //

                                        // CODEGEN: 이 호출은 ASP.NET Web Form 디자이너에 필요합니다.

                                        //

                                        InitializeComponent();

                                        base.OnInit(e);

                           }

                          

                           /// <summary>

                           /// 디자이너 지원에 필요한 메서드입니다.

                           /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.

                           /// </summary>

                           private void InitializeComponent()

                           {   

                                        this.Load += new System.EventHandler(this.Page_Load);

                           }

                           #endregion

             }

}

 

 

5. PageBase라는 것은 System.Web.UI.Page를 상속받는 클래스입니다. 따라서 PageBase라는 클래스를 하나 만듭니다.

 

 

6. 만들어진 PageBase 클래스에 다음과 같이 코드를 바꿔주세요

 

 

using System;

 

namespace LoadingProject

{

             /// <summary>

             /// PageBase에 대한 요약 설명입니다.

             /// </summary>

             public class PageBase : System.Web.UI.Page

             {

                           public PageBase()

                           {

                                        //

                                        // TODO: 여기에 생성자 논리를 추가합니다.

                                        //

                           }

 

                           protected override void Render(System.Web.UI.HtmlTextWriter writer)

                           {

                                        // 로딩이미지 설정

                                        Response.Write("<table id='waiting' width='100%' height='100%' style='position:absolute;visibility:hidden;' cellpadding=0 cellspacing=0 bgcolor='#ffffff'> ");

                                        Response.Write("<tr><td align=center valign='middle' width=100% height=100%>);

                                        Response.Write("<img src='img/loading01.gif' align='absmiddle' border=0>");

                                        Response.Write("</td></tr></table> ");

 

                                        //로딩중 이미지 보여주기

                                        Response.Write("<script language='Javascript'> ");

                                        Response.Write("waiting.style.visibility='visible' ");

                                        Response.Write("</script>") ;

                                       

                                        base.Render(writer);

                          

                                        //로딩중 이미지 숨기기

                                        Response.Write("<script language='Javascript'> ");

                                        Response.Write("waiting.style.visibility='hidden' ");

                                        Response.Write("</script>") ;

                           }

             }

}

 

7. 이미지가  지금 없기 때문에 “img”라는 폴더를 하나 만들어 첨부된 이미지를 그 폴더에 저장합니다.

 

이걸로 모든 준비는 끝났습니다. 그런데 테스트를 해보면 로딩 이미지가 보이지 않을 겁니다. 바인딩 될 데이터가 워낙에 없어서 그렇습니다. 작업하실때 위와같이 System.Web.UI.Page를 상속받는 PageBase라는 것을 만들어서 모든 aspx.cs파일은 상속을 받아서 사용하게 합니다. 이건 데이터가 많을 경우 아주 잘 보여질겁니다. 안된다고 상심마시고 바인딩이 많이 되는 페이지에 적용시켜 보세요. 아주 이쁘게 잘 나옵니다.

728x90

'Information' 카테고리의 다른 글

JavaScript 모음  (0) 2007.02.23
SOA(Site Open API) 활용법  (1) 2007.02.17
53 CSS Techniques you couldnt live without.  (0) 2007.02.17
728x90

[*] 문서

문서: SOA(Site Open API) 활용법
제작: ky (thruthesky) <thruthesky@yahoo.co.kr>, Korean
연락: thruthesky@yahoo.co.kr http://jangnans.com
날짜: 2006년 12월 초(배포 2007년 1월 초)
요약: 본 문서를 통해서 블로그와 Open API 가 무엇인지, 그리고 Open API 구체적인 산물인 SOA의 활용에 대해서 설명합니다. (특히, 원격 블로깅에 대해서 초점을 맞추어서 설명을 합니다.)
요약: Web2.0 의 주요 기능 중 하나인 Open API 와 그 한 종류인 Site Open API 에 대해서 설명합니다. SOA 는 개인의 웹사이트에서 직접 제공할 수 있는 막강한 Open API 입니다. 이제 Open API 는 더 이상 대형 웹 사이트의 전유물이 아닙니다.
대상: 웹 서핑의 초보자에게는 블로그와 원격 블로깅에 대해서 설명을 합니다. 고급자에게는 Open API 와 SOA 의 전반적인 소개와 활용에 대해서 안내를 합니다.
문서의 시작 위치: http://jangnans.com
참고: http://siteapi.kldp.net
기타: 본 문서의 배포 시작 위치는 http://jangnans.com 입니다. 본 문서의 변동 사항은 이 곳에서 확인을 하실 수 있습니다. 본 문서를 재 배포하시는 것은 고마우나 이 주소를 삭제하시면 이 글을 읽는 분이 새로운 내용을 확인하지 못할 수 있으니, 본 주소는 삭제하지 마세요.
기타: Open API 에 대해서 많은 내용이 있습니다. 보다 자세한 정보를 제공하기 위해서 여러곳으로 링크를 통해 웹 페이지를 연결해 놓았습니다. 링크가 잘못된 것이 있거나 수정해야할 부분이 있으면 연락 주십시오.  (원격 편집을 바탕으로 블로그 관련 Open API 와 SOA 대해서 설명을 합니다.)

[-] 성질 급하신 분들을 위한 간추림

본 문서는 원격 블로깅과 중/소형 사이트를 위한 Site Open API 에 대해서 설명을 합니다.
원격 블로깅 실제 예제와 체험을 원하시면, http://jangnans.com/?cate=bbs&mode=read&idx=290 페이지를 참고하십시오. 원격 블로깅이 무엇인지 모르는 분은 꼭 이 링크를 따라서 체험을 해 보시길 권합니다. http://memories24.cafe24.com/zb5/tt2zb5.php?article_srl=827&PHPSESSID=96e93768e0179b071d4a117b27b3975a
Site Open API 에 대해서 알고 싶다면, http://siteapi.kldp.net 을 참고하십시오.
XML-RPC 에 대해서 알고 싶다면, http://xmlrpc.com 을 참고하십시오.
Blogger API, Meta Weblog API, Movable Type API 에 대해서 알고 싶다면, http://www.xmlrpc.com/metaWeblogApi 를 참고하십시오.
혹시 XML-RPC 나 Site Open API 와 관련하여 개발에 관심이 있다면, http://phpxmlrpc.sourceforge.net/
Site Open API 는 중,소형 사이트(홈페이지)에 강력한 Open API를 제공합니다. SOA 버젼 0.4에는 Blogger API, Meta Weblog API 를 포함합니다.
2006 년 말 현제 Site Open API 를 사용가능 한 홈페이지는 제로보드4 로 제작된 홈페이지, 제로보드5 로 제작된 홈페이지, 그누보드4로 제작된 홈페이지, 알지보드로 제작된 홈페이지, 장난-홈툴즈로 제작된 홈페이지 들입니다.
Site Open API 와 호환이 가능한 윈도우즈 응용 소프트웨어는 무궁무진합니다. 본 문서의 관련 항목을 참조하십시오.


[-] 문서에 대해서
본 문서는 본인이 생각하는 Open API와 Site Open API 에 대해서 개인적인 생각을 기록했습니다. 물론 많은 분들에게 도움이 되기를 바랍니다.
혹시나 본 문서에 대해서 고쳐야할 점이 발견되면 꼭 연락을 주십시오.
카이(ky, thruthesky, <thruthesky@yahoo.co.kr>, http://jangnans.com)


[*] 서문
본 문서는 홈페이지의 정보를 이용하는데에 웹브라우저가 전부라는 것에 대한 개념을 깨뜨리고 그 보다 편하고 낳은 방법으로 인터넷을 즐기는 또 다른 방법에 대해서 가르켜줍니다.
뿐만 아니라 여러분의 홈페이지 방문자(사용자,회원)가 어떻게 더 낳은 방법으로 홈페이지의 정보를 이용할 수 있는지에 대해서 알려드립니다. 이 방법을 통해서 여러분의 홈페이지에 많은 극성팬이 생겨나기를 바랍니다.

어느 리서치에서 블로깅을 하는데에 사용하는 툴 중 60.9% 가 웹브라우저이고 나머지가 데스크탑 응용프로그램이라고 합니다. 상당히 부풀려진 결과라 생각합니다.
본인은 블로거들 중 90% 이상이 웹브라우저로 블로깅을 즐기고 있다고 판단합니다.
그러나 원격 블로깅 툴의 열기는 계속해서 급 상승 중입니다.

본 문서는 블로그와 관련된 개념의 정립과 블로깅을 좀 더 손쉽게 할 수 있는 방법을 제시할 것입니다. 그러기를 희망합니다.

블로깅과 관련된 좀 어려운 용어들을 살펴볼까요? 트랙백, RSS, Open API ... 본인이 잠깐 자리를 비운 사이에 인터넷은 많은 발전을 해 있더군요. 특히, 트랙백에 대한 개념이 잡히지 않아서 본인을 괴롭게 했었습니다.
본 문서에서는 이러한 것들에 대해서 약간의 설명을 합니다.
그리고 원격 블로깅과 관련된 XML-RPC, Open API, Blogger API 에 대해서도 짧게 설명합니다.




[-] 요점 정리
본 문서를 통해서 독자들에게 알리고 싶은 주요 내용은 다음과 같습니다.
- 블로그 Open API 를 통한 편리한 블로깅
- SOA(Site Open API)라는 막강한 Open API 를 여러분의 개인 홈페이지에 부착시키는 방법




[-] 블로깅

블로그란 web+log 가 합해져서 blog 로 표기되며, 네티즌이 자신의 관심사에 따라 자유롭게 칼럼, 일기, 취재 기사 따위를 올리는 웹 사이트를 말합니다. 흔히 말하는 1인 미디어의 대표적인 형태라 하겠습니다.

사전적 의미로 블로깅이란 다른 사람의 블로그에 방문하여 글을 보거나, 스크랩하여 자료를 모으는 것으로 모든 블로그 활동을 하는 것을 뜻하는 말로 사용됩니다.

블로그가 어떤 형식을 가져야한다는 규격이 없습니다. 있나요? 본인은 없다고 생각을 합니다. 블로그가 웹 게시판 1개로 구성이 되든, 블로그의 성격에 따라 자료실이나 기타 여러가지 형태의 구조를 가지든, 블로그를 운영하는 사람 마음이라 판단을 합니다. 하지만, 일반적으로 블로그는 자료실이나 게시판이 없이 블로그 운영자만 글을 쓰는 웹 페이지 형태로 간단하게 구성됩니다.


[-] XML-RPC
어려운 이야기입니다. 쉽게 한줄로 설명하고 넘어가겠습니다.
MS-윈도우즈 운영체제에서 유닉스에 존재하는 프로그램을 실행하는 것을 RPC(Remote Procedure Call)라 합니다. 그리고 이것을 인터넷에서 사용되는 XML(eXtended Markup Language)를 바탕으로 데이터를 교환하는 것을 XML-RPC 라고 합니다. XML-RPC 는 이렇게 웹브라우저(또는 웹 클라이언트)가 웹서버와 정보를 교환하는 방식중 하나입니다. 물론 표준이며 자세한 정보는 http://xmlrpc.com 에서 얻을 수 있습니다.
블로그에서 XML-RPC 는 Open API 서비스하는 바탕이됩니다.


[-] 웹 2.0
2006년 말 현재, 많은 이들이 웹 2.0 이라고 목소리를 높입니다. 웹 2.0 대열에 끼지 못하면 괜시리 뒤쳐지는 느낌을 받을 때 입니다. 과거 인터넷 투기 열풍(닷컴 거품 현상)으로 나라가 떠들썩했던 것이 연상됩니다. 뭐 어쨌든 나쁜 현상은 아니라 생각합니다.

웹 2.0 은 현재 표준이 없습니다. 너무 광범위 해서 표준이 안잡힐 것 같습니다.
아참, 한줄 정의가 필요하나요?
웹 2.0은 기존의 웹(WWW)보다 한단계 발전된 모습을 가르키는 것으로서 좀 더 낳은 기능들을 묶어서 서비스하는 것을 말합니다.

웹 2.0 의 기능으로 Ajax 니 뭐니... 주욱 나열하면서... 꼭 빠뜨리지 않고 포함되는 것 하나가 바로 Open API 입니다.

참고: http://blog.naver.com/quiz94/30004276107
참고: http://blog.naver.com/wooseokint1?Redirect=Log&logNo=110011276684

[-] UCC

UCC 가 뭐냐고 스스로 질문을 하고 UCC 는 그저 UCC 일 뿐이라고 결론을 낼지 모르겠습니다. 사실 우리나라 사람들이야 UCC 를 확대해서 복잡하게 해석할 뿐이지, UCC 는 그냥 User Crecated Contents 로서 그 이상도 아니고 이하도 아니라고 판다는하는게 100% 맞다고 생각을 합니다. 다만 현재(2006년 말) 흔히 얘기하는 UCC는 그 결과물의 형태가 동영상이라는 것을 중심으로 얘기합니다. UCC 를 통해서 스타가 탄생했다느니 양질의 UCC 제작을 위해서 서포트하는 서비스가 많이 등장했다느니, 기존의 이미지, 유머, 패러디, 이야기 만화, 댓글 등의 컨텐츠를 한단계 업그레이드 시켜 자신을 가장 잘 나타내기 위한 방법으로서의 UCC 니, UCC 의 저작권으로 인해서 수익을 창출한다느니, 차세대 비즈니스 모델이라니... 말이 많습니다.
UCC 는 UCC 일뿐입니다. 물론 여러가지 활용도가 있겠지만, 현재로서는 특별히 새로운 것 없이 단순히 기존의 사용자 컨텐츠를 통칭하는 용어 정도 입니다.
UCC 가 기존의 블로그를 대체하는 새로운 미디어로 떠오르며 각광을 받는다는 이야기가 있습니다. 어불성실입니다. UCC 는 UCC 고 블로그는 블로그일 뿐입니다. 둘의 연관 관계가 전혀 없는 것은 아니지만, 이런식의 억지 설정은 참으로 곤란한 일입니다.
그러나 이렇게 간단히 UCC 에 대해서 결론을 짓고 넘어가기에는 UCC 에 대한 인터넷의 열기가 너무 뜨겁게 달궈져 있습니다. 비록 새로운 것이 없는 UCC 이지만, 새로운 이름 UCC 를 통해서 변화를 시도하는 움직임이 너무 거셉니다.

http://blog.naver.com/hongjig?Redirect=Log&logNo=150011261731


[-] Open API
Open API 란? (한줄정의) 홈페이지 내의 유용한 정보를 홈페이지 외부에서 손쉽게 사용할 수 있게 해주는 기능입니다.
예를 들어, 자신의 집(또는 회사)를 찾아오게 하기 위해서 지도 서비스 홈페이지로 부터 지도를 제공받아서 자신의 홈페이지에 걸어놓을 수 있습니다.
다른 예로, ... 검색엔진의 검색어를 입력하고 결과를 보는 페이지를 자신의 홈페이지에 넣을 수 있습니다. 이러한 것이 하나의 Open API 입니다.
이러한 Open API 는 아주 오래전 부터 존재 해 왔던 웹사이트의 주요 서비스로 조용하면서도 끈질긴 생명력으로 최근까지 애용되고 있습니다. 최근에 웹 2.0의 주요 기능 중 하나로 꼽히면서 Open API 기능에 대한 효과를 인정 받고, 웹 서비스의 전면부로 나왔습니다.
과거에는 각 사이트에 개별적으로 간단한 인터페이스로 사이트내의 정보를 외부와 연결을 하였습니다. 물론 대형 서비스 업체들은 그에 걸맞은 스펙(규격 문서)을 제공하며 보다 낳은 서비스로 많은 유저를 확보하려고 노력을 해 왔습니다. 1990년 대 웹의 시작 시점부터 Open API 에 대한 표준 제정에 대해서 많은 움직임이 있었습니다만, 1990년 후반부에 들어서 Open API 의 표준이 하나씩 생겨나기 시작했습니다.

국내의 대형 포털사이트들은 이미 많은 Open API 를 제공하고 있으며 이를 바탕으로 사용자들이 보다 더 쾌적한 환경에서 정보 서비스 이용을 하고 있습니다.
대한민국의 1,2 위 순위를 다투는 최고의 사이트들은 각 사이트의 Open API 를 경쟁적으로 사용자들에게 제공하기 시작을 했으며 국내 최고라고 꼽는 인터넷(웹사이트) 업체를 예로 들자면, 개별 사이트 이용자들에게 어떻게 자사의 웹사이트에서 제공하는 Open API 를 활용할지에 대한 방법을 상세히, 그것도 CGI를 구성하는 스크립트 언어적인 설명을 포함해서 하는 것을 보니 왠지 사용자를 배려한다는 느낌보다 그렇게까지 해서라도 사용자를 참여시키려는 집착에 놀라울 따름입니다.

Open API ... 무엇인지 느낌으로 와 닿나요? 그렇지 않다면 한줄 정의를 외우세요.
더 알고 싶으시면, 검색 엔진에서 "Open API" 라고 쳐보세요. 정보는 널렸습니다. 굳이 몇가지 이곳에 링크를 기록하는 이유는 여러분들의 검색 시간을 덜고 좀 더 정확하고 알찬 정보를 제공하기 위해서입니다. 아래의 링크들을 확인하시면 Open API 의 열기가 얼마나 뜨거운지 아실것입니다.

http://www.newswire.co.kr/read_sub.php?id=198312&ca1=전자통신-
http://issue.nida.or.kr/board/007/060928153203001001.pdf
http://blog.naver.com/dasantea/30722991
http://www.hometown.co.kr/64
http://channy.creation.net/blog/?p=299
http://kr.ks.yahoo.com/service/ques_reply/ques_view.html?dnum=JAK&qnum=4650154&kscookie=1

[-] 표준 규격
(IETF(인터넷 엔지니어링 태스크 포스) 는 인터넷 기술 관련 표준을 정의하는 주체입니다. IETF 는 IAB(인터넷 아키텍쳐 위원회) 의 감독하에 표준을 제정합니다.)

XML-RPC 에 표준이 있듯 Open API 에도 표준이 있습니다. 이미 많은 표준 규격이 정의 되었으며 그 표준 규격을 바탕으로 지금도 많은 사이트에서 Open API 를 작성하고 사용자들에게 제공을 하고 있을것입니다. 그러나 개별 사이트에 꼭 맞는 Open API 규격은 현재로서는 찾을 수 없습니다. 새로운 규격이 필요하며 Site Open API 가 그 한 부분을 담당할 것입니다. 물론 Site Open API 는 표준(국제 표준이나 인터넷 표준)으로 등록되지 않았으며 실무 표준이라고도 얘기하지 않습니다. 하지만 개별 사이트를 위해서 Open API 의 기능을 하기 위해 규격된 Site Open API 는 서버와 클라이언트 구현물이 있으며 서버 개발과 클라이언트 개발에 도움을 제공하고 있는 것이 사실입니다. 만약 자사이트에 Open API 제공이 필요하다면 이미 시행착오를 겪으면서 규격된 Site Open API 를 선택하는 것은 어떨까요?




[-] SOA ( Site Open API )
Site Open API 는 정보를 다루는 공간을 블로그나 홈페이지에 국한하지 않고, 보다 넓은 영역에서 사용이 가능하도록 기존 XML-RPC 구현물(API)들의 기능을 보완, 확장하였으며 (혹은 진행중에 있으며) 많은 영역에서 다루어지는 정보를 보다 자유롭게 교환하기 위해서 개발된 XML-RPC 바탕의 새로운 Open API 입니다.
XML-RPC 에 대한 자세한 내용은 http://www.xmlrpc.com/http://www.xmlrpc.com/spec 를 참고하기 바랍니다. XML-RPC 에 대한 구현물(개발 방법, 개발 라이브러리)에 대해서는 http://www.xmlrpc.com/directory/1568/implementations 를 참고하십시오.
SOA 에 대한 정보는 http://siteapi.kldp.net 을 참고하십시오.

SOA 는 여러분의 홈페이지에 강력한 Open API 기능을 제공할 것입니다. Open API 는 더 이상 대형 사이트의 전유물이 아닙니다.

SOA 로 뭘 할 수 있을까요?
- SOA 는 Blogger API, Meta Weblog API 를 포함합니다. 이것은 곧 모든 블로깅 관련 툴을 사용할 수 있다는 뜻입니다.
- 여러분의 홈페이지를 위해서 SOA 만의 특별한 메소드가 존재합니다. 주요 기능은 홈페이지 정보의 검색입니다. 사용자 정보 검색, 글 정보 검색, 쇼핑몰 정보 검색 등 많은 정보를 외부에서 접근하게 할 수 있습니다.



[-] Blogger API, Meta Weblog API

Blogger API 는 블로그 사이트를 위해서 제작된 표준 XML-RPC 규칙을 따르는 하나의 완전한 Open API 입니다. Blogger API 는 오래전부터 최근까지 계속해서 발전을 하고 있습니다.
초기 Blogger API 의 기능을 보강한 것이 Meta Weblog API 입니다. 엮시 표준 XMLRPC 규칙을 준수합니다.
이러한 Open API 는 웹서버에 설치가 되어 서버의 역활을 합니다. 이를 통해서 블로그의 정보를 데스크톱 응용 프로그램으로 편집할 수 있습니다.
블로그 사이트의 정보에 접근(기록, 편집)하는 편집기들은 블로깅 클라이언트입니다. '원격 블로깅 툴(편집기)'이라는 표현을 쓰는 것이 올바르겠습니다. 이러한 편집기 프로그램은 무수히 많습니다. 소프트웨어 업체들이 앞다투어서 편집기를 선보이고 있습니다. 왜일까요? 그만큼 가치가 있고 블로거들이 선호를 하고 있기 때문입니다. 원격 블로깅 편집기에 대해서 자세한 것은 본 문서의 다른 항목을 참고하시기 바랍니다.

국내의 유명 블로그 제공 사이트에서 이 Open API 들을 100% 그대로 제공하면서 자사이트의 이름을 붙여 EGLOOX+ API(가칭) 로 소개한 바 있습니다. 물론 이것 하나만으로 많은 인기 몰이를 했습니다. 그 이유는? 당연히 그만큼 그 활용성이 인정되어서지 않을까 생각을 합니다.

요점정리를 해볼까요?
블로그와 관련된 Open API 로서 Blogger API, Meta Weblog API 가 있습니다. 이러한 것들은 XML-RPC 표준을 따릅니다. 이 Open API 를 통해서 원격 블로깅이 가능합니다.

그 외,
Blogger API, Meta Weblog API는 Site Open API 속에 모두 포함이됩니다. 따라서 Site Open API 서비스를 하는 홈페이지는 원격 블로깅이 가능하다는 것을 뜻합니다. 뿐만 아니라 SOA 만의 많은 기능을 그대로 이용할 수 있습니다.



[*] 원격 홈페이지 편집

"홈페이지를 편집한다." ... ?? 좀 더 명확하게는 "홈페이지의 내용물(정보)을 편집한다." 입니다.

이 문서에서 원격 블로깅을 하는 방법에 대해서 자세한 설명을 하지 않습니다. 그러나 충분한 개념과 그리고 관련된 유익한 정보를 얻을 수 있는 링크를 제공할 것입니다.

홈페이지 내용물을 편집하는데에는 여러가지 방법이 존재합니다. 홈페이지의 HTML 파일을 FTP 를 통해서 다운로드 해서 편집을 한 다음 다시 FTP 를 통해서 업로드하면 됩니다. FTP 를 지원하는 편집기에서는 다운로드/업로드 과정이 필요 없을 수 있습니다. 위즈위그 편집기라면 더 바랄것이 없죠. 이러한 사용자의 요구를 통해서 점점 쉽게 변했습니다. 편집기에서 FTP 를 직접 지원하고 위즈위그 기능을 제공합니다.
홈페이지의 HTML 파일 뿐만 아니라, 게시판의 내용을 변경하고자 한다면 어떻게 하면 좋을까요? 웹브라우저로 편집하면 되겠죠. 웹브라우저로 편집하는게 불편하지만 이미 손에 익어 있습니다.
그러나 점점 쉽게 변해가고 있습니다. 웹브라우저 내에 위즈위그 편집기가 포함이 됩니다. DHTML, XHTML 등등을 넘어서 ActiveX 컴포넌트, 또는 웹브라우저 자체에 편집기능을 포함하는 것도 있습니다.

홈페이지의 정보를 편집하는데에 있어서도 많이 편해졌습니다. 최근에는 Open API 를 통해서 훨씬 많이 편해졌습니다. 윈도우즈 응용프로그램을 통해서 직접 게시물을 수정할 수 있습니다.

본인이 직접 작성한 블로그 편집기가 있습니다. 윈도우즈 XP 에서 실행이되며(기타 운영체제에서 테스트되지 않았습니다.) 위즈위그 HTML 편집 기능을 포함합니다. 명칭은 '장난'입니다. '멀티 블로깅 툴-장난' 이라고 불려지고 싶구요, 한번 글 쓰기로 수십 수백개의 블로그에 글을 기록할 수 있습니다. 자세한 정보은 http://jangnans.com 을 참고하십시오.
(http://jangnans.com/?cate=bbs&mode=read&idx=289)

MS 사에서도 여러가지 편집기를 내 놓고 있습니다. MS 워드 프로세스 뿐만 아니라, Windows Live Writer 등 많은 편집기를 출시하고 있습니다. 이런 편집기들은 모두 Open API 를 지원합니다. 따라서 이런 툴을 이용해서 문서를 편집한 뒤 곧바로 게시판이나 블로그에 글을 등록할 수 있습니다.
MS 사 뿐만 아니라 국내의 많은 기업에서 웹 편집기를 쏟아내고 있습니다. 본인이 개인적으로 멀티 블로깅 툴을 만들 정도인데, 기업들이야 오죽하겠습니까. 많은 편집기가 유료 또는 무료로 사용이 가능합니다.

[-] 원격 블로깅

위 항목에서 설명한 '블로깅', '원격 홈페이지 편집'과 별 차이 없는 항목일 수 있습니다.

그러나 개념적인 방법을 정리해봅시다.

일반적으로 블로그에 글을 쓰기 위해서는 웹 브라우저로 블로그 사이트에 접속을 해서, 로그인을 하고, 글 쓰기 버튼을 클릭한 다음, 글을 쓰고 출판을 하게됩니다.
전혀 어려운것 없죠? 너무나 자연스러운 부분입니다. 사실은 아주 불편한 방법이지만, 너무나 익숙해져 버린 나머지 불편한 것인지 조차 판가름을 할 수 없습니다.

원격 블로깅은 윈도우즈에서 실행되는 응용 프로그램을 실행해서 글을 쓰고 저장을 하는 것입니다. 맨 처음에 블로그 정보를 기록하기 위해서 EndPoint 와 아이디, 비밀번호를 기록해야하며 필요한 경우 그 외에 몇가지 설정을 더 해야합니다.

너무나 불편한 웹브라우저로 글을 쓰는 것은 너무나 익숙해져 있는데, 아주 편한 원격 블로깅 툴로 글을 쓰는 것은 조금도 익숙하지 않아 불평이 이만 저만이 아닙니다. 원격 블로깅의 길이 너무 어려운 나머지 원격 블로깅을 하는 블로거들에게 욕을 바가지로 퍼붓습니다. 왜 익숙한 웹 브라우저를 놔 두고, 사서 고생을 하느냐구...

처음 하시는 분들에게는 엮시나 쉽지가 않습니다. 도움이 되기를 바라며 여기서는 개념에 대해서 설명을 하겠습니다.
우선 자신의 블로그에 글을 쓰기 위해서는 아이디와 비밀번호가 있어야합니다. 이것은 웹 브라우저로 블로그에 글을 쓰나 원격 블로깅 툴을 통해서 글을 쓰나 마찬가지입니다. 꼭 필요한 것입니다. 그리고 블로그 사이트 주소가 있어야합니다. 웹브라우저로 글을 쓰나 원격 블로깅 툴을 통해서 글을 쓰나 마찬가지인 부분입니다.
이것이 끝인가요?
네, 그렇습니다. 라고 말씀드리고 싶지만, 남은 것이 있습니다.
잘 만들어진 블로그 사이트의 Open API 와 잘 만들어진 원격 블로깅 툴의 만남이라면 이것이 끝입니다. 그러나 그렇지 못한 경우에는 다음과 같은 과정이 추가로 필요합니다.

- EndPoint 의 기록
- Open API 의 선택

원격 블로깅을 할 때에는 EndPoint와 OpenAPI의 선택이 필요합니다. 잘 만들어진 경우에는 이러한 것들이 자동으로 설정이 됩니다. 그러나 잘 만들어지지 못한 경우에는 수동으로 설정해야합니다. 그리고 이러한 정보는 사이트 관리자에게 물어서 알아내어야합니다.

정리해볼까요?
원격 블로깅을 하기 위해서는 블로그 사이트 주소, 아이디, 비밀번호가 필요합니다.
특별한 경우에는 EndPoint 와 OpenAPI 의 선택이 필요합니다. 이 정보는 사이트 관리자가 알고 있습니다.
이러한 정보를 원격 블로깅 툴에 설정을 하고, 글을 쓰면됩니다. 글을 편집하는 부분에 있어서는 웹브라우저보다 훨씬 낳은 느낌을 제공할 것입니다.



[-] 원격 홈페이지 편집 실제 예
블로그 Open API 는 블로그의 정보 편집 기능을 제공합니다. Site Open API 에는 블로그 Open API 가 포함이됩니다. Site Open API 는 블로그가 대상이 아니라, 사이트(홈페이지)가 대상입니다. 따라서 Site Open API 를 통해서 블로깅을 하는 것은 블로그의 정보를 편집하는 것이아니라 홈페이지의 게시물 같은 내용을 편집하는 것입니다. 블로그의 글을 편집하는 것이 아닌 자신의 홈페이지(또는 자긴이 가입된 홈페이지), 사이트라고 생각을 하면 됩니다.

원격 홈페이지 정보의 편집, 또는 원격 블로깅 방법에 대해서 궁금하시죠?
여기 그 정보가 있는 링크를 제공합니다.

       http://thruthesky.webzero.co.kr/?cate=bbs&mode=read&idx=290

위 링크된 페이지에는 테스트용 글쓰기를 위한 준비가 되어 있습니다. 위 페이지의 설명에 따라 글을 등록해 보시면 누구나 손쉽게 원격 블로깅에 대해서 알 수 있을 것입니다.




[-] 추천 원격 블로깅 툴

다음은 여러분들에게 추천하는 웹 편집기입니다. 블로깅을 하신다면, 꼭 한번 사용해 보십시오. 아마 환장할 것입니다.

** MS 사의 윈도우즈 라이브 라이터(Windows Live Writer)
       MS 사의 제품을 소개하고 싶지는 않습니다. 하지만, 수십가지의 원격 사이트 편집기를 사용해 본 결과 가장 잘 만들어졌다고 개인적으로 판단이됩니다.        
       http://windowslivewriter.spaces.live.com/
       http://nosyu.egloos.com/2732428
       http://www.choboweb.com/2006/11/02/%ec%96%b4%eb%96%a4-%eb%b8%94%eb%a1%9c%ea%b7%b8-%ec%97%90%eb%94%94%ed%84%b0%eb%a5%bc-%ec%93%b0%ec%8b%9c%eb%82%98%ec%9a%94-windows-live-wirter/
       http://idealist.egloos.com/2710808

** Zoundry 블로그 Writer
       사용하기가 쉬운편은 아니나, 사용해 본 것 중 가장 넓은 API 범위를 지원한다고 생각합니다.
       http://www.zoundry.com/download.html

** 퍼포먼스 (Performance) 파폭 에드온(Fire Fox Addon)        http://performancing.com/firefox

** 장난 - 멀티블로깅 툴
       http://lopy.egloos.com/498800
       특징: 멀티 블로깅(한번의 글 쓰기로 수십, 수백개의 블로그에 글 등록), 여러개의 글 한번에 삭제.



[-] 추천 하지 않는 편집기들. 그나마 쓸만 한 것들.
Site Open API 테스트를 위해서 직접 사용해 본 것들이다. 실제로 사용에 어려움이 있는 것들이 많았으며,
** Qumana http://www.qumana.com/download.htm


[0] 그 외 편집기들 (사용해 보지 않았거나 사용에 불편함이 있는 것들)

** MS Word 2007
       http://plaming.egloos.com/2875028
       http://www.zziuni.pe.kr/zziuni/346
** ecto http://ecto.kung-foo.tv/
** 나모웹에디터
** Lycos의 블로깅 툴, Qumana http://lycos.qumana.com/
** Zoho Writer http://writer.zoho.com/jsp/home.jsp
** BlogJet http://www.blogjet.com/
** BlogDesk http://www.blogdesk.org/
** w.bloggar http://wbloggar.com/
** RocketPost 2 http://www.anconia.com/rocketpost/
** Semagic http://semagic.sourceforge.net/
** MySpace Blog Editor https://addons.mozilla.org/firefox/3229/
** WB Editor http://www.wbeditor.com/
** Post2Blog http://www.bytescout.com/post2blog.html
** xfy Blog Editor http://www.xfy.com/personal/blog/
** Bleezer http://larryborsato.com/bleezer/
** Blog Editor http://blog-editor.qarchive.org/downloads.html
** Alive Diary http://www.tucows.com/preview/411931
** Writely (Google Docs) http://www.writely.com/
** http://multiblog.skinmaster-co-uk.qarchive.org/

[-] 기타 블로그 Open API 관련 소프트웨어들
** http://www.newfreedownloads.com/Web-Authoring/Website-Promotion/Blog-Blaster.html
** http://www.stardock.com/products/blognavigator/
** http://www.coffeecup.com/flash-blogger/


[*] SOA (Site Open API)

Open API 는 상당히 매력적인 것입니다. 우리가 현재 사용하고 있는 원격 블로깅 툴만 봐도 그 위력을 쉽게 알 수가 있습니다.
그동안 Open API 는 대형 인터넷 서비스 업체의 전유물로 인식이 되어왔습니다. 최근에는 국내의 설치형 블로그 소프트웨어 제작 사이트에서 블로그 Open API 의 기능을 기본적으로 제작해서 제공을 하고 있습니다.
하지만, 개별 사이트에서 Open API 를 제공하기란 만만치가 않습니다.
그러나 전혀 불가능한것도 아닙니다. 여기 SOA 가 있습니다. SOA 는 현제 http://siteapi.kldp.net 에서 개발이 이루어지고 있으며, 2006년 말 기점으로 제로보드4, 제로보드5, 그누보드4, 장난-홈툴즈, 알지보드 를 통해서 운영되는 홈페이지들은 모두 SOA 를 이용할 수 있습니다. 만약 여러분의 홈페이지(또는 블로그, 쇼핑몰)이 이러한 홈페이지 프로그램을 바탕으로 운영이 되고 있다면 지금 즉시 여러분의 홈페이지에 강력한 Open API 를 제공할 수 있습니다.
여러분의 홈페이지에 좀 더 낳은 기능을 제공하기 위해서 SOA 는 계속해서 변하고 있습니다. 혹시 여러분의 홈페이지에 맞도록 SOA 가 변경되지는 않았을까요? http://siteapi.kldp.net, http://jangnans.com 을 방문해서 살펴보십시오.

SOA 의 주요 기능은 아래와 같습니다.
- 다수의 사이트를 위한 정보의 규격.
- 사이트 내의 정보 검색.
- 사이트 내의 정보 편집. (원격 블로깅 툴과 같은 편집기로 홈페이지의 내용을 직접 편집)
- 사이트간의 정보 교류(연결).


물론 위에 나열된 대부분의 기능들은 대형 인터넷 서비스 사이트에서는 자체적으로 개발을 해서 제공을 하는 기능들입니다. 그러나 Site Open API 는 한 개인의 사이트가 아닌 많은 사이트들이 손 쉽게 이용할 수 있도록 규격되었습니다.

Site Open API 를 가장 잘 활용하는 소프트웨어 중 하나는 '사이팅'입니다. 사이팅은 실시간으로 홈페이지의 새로운 정보를 감지 할 수 있습니다. 예를 들어 홈페이지에 새로운 가입자나 새로운 글이 등록되었을 때, 웹브라우저의 도움 없이 실시간으로 그 정보를 확인할 수 있습니다. 실시간 홈페이지 모니터링 툴 '사이팅'은 http://jangnans.com 에서 얻을 수 있습니다. 본인의 경우 홈페이지가 여러개 됩니다. 사이팅 소프트웨어를 이용해서 여러개의 홈페이지들의 새로운 정보를 실시간으로 확인을 합니다. 누가 가입했는지, 어디 홈페이지에서 어떤 글이 올라왔는지, 광고글이 올라오지는 않는지... 홈페이지가 아무리 많아도 실시간으로 확인을 할 수 있습니다.


SOA 를 이용한 사이트간의 정보 교류는 포괄적인 의미의 기능입니다. 구체적인 내용은 http://jangnans.com 에서 얻을 수 있습니다.

위에 나열된 SOA 의 기능이 어쩌면 2006 년 말 현재의 주요 기능일지 모르겠습니다. 지속적인 개발이 이루어지고 있으며 영역을 넓혀가고 있습니다. http://jangnans.com 의 '장난 - 홈툴즈' 프로그램을 통해서 SOA 가 처음 제작되며, 차츰 다른 유명한 홈페이지 게시판 프로그램을 바탕으로 포팅을 하고 있습니다. 자신의 홈페이지에 직접 SOA 를 추가하기 위한 프로그래밍을 하거나 다른 플랫폼이나 언어를 통해서 구현을 원하시는 분은 연락을 주십시오. 도움이 될 수 있기를 바랍니다.

요점 정리 한번 할까요?
SOA(Site Open API)는 대형 사이트 뿐만 아니라, 중,소형 개인 사이트를 위해서 Open API 서비스를 위한 규격입니다. 국내의 유명 홈페이지 게시판 프로그램들에 기본적으로 제공이됩니다.


[*] 주의점

원격 블로깅이나 기타 Open API 와 관련된 작업을 할 때에 아이디와 비밀번호를 기록해야한는 경우가 있습니다., 이때 잘못된 생각을 가지고 아이디와 비밀번호를 다른 용도로 사용하는 툴이 있을 수 있습니다. 특히, 인증되지 않은 사이트에서 원격 블로깅이 가능하게 한다며 아이디와 비밀번호를 입력하라는 경우가 있습니다. 실제로 가능한 경우이며 이런 이유로 국내 대형 블로그 사이트가 Open API 의 서비스를 중지한 일이 발생했습니다.
어떠한 경우에서든지 타 사이트(잘 모르는 사이트)에 자신의 아이디와 비밀번호를 기록해서는 안됩니다. 물론 데스크톱 응용프로그램이라고 해서 100% 안전한 것은 아니지만, 하지만 그런 위험적인 요소가 훨씬 줄어듭니다.


[*] 기타

[-] Open API 관련 개발

Open API, XML-RPC 작업에 관심이 있다면, 다음의 링크를 참고하십시오.
xmlrpc & xml :
http://trio.co.kr/webrefer/xml/xml10.html

xmlrpc & RSS 2.0 :
http://kin.naver.com/knowhow/entry.php?d1id=8&dir_id=8&eid=9xPAUaXu6DWZw1UzR30Nu8IdmgsDgGgi
http://cafe.naver.com/bindung.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=117
http://blogs.law.harvard.edu/tech/rss

xmlrpc & Blogger API 프로토콜 :
http://www.blogger.com/developers/api/1_docs/
http://xmlrpc.free-conversant.com/docs/bloggerAPI

xmlrpc & metaWeblog API 프로토콜 :
http://www.xmlrpc.com/metaWeblogApi
http://www.xmlrpc.com/spec
http://blogs.labo-dotnet.com/vlad/services/metablogapi.aspx
http://www.sixapart.com/developers/xmlrpc/metaweblog_api/metaweblognewpost.html
http://txp.kusor.com/rpc-api/metaweblog-xml-rpc-api

기타 참고 :
http://en.wikipedia.org/wiki/MetaWeblog

[-] 보안

Site Open API 는 타 Open API 나 웹 서비스와 마찬가지로 HTTP 프로토콜을 사용합니다.
따라서 기존의 웹 브라우저를 놓고 보안의 위험성에 대해서 비교를 한다면, 웹브라우저보다 조금도 덜하거나 더하지 않습니다. 왜냐하면 Site Open API 그 자체가 기존의 웹브라우저 환경과 동일하기 때문입니다. 링크를 참조해 보십시오. 도움을 될 것입니다. 를 참고하십시오.

728x90
728x90
728x90
728x90
반드시 읽어봐야 할 책!!


728x90
728x90
FreeMind 는 사용에 제한이없는 Freeware이며 GPL을 준수합니다.
마인드맵이란 머리속에서만 떠올려지는 각종 생각의 핵심주제들을 나열, 서로 연관시킴으로써 인간의 사고를 체계적으로 도식화하기 위해 창안된 기법입니다.

Freemind 의 문서는 크게 노드(node), 가지(branch)로 구성됩니다. 노드란 어떠한 생각(여러개의 가지)이 뻗어나가는 점이며, 가지란 생각의 집합입니다.

아래는 제가 보안에 대해 마인드맵형태로 정리해본것입니다.
Freemind로 작성해보았습니다.   그리고 이것을 다시 pdf로 내보내기를 해보았습니다.
물론 아직 정리중이라서  대충적었답니다. 어쨋든 마인드맵을 사용하니 정리가되는 듯합니다. ^^
security.pdf


▶ Freemind 특징
1. Tree구조의 마인드맵 작성 기능 (노드추가/편집)
2. 한글메뉴지원 (Tool/Preference메뉴를 연뒤 환경설정의 언어에서 kr선택)
3. svg,pdf,html,오픈오피스문서,jpg,XSLT 문서로 내보내기
4. 암호화된 문서로 저장 가능
5. 일정관리 기능
6. 공통작업 등을 위한 플러그인
7.
단축키 지원 (거의 모든작업을 마우스없이 할수있습니다.)


Freemind 는 반드시 시스템에 자바런터임이 설치되어 있어야 합니다.
설치되어 있지 않으신분은 먼저 자바런타임 를 설치한후 Freemind 를 설치하십시요
.
제가 윈도우즈 비스타를 사용하는데 이 JRE버전을 설치하고서  Freemind가 잘 실행되었습니다.

Freemind 의 보다 세부적인 기능은 아래 페이지를 참고하십시요.
http://freemind.sourceforge.net/wiki/index.php/Main_Page#Feature s

▶ JRE 다운로드:(꼭 먼저 설치해야합니다.-리부팅요구할수있음)
<< Windows Platform - Java Runtime Environment 5.0 Update 12 >>

▶ 0.9.0 Beta 다운로드:
http://sourceforge.net/project/showfiles.php?group_id=7118&p ackage_id=188772

▶ 0.8.0 정품 다운로드:
http://freemind.sourceforge.net/wiki/index.php/Main_Page#Downloa d_and_install


출처 : 우키의 블로그
728x90

'Software' 카테고리의 다른 글

각종 Viewer  (0) 2007.04.10
Foxit Reader  (0) 2007.04.07
htmlarg 1.2 버전  (0) 2007.03.03
728x90

- written by ETRI 차세대 PC 연구그룹 책임연구원 한동원


1. 서론

MIT 미디어랩의 니콜라스 네그로폰데 교수는 “지금까지의 PC는 기술발전으로 보다 빠르고 가볍고 많은 정보를 저장할 수 있게 되었지만, 미래의 PC는 사용자의 문화가 용도와 가치를 결정하는데 큰 영향을 미치게 될 것이므로 속도가 얼마나 빠른가 하는 경쟁보다는 디지털 시대의 문화를 얼마나 잘 담아 낼 수 있느냐가 선택의 기준이 될 것이다”고 공언한 바 있다.

지금까지 대표적인 정보이용 수단인 PC는 성능이나 처리속도와 같은 기술 중심에서 기능이나 사용자 편리성 등이 강조된 인간 중심의 컴퓨터로 전이되는 현상을 보이고 있으며, 컴퓨터와 패션, 의류 등과의 접목은 웨어러블 컴퓨터와 같은 신 개념의 정보기기 출현을 앞당기고 있다.

또한 인터넷을 기반으로 하는 정보통신 인프라에서 사용자들은 더 이상 PC에만 의존하지 않으며, 사용자가 언제, 어 디서든지 인터넷에 쉽게 접속할 수 있는 정보통신 이용환경의 변화에 따라 정보단말과 사용자의 제한성이 사라지는 새로운 정보서비스 패러다임의 등장으로 사용자가 원하는 정보를 찾아가는 기존의 정보서비스 개념에서 어디에서나 자신이 원하는 정보가 편재되어 있는 유비쿼터스 정보서비스 시대로 접어들고 있음을 보여준다.

따라서 기술의 융합화, 서비스의 광역화, 정보기기의 소형, 경량화 추세로 정보기기는 사용하기 편리하고, 착용 가능한 형태로 인간 중심의 컴퓨팅 환경을 제공하게 되어 궁극적으로는 기계화된 인간성을 회복하고 신체적, 정신적 능력을 고양시켜 줄 것이다.

 

2. 차세대 PC 진화 방향

. 기술 범위

차세대 PC의 기술 범위는 인간 친화적인 정보기기를 구성하기 위한 것으로서 휴대성과 편의성을 개선시키기 위하여 언제, 어디서나 컴퓨팅을 실현할 수 있어야 하며, 항시 들고 다닐 수 있을 정도의 소형 컴퓨팅 기기를 통하여 유비쿼터스 컴퓨팅 서비스를 제공할 수 있으며, 컴퓨팅 기능이 주위환경에 내재되어 이로부터 정보를 획득하여 활용하거나 사용자가 인식하지 못하는 상태에서도 컴퓨팅 기능을 수행할 수 있어야 한다.

따라서 차세대 PC는 착용성, 저전력, 소형화 기술에 의한 스마트 웨어 등과 같은 플랫폼 분야와 재래식 키보드, 마우스, 모니터를 대체할 초소형 키보드 및 디스플레이 등을 포함하여 양손의 사용을 자유롭게 하는 입출력 장치와 음성, 시각, 촉각, 후각, 미각 등 오감 정보처리 기술을 위한 차세대 사용자 인터페이스, 그리고 데이터 송수신을 위한 BAN(Body Area Network), WPAN(Wireless Personal Area Network) 기술 등을 주요 대상으로 본다.

차세대 PC를 구성하는 기술은 크게 차세대 PC 플랫폼, 초단거리 개인 무선통신 인터페이스, 스마트 I/O, 사용자 친화형 소프트웨어, 오감 정보 UI로 구분된다. 차세대 PC 플랫폼은 휴대형 플랫폼, 착용형 플랫폼, 신체 내장형 플랫폼, 초소형 저전력 소프트웨어 플랫폼 등으로 분류되며, 초단거리 개인 무선통신 인터페이스는 개인통신접속, 신체통신접속, 스마트 I/O는 착용형 I/O Invisible I/O, 사용자 친화형 소프트웨어는 휴먼 에이전트, 감성 에이전트, 시큐리티, 오감 정보 UI는 오감 센서, 오감 인터페이스, BCI(Brain Computer Interface) 등으로 구성된다.

. 서비스 진화 방향

기술 융합화 현상의 급진전과 통신, 가전, 컴퓨터간의 상호 영역이 파괴되는 디지털 컨버전스 추세에 따른 PC의 역할 변화 즉, 정보생산자와 소비자에 대한 패러다임 변화가 가속화되며, 정보획득의 제한이 없는 새로운 정보서비스의 제공으로 사용자의 디지털 라이프스타일에 부합하는 정보이용 기기의 변화가 예상된다.

정보통신 서비스가 새롭게 출현될 때마다 각기 다른 단말기들을 구입해야 하는 현 시점에서볼 때, 단기적으로는 휴대형 정보단말과 휴대폰 기능이 접목되어 팩스, 전자우편, 영상전화 등과 같은 멀티미디어 기능이 융합된 복합 정보단말 형태와 이에 필요한 소형화, 무선화를 위한 플랫폼 기술 발전이 예측된다.

장기적으로는 음성, , 제스처를 통한 지능형 사용자 인터페이스, 고속 유무선 통합망에 의한 고품질 멀티미디어 처리기능, 휴대화, 저가화를 위한 고성능 저전력 시스템 칩 기술, 네트워크 접속형 시스템 소프트웨어 기술 등의 발전으로 이동통신 단말과 고속 통신망이 결합된 정보기기 형태로 발전될 것으로 전망된다.

차세대 PC는 기술의 융합화와 정보기기의 소형, 경량화 추세로 차세대 PC의 진화방향과 발전요인에 따라 PDA, 전자지갑 등 지니고 다니는 전자비서 형태에서 손목시계와 같은 액세서리형, 신체 착용형 입는 컴퓨터, 향후 신체 내장형 컴퓨터인 먹는 컴퓨터까지 나아가 차세대 PC는 종래의 컴퓨터에서 보다 진화된 형태의 미래형 컴퓨터의 모습을 가질 것으로 보인다.

앞 으로 입는 컴퓨터는 의복이나 액세서리 개념의 컴퓨터에서 인간의 오감 메커니즘을 모방하여 자연스럽고 편리하게 컴퓨터와 때와 장소의 제한없이 대화할 수 있도록 기기와 인간사이의 상호작용을 개선시키는 인간 중심의 휴먼 인터페이스 기술로 발전될 것으로 전망된다.

또한 일상생활에서 매일 사용하는 기기에는 임베디드 프로세서와 무선통신 인터페이스, 소프트웨어 등이 탑재되어 일상생활 물건들이 지능화된 기기로 새롭게 변모되어 정보의 교환 대상이 사람과 사람, 사람과 기기 중심에서 일상생활의 사물과 기기들이 상호 접속되어 사용자가 원하는 것을 사람의 해석이나 간섭없이 처리하고 이를 사용자에게 제공하게 되는 유비쿼터스 컴퓨팅 환경으로 변모될 것으로 보인다.

이와 같은 개념에서 유비쿼터스 컴퓨팅은 “언제(always), 어디서나(anywhere) 존재한다”는 뜻으로 물이나 공기처럼 우리가 생활하는 세계 도처에 컴퓨팅 환경이 편재되어 있는 상태를 말하며, 유비쿼터스 컴퓨팅 환경에서의 입는 컴퓨터는 메인프레임, PC에 이은 차세대 컴퓨팅 패러다임으로 다가오고 있다.

차세대 정보이용 단말로서의 입는 컴퓨터는 사람이 옷을 입듯이 몸에 착용할 수 있는 컴퓨터로서 작고, 가벼우며, 벨트나 의복 재킷 등에 넣고 이동하면서 사용할 수 있는 정보기기이며, 포켓 사이즈의 화면이나 헤드마운트 디스플레이를 사용하며 정보 입력방식은 음성명령어나 손목에 부착된 무선 입력기 등을 이용하는 컴퓨터를 지칭한다.

입는 컴퓨터에서는 사용자의 신체적인 확장성을 제공하기 위하여 센서와 신체에 부착된 기기들간의 네트워크 구성이 가능해야 하고, 인지성 제공을 위해서는 신체와 지속적인 상호작용 및 상황인지 기능을 제공해야 한다.

그리고 일상생활에서의 편의성과 쾌적성 제공을 위해서는 일상생활을 유지하는데 필요한 기본적인 수단 중의 하나이며, 연령, 성별, 직업, 패션, 라이프스타일, 기후, 문화 등과 같은 개인별 특성과 주변 환경에 따라 인체와 가장 밀접한 생활환경을 가지는 의복, 시계, 안경, 반지, 신발 등과 같은 액세서리 형태를 가지게 될 것이다.

. 주요 기술 동향

초소형 플랫폼은 전 세계적으로 다양해지는 정보기기 제품을 위한 초소형 초절전 고성능 SoC 핵심 부품과 표준화된 인터페이스로 동적 재구성 가능한 플랫폼 및 생체신호 센서, 플렉시블 디스플레이, 초소형 대용량 저장장치 및 배터리 기술을 중심으로 발전되고 있다. 미국의 롤트로닉스사와 씬필름테크놀러지사에서는 두루마리 가공기술(Roll to Roll)을 이용한 플렉시블 로직-메모리-스토리지-디스플레이, 필름 배터리 등에 대한 기술개발이 진행되고 있으며, 웨어러블 컴퓨터의 전원 문제 해결을 위한 방안으로 인피니언사에서는 의복 내부와 외부의 온도차이에 의한 전원 발생기술에 대한 연구가 활발히 진행되고 있다.

사용자 인터페이스 기술은 에이전트 기술과 멀티모달 및 상황 인식을 지원하는 HCI(Human Computer Interaction) 기술로 발전하며, 유비쿼터스 컴퓨팅 환경이 보편화되는 시대에는 정보기술을 이용하는 일반적인 수단이 지금까지의 유니모달(unimodal)에서 벗어난 멀티모달(multimodal) 기반의 인터페이스 기술로 발전되어 시각, 청각 이외에 다양한 휴먼 인터페이스 기술을 실현하기 위하여 햅틱(haptic) 장치 등을 이용한 촉각 인터페이스 기술이 부각되고 있다.

또한 생체인식 기술의 발달은 사용자의 얼굴, 표정 등으로부터 얻어낸 정보를 바탕으로 사용자의 감성까지 컴퓨터로 전달할 수 있을 것으로 전망되며, 오감 정보처리 기술은 시각, 청각, 촉각 중심에서 후각, 미각 정보처리와 오감을 융합 재현하여 현실감 있는 서비스를 제공하는 기술로 발전하게 되어 궁극적으로 차세대 PC는 플랫폼의 소형화, 에이전트 소프트웨어에 의한 지능화와 아울러 HCI에 의한 실감화 추세로 발전될 것으로 전망된다.

3. 차세대 PC 산업 특성

. 차세대 PC 표준화 동향

차세대 PC 시장은 낮은 진입장벽, 참여기업들의 이질성, 제품의 다양성, 산업간 융합에 따라 언제라도 치열한 경쟁국면에 돌입할 수 있는 특성을 가지고 있으므로, 신제품이 지속적으로 출시되고 라이프사이클이 짧아 제품간, 제품군간, 기업간 복합적인 구도가 형성되어 경쟁이 첨예한 분야이다.

따라서 차세대 PC 산업은 PC의 윈도(MS), CPU(인텔)와 같은 시장 주도형 독점기술이 부재하며, 시장 특성상 표준이 확립되지 않은 분야이므로 지배적 경쟁구도가 불명확한 가운데 치열한 표준 경쟁이 가속화될 전망이다.

차세대 PC에서의 표준은 하나의 핵심 표준 주체가 없는 반면, 구성되는 기술별로 추진되고 있으며, 공식 표준화 단계보다는 시장 및 기업 등에서 사실(defacto) 표준화로 진행되고 있다.

차세대 PC의 대표적인 표준화 활동은 TI ST 공동으로 무선 핸드헬드 기기 인터페이스 표준 규격인 MIPI(Mobile Industry Processor Interface)를 제정하여 모바일 응용 프로세서를 위한 하드웨어 및 소프트웨어 인터페이스를 위한 표준 확립과 촉진을 위하여 단체를 구성하였으며, 핸드셋, 반도체, R&D 컨소시엄, 하드웨어 주변장치, 운영체제, 미들웨어 및 응용 소프트웨어 개발업체들이 참여하고 있다.

웨어러블 네트워크 분야에 있어서는 필립스, 소니, 노키아 등에서 다양한 응용에 근접장 통신 기술구현 및 표준화 촉진을 위하여 2004 3 NFC(Near Field Communication) 포럼을 구성하였으며, NFC 기술은 터치(touch) 기반의 상호 작용 기술로써, 사용자들은 스마트 기기들을 손가락으로 건드려 서로 다른 기기들을 연결시킬 수 있는 직관적인 방식을 통하여 콘텐츠와 서비스에 접근할 수 있다.

WWRF(Wireless World Research Forum)에서는 미래 무선통신 시스템 설계에 대한 비전 제시와 아울러 차세대 PC 관련 활동은 근거리 무선통신 시스템 표준그룹인 WG5에서 웨어러블 네트워크 분야의 WBAN(Wireless Body Area Network) WSN(Wireless Sensor Network) 기술과 응용에 대해 다루고는 있으나, 아직 구체화된 표준 모델이 설정되지 않은 단계에 있다.

사용자 인터페이스 분야는 ECMA(European Computer Manufactures Association, 유럽 컴퓨터 조합연맹) TC32(Communication Network and Systems Interconnection)/TG11 (Computer Supported Telecommunications Applications: CSTA)에서 멀티모달 voice 브라우저에 대한 표준화가 추진되고 있다.

. 차세대 PC 특허 동향

차세대 PC의 기술범위와 구성요소 분류에 따른 특허 출원 동향을 살펴보면, 국가별로는 미국 37%(425), 한국 35%(403), 일본 22%(256), 유럽 6%(74) 순이며, 미국과 일본은 1980년 이후 지속적으로 출원되기 시작했으며, 한국은 1990년대부터 시작되어 1998년 이후로 지속적인 증가추세를 보인다.

차세대 PC의 기술별 특허 출원 동향은 초단거리 개인 무선통신 인터페이스의 비중이 47% (539), 차세대 PC 플랫폼이 27%(307)의 비중을 차지하여 전체 기술의 주류를 이루고 있으며, 스마트 I/O 12%(139), 사용자 친화형 소프트웨어가 8%(98), 오감 정보 UI 6%(75)로 나머지 비중을 차지한다. 이를 통하여 유비쿼터스 컴퓨팅 환경에서의 차세대 PC를 구성하는 초단거리 개인 무선통신 인터페이스 기술이 부각되고 있으며, 국가별 기술분류를 살펴보면 한국, 미국, 일본은 초단거리 개인무선 통신 인터페이스로 각각 218, 163, 137건이 가장 많이 출원되었고, 유럽은 차세대 PC 플랫폼 분야에서 27건으로 다른 국가들과는 다른 경향을 보인다.

4. 유비쿼터스 디지털라이프스타일

2004년 2월 프랑스에서 개최된 3GSM 월드 전시회와 미국의 CTIA 와이어리스 2004 등에서 웨어러블 테크놀러지 패션쇼를 통해 차세대 PC에 대한 세계인들의 관심을 고조시키고 있다. 이러한 맥락으로 2004 10월에는 정보통신부에서 주최하고 한국전자통신연구원과 정보통신연구진흥원 등 주관으로 웨어러블 컴퓨터 패션쇼가 서울에서 개최되었다.

정보통신부에서 추진하는 IT839 전략의 차세대 PC 선도기술개발과제를 중심으로 유비쿼터스 시대에 신 개념의 디지털라이프스타일에 대한 새로운 방향성과 가능성을 제시하는 자리로써 “Everywhere Every wears Technology”라는 주제로 Urban Traveler, Smart Worker, Happy Nomad와 같은 부제로 구성되었다.

Urban Traveler는 비즈니스 업무와 도시 일상생활 속의 차세대 PC, 유비쿼터스 시대의 모바일 오피스로 구성되며, Smart Worker는 사용자를 찾아오는 U-서비스, 핸즈프리 워커, Happy Nomad는 퍼스널 헬스케어, 웰빙 스포츠, 엔터테인먼트 등으로 구성되어 우리의 일상생활, 근무환경, 여가생활 등 다양한 상황에서 나타나는 패션과 IT기술을 접목시켜 웨어러블 컴퓨터와 같은 차세대 PC에 대한 새로운 방향성과 미래 전략산업으로서의 새로운 발전 가능성을 제시한 것으로 평가된다.

따라서 차세대 PC는 언제, 어디서나, 누 구나 자신만의 디지털라이프스타일을 즐길 수 있는 보편적인 정보통신 이용환경을 제공함과 아울러 우리가 원하는 장소에서 원하는 시간에 원하는 일들을 함으로써 우리의 일상생활 속에 새로운 변화를 가져다주는 유비쿼터스 시대의 정보생활 필수품 개념으로 자리매김할 것으로 보인다.

<참 고 문 헌>

[1]    한동원, “차세대 PC와 유비쿼터스 컴퓨팅 패러다임,” 한국정보기술학회, 2003. 12.

[2]    박준석, “차세대 PC 발전 전망,” 정보통신연구진흥원, 주간기술동향 1148, 2004. 6. 2.

[3]    한국정보통신기술협회, “IT839 전략 표준화 로드맵,” 2004. 11.

[4]    정보통신연구진흥원, “IT839 전략 기획보고서-차세대 PC,” 2004. 6.

[5]    Venture Development Corporation, “The Global Market for Wearable Computers: The Quest for Killer Applications,” 2002. 8.

728x90
728x90
네티모 조사…좌석점유율 최대 10%P 차이


게임 장르에 대한 선호도가 지역별로 다른 것으로 나타났다.

PC 방용 솔루션 전문 업체 네티모커뮤니케이션즈(www.gamereport.co.kr)가 전국 5000여개 PC방을 대상으로 게임 장르별 좌석 점유율 조사한 결과, 동일 장르 게임이 지역에 따라 최대 10% 포인트까지 점유율 편차를 보이고 있는 것으로 조사됐다.

전국적으로 점유율 40%를 넘나들며 가장 높은 시장 점유율을 기록하고 있는 MMORPG 장르 만해도 제주도는 44% 점유율을 보였지만 대전에서는 36.9%에 그쳤다. RPG 다음으로 인기 장르인 FPS 게임 또한 대구에서는 29%가 넘는 점유율을 기록했지만 광주에서는 20%에 그쳐 지역별 편차를 드러냈다.

MMORPG와 FPS 같은 인기 장르가 아닌 경우에도 지역별 선호도가 갈렸다. 최근 1~2년 사이 개발 러시를 이루고 있는 스포츠 게임의 경우 대전과 제주 지역에서 강세를 보이고 있는 것으로 조사됐다. 다른 지역 대부분 6%대 점유율을 보이는 스포츠 장르가 두 지역에서만 8.7%대를 넘어서고 있다.

또 온라인 아케이드 게임만 놓고 보면 광주가 6.5%가 넘는 점유율로 전국 최고치를 기록했으며, 대구가 2.5%로 최저치를 보였다. FPS게임과는 대조적인 양상이다. 실제 영남 지역에서 부산을 제외한 대구, 울산 등지서는 저연령 층이 즐기는 아케이드 캐주얼 게임이 약세를 보이고 있는 반면, 20대 이상 성인들이 즐기는 FPS 장르가 강세를 보이고 있다.

인기 장르 가운데 지역별 점유율 차이가 적었던 것은 RTS 게임인 것으로 나타났다. RTS 장르에서는 서울지역이 17%로 가장 높았으나, 나머지 지역들도 대부분 14%대 점유율 분포를 보여 큰 차이가 없는 것으로 조사됐다.

이 처럼 각 지역별로 인기 장르에 차이를 보이고 있는 것에 대해 네티모 관계자는 "지역별로 발생할 수 있는 정서와 지리적 요인이 복합적으로 게임 선택에 영향을 끼치기 때문"이라며 "그러나 이는 세계 어디에서나 흔히 볼 수 있는 현상"이라고 말했다.

네 티모커뮤니케이션즈는 약 5000여개 회원 PC방을 확보하고 있는 PC방 솔루션 전문업체이다. 이 회사는 전국 회원 PC방의 PC에서 실행되는 게임에 대한 정보를 집계해 서비스하는 `PC방 전문 리서치 서비스`인 `게임리포트' 사업을 전개하고 있다
728x90
728x90
IE 설계 변경에 따른 영향
IE 설계 변경에 따라서 달라지는 것은 무엇일까? 웹 페이지 내에서 'object', 'applet', 'embed' 태그에 의해 로드된 액티브 X, 자바 애플릿, 멀티미디어 파일의 경우, 사용자가 이를 클릭해서 명시적으로 활성화(Activation)시키기 전까지는 임베딩된 개체에 사용자가 직접 상호작용(Interaction)하는 것이 불가능하며, 상호작용과 관련된 DHTML 이벤트도 사용이 불가능하다는 것이다.

이번 패치의 영향을 받는 대상은 웹 페이지 내에 'object', 'applet', 'embed' 태그를 사용해서 지정되고, 눈에 보이는 UI를 가지며, 사용자가 마우스나 키보드 입력을 통해 이벤트를 처리하는 상호작용 컨트롤에만 해당된다.

상호작용 컨트롤의 예는 미디어 플레이어, 애플의 퀵타임 플레이어, 매크로미디어의 플래시 등이 있다. UI를 가지지 않는 비상호작용 컨트롤이나 외부 스크립트를 통해 로딩된 상호작용 컨트롤에는 아무런 영향이 없다.

인터넷 뱅킹 시스템의 경우, UI가 없는 키 로깅 방지 컨트롤은 영향이 없으며, 공인 인증서도 UI가 웹 페이지 내에 임베딩된 것이 아니라 별도의 다이얼로그 창으로 나오기 때문에 영향을 받지 않는다.

아래 그림은 웹 페이지에 'object' 태그나 'embed' 태그를 사용해서 미디어 플레이어 액티브 X를 구동해 동영상 콘텐츠를 재생하고 있는 모습이다. 활성화되지 않은 상호작용 컨트롤은 마우스나 키보드 이벤트 등의 사용자 입력에 반응하지 않는다. 마우스 커서를 올려놓았을 때 컨트롤 주위에 점선 테두리가 나타나며, 그림과 같은 풍선 도움말이 나타난다.

컨 트롤을 활성화하려면 마우스로 해당 컨트롤을 클릭하거나 탭 키로 포커스를 이동한 후 스페이스 바나 엔터 키를 누르면 된다. F5 키를 눌러서 페이지를 갱신했을 경우 컨트롤이 다시 비활성화되며, 페이지 내에 컨트롤이 여러 개 있는 경우에는 각각을 활성화해야 한다는 것에 주의해야 한다.

혼동해서는 안 될 것은 상호작용이 불가능하다는 것이지, 임베딩한 개체가 아예 로드되지도 않고 작동하지도 않는다는 것은 아니다. 즉, 위의 예에서 동영상 콘텐츠 자체가 아예 재생되지 않는 것은 아니다. 다만, 동영상을 멈추기 위해서 정지 버튼을 누르려면(즉 상호작용을 하려면) 컨트롤을 클릭해서 활성화시켜야 한다는 것이다.

국내 웹사이트의 파급 효과
위에서 예로 든 멀티미디어 콘텐츠(동영상, 음악) 외에 국내 사이트에서 이 패치에 대해 영향을 받는 것은 어떤 것이 있을지 몇 가지 예를 들어보자.

요즘 몇몇 사이트들에서는 사진이나 그림을 업로드하기 전에 이미지를 편집할 수 있도록, 이미지 툴 액티브 X를 제공하는 곳이 있다. 이러한 이미지 툴 컨트롤을 사용하려면, 컨트롤을 한 번 클릭해서 활성화시켜야 한다. 또한 업무용 시스템을 보면 차트, 그리드와 같은 요소를 서드파티 액티브 X 컨트롤로 사용하는 경우가 많다. 이 경우 상호작용을 하려면 화면 내의 컨트롤을 각각 활성화시켜야 한다.

액티브 X 컨트롤도 문제지만, 필자가 생각하기에 국내에서 가장 광범위하게 영향을 받을 것이라고 생각되는 것은 바로 플래시다. 국내 사이트들은 메뉴 등의 네비게이션 UI, 광고, 플래시 게임, 플래시 축하카드 등 플래시에 대한 의존도가 매우 높다. 거의 모든 UI를 플래시로 도배한 모 사이트의 경우, 화면의 대다수가 비활성화되는 현상이 발생했다(하다못해 필자 회사 홈페이지도 메뉴가 플래시로 돼 있다).

마우스를 올렸을 때 팝업 형태로 메뉴를 보여주는데, 비활성화된 상태에서는 메뉴가 전혀 나타나지 않는다. 사실 활성화를 위해 클릭 한 번 하는 것이 별로 힘든 일은 아니지만, 잘 모르는 사용자의 경우에는 상당히 당황스러울 수 있다는 생각이 든다.

이러한 사용자들의 혼란을 방지하려면 'object', 'applet', 'embed' 태그를 사용하는 페이지의 경우 수정이 불가피하다. 이를 위해 MS는 상호작용 컨트롤이 이전과 동일하게 즉시 활성화되게 하고 싶으면 외부 스크립트에 의해 상호작용 컨트롤을 로드하라고 권하고 있다.

예를 들어 다음과 같이 'embed' 태그를 사용하는 페이지가 있다고 가정하자.

<html>
<body>
<embed src="examplecontrol">
</body>
</html>

MyPage.html을 로드하면 해당 컨트롤은 비활성화된 상태가 된다. 이를 방지하려면, 다음과 같이 'embed' 태그를 write 해주는 코드를 외부 스크립트 파일(embed.js)로 작성해서 빼고, MyPage.html에서는 이 스크립트 파일을 지정하면 된다. 이렇게 하면 이전과 동일하게 이 컨트롤은 로드 후 즉시 활성화된다.

<html>
<body>
<script src="Embed.js"></script>
</body>

Embed.js
document.write(‘<embed src=”examplecontrol”>’);

액티브 X, 플래시의 남발 자제해야

이러한 준비는 언제까지 마쳐야 할까?
MS는 1차적으로 3월 1일에 이 IE 패치를 윈도우 업데이트를 통해 선택적으로 배포할 예정이다. 즉 설치를 원하는 사용자만 이 패치를 설치하면 된다. 그러나 4월부터는 보안 업데이트에 일괄 적용되므로, 보안 업데이트를 설치하면 이 패치를 함께 설치하게 된다. 그러므로 사실상 4월 전까지는 위 방법을 통해 패치에 대한 대비책을 세우는 것이 바람직하다고 생각된다.

이 패치가 궁극적으로 국내 웹사이트에 미치는 영향이 얼마나 될지는 아직 미지수다. 하지만 분명히 외국 사이트에 비해서는 상당히 파급 효과가 클 것으로 예상된다. 그 이유는 국내 사이트들이 액티브 X, 플래시 등에 대한 의존도가 매우 높으며, 많이 사용하고 있기 때문이다. 특히 해외에서 국내 사이트들에 접속해보면 새삼스레 국내 네트워크 인프라의 우수성에 놀라게 된다.

국내 웹사이트들은 윈도우 XP 서비스팩 2에서 팝업 창 차단 때문에 대대적인 수정을 하는 홍역을 치른 적이 있다. 이제 시도때도 없이 뜨는 팝업 창뿐만 아니라 여기저기에서 남발됐던 액티브 X 및 플래시에도 제재가 들어오게 된 셈이다.

이러한 소동과 후유증을 겪어야 하는 것은 이올라스나 MS에도 책임이 있겠지만 웹 기획자, 디자이너, 개발자들, 고객이 스스로 이러한 문제를 초래했다는 것을 부인하지 못할 것이다.

이번 사건 이후에 액티브 X나 플래시 사용을 자제하는 바람직한 모습으로 가는 계기가 될지, 아니면 XP 서비스팩의 팝업 창 차단 이후 레이어를 통해 팝업 창을 흉내내는 기괴망측한 꽁수가 등장했듯이, 이번 사건 역시 개발자에게 스크립트 작업만을 잔뜩 추가해주게 될지는 두고 볼 일이다.
728x90

'Information' 카테고리의 다른 글

온라인게임 지역별 선호도  (0) 2007.02.01
골치덩어리 IE 보안「액티브 X 컨트롤로 해결」  (0) 2007.01.21
Websites as Graphs  (0) 2007.01.17
728x90
보안 문제는 수년동안 MS 인터넷 익스플로러를 괴롭혀왔고, 이 웹 브라우저는 치명적인 취약성으로 계속 고통받고 있다. 사실 MS는 2005년 5월경 최근 IE 보안 위협 중 한 가지에 대해 이미 알고 있던 상황이었다. IE 대부분 버전에 영향을 미치는 치명적인 취약성을 고려해볼 때 그간 이 위협으로 IE는 시달려왔고, 크래커들은 웹을 파괴하기 위해 이 취약성을 이용해왔다. 적어도 이번 주까지는 말이다.

보통 매달 두 번째 주 화요일에 나오는 월간 보안 공지(security bulletins)의 일환으로 MS는 보안 공지 MS05-054, 이른바 '인터넷 익스플로러용 누적 보안 업데이트'를 내놓았다. MS05-054는 인터넷 익스플로러의 4가지 취약성에 초점을 맞추고 있으며, 이 중 두 가지는 대부분의 윈도우에서 심각(critical)한 수준으로 등급이 매겨져 있다. 이 보안 공지는 다음과 같은 결점을 해결한다.

* 파일 다운로드 대화 상자 조작 취약성
* HTTPS 프록시 취약성
* COM 객체 인스턴스화 메모리 오염 취약성
* 일치하지 않는 문서 객체 모델 객체 메모리 오염 취약성

인가받지 않은 정보를 노출시키거나, 시스템을 불안정하게 만들거나, 혹은 유해한 웹 애플리케이션을 사용하여 시스템을 가로채거나 할 때 공격자들이 이 취약성을 어떻게 이용할 수 있는지 알아보기 위해 좀더 자세히 보안 공지 내용을 보자.

문제를 좀더 복잡하게 만드는 건 서드파티에서 만든 수백 개의 COM 객체 애드 인에 있다는 사실 때문이다. 그렇다면 또다른 벤더에서 다운로드한 COM 객체를 마지막으로 업데이트한게 언제였는가?

서드파티 소프트웨어를 업데이트하지 않는 건 좋은 생각이 아닌데다가 자체적으로 바람직하지 않은 일이 일어날 수 있지만, 가까이에 더 큰 문제가 도사리고 있다. 바로 컴퓨터에 있는 다른 기능과 IE가 통합돼 있다는 점이다. 이런 기능적 통합은 액티브 스크립팅(Active Scripting)과 액티브X 컨트롤(ActiveX controls)를 통해 가능해진다.

액티브 스크립팅과 액티브X 컨트롤을 컴퓨터에서 꺼버리게 되면 약간은 포기해야 할 기능이 있을 수도 있겠지만, 훨씬 더 많은 보안 이득이 있을 것이다. 어떻게 이 두 기능을 꺼버릴 수 있는지 살펴보자.

액티브 스크립팅 끄기
액티브 스크립팅을 동작하기 전에 사용자에게 알려주도록 IE 설정을 해서 일부 취약성으로부터 시스템을 좀더 제대로 보호할 수 있다. 혹은 인터넷 보안 영역에서 완전히 액티브 스크립팅을 꺼버릴 수 있다.

다음 단계를 따른다

1. 인터넷 익스플로러가 실행된 상태에서 도구(Tools) -> 인터넷 옵션(Internet Options)로 간다.

2. 보안(Security) 탭에서 인터넷(Internet) 아이콘을 클릭하고, 사용자 지정 수준(Custom Level) 버튼을 클릭한다.

3. 설정(Settings) 목록 상자에서 스크롤해 스크립팅(Scripting)을 찾는다.

4. 'Active 스크립팅'에서 프롬프트(Prompt)나 사용 안함(Disable)을 선택하고 확인(OK)을 클릭한다.

5. IE가 변경됐다고 확인을 하도록 묻는다면 예(Yes)를 클릭한다.

6. 설정을 저장하기 위해 확인(OK)을 클릭하고 모든 대화 상자를 닫는다.

이제 액티브 스크립팅을 처리했으니 이보다 더 위험한 컴포넌트인 액티브X를 끌 시간이다.

액티브X 컨트롤 끄기
액티브X 컨트롤이 동작하기 전에 알려주도록 IE를 설정함으로서 일부 취약성으로부터 시스템을 보호할 수도 있다. 이도 역시 인터넷 보안 영역에서 완전히 액티브X 컨트롤을 꺼버릴 수 있다.

다음 단계를 따른다.

1. 인터넷 익스플로러가 실행된 상태에서 도구(Tools) -> 인터넷 옵션(Internet Options)로 간다.

2. 보안(Security) 탭에서 인터넷(Internet) 아이콘을 클릭하고, 사용자 지정 수준(Custom Level) 버튼을 클릭한다.

3. 설정(Settings) 목록 상자에서 스크롤해 액티브 X 컨트롤 및 플러그 인(ActiveX Controls And Plug-ins)을 찾는다.

4. 액티브 X 컨트롤 및 플러그 인 실행(Run Active X Controls And Plug-ins)에 대해 확인(Prompt) 혹은 사용 안함(Disable)을 선택하고 확인(OK)을 클릭한다.

5. IE가 변경됐다고 확인을 하도록 묻는다면 예(Yes)를 클릭한다.

6. 설정을 저장하기 위해 확인(OK)을 클릭하고 모든 대화 상자를 닫는다.

신뢰 사이트 목록 관리하기
IE의 인터넷 보안 영역에서 액티브 스크립팅과 액티브X 컨트롤을 끄면 일부 웹 사이트가 제대로 동작하지 않을 수도 있다는 점을 명심하기 바란다. 필자의 시스템에서는 확인 혹은 프롬프트(Prompt)로 설정했으며, 따라서 액티브 스크립팅이나 액티브X 컨트롤이 포함된 사이트에 새롭게 방문할 때면 사이트를 신뢰할지 여부를 결정해야 한다.

자주 사용할 사이트라면 신뢰 사이트 목록에 사이트 주소를 넣어두며, 그때그때 팝업창으로 알려준다. 신뢰 사이트 목록에 사이트를 추가하려면 다음 단계를 따른다.

1. 브라우저 상에서 URL 위에서 오른쪽 버튼을 클릭하고 복사(Copy)를 선택한다.

2. 도구(Tools) -> 인터넷 옵션(Internet Options)으로 간다.

3. 보안(Security) 탭에서 신뢰할 수 있는 사이트(Trusted Sites) 아이콘을 클릭하고 나서 사이트(Sites) 버튼을 클릭한다.

4. 영역에 웹 사이트 추가(Add This Web Site To The Zone) 텍스트 상자에서 마우스 오른쪽 버튼을 클릭하고 붙여넣기(Paste)를 선택한다.

5. 이 영역에 있는 모든 사이트에 대해 서버 확인(https:) 필요(Require Server Verification (HTTPS:) For All Sites In This Zone) 체크 박스를 해제한다.

6. 추가(Add)를 클릭해 닫기(OK)을 클릭한다.

7. 설정을 저장하기 위해 확인(OK)을 클릭하고 모든 대화 상자를 닫는다.

액티브 스크립팅과 액티브X 컨트롤을 꺼버리면 웹 브라우징을 할 때 IE가 더 안전해진다. 인터넷 익스플로러가 정도를 넘어서는 보안 문제를 갖고 있긴 하지만 오늘날 사용되고 있는 가장 대중적인 웹 브라우저인 건 사실이다. 파이어폭스(Firefox)나 오페라(Opera)같은 다른 브라우저로 바꾸고 싶지 않다면 인터넷을 안전하게 브라우징하기 위해 보안 설정을 높여줄 필요가 있다.
728x90

'Information' 카테고리의 다른 글

온라인게임 지역별 선호도  (0) 2007.02.01
IE 액티브 X 컨트롤 실행 문제「이렇게 대처하라!」  (0) 2007.01.21
Websites as Graphs  (0) 2007.01.17
728x90

JayG.org as Graph

위 그림은 웹 페이지를 파싱해서 그래프를 만들어주는 자바 애플릿을 이용하여 이 블로그를 표현한 그래프이다. 이 자바 애플릿은 Sala라는 사람이 개발했고 소스 또한 공개되어 있다. 자신의 웹 페이지를 그래프로 표현하기 위해서는 이곳에 접속하여 주소를 입력하고 그래프가 다 그려질 때까지 인내하면 된다. 그래프가 다 그려지는데 꽤 오래 걸리기 때문에 켜두고 다른일을 하는게 좋을 거다. 다른 사람들의 그래프를 보기 위해서는 Flickr’websitesasgraphs’를 찾아보면 되고 자신의 그래프에 ’websitesasgraphs’ 태그를 붙여 저장하면 동참할 수 있다.

그래프의 각 색상이 의미하는 바는 다음과 같다.

  • 파랑: 링크 (<a> 태그)
  • 빨강: 표 (<table>, <tr>, 그리고 <td> 태그)
  • 초록: <div> 태그
  • 보라: 그림 (<image> 태그)
  • 노랑: 폼 (<form>, <input>, <textarea>, <select>, 그리고 <option> 태그)
  • 주황: 개행과 인용문 (<br>, <p>, 그리고 <blockquote> 태그)
  • 검정: 뿌리 (<html> 태그)
  • 회색: 그 외

출처 : http://jayg.org/professional/web/websites-as-graphs/332/

728x90
728x90

엄청빠른 토끼와 엄청느린 거북이가 경주를 했다.
토끼는 엄청빨리 뛰어서 결승점이 가까워 졌다.
중간의 낮잠 따위는 '즐' 이었다.
토끼가 결승점에 도착한 순간!
엄청느린 거북이는 이미 도착해 있었다!
어떻게 엄청느린 거북이가 먼저 도착했을까!!!!!

최선을 다해서.....-_-

허무개그다. 한때 유행했던...
난 엄청느린 거북이다.
주변엔 엄청빠른 토끼들이 많다.

최선을 다한다면.......?

최선을 다하면 성공을 낳고,
나름의 최선은 나름의 성공을 낳는다.

난 똑똑하지도 못하고 재능이 뛰어나지도 못하다.
그래서 난 나름의 최선을 할 뿐이다.
엄청빠른 토끼들이 보기에는 답답하겠지만,
난 그저 묵묵히 할 뿐이다.

최선을 다해서.....


'前進 不停止, 停止 不退進'

발전의 흐름속에 있으면 너 또한 발전하게 된다.

(자작성어 이다. 검색엔진으로 검색하지 말자.)

728x90

'Etc' 카테고리의 다른 글

국가대표시범단 540도발차기!  (0) 2007.03.18
결국 게시판 실명제는 도입되는가..  (0) 2006.05.20
PC 는 앞으로 어떻게 발전할까?  (0) 2006.05.08
728x90

오늘은 2006년 5월 20일.
포털 사이트 Daum에서 2006년 5월 31일 지방선거 게시판에 실명제를 도입했다는 것을 발견 했다.
이전까지 찬반도 많고 논쟁도 많았던 실명제 도입 제도....
나 또한 실명제 반대의 입장이다.

게시판에 대한 실명제 도입 추진은 네티즌들에게 관심을 받게된 누군가가 익명들, 또는 알수 없는 영문조합인 아이디들에 의해 인심공격과 악성 댓글 공격을 받으면서 '마녀사냥'의 피해자가 되면서 뜨거운 감자(Hot Focus)로 등장하게 되었다.

게시판 실명제.
취지는 좋다.
자신의 표현을 자신의 이름을 걸고 떳떳하게 말 함으로써 네티즌의 권리를 당당하게 주장하고, 악성 댓글을 막고, 인터넷의 희생양이 되는 일을 사라지게 한다.
라는 것이 대략적인 취지이다.

저대로만 된다면 우리나라는 '아름다운 강산! 아~ 대한민국~!' 이다.

실명제를 하든, 익명제를 하든 하고 싶은 말이 있는 사람은 자신의 말을 한다.
실명제를 쓰면 말이 좀 부드러워 질것이라 생각하는가?
전화번호부에서 자신의 이름을 찾아보면 대답은 나온다.

그렇다.
우리나라에는 정말 특이한 이름을 제외하고는 동명이인들이 '무.척.이.나' 많다.
이것은 ID 보다 더 위험한 것이다.
id는 그 사이트에서 오직 하나이기 때문에, 그 id가 범법행위나 비 도덕적인 일을 하면 추적이 가능 한다.
그러나, 실명은 중복되는 엄청나게 많은 id인 셈이다.
지금 나에게 욕을 하고 있는 '홍길동' 이라는 사람이 내 주변에 있는 '홍길동'인지, 어느 외딴 섬에 살고 있는 '홍길동' 인지 구분할수가 없다.

누군가 이렇게 말할 수도 있다. "사이트 운영자는 누군지 알것 아닌가?"
그럼 난 이렇게 말하겠다. "그럼 ID는 누군지 모르겠는가?"

처벌을 하려면 실명보다 id가 더 추적하기가 쉽다.

내가 실명제를 반대하는 이유는 다음과 같다.
1. 진실이 은폐된다.
2. '2차 피해자'가 생긴다.
3. 국제적 주장이 더욱 힘들어진다.

다음과 같은 예를 들어보자...

어느 고등학교가 학생들에게 매번 돈을 요구하면서 시설은 엉망이고 학생들 관리는 뒷전이며, 새로 온 여선생이 영향력 있는 누군가에게 성폭행을 당했다는 소문도 있으며, 교내 폭력은 만연해져 있다.

자... 학교에는 비리가 있고, 아무것도 모르는 어린 여선생은 영향력 있는 누군가에게 성적으로 피해를 입었으며, 학교에 불량 써클이 있는 것 같다는 생각이 든다.

성적 피해를 입은 여선생은 게시판이 실명이기 때문에 함부로 글을 올릴 수 없다.
주변의 동료 선생들 또한 자신이 손해 볼 것을 두려워 하여 진실을 알더라도 글을 올릴 수 없다.
그들은 자신의 밥줄을 끊을지도 모르는 진실을 규명하기 보다는, 헤프닝으로 넘기면서 그냥 조용히 넘어가길 원한다. '세상이란 원래 더러운 곳이니까..'라며 자신을 정당화 시킨다.

이러한 상황을 알고는 정의감에 불탄 한 학생이 이 모든 사건들 '학교의 비리'와 '여선생의 피해'와 '학교의 불량써클'에 대해 과감하게 글을 올린다.
지방 교육청, 교육부, 청와대, 검찰청, 기타등등.....

대단한 용기를 지닌 학생이다.
그가 올린 글을 보는 순간, 그 학교에 그 학생과 같은 이름이 없다면, 그 학생의 이름을 알고 있는 사람이라면 그 사람이라는 것을 다 알게 된다.
이제 그 학생은 어떻게 되었을까?

용감한 학생상을 받고 사회적으로 인정 받았을까?

지금까지 이런 일련의 상황에 처했던 학교들의 처리 방식은 항상 같았다.

은폐, 무마, 왜곡.

이제 그 학생은 선생들에게 불려가서 욕설과 잔소리를 들으며, 친구들로부터 멸시나 무시를 당하게 되고, 학교의 위상을 떨어뜨렸다는 이유로 퇴학 처벌을 받게 된다.

만약, 그 학생과 동명 이인이 있었다면, 그 또 다른 동명이인의 학생은 자신이 하지도 않은 일로 인해 불량써클 학생들에게 폭력당하고, 선생님에게도 '혹시 니가 그런거 아니냐?'라는 말을 들으며, 항상 경계의 대상이 된다.

그는 단지 이름이 같다는 이유로 '제 2의 피해자'가 된 것이다.

내가 너무 부정적으로만 생각하는 것 같은가? 훗...

물론 저런 스토리로 안되는 곳도 존재 할 것이다.
그러나 저 스토리와 유사한 상황으로 전개되는 것이 더 많다는 것이 문제인 것이다.

국제적 주장력이 약해지는 것은 너무도 뻔하기 때문에 굳이 말하지 않겠다.
강대국들에게 너무도 충성스런 우리나라의 Delete...Delete...Delete...능력...
그러고는 사이버수사대가 국가에 위해를 가했다는 이상한 이유로 몇일동안 자신을 구속하려 할지도 모른다.
그러고는 이렇게 말하겠지, '다음부터는 그런 글 올리지 마라.'
세상 무서워서 할말 제대로 할수 있겠나...

네티즌들의 문화의식과 도덕성을 서로가 노력하여 바른쪽으로 인도 한다면, 악성 댓글들은 점차 사라질거라 생각하며, 위협적인 법적 제제를 준다면 제거될 수 있는 존재이다.
(실제로 게시판의 문화는 그 게시판을 사용하는 사람들이 만든다.)

그러나 실명제를 도입후에 발생할 저 문제들은 어떻게 할것인지, 진실을 막는 자들에 대한 처벌은 어떻게 할 것인지, 2차 피해자는 어떻게 보호할 것인지, 국가적 주장은 무슨 재주로 할 것인지...

사람들은 알고 있는지.....
국회가 실명제를 법적으로 규정하고자 함이 정치인들의 얄팍한 이기주의에서 비롯된 것이란 것을....

국내 최대 포털이라고 하는 Daum에서 실명제를 도입 했다는 것은, 정치인들이 좋아할 만한 일이고, 게시판 상황도 큰 무리없이 돌아가고 있다.

이제 게시판 실명제는 도입 될 것이다.

시대의 흐름을 바꿀수는 없겠지만, 자신들의 이기를 위해 아무것도 모르는 사람들을 선동하는 모습이 나를 탄식하게 하는 것 뿐이다.

728x90

'Etc' 카테고리의 다른 글

국가대표시범단 540도발차기!  (0) 2007.03.18
최선을 다해서...  (0) 2006.07.08
PC 는 앞으로 어떻게 발전할까?  (0) 2006.05.08
728x90

1. 개요

가. 정보이용 환경의 변화
MIT 니콜라스 네그로폰테 교수는 “지금까지 PC는 기술의 발전으로 보다 빠르고 가볍고 많은 정보를 저장할 수 있게 되었지만, 미래의 PC는 사용자의 문화가 용도와 가치를 결정하는데 큰 영향을 미치게 될 것이므로 속도가 얼마나 빠른가 하는 경쟁보다는 디지털 시대의 문화를 얼마나 잘 담아 낼 수 있느냐가 사용자들로 하여금 선택 기준이 될 것이다”고 공언한 바 있다.

유무선 인터넷의 보급과 컴퓨터, 통신, 가전 등의 융합화 추세로 사용자들은 더 이상 PC에만 의존하지 않으며, 자신에게 가장 익숙하고 편리한 방법으로 네트워크에 접속하여 다양한 정보들을 플랫폼에 구애받지 않고 언제 어디서나 자유롭고 편리하게 정보를 교환할 수 있는 새로운 정보기기들을 요구하고 있다.

이러한 정보통신 이용환경의 변화는 정보단말과 사용자의 제한성이 사라지고 어디서나 자신이 원하는 정보가 편재되어 있는 유비쿼터스 정보 서비스 시대로 접어들고 있음을 보여주며, 이제 PC는 더 이상 개인용 컴퓨터(Personal Computer)가 아닌, 네트워크 중심의 퍼스널 커뮤니케이터(Personal Communicator)와 인간 중심의 퍼스널 컴패니언(Personal Companion)과 같이 그 역할과 개념의 변화가 요구되고 있다.

미국의 시장조사 기관인 가트너 그룹에서는 2007년까지 미국과 유럽의 정보기기 사용자(15세 이상 50세 미만의 60%)들이 컴퓨터나 통신기기를 일정시간(하루 6시간) 이상 휴대하거나 착용하고 다닐 것으로 예측하고, 2010년에는 이러한 수치가 75%에 이를 것으로 전망하고 있으므로, 미래 정보 사용자는 현재의 단순 정보 사용자에서 새로운 정보 창출과 소비 특성을 가지게 되며, 이에 따른 사용자의 역할 변화가 예상된다.

이러한 예상에 따르면 사용자들이 원하는 다양한 정보에 대한 요구를 만족시키기 위해서는 새로운 형태의 기술 발전과 기술 융합화 현상이 급진전될 것으로 보인다.

즉, 정보를 제공받을 수 있는 정보기기의 위치와 정보 사용자에 대한 제한성이 사라지고, 사용자가 정보를 찾아가는 개념에서 향후에는 정보가 사용자를 찾아오는 정보 서비스 형태를 가지게 됨으로써, 이와 같은 추세는 모든 곳에 자신이 원하는 정보가 편재되어 있는 정보 서비스의 광역화라는 새로운 패러다임 출현을 가속화시킬 것으로 보인다.

나. 차세대PC의 역할
일상생활에서 매일 사용하는 시계, 옷, 신발 등과 같은 물건들에 초소형, 저전력 기능을 가지는 프로세서, 무선통신, 소프트웨어 등이 탑재되어 사람이 원하는 것을 사람의 해석이나 간섭 없이 처리하고 제공하는 것으로 의(衣), 식(食)과 같이 따로 배우지 않더라도 자연스럽게 인간 본성과 어울려 상호 작용하며, 의사소통의 효율성과 자연성을 극대화시키는 인간 친화적인 컴퓨팅 환경을 제공하여 준다.

최근 컴퓨터와 통신, 가전기기들의 융합화 현상은 PC로 대변되는 기존 정보이용 수단이 개인정보 액세스를 위한 응용에 특화된 정보단말과 같은 차세대PC로 급격히 전이되는 현상을 보이고 있으며, 컴퓨터와 패션, 의류산업 등과의 접목은 입는 컴퓨터와 같은 신 개념의 정보기기 출현을 앞당기고 있다.

따라서 정보기기는 기술의 융합화, 서비스의 광역화, 정보기기의 소형, 경량화 추세로 사용하기 편리하고, 착용 가능한 형태로 인간 중심의 컴퓨팅 환경을 제공하게 되어 궁극적으로는 기계화된 인간성을 회복시키고 신체적, 정신적 능력을 고양시켜 줄 것이다.


2. 차세대PC 산업 동향

가. 국내
국내 차세대PC기술은 선진국과 비교하여 개념 정립단계로써, 차세대PC의 초기 제품인 휴대용 정보기기 분야에 치중되어 대부분 무선인터넷 접속에 의한 서비스 제공에 초점을 맞추고 있다. 차세대 개인통신 기술로 부상되고 있는 인체통신 기술은 인체의 도전성을 이용하여 인체를 통신선으로 사용함으로써, 용이한 네트워크 구성과 아울러 정보 누설의 위험을 사전에 방지할 수 있으나, 인체 도전성이 개인차, 외부온도, 발한상태(땀나는 상태) 등에 좌우되고, 주변 환경의 전자 잡음 영향 등으로 초기에는 신뢰성이 낮아 상용화의 장애요인으로 대두되고 있다.
ETRI에서는 인체통신기술 중에서 주파수를 변조하지 않고 디지털 신호를 직접 전송하고 전기적으로 복원시키는 방식을 사용하는 기술이 개발되고 있으며, 플렉시블 디스플레이, 이오닉스 소자 등 차세대 PC 플랫폼 핵심부품과 생체신호를 이용한 헬스케어 서비스 및 액세서리 형태의 착용형 컴퓨터 등을 개발 중에 있다.

나. 미국
미 국방부는 미래 전투군(future soldier)의 전투력 증강을 위한 웨어러블 컴퓨터, 안경형 디스플레이 등을 적용한 랜드 워리어(Land Warrior) 프로젝트와 센서와 착용형 정보단말을 이용하여 자동으로 지능형 서비스 환경을 구축하는 스마트 컴퓨팅 환경에 관한 연구를 진행  중이다.
자이버넷에서는 2004년 기준 웨어러블 컴퓨터 관련 주요 특허 35개를 보유하고 있으며, 센서텍스는 의복 속에 부착된 특수 센서를 통해 심장박동, 호흡, 혈압, 체온, 칼로리 소모량 등을 측정하여 의료, 스포츠, 유아용 등 다양한 형태의 스마트웨어를 개발하고 있다.
마이크로소프트에서는 유비쿼터스 컴퓨팅 환경 지원을 위하여 일상생활 물건들에 저전력, 초소형 프로세서, 소프트웨어, 통신접속 기술을 탑재한 SPOT(Smart Personal Objects Technology) 기술을 발표한 바 있으며, 인체에 전류를 흐르게 함으로써 몸에 지니고 있는 휴대정보기기에 지속적인 전력 공급을 가능케 하는 기술 특허를 획득한 바 있다.
어플라이드 데이터시스템즈, E-Ink사 등에서는 초소형 eyeglass 디스플레이, 전자종이 등을 개발하고 있으며, 롤트로닉스와 씬필름테크놀로지에서는 두루마리 가공 기술(Roll to Roll)을 이용한 플렉시블 로직, 메모리, 스토리지, 디스플레이, 필름 배터리 등을 개발하여 웨어러블 컴퓨터나 두루마리 컴퓨터와 같은 차세대 PC의 요소 기술을 개발 중이다.

다. 유럽
유럽에서는 스마트섬유, 스마트패션 등 스마트웨어(Smart Wear)와 같은 웨어러블 컴퓨터에 대한 연구가 활발히 진행되고 있으며, 필립스에서는 음성인식 이동전화와 MP3 플레이어를 개인무선네트워크(Personal Area Network: PAN)으로 연결한 의류와 인피니온에서는 전도성 섬유를 이용한 MP3 플레이어와 이어폰이 내장되고 세탁이 가능한 의류 등을 개발하였다.
유럽은 정보화사회기술계획(IST)의 일환으로 미래신생기술(FET) 사업에서 IT를 일상사물 및 환경 속에 통합하여 인간생활을 지원하는 사라지는 컴퓨팅(disappearing computing) 계획을 추진하고 있으며, 6차 프레임워크 프로그램(FP6)에서는 이동환경의 산업 근로자를 위한 서비스 및 응용 기술 개발을 목표로 2004년 6월부터 5년간 총 2,370만 유로달러를 투입, HP, MS, 소니 등 총 36개 기관이 참여하는 웨어러블 컴퓨팅 프로젝트(wearIT@work)를 진행하고 있다.

라. 일본
일본 쓰쿠바대 등에서는 오감, 제스처인식 등 차세대 휴먼인터페이스 기술과 증강현실 응용 기술을 연구 중에 있으며, NTT에서는 냄새와 촉각을 전달하는 휴대폰 개발을 착수하였으며, 오사카과학기술센터를 중심으로 오감을 찾아내는 센서 디바이스, 전달하는 정보통신, 재현 기술 개발 등을 위한 오삼산업포럼을 발족하여 추진중이다.
마쓰시타와 NTT 도코모에서 추진하고 있는 인체통신 기술은 신호의 진폭을 변조하여 전송하는 방식으로 간단한 ID(식별자)를 전송하는 기술과 전기신호 전송 후, 광센서의 비접촉 방식으로 미약한 전기신호를 감지하여 고속으로 신호를 복원시키는 기술을 각각 개발하였다.
일본의 IT 정책 주무 부처인 총무성은 2003년도 정책 기본 방향으로 네트워킹을 중심으로 유비쿼터스 인프라 정비와 네트워크 이용 촉진을 우선순위로 두고 있으며, 2000년부터 오감정보통신기술에 관한 조사 연구회를 구성하고 관련 연구개발을 추진중에 있다.


3. 차세대PC 기술발전 방향

가. 기술 특징
유비쿼터스 컴퓨팅 환경에서는 정보교환 대상이 사람과 사람 중심에서 사람과 사물, 사물과 사물로 점차 확산되어 컴퓨팅 기능이 주위에 내재되므로 이로부터 정보를 획득하여 활용하거나 사용자가 인식하지 못하는 상태에서도 컴퓨팅 기능을 수행할 수 있어야 한다.
차세대PC의 기술 범위는 인간 친화적인 정보기기를 구성하기 위한 것으로 휴대성과 편의성을 개선하여 언제, 어디서나 컴퓨팅을 실현할 수 있어야 하며, 상시 들고 다닐 수 있을 정도의 소형 컴퓨팅 기기를 통하여 유비쿼터스 컴퓨팅 서비스를 제공할 수 있어야 한다,
따라서 차세대PC는 착용성, 저전력, 소형화 기술에 의한 스마트웨어 분야와 재래식 키보드, 마우스, 모니터 등을 대체할 소형 디스플레이 등을 포함하여 손의 사용을 자유롭게 하는 입출력 장치와 시각, 청각, 촉각, 후각, 미각 등 인간의 오감 메커니즘을 활용한 오감정보처리 기술을 위한 차세대 사용자 인터페이스 분야, 그리고 데이터 송수신을 위한 신체 네트워크(Body Area Network: BAN), PAN(Personal Area Network) 등과 같은 웨어러블 네트워크 기술을 포함한다.

나. 발전 방향
정보통신 서비스가 새롭게 출현할 때마다 각기 다른 단말기들을 구입해야 하는 현 시점에서볼 때, 차세대PC는 소형화, 착용화, 실감화, 지능화 추세에 따른 기술과 제품, 서비스의 단계별 발전 방향을 예측할 수 있다.
1단계는 인간 친화적으로 사용자의 편의성을 극대화시키는 것으로 종합정보기기 개념의 기존 PC는 사용자들의 정보 이용 환경과 목적에 따라 기능의 분리와 용도의 전문화가 이루어지고, 사용자의 편의성 및 의사소통의 효율성, 자연성을 극대화시키는 인간 중심의 정보단말로 발전될 것이다.
2단계는 신체적, 정신적 능력을 향상시키는 지능화 단계로써, 차세대PC의 입출력 기기가 더욱 소형화되고, 기능은 세분화되어 시계, 목걸이, 반지, 안경형태의 착용 가능한 입는 컴퓨터로 발전될 것이다. 초기에는 옷에 컴퓨터나, 센서 등을 부착하거나 소지하는 수준에서 옷이 컴퓨터가 되는 단계를 거쳐 인간의 몸에 직접 이식, 내장되는 형태로 발전될 것으로 보인다.
3단계는 인간성 발현으로 신문화를 창출하는 단계로써, 차세대 PC는 궁극적으로 시각, 청각, 촉각, 미각, 후각 등 인간의 오감 메커니즘을 이용한 정보의 입출력 기능을 종합적으로 제공하는 오감정보처리 컴퓨터로 발전하게 될 것이다.


4. 차세대PC 표준화 동향

가. 표준화 동향
차세대PC 분야는 세계적으로 초기 시장을 형성하는 단계이므로, 하나의 핵심 표준 주체가 없는 반면, 구성되는 기술별로 추진되고 있으며, 공식 표준화 단계보다는 시장 및 기업 등에서 사실(defacto) 표준화로 진행되고 있다.
차세대 PC 플랫폼 분야에서는 ARM, 인텔, 프리스케일, 삼성, 텍사스인스트루먼트와 ST 마이크로일렉트로닉스 공동으로 무선 핸드헬드 기기 인터페이스에 대한 개방형 표준 제정을 위한 모바일 산업 프로세서 인터페이스(MIPI) 연맹을 발족하여 핸드셋, 반도체, R&D 컨소시엄, 주변장치, 운영체제, 응용 소프트웨어 개발업체 등 2005년 기준으로 90개 이상의 회원사가 가입하여 활동하고 있으며, 관련 기술 보유 기업 등을 중심으로 전략적 기술협력 및 컨소시엄 구성을 활발히 전개하고 있다.
차세대 PC 시스템 소프트웨어 분야에서는 마이크로소프트, 팜, 심비안 등이 치열한 시장 선점을 벌이고 있는 가운데, 리눅스 운영체제인 경우, ELC(임베디드 리눅스 컨소시엄; Embedded Linux Consortium)을 중심으로 표준화가 진행중이며, 일본 TRON(실시간 운영체제; The Real-time Operating system Nucleus) 협회에서 임베디드 시스템의 개방형 실시간 운영체제 표준으로 ITRON을 제정하였다.
웨어러블 네트워크 분야에서는 WAP, SyncML 등 관련 단체들이 통합되어 2002년 결성된 OMA(Open Mobile Alliance) 표준단체에서 무선기기 및 응용간의 데이터 동기화 및 기기의 구성관리, 갱신, 유지보수 등에 대한 표준 규격을 제정하였으며, 2004년에는 멀티모달 및 다중 기기 서비스 요구사항 등에 대한 초안이 마련되어 표준 개발이 진행중에 있다.
웨어러블 네트워크의 NFC(근접장통신; Near Field Communication) 분야는 노키아, 소니, 필립스 공동으로 2004년 3월 NFC-포럼을 설립하였으며, WWRF(Wireless World Research Forum)에서는 미래 무선통신 시스템 설계에 대한 공통된 비전 수립을 위한 연구개발 방향과 대상 기술개발 제안 및 확산을 목적으로 하며, 국내에서는 삼성전자, LG, SKT, ETRI에서 참여하고 있다. WWRF-WG5에서 웨어러블 네트워크 분야의 WBAN, WSAN 기술, 응용을 다루고 있으며, 아직 구체화된 모델 설정단계가 아니므로, 이 분야에 대한 국내 조기 참여가 필요하다.

나. 표준화 정책
정보통신부는 차세대PC의 기술, 제품 호환성 제공을 위한 개방형 표준규격 개발과 중장기 표준기술 확보를 위하여 차세대PC 플랫폼, 웨어러블 네트워크 및 사용자 인터페이스 분야의 선행 표준 기술연구를 위한 차세대PC 표준화 포럼을 2004년 6월 발족하였으며, 오감정보 융합 재현을 위한 오감정보 부호화 및 동기화 기술 표준 선행연구와 아울러 초소형, 초절전 시스템 소프트웨어 API에 대한 표준화 연구가 추진되고 있다.
차세대 PC 표준화 포럼은 기술 표준화 및 응용 서비스 표준화 분과위원회로 구성되어 있으며, 기술 표준화 분과에서는 IPR 조기 확보를 위한 기술 발굴, 국제 표준 조기 수용 및 타 분야 신성장 산업의 기술 융합화 추세에 대응한 기술개발 과제간 표준화 연계방안 도출 및 추진체계 확립을 위하여 차세대PC 플랫폼, 웨어러블 네트워크, 사용자 인터페이스, 오감정보 등 4개 워킹그룹으로 구성된다.

다. 특허 동향
국내 특허 출원 동향은 초단거리 개인무선통신 인터페이스(54%)가 가장 높은 비율을 차지하고 있으며, 차세대 PC 플랫폼(15%), 스마트 I/O(13%), 사용자 친화형 소프트웨어(11%), 그리고 오감정보 사용자 인터페이스(7%) 순으로 구성되며, 2000년을 기점으로 관련 기술들의 비중이 점차 확대되고 있음을 알수 있다.
미국은 차세대 PC 플랫폼과 초단거리 개인무선통신 인터페이스가 각각 38%의 높은 비율을차지하고 있으며, 1999년부터 2001년에 들어와서 급증하는 추세를 보이고 있다. 1980년에 전도성 섬유 관련 응용에 관한 특허가 최초로 미국에 출원된 이후, 1990년대 들어 스마트 섬유에 대한 연구가 본격 추진되고 있다.
유럽은 차세대PC 플랫폼(37%), 초단거리 개인무선통신 인터페이스(28%), 스마트 I/O(26%), 오감정보 사용자 인터페이스(8%), 사용자 친화형 소프트웨어(1%) 순으로 비율을 보인다.
일본은 1985년부터 2000년까지 간헐적으로 출원이 이루어지고 있으며, 오감정보 사용자 인터페이스에 관한 특허 비율(11%)이 한국(7%)과 미국(3%)에 비해 높은 비율을 차지하고 있다.
차세대 PC 기술의 국가별 특허출원 동향은 한국(218건), 미국(163건), 일본(137건) 순으로 초단거리 개인무선통신 인터페이스 분야에 가장 많은 출원을 했으며, 유럽은 차세대 PC 플랫폼 분야에 27건으로 다른 국가들과는 다른 경향을 보이고 있으나, 2004년 이후부터 BAN(Body Area Network) 분야에 대한 활발한 기술 투자가 진행되고 있다. 


5. 결론
차세대 PC는 제품의 유형이 다양하고 초기 발아기에 있으므로, MS의 윈도, 인텔의 CPU 등 PC와 같은 시장 지배적 구도가 형성되지 않았으며, 신제품의 지속적인 출시와 라이프사이클이 짧아 제품간, 제품군간, 기업간 복합적인 경쟁구도를 형성하고 있으므로, PC 중심의 컴퓨팅에서 유비쿼터스 컴퓨팅으로의 패러다임 변화를 기회로 섬유, 패션, 문화 등 전통산업과 IT 기술 접목에 의한 차세대 PC를 통하여 새로운 미래 전략 산업화 기회를 확보해야 할 것이다.
 
차세대 성장동력으로서의 차세대 PC는 PC의 기능성과 네트워크의 접속성을 바탕으로 인간 중심의 정보이용 환경을 제공하고, 컴퓨터, 통신, 오락, 방송, 가전 등이 융합화되는 전방위(全方位) 산업으로 타 산업의 통합 모델이 될 것으로 기대된다.
따라서 차세대 PC는 유비쿼터스 컴퓨팅을 위한 출발점이며, 언제, 어디서나, 누구나 자신만의 디지털 라이프스타일을 즐길 수 있는 보편적인 서비스 이용환경을 제공함과 아울러 우리가 원하는 장소에서 원하는 시간에 원하는 일들을 할 수 있게 함으로써 우리의 생활에 새로운 변화를 가져다주는 유비쿼터스 시대의 정보 생활 필수품으로 자리매김할 것이다

728x90

'Etc' 카테고리의 다른 글

국가대표시범단 540도발차기!  (0) 2007.03.18
최선을 다해서...  (0) 2006.07.08
결국 게시판 실명제는 도입되는가..  (0) 2006.05.20

+ Recent posts