특정 영역을 제외한 부분을 클릭했을 때 이벤트를 발생시켜야 할 때가 있다. 그때는 다음과 같이 하면 된다.


<html>
	<head>
		<meta charset="utf-8">
		<script   src="https://code.jquery.com/jquery-2.2.4.min.js"   integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="   crossorigin="anonymous"></script>
	</head>

<body>
	<div class="area" style="width:200px; height:200px; background-color: #4574bb; margin: auto;">
	</div>
</body>
</html>

<script>
$('html').click(function(e) {   
	if(!$(e.target).hasClass("area")) {
		alert('영역 밖입니다.');
	}
});    
</script>
$('html').click(function(e) {   
	if(!$(e.target).hasClass("area")) {
		alert('영역 밖입니다.');
	}
});    

즉 특정 영역에 class명을 부여하고 클릭한 곳에 그 클래스명이 없으면 이벤트를 발생시키는 로직입니다.

ApacheMPM(Multi-Processing Module)이라는 개념이 있습니다.. Apache 서버는 기본적으로 멀티 프로세스 방식으로 Request를 처리합니다.. 이 때 두 가지(정확하게는 세 가지) 방식으로 Request를 처리합니다.. 한 가지는 prefork이고 다른 하나는 worker입니다..

 

MPM prefork

Prefork 방식은 자식 프로세스가 싱글 쓰레드로 동작하며 요청당 하나의 프로세스가 처리하는 방식 입니다. 즉 한 자식 프로세스당 하나의 쓰레드를 사용하는 방식 입니다. 일단 요청당 하나의 프로세스가 처리하기 때문에 안정적입니다. 프로세스간 메모리를 공유하지 않기 때문입니다. 하지만 기본적으로 사용하는 메모리가 worker 방식보다 높은 편입니다. Apache는 몇몇 idle process를 유지합니다. 그래서 요청이 들어오기 전에 idle process가 대기하고 있습니다. 그래서 요청이 들어 오면 바로 처리해주기 때문에 빠르게 처리를 해줄 수 있습니다. 하지만 동시적으로 많은 접속이 들어오면 상당히 많은 자원(메모리, CPU)을 사용하게 될 것입니다.

 



MPM worker

Worker 방식은 자식 프로세스가 멀티 쓰레드로 동작하며 각 요청당 하나의 쓰레드가 처리하는 방식 입니다. 즉 한 자식의 프로세스당 여러 개의 쓰레드를 사용하고 이 쓰레드가 요청을 처리합니다. worker 방식은 prefork보다 메모리를 적게 사용합니다. 그리고 스레드간에는 메모리를 공유할 수 있습니다. 또한 prefork방식과 비슷하게 Idle thread가 존재하여 들어오는 요청을 빠르게 처리합니다. 그래서 동시 접속 처리에 유리합니다.


 

결론적으로 높은 확장가능성(scalability)를 요구한다면 worker 방식으로 안정성과 오래된 스프트웨어와의 호환성이 필요 하다면 prefork 방식을 사용하면 좋다고 합니다.

 

참조 사이트

https://httpd.apache.org/docs/2.4/ko/mpm.html

http://faq.hostway.co.kr/Linux_WEB/7043

http://www.slashroot.in/how-is-nginx-different-from-apache

 

만약 파일 업로드에서 


file_uploads On

post_max_size

max_execution_time

memory_limit

max_file_uploads

upload_max_filesize

위에 사항을 업로드 하려는 파일의 사이즈보다 크게 그리고 다른 사항들도 모두 정상적으로 설정했는데 파일이 업로드 되지 않는다면

/tmp overflow의 size를 확인해 보자



/tmp가 overflow 되었다고 나오는 부분이 보일 것이다.


이럴때 다음과 같이 하면 된다.


sudo umount -l /tmp
sudo mount -t tmpfs -o size=10485760,mode=1777 overflow /tmp


exec 나 shell_exec 를 비동기로 처리해야할 때가 있다. 그때는 명령어 뒤에 " > /dev/null 2>/dev/null &"를 붙혀주면 된다

exec("실행할 명령" . " > /dev/null 2>/dev/null &")
shell_exec("실행할 명령" . " > /dev/null 2>/dev/null &")


MySQL 에서 JOIN에 대해 알아보도록 하겠습니다.


0. JOIN 개요

SQL JOIN 이라고 검색하면 나오는 유명한(?) 그림 입니다. 일단 이 그림만 보아도 JOIN에 대한 개념을 어느정도 잡을 수 있습니다.


1. 테스트할 데이터 준비

