Provision

Server Provisioning & Terraform

  • Provisioning 이란, 한정된 자원을 최적의 효율을 위해 제공하는 기술적 개념을 말한다. 유저의 요청에 맞게 자원을 미리 세팅해두고, 유저의 요청에 따라 준비된 자원들을 목적과 효율에 맞게 제공하는 개념이다. 특정 분야에서 한정되어 사용하는 개념이 아니라 다양한 분야에서 응용되어지는 주제이다. (IT 분야만으로 한정되지도 않는다) IT 분야의 Provisioning의 예시로는, Server Provisioning, Storage Provisioning, Telecommunication Provisioning 등이 있다.
  • 여기서는 Terraform 을 활용한 AWS 서버 프로비져닝에 관해 다룬다.
Read more

NGINX

Nginx

0. What is nginx?

  • client 가 외부 IP와 그 포트를 통해 server 에 접근하면,
  • 그 때부터는 request 를 내부 IP 와 port 로 연결을 해주어야 한다.
  • 일종의 proxy server 역할을 해주는 것이 nginx

1. Install Nginx

1
2
$ sudo apt-get update
$ sudo apt-get install nginx

2. Manage the Nginx Process

  • nginx Process
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #start Nginx
    $ sudo systemctl start nginx

    #stop nginx
    $ sudo systemctl stop nginx

    #restart nginx
    $ sudo systemctl restart nginx

    #check status nginx
    $ sudo systemctl status nginx

    # reload nginx
    $ sudo systemctl reload nginx

3. Structure

  • /etc/nginx
    • Nginx의 설정에 관련된 directory
  • /etc/nginx/nginx.conf
    • nginx의 기본설정 파일, global설정은 이 파일에서
  • /etc/nginx/sites-available/
    • 포트 접속시 개별 설정하는 directory
    • 여기 안에 default 파일 변경

4. Nginx Configuration

4.1 static file serving

/etc/nginx/sites-available/default 파일 수정

1
2
3
4
5
6
7
8
9
server {
location / {
root /path/to/html ;
}

location /images/ {
root /path/to/image;
}
}

4.2 proxy server

  • port 별로 설정이 가능하다
    1
    2
    3
    4
    5
    6
    7
    8
    server {
    # default 는 80 port (http default)
    # 8080 port 에 대해서
    listen 8080;
    location / {
    proxy_pass http://localhost:8080;
    }
    }
  • 여러개의 포트를 연결
server {
  listen 8080;
  listen 80;

  location / {
    proxy_pass http://localhost:8080;
  }
}

numpy_cheatsheet

np.arange(start, end)

  • start 에서 end-1 까지의 행렬(array) return

np.linspace(start, end, number_of_dots)

  • number_of_dots : 범위 안의 점 갯수

np.zeros_like(x)

  • 0으로 채운 x 와 같은 크기의 행렬

Mysql

MySQL

1. Install MySQL

1
$ cd usr/local/mysql/bin

위 경로에서

  • MySQL 서버에 접속

    1
    $ sudo ./mysql -p
    1
    mysql >
  • 패스워드 변경

    1
    2
    3
    mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY '바꾸고싶은 비밀번호';
    mysql>FLUSH PRIVILEGES;
    mysql>quit;

2. MySQL Shell Command

(1) DATABASE 생성, 접속, 삭제

  • 현재 상태 보기
    1
    mysql> STATUS
  • DB 목록 보기
    1
    mysql> SHOW DATABASES;
  • DB 만들기
    1
    mysql> CREATE DATABASE DBNAME
  • DB 접속하기
    1
    mysql> USE DBNAME;
  • 현재 접속중인 DB 확인하기
    1
    mysql> SELECT DATABASE();
  • DB 지우기
    1
    mysql> DROP DATABASE DBNAME;

(2) TABLE 생성, 추가, 삭제

  • table 만들기
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE table_name(
    column_name_1 column_data_type_1 column_constraint_1,
    column_name_2 column_data_type_2 column_constraint_2,
    .
    .
    .
    )
  • column_constraint 는 Optional 이다. (unique 와 같은 제약조건)

