Search Results for '프로그래밍'


1208 posts related to '프로그래밍'

  1. 2009/08/07 asp:FileUpload 객체와 ThumbnailImage 만들기
  2. 2009/08/07 JQuery tr tag hover 색상 변경
  3. 2009/08/07 jquery tabs 플러그인
  4. 2009/08/07 MAC 어드레스를 알아내는 두가지 예제 (NETBIOS, SNMP) C++
  5. 2009/08/01 윈도우2003 터미널서버 라이센스 문제
  6. 2009/08/01 "이 제품에 대한 설치 원본을 사용할 수 없습니다." 해결 방법
  7. 2009/08/01 자주쓰는 자바스크립트 함수 모음
  8. 2009/08/01 자바스크립트 시간,날짜 계산
  9. 2009/08/01 자바스크립트 아날로그 시계 소스
  10. 2009/08/01 자바스크립트 폼 리셋
  11. 2009/08/01 mysql 외부접속 가능하도록 설정하기
  12. 2009/08/01 mysql root 암호 바꾸기
  13. 2009/08/01 mysql 계정 생성 (grant 이용)
  14. 2009/08/01 mysql 쿼리 정리
  15. 2009/08/01 MySQL 전체 백업 1
  16. 2009/08/01 MS-SQL 백업복원후 분리된 사용자 문제 해결
  17. 2009/08/01 MS - SQL에서 도스 명령어를?
  18. 2009/08/01 MS-SQL 약식 테이블 명세서 보기(쿼리문)
  19. 2009/08/01 쿼리분석기, Enterprise Manager등의 툴에서 MSSQL 접속 포트 변경
  20. 2009/08/01 저장프로시저에서 동적 쿼리 사용
  21. 2009/08/01 중복데이터 삭제 쿼리
  22. 2009/08/01 이클립스에서 ASP 개발하기
  23. 2009/07/30 2008년 11월 18일자 최종 한국 변경 우편번호 SQL
  24. 2009/07/27 Ext File Upload Form Widget
  25. 2009/07/27 JS Charts - Free Javascript Chart Generator
  26. 2009/07/27 Create iCal-like Calendars with CSS and jQuery
  27. 2009/07/27 Excel Style Keyboard Navigation for HTML Tables
  28. 2009/07/27 TinyTable - Easy to Use Javascript Table Sorter
  29. 2009/07/27 jQuery iPod Drilldown and Flyout Styles Menu System
  30. 2009/07/27 JQuery 사용해보기

회사 홈페이지를 만들때 ThumbnailImage가 들어가서 보여줘야한다는 얘기에 테스트를 했다.

오랜에 Web 쪽 소스 ( 정확히는 asp.net 소스) 를 보니 왜이렇게 낳선지...

asp.net2 에 FileUpload 객체가 있더라.. 1쩜대에서는 HTML 컨트롤을 서버 컨트롤로 바꿔서 했던거 같은데

뭐 어쨌든 바뀌긴 했다 ㅡㅡ;

일단 테스트 테스트


if (FileUpload1.PostedFile != null)
        {
            string strFilePath = FileUpload1.PostedFile.FileName;
            string strFileLength = FileUpload1.PostedFile.ContentLength.ToString();
            string strFileType = FileUpload1.PostedFile.ContentType.ToString();

            System.IO.FileInfo fi = new System.IO.FileInfo(strFilePath);
            string strFileName = fi.Name;

            string strNewPath = Request.PhysicalApplicationPath + @"\upload\image\" + strFileName;
            FileUpload1.SaveAs(strNewPath);
            Response.Write("파일명 : " + strFileName + "<br />파일 크기 : " + strFileLength + "bytes<br />파일 타입 : " + strFileType);

            System.Drawing.Image rImg;
            rImg = System.Drawing.Image.FromFile(strNewPath);
            rImg = rImg.GetThumbnailImage(40,40,null,IntPtr.Zero);
            string thumFileUrl = Request.PhysicalApplicationPath + @"\upload\image\Thumbnail\" + strFileName;
            rImg.Save(thumFileUrl,System.Drawing.Imaging.ImageFormat.Jpeg);
           
        }

두가지를 합쳤다. 파일을 업로드 하면 Thumbnail 폴더에는 썸네일이미지가 아주 잘 들어간다.

테스트이기 때문에 변수로 처리한것 보다 그냥 고정으로 입력해 놓은게 많다.

이제 저걸 어찌 고쳐서 활용할지 생각해 봐야 겠다. ( 많이 쓰일듯.. 흐흐 )

2009/08/07 21:26 2009/08/07 21:26

JQuery 책을 한번 쭉~~ 읽어 봤다..

예제로 올라와 있는 소스를 약간 변경해서 마우스 오버했을때 색상이 변경되도록 수정을 했다.

사용한건 hover 메소드와 toggleClass를 사용했다.


작성하면서 있었던 한가지 문제점은 hover 메소드를 bind 한 확장Element 집합은 table.hover tr 이었는데 event.target은 td 엘리먼트가 돌아오는 것이었다.

그래서 사용했던게 parentElement 속성을 사용했었으나! parentElemet 속성을 FF 에서 인식하지 못하는 문제가 발생하였다.

( IE, FF, OP 테스트 SF는 본인 PC가 이상해져서 테스트 못 함)

그래서 사용한것이 XPath 문법인 parentNode를 사용하여 tr 로 접근 하였다.


CSS 를 잘 정의하면 쉽게 기능을 붙여 나갈수 있을듯하다.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 <html xmlns="http://www.w3.org/1999/xhtml">

  <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>움직이는 얼루 무늬</title>
    <script type="text/javascript" src="../scripts/jquery-1.2.1.js">
    </script>
    <script type="text/javascript">
      $(function() {
        $("table.hover tr:nth-child(even)").addClass("striped");
        $("table.hover tr").hover(
            function(event){
                $(event.target.parentNode).toggleClass('striped1');
            },
            function(event){
                $(event.target.parentNode).toggleClass('striped1');
            }
        );
      });
     
    </script>
    <style>
      body,td {
        font-size: 10pt;
      }
      table {
        background-color: black;
        border: 1px black solid;
        border-collapse: collapse;
      }
      th {
        border: 1px outset silver;
        background-color: maroon;
        color: white;
      }
      tr {
        background-color: white;
        margin: 1px;
      }
      tr.striped {
        background-color: coral;
      }
      tr.striped1
      {
       background-color: #C0C0C0;
      }
      td {
        padding: 1px 8px;
      }
      table.hover{
      }
    </style>
  </head>

  <body>
    <table class="hover">
      <tr>
        <th>생산연도</th>
        <th>제조사</th>
        <th>모델</th>
      </tr>
      <tr>
        <td>1965</td>
        <td>Ford</td>
        <td>Mustang</td>
      </tr>
      <tr>
        <td>1970</td>
        <td>Toyota</td>
        <td>Corolla</td>
      </tr>
      <tr>
        <td>1979</td>
        <td>AMC</td>
        <td>Jeep CJ-5</td>
      </tr>
      <tr>
        <td>1983</td>
        <td>Ford</td>
        <td>EXP</td>
      </tr>
      <tr>
        <td>1985</td>
        <td>Dodge</td>
        <td>Daytona</td>
      </tr>
      <tr>
        <td>1990</td>
        <td>Chrysler</td>
        <td>Jeep Wrangler Sahara</td>
      </tr>
      <tr>
        <td>1995</td>
        <td>Ford</td>
        <td>Ranger</td>
      </tr>
      <tr>
        <td>1997</td>
        <td>Chrysler</td>
        <td>Jeep Wrangler Sahara</td>
      </tr>
      <tr>
        <td>2000</td>
        <td>Chrysler</td>
        <td>Jeep Wrangler Sahara</td>
      </tr>
      <tr>
        <td>2005</td>
        <td>Chrysler</td>
        <td>Jeep Wrangler Unlimited</td>
      </tr>
      <tr>
        <td>2007</td>
        <td>Dodge</td>
        <td>Caliber R/T</td>
      </tr>
    </table>
  </body>
