Search Results for '전체 분류'


2064 posts related to '전체 분류'

  1. 2009/08/07 jQuery 강좌 연결
  2. 2009/08/07 trHoverTable 사용자 정의 함수 만들기
  3. 2009/08/07 롤오버 이미지 기능 만들기 1
  4. 2009/08/07 달력 플러그인( jQuery Datepicker - calendar)
  5. 2009/08/07 Microsoft Chart Control
  6. 2009/08/07 mysql max packet size 변경하기
  7. 2009/08/07 asp:FileUpload 객체와 ThumbnailImage 만들기
  8. 2009/08/07 JQuery tr tag hover 색상 변경
  9. 2009/08/07 jquery tabs 플러그인
  10. 2009/08/07 MAC 어드레스를 알아내는 두가지 예제 (NETBIOS, SNMP) C++
  11. 2009/08/07 [SWF Printer Pro] 문서를 SWF, PDF, JPG로 저장하는 무료 가상 프린터 프로그램 3
  12. 2009/08/07 동영상 플래시 파일로 올리기
  13. 2009/08/07 동영상 합치기 - Format Factory 1
  14. 2009/08/05 DDoS 악성코드 전용백신 2
  15. 2009/08/05 아티보드 2.0 2009년 8월 5일자 버전입니다.
  16. 2009/08/01 PC 방용 - 레지스트리 1
  17. 2009/08/01 사진을 그림처럼 바꿔준다!!-Intocartoon Professional Edition
  18. 2009/08/01 사진에 빗방울 떨어지는 효과 주기
  19. 2009/08/01 윈도우2003 터미널서버 라이센스 문제
  20. 2009/08/01 "이 제품에 대한 설치 원본을 사용할 수 없습니다." 해결 방법
  21. 2009/08/01 자주쓰는 자바스크립트 함수 모음
  22. 2009/08/01 자바스크립트 시간,날짜 계산
  23. 2009/08/01 자바스크립트 아날로그 시계 소스
  24. 2009/08/01 자바스크립트 폼 리셋
  25. 2009/08/01 mysql 외부접속 가능하도록 설정하기
  26. 2009/08/01 mysql root 암호 바꾸기
  27. 2009/08/01 mysql 계정 생성 (grant 이용)
  28. 2009/08/01 mysql 쿼리 정리
  29. 2009/08/01 MySQL 전체 백업 1
  30. 2009/08/01 MS-SQL 백업복원후 분리된 사용자 문제 해결
이번 블로그에서는 jQuery 사용자 정의 메소드를 만드는 걸 해볼랍니다.
뭐.. 이제와서 사용자 정의 메소드를 만들어 보는게 참.. 거시기 합니다만.. 언제까지나 따라하기 신공으로는 필요한 모든걸 충족하기 힘들잖습니까?

jQuery 확장 메소드작성시 항상 주의해야 하는것은.
  1. jQuery 확장 메소드는 jQuery 확장 집합을 반환해 주는것이 좋다.
  2. jQuery 의 별칭인 $는 다른 javascript framework에서도 사용중이며, $.noConflict() 함수를 사용할수 있다.
  3. 매개변수의 전달을 최소화하라.(기본값을 사용하라)
그럼 jQuery 확장 메소드를 만들어보자.

    (function($){

    })(jQuery);

위와 같은 준비 코드를 작성하라.
위의 코드는 주의 2 jQuery의 별칭인 $를 다른 javascript framework에서도 사용하고 있다는 예외 사항을 대비한 코드이다.
매개변수로 전달된 $는 jQuery 의 별칭임을 나타낸다.

hoverTable을 사용하기 위하여 함수를 선언하여 보자.
    (function($){
        $.fn.hoverTable = function(option){ //확장 메서드 선언
        };
    })(jQuery);

우선 이름은 hoverTable로 지었다.
특별히 설명할 부분은 없는듯 하니 다음으로 넘어가자.
다음은 매개변수은 option을 설정한다.
    (function($){
        $.fn.hoverTable = function(option){ //확장 메서드 선언
            var options = $.extend( {  //기본 옵션 설정
                "thead" : "thead",
                "tbody" : "tbody",
                "oddClass" : "odd",
                "evenClass" : "even",
                "hoverClass" : "hover"
            },option || {});
        };
    })(jQuery);

