336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

네트워크 및 소켓 통신.


1. Network Programming 정의

네트워크 프로그래밍이란 서로 떨어져 있는 호스트(컴퓨터)들 간에 데이터를 주고 받을 수 있도록 프로그램을 구현하는 것입니다. 다만 통신할 대상이 멀리 떨어져 있기 때문에 소프트웨어 차원에서 호스트들간에 연결해주는 장치가 필요하고 이러한 기능을 해주는 장치를 소켓(socket)이라고 합니다. 일반적으로 소켓 프로그래밍과 네트워크 프로그래밍이라는 용어는 같은 의미로 사용됩니다.

 

 *소켓의 정의

소켓(socket)은 1982년 BSD(Berkeley Software Distribution) UNIX 4.1에서 처음 소개되으며 현재 널리 사용되는 것은 1986년의 BSD UNIX 4.3에서 개정된 것입니다.소켓은 소프트웨어로 작성된 추상적인 개념의 통신 접속점이라고 할 수 있는데 네트웍 응용 프로그램은 소켓을 통하여 통신망으로 데이터를 송수신하게 된다. 소켓은 응용 프로그램에서 TCP/IP를 이용하는 창구 역할을 하며 응용 프로그램과 소켓 사이의 인터페이스 역할을 하고 있습니다.

*소켓의 구조

클라이언트 어플리케이션은 서버와 통신을 하기위해 어떠한 메시지 또는 데이터를 서버에게 보내려 할 것 입니다. 그러하기 위해서는 네트워크에 연결하여 서버에 접속하여야 합니다. 그러기 위해서는 소켓을 통하여 네트워크에 접속하여야 합니다.

소켓은 이렇게 어플리케이션에게 네트워크 접속을 위한 연결장치, 인터페이스 역할을 하는것입니다. 네트워크 어플리케이션이 보낸 데이터를 소켓을 거쳐 운영체제상에 존재하는 TCP/IP 소프웨어에게 전달하게 됩니다. 다시 하드웨어 상인 랜카드를 거쳐 네트워크에 전달하게 됩니다. 서버의 경우는 클라이언트와 정 반대되는 개념입니다. 네트워크는 서버에게 보낸데이터를 서버의 랜카드에게 보내지게 됩니다. 다시 운영체제의 TCP/IP소프트웨어를 거쳐 어플리케이션과 연결개념인 소켓을 통해 최종적으로 서버 어플리케이션에게 전달되는것입니다.소켓은 이렇게 어플리케이션과 TCP/IP 사이에 존재 하고 있습니다.

 

2. 소켓의 정의 및 종류

Socket이란?

두 프로그램이 네트워크를 통해 서로 통신을 수행 할 수 있도록 양쪽에 생성되는 링크의 단자입니다.

두 소켓이 연결되면 서로 다른 프로세스끼리 데이터를 전달 할 수 있습니다. 결국 소켓이 구현됨으로써

네트워크 및 전송 계층의 캡슐화가 가능해 집니다. 소켓은 원래 캘리포니아 버클리 대학 분교에서

UNIX용으로 개발 되었으며 UNIX에서의 입출력 메소드의 표준인 개방/읽기/쓰기/닫기 메커니즘을 따릅니다.

소켓의 종류는 다음과 같습니다.

 

- 스트림

스트림 소켓은 양방향으로 바이트 스트림을 전송 할 수 있는 연결 지향형 소켓으로 양쪽 어플리케이션이 모두 데이터를 주고 받을 수 있다는것을 의미한다. 스트림소켓은 오류수정, 전송처리, 흐름제어등을 보장해 주며 송신된 순서에 따른 중복되지 않은 데이터를 수신하게 된다. 이 소켓은 각 메세지를 보내기 위해 별도의 연결을 맺는 행위를 하므로 약간의 오버헤드가 존재한다. 그러므로 소량의 데이터보다는 대량의 데이터를 보내는 경우에 적당하다. 스트림소켓은 이러한 품질의 통신을 수행하기 위해서 TCP를 사용한다.


- 데이터그램

명시적으로 연결을 맺지 않으므로써 비 연경형 소켓이라고 한다. 메세지는 대상 소켓으로 전송되며 대상 소켓은 메세지를 적절히 수신한다. 스트림소켓을 사용하는것이 데이터그램 소켓을 사용하는것보다 더 신뢰성이 높은 방법이지만 연결을 수립하는데 드는 오버헤드는 무시할 수 없다. 데이터그램 소켓을 사용하려면 클라이언트에서 서버로 데어터를 전송 할때 UDP를 사용한다. 이 프로토콜에서는 메세지의 크기에 약간의 제한이 있으며 메세지의 확실한 전달 역시 보장하지 않으며 통신 중 데이터를 읽어 버리더라도 오류를 되돌리지 않는다.


- RAW