user 라는 table에 name, email, age 컬럼 생성

  • example1 : constraint 가 없을 떄,
    1
    2
    3
    4
    5
    mysql> CREATE TABLE user(
    name CHAR(20),
    email CHAR(40),
    age INT(3)
    )
  • example2 : constraint가 있을 때,
    1
    2
    3
    4
    5
    6
    7
    mysql> CREATE TABLE user2(
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    email VARCHAR(30) UNIQUE NOT NULL,
    age INT(3) DEFAULT'30',
    rdate TIMESTAMP
    )


(3) 수정

(3)-1. DATABASE 수정

  • DATABASE 의 encoding 수정

  • 현재 문자열 encoding 확인
    1
    mysql> SHOW VARIABLES LIKE "CHARACTER_SET_DATABASE";
  • mydb 데이터베이스의 문자열 인코딩을 utf8 로 변경
    1
    mysql> ALTER DATABASE mydb CHARACTER_SET = utf8;
  • user 데이터베이스의 문자열 인코딩을 ascii 로 변경
    1
    mysql> ALTER DATABASE user CHARACTER_SET=ascii

(3)-2. TABLE 수정

  • user 테이블에 tmp라는 컬럼명, TEXT 데이터 타입 컬럼을 추가
    1
    mysql> ALTER TABLE user ADD tmp TEXT;

Scrapy

Scrapy

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

  • Scrapy 라이브러리는 파이썬에서 제공하는 라이브러리로써, 대량의 페이지들의 Crawling을 손쉽게 해주는 라이브러리이다.

1. Install

  • 파이썬의 라이브러리 이므로 pip 으로 설치 할 수 있다.
    1
    pip3 install scrapy

2. 실습

  • 실습을 위해 import 할 것들
1
2
3
import scrapy
import requests
from scrapy.http import TextResponse
  1. requests 를 통해 url 정보를 받아온다.
  2. TextResponse 를 통해 받아온 html 파일을 encoding 과 text형식으로 return
1
2
req = requests.get("url_name")
response = TextResponse(req.url, body=req.text, encoding="utf-8")
1
2
3
4
5
6
a = response.xpath('xpath')
# xpath 로 지정한 엘리먼트를 가져온다.
a_text = reponse.xpath('xpath/text()')
# 엘리먼트의 text data 를 가져온다.
a_text.extract()
# 엘리먼트의 text data들을 말그대로 extract 하여, list 형태로 return 해준다

3. Scrapy 사용하기

(1) scrapy 프로젝트 생성

  • shell command
    1
    scrapy startproject crawler
1
!scrapy startproject crawler
New Scrapy project 'crawler', using template directory '/Users/emjayahn/.pyenv/versions/3.7.0/envs/dss/lib/python3.7/site-packages/scrapy/templates/project', created in:
    /Users/emjayahn/Dev/DSS/TIL(markdown)/crawler

You can start your first spider with:
    cd crawler
    scrapy genspider example example.com
1
!tree crawler
crawler
├── crawler
│   ├── __init__.py
│   ├── __pycache__
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       └── __pycache__
└── scrapy.cfg

4 directories, 7 files

(2) Scrapy 기본 구조

  1. Spider

    • 크롤링 절차 정하기
    • 어떤 웹사이트들을 어떻게 크롤링 할 것인지 선언
    • 각각의 웹페이지의 어떤 부분을 스크래핑 할 것 인지 명시하는 클래스
  2. items.py

    • spider 가 크롤링한 data 들을 저장할 때, 사용자 정의 자료구조 클래스
    • MVC : 중 Model 부분에 해당
    • Feature 라고 생각
  3. pipeline.py

    • 스크래핑한 데이터를 어떻게 처리할지 정의
    • 데이터에 한글이 포함되어 있을 때는 encoding=’utf-8’ utf-8인코딩이 필요
  4. settings.py

    • Spider, item, pipeline 의 세부 사항을 설정
    • (예) 크롤링 빈도 등
    • (예) robots.txt - ROBOTSTXT_OBEY=True