</html>

2009/08/07 21:24 2009/08/07 21:24

이번에는 jquery 기반의 tab 플러그인을 사용하기 위해 테스트를 해 봤다.


http://stilbuero.de/jquery/tabs/


위의 사이트에서 참고 하여 가지고 왔다.


항상 그렇듯 가장 좋은 샘플은 Simple!!! 간단한 샘플이다.


그러나 대충 코드를 보니 심플과 페이드가 별 차이가 없는 듯 하다.


그래서 페이드를 선택!!


자 그럼 페이드만 남겨 놓은 소스를 음미해 보자


외부 링크되는 스크립트는 3가지이다.


<SCRIPT src="../lib/jquery.js" type=text/javascript></SCRIPT>
<SCRIPT src="jquery.tabs.pack.js" type=text/javascript></SCRIPT>

이미 알고 있듯이 jquery.js 는 라이브러리이며 tab 과 관련된 라이브러리는 jquery.tabs.pack.js 이다. 기억해 두자.



그리고 html 소스를 보자!


 <div id="container-4">
            <ul>
                <li><a href="#fragment-10"><span>One</span></a></li>
                <li><a href="#fragment-11"><span>Two</span></a></li>
                <li><a href="#fragment-12"><span>Three</span></a> </li>
            </ul>
            <div id="fragment-10">탭1</div>
            <div id="fragment-11">탭2</div>
            <div id="fragment-12">탭3</div>
        </div>


jquery  샘플들의 특징인 겸손한 html!!!!  말 그대로 완전 분리 되어 있다. 여기서 주목할 점은 href 의 경로가 #id 로 되어 있다는 점이다.

다들 알고 있겠지만 #id로 되어 있으면 해당하는 id 위치로 찾아가는 책갈피 기능이 된다. 그러므로 스크립트가 실행될 수 없다면 책갈피 위치인 div가 존재하는 곳으로 위치 이동을 하게 됨으로써 웹 접근성이 구현 되게 된다.

그럼 javascript를 보자.


<script type="text/javascript">
$(function() {

    $('#container-4').tabs({ fxFade: true, fxSpeed: 'fast' });

});
</script>

우오~ 간단 하다!!! 믓찌다!!! 이걸로 끝! 내면 될려나?


설명  쫌 붙여 보자.. 우선 화면을 꾸미기 위해서 class 들을 분류할 필요가 있다.



        navClass: 'tabs-nav',
        selectedClass: 'tabs-selected',
        disabledClass: 'tabs-disabled',
        containerClass: 'tabs-container',
        hideClass: 'tabs-hide',
        loadingClass: 'tabs-loading',


다음의 옵션을 가질수 있다.

navClass : 탭의 헤더 부분을 포함하는 UL 의 class , Default : tabs-nav

selectedClass : 선택된 탭 Li 태그의 class

disabledClass : 비활성화된 탭 Li 태그의 class

containerClass : 내용 div의 class

hideClass : 숨겨진 내용 div의 class

위의 옵션을 다양하게 조절하여 표현 할 수 있다.


음.. 다 맘에 드는데.. 하나가 없다.. click 에서만 셋팅이 된다는 것이다. 일반적인 요구사항 중에 mouseover가 발생 했을때 탭이 변경되도록 해 달라는 요청이 꽤 많은 것을 고려해서 tabs 플러그인을 수정해 보았다.


1. 옵션을 추가한다.


    settings = $.extend({
        initial: (initial && typeof initial == 'number' && initial > 0) ? --initial : 0,
        disabled: null,
        bookmarkable: $.ajaxHistory ? true : false,
        remote: false,
        spinner: 'Loading&#8230;',
        hashPrefix: 'remote-tab-',
        fxFade: null,
        fxSlide: null,
        fxShow: null,
        fxHide: null,
        fxSpeed: 'normal',
        fxShowSpeed: null,
        fxHideSpeed: null,
        fxAutoHeight: false,
        onClick: null,
        onHide: null,
        onShow: null,
        navClass: 'tabs-nav',
        selectedClass: 'tabs-selected',
        disabledClass: 'tabs-disabled',
        containerClass: 'tabs-container',
        hideClass: 'tabs-hide',
        loadingClass: 'tabs-loading',
        tabStruct: 'div',
        selectEvent : "click"
    }, settings || {});