위와 같은 방법으로 option의 값에 기본값을 설정하였다.
  • thead: thead 태그의 스타일
  • tbody : tbody 태그의 스타일
  • oddClass : tbody의 홀수 번째 tr의 스타일
  • evenClass : tbody의 짝수 번째 tr의 스타일
  • hoverClass : tbody의 마우스가 올라간 tr의 스타일
자.. 이제 매개변수 까지 지정 하였고 쭉쭉 진행해 보자.


    (function($){
        $.fn.hoverTable = function(option){ //확장 메서드 선언
           
            var options = $.extend( {  //기본 옵션 설정
                "thead" : "thead",
                "tbody" : "tbody",
                "oddClass" : "odd",
                "evenClass" : "even",
                "hoverClass" : "hover"
            },option || {});
           
            return this.each(function(){ // 여러개의 확장 집합에 대한 처리후 확장집합을 반환
            });
        };
    })(jQuery);
   
위와 같이 return 을 사용하여 반복문 this.each 를 실행하면 jQuery 확장 집합을 반환 할 수 있다.


    (function($){
        $.fn.hoverTable = function(option){ //확장 메서드 선언
           
            var options = $.extend( {  //기본 옵션 설정
                "thead" : "thead",
                "tbody" : "tbody",
                "oddClass" : "odd",
                "evenClass" : "even",
                "hoverClass" : "hover"
            },option || {});
           
            return this.each(function(){ // 여러개의 확장 집합에 대한 처리후 확장집합을 반환
                $(this).find('thead tr').addClass(options.thead); // 테이블 헤더 클래스 정의
                $(this).find('tbody').addClass(options.tbody); // 테이블 헤더 클래스 정의
                $(this).find('tbody tr:nth-child(odd)').addClass(options.oddClass); // 테이블 헤더 클래스 정의
                $(this).find('tbody tr:nth-child(even)').addClass(options.evenClass); // 테이블 헤더 클래스 정의
            });
        };
    })(jQuery);  
   
위의 추가된 4줄의 코드로 헤더와 body 의 홀수, 짝수 번째 줄의 스타일을 할당하였다.
기본적인 모양은 끝 났으니 이제 hover 동작을 넣어 보도록 하자.


    
    (function($){
        $.fn.hoverTable = function(option){ //확장 메서드 선언
           
            var options = $.extend( {  //기본 옵션 설정
                "thead" : "thead",
                "tbody" : "tbody",
                "oddClass" : "odd",
                "evenClass" : "even",
                "hoverClass" : "hover"
            },option || {});
           
            return this.each(function(){ // 여러개의 확장 집합에 대한 처리후 확장집합을 반환
                $(this).find('thead tr').addClass(options.thead); // 테이블 헤더 클래스 정의
                $(this).find('tbody').addClass(options.tbody); // 테이블 헤더 클래스 정의
                $(this).find('tbody tr:nth-child(odd)').addClass(options.oddClass); // 테이블 헤더 클래스 정의
                $(this).find('tbody tr:nth-child(even)').addClass(options.evenClass); // 테이블 헤더 클래스 정의
                function hover(event){  // 마우스 over / out 동작 function 정의
                    $(event.target.parentNode).toggleClass(options.hoverClass);
                }
                $(this).find('tbody tr').mouseover(hover); // mouseover 이벤트 설정
                $(this).find('tbody tr').mouseout(hover); // mouseout 이벤트 설정
                
            });
        };
    })(jQuery);
위의 코드에서 mouseover, mouseout 이라는 두 jQuery Event Helfer Method를 사용하였다.
                $(this).find('tbody tr').mouseover(hover); // mouseover 이벤트 설정
                $(this).find('tbody tr').mouseout(hover); // mouseout 이벤트 설정
은 다음과 같이 수정이 가능하다.

