1. PHP 5.2.0 이후 버전
    - PHP 모듈에 라이브러리가 포함되어 있다.
    - json_encode()를 호출하여 PHP변수와 데이터를 전달한다.

$item = array(

    'id' => 'coffee',

    'price' => 3500,

    'urls' => array('http://www.ahnseungkyu.com',

                    'http://www.google.com')

);


$output = json_encode($item);

print($output);


2. PHP 5.1 이전 버전
    - http://json.org/ 에서 Services_JSON 을 클릭하면 http://pear.php.net/pepr/pepr-proposal-show.php?id=198 로 이동
    - 라이브러리를 다운받는다.
    - Services_JSON 객체를 생성하여 encode() 함수를 호출한다.

require_once('JSON.php');
$json = new Services_JSON();

$item = array(

    'id' => 'coffee',

    'price' => 3500,

    'urls' => array('http://www.ahnseungkyu.com',

                    'http://www.google.com')

);


$output = $json->encode($item);

print($output);




 
반응형
Posted by seungkyua@gmail.com
,

webkit 다운로드

Mac 2011. 5. 20. 17:40
1. http://www.webkit.org/ 에서 다운로드
2. Applications 폴더에 옮겨놓고 터미널 프롬프트창에 다음과 같이 입력
3. webkit 을 띄운다.
    - 아래처럼 개발자 도구 옵션 설정

 Enable the Develop menu option in the Advanced preferences. Use the optional toolbar button, Develop menu or Inspect Element context menu to access the Web Inspector.


 
반응형
Posted by seungkyua@gmail.com
,
1. http://www.json.org/ 사이트에서 json2.js 를 클릭하면 https://github.com/douglascrockford/JSON-js 로 이동
2. json2.js 를 다운로드 
3. 다음과 같이 사용
var itemDetails = JSON.parse(request.responseText);



 
반응형
Posted by seungkyua@gmail.com
,
1. DOM Level 2 방식의 이벤트 등록

function addEventHandler(obj, eventName, handler) {

    if (document.attachEvent) {

        obj.attachEvent("on" + eventName, handler);

    } else if (document.addEventListener) {

        obj.addEventListener(eventName, handler, false);

    }

}


2. Event 객체의 속성
    - type
        . 발생한 이벤트의 명 : 예)mouseover
    - target (ie 에서는 srcElement)
        . 이벤트가 발생한 객체, 보통 html element

function getActivatedObject(e) {

    var obj;

    if (!e) {

        // IE 옛날 버전은 event 객체를 전달하지 않음

        obj = window.event.srcElement;

    } else if (e.srcElement) {

        // IE는 target 이 아니라 srcElement 로 넘어온다.

        obj = e.srcElement;

    } else {

        obj = e.target;

    }

    return obj;

}


3. setInerval() 과 setTimeout()
    - setTimeout(a, b)
        . a 함수를 b 밀리세컨드 이후에 한 번만 수행
    - clearTimeout() 으로 취소
var alarm = setTimeout(do, 2000);

function do() {
    alert("wake up !!");
    clearTimeout(alarm);
}

    - setInterval(a, b)
        . a 함수를 b 밀리세컨드 이후에 계속 수행
    - clearInterval() 함수로 취소
var alarm = setInterval(do, 2000);
var count = 0;

function do() {
    count++;
    alert("wake up !!");
    if (count == 100) clearInterval(alarm);
}

4. DOM Tree
    - element.nodeName,  element.nodeValue 속성 사용
        . 엔터나 공배도 node 로 인식할 수 있음. 이 경우 nodeName 이 #text 인지 확인

<div id="root">

    <div id="firstParentDiv">첫번째 부모 div

        <div id="firstChildDiv">첫번째 자식 div</div>

        <div id="secondChildDiv">두번째 자식 div</div>

    </div>

</div>

function showTree() {

var firstParent = document.getElementById('firstParentDiv');

var root = firstParent.parentNode;


var firstChild = firstParent.firstChild;

while (firstChild.nodeName == "#text") {

// 첫번째 "첫번째 부모 div" 문자열노드, 두번째 div

alert(firstChild.nodeValue);

firstChild = firstChild.nextSibling;

}

var secondChild = firstChild.nextSibling;

while (secondChild.nodeName == "#text") {

// 처음은 리턴 때문에 null 문자열노드, 두번째 div

alert(secondChild.nodeValue);

secondChild = secondChild.nextSibling;

}

secondChild = firstParent.lastChild;

while (secondChild.nodeName == "#text") {

// 처음은 리턴 때문에 null 문자열노드, 두번째 div

alert(secondChild.nodeValue);

secondChild = secondChild.previousSibling;

}

firstChild = secondChild.previousSibling;

while (firstChild.nodeName == "#text") {

// 처음은 리턴 때문에 null 문자열노드, 두번째 div

alert(firstChild.nodeValue);

firstChild = firstChild.previousSibling;

}


    - document.createElement(), document.createTextNode()
        . createElement() 는 html element 를 생성, createTextNode() 는 문자열을 생성
    - appendChild(), insertBefore()
        . appendChild() 는 맨 마지막에 자식 노드를 추가한다.
        . insertBefore() 는 첫번째 전달인자의 노드를 두번째 전달인자인 노드 앞에 추가 시킨다. 
function addLetter() {
    var currentWordDiv = document.getElementById('currentWord');
    var p = document.createElement('p');
    currentWordDiv.appendChild(p);
    var letterText = document.createTextNode('제목입니다.');
    p.appendChild(letterText);

    - element.childNodes
        . 모든 자식 노드를 배열의 형태로 리턴해준다.
        . 자식 노드가 없을 때는 빈 배열이 넘어온다.

<div id="me"></div>

function getChildNodes() {

    var me = document.getElementById('me');

    alert (me.childNodes.length);


    - element.firstChilde, element.lastChild, element.nextSibling, element.previousSibling, element.parentNode

    - replaceNode(), removeChild(), createAttribute()

5. Node 의 프로퍼티와 메소드
    - data
        . NodeType 이 TextNode 일 경우 데이터를 나타낸다.
    - appendData(), insertData(), deleteData(), replaceData()

6. Node 의 타입
    - Element
        . Node.ELEMENT_NODE   :   1
    - Text
        . Node.TEXT_NODE   :   3
    - Document
        . Node.DOCUMENT_NODE   :   9
    - Comment
        . Node.COMMENT_NODE   :   8
    - DocumentFragment
        . Node.DOCUMENT_FRAGMENT_NODE   :   11
    - Attr
        . Node.ATTRIBUTE_NODE   :   2

    - IE6 에서는 NodeType 이 정의되지 않았으며 다음과 같이 사용할 수 있다.
if (!window.Node) {
    var Node = { ELEMENT_NODE: 1,
                       ATTRIBUTE_NODE: 2,
                       TEXT_MODE: 3
                       COMMENT_NODE: 8,
                       DOCUMENT_NODE: 9,
                       DOCUMENT_FRAGMENT_NODE: 11
    };
}

8. DocumentFrament
    . 문서 내에서 실제로 나타나지는 않고, 노드의 집합을 저장하고 저장된 노드들의 임시 저장소 역할을 담당
    . 한 번에 화면에 그리므로 속도가 빠르다. (element.innerHTML 이나 Document 를 직접 제어하면 느리다.)
function reverse(n) {
    var f = document.createDocumentFrament();
    while(n.lastChild) f.appendChild(n.lastChild);
    n.appendChild(f);
}

9. Element의 위치와 크기
    - offsetLeft , offsetTop
        . 엘리멘트의 X, Y 좌표
    - offsetWidth, offsetHeight
        . 프로퍼티의 가로와 세로 길이
    - 오버플로어가 있는 엘리먼트의 Y 좌표 구하기
function getY(element) {
    var y = 0;
    for (var e=element; e; e=e.offsetParent)
        y += e.offsetTop;

    // 엘리먼트 조상을 따라 올라가다 scrollTop 어트리뷰티가 설정된 것을 찾는다.
    // document.body 에 도달하면 루프를 종료한다.
    for (e=element.parentNode; e && e != document.body; e=e.parentNode)
        if (e.scrollTop) y -= e.scrollTop;    // 스크롤바 값을 뺀다.
    return y;
}

    - z-index
        . 값은 정수값으로 음수, 0 (디폴트), 양수 로 값이 작은 엘리먼트부터 큰 엘리먼트 순서로 그려진다.
        . z-index 에 의해 지정되는 쌓아 올리기 순서는 오직 서로 형제 관계인 엘리먼트들에게만 적용된다.
          (동일한 부모 컨테이너에 속한 엘리먼트)
        . 일부 브라우저는 <iframe> 태그에 적용된 z-index 속성을 무시한다.

    - visibility, display
        . visibility : visible, hidden 값을 가진다. hidden 값을 가져도 문서 구조는 확보된 채 남아있다.
        . display  : block, item, none 값을 가진다. none 값을 가지면 문서 구조의 공간이 없어진다.


9. javascript 함수
    - parseInt()
        . 문자열을 숫자로 바꿔줌


 
반응형
Posted by seungkyua@gmail.com
,
1. XMLHttpRequest 객체를 생성한다.
2. URL 전달 인자 값을 escape() 로 처리한다.
3. XMLHttpRequest 객체의 onreadystatechange 속성에 callback 함수를 등록한다.
4. XMLHttpRequest 객체의 readyState 속성과 XMLHttpRequest 객체의 status 속성을 이용한다.

function createRequest() {

    var request;

    try {

        request = new XMLHttpRequest();

    } catch(tryMS) {

        try {

            request = new ActiveXObject("Msxml2.XMLHTTP");

        } catch(otherMS) {

            try {

                request = new ActiveXObject("Microsoft.XMLHTTP");

            } catch (failed) {

                request = null;

            }

        }

    }

    return request;

}

function getDetiales(itemName) {
    // var 키워드를 사용하지 않고 전역으로 사용함 

    request = createRequest();

    if (request == null) {

        alert("Unable to create request");

    }


    var url = "ajaxtest2.php?imageId=" + escape(itemName);

    request.open("GET", url, true);

    request.onreadystatechange = displayDetails;

    request.send(null);

}

function displayDetails() {

    if (request.readyState == 4) {

        if (request.status == 200) {

            var description = document.getElementById("description");

            description.innerHTML = unescape(request.responseText);

        }

    }


    ※ 비동기 호출을 두개 이상 사용한다면 request 전역객체를 각각 다른 변수로 지정해서 사용한다.
    ※ 비동기 호출로 쓰레드 문제와 같은 부분이 생기면 모니터 함수를 둔다. (모니터 함수에서 로직 체크)

3. XMLHttpRequest 객체의 속성
    - readyState
        . 요청객체의 현재 상태를 나타냄
    - status
        . 서버로부터 받은 상태코드
    - statusText
        . 서버로부터 받은 상태 코드 메세지 status 의 text 값으로 보면 됨
    - responseXML
        . 서버가 XML 형태로 데이터를 반환해 준다. XML 데이터가 아니라면 속성은 비어있게 됨
    - responseText
        . 서버가 Text 형태로 데이터를 반환해 준다. Text 데이터가 아니라면 속성은 비어있게 됨


 
반응형
Posted by seungkyua@gmail.com
,
1. 세션 생성
    - session_start() 를 호출하면 sessionid 가 생긴다.

2. 세션 변수 등록
    - $_SESSION['myvar'] = 5;

3. 세션 생명주기
    - php.ini 파일의 session_gc_maxlifetime 값으로 설정 (초단위 시간). 이후 저장된 세션이 gc 된다.

4.  세션 변수 사용
    - if ( isset($_SESSION['myvar']) ) ...

5. 세션 변수 해제
    - unset($_SESSION['myvar']); 
    ※ 세션 배열 전체를 삭제하면 세션을 사용할 수 없게 되므로 주의해야 한다.

6. 세션 삭제 
    - session_destroy() 를 호출하면 sessionid 가 삭제된다.
    ※ 세션을 삭제하기 전에는 먼저 세션 변수를 해제하고 삭제한다.

7. php.ini 의 세션관련 옵션
    - session.name = PHPSESSID
        . 세션 id 값
    - session.cookie_lifetime = 0
        . 세션 id가 쿠키 값으로 사용자 컴퓨터에 얼마나 남아있는지 결정
          기본값이 0이라는 의미는 브라우저가 닫히면 세션 id 가 저장된 쿠키도 삭제됨
    - session.cache_expire = 180
        . 사용자의 활동이 180 분 동안 없으면 끊어진다. 
반응형
Posted by seungkyua@gmail.com
,
1. addslashes(), stripslashes()
    - 사용자의 데이터가 데이터베이스에 전달되기 전에 / 문자를 넣고 빼준다.

2. php.ini 파일에서 magic_quotes_gpc, magic_quotes_runtime
    - 속성을 켜두면 1번의 함수를 사용하지 않아도 자동으로 \ 등을 붙히거나 제거한다.
    - magic_quotes_gpc
        . GET, POST, COOKIE 변수에 저장되는 데이터의 특수문자를 오류없이 저장될 수 있도록 변형
    - magic_quotes_runtime
        . 데이터베이스에 저장되는 데이터를 변형

3. escapeshellcmd()
    - 명령어로 system()이나 exec()가 실행하지 않게 보장한다.

4. strip_tags()
    - 문자열에 HTML과 PHP 태그를 떼어준다.

5. htmlspecialchars()
    - 특수 문자를 HTML entity 형태로 변환한다. 예를 들어 < 는 &lt; 로 바꾼다.


 
반응형
Posted by seungkyua@gmail.com
,
I. sql 보안
    1. mysqli->real_escape_string()
        - characters encoded are NUL (ASCII 0), \n, \r, ', ", Contrl-Z

II. php 애플리케이션 보안
    1. htmlspecialchars()
        - &, <, > 을 html entity로 변환

    2. htmlspecailchars()
        - entity 로 표현될 수 있는 모든 것을 교체
        - 두번째 파라미터
            . ENT_COMPAT : 큰따옴표를 &quot;로 변환하되 작은 따옴표는 그대로 둔다.
            . ENT_QUOTES  : 작은따옴표와 큰따옴표 모두를 각각 &#39; 와 &quot; 로 변환
            . ENT_NOQUOTES(기본값) : 어떠한 따옴표도 변환하지 않는다.
        - 두번째 파라미터
            . UTF-8 : 문자열 인코딩 타입

        예) $str = htmlspecailchars($input_str, ENT_QUOTES, "UTF-8");
              echo nl2br($str);

    3. PHP 단방향 해쉬 암호화 알고리즘
        - crypt() < md5() < sha1()
            .sha1() 함수는 40개의 문자열로 리턴된다.

    4. MySQL 단방향 암호화 알고리즘
        - sha1()

III. php 서버설정 보안
    1. php.ini 파일에서 allow_url_fopen을 막는다.
    2. 웹서버에서 .php 와 .html 파일에 대한 요청만을 수용한다.
    3. 사용자가 파일을 읽는 경로를 보내면 상대경로와 절대경로를 잘 파악하여 중요한 파일을 못읽게 한다.

IV. Javascript 보안
    1. XSS 공격 막는 방법
        - 동적으로 생성되는 데이터에 다음의 코드를 추가한다.
            .  content = content.replace(/</g, "&lt;").replace(/>/g, "&gt;");

반응형
Posted by seungkyua@gmail.com
,
I. 데이터베이스 백업하기
    1. 테이블 업데이트를 막고 백업하기
        sql>flush tables;
        sql>lock tables <table명> [read | write]
        #> cp 데이터 파일 복사 하기
 
    2. mysql_dump를 사용하기
        #>mysqladmin shutdown
        #>mysqladmin start --log-bin[=logfile]
        #>mysqldump --opt --all-databases > all.sql

    3. mysqlhotcopy 스크립트 사용
        #>mysqladmin shutdown
        #>mysqlhotcopy database </path/for/backup>
        #>mysqladmin start
         
II. 데이터베이스 복구
    1. 테이블의 문제
        #>myisamchk -r 

    2. 두번째 방법으로 백업했을 경우
        - 백업파일의 sql 실행 : 백업 시점의 데이터베이스를 새로 만듬
        - 그 이후의 저장된 갱신자료가 로그 파일에 저장되므로 그 파일로 데이터베이스를 갱신
           #>mysqlbinlog hostname-bin.[0-9]* | mysql

 
반응형
Posted by seungkyua@gmail.com
,

MySQL EXPLAIN 사용

MySQL 2011. 5. 19. 15:09
1. 문장 끝에 ; 대신 \G 를 사용하면 결과를 세로로 볼 수 있다.
2. select  문장 앞에 explain  키워드를 사용하면  플랜을 볼 수 있다.
explain
select * from User \G 

I. plan 결과 설명
    ※ http://dev.mysql.com/doc/refman/5.5/en/using-explain.html

    1. select_type 값
        - SIMPLE
           . 평범한 SELECT 문장
        - PRIMARY
           . 하위 쿼리나  UNION을 사용할 때 외부(첫 번째) 쿼리
        - UNION
           . UNION 두 번째나 다음 번 쿼리
        - DEPENDENT UNION
           . UNION에서 첫 번째 쿼리에 따른 두 번째나 다음 번 쿼리
        - UNION RESULT
           . UNION 겨로가
        - SUBQUERY
           . 내부 하위 쿼리
        - DEPENDENT SUBQUERY
           . 첫 번째 쿼리에 따른 내부 하위 쿼리(즉, 상관 하위 쿼리)
        - DERIVED
           . FROM 절에서 사용한 하위 쿼리
        - UNCACHEABLE SUBQUERY
           . 그 결과가 캐쉬될 수 없으며 각 행마다 다시 계산되어야 하는 하위 쿼리
        - UNCACHEABLE UNION
           . UNCACHEABLE SUBQUERY에 속한 UNION에서 두 번째나 그 이후의 SELECT

    2. table
        - 쿼리에 응답하는 테이블 명

    3. type
        - 쿼리에서 테이블이 어떻게 조인되는지 설명
        - const 또는 system
           . 테이블이 한 번만 읽어온다. 테이블에 row가 단 하나만 있을 때 일어날 수 있다.
        - eq_ref
           . 조인하는 테이블에서 row 집합을 읽어올 때마다 이 테이블에서 한 row씩 읽는다.
             테이블의 인덱스를 사용할 때 조인이 사용되며 인덱스는 UNIQUE하거나 기본 키이다.
        - fulltext
           . fulltext 인덱스를 사용하여 조인한다.
        - ref
           . 조인하는 테이블에서 row 집합을 읽어올 때마다 이 테이블에서 대응되는 row 집합을 읽어온다.
             조인 조건에 따라서는 한 행만 선택할 수 없을 때, 조인에서 키의 일부분만이 사용되었을 때,
             혹은 키가 UNIQUE 하지 않거나 기본 키가 아닐 때
        - ref_or_null
           . ref 쿼리와 비슷하지만 NULL 인 row 도 찾아본다. (하위 쿼리에서 가장 많이 사용된다)
        - index_merge
           . Index Merge 라는 특별한 최적화 기법이 사용되었다.
        - unique_subquery
           . 유일한 한 줄이 리턴될 때 IN 하위 쿼리에서 ref를 대신하여 사용할 수 있다.
        - index_subquery
           . unique_subquery 와 비숫하지만 인덱스된 유일하지 않은 하위 쿼리에서 사용한다.
        - range
           . 조인하는 테이블에서 row 집합마다 이 테이블 중 특정 범위에 들어가는 row들을 읽어온다.
        - index
           . 모든 인덱스를 읽는다.
        - ALL
           . 이 테이블의 모든 행을 읽는다.

    4. rows
        - 조인을 실행하기 위해 테이블마다 읽어야 하는 row의 수를 대충 계산
          쿼리가 사용하는 총 row의 수를 얻기 위해서는 값들을 곱해야 한다.

    5. possible_keys
        - 테이블을 조인하기 위해 사용할 수 있는 키
        - PRIMARY 는 테이블마다 일반적으로 있기 때문에 대부분 나온다. 

    6. key
        - row 을 조인할 때 실제로 사용하고 있는 키
        - NULL 은 키를 사용하고 있지 않다는 뜻이다.

    7. key_len
        - 사용된 키의 길이를 나타낸다.

    8. ref
        - 테이블에서 row를 선택할 때 사용한 키를 나타낸다.

    9. Extra
        - 어떻게 조인을 실행하는가에 대한 정보
        - Distinct
           . 처음으로 일치하는 줄이 발견되면 끝난다.
        - Not exists
           . LEFT JOIN 을 사용하여 쿼리가 최적화되어 있다.
        - Range checked for each record
           . 조인하는 테이블에서 row 집합을 읽어올 때마다 사용할 수 있는 인덱스를 찾는다.
        - Using filesort
           . 테이터를 정렬하려면 두 번 읽어야 한다. (따라서 시간도 두 배 걸린다)
        - Using index
           . 테이블에 있는 모든 정보를 인덱스에서 얻어왔다. 따라서 실제 row는 읽지 않았다.
        - Using join buffer
           . 조인 버퍼를 사용하여 테이블을 부분적으로 읽어 들인다. 그 후 쿼리를 수행할 때 버퍼에서 각 행을 추출한다.
        - Using temporary
           . 이 쿼리를 실행하는 동안 임시 테이블을 사용하였다.
        - Using where
           . 행을 선택하는 데 where 절을 사용하였다.

II. sql 쿼리 튜닝
    1. 조인 최적화를 위해 키 분배를 검사
        - myisamchk 유틸리티 사용
            #>myisamchk --analyze <pathtomysqldatabase/table명>
            #>myisamchk --analyze <pathtomysqldatabase/*.MYI>
            #>myisamchk --analyze <pathtomysqldatadirectory/*/*.MYI>
        - Analyze Table 문을 사용
            sql>analyze table customers, orders, order_items, books;

    2. 테이블 최적화
        - 테이블의 단편화를 없앤다.
            sql>optimize table <table명>;
            #>myisamchk -r table
        - 테이블의 인덱스를 정렬하고 인덱스에 맞게 데이터를 재배치 한다.
            #>myisamchk --sort-index --sort-records=1 <pathtomysqldatadirectory/*/*.MYI>





반응형
Posted by seungkyua@gmail.com
,