2. 이벤트 바인딩 되는 곳을 settings 에서 불러온다.


        // attach click event
        tabs.bind(settings.selectEvent, function(e) {


3. 테스트 한다!

 $('#container-4').tabs({ fxFade: false, fxSpeed: 'fast',selectEvent:'mouseover' });

Fade 옵션을 false로 바꾸었다 mouseover를 했을때 바뀌는것은 굉장히 빠르게 움직여야 하기 때문에 Fade가 들어가면 좋지 않은듯하다.


===========================================================================================================================

요구사항 1. 탭이 좌측에 위치할 수 있어야 한다.

한참 소스를 수정하다가 생각하니.. navClass 라는 속성이 있던것이 생각이 났다.

그래서 navClass를 tabs-nav-left 라 하고 CSS를 정의 하였다.


.tabs-nav-left
{
  float:left; PADDING-RIGHT: 0px; PADDING-LEFT: 4px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none ;DISPLAY: inline-block
}

.tabs-nav-left  LI {
 MARGIN: 0px 0px 0px 1px; min-width: 84px
}

그리곤 script에서 tabs 정의

$('#container2').tabs({ navClass : "tabs-nav-left"});

저렇게 하면 좌측으로 탭이 가서 붙는다.

물론 .tabs-nav-left 의 하위 컨텐츠에 대한 스타일 시트는 모두 수정해 주어야 한다.

2009/08/07 21:23 2009/08/07 21:23
MAC 어드레스를 얻어내는 두가지 방법입니다.
NETBIOS와 SNMP를 이용한 두가지 샘플인데, 두가지 방법 모두 OS 등의 환경에 관계없이 MAC 어드레스를
정확히 알아냅니다.

또한 당연하겠지만 네트웍카드(NIC)가 두개 이상 있더라도 정확한 값을 돌려줍니다.
받아온 곳은 볼랜드의 코드센트럴인데, NETBIOS는 약간의 버그가 있어서 수정했습니다.
2009/08/07 17:37 2009/08/07 17:37

사용자 삽입 이미지
에러:

Windows 2003,  "라이센스를 제공할 터미널서버 라이센스서버가 없으므로 원격 연결이 끊어졌습니다


원인:

터미널 서비스를 설치하실때 응용프로그램모드가 아닌 관리모드로 설치하셔야 한다.
응용프로그램모드는 라이센스가 있어야 사용가능하며 라이센스 없이는 90일 정도만 사용할 수 있다.

Windows 2000에서는 설치시 두 모드중 하나를 선택하게 했지만 Windows 2003에서는 응용프로그램모드로 기본 설치가 된다.


해결책:

관리모드로 변경하시려면..

제어판-시스템-원격 탭에서 원격데스크톱의 "사용자가 이 컴퓨터에 원격으로 연결할수 있음"에 체크한다

체크를 해야 관리모드로 변경된다.

일단 연결을 해야하는데 급할때는 서버의 날짜를 1년전으로 돌리면 사용가능하다.

 

그래도.. 해결이 안되면.. 넷미팅 등의 다른 서비스의 원격기능을 이용해서 접속한다 ^^;

2009/08/01 10:44 2009/08/01 10:44

Microsoft Visual Studio 2005 Service Pack 1 설치 시 , Windows Server 2003에서는
"이 제품에 대한 설치 원본을 사용할 수 없습니다. 원본이 있는지 또는 액세스할 수 있는지 확인하십시오."라는 에러 메시지를 만날 수 있다.


1. 관리 도구 - 로컬 보안 정책
2. [소프트웨어 제한 정책] 마우스 오른쪽 버튼 클릭 -> 새 소프트웨어 제한 정책
3. [강요] 마우스 오른쪽 버튼 클릭 -> 속성
4. [로컬 관리자를 제외한 모든 사용자] 선택 -> 확인
5. Microsoft Visual Studio 2005 Service Pack 1 설치
6. [소프트웨어 제한 정책] 마우스 오른쪽 버튼 클릭 -> 소프트웨어 제한 정책 삭제

2009/08/01 10:43 2009/08/01 10:43

<script type="text/javascript">

//최상위 체크 로직(chars로 넘긴 값이 있다면 true)
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;
}

//최상위 체크 로직(chars로 넘긴 값이 있다면 false)
function containsChars(input,chars) {
    for (var inx = 0; inx < input.value.length; inx++) {
        if (chars.indexOf(input.value.charAt(inx)) != -1)
            return true;
     }
     return false;
}

// 숫자 체크
function isNum(input) {
    var chars = "0123456789";
    return containsCharsOnly(input,chars);
}

//이름체크
function nameCheck(input){
    var chars = '0123456789~!#$%^&*()_-+=|{}[]<>,./?@';
        return containsChars(input,chars);
}

// 전화 번호 Check
function isPhoneCheck(input) {
    var chars = "0123456789( ).-,<>{}[]_~";
        return containsCharsOnly(input,chars);
}

// 영문 판별
function isPhoneCheck(input) {
    var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        return containsCharsOnly(input,chars);
}

// 영숫자 판별
function isPhoneCheck(input) {
    var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        return containsCharsOnly(input,chars);
}

// 입력값이 숫자,대시(-)로 되어있는지 체크
function isNumDash(input) {
    var chars = "-0123456789";
    return containsCharsOnly(input,chars);
}

// 입력값이 숫자,콤마(,)로 되어있는지 체크
function isNumComma(input) {
    var chars = ",0123456789";
    return containsCharsOnly(input,chars);
}

// 입력값이 사용자가 정의한 포맷 형식인지 체크 - regular expression 참조
function isValidFormat(input,format) {
    if (input.value.search(format) != -1) {
        return true; file://올바른 포맷 형식
    }
    return false;
}

/**
 * 입력값이 이메일 형식인지 체크
 * ex) if (!isValidEmail(form.email)) {
 *         alert("올바른 이메일 주소가 아닙니다.");
 *     }
 */
function isValidEmail(input) {
    //var format = /^(\S+)@(\S+)\.([A-Za-z]+)$/;
    var format = /^((\w|[\-\.])+)@((\w|[\-\.])+)\.([A-Za-z]+)$/;
    return isValidFormat(input,format);
}

/**
 * 입력값이 전화번호 형식(숫자-숫자-숫자)인지 체크
 */
function isValidPhone(input) {
    var format = /^(\d+)-(\d+)-(\d+)$/;
    return isValidFormat(input,format);
}

// 콤마 없애기
function removeComma(input) {
    return input.value.replace(/,/gi,"");
}

// 문자 변환 함수
function alterString(str,before,after) {
    var returnStr = "";
    for(i = 0; i < str.length; i++) {
        value = str.charAt(i);
        index = before.indexOf(value);
        if(index >= 0) value = after.charAt(index);
        returnStr += value;
    }
    return returnStr;
}

// 소 --> 대문자 변환 함수
function ToUpper(arg) {
    var str1 = "abcdefghijklmnopqrstuvwxyz";
    var str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    return alterString(arg,str1,str2);
}

// 대 --> 소문자 변환 함수
function ToLower(arg){
    var str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var str2 = "abcdefghijklmnopqrstuvwxyz";
    return alterString(arg,str1,str2);
}

// 반각 문자를 전각문자로
function convert2ByteChar(x_char) {
    var x_2byteChar = ""; //컨버트된 문자
    var c = x_char.charCodeAt(0);
    if(32 <= c && c <= 126) { //전각으로 변환될수 있는 문자의 범위
        if(c == 32) { //스페이스인경우 ascii 코드 32
            x_2byteChar = unescape("%uFFFC");
        } else {
            x_2byteChar = unescape("%u"+gf_DecToHex(c+65248));
        }
    }
    return  x_2byteChar;
}

// 10진수를 16진수로
function gf_DecToHex(x_dec) {
    var x_Hex = new Array();
    var x_serial = 0;
    var x_over16 = x_dec;
    var x_tempNum = 0;
    while(x_dec > 15) {
        var x_h = x_dec % 16; //나머지
        x_dec = parseInt(x_dec/16); //몫
        x_Hex[x_serial++] = (x_h > 9 ? String.fromCharCode(x_h + 55) : x_h); //16진수코드변환
    }

    //마지막은 몫의 값을 가짐
    x_Hex[x_serial++] = (x_dec > 9 ? String.fromCharCode(x_dec + 55) : x_dec); //16진수코드변환

    //몫,나머지,나머지,.....
    var retValue = "";
    for(var i=x_Hex.length ; i>0 ;i--) {
        retValue += x_Hex[i-1];
    }
    return retValue;
}

// input box에 space, &nbsp;등 만으로 넣고 장난 칠때 이들 문자 뺀 길이를 통해 유효성 체크한다...
function CheckStr(strOriginal, strFind, strChange){
    var position, strOri_Length;
    position = strOriginal.indexOf(strFind); 
    while (position != -1) {
        strOriginal = strOriginal.replace(strFind, strChange);
        position = strOriginal.indexOf(strFind);
    }
    strOri_Length = strOriginal.length;
    return strOri_Length;
}

// 체크 박스에 체크가 되어 있으면 true
function checkValidator(str) {
    if(str.checked) return true;
    else return false;
}

// 비밀번호는 4자 등 최대 최소 길이를 파람으로 주고 처리...
function checkLength(str,minLng,maxLng){
    var ckstr = str.value.length;
    if (parseInt(ckstr) < parseInt(minLng) || parseInt(ckstr) > parseInt(maxLng)) return false;
        return true;
}

// 숫자만 받아서 아니면 메세지 보여 주는
function onlyNumber(objEv) {
    if(!isNum(objEv)){
        alert("숫자만 입력가능합니다.");
        objEv.value = "";
        objEv.focus();
        return;
    }
}

// 숫자를 체크하다가 6자 등 원하는 만큼 이동후 다음 input 박스로 이동 시키는...
function goJump(fname, len, goname){
    onlyNumber(fname);
    if (document.all[fname].value.length == len) document.all[goname].focus();
}

// 주민등록번호 체크 로직
function check_ResidentNO(str_f_num,str_l_num){ 
    var i3=0
    for (var i=0;i<str_f_num.length;i++) {
        var ch1 = str_f_num.substring(i,i+1);
            if (ch1<'0' || ch1>'9') i3=i3+1;
    }
    if ((str_f_num == '') || ( i3 != 0 )) return false;
    var i4=0;
    for (var i=0;i<str_l_num.length;i++){
        var ch1 = str_l_num.substring(i,i+1);
        if (ch1<'0' || ch1>'9') i4=i4+1;
    }
    if ((str_l_num == '') || ( i4 != 0 )) return false;
    if(str_f_num.substring(0,1) < 4) return false;
    if(str_l_num.substring(0,1) > 2) return false;
    if((str_f_num.length > 7) || (str_l_num.length > 8)) return false;
    if ((str_f_num == '72') || ( str_l_num == '18'))  return false;

    var f1=str_f_num.substring(0,1)
    var f2=str_f_num.substring(1,2)
    var f3=str_f_num.substring(2,3)
    var f4=str_f_num.substring(3,4)
    var f5=str_f_num.substring(4,5)
    var f6=str_f_num.substring(5,6)
    var hap=f1*2+f2*3+f3*4+f4*5+f5*6+f6*7
    var l1=str_l_num.substring(0,1)
    var l2=str_l_num.substring(1,2)
    var l3=str_l_num.substring(2,3)
    var l4=str_l_num.substring(3,4)
    var l5=str_l_num.substring(4,5)
    var l6=str_l_num.substring(5,6)
    var l7=str_l_num.substring(6,7)
    hap=hap+l1*8+l2*9+l3*2+l4*3+l5*4+l6*5
    hap=hap%11
    hap=11-hap
    hap=hap%10
    if (hap != l7) return false;
    return true;
}

// 바이트 구하기
function getByteLen(str){
    return(str.length+(escape(str)+"%u").match(/%u/g).length-1);
}

// url 가져오기
function getUrlAddress(){
    var pageUrl = document.location;
    pageUrl  = new String(pageUrl);
    return pageUrl.substring(0,pageUrl.lastIndexOf("/"));
}

// 오른마우스 금지, 나중에 해당 주석 풀고 사용
function rightbutton(e){
    if (navigator.appName == 'Netscape' &&  (e.which == 3 || e.which == 2))
        return false;
    else if (navigator.appName == 'Microsoft Internet Explorer' && (event.button == 2 || event.button == 3))
    {
        alert("죄송합니다!! 정보무단복제를 막기 위하여 오른쪽 마우스 사용을 허용하지 않습니다.");
        return false;
    }
    return true;
}
//document.onmousedown=rightbutton;

// 컨트롤 키 금지, 나중에 해당 주석 풀고 사용
function checkCtl() {
    if (document.all){
        if(event.keyCode==17) {
            alert("죄송합니다!! 컨트롤키 사용을 허용하지 않습니다.");
            return false;
        }
    }
}
//document.onkeydown = checkCtl;

function setCookie(name,value) {
    document.cookie = name+"="+escape(value)+";path=/;domain=.kkaok.pe.kr;";
}

function setCookie(name,value, expires) {
    document.cookie = name + "=" + escape(value) +
    "; path=/; expires=" + expires.toGMTString();
}

function getCookie(Name) {
    var search = Name + "="
    if (document.cookie.length > 0) { // 쿠키가 설정되어 있다면
        offset = document.cookie.indexOf(search)
        if (offset != -1) { // 쿠키가 존재하면
            offset += search.length
            // set index of beginning of value
            end = document.cookie.indexOf(";", offset)
            // 쿠키 값의 마지막 위치 인덱스 번호 설정
            if (end == -1)
                end = document.cookie.length
            return unescape(document.cookie.substring(offset, end));
        }
    }
 }

//문자 바꾸기, 사용법 var str = 문자열.replaceAll("a", "1"); 
String.prototype.trim = function(){
    return this.replace(/(^\s*)|(\s*$)/gi, "");
}

String.prototype.replaceAll = function(str1, str2) {
    var temp_str = "";
    if (this.trim() != "" && str1 != str2) {
        temp_str = this.trim();
        while (temp_str.indexOf(str1) > -1){
            temp_str = temp_str.replace(str1, str2);
        }
    }
    return temp_str;
}
</script>

2009/08/01 10:42 2009/08/01 10:42

1분은 60초, 한시간은 60분, 하루는 24시간, 일주일은 7일, 한달은 30일, 일년은 열두달...

가뜩이나 복잡한 날짜/시간 계산인데

계산방법 마저도 언어마다 달라서 필요할때마다 인터넷 뒤지는것도 일이다.

일단, 자바스크립트 간단한 날짜 계산부터!

var loadDt = new Date(); //현재 날짜 및 시간

//현재시간 기준 계산

 alert(new Date(Date.parse(loadDt) - 30 * 1000 * 60 * 60 * 24)); //30일전
 alert(new Date(Date.parse(loadDt) - 15 * 1000 * 60 * 60 * 24)); //보름전
 alert(new Date(Date.parse(loadDt) - 7 * 1000 * 60 * 60 * 24)); //일주일전
 alert(new Date(Date.parse(loadDt) - 1 * 1000 * 60 * 60 * 24)); //하루전
 alert(new Date(Date.parse(loadDt) + 1 * 1000 * 60 * 60 * 24)); //하루후
 alert(new Date(Date.parse(loadDt) + 7 * 1000 * 60 * 60 * 24)); //일주일후
 alert(new Date(Date.parse(loadDt) + 15 * 1000 * 60 * 60 * 24)); //보름후
 alert(new Date(Date.parse(loadDt) + 30 * 1000 * 60 * 60 * 24)); //한달후

alert(new Date(Date.parse(loadDt) + 1000 * 60 * 60)); //한시간후
alert(new Date(Date.parse(loadDt) + 1000 * 60)); //1분후
alert(new Date(Date.parse(loadDt) + 1000)); //1초후

//응용

alert(new Date(Date.parse(loadDt) + (15000*50) + 1000*60*65))); //15초씩 50번 지난 이후 한시간 5분후