$(this).find('tbody tr').hover(hover,hover);
 
 
웹접근성을 고려 하여 위의 기능에서 하나를 더 추가해보자.
일반적으로 토글 버튼의 경우 토글 된 상태에서는 기능이 변경이 된다.
따라서 이미지의 alt 태그의 값도 함께 변경이 되어야 한다.
옵션을 추가 하였다.
talt : 토글상태의 이미지 ALT 값.
 
(function($){
   
    $.fn.toggleImg = function(option){
       
        var options = $.extend( { 
            "tsrc" : null,
            "src" : null,
            "thover" : null,
            "hover" : null,
            "alt": null,
            "talt": null
        },option || {});
        var SetHover = function (obj,over, out)
        {
            if(over){
                obj.unbind("mouseover");
                obj.unbind("mouseout");
                obj.bind("mouseover",function(){
                    obj.attr("src",over);
                });
                obj.bind("mouseout",function(){
                    obj.attr("src",out);
                });
            }
        }
        return this.each(function(){
            var ele = $(this);
            if( options.src === null) {options.src = ele.attr("src");}
            if(options.alt === null){options.alt = ele.attr("alt");}
            SetHover(ele,options.hover,options.src);
           
            ele.toggle(function()
            {
                ele.attr("src",(options.thover)?options.thover:options.tsrc);
                if(options.talt !== null){
                    ele.attr("alt",options.talt);
                }

                SetHover(ele,options.thover,options.thover);
               
            },function()
            {
                if(options.talt !== null){
                    ele.attr("alt",options.alt);
                }
                ele.attr("src",(options.hover)?options.hover:options.src);
                SetHover(ele,options.hover,options.src);
               
            });
            return this;                
        });
      }
})(jQuery);
 
여기저기 바뀐곳이 있으나.. 빨간 부분만 보면 될 것 같다.
2009/08/07 21:32 2009/08/07 21:32

가타 부타 말 할것 없이 소스부터 보자


    (function($){
        $.fn.hoverImg = function(option){ //확장 메서드 선언
           
            var options = $.extend( {  //기본 옵션 설정
                "src" : null
            },option || {});
           
            return this.each(function(){ // 여러개의 확장 집합에 대한 처리후 확장집합을 반환
                if( options.src == null) {options.src = $(this).attr("src");}
                var fnHover = function()
                {
                    var tmp = $(this).attr("src");
                    $(this).attr("src",options.src);
                    options.src = tmp;
                }
                $(this).hover(fnHover,fnHover);
            });
          }
    })(jQuery);   
   

option은 현재로써는 하나 뿐이다.

src : 롤오버될때 보여질 이미지 경로.

ex )  $("#toggle").hoverImg({"src":"pre_.gif"});

2009/08/07 21:31 2009/08/07 21:31

프로젝트중 달력 컨트롤을 사용해야 하는 경우가 많은듯하다..

그동안 사용하던 ASP.NET 의 calendar 컨트롤을 버리고 jQuery plugin중 하나인 jQuery Datepicker 를 사용하기로 결정을 내렸다.

이유는 jQuery 매번 달력 컨트롤을 비하인드에서 생성하는 것 보다. 간단한 선택을 할때는 jQuery를 사용하고 이벤트를 기록해야 하는 경우에는 다른 플러그인이나 또는 asp.net의 calender control을 사용하려는 계획이다.

날짜 선택에서는 jQeury datepicker가 가장 적합하다는 결론이라고나 할까??

먼저 홈페이지의 주소를 알려 주겠다 .  달력 컨트롤 말고도 상당히 괞찮은게 많다.. 꼭 들어가 보자!!

http://keith-wood.name/



먼저 특징을 알아보자.

  1. 유연한 디자인 : jQuery 플러그인들의 특징이라면 특징인데.. 모든 플러그인의 디자인은 모두 css에 의존적이다. 의존적이라는 말은 모든 디자인은 css 만을 사용한다는 의미로써 코드와 디자인이 완전 분리되기 때문에 디자인이 상당히 유연해 진다.
  2. 지역화 : 마치 닷넷의 지역화 코드처럼 지역화 코드 jQuery.datepick-ko.js 를 제공하여 한국어를 지원한다. 세계화 추세에 맞춘 서비스라 하겠다..(굉장히 좋은 아이디어라고 생각된다. )
  3. 간단한 사용법 : 이것도 jQuery 플러그인들의 특징이라고 생각된다.