RAW소켓은 패킷을 가져오면 TCP/IP스택상의 TCP,UDP계층을 우회하여 바로 어플리케이션으로 송신하는 소켓이다. 이런 소켓에서 패킷은 TCP/IP필터를 통해 전달 되지 않으으로 원형 그대로의 패킷을 볼 수 있다. 이는 모든 데이터를 적절히 처리하거나 헤더를 제거하고 이를 파싱하는 과정은 모두 수신 어플리케이션에서 담당해야 하는 것이다. 실제 RAW소켓을 이용하여 프로그래밍을 하는 일은 거의 드물며 만약 시스템 소프트웨어나 패킷을 분석하는 프로그램을 개발할 경우 필요 할수도 있다.

 

3. IP 주소와 포트

IP 주소는 1바이트 4자리의 주소로 이루어집니다. (예 : 202.131.293.70)

이를 기억하기 힘들기 때문에 naver.com 과 같은 문자로 변환해서 사용하는데 이를 DNS(Domain Name Server)라 합니다. 하나의 IP 주소에서는 여러가지 작업을 동시에 할 수 있어야 하는데, 이 때 포트를 사용하여 여러 서비스를 사용하게 됩니다. 0부터 1023 사이의 포트는 시스템에 예약되어 있으며, 1024부터 65535가지의 포트는 사용자가 임의를 사용할 수 있습니다.

 

 

 

4. TCP 와 UDP

포트를 사용하여 통신을 하는 방법에는 TCP 와 UDP 프로토콜 두가지가 있습니다

TCP 는 두 프로그램 간의 토인이 처음 시작될 때부터 끝날 때까지 계속 연결을 유지하는 연결지향(Connection oriented) 방식으로 전화와 비유할 수 있습니다.

 

UDP 는 연결을 설정하지 않고 데이터를 보내는 방식으로 우편물에 비유할 수 있습니다. 보낸 데이터가 제대로 갔는지, 순서대로 갔는지 동의 여부에 대해 전혀 신경쓰지 않는 신뢰성이 결여된 프로토콜 입니다. 그렇다고 필요 없는 프로토콜은 아니며 TCP처럼 연결을 하고 끊는 번거로운 작업이 필요 없고, TCP보다 빠르며 데이터의 순서가 별로 중요하지 않고 패킷의 일부가 손상되어도 큰 영양을 미치지 않는 음성이나 영상 데이터를 전송할때 많이 이용되어 집니다.

 

5. 소켓 프로그래밍의 절차

- TCP Client

 1) 소켓을 생성한다.

 2) 서버로 connect한다.

 3) 접속이 성공됐다면 read 및 write 함수를 통해 서버와 패킷을 주고 받는다.

 4) 사용을 마치면 close로 소켓을 닫는다.

 

- TCP server

 1) 듣기 소켓을 생선한다.

 2) bind한다. (내선 부여)

 3) listen한다. (내선 연결)

 4) accept() 클라이언트가 connect할 경우 소켓을 생성 하고 연결한다.

 5) read와 write 함수를 이용해 메시지를 주고 받는다.

 6) 사용된 연결 소켓을 닫는다.

 7) 사용을 마쳤을 경우 듣기 소켓을 닫는다.


'IT' 카테고리의 다른 글

301 redirect, 302 redirect.  (0) 2017.01.24
소켓(Socket) 설명. 이해.  (0) 2017.01.18
UI 라이브러리  (0) 2016.08.31
저장 버튼(save button) 더블클릭 방지.  (1) 2015.04.28
이클립스 주요 기능  (0) 2015.03.12
Posted by 당양부부34
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


 

* response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");

 - POST, GET, OPTIONS, DELETE 요청에 대해 허용하겠다는 의미입니다.

<meta http-equiv="Access-Control-Allow-Methods" content="POST, GET, OPTIONS, DELETE"/>

 

* response.setHeader("Access-Control-Max-Age", "3600");

 - HTTP Request 요청에 앞서 Preflight Request 라는 요청이 발생되는데, 이는 해당 서버에 요청하는 메서드가 실행 가능한지(권한이 있는지) 확인을 위한 요청입니다. Preflight Request는 OPTIONS 메서드를 통해 서버에 전달됩니다. (위의 Methods 설정에서 OPTIONS 를 허용해 주었습니다.)

 여기서 Access-Control-Max-Age 는 Preflight request를 캐시할 시간입니다. 단위는 초단위이며, 3,600초는 1시간입니다. Preflight Request를 웹브라우저에 캐시한다면 최소 1시간동안에는 서버에 재 요청하지 않을 것입니다.

 

* response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

 이는 표준화된 규약은 아니지만, 보통 AJAX 호출이라는 것을 의미하기 위해 비공식적으로 사용되는 절차입니다. JQuery 또한 AJAX 요청 시, 이 헤더(x-requested-with)를 포함하는 것을 확인하실 수 있습니다. 여기서는 이 요청이 Ajax 요청임을 알려주기 위해 Header 에 x-request-width를 설정합니다. Form을 통한 요청과 Ajax 요청을 구분하기 위해 사용된 비표준 규약지만, 많은 라이브러리에서 이를 채택하여 사용하고 있습니다. (참고로 HTML5 부터는 Form 과 Ajax 요청을 구분할 수 있는 Header가 추가되었습니다.)

 