CREATE TABLE IF NOT EXISTS `member` (
  `idx` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(50) NOT NULL,
  `username` varchar(50) NOT NULL,
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `member` (`idx`, `email`, `username`) VALUES
	(1, '철수@초보끼리.com', '김철수'),
	(2, '영희@초보끼리.com', '이영희'),
	(3, '초보@초보끼리.com', '김초보');

CREATE TABLE IF NOT EXISTS `member_detail` (
  `member_idx` int(11) NOT NULL,
  `phone` varchar(50) NOT NULL,
  `nickname` varchar(50) NOT NULL,
  `thumbnail` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `member_detail` (`member_idx`, `phone`, `nickname`, `thumbnail`) VALUES
	(1, '01011121112', '철수철수', '철수.png'),
	(3, '01012341234', '초보', '초보.jpg');

CREATE TABLE IF NOT EXISTS `order_address` (
  `idx` int(11) NOT NULL AUTO_INCREMENT,
  `member_idx` int(11) NOT NULL,
  `addressee` varchar(50) NOT NULL COMMENT '수취인',
  `address` varchar(200) NOT NULL,
  `phone` varchar(50) NOT NULL,
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

INSERT INTO `order_address` (`idx`, `member_idx`, `addressee`, `address`, `phone`) VALUES
	(1, 1, '김철수', '서울시 강남구 타워펠리스 지하 4층', '01011121112'),
	(2, 1, '김철수 어머니', '서울시 강남구 삐까뻔적 오피스텔 2층 201호', '01012341234'),
	(3, 2, '김초보', '뉴욕시 마봉리 페리스 오피스텔 지하 2층', '01011112222'),
	(4, 10000, '비회원', '토쿄시 나루토군 라면이오이시 닌자아파트 5층 502호', '01011112222');


2. SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.key = B.key

SELECT * FROM member AS M
LEFT JOIN member_detail AS MD ON M.idx = MD.member_idx

3. SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.key = B.key WHERE B.key IS NULL

SELECT * FROM member AS M
LEFT JOIN member_detail AS MD ON M.idx = MD.member_idx
WHERE MD.member_idx IS NULL



4. SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.key = B.key 

SELECT * FROM member AS M
RIGHT JOIN order_address AS OA ON M.idx = OA.member_idx


5. SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.key = B.key WHERE A.key IS NULL

SELECT * FROM member AS M
RIGHT JOIN order_address AS OA ON M.idx = OA.member_idx
WHERE M.idx IS NULL


6. SELECT <select_list> FROM TableA A INNER JOIN TableB B ON A.key = B.key 

SELECT * FROM member AS M
INNER JOIN member_detail AS MD ON M.idx = MD.member_idx


7. SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.key = B.key 

SELECT * FROM member AS M
LEFT JOIN order_address AS OA ON M.idx = OA.member_idx
UNION
SELECT * FROM member AS M
RIGHT JOIN order_address AS OA ON M.idx = OA.member_idx


8. SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.key = B.key WHERE A.key IS NULL OR B.key IS NULL

SELECT * FROM (
SELECT M.*, OA.addressee, OA.member_idx, OA.address, OA.phone  FROM member AS M
LEFT JOIN order_address AS OA ON M.idx = OA.member_idx
UNION
SELECT M.*, OA.addressee, OA.member_idx,  OA.address, OA.phone  FROM member AS M
RIGHT JOIN order_address AS OA ON M.idx = OA.member_idx
) AS U
WHERE U.idx IS NULL OR U.member_idx IS NULL


MySQL에서 도메인에 값들의 갯수를 세어야 할 때가 있습니다. 그럴 때 사용할 수 있는 것이 SUM과 IF의 조합입니다.


1. 테스트할 데이터 준비



CREATE TABLE IF NOT EXISTS `count_test` (
`id` int(11) NOT NULL,
`state` enum('Y','N') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `count_test` (`id`, `state`) VALUES
(1, 'Y'),
(2, 'Y'),
(3, 'Y'),
(4, 'Y'),
(5, 'N'),
(6, 'Y'),
(7, 'N'),
(8, 'Y'),
(9, 'Y'),
(10, 'N');



2. 갯수 세기(SUM, IF)


SELECT SUM(IF(state = "Y", 1, 0)) AS y_cnt, SUM(IF(state = "N", 1, 0)) AS n_cnt FROM count_test


스키마를 엑셀에 문서화 하고 싶을 때 다음과 같이 쿼리를 생성하여 csv 혹은 엑셀로 export하여 사용하면 된다.


SELECT 
TABLE_SCHEMA, 
TABLE_NAME, 
COLUMN_NAME, 
CONCAT(DATA_TYPE,'(',IFNULL(CHARACTER_MAXIMUM_LENGTH,IFNULL(NUMERIC_PRECISION,'')),')') TYPE, 
COLUMN_KEY,
IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA NOT IN ('information_schema', 'performance_schema', 'mysql', 'isb_stg', 'isb_prd')
ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION;

curl로 html 소스 코드를 가져오려고 하는데 

http 302(redirect) 문제로 redirect된 페이지의 소스코드를 가져올 때 다음과 같이 하면 된다.


        $url = "YOUR URL";
        $res = array();
        $options = array( 
            CURLOPT_RETURNTRANSFER => true,     // return web page 
            CURLOPT_HEADER         => false,    // do not return headers 
            CURLOPT_FOLLOWLOCATION => true,     // follow redirects 
            CURLOPT_USERAGENT      => "spider", // who am i 
            CURLOPT_AUTOREFERER    => true,     // set referer on redirect 
            CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect 
            CURLOPT_TIMEOUT        => 120,      // timeout on response 
            CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects 
        ); 

        $ch      = curl_init( $url ); 
        curl_setopt_array( $ch, $options ); 
        $content = curl_exec( $ch ); 
        $err     = curl_errno( $ch ); 
        $errmsg  = curl_error( $ch ); 
        $header  = curl_getinfo( $ch ); 
        curl_close( $ch ); 

        echo $content

datetime 필드에서 날짜 혹은 시간만 SELECT 하려면 다음과 같이 하면 된다.

SELECT DATE_FORMAT("2016-04-08 11:12:14", '%Y-%m-%d') DATEONLY, 
            DATE_FORMAT("2016-04-08 11:12:14",'%H:%i:%s') TIMEONLY


<ul>  
    <li value="1">One</li>
    <li value="2">Two</li>
    <li value="3">Three</li>
    <li value="4">Four</li>
    <li value="5">Five</li>
</ul>

를 다음과 같이 배열로 만드는 방법은 여러가지 겠지만 간단히 map 함수를 이용할 수 있다.

[1, 2, 3, 4, 5]
var arr = $.map($("li"), function(item) {
    return $(item).attr("value");
});

+ Recent posts