그럼 샘플 소스를 한번 보자. ( 홈페이지의 소스와 다를바 없다. 홈페이지 참조해라)


    $(function(){
        $('#defaultInlineDatepicker').datepick({"onSelect" : function(value,date,inst){
            alert("선택 : " + value);
        }});
        $('#defaultPopupDatepicker').datepick();

    });

<body>
<span id="defaultInlineDatepicker" class="datepicker"></span>

<input type="text" id="defaultPopupDatepicker" class="datepicker"/>
</body>

  1. 페이지에 달력이 들어가 있는 defaultInlineDatepicker
  2. 입력 컨트롤에 포커스가 가면 달력이 나타나는 defaultPopupDatepicker 

위의 두가지 방식중에 어떠한 것이 좋다고 말하기는 애매한듯하다. 둘의 사용법이 틀리다고 생각 된다. 입력 컨트롤에 값을 채워 넣는 방식은 검색의 조건이나 폼의 값으로 날짜를 셋팅하여야 할 때 사용되고 , 첫번째 방식은 날짜를 선택함으로써 바로 어떠한 다른 동작이 이루어질때 사용된다고 생각된다.

그런데.. 우리 보통 달력 이미지를 클릭해서 달력을 나타내지 않았었나? 그럼 그것도 추가해보자.


$('#btnPopDatepicker').click(function(){
        $('#defaultPopupDatepicker').trigger('focus');
 });


<img src="" alt="달력으로 날짜 입력" id="btnPopDatepicker" />

뭐.. 별꺼 없다.. 이미지 태그 하나 추가하였고. 그 이미지 클릭 이벤트에 defaultPopupDatepicker 컨트롤의 focus 이벤트의 trigger를 생성하였다.

참.. 쉽다... 하면 할수록.. jQuery 매력있다.. ♡

다른 속성은 차후 블로그에 추가하여 더 고급적으로 사용해 보도록 하자.

2009/08/07 21:30 2009/08/07 21:30

mysql로 쿼리를 보낼때 쿼리가 max packet size 보다 클경우 오류가 발생한다.


이럴대는 max packet size를 변경하여 쿼리가 실행 될수있도록 하면된다..


하긴 블럽데이터를 스트링으로 때려 넣는 이런 무식한 짓을 하는 人이 나말고 또 있을지는 모르겠지만..


MySql Administrator 툴을 사용해서

Startup variables 의 AdvancedNetworking 에 보면 Data/Memory size에 Max packet size 란 놈이 있다.. 이놈을 살포시 늘려주는 센스!!

2009/08/07 21:27 2009/08/07 21:27

회사 홈페이지를 만들때 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
PC에서 작성한 문서를 PDF로 변환하는 것은 이제 많이 일반화하였다. 몇몇 프로그램은 자체에 PDF 변환 기능이 들어있기도 하다. 이런 PDF와 함께 배포, 공유용 포맷으로 많이 애용되는 것이 바로 플래시 파일(SWF)이다. PDF로 변환하는 기능이 내장되어 있지 않은 한/글(아래아한글)조차 이 기능이 들어있다.

SWF Printer Pro는 일종의 가상 프린터 프로그램이다. 인쇄 메뉴가 있는 프로그램에서 이 프린터를 선택해 해당 문서를 인쇄하면 SWF로 바꿔준다. 덤으로 PDF로도 변환할 수 있고, JPG도 가능하다.

프로그램 페이지로 가기
사용자 삽입 이미지사용자 삽입 이미지


무료이다. 페이지 이동 버튼도 만들어주기 때문에 아주 용이하게 사용할 수 있다.
2009/08/07 17:20 2009/08/07 17:20