//Date 개체를 입력받아 yyyy-MM-dd hh:mm:ss 형식으로 반환

function timeSt(dt) {
 var d = new Date(dt);
 var yyyy = d.getFullYear();
 var MM = d.getMonth()+1;
 var dd = d.getDate();
 var hh = d.getHours();
 var mm = d.getMinutes();
 var ss = d.getSeconds();

 return (yyyy + '-' + addzero(MM) + '-' + addzero(dd) + ' ' + addzero(hh) + ':' + addzero(mm) + ':' + addzero(ss));
}

//10보다 작으면 앞에 0을 붙임

function addzero(n) {
 return n < 10 ? "0" + n : n;
}

alert(timeSt(new Date()));

 

2009/08/01 10:41 2009/08/01 10:41

자바스크립트로 구현한 가장 기본적인 아날로그 시계 소스


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Analog Clock on Javascript</title>
</head>

<body>
<script type="text/javascript">
//<![CDATA[
function clockPanel() {
 document.getElementById('clock').style.width = 2*r + 'px';
 document.getElementById('clock').style.height = 2*r + 'px';

 document.getElementById('clock').style.position = 'relative';
 document.getElementById('clock').innerHTML += '<div id="center"></div>';
 document.getElementById('center').style.position = 'absolute';
 document.getElementById('center').innerHTML = '+';
 document.getElementById('center').style.left = r + 'px';
 document.getElementById('center').style.top = r + 'px';

 for (ii=1; ii<=60; ii++) {
  document.getElementById('clock').innerHTML += '<div id="time'+ii+'"></div>';
  document.getElementById('time'+ii).style.position = 'absolute';
  if (ii%60 == 0) {
   document.getElementById('time'+ii).innerHTML = '12';
  } else if (ii%5 == 0 || ii%15 == 0) {
   document.getElementById('time'+ii).innerHTML = ii / 5;
  } else {
   document.getElementById('time'+ii).innerHTML = ' ';
  }
  document.getElementById('time'+ii).style.left = cx + r + Math.round(Math.cos((ii-15)*6/180*Math.PI)*r) + 'px';
  document.getElementById('time'+ii).style.top = cy + r + Math.round(Math.sin((ii-15)*6/180*Math.PI)*r) + 'px';
 }
 for (jj=1; jj<=hl; jj++) {
  document.getElementById('clock').innerHTML += '<div id="hour_hand'+jj+'"></div>';
  document.getElementById('hour_hand'+jj).style.position = 'absolute';
  document.getElementById('hour_hand'+jj).innerHTML = '*';
 }
 for (jj=1; jj<=ml; jj++) {
  document.getElementById('clock').innerHTML += '<div id="minute_hand'+jj+'"></div>';
  document.getElementById('minute_hand'+jj).style.position = 'absolute';
  document.getElementById('minute_hand'+jj).innerHTML = '*';
 }
 for (jj=1; jj<=sl; jj++) {
  document.getElementById('clock').innerHTML += '<div id="second_hand'+jj+'"></div>';
  document.getElementById('second_hand'+jj).style.position = 'absolute';
  document.getElementById('second_hand'+jj).innerHTML = '*';
 }
}