* response.setHeader("Access-Control-Allow-Origin", "*");

 이 부분이 가장 중요한 부분입니다. * 는 모든 도메인에 대해 허용하겠다는 의미입니다. 즉 어떤 웹사이트라도 이 서버에 접근하여 AJAX 요청하여 결과를 가져갈 수 있도록 허용하겠다는 의미입니다.

 만약 보안 이슈가 있어서 특정 도메인만 허용해야 한다면 * 대신 특정 도메인만을 지정할 수 있습니다.

<meta http-equiv="Access-Control-Allow-Origin" content="*"/>




  • Access-Control-Allow-Origin: *
  • Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
  • Access-Control-Max-Age: 3600
  • Access-Control-Allow-Headers: Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization

 

Posted by 당양부부34
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MySQL 세자리 콤마 필요시 FORMAT 함수를 이용.

FORMAT(컬럼명, 소수점이하 자리수)


SELECT FORMAT(price , 0) FROM product;



'IT > MySQL' 카테고리의 다른 글

Mysql db_helper  (0) 2017.01.31
MySQL 내장 함수. 숫자 함수, 문자 함수.  (0) 2017.01.20
Mysql 수학 함수  (0) 2016.11.03
mysqlbinlog query 보기  (0) 2016.07.15
Mysql Binary log(bin log).  (0) 2016.07.15
Posted by 당양부부34

2016. 11. 3. 10:06 IT/MySQL

Mysql 수학 함수

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ABS(X)

X의 절대 값을 리턴한다.

mysql> SELECT ABS(2);

        -> 2

mysql> SELECT ABS(-32);

        -> 32

이 함수는 BIGINT 값과 함께 사용하는 것이 안전하다. 

ACOS(X)

X의 아크 코사인(arc cosine) 값을 리턴한다. 즉, 코사인이 X인 값을 

리턴한다. 만일 X 가 -1 에서 1 사이의 범위에 있지 않으면, NULL을 

리턴한다.

mysql> SELECT ACOS(1);

        -> 0

mysql> SELECT ACOS(1.0001);

        -> NULL

mysql> SELECT ACOS(0);

        -> 1.5707963267949 

ASIN(X)

X 의 아크 사인 값(arc sine)을 리턴 한다. 즉 사인 값이 X인 값. 

만일 X 가 -1 에서 1 사이의 범위에 있지 않으면, NULL을 리턴 한다.

mysql> SELECT ASIN(0.2);

        -> 0.20135792079033

mysql> SELECT ASIN('foo');

 

+-------------+

| ASIN('foo') |

+-------------+

|           0 |

+-------------+

1 row in set, 1 warning (0.00 sec)

 

mysql> SHOW WARNINGS;

 

+---------+------+-----------------------------------------+

 

| Level   | Code | Message                                 |

 

+---------+------+-----------------------------------------+

 

| Warning | 1292 | Truncated incorrect DOUBLE value: 'foo' |

 

+---------+------+-----------------------------------------+

 

ATAN(X)

Returns the arc tangent of X의 아크 탄젠트(arc tangent) 값을 리턴한다. 

즉, 탄젠트가 X인 값.

mysql> SELECT ATAN(2);

        -> 1.1071487177941

mysql> SELECT ATAN(-2);

        -> -1.1071487177941 

ATAN(Y,X), ATAN2(Y,X)

두 변수 X 와 Y의 아크 탄젠트 값을 리턴한다. 이것은 Y / X의 아크 탄젠트 

값을 계산하는 방식과 유사하지만, 두 인수의 부호는 결과에 대한 쿼드런트 

(quadrant)를 알아내기 위해 사용된다는 점은 틀리다.

mysql> SELECT ATAN(-2,2);

        -> -0.78539816339745

mysql> SELECT ATAN2(PI(),0);

        -> 1.5707963267949 

CEILING(X), CEIL(X)

X 보다는 작지 않은 가장 작은 정수 값을 리턴한다.

mysql> SELECT CEILING(1.23);

        -> 2

mysql> SELECT CEIL(-1.23);

        -> -1 

위의 두 함수는 동일한 것이다. 리턴 값은 BIGINT으로 변환된다는 

점은 알아 두자. 

COS(X)

X 의 코사인 값을 리턴 하는데, 여기에서 X 는 레디안(radian)으로 

주어진다.

mysql> SELECT COS(PI());

        -> -1 

COT(X)

X 의 코 탄젠트 값을 리턴한다.

mysql> SELECT COT(12);

        -> -1.5726734063977

mysql> SELECT COT(0);

        -> NULL 

CRC32(expr)

싸이클릭 리던던시 체크 값 (cyclic redundancy check value)을 계산한 

다음에 32-비트 부호화되지 않은 값을 리턴한다. 인수가 NULL이면 NULL

을 리턴한다. 인수는 스트링 값이 되어야 한다.

mysql> SELECT CRC32('MySQL');

        -> 3259397556

mysql> SELECT CRC32('mysql');

        -> 2501908538 

DEGREES(X)

인수 X를 리턴하는데, 레디안에서 차수 (degree)로 변경된 값이 나온다.