요즘 동영상을 Flash 형식으로 바꾸어서 보여주는 곳들이 많이 생겼습니다. 이것을 직접 해 보시고 싶으신 분들을 위해 간단히 방법을 소개합니다. 여기에서는 동영상을 FLV 형식으로 바꾸고, 이 FLV 파일을 SWF 형식을 가진 플래시 파일을 통해 재생해 보도록 하겠습니다. 이렇게 하면 동영상은 FLV 파일에, 동영상 재생을 조절하는 부분은 SWF 파일에 넣어서 처리할 수 있게 됩니다.

일단 동영상 파일을 FLV 파일로 바꾸어야 하는데, 리눅스에서는 ffmpeg라는 프로그램을 이용해서 할 수 있고, 윈도우에서는 show와 같은 프로그램을 이용해 주시면 됩니다. 사용법은 간단하기 때문에 따로 소개하지는 않겠습니다.

이제 SWF 파일을 구해봅니다. FLV player 등의 검색어로 찾아 보시면 됩니다.여기에서는 JW FLV Player (flvplayer.swf)와 Lecteur Flash FLV (player_flv_maxi.swf)를 이용해 보겠습니다.

FLV 파일과 SWF 파일을 서버에 올리고, 다음과 같은 태그를 이용하면 동영상을 볼 수 있습니다. 아래에서 너비, 높이, FLV파일이름, SWF파일이름은 실제 동영상에 맞추어 바꾸어 주셔야 합니다.

JW FLV Player의 경우


<object width="너비" height="높이">
<param name="movie" value="SWF파일이름" />
<param name="allowFullScreen" value="true" />
<param name="FlashVars" value="&displayheight=높이&amp;file=FLV파일이름&amp;width=너비&amp;height=높이" />
<embed src="SWF파일이름" width="너비" height="높이" allowFullScreen="true" FlashVars="&displayheight=높이&amp;file=FLV파일이름&amp;width=너비&amp;height=높이">
</embed>
</object>


Lecteur Flash FLV (MAXI)의 경우


<object width="너비" height="높이">
<param name="movie" value="SWF파일이름" />
<param name="allowFullScreen" value="true" />
<param name="FlashVars" value="flv=FLV파일이름&amp;width=너비&amp;height=높이&amp;showstop=1&amp;showvolume=1&amp;showtime=1&amp;showfullscreen=1" />
<embed src="SWF파일이름" width="너비" height="높이" allowFullScreen="true" FlashVars="flv=FLV파일이름&amp;width=너비&amp;height=높이&amp;showstop=1&amp;showvolume=1&amp;showtime=1&amp;showfullscreen=1">
</embed>
</object>

정확한 태그는 SWF 파일을 다운로드 받은 곳에 있는 문서를 참고하세요.

2009/08/07 17:17 2009/08/07 17:17
Format Factory (포멧 팩토리) - 서로 다른 형식의 동영상 합치기

똑 같은 형식의 분할 된 동영상을 합치는 데는... 포멧 팩토리가 적당하지 않다.

왜냐 하면, 같은 형식의 동영상을 합치더라도 필연적으로 인코딩 과정을 거치게 되므로...

시간도 오래 걸리고, 무엇보다도 원본보다 화질이 나빠질 수 밖에 없기 때문이다.

때문에 똑 같은 형식의 분할 된 동영상을 단순하게 합치(이어 붙인다는 표현이 더 맞겠다)려면...

VirtualDub 같이... 같은 형식을 합칠 때 다시 인코딩을 하지 않아도 되는 프로그램을 이용하는 게 좋다.

사용자 삽입 이미지
  

   그럼, 포멧 팩토리로 서로 다른 형식의 동영상을 합쳐보자.

   동영상 합치기는 포멧 팩토리의 고급 기능 항목에 들어 있다.
  
왼쪽 그림처럼 고급 기능에서 동영상 합치기를 클릭한다.

그런 다음, 파일 추가 버튼을 눌러 합치고자 하는 파일들을 아래 그림처럼 불러온다.

아래 그림에서 보듯이 2개의 파일을 불러왔는데... 화면 크기도 제 각각이고 확장자도 서로 다르다.

더 많은 파일들을 불러와 합칠 수도 있지만, 그만큼 시간이 오래 걸린다.