function clockHands() {
 var h = new Date().getHours();
 var m = new Date().getMinutes();
 var s = new Date().getSeconds();
 var hx = Math.cos((h-3)*30*deg + m/2*deg)*r*0.8*hl/ml; //hour_hand_x
 var hy = Math.sin((h-3)*30*deg + m/2*deg)*r*0.8*hl/ml; //hour_hand_y
 var mx = Math.cos((m-15)*6*deg)*r*0.8;     //minute_hand_x
 var my = Math.sin((m-15)*6*deg)*r*0.8;     //minute_hand_y
 var sx = Math.cos((s-15)*6*deg)*r*0.8;     //second_hand_x
 var sy = Math.sin((s-15)*6*deg)*r*0.8;     //second_hand_y

 for (jj=1; jj<=hl; jj++) {
  document.getElementById('hour_hand'+jj).style.left = Math.round(cx + r + hx * jj/hl) + 'px';
  document.getElementById('hour_hand'+jj).style.top = Math.round(cy + r + hy * jj/hl) + 'px';
 }
 for (jj=1; jj<=ml; jj++) {
  document.getElementById('minute_hand'+jj).style.left = Math.round(cx + r + mx *jj/ml) + 'px';
  document.getElementById('minute_hand'+jj).style.top = Math.round(cy + r + my *jj/ml) + 'px';
 }
 for (jj=1; jj<=sl; jj++) {
  document.getElementById('second_hand'+jj).style.left = Math.round(cx + r + sx *jj/sl) + 'px';
  document.getElementById('second_hand'+jj).style.top = Math.round(cy + r + sy *jj/sl) + 'px';
 }
 setTimeout('clockHands()',1000);
}

function getClock() {
 r = 100;   //clock radius
 hl = 3;    //hour hand length
 ml = 5;    //minute hand length
 sl = 10;   //second hand length
 deg = Math.PI/180; //degrees
 cx = document.getElementById('clock').scrollLeft;
 cy = document.getElementById('clock').scrollTop;

 clockPanel();
 clockHands();
}

window.onload = getClock;
//]]>
</script>

<div id="clock"></div>

</body>
</html>

2009/08/01 10:40 2009/08/01 10:40

<form id="form1">의 폼 리셋이 필요할 경우 아래와 같은 방법으로 리셋하면 간단히 해결 할 수 있다.

document.getElementById('form1').reset()
document.forms[0].reset();
document.forms['forms1'].reset();
document.forms.form1.reset();


그런데 이 방법이 먹히질 않거나
필요한 요소만 골라서 리셋을 해야할 경우가 있다.

리셋이 필요한 elememt를 골라서 리셋하려면,
if(document.form1.elements[index].type == 'typename')
일일히 찾아서 지정할 수 밖에 없다.


<form id="form1">
...
</form>
<button onclick="clearFields();">Clear All</button>

<script type="text/javascript">
function clearFields() {
    var frm = document.getElementById('form1');
    var em = frm.elements;
    frm.reset();
    for(var i=0; i<em.length; i++) {
        if(em[i].type == 'text') em[i].value = '';
        if(em[i].type == 'checkbox') em[i].checked = false;
        if(em[i].type == 'radio') em[i].checked = false;
        if(em[i].type == 'select-one') em[i].options[0].selected = true;
        if(em[i].type == 'textarea') em[i].value = '';
    }
    return;
}
</script>


input type="text", input type="checkbox", input type="radio" 등은
각각의 type명이 type속성과 동일하지만,
골때리게도 <select>의 타입명은 select-one 이다.

2009/08/01 10:39 2009/08/01 10:39

- 무식한 방법(root 권한이 있을 경우)

bash$>mysql -u root -p

password : ************

mysql>use mysql

mysql>update user set Host='%', Select_priv='Y', Insert_priv='Y', Update_priv='Y', Delete_priv='Y', Create_priv='Y', Drop_priv='Y', Reload_priv='Y', Shutdown_priv='Y', Process_priv='Y', File_priv='Y', Grant_priv='Y', References_priv='Y', Index_priv='Y', Alter_priv='Y', Show_db_priv='Y', Super_priv='Y', Create_tmp_table_priv='Y', Lock_tables_priv='Y', Execute_priv='Y', Repl_slave_priv='Y', Repl_client_priv='Y' where User='USER_ID';

- 그랜트를 이용한 방법

모두: grant all privileges on 디비명.* to 계정@"%" identified by '암호';

특정: grant select,insert,update,delete on 디비명.* to 계정@localhost identified by '암호';

- 암호바꾸기

set password for '계정@localhost'=old_password('NEW_PASSWORD');

- 적용시키기

mysql>flush privileges;

   또는

bash$>mysqladmin -u root -p reload

password : ************

2009/08/01 10:36 2009/08/01 10:36

MySQL 의 root 사용자 암호 바꾸기

MySQL 초기 설치시 관리자 암호는 설정 되어져 있지 않다.실질적으로
서비스 할경우엔 반드시 관리자(root) 암호를 설정해야 한다.

root 암호 설정하는 방법에는 3가지가 있다.

1. UPDATE 문 이용하기
2. SET PASSWORD 이용하기
3. mysqladmin 이용하기

▶ UPDATE 문 이용하기

$ mysql -u root mysql

mysql> update user set password=password('new-passwd') where user='root';
mysql> flush privileges;

update 문 이용하여 암호를 변경할땐 꼭 flush privileges; 를 실행
하여 변경된 내용을 적용해야 한다. MYSQL 에서 사용자 권한에 관한
내용은 MYSQL 실행시 메모리에 불러놓고 이용되는데 이에 관해 변경
된 내용이 있을땐 반드시 서버에 변경된 내용을 갱신하라는 명령을
전달해야 한다.


▶ SET PASSWORD 이용하기

mysql> set password for root=password('new-passwd');

이 방법은 flush privileges 가 필요 없다.

mysqladmin 이용하기

root 암호 초기 설정 시 :

$ mysqladmin -u root password new-passwd

root 암호 변경 시 :

$ mysqladmin -u root -p password new-passwd
Enter password: 

2009/08/01 10:35 2009/08/01 10:35

- grant 이용

grant all privileges on 디비명.* to 계정@localhost identified by '암호' with grant option;

flush privileges;

더 간단하게..

grant all on 디비명.* to 계정@localhost identified by '암호';

flush privileges;

계정삭제

revoke all on 디비명 from 계정@localhost

- mysqladmin 이용

mysqladmin -u아이디 -p비밀번호 drop ID

mysqladmin -u아이디 -p비밀번호 creat ID

2009/08/01 10:35 2009/08/01 10:35
MySQL에서 지원하는 데이터타입
  • INT : 4bytes 정수
  • CHAR(n) : 문자의 수가 n개인 문자열
  • VARCHAE(n) : 문자의 수가 최대 n개인 문자열
  • TEXT : 문자의 수가 최대 65535개인 문자열

 

CREATE TABLE (새로운 테이블 생성)

create table 테이블명 (

필드명 데이터타입 [NOT NULL]

{, 필드명 데이터타입 [NOT NULL]}*

[,PRIMARY KEY (필드명)]

)

 

ALTER TABLE(테이블구조 및 속성변경)

기존의 테이블구조 변경

1. 필드추가생성

ALTER TABLE 테이블명 ADD [COLUMN] 필드명 필드타입

예) ALTER TABLE userdb ADD COLUMN addr VARCHAR(100)

 

2. 필드속성변경

ALTER TABLE 테이블명 CHANGE [COLUMN] 기존필드명 새필드명 필드타입

예)ALTER TABLE userdb ADD addr VARCHAE(100)

예) ALTER TABLE userdb CHANGE COLUMN addr address VARCHAR(255)

 

3. 필드삭제

ALTER TABLE 테이블명 DROP [COLUMN] 필드명

예) ALTER TABLE userdb DROP COLUMN address

 

4. 기존의 테이블삭제

DROP TABLE 테이블명

 

  SELECT (데이터검색하기)

SELECT [DISTINCT] 테이블명 {, 테이블명}*

FROM 필드명 {,필드명}*

[WHERE 검색조건]

[ORDER BY 필드명[ASC or DESC] {,필드명 [ASC or DESC]}*]

[GROUP BY 필드명 {, 필드명}*]

[HAVING  검색조건]

 

1. 일반적인 검색