mysql> SELECT DEGREES(PI());

        -> 180

mysql> SELECT DEGREES(PI() / 2);

        -> 90 

EXP(X)

X 의 제곱에 대한 e (자연 로그 근) 값을 리턴한다.

mysql> SELECT EXP(2);

        -> 7.3890560989307

mysql> SELECT EXP(-2);

        -> 0.13533528323661

mysql> SELECT EXP(0);

        -> 1 

FLOOR(X)

X 보다 크지 않은 정수 중에 가장 큰 값을 리턴 한다.

mysql> SELECT FLOOR(1.23);

        -> 1

mysql> SELECT FLOOR(-1.23);

        -> -2 

리턴 값이 BIGINT로 변환 된다는 점을 알아 두자. 

FORMAT(X,D)

숫자 X 의 형태를 '#,###,###.##'로 변경 시키고, D 자릿수 위치에서 

절사를 한 다음에, 그 결과를 스트링으로 리턴한다. 보다 자세한 

사항은, Section 12.3, “스트링 함수”를 참조할 것. 

LN(X)

X의 자연 로그를 리턴한다; 즉, X의 베이스-e 로그.

mysql> SELECT LN(2);

        -> 0.69314718055995

mysql> SELECT LN(-2);

        -> NULL 

이 함수는 LOG(X)과 동의어 이다.

LOG(X), LOG(B,X)

만일 하나의 파라미터를 사용해서 호출이 되면, 이 함수는 X의 자연 

로그를 리턴한다.

mysql> SELECT LOG(2);

        -> 0.69314718055995

mysql> SELECT LOG(-2);

        -> NULL 

만일 두 개의 파라미터를 사용해서 호출을 하면, 이 함수는 부정 베이스 

(arbitrary base) B 에 대한 X의 자연 로그를 리턴 한다.

mysql> SELECT LOG(2,65536);

        -> 16

mysql> SELECT LOG(10,100);

        -> 2 

LOG(B,X)는 LOG(X) / LOG(B)과 동의어 이다. 

LOG2(X)

X의 베이스-e 로그를 리턴한다.

mysql> SELECT LOG2(65536);

        -> 16

mysql> SELECT LOG2(-100);

        -> NULL

 

LOG2()는 스토리지용으로 필요한 비트의 수가 얼마나 되는지를 알아 

보는데 유용하다. 이 함수는 LOG(X) / LOG(2)과 동일하다. 

LOG10(X)

X의 베이스-10 로그를 리턴한다.

mysql> SELECT LOG10(2);

        -> 0.30102999566398

mysql> SELECT LOG10(100);

        -> 2

mysql> SELECT LOG10(-100);

        -> NULL

 

LOG10(X)는 LOG(10,X)과 동일하다. 

MOD(N,M), N % M, N MOD M

모듈러 연산. M으로 나누어진 N의 나머지를 리턴한다.

mysql> SELECT MOD(234, 10);

        -> 4

mysql> SELECT 253 % 7;

        -> 1

mysql> SELECT MOD(29,9);

        -> 2

mysql> SELECT 29 MOD 9;

        -> 2

 

이 함수는 BIGINT 값과 함께 사용할 수가 있다. 

MOD()는 분수를 가지고 있는 값에서도 동작을 하며 나눗셈을 

한 다음에 정확히 나머지 값을리턴한다:

mysql> SELECT MOD(34.5,3);

        -> 1.5 

PI()

π (pi) 값을 리턴 한다. 출력되는 기본 자릿수는 7 자리이지만, 

MySQL은 내부적으로는 전 이중 정밀도(full double-precision)

값을 사용한다.

mysql> SELECT PI();

        -> 3.141593

mysql> SELECT PI()+0.000000000000000000;

        -> 3.141592653589793116

 

POW(X,Y), POWER(X,Y)

Y 제곱이 된 X 값을 리턴한다.

mysql> SELECT POW(2,2);

        -> 4

mysql> SELECT POW(2,-2);

        -> 0.25 

RADIANS(X)

각도를 레디안으로 변경한 인수 X를 리턴한다. (π 레디안은 180 도와 

동일하다.)

mysql> SELECT RADIANS(90);

        -> 1.5707963267949 

RAND(), RAND(N)

0 과 1 사이의 무작위 부정 소수점 값 v 를 리턴한다 (즉, 0 <= v <= 1.0 

사이의 범위). 만일 정수 인수 N이 지정 되었다면, 이것은 시드 값

(seed value)로 사용되며, 반복 시퀀스를 만들어 낸다.

mysql> SELECT RAND();

        -> 0.9233482386203

mysql> SELECT RAND(20);

        -> 0.15888261251047

mysql> SELECT RAND(20);

        -> 0.15888261251047

mysql> SELECT RAND();

        -> 0.63553050033332

mysql> SELECT RAND();

        -> 0.70100469486881

mysql> SELECT RAND(20);

        -> 0.15888261251047

 

i <= R <= j 범위에서 임의적으로 정수 R 을 얻기 위해서는, 수식 