사용자 삽입 이미지
 

파일을 불러왔으면 상단의 고화질 비디오 버튼을 클릭해보자.

역시 눈에 익은 비디오 변환 설정 화면이 열린다.

사용자 삽입 이미지

 

사용자 삽입 이미지

  

 

 

상단의 고화질 탭을 누르면 좌측 그림처럼 여러 프로필 파일들이 보인다.적당한 프로필 파일이 있다면 그 프로필을 선택하자.

하지만 적당한 프로필이 없어도 상관은 없다.

어차피 항목 설정 값을 변경해서 자신에게 맞는 값을 지정해주면 되니까...
여기서는 일단 고화질 비디오를 선택했다.

화면 크기는 이번에 합칠 파일은 MP3 플레이어에서 재생할 것이 아니기 때문에

좀 큼지막(?) 한 640x480 정도로 하고.

비트레이트나 화면비율, 영상 압축 코덱 등은 그냥 뒀다.

나머지 설정 값들도 대충... 적당히... 알아서 놔두고 확인 버튼을 눌렀다.
뭐 그다지 신경쓸 일 없다.

  

2-Pass 인코딩은 가급적이면 아니오로 그냥 두자.

시간이 넉넉하고, 화질에 엄청 민감하게 신경쓴다면...
2-Pass 인코딩의 사용을 말릴 생각은 없으나...

인코딩 시간이 배로 걸리는데 반해 화질이 그만큼은 만족스럽지 않기 때문이다.

   

 

 

 

위 변환 설정 화면에서 확인을 누르고 빠져나와... 옵션 버튼을 누르면 합칠 파일의 사용 영역을 별도로 지정해 줄 수 있다.

합칠 파일 모두 원본의 전체를 다 사용한다면 굳이 필요없으나...

각각의 동영상 파일에서 필요한 부분만을 선택해서 하나의 파일로 합친다면 꼭 필요한 작업이다.

사용자 삽입 이미지

사용법은... 사용하고자 하는 부분의 시작 부분으로 동영상 밑의 슬라이드를 움직여 갖다놓고 시작 지점 버튼을 누른다.

다음 사용하고자 하는 부분의 끝 부분으로 역시 슬라이드를 갖다놓고 종료 지점 버튼을 누르면...

포멧 팩토리는 파일을 합칠 때 사용자가 지정한 두 지점 사이의 영역만을 합칠 때 사용하게 된다.

확인 버튼을 눌러 메인 창으로 빠져나오면 작업 목록에 합칠 파일이 추가되어 있을 것이다.

그럼 변환 시작 버튼을 눌러서 변환을 시작하면 된다.

변환 과정을 보니... 먼저 각각의 파일을 설정한 크기로 다시 인코딩하는 작업을 한 후...

다시 인코딩 한 파일들을 하나의 파일로 합치는 작업을 자동으로 수행한다.

그래서 그렇기도 하고 컴퓨터가 너무 구형이기도 해서.... 소요 시간이 상당히 오래 걸렸다.

하지만, 서로 다른 형식의 파일에서 필요한 부분만을 선택해 하나의 파일로 만드는 데 아주 유용하다.

2009/08/07 16:49 2009/08/07 16:49
현재 문제 되고 있는 DDoS 전용백신입니다.
 
DDoS 공격관련 참조 사이트 : www.krcert.or.kr (국번없이 118)
 
출처:

이스트소프트 알약전용백신
http://aldn.altools.co.kr/altools/ALYacRemovalTool.exe
http://alyac.altools.co.kr/etc/Notice_Contents.aspx?idx=136

 
 
안철수연구소 전용백신
http://kr.ahnlab.com/dwVaccineView.ahn?num=81&cPage=1
http://kr.ahnlab.com/downLoadFreeVaccine.ahn?filename=v3filecleanex.exe

 
 
 
nProtect 전용백신
http://pds.nprotect.co.kr/pds/scan/nProtectEAVDDoS-Host.com

 
 