SELECT name, id FROM userdb WHERE level = 'B'

SELCET * FROM userdb

SELECT name, id, email, sex, milage, level FROM userdb

 

2. 결과레코드의 중복제거

SELECT level FROM userdb

SELECT DISTINCT level FROM userdb

 

3. 조건검색

SELECT name, id, email FROM userdb WHERE milage > 3000 AND sex = 'M'

 

4. 검색결과의 정렬

SELECT name, id, milage FROM userdb WHERE milage >= 3000 ORDER BY milage DESC

 

5. 검색결과에 대한 산술계산 및 문자열처리

SELECT name, '님의 마일리지는 ', milage, '점입니다.' FROM userdb WHERE milage >= 3000 ORDER BY milage

SELECT name, id, email, milage+300 FROM userdbWHERE id = 'soony'

 

6. 그룹함수(group function)를 이용한 검색

SELECT count(*) FROM userdb WHERE sex = 'F'

SELECT avg(milage) FROM userdb WHERE sex='F'

 

7. GROUP BY를 이용한 검색

SELECT level, max(milage), min(milage), avg(milage) FROM userdb GROUP BY level

SELECT sex, max(milage), min(milage), avg(milage) FROM userdb GROUP BY sex

 

8. HAVING을 이용한 검색

SELECT sex, max(milage), min(milage), avg(milage) FROM userdb GROUP BY sex HAVING sex = 'F'

 

9. BETWEEN 연산자를 이용한 검색

SELECT name, email, mailage, sex FROM userdb WHERE sex = 'F' AND milage BETWEEN 3000 AND 4000

SELECT name, email, milage, sex FROM userdb WHERE sex = 'F' AND milage >= 3000 AND milage <= 4000

SELECT name, sex, milage FROM userdb WHERE milage NOT IN (3300,3500,3700)

 

10. LIKE를 사용한 검색

SELECT name FROM userdb WHERE name, LIKE '%현%'

SELECT name, id, FROM userdb WHERE id LIKE 'm%'

 

11. NULL값을 갖는 데이터검색

SELECT name, id FROM userdb WHERE email IS NULL

SELECT name, id FROM userdb WHERE email IS NOT NULL

 

  INSERT (새로운 데이터의 삽입)

INSERT INTO 테이블명 [(필드명{[, 필드명]}*)] VALUES (필드값)

INSERT INTO userdb (name, id, email, sex, milage, level) VALUES ('이완철', 'yunka1018','sspark@kornet.net'.'M','3500','B')

INSERT INTO userdb VALUES('이완철', 'yunka1018','sspark@kornet.net','M','3500','B')

INSERT INTO userdb (id, name) VALUES('yunka1018','정양미')

 

  데이터의 수정(UPDATE)

UPDATE 테이블명 SET 필드명=필드값 또는 산술식 {, 필드명 = 필드값 또는 산술식}*[WHERE 검색조건]

 

UPDATE userdb SET sex = 'F' WHERE name = '김현아'

UPDATE userdb SET sex = 'F'

만일 위와 같이 WHERE절로 검색조건을 명시하지 않은 경우에는 해당테이블내의 모든레코드의 필드값이 설정한값으로 수정되므로 유의해야한다.

UPDATE userdb SET sex = 'F'

UPDATE userdb SET milage = milage + 300

 

  DELETE (데이터의 삭제)

DELETE FROM 테이블명 [WHERE 검색조건]

DELETE FROM userdb WHERE id = 'king94'

DELETE FROM userdb

만일 위와 같이 검색조건을 지정하지 않으면 해당테이블내의 모든레코드가 삭제되므로 주의해야한다.

 

  MYSQL 데이터베이스의 사용법

1. MYSQL서버의 기동과 종료

이하 디렉토리위치는 /usr/local/mysql/bin이다.

./bin/safe_mysql &

 

2. MYSQL서버의 종료 및 재기동

safelab.skku.ac.kr.pid파일은 MYSQL의 PID를 저장하고 있다.

kill -9 PID

mysqladmin -u root  -p shutdown

mysqladmin -u root -p reload

 

3. mysqladmin 사용법

mysqladmin -u root  -p reload

mysqladmin -u root -p create sample

mysqladmin -u root -p drop sample

 

4. mysql 클라이언트사용법

mysql -u root -pphp99 mysql

mysql -u root -p mysql

mysql>show databases;

mysql>show tables;

mysql>show columns from db;

mysql>desc db;

mysql>select host, user, password from user;

mysql>update user set password = password('php99') where user = 'root';

mysql>select host, user, password from user;

mysql>drop database sample;

 

5. 생성된 데이터베이스의 등록