Xpath

xpath

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

1. xpath란?

  • xpath = XML Path Language
  • XML 문서의 element나 attribute의 value에 접근하기 위한 언어
  • XML 문서를 해석하기 위한 언어이므로, 기본적으로 path expression 이 바탕이 되어있다.
  • 연산, 문자열 처리를 위한 라이브러리를 내장하고 있다.

2. Location Path

  • element 를 찾으러 가는 것이므로, location을 나타내기 위한 연산자는 다음과 같다.
  1. element_name : element_name 과 일치하는 모든 element를 선택한다.
  2. / :
    • 가장 처음 쓰는 /는 절대경로를 의미한다.
    • Path 중간에 쓰는 /는 조건에 맞는 바로 다음 하위 엘리먼트를 검색한다. (css selector에서 >와 같다)
  3. // : 가장 상위 엘리먼트
  4. . : 현재 엘리먼트
  5. * : 조건에 맞는 전체 하위 엘리먼트를 검색한다(css selector 에서 한칸 띄우는 것 과 같다)
  6. element[조건] : 엘리먼트에 조건에 해당되는 것을 검색한다
    • (예) p[2] : p 엘리먼트 중 두번째 엘리먼트를 선택 **주의:1부터 시작, 0이 아님 **
    • (예) [@(attribute_key="attribute_value")] : 속성값으로 엘리먼트를 선택
      [@id="main"] : “main” 이라는 id 를 선택
      [@class="pp"] : “pp” 라는 class 를 선택
  7. not(조건) : 조건이 아닌 엘리먼트를 찾는다.
  8. /text() : 해당 엘리먼트의 text 데이터를 가져온다
  9. /@attribute_name : 해당 엘리먼트의 attribute_name 에 할당된 value 값을 가져옴
    • /@href : 해당 엘리먼트의 href의 value 값을 가져옴

Pillow

Pillow

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

  • Pillow 는 Python에서 이미지를 핸들링 하기위한 라이브러리이다. 스크린 샷, 이미지 크롭, 썸네일
    등을 만들 수 있다.
  • 또한, 다양한 이미지 확장자를 다룰수 있다. (예, jpg, png)

Pillow install

1
pip install Pillow

1. Import Convention

  • Pillow 를 사용하기에 앞서, Import 해야한다.
    1
    from PIL import Image

2. Pillow 메소드

(1) open()

  • 이름 그대로, 경로와 파일 이름을 적어주면, 해당 이미지리턴하여 Variable 에 할당한다.
    1
    image = Image.open("imagefile_name")

(2) crop()

  • 이름 그대로, image 를 잘라준다. 이 때 Parameter 는 box형태로 들어가게 된다.
  • box 는 (left, upper, right, lower) 로 들어가게 된든데, pixel 단위로 들어가면 된다
  • 이미지의 가장 왼쪽과 위쪽 라인을 기준으로,
    • left px 만큼
    • upper px 만큼
    • (왼쪽을 기준으로) right px 만큼
    • (위쪽을 기준으로) bottom px 만큼

      잘라, box 로 만들어 준다.
      1
      2
      3
      box = (10, 10, 110, 110)
      image.crop(box)
      ### 이렇게 되면 가로세로 100px 만큼의 이미지가 만들어진다.

(3) thumbnail()

  • 썸네일을 만들어준다.
  • 썸네일의 활용 방안은 한 가지 사진을 어플리케이션 곳곳에서 사용한다고 할 때, 데이터 사이즈가 큰 원본 사진을 계속 해서 들고 다니며 사용하면 어플리케이션에 따라 메모리 낭비, 서버용량 낭비, 트래픽 낭비 등으로 이어질 수 있다. 따라서, 이미지의 데이터 크기와 해상도를 낮춰 사용할 수 있다.
    1
    2
    image.thumbnail((pixel, pixel))
    #thumbnail 메소드를 사용하여, 원하는 pixel 수로 줄일 수 있다.