FLOOR(i + RAND() * (j – i)을 사용한다. 

예를 들면, 1에서 12 사이의 범위에서 임의의 정수를 얻고자 한다면, 

아래의 명령문을 사용하면 된다: 

SELECT FLOOR(7 + (RAND() * 5));

ORDER BY 구문에서는 RAND() 값을 사용하는 컬럼을 사용할 수가 

없는데, 그 이유는 ORDER BY가 그 컬럼을 여러 번 계산하기 때문이다. 

하지만, 아래와 같이 무작위로 열을 추출할 수는 있다:

 

mysql> SELECT * FROM tbl_name ORDER BY RAND();

LIMIT과 결합이 된 ORDER BY RAND()는 열로 이루어진 셋에서 무작위 

샘플을 선택하는 경우에 유용하게 사용할 수가 있다: 

mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d 

-> ORDER BY RAND() LIMIT 1000;

WHERE 구문에 있는 RAND()는 WHERE 구문이 실행될 때마다 반복적으로 

계산된다는 점을 알아 두기 바란다. 

RAND()는 완벽한 무작위 제너레이터는 아니지만, 동일 MySQL 버전을 

사용하고 있는 플랫폼간에 이식성이 있는 ad hoc 랜덤 숫자를 만들기

에는 속도가 빠른 방식이다. 

ROUND(X), ROUND(X,D)

인수 X를 리턴 하는데, 이때에는 이와 가장 가까운 정수로 절사가 된다.

두 개의 인수를 사용하면, D 자릿수에서 절사가 된 X 가 리턴 된다. 

D 는 음수로 표시될 수도 있는데, 이렇게 하면 소수점에서 왼쪽으로 

D 자리에 있는 X 의 값이 0 이 된다.

mysql> SELECT ROUND(-1.23);

        -> -1

mysql> SELECT ROUND(-1.58);

        -> -2

mysql> SELECT ROUND(1.58);

        -> 2

mysql> SELECT ROUND(1.298, 1);

        -> 1.3

mysql> SELECT ROUND(1.298, 0);

        -> 1

mysql> SELECT ROUND(23.298, -1);

        -> 20 

리턴 타입은 첫 번째 인수와 같은 타입이 된다. 이것은 정수 인수의 

경우에는, 그 결과가 정수 (소수점이 없는)가 된다는 것을 의미하는 

것이다. 

MySQL 5.0.3 이전에는, 인수가 두 개의 정수 사이의 절반에 해당될 

때 ROUND()는 C 라이브러리의 실행에 따라서 값을 리턴 했다. 이 

방식은 항상 반올림, 잘라냄, 0으로 만들기와 같은 방식을 취했다. 

만일 한 가지 방식의 절사 (rounding) 방식만을 사용하고자 할

경우에는 TRUNCATE() 또는 FLOOR()와 같은 함수를 대신 

사용하는 것이 좋다. MySQL 5.0.3 이후에는, ROUND()는 

첫 번째 인수가 10진수 값일 경우에는 정확한 인수 값을 

얻기 위해서 정밀도 수학 라이브러리(precision math library)를 

사용한다: 

정확한 숫자를 얻기 위해서, ROUND()는 “반올림 (round half up)” 

또는 “가장 가까운 값으로 절사 (round toward nearest)” 규칙을 

사용한다: 어떤 수의 소수점 이하 부분이 .5 보다 크거나 같을 경우

에는, 그 수가 양수라면 바로 다음의 정수로, 그 수가 음수일 경우에는, 

바로 이전 정수로 절사 (round)를 한다 (즉, 소수 부분을 0 으로 만든다). 

소수점 이하의 숫자가 .5보다 작을 경우에는, 그 수가 양수라면 바로 

이전 정수로, 음수일 경우에는 바로 다음 정수로 된다. 

추정 값 숫자에 대해서는, C 라이브러리에 따라서 그 결과가 나온다. 

대부분의 시스템에서는, ROUND()가 "가장 근접한 짝수로 절사 

(round to nearest even)" 규칙을 사용한다: 소수점 이하 부분이 있는 

값은 가장 근접한 정수로 된다. 

아래의 예문은 정확한 값과 추정 값을 어떻게 서로 다르게 라운딩 (rounding)

하는지를 보여준다:

mysql> SELECT ROUND(2.5), ROUND(25E-1);

+------------+--------------+

| ROUND(2.5) | ROUND(25E-1) |

+------------+--------------+

| 3          |            2 |

+------------+--------------+

보다 자세한 정보는, Chapter 21, Precision Math를 참고한다. 

SIGN(X)

인수의 부호를 -1, 0, 또는 1로 리턴 하는데, 여기에서 리턴 되는 숫자는 

각각 음수, 0, 양수를 나타내는 것이다.

mysql> SELECT SIGN(-32);

        -> -1

mysql> SELECT SIGN(0);

        -> 0

mysql> SELECT SIGN(234);

        -> 1

SIN(X)

래디안으로 주어진 X의 싸인(sin) 값을 리턴 한다.

mysql> SELECT SIN(PI());

        -> 1.2246063538224e-16

mysql> SELECT ROUND(SIN(PI()));

        -> 0

SQRT(X)

음수가 아닌 X의 제곱 루트(square root) 값을 리턴한다.

mysql> SELECT SQRT(4);

        -> 2

mysql> SELECT SQRT(20);

        -> 4.4721359549996

mysql> SELECT SQRT(-16);

        -> NULL  

TAN(X)

래디안으로 주어진 X의 탄젠트 값을 리턴한다.

mysql> SELECT TAN(PI());

        -> -1.2246063538224e-16

mysql> SELECT TAN(PI()+1);

        -> 1.5574077246549 

TRUNCATE(X,D)

숫자 X를 D 자릿수 뒤의 숫자를 없앤 후 리턴한다. 만일 D가 0 이면, 

리턴되는 숫자는 소수점 또는 소수 부분이 없게 된다. D는 음수로 

표시할 수도 있는데, 이렇게 표시하면 숫자 X의 D 자리로부터 왼쪽 

부분이 0으로 표시가 된다.

mysql> SELECT TRUNCATE(1.223,1);

        -> 1.2

mysql> SELECT TRUNCATE(1.999,1);

        -> 1.9

mysql> SELECT TRUNCATE(1.999,0);

        -> 1

mysql> SELECT TRUNCATE(-1.999,1);

        -> -1.9

mysql> SELECT TRUNCATE(122,-2);

       -> 100

mysql> SELECT TRUNCATE(10.28*100,0);

       -> 1028

'IT > MySQL' 카테고리의 다른 글

MySQL 내장 함수. 숫자 함수, 문자 함수.  (0) 2017.01.20
Mysql 세자리 콤마 찍기.  (0) 2016.11.16
mysqlbinlog query 보기  (0) 2016.07.15
Mysql Binary log(bin log).  (0) 2016.07.15
mysql 여러가지 작업(optimize, Mornitoring 등).  (0) 2016.05.09
Posted by 당양부부34
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

php 에서 코딩을하다보면 인코딩이 꼬여 한글이 깨지는 현상이 나타난다...

개발자의 적은 한글이라는 소리가 있듯이? ㅋㅋ 이럴때 사용 하는 방법이

 

1. iconv 함수 사용.

iconv('현재인코딩','바꿀인코딩','문자열');

 

2. mb_convert_encoding 함수 사용(한글, 중국어 등 2byte 이상 문자를 지원).

mb_convert_encoding('문자열', '바꿀인코딩', '현재인코딩');


3. EUC-KR보다 cp949(한글 완성형) 사용 장려.

Posted by 당양부부34

2016. 10. 9. 18:43 IT/APP

앱 만들기 과정.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

○ 앱 만들기 교육 과정.


1. 앱 기획 : 어떤 앱을 만들고 왜 만드는가.

2. 프로젝트 관리 : 우리 팀에선 누가 어떤 역할을 맡을 것인가.

3. 시장조사 : 비슷한 앱을 어떤 것이 있고 우리는 어떻게 앱을 차별화 할 것인가.

4. 기획 및 디자인 : 앱의 메뉴는 어떻게 나누며 어떻게 디자인 할 것인가.

5. 개발 : 어떻게 프로그래밍 하여 앱을 완성할 것인가.

6. 마케팅 : 어떤 마케팅을 하여 시장에 앱을 퍼뜨릴 것인가.



Posted by 당양부부34

2016. 8. 31. 11:32 IT

UI 라이브러리

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

UI 라이브러리

    - jQuery UI : http://jqueryui.com/

    - Kendo UI : http://demos.telerik.com/kendo-ui/

    - 액시스제이 : https://www.axisj.com/ko/axisj/docs



Posted by 당양부부34

2016. 7. 15. 17:50 IT/MySQL

mysqlbinlog query 보기

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


[MySQL Program] mysqlbinlog


 앱으로 보기 본문 기타 기능

mysqlbinlog 프로그램은 어려운 부분은 아니다. 하지만 간과하기 쉬운 몇가지가 있어서 좀 생각하고 넘어가는게 좋을 것 같다.

mysqlbinlog 프로그램을 사용한다는 것은 binary-log format, relay-log format, statement-based format, row-based format, Point-In-Time recovery 와 같은 주제들에 모두 관심을 갖는다는 의미라서 중요하다.

Section 5.2.4, “The Binary Log”

Section 17.2.4, “Replication Relay and Status Logs”

Section 17.2.1, “Replication Formats”

Section 7.5, “Point-in-Time (Incremental) Recovery Using the Binary Log”

MySQL Internals: The Binary Log (19.7 Event Structure, 19.6 Event Meanings, 19.9 Event Data for Specific Event Types)



[용도]

mysqlbinlog 프로그램은 보통 두 가지 용도로 사용한다.

1. 추적

데이터에 문제가 발생하거나 마스터 슬레이브간 불일치가 발생하거나 어떤 트랜잭션이 문제가 되었거나 등 어떤 문제가 발생했을 때

write 쿼리에 대해 추적할 수 있는 기능을 제공한다.

복제를 위해 또는 이런 증거를 남기기 위해 binary log를 활성화 시켰다면 mysqlbinlog 프로그램으로 Statement 형태로 변환해서 볼 수 있게 된다.

2. 복구

MySQL의 백업정책은 회사마다 다르겠지만 보통 하루 한번은 full backup을 할 것이다.

이때 full backup만 가지고 복구해서 해결되면 다행이지만 그렇지 않은 경우 binary log를 적용하여 PIT recovery를 수행해야한다.

시점은 datetime일 수도 있고 sequence number 일수도 있다.


[사용법]

shell> mysqlbinlog [options] binlog.0000003


[결과파일]

# at 141 (해당 이벤트의 시작 포지션)

#100309  9:28:36 server id 123  end_log_pos 245 (로그 남은 시간, server id, 끝나는 포지션)

  Query thread_id=3350  exec_time=11  error_code=0 (thread id, 수행시간 등)

 


Statement는 사실 그냥 우리가 알아볼수 있는 쿼리형태라서 따로 설명이 필요 없다.

Row-Based Event 에 대해서만 잠시 살펴보겠다.

이벤트 타입은 3가지로 기록된다. (WRITE_ROWS_EVENT, UPDATE_ROWS_EVENT, DELETE_ROWS_EVENT)


(원본쿼리 예제)

CREATE TABLE t

(

  id   INT NOT NULL,

  name VARCHAR(20) NOT NULL,

  date DATE NULL

) ENGINE = InnoDB;


START TRANSACTION;

INSERT INTO t VALUES(1, 'apple', NULL);

UPDATE t SET name = 'pear', date = '2009-01-01' WHERE id = 1;

DELETE FROM t WHERE id = 1;

COMMIT;

 


(결과1) mysqlbinlog 로 본 결과

Statement-Based와는 달리 알아보기 힘들게 되어 있다.

예제에 따라 Write_rows, Update_rows, Delete_rows 이벤트로 나뉘는 걸 확인 할 수 있다.

shell> mysqlbinlog log_file

...

# at 218

#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F


BINLOG '

fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=

fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==

'/*!*/;

...

# at 302

#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F


BINLOG '

fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=

fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP

'/*!*/;

...

# at 400

#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F


BINLOG '

fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=

fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP

'/*!*/;


(결과2) --vervose 옵션을 1개 사용

이제는 좀 알아보기 편하게 되었다. 매칭되는 컬럼의 개수와 값을 알 수 있다.

shell> mysqlbinlog -v log_file

or

shell> mysqlbinlog -v --base64-output=DECODE-ROWS log_file

...

# at 218

#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F


BINLOG '

fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=

fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==

'/*!*/;

### INSERT INTO test.t

### SET

###   @1=1

###   @2='apple'

###   @3=NULL

...

# at 302

#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F


BINLOG '

fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=

fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP

'/*!*/;

### UPDATE test.t

### WHERE

###   @1=1

###   @2='apple'

###   @3=NULL

### SET

###   @1=1

###   @2='pear'

###   @3='2009:01:01'

...

# at 400

#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F


BINLOG '

fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=

fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP

'/*!*/;

### DELETE FROM test.t

### WHERE

###   @1=1

###   @2='pear'

###   @3='2009:01:01'


(결과3) --vervose 옵션을 2개 사용

이제는 컬럼의 데이터 타입과 nullable 도 알 수 있게 되었다.

 shell> mysqlbinlog -vv log_file

...

# at 218

#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F


BINLOG '

fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=

fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==

'/*!*/;

### INSERT INTO test.t

### SET

###   @1=1 /* INT meta=0 nullable=0 is_null=0 */

###   @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */

###   @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */

...

# at 302

#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F


BINLOG '

fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=

fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP

'/*!*/;

### UPDATE test.t

### WHERE

###   @1=1 /* INT meta=0 nullable=0 is_null=0 */

###   @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */

###   @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */

### SET

###   @1=1 /* INT meta=0 nullable=0 is_null=0 */

###   @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */

###   @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */

...

# at 400

#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F


BINLOG '

fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=

fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP

'/*!*/;

### DELETE FROM test.t

### WHERE

###   @1=1 /* INT meta=0 nullable=0 is_null=0 */

###   @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */

###   @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */


(결과4)  --base64-output=DECODE-ROWS 와  --verbose 옵션의 조합

binary 형태도 제외하고 보여준다.

shell> mysqlbinlog -v --base64-output=DECODE-ROWS log_file

...

# at 218

#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F

### INSERT INTO test.t

### SET

###   @1=1

###   @2='apple'

###   @3=NULL

...

# at 302

#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F

### UPDATE test.t

### WHERE

###   @1=1

###   @2='apple'

###   @3=NULL

### SET

###   @1=1

###   @2='pear'

###   @3='2009:01:01'

...

# at 400

#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F

### DELETE FROM test.t

### WHERE

###   @1=1

###   @2='pear'

###   @3='2009:01:01'


4.6.7.2 mysqlbinlog Row Event Display




[옵션들]

 --read-from-remote-server

옵션의 경우 리모트서버에서 binlog를 읽을 수 있게 처리해준다. 타겟이 되는 서버에 대한 옵션을 같이 써줘야한다.

 --host, --password, --port, --protocol, --socket, and --user


--hexdump

16진수로 덤프를 해준다. 복제에 문제가 생겼을 때 trace하는데 유용하다.


--rewrite-db

DB명을 바꿀 수 있다. 별거 아닌 것 같아도 복구 할때 유용하다.


--database

--binlog-do-db 옵션과 마찬가지로 특정 DB만 내린다. 이건 주의해야한다.


--start-datetime, --stop-datetime

시점(시간)을 명시한다.


--start-position, --stop-position

시점(포지션)을 명시한다.


--verbose

row event를 SQL형태로 변환해준다.


--exclude-gtids, --include-gtids, --skip-gtids

GTID 옵션들

 


[Row-Based 로 변경되는 경우들]


5.2.4.3 Mixed Binary Logging Format



'IT > MySQL' 카테고리의 다른 글

Mysql 세자리 콤마 찍기.  (0) 2016.11.16
Mysql 수학 함수  (0) 2016.11.03
Mysql Binary log(bin log).  (0) 2016.07.15
mysql 여러가지 작업(optimize, Mornitoring 등).  (0) 2016.05.09
mysql table name ibd 형태일 시 파일 의미.  (0) 2016.04.28
Posted by 당양부부34
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Mysql 데이터를 좀 더 안정적으로 보호하기 위해선 바이너리 로그가 필수다.


my.cnf에 보면

log-bin=mysql-bin 을 주석처리 하지 않는다면 로그를 지속적으로 쌓을 것이다.

혹은 Mysql 시작시에 --log-bin[=file_name] 을 사용


로그가 용량을 꽤 차지 하게 되므로, 주기적으로 데이터베이스를 백업 받고 바이너리 로그를 지워주는 것이 좋다.


복구할 때는

mysqlbinlog msyql-bin.000001 > bakcup.sql

형식으로해서 쿼리문으로 복구가 가능하다.

로그를 관리할려면 my.cnf에 아래와 같이 설정하면 된다.



binlog_cache_size      =  50M      # binlog cache 사이즈 

max_binlog_size        =  500M    # bin로그 maximum 사이즈 

expire_logs_days        = 3       # 로그 만료기간


바이너리 로그 리스트는


mysql> show binary logs; 

mysql> show master logs; 


해당 로그 파일을 삭제할 때는 


mysql> purge master logs to 'mysql-bin.000010';


특정 일자기준으로 삭제할 때는


mysql> purge master logs before date_sub(CURRENT_DATE, INTERVAL 31 DAY);


my.cnf 설정 외에 환경변수를 수정해도 된다.


mysql>show variables;

에서 expire_logs_days를 보면 알 수 있다.


기본적으로는 0으로 되어 있어 삭제가 되지 않으나


mysql> set global expire_logs_days=7;

로 설정하면 7일동안 저장하고 삭제한다.

Posted by 당양부부34
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

1. Front Page

$.ajax({

 url:"/test.php",

 data:{ 

  mode : "ins",

  name : encodeURIComponent(userName)

 },

 type:"POST",

....

});

 

encodeURIComponent는 알겠지만 URL 형식으로 데이터를 넣을 수 있도록 문자열을 인코드한다. 결과적으로 name에는 %ED%97%90%EB%AD%90%EC%95%BC 뭐 이런식으로 데이터가 저장된다. 경우에 따라선 자동으로 변환해주나 브라우저 호환성을 위해 강제로 변환하게 하자.

 

2. Server Page

<?php

$name = $_GET['name'];

// 1. 설명이 필요한가? 전달되는 방법(method)이 다르면 당연히 거기에 맞게 변경해준다.

 

$name = urldecode($name); 

// 2. %ED%97... 식으로 변환된 문자열을 본래 형태의 문자열로 변환한다. 이 반대 역할의 함수는 당연히 urlencode.

 

$name = iconv("utf-8","euc-kr",$name); 

// 3. 변환 이후에는 utf-8로 데이터가 남아서 이걸로 지지고 볶을 순 없다. euc-kr로 변환 후 볶아준다.

 

$name = mb_convert_encoding($name,"euc-kr","utf-8"); 

// 4. 일부 서버에서는 iconv 함수를 지원하지 않는 경우도 간혹 있다. 그럴 경우 mb_string 계열 함수를 통해 변환을 해준다.

 

// 5. 필요하면 추가적인 보안조치(SQL Injection, XSS 필터등)를 해준다.

// 6. echo

echo iconv("euc-kr", "utf-8", "테스트 발송 되었습니다.   ");

// 7. PROFIT!

?>



Posted by 당양부부34
이전버튼 1 2 3 4 5 6 7 8 ··· 21 이전버튼

블로그 이미지
주요 토렌트를 블로깅하고 있습니다. 토렌트 순위 등은 다른 사이트를 찾아보세요. 주요 웹툰 순위도 게재했어요 경제를 좋아하는 일산의 행복한 프로그래머입니다.
당양부부34
Yesterday
Today
Total

달력

 « |  » 2025.5
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함