mysql>insert into db values('%','sample','php','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

mysql>select host, db, user from db;

 

6. 새로운 사용자(데이터베이스 소유자)등록

mysql>insert into user (host, user, password) values('localhost','php','password('php99'));

mysql>select host, user, password from user;

 

7. 테이블의 생성과 수정 및 삭제

mysql -u root -p sample

mysql>show tables;

mysql>desc userdb;

mysql>alter table userdb change column id varchar(12) NOT NULL;

mysql>desc userdb;

mysql>drop table userdb;

mysql>show tables;

 

8. *.sql파일로 쉘에서 SQL명령어 실행

mysql -u root -p php99  sample < userdb.sql

mysql -u php -p sample

mysql>show tables;

 

9. 데이터의 백업과 복구

mysqldump -u [DB사용자명] -p [백업할 데이터베이스명] > [외부로 저장할 파일명]

mysqldump -u php -p sample > sample_backup.sql

cat sample_backup.sql

mysql -u php -p php99 sample < sample_backup.sql

2009/08/01 10:34 2009/08/01 10:34

mysqldump 를 이용한 MySQL DB전체 백업 명령 (3가지 명령 중 맘에 드는걸로)

  mysqldump -u root -p --all-databases > all_databases.sql

  mysqldump -u root -p -A > all_backup.sql

  mysqldump --opt -A -u root -ppassword > all_backup.sql


잠긴 테이블까지 백업

  mysqldump -u 아이디 -p --lock-all-tables DB명 > 파일명.sql

두개 이상의 DB를 선택 백업

  mysqldump -u 아이디 -p --databases DB명1 DB명2 > 파일명.sql

두개 이상의 테이블만 선택 백업

  mysqldump -u 아이디 -p DB명 --tables 테이블명1 테이블명2 > 파일명.sql

캐릭터셋 지정 백업

  mysqldump -u 아이디 -p --default-character-set=euckr DB명 > 파일명.sql

응용 : 두개의 DB만 euckr문자셋으로 잠긴테이블까지 백업

  mysqldump -u root -p --default-character-set=euckr --lock-all-tables --databases 디비명1 디비명2 > 파일명.sql

2009/08/01 10:32 2009/08/01 10:32

쿼리분석기에서 아래의 명령을 수행한다



use DB_NAME


--분리된 사용자 찾기

exec sp_change_users_login 'Report'

--현재 데이터베이스에서 어떠한 로그인에도 연결되지 않은 사용자와 해당 SID(보안 ID)를 나열


--연결하고자 하는 유저를 하나씩 아래 프로시저로 실행한다.
exec sp_change_users_login 'Update_One','LOGIN_NAME','LOGIN_NAME'



--자동으로 모두 연결하려면 아래 프로시저를 실행한다.

exec sp_change_users_login 'Auto_Fix', 'LOGIN_NAME'

2009/08/01 10:31 2009/08/01 10:31
MS - SQL에서 도스 명령어를 실행할 수 있습니다.

바로 xp_cmdshell 을 통해서죠.

간단히 말하면 xp_cmdshell는 도스 명령어를 실행할 수 있게 해주는 프로시저입니다.

다음은 디렉터리 명령을 실행하는 xp_cmdshell 확장 저장 프로시저를 보여 주는 예제입니다.
EXEC master..xp_cmdshell 'dir *.exe'

(참고, 기본적으로 디렉토리의 시작은 C:\WINNT\system32\ 입니다.
그러니 저 명령어는 C:\WINNT\system32\*.exe 파일을 찾겠네요.

또 다른 예를 볼까요?

xp_cmdshell 'del C:\TEST.CSV'
이렇게 하면 해당 파일을 찾아서 지워줍니다. 파일이 없으면 파일이 없다고 결과값을 반영하고,
별 에러없이 지워졌으면 NULL결과값을 반영합니다.

우와 잘못하다간 C를 통째로 날려 버릴수도 있겠네요.. 즉 QA랑 db계정만 알고 있으면
해킹은 간단합니다. 예전에 MS-SQL 7.0 일 경우에는 설치할 때 sa의 패스워드를 설치시 묻지도 않아서 ODBC를 통한 해킹도 쉽게 가능했습니다.

다음은 MSDN의 좀 더 실질적인 예제입니다.
사용자에게 net send를 사용하여 SQL Server가 곧 종료된다는 것을 알리고 net pause를 사용하여 서버를 일시 중지한 다음, net stop을 사용하여 서버를 종료합니다.

CREATE PROC shutdown10
AS
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down
in 10 minutes. No more connections allowed.', no_output
EXEC xp_cmdshell 'net pause sqlserver'
WAITFOR DELAY '00:05:00'
EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down
in 5 minutes.', no_output
WAITFOR DELAY '00:04:00'
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down
in 1 minute. Log off now.', no_output
WAITFOR DELAY '00:01:00'
EXEC xp_cmdshell 'net stop sqlserver', no_output



이런것 만들어 두면 편하겠죠?


xp_cmdshell 프로시저를 사용하면 다양하게 응용할 수 있습니다. 
2009/08/01 10:30 2009/08/01 10:30

-- MS-SQL 약식 테이블 명세서 보기(쿼리문)

-- 테이블명, 번호, 컬럼명, 테이터 타입, 데이터 크기, NULL여부, 기본값  순으로 출력 됨

-- 쿼리 분석기에서 아래의 SQL 문을 실행하고, 출력된 결과를 마우스 드레그를 통해 복사한 후 엑셀로 정리 가능


SELECT TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
ORDER BY TABLE_NAME, ORDINAL_POSITION 

2009/08/01 10:28 2009/08/01 10:28

쿼리분석기, Enterprise Manager, SQL Server Management Studio 등의 툴에서

기본 포트가아닌 포트로 MSSQL을 접속 할 때,

일반적으로 사용하는 ":" 대신 ","로 포트 구분 해 줘야 함


예)
123.123.123.123:9999 (X)

123.123.123.123,9999 (O)

2009/08/01 10:28 2009/08/01 10:28

저장프로시저에서 테이블명은 변수로 받아서 바로 쓰지 못한다.

동적 쿼리에서 몇가지 조건의 경우는 오류 메시지가 나는데,

테이블명을 동적으로 받아올때가 그 중 하나이다.

동적 쿼리를 사용하면 DBMS가 미리 실행 계획을 준비해놓기 힘들기 때문에 작업 효율에 문제가 생기므로 일반적인 경우는 동적 쿼리를 자제하는 것이 좋다.

몇가지 관리 목적에서 동적 쿼리를 사용해야만 한다면, sp_executesql 를 사용하면 된다.


ex)

CREATE PROC test
 @게시판 VARCHAR(128)
AS
 DECLARE @sql NVARCHAR(512)

 SET @sql = 'SELECT * '
 SET @sql = @sql + ' FROM ' + @게시판
 SET @sql = @sql + ' ORDER BY idx DESC '

 EXEC sp_executesql @sql
GO

2009/08/01 10:27 2009/08/01 10:27

한개의 테이블에 고유키 없이 중복된 데이터가 들어가 있을 경우 불필요한 중복 데이터 삭제 방법


우선, 테이블 디자인 수정에서 필드 하나를 추가 한다.

타입은 int 로 주고, 속성은 일련번호로 주면 각 필드마다 일련번호 숫자가 알아서 들어간다.


추가한 필드의 이름이 idx 일 경우 아래의 형식대로 쿼리를 날리면 중복데이터는 한개씩만 남고 사라진다.


DELETE FROM 테이블명 WHERE (NOT EXISTS
   (SELECT idx
   FROM (SELECT MIN(idx) idx
      FROM 테이블명
      GROUP BY 중복컬럼명) X
   WHERE 테이블명.idx = X.idx))

쿼리 날리기전 백업은 기본!!

 
2009/08/01 10:27 2009/08/01 10:27

한때 웹을 주름잡았던 ASP는 점점 퇴행길을 가고 하지만, 아직도 ASP개발은 곳곳에서 많이 이루어지고 있다.
ASP는 나름대로 프레임워크도 있고, IDE툴을 이클립스를 사용하며 SVN으로 형상관리도 할 수 있다.
ASP 프레임워크는 기회가 있을때 공개를 하기로 하고, 이클립스에서 ASP를 개발하는데 필요한 셋팅에 대해서 알아보자.


이클립스는 CVS를 기본 지원하며 SVN과도 궁합이 잘 맞아 형상관리가 쉽게 된다.

또 outline에 Class나 Function, Sub들이 나타나기 때문에 한눈에 소스 전체를 파악하기도 좋다.

특히나 FTP를 많이 사용할 경우 Aptana의  FTP Synchronize기능을 이용하여 별도의 FTP 없이 이클립스에서 자동으로 업로드/다운로드를 할수 있다.

단순하게 텍스트 에디트를 사용한다면 한번쯤 이클립스 사용을 도전해 보는것도 좋다.

사용자 삽입 이미지

1. 이클립스 다운로드

WTP all-in-one 버전을 받는것이 좋다. 물론 그 전에 Java를 사용하든 안하든 반드시 설치 해야 한다.

Java는 http://java.sun.com 에서 다운받을 수 있고, 이클립스 WTP all-in-one은 http://eclipse.org/downloads 에서 다운 받을 수 있다.
이 상태로도 프로젝트를 생성해서 ASP개발 할 수 있지만 구문강조 및 SVN지원을 위해서 몇가지 플러그인을 더 설치해야 한다.



2. SVN 플러그인 설치
이클립스는 기본적으로 CVS를 지원해 주지만, SVN을 사용하려면 SVN 플러그인을 설치해야 한다.
플러그인은 URL Update 기능을 이용하여 설치할 수 있다.
이클립스를 실행한 후,
Help > Software Updates > Fine and install > Search for new features to install > Next > New Remote Site 로 이동한 다음,

Name에 Subversive를 입력하고, URL에  http://www.polarion.org/projects/subversive/download/update-site 를 입력 한다.



3. Aptana 플러그인 설치

요즘 Ajax 때문에 Javascript를 많이 사용하게 되는데, 버전별 호환성이라던지 Javascript Framework를 사용할 때 자동완성 기능을 제공 해 주는 플러그인이다.
설치법은 SVN 플러그인과 같다.

Name은 Aptana, URL은 http://update.aptana.com/install/ 를 입력한다.



4. EcliipseColorer 설치

ASP 구문강조를 위해서 필요한 플러그인이다.

ASP 구문에 구문강조를 해 주고, Outline에 Class, Function, Sub 리스트를 보여 주는 역할을 한다.

Name은 EclipseColorer, URL은 http://colorer.sf.net/eclipsecolorer/ 를 입력한다.

2009/08/01 10:23 2009/08/01 10:23
1. 자료제목 : 2008년 11월 18일자 최종 한국 변경 우편번호 SQL
2. 파일크기 : 5,762 Kbyte
파일 내용
==========
mysql/ mssql 사용자용
=====================
zipcode_mysql_t0.zip - mysql 테이블 (컬럼5개)
zipcode_mysql_t1.zip - mysql 테이블 (컬럼6개)
zipcode_mysql_t2.zip - mysql 테이블 (컬럼7개)
zipcode_mysql_t3.zip - mysql 테이블 (컬럼8개)
zipcode_mysql_t4.zip - mysql 테이블 (컬럼9개)

oracle 사용자용
=====================
zipcode_oracle_t0.zip - oracle 테이블 (컬럼5개)
zipcode_oracle_t1.zip - oracle 테이블 (컬럼6개)
zipcode_oracle_t2.zip - oracle 테이블 (컬럼7개)
zipcode_oracle_t3.zip - oracle 테이블 (컬럼8개)
zipcode_oracle_t4.zip - oracle 테이블 (컬럼9개)
2009/07/30 10:07 2009/07/30 10:07

사용자 삽입 이미지
Another great Addon for Ext Framework again. Ext File Upload Form Widget is to provide an user interface for easy uploading of files to a server.

Files are first added to an “upload queue” and then they are uploaded to the server. Any file can be individually removed from the queue before upload or the whole queue can be cleared.

The result of upload is shown for each file by icons of success or failure and, in the case of failure, the server error message is
                                                          shown as the tooltip of the failure icon.

Requirements: Ext Framework
Demo: http://aariadne.com/uploadform/
License: LGPL License

2009/07/27 19:03 2009/07/27 19:03
taken from webappers.com

JS Charts is a free JavaScript based chart generator that requires little or no coding. With JS Charts drawing charts is a simple and easy task, since you only have to use client-side scripting (i.e. performed by your web browser). No additional plugins or server modules are required. Just include the scripts, prepare your chart data in XML or JavaScript Array and your chart is ready.

JS Charts lets you create charts in different templates like bar charts, pie charts or simple line graphs. It’s compatible with most web browsers. And it is It’s free to use and watermark-free.

사용자 삽입 이미지

Requirements: Firefox 1.5 +, IE 6, Safari 3.1 +, Opera 9 +
Demo: http://www.jscharts.com/examples
License: Creative Commons 3.0 License

2009/07/27 18:58 2009/07/27 18:58
taken from webappers.com

One of the most common requests from clients when it comes to Wordpress personalization, is to add a basic event calendar to their website. Finding a good place to position a big table like a calendar within your Wordpress template is always a taught work. In addition, the tag itself is often quite difficult to style in a good way.

Therefore, Stefano Verna came up with astonishing iCal-like calendars with jQuery. All the magic takes place with some ninja CSS. In addition to the plain calendar structure, You can see a lightweight Coda-like effect for events description popup as well.

사용자 삽입 이미지

Requirements: jQuery Framework
Demo: http://www.stefanoverna.com/wp-content/tutorials/ical_like_calendar/
License: License Free

2009/07/27 18:57 2009/07/27 18:57

There are a number of tools such as DataTables which provide enhanced access to HTML tables for Javascript capable browsers. However, these tools often lack keyboard accessibility. KeyTable addresses this by allowing Excel like cell navigation on any table.

KeyTable is a Javascript library which provides keyboard navigation and event binding for any HTML table. With KeyTable Excel style table navigation can be employed to provide features such as editing of a table without requiring a mouse. Simply navigate to the cell you wish to edit and hit return. This initialises the excellent jEditable plug-in for jQuery - make your edit and then hit return again to save.

사용자 삽입 이미지

Requirements: IE 6+, Firefox 3+, Safari 3+, Opera 9.6
Demo: http://www.sprymedia.co.uk/article/KeyTable
License: GPL or BSD License

2009/07/27 18:56 2009/07/27 18:56

TinyTable - Easy to Use Javascript Table Sorter

taken from webappers.com

TinyTable is a JavaScript table sorter script is easy to use and feature packed at only 2.5KB. There are many features great include column highlighting, optional pagination, support for links, date/link parsing, alternate row highlighting, header class toggling, auto data type recognition and selective column sorting. Also, the table styling is completely customizable via the CSS.

TinyTable has been tested in Firefox 2/3, IE 6/7/8, Opera, Safari and Chrome. This script is available free of charge any project, personal or commercial, under the creative commons license and is offered AS-IS, no free support provided.

사용자 삽입 이미지

Requirements: -
Demo: http://sandbox.leigeber.com/table-sorter/index.html
License: Creative Commons License

2009/07/27 18:54 2009/07/27 18:54

The iPod Drilldown and Flyout Styles Menu System can be used to create a simple dropdown menu for a single list of options, a flyout menu for a smaller hierarchical list of options where child menus are displayed next to the parent menu on mouseover, and two variations on the iPod style, one with a back button and another with a linked breadcrumb to let users easily traverse back up the hierarchy.

It provides easy navigation of complex nested structures with any number of levels. They also built in the ability to customize a menu’s appearance, including active and hover states, by passing in classes as options.

사용자 삽입 이미지
Requirements: jQuery Framework
Demo: http://www.filamentgroup.com/lab/jquery_ipod_style_and_flyout_menus/
License: MIT, GPL License

2009/07/27 18:52 2009/07/27 18:52

JQuery 사용해보기.

프로토타입, 도조 등 많은 비슷한 스크립트 라이브러리들이 있지만 요세 대세? 가벼우면서 막강한 JQuery를 사용해보자.

각 포털사이트에서 JQuery를 검색해보면 JQuery는 홈페이지에서 다운로드 할 수 있다.

 

해당 엘리먼트 접근하기

일반 : document.getElementById("id");

JQuery : $("#id");

   - 엘리먼트의 ID 접근시 #, class 접근시 .

 

해당 엘리먼트의 값 접근하기

일반 : document.getElementById("id").value;

JQuery : $("#id").val();

   - 엘리먼트의 값을 대입하고 싶다면 $("#id").val("값");

 

해당 엘리먼트의 개체를 비교하여 true/false를 알려주는 메소드

일반 : document.getElementById("id").checked;

JQuery : $("#id").is(':checked');

   - 체크박스 및 라디오버튼에 체크상태인지를 boolean 형으로 반환

   - $("#id").is(".orange, .blue, lightblue");  id의 class 속성중 orange, blue, lightblue 가 하나라도 있으면 true

 

해당 엘리먼트의 CSS 속성 부여하기

일반 : document.getElementById("id").style.border = "4px solid yellow");

JQuery : $("#id").css("border", "4px solid yellow");

    - 첫번째인자는 속성이름, 두번째인자는 속성값을 넣으면 된다.

 

해당 엘리먼트의 display 속성 부여하기

일반 : document.getElementById("id").style.display = "none";

JQuery : $("#id").hide(); , $("#id").show();

    - hide 숨김, show 보임, hide, show 안에 인자를 slow, normal, fast 중 하나로 보임숨김의 속도를 조절 할 수 있다.

    - 아니면 수치로 1000분의 1초로 할 수 있음. show(950)

 

체크박스의 전체선택 / 해제

일반

function selectAll() {
    var blnChecked = document.getElementById("allCheck").checked;      // 전체선택 체크박스의 상태
    checkBoxes = document.getElementsByName('delCheck');                // 태그이름중 delCheck인 엘리먼트를 배열로 얻음

 

    for(var i=0; i<checkBoxes.length; i++) {
     objCheck = checkBoxes[i];
        if (objCheck) {
            objCheck.checked = blnChecked;
  }
    }
}

 

JQuery

$(document).ready(function() {                    
  $('#allCheck').click(function() {                    // 전체선택 체크박스 선택 이벤트
    if($('#allCheck').is(':checked')){                // 전체선택 체크박스 체크상태
      $('.delCheck').each(function(){                // 여러개의 체크박스 의 class 속성의 값이 delCheck 인걸 가져옴
        $(this).attr('checked', 'checked');           // 가져온 체크박스를 checked
        });
     }else{                                                     // 전체선택 체크박스 미체크상태
       $('.delCheck').each(function(){
       $(this).attr('checked','');                         // 가져온 체크박스를 미체크상태로
       });
     }
   }); 
});

 

엘리먼트의 존재여부를 체크하기

JQuery : if($("#id").length > 0)     

    - 엘리먼트로 존재하지 않은 경우에도 빈 객체로 반환하기 때문에 JQuery는.. 객체의 길이를 체크해서 존재여부를 체크한다.

2009/07/27 18:49 2009/07/27 18:49