Requests

WEB CRAWLING 1

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

Requests

  • Requests 패키지는 크롤링 하고자 하는 페이지를 url 값을 통해 가져와 객체로 변환 해주는 기능을 가지고 있다.

1. Installation

  • Requests 를 이용하기 위해 package 를 설치해준다.
    1
    $ pip3 install requests

  • request를 이용하면서, json 형식으로의 크롤링과, html 형식으로 css selecting 을 위한 크롤링을 실습해 볼 것이므로, BeautifulSoup Package 역시 같이 설치해준다. (BeautifulSoup은 html parser 를 이용해보기 위함이다.)
  • python-forecastio 는 dark sky 의 api를 활용해 날씨 데이터를 받아올때 사용해보기 위해 설치한다.
    1
    2
    $ pip3 install bs4
    $ pip3 install python-forecastio
  • import 할 것들
    1
    2
    3
    4
    import requests
    import forecastio
    from bs4 import BeautifulSoup
    from pandas.io.json import json_normalize

2. [ jSON ] Dark Sky api 활용 날씨정보 가져오기

  • DarkSky api 는 위도와 경도를 입력하면, 날씨 정보를 주는 api 이다.

  • https://darsky.net/dev/ 에 가입 후, TOKEN 을 받는다.

  • 위에서 받은 개인의 TOKEN 을 활용해 url 을 먼저, formating을 해준다.

  • requests의 get 메소드를 활용해 url 의 정보를 받아온다.

  • 받아온 정보를 requests 의 json 메소드로 json 형식으로 변환해준다.

  • json 을 확인하고 원하는 정보를 return 해준다.

    1
    2
    3
    4
    5
    def forecast(lat, lng):
    url = "https://api.darksky.net/forecast/{}/{},{}".format(TOKEN, lat, lng)
    response = requests.get(url)
    json_obj = response.json()
    return json_obj["hourly"]["summary"]

3. [ html ] BS4 활용 html selecting 해서 가져오기

  • 네이버의 실시간 검색순위 부분의 text 를 크롤링 해보자
  • html 파일을 BS4 를 활용해 받아온뒤, CSS selecting 으로 원하는 text data 를 가져온다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from bs4 import BeautifulSoup
def naver():
url = "https://www.naver.com"
df = pd.DataFrame(columns=["rank", "keyword"])
response = requests.get(url)
dom = BeautifulSoup(response.content, "html.parser")

# BeautifulSoup(markup, features, builder, parse_only, from_encoding, exclude_encodings)

for keyword in keywords:
df.loc[len(df)] = {
"rank":keyword.select_one('.ah_r').text,
"keyword":keyword.select_one('.ah_k').text
}
return df
  • print(response.content)의 모양을 보자.
  • 따라서, BeautifulSoup 으로 html 형식으로 parsing 해주고, css 를 활용해 selecting 해준다.
  • .select 는 여러개의 엘리먼트를 선택 -> 결과가 리스트
  • .select_one은 하나의 엘리먼트를 선택 -> 결과가 하나의 객체

Selenium

Selenium

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

  • 자동화 할 수 있는 프로그램

[ Install Selenium ]

  1. chrome driver 다운로드

    1
    $ mv ~/Download/chromedriver /usr/local/bin
  2. Selenium Python Package 설치

    1
    $ sudo pip3 install selenium

1. 셀레니움 사용해보기

  • import
    1
    from selenium import webdriver
  • Open Browser (Chrome Driver)
    1
    driver = webdriver.Chrome()
  • 페이지 이동
    1
    driver.get(url)
  • 브라우져 상에서 자바 스크립트 실행
    1
    driver.execute_script("window.scrollTo(300, 400)")
  • 지금 control하고 있는 window 객체 확인
    1
    2
    3
    main_window = driver.current_window_handle
    main_window
    #현재 control 하고 있는 window 의 객체를 리턴한다.
  • 열려 있는 전체 window 탭 모두 확인
    1
    2
    3
    windows = driver.window_handles
    windows
    #현재 열려있는 모든 탭의 객체를 리스트 형태로 리턴한다.
  • 열려있는 window 탭 중, control 대상 window 로 바꾸기
    1
    2
    3
    driver.switch_to_window(windows[0])
    #다시 원래 열었던 창으로 돌아가기
    driver.switch_to_window(main_window)

2. Alert 와 Confirm 다루기

  • 웹을 자동화해서 다니다보면, Alert 창이나 Confirm 창이 의도치 않게 나올 수 있다. 이를 다루는 방법은 다음과 같다.
  • Alert와 Confirm 창의 차이는,

    Alert 는 확인 창 하나만 있고, Confirm은 확인과 취소가 같이 있는 창이다.

(1) Alert

  • Alert 띄우기
    1
    2
    drive.switch_to_window(main_window)
    drive.execute_script("alert('이게 alert 로 뜰겁니다.');")
  • Alert 확인 누르기
    1
    2
    alert = driver.switch_to.alert
    alert.accept()
  • Alert 창이 있으면 확인을 누르고, 없으면 없다고 리턴하기 (예외처리)
    1
    2
    3
    4
    5
    try:
    alert = driver.switch_to.alert
    alert.accept()
    except:
    print("alert 가 없습니다.")

(2) Confirm

  • Confirm 띄우기
    1
    driver.execute_script("confirm('이게 Confirm 창입니다.');")
  • Confirm 창 확인 누르기 or 취소 누르기
    1
    2
    3
    4
    5
    confirm = driver.switch_to.alert
    # 확인
    # confirm.accept()
    # 취소
    confirm.dismiss()

3. 입력창에 글씨 입력하기

  • 이제부터 Selenium을 통해 특정 html 의 element 에 액션을 주려면,
    각종 Selector 를 사용하여 html 상의 element을 셀렉팅 하고, 해당 element 에게 액션을 주어야한다.
1
driver.find_element_by_css_selector(nameof cssselector).send_keys("입력할 내용")
  • .find_element_by_css_selector 와

    .find_elements_
    by_css_selector 는 다르다.element 는 하나의 selector 만 선택하는 반면, elements 는 여러가지 element 를 셀렉팅 해서, 리스트 형식으로 Return 한다.
  • 따라서 이렇게 리스트 형식으로 Return 이 된 경우, List[0] 등과 같이 그 엘리먼트를 뒤에 지정해줘야된다. 즉,
    1
    2
    3
    4
    driver.find_element_by_css_selector(nameof cssselector)
    #위는 바로 selecting 이 된것이지만,
    driver.find_elements_by_css_selector(nameof cssselector)[0]
    #위는 뒤에 selecting 위해 list 의 요소를 선택 해주어야한다.

4. 버튼 클릭하기

1
2
# 위의 방법처럼, element 를 선택해준다.
driver.find_element_by_css_selector("name of css selector").click()

5. id, class, 그 외의 attribute 값을 selecting 하는 법

1
2
3
4
driver.find_element_by_css_selector("name of css selector.").click()
# id 의 경우 : #idname
# class 의 경우 : .classname
# 다른 attribute 의 경우 : [attribute = 'value']

6. selecting 한 element 의 attribute value 를 얻는 방법

  • CSS로 선택한 element에 html 태그에는 다양한 attribute 들이 있을 수 있다. 이 중
    attribute의 value에 접근 하고 싶을 때는 .get_attribute()메소드를 사용할 수 있다.
    1
    driver.find_element_by_css_selector("name of css selector").get_attribute("attribute_name")

7. element 의 위치와, 사이즈 구하기

  • 스크롤을 내리거나, 엘리먼트의 위치와 크기를 알고 싶을 때 사용할 수 있다.
    1
    2
    3
    4
    5
    element = driver.find_element_by_css_selector("name of css selector")
    element.location
    #element 의 좌측 상단의 위치가 pixel 단위로 x, y 값의 dictionary로 보여준다.
    element.size
    #element 의 size 를 height, width를 pixel 단위로 dictionary로 보여준다.