2016년 1월 31일 일요일

PHP의 정규표현식(Regular Expression)

PHP의 정규표현식

cheat sheet: http://ult-tex.net/info/perl/

PHP의 정규표현식은 구분자로 시작해서 구분자로 끝난다.

      /php/ --->>> '/'가 구분자이다.
                         구분자는 정규표현식과 정규표현식이 아닌 것을 구분해주기 위함이다.
                         
                         '/'대신, '#', '+', '%' 같은 특수기호도 사용가능

      /jsp/i --->>> 'i'는 대소문자를 구분하지 않겠다는 의미

      /body$/m --->>> '$'은 가장 끝의 경계점을 의미한다.
                              'm'은 멀티라인이다.

                              ex) everybody
                                   body
                                   body
                                   Onebody

                                    'm'이 없었으면, 제일 마지막에 있는 One뒤의 body가
                                    선택되지만, 'm'으로 인하여 행 마다 있는 body가 다 선택된다.

\b: 단어의 경계를 의미한다.

      \bweb\b --->>> 'web'이라는 독립된 단어를 가리킨다. 즉, 'web'을 가리킴
                               'webscript'에서도 'web'이 있지만 선택되지 않는다.

\s: 공백을 의미한다.

preg_match()의 리턴 값은, 해당 패턴을 찾았으면 1
                                   찾지 못했으면 0
                                   문법적 에러는 false

capturing: preg_match함수의 결과 값으로 데이터를 따로 대입시키기 위해 '()'로 감싸는 것.

      ex) http://www.naver.com/index.html

            preg_match('/http:\/\/([^/]+)/', subject, result)

                  ([^/]+)로 감싸진, www.naver.com이 따로 결과 값으로 대입된다.

capturing할 때, 괄호 안에 '?:'를 기입하면 결과 값에 데이터가 따로 대입되지 않는다.

      ex) http://www.daum.net/index.html

            preg_match('/^(?:http://)?([^/]+)/', subject, result)

                  '^'는 행의 시작점을 의미한다. 만약 '[]'안에 있으면 Not을 의미
                  
                  가장 처음에 http://가 있는 지 판단하는 데, '?' 때문에 없을 경우와
                  존재한다면 1개만 등장하도록 한다.

                  서브패턴안에 '?:' 있으므로, 'http://'는 결과 값에 따로 대입하지 않는다.

                  즉, 결과 값은 www.daum.net

      ex) www.php.net

            preg_match('/[^.]+\.[^.]+$/', subject, result)

                  '[^.]+\.[^.]+$'의 의미는 $때문에 행의 끝에서 부터 본다.
                  
                  '[^.]+'는 '.'이 아닌 텍스트가 1개 이상인 경우, 즉 'net'

                  '\.'는 '.'을 가리키니까, 즉 net의 앞에 있는 '.'

                  '[^.]+'는 '.'이 아닌 텍스트가 1개 이상인 경우, 즉 'php

                  결과는 php.net

capturing할 때, 괄호 안에 ?P<key>으로 할 경우, 결과 값이 연관배열로 대입된다.

      ex) foobar: 2008

            preg_match('/(?P<name>\w+): (?P<digit>\d+)/', subject, result)

                  '\d'는 숫자를 의미

                  '?P<name>'로 인해, <name> 키 값에 foobar이 밸류로 대입

                  '?P<digit>'로 인해, <digit> 키 값에 2008이 밸류로 대입

                  결과는, [name] => boobar, [digit] => 2008

2016년 1월 20일 수요일

MySQL utf 8 설정하기

MySQL charset 설정

OS가 window일 경우, my.ini
        Linux일 경우, my.cnf 를 수정해주어야 한다.

해당 파일을 열고,
[mysql] 하단 부분에 default-character-set=utf8