카스퍼스키 전용백신
http://www.kaspersky.co.kr/board/bbs/board.php?bo_table=News&wr_id=272&sca=&sfl=wr_subject%7C%7Cwr_content&stx=ddos&sop=and&nca=
DDoS 악성 코드 관련 전용 백신 입니다.
2009/08/05 12:26 2009/08/05 12:26

안녕하세요! 웹아티 회원님.
언제나 저희 웹아티 서비스를 이용해 주셔서 감사합니다.



아티보드를 2009년 6월 8일자 버전까지 패치를 하셔서 사용하시거나, 6월 8일자 버전을 신규로 설치하신 분들은 패치 버전을 다운 받으셔서 패치를 하시고 처음 설치 하는 분들은 전체 버전을 다운 받아 메뉴얼을 참고하셔서 설치하시기 바랍니다.



아티보드 전체 버전 : ArtyboardV20_20090805_Full.zip
아티보드 패치 버전 : ArtyboardV20_20090805_Patch.zip



[다운로드]


1. ArtyboardV20_20090805_Patch.zip 파일을 다운받아 압축을 해제합니다.
2. 서버와 동일한 경로로 압축이 해제된 파일을 서버에 덮어 씌웁니다.


업데이트 안내는 여기를 클릭하셔서 확인하시기 바랍니다.

좋은 하루 되시기 바랍니다.

2009/08/05 11:36 2009/08/05 11:36
사용법은 간단합니다.
 
압축을 푸신후 자신에 맞게 레지스트를 하나씩 까는겁니다
 
레지스트에 다 맞게 이름을 정해두어져있구요
 
컴퓨터 포맷이나 초기상태 정아니면 맨처음으로 복원하신후에 사용하시면
 
아주좋습니다.

- 레지스트리 수정 하는건 약간 위험 한 부분입니다. 신중하게 꼭 필요한 자료만 사용하십시오.
사용자 삽입 이미지
2009/08/01 11:30 2009/08/01 11:30

사용자 삽입 이미지
사용자 삽입 이미지
<사용법>
그림을 불러온 다음 상단 스샷의 돋보기 모양 오른쪽의 노트 모양 버튼을 클릭한 후 이미지의 크기,
색상, 밝기, 색의 농도 등을 정한 후 저장을 하시면 됩니다.

정말 간단하게는 프로그램 상단 메뉴의 Cartoon을 선택하시면 나오는 4가지의 Shotcut으로 작업을 하
시면 됩니다. ok만 눌러주면 기본값으로 작업이 진행되지만 Sketch의 경우에는 Sketch→Draw Sketch에
체크를 해주셔야 합니다.

작업 전에 포토샵 등의 이미지 보정툴로 사진의 경계선을 뚜렷하게 하면 보다 좋은 효과가 나타납니다
. 하단의 스샷은 이 프로그램으로 작업을 해서 저장한 것입니다. 원본→Cartoon→Sketch→Canvas→
Line Drawing의 순서입니다. 포토샵으로 전혀 건드리지 않았습니다.

2009/08/01 11:16 2009/08/01 11:16
사용자 삽입 이미지
사진에 빗방울, 물결, 비.눈 효과 등을 주는 유틸입니다. 기본적인 사용법은 예제를 보면 누구나 알 수
있습니다. 다만 효과를 적용할 부분의 아웃라인 설정만 조금 헛갈리는 듯 해서 간단한 설명을 덧붙입니
다. 기타 사용상 궁금한 점 있으면 댓글 달아주세요. 답변 드리겠습니다.
 
<아웃라인 설정>
이미지를 불러온 후 위 스샷에서 봤을 때 좌측 위에서 첫 번째 빨간색 동그라미 버튼을 선택합니다. 마
우스 왼쪽 버튼을 한 번 클릭한 후 끌면 경계선이 그려집니다. 방향을 수평에서 수직, 혹은 수직에서
수평으로 꺾고 싶으면 마우스 왼쪽 버튼을 한 번 더 클릭합니다. 이런 식으로 아웃라인(테두리)를 그린
후 마우스 오른쪽 버튼을 클릭하면 완료됩니다.
2009/08/01 11:09 2009/08/01 11:09

사용자 삽입 이미지
에러:

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