[mysqld] 하단 부분에 character-set-client-handshake = FALSE
                            init_connect = "SET collation_connection = utf8_general_ci"
                            init_connect = "SET NAMES utf8"
                            default-character-set = utf84
                            character-set-server = utf8
                            collation-server = utf8_general_ci

[client] 하단 부분에 default-character-set = utf8

[mysqldump] 하단 부분에 default-character-set = utf8

를 추가한 후, 저장하고 MySQL을 재시작한다.

mysql에 접속한 후, show variables like 'c%'; 입력


위 그림과 같이, utf8로 변경이 된다!

하지만, 아직까지 한글이 ????로 표시되고 있다...


여기서 몇시간을 투자했지만... 결국 해결하지 못하고 컴퓨터를 끄고 잤다...

my.ini를 수정하고 나서, table을 삭제하고 다시 create해도 똑같은 현상이 일어났었다.

오늘, MySQL Window Command Line에서 한글이 깨지는 거라는 걸 알게 되었다.

기본 클라이언트 문자셋은 utf8이지만, 클라이언트에서 자신의 문자셋을 변경할 수 있다.

윈도우즈 커맨드라인에서 입력하는 한글은 euckr이니 euckr로 변경을 해야한다는 것을...

set character set euckr; 입력 후, select 해보니 한글이 제대로 출력되었다!


환경변수를 변경하면 전체 적용되는 게 아닌가 생각했지만,

웹에서 확인해보니 클라이언트 문자셋은 자신에게만 해당되는 것이었고

기존 값 그대로 utf8이었다.






2016년 1월 18일 월요일

정규표현식3

수량자

{~~~}: 중괄호 안에 있는 값이 수량을 의미한다.

      ex) '*'는 {0,}과 같다.
         
          '+'는 {1,}과 같다.

          '?'는 {0,1}과 같다.

*?: '*'뒤에 '?'가 오면, 수량자 0을 의미한다.

      ex) One ring to bring them all and in the darkness bind them

          r.*? --->>> 'r' 하나만을 가리킨다.

            결과 First match: r
                   All matches: r, r, r, r ~~

+?: '+'뒤에 '?'가 오면, 수량자 1을 의미한다.

          r.+? --->>> 'r'과 'r'뒤에 문자 하나를 같이 가리킨다.

            결과 First match: ri
                   All matches: ri, ri, rk

??: '?'뒤에 '?'가 오면, 수량자 0을 의미한다.

          r.?? --->>> 'r'하나만을 가리킨다.

탐욕적인 수량자(Greedy quantifier)

      ex) <div>test</div><div>test2</div>

          <div>.+</div> --->>> <div>test</div><div>test2</div> 모두 선택된다.
          이렇게 맨 앞의 <div>와 맨 뒤의 </div>사이에 있는 모든 게 선택되는 것을
          탐욕적인 수량자라고 한다.

게으른 수량자(Lazy quantifier)

          <div>.+?</div> --->>> <div>test</div> 만 선택된다.
          이렇게 맨 앞의 <div>와 처음으로 나타난 </div>까지 선택되는 것을
          게르은 수량자라고 한다.

Character class

      ex) A1 B2 c3 d_4 e:5 ffGG88--__--

          \w --->>> 알파벳, 숫자, 언더라인('_')을 가리킨다
                              (\w를 'word'라고 부름)

            결과 First match: A
                   All matches: A1, B2, c3~~~

          \w* --->>> word를 0개 or 1개 or 2개 이상을 가리킨다.

            결과 First match: A1
                   All matches: A1, B2, c3, ~~~

          [a-z]\w* --->>> word앞에 a~z중 하나가 오는 것을 가리킨다.

            결과 First match: c3
                   All matches: c3, d_4, e, ffGG88
     
          [A-z0-9_] --->>> \w와 같다.

          \W --->>> 대문자 'W'는 word의 반대를 가리킨다.
                              (공백, 특수문자, '.', ',' 등)

          \d --->>> 0~9까지의 숫자를 가리킨다.

          \D --->>> 소문자 'd'의 반대 즉, 숫자가 아닌 것을 가리킨다.
   
      ex) Ere iron was b

          \b: 어떠한 단어를 식별할 수 있다.

          \b\w --->>> word가 시작되는 곳을 가리킨다.

            결과 First match: E
                   All matches: E, i, w, b

          \w\b --->>> word가 끝나는 곳을 가리킨다.

            결과 First match: e
                   All matches: e, n, s, b

          \b\w\b --->>> 단어가 하나인 것을 가리킨다.

            결과 First match: b

      ex) cat concat

          \bcat --->>> 앞에 있는 'cat'을 가리킨다.

          cat\b --->>> 뒤에 있는 'cat'을 가리킨다.

      \A: 시작점을 의미한다.

          \A.. --->>> 앞에 있는 'ca'을 가리킨다.

      \Z: 제일 뒤에 있는 경계를 의미한다.

          ..\Z --->>> 뒤에 있는 'at'를 가리킨다.

Assertions

      ex) AAAX----aaax---111---BBBXCCC

          \w+(?=X) --->>> word가 1개 or 1개 이상이어야 하고,
                                    옵션으로 대문자 'X' 앞까지 선택하라는 의미.

                                    '?='는 특수기호이다.
                                    문자열을 검색하는 데 'X'를 쓰지만, 선택할 때는 'X'를 제외.

          결과 First match: AAA
                 All matches: AAA, BBB

          \w+(?=\w) --->>> word가 1개 or 1개 이상이어야 하고,
                                      옵션으로 word가 아닌 문자가 있을 경우,
                                      word가 아닌 문자 앞에 있는 word를 기준으로,
                                      해당 기준까지 선택하라는 의미(기준을 선택되지 않음)

          결과 First match: AAA
                                 ('AAAX-'에서 'X'뒤에 '-'가 word가 아닌 문자이다.
                                  '-'의 앞 문자인 'X'를 기준으로 해당 기준까지 선택되고
                                  'X'는 선택을 받지 못한다.)
                 All matches: AAA, aaa, 11,  BBBXCC

2016년 1월 10일 일요일

딥 러닝(deep learning)

딥 러닝

Deep Learning

딥 러닝이란, 사람의 사고방식을 컴퓨터에게 가르치는 기계학습의 한 분야이다.


딥 러닝 정의

      여러 비선형 변환기법의 조합을 통해 높은 수준의 추상화를 시도하는
      기계학습 알고리즘의 집합이다.

      추상화란, 다량의 데이터나 복잡한 자료들 속에서 핵심적인 내용 또는
      기술을 요약하는 작업

      기계학습이란, 인공 지능의 한 분야로, 컴퓨터가 학습할 수 있도록 하는
      알고리즘과 기술을 개발하는 분야

딥 러닝의 구조

      인공신경망에 기반하여 설계된 구조이다.

      인공신경망이란, 생물학의 신경망(동물의 중추신경계, 특히 뇌)에서
      영감을 얻은 통계학적 학습 알고리즘이다.

딥 러닝의 핵심

      딥 러닝의 핵심은 분류를 통한 예측이다.
      즉, 많은 데이터 중에서 패턴을 발견하여, 사람이 물건을 구별하는 것 처럼
      컴퓨터가 스스로 객체를 분별한다.

      이러한 형식을 두 가지로 나뉘게 된다.
      지도학습과 비지도학습

      지도학습은 먼저 컴퓨터에 고양이 이미지를 학습시킨 후, 학습한 결과를 바탕으로
      이미지가 고양이인지를 판별한다.
      사전에 반드시 고양이 이미지를 인식시켜주어야 한다.

      비지도학습은 고양이 이미지를 컴퓨터에 인식시켜주지 않아도
      고양이라고 판별을 하게 된다.
     
      비지도학습이 지도학습보다 기술적으로 우수하지만,
      일반적인 컴퓨터에서는 구동이 어렵다고 한다.
      (일반적으로 사용하는 컴퓨터의 성능상으론 부족)

딥 러닝의 사용사례

      네이버의 음성인식서비스에 딥 러닝이 사용되고 있다.


      페이스북에서 딥페이스라는 얼굴인식에도 딥 러닝이 사용되고 있다.


2016년 1월 2일 토요일

CasperJS란

Casper.JS

casperjs란, QT기반의 WebBrowers를 이용해 웹 페이지을 불러와
JavaScript, dom객체 등을 컨트롤 할 수 있는 Phantomjs를
보다 쉽게 사용할 수 있도록 만들어 진 것이다.
이를 전부 JavaScript기반의 스크립트로 처리하게 된다.


QT란, 컴퓨터 프로그래밍에서 GUI프로그램 개발에 널리 쓰이는
크로스 플랫폼 프레임워크이다.

크로스플랫폼이란, 멀티 플랫폼이라고도 하며 컴퓨터 프로그램, 운영체제,
컴퓨터 언어, 프로그래밍 언어, 컴퓨터 소프트웨어 등이 여러 종류의
컴퓨터 플랫폼에서 동작할 수 있다는 것을 의미한다.

casperjs를 언제 사용할까

      프로그램을 테스트할 때 주로 사용한다.
      브라우저에 주소 치고, 클릭하고, 로그인 하고, 해당 웹 페이지 테스트를
      일일이 하나 하나 하지 않고도, 자신이 원하는 작업을 할 수 있다.
     
      casperjs는 쉽게 말하면 웹 브라우저이다.
      화면 없이 브라우저처럼 웹 페이지를 접근해서 데이터 형태로 읽을 수 있고,
      마우스와 키보드의 입력을 줄 수 있다.

casperjs 설치법

      윈도우 보다 리눅스에서 작업이 편리하기 때문에
      리눅스 설치 방법에 대해서 살펴보자!

      먼저, casperjs를 설치하기 위해선 phantomjs가 설치되어 있어야 하므로
      phantomjs를 설치한다.

      wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-i686.tar.bz2

      필자는 1.9.7버전을 다운 받았다.
      원레 1.9.8을 다운 받았는데, 접근한 웹 페이지의 HTML태그를 JavaScript로
      접근하려고 하니까 에러가 발생했다...
     
      알아보니까, 1.9.8 버전에서 일어나는 버그라고 한다.
      해결해보려고 1시간을 잡고 있었지만... 결국 다운그레이드를 했다...
      지금은 최신버전인 2.0이 출시되었다.

      다운받은 압출파일을 해제한다.
      tar -xvf phantomjs-1.9.7-linux-i686.tar.bz2

      이제 casperjs를 설치해보자.
      casperjs는 git을 이용해서 다운 받았다.
      git clone git://github.com/n2k0/casperjs.git

      casperjs디렉토리로 이동해서, 
      ln -sf 'pwd'/bin/casperjs /usr/local/bin/casperjs 입력하면 모든 설치가 완료되었다.

      만약 Node.js가 설치되어 있다면... 이러한 절차없이 바로 npm으로 설치할 수 있다.
      npm install -g phantomjs
      npm install -g casperjs

      필자는 npm으로 설치했으나... phantomjs가 1.9.8버전으로 설치되어서
      wget으로 다시 설치했다.
      만약 npm으로 했을 때 1.9.8이면 지우고, 다른 버전으로 설치하자!!

결혼이민비자 신청방법(F-6-1 국민의 배우자)

 제가 일본인 여자친구와 결혼 후, 한국에 귀국하기 위해 신청한 결혼이민비자에 대하여 작성해보도록 하겠습니다. 필자는 일본에서 근무하고 있었으며, 한국에서의 소득은 없었습니다. 결혼이민비자를 신청한 날짜는 2021-04-21 이며, 사증이 발급된 날짜...