# pyenv 
0. 환경
- centos 7.4

1. 설치 및 설정하기
- yum 을 이용한 설치
- ```
  # 사전 설치목록
  $ yum install -y  gcc gcc-c++ make git patch openssl-devel zlib-devel readline-devel sqlite-devel bzip2-devel
  $ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
      ```
    - 환경변수에 선언해두기 (.bashrc 파일에 추가)
    - ```
  # pyenv path
  export PATH="$HOME/.pyenv/bin:$PATH"

  eval "$(pyenv init -)"
  eval "$(pyenv virtualenv-init -)"
  ```

2. pyenv 확인하기
- 사용가능한 pyenv 목록 확인하기
- ```
      [centos@centos ~]$ pyenv versions
      * system (set by /home/centos/.pyenv/version)
        3.6.5
  ```
- pyenv 변경하기
- ```
      [centos@centos ~]$ pyenv global 3.6.5
      [centos@centos ~]$ pyenv versions
        system
      * 3.6.5 (set by /home/centos/.pyenv/version)
      
      # 해당 shell 에서만 동작시키고 싶다면
      $ pyenv shell 3.6.5
  ```
    - pyenv 실행하기 및 종료하기
- ```
  [centos@centos ~]$ pyenv activate 3.6.5
  [centos@centos ~]$ pyenv deactivate
  ```

Posted by 감각적신사
,

Django + Apache 연동하기

  • 참고 URL

  • 웹서버와의 연동 필요성:

    • Django 의 runserver 기능은 개발의 편의를 위해 테스트 목적으로 제공되는 기능이다
    • Django 측에서도 실제 서비스 환경에서는 runserver 기능을 이용하는 것을 권장하지 않는다
      • 안정성과 성능 측면을 고려하지 않은 기능이기 때문이다
      • multi threading 처리도 불가하다
      • audit 기능과 같은 보안에 관련된 기본 설정도 불가하다
  • 테스트 환경

    • centos 7.5
    • python2.7.10
    • Django 1.11.15
    • apache 2.4
  • apache 설치

    • apache 2.4 다운로드 페이지 접속
    • 다운로드 목록
      • Httpd 2.4.35
      • Apache APR(Apache Portable Runtime) 1.6.5
      • Apache APR Util 1.6.1 (https://apr.apache.org/download.cgi)
      • PCRE(Perl Compatible Regular Expressions) 8.39 (ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/)
    • 다운로드 압축 해제
      $ tar xvfz httpd-2.4.35.tar.gz
      $ tar xvfz apr-1.6.5.tar.gz
      $ tar xvfz apr-util-1.6.1.tar.gz
      $ tar xvfz pcre-8.38.tar.gz
      
    • 컴파일 전 디렉토리 구조 정리
      {{ apache_home }}/httpd-2.4.35
          ㄴ srclib
                ㄴ apr       # apr-1.6.5 압축 해제한 것을 옮긴다
                ㄴ apr-util  # apr-util-1.6.1 압축 해제한 것을 옮긴다
      
    • 컴파일
      $ make && make install
      
    • 컴파일 후 apache 디렉토리 구조
      {{ apache_home }}/httpd-2.4.35  # 컴파일 실행했던 디렉토리
      {{ apache_home }}/apache2       # 컴파일에 의해 생성된 디렉토리
                          ㄴ bin
                          ㄴ conf
                          ㄴ ...
      
    • 설정 변경
      $ vi {{ apache_home }}/conf/httpd.conf
      # ServerName 127.0.0.1
      # Listen 8080   << 80 은 root 에게 부여되는 port 라 8080 으로 변경함
      
    • 실행
      $ {{ apache_home }}/apache2/bin/apachectl start (graceful)  # graceful 은 stop & start
      
  • django 프로젝트 생성

  • 연동하기

    • mod_wsgi 패키지 설치
      • 웹서버에서 받은 요청을 django 같은 python application 으로 전달해주는 interface 역할을 하는 패키지
        $ sudo yum search mod_wsgi
        $ yum install mod_wsgi      # search 목록에서 python 버전에 맞는 것을 설치한다
        
    • 아파치 설정 추가하기

      $ vi {{ apache_home }}/conf/httpd.conf
      
      # 접근 권한 추가
      <Directory />
          Require all granted
      </Directory>
      
      # django 프로젝트 연결
      <VirtualHost *:8080>
          Alias /static/ {{ django_project_path }}/static/
          <Directory {{ django_project_path }}/static>
              Order allow,deny
              Allow from all
          </Directory>
      
          WSGIScriptAlias / {{ django_project_path }}/{{django_project_app}}/wsgi.py
          <Directory {{ django_project_path }}/{{django_project_app}}>
            <Files wsgi.py>
                    Order allow,deny
                    Allow from all
            </Files>
          </Directory>
      </VirtualHost>
      
      # wsgi 패키지 로드
      LoadModule wsgi_module      /usr/lib64/httpd/modules/mod_wsgi.so
      
    • django 프로젝트에 wsgi.py 파일 추가

      $ vi {{ django_project_path }}/{{django_project_app}}/wsgi.py
      
      import os, sys
      
      path = os.path.abspath(__file__+'/../..')
      
      if path not in sys.path:
          sys.path.append(path)
      
      from django.core.wsgi import get_wsgi_application
      
      os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_project_app.settings")
      application = get_wsgi_application()


Posted by 감각적신사
,


  • 참고 URL:

  • 이벤트 루프 란?

    • 자바스크립트는 단일 스레드 기반의 언어 이다 == 동시에 하나의 작업만 가능하다
    • 이벤트 루프는 이런 환경에서 동시성을 지원하는 방식을 말한다
  • 자바스크립트가 동작하는 환경

    • 브라우저
      • 이미지 참고
      • setTimeout, XMLHttpRequest 함수는 JS 엔진 외부인 Web API 영역에 정의되어 있다
    • Node.js
      • 이미지 참고
      • libuv 라이브러리 에서 이벤트 루프를 제공한다
  • 샘플 코드와 호출 순서 분석

    function printHello() {
      console.log('Hello from baz');
    }
    function baz() {
      setTimeout(printHello, 3000);
    }
    function bar() {
      baz();
    }
    function foo() {
      bar();
    }
    foo();
    
    • foo > bar > baz > setTimeout (WebAPI 영역으로 전달 - event loop 에 의한 callback 처리) > printHello
  • Promise

    • Promise 란, 자바스크립트 비동기 처리에 사용되는 객체 이다
    • ‘비동기 처리’ 란, 특정 코드의 실행이 완료될 때까지 기다리지 않고 다음 코드를 먼저 수행하는 것 이다
    • 3가지 state

      function getData() {
        new Promise(function (resolve, reject) {
              // ...
        });
      }
      
      getData().then(...).catch(...);
      
      • Pending(대기) : 비동기 처리 로직이 아직 완료되지 않은 상태 (new Promise(…)메소드 호출 상태)
      • Fulfilled(이행) : 비동기 처리가 완료되어 프로미스가 결과 값을 반환해준 상태 (reslove 수행상태 - then() 처리결과 반환)
        (Promise 의 이행의 다른 표현으로는 완료 이다)
      • Rejected(실패) : 비동기 처리가 실패하거나 오류가 발생한 상태 (reject 메소드 실행상태 - catch() 처리결과 반환)


'개발' 카테고리의 다른 글

ELK + grafana 구축  (0) 2019.01.08
성공적인 Git 브랜치 모델  (0) 2018.10.18
React 튜토리얼  (0) 2018.04.15
vi 사용하기  (0) 2018.02.08
React 의 특징  (0) 2017.12.20
Posted by 감각적신사
,

ELK + grafana 구축

개발 2019. 1. 8. 04:33

ELK + grafana 구축하기

  1. 구축 현황 

  2.  

  3. elasticsearch 설치 및 설정

    • 데이터 저장
    • 다운로드
    • 설치: tar.gz 압축해제
      $ tar xvfz elasticsearch-6.5.2.tar.gz
      
    • 설정: {ES 압축 해제한 폴더}/conf/elasticsearch.yml

      # JVM이 memory 영역을 관리할 수 있도록 설정 - /etc/security/limits.conf 에 사용자 설정 추가 필요
      bootstrap.memory_lock : true
      
      # 외부에서 접속 가능하도록 network 설정
      network_host: 0.0.0.0
      network.bind_host: 0.0.0.0 # 설정값이 없어서 key 등록 부터 해줘야 한다
      
    • 설정: {ES 압축 해제한 폴더}/conf/jvm.properties
      # ES 는 heap memory 를 32GB 정도로 잡아주는 것이 일반적이다
      -Xms32g
      -Xmx32g
      
    • 실행:
      ${ES 압축 해제한 폴더}/bin/elasticsearch
      
    • 동작 확인:
      $ curl http://localhost:9200
      
  4. logstash 설치 및 설정

    • 데이터 수집/필터링하여 저장소에 전송
    • 설정: {logstash 압축 해제한 폴더}/conf/logstash.conf # 새로 만들어줘야 한다
      input {
           beats {
                   codec => json     # input type 을 json 으로 해주면 값을 치환하지 않아도 된다
                   port => 5044      # default port 사용
           }
      }
      filter {
       date {                        # elasticsearch 에서 사용할 timestamp 로 치환해주는 것이 좋다
               match => [ "datetime" , "ISO8601" , "yyyy-MM-dd HH:mm:ss" ]
               target => "@timestamp"  #Replacing timestamp
       }
      }
      output {
           elasticsearch {
                   hosts => ["localhost:9200"]
                   index => "INDEX_NAME-%{+YYYY.MM.dd}"  # 데일리 형태로 index 를 만들면 삭제하기 용이하다
           }
      }
      
    • 실행:
      ${logstash 압축 해제한 폴더}/bin/logstash -f {logstash 압축 해제한 폴더}/conf/logstash.conf
      
  5. filebeat 설치 및 설정

    • 데이터를 logstash 로 전송한다
    • 설정: {filebeat 압축 해제한 폴더}/filebeat.yml

       filebeat.inputs:
       - type: log
      
         # Change to true to enable this input configuration.
         enabled: true
      
         # Paths that should be crawled and fetched. Glob based paths.
         paths:
           - /Users/mr.sense/Dev/application/logs/*.log
       output.elasticsearch:
         # Array of hosts to connect to.
         hosts: ["localhost:9200"]
      
    • 실행:
      ${filebeat 압축 해제한 폴더}/filebeat -f {filebeat 압축 해제한 폴더}/filebeat.yml
      
  6. kibana 설치 및 설정

  7. grafana 설치 및 설정

    • 다운로드 링크
    • 설치: tar.gz 압축해제
      $ tar -zxvf grafana-5.4.2.linux-amd64.tar.gz
      
    • 실행:
      ${grafana 압축 해제한 폴더}/bin/grafana-server

         elasticsearch 를 data source 로 설정:


'개발' 카테고리의 다른 글

자바스크립트의 비동기 처리  (0) 2019.01.27
성공적인 Git 브랜치 모델  (0) 2018.10.18
React 튜토리얼  (0) 2018.04.15
vi 사용하기  (0) 2018.02.08
React 의 특징  (0) 2017.12.20
Posted by 감각적신사
,

모니터 없는 서버에서 robotframework 를 활용한 web browser 테스트 하기

  1. 테스트 환경

    • centos 7.4
    • Python 3.6.5
      • robotframework=3.0.4
      • robotframework-selenium2library=3.0.0
      • selenium=3.14.1
    • chromedriver 2.38
  2. headlness chrome

    • headlness chrome 이란?
       decktop 환경이 아니라 모니터가 존재 하지 않는 서버의 환경에서는 일반적인 방식으로는 크롬을 사용할 수 없다. 
       이를 해결해 주는 방식이 바로 Headless 모드이다. 
       브라우저 창을 실제로 운영체제의 '창' 으로 띄우지 않고 대신 
       화면을 그려주는 작업(렌더링)을 가상으로 진행해주는 방법으로 실제 브라우저와 동일하게 동작하지만 창은 뜨지 않는 방식을 말한다
      
    • headlness chrome 사용 예제

        *** Settings ***
        Library   Selenium2Library
      
        *** Test Cases ***
        Basic Test
            Open Html
      
        *** Keywords ***
        Open Html
            Open Browser      http://mrsence.tistory.com      headlesschrome
      
    • 활용
      • CI 서버(Jenkins) 에서의 동작이 가능하다
        • 빌드 후, 빌드된 web service 에 대한 테스트를 자동으로 할 수 있다
        • web service 가 정상 동작 중인지, 주기적으로 batch 형태로 서비스를 테스트 할 수 있다


Posted by 감각적신사
,

성공적인 Git 브랜치 모델

  • 블로그 참고

  • 주요 브랜치
    • master 브랜치:
      • 실제로 직접 코드를 푸시하지 않고, 작업 완료된 브랜치들을 병합하여 제품으로서의 완성된 코드를 관리하는 브랜치 이다
      • TAG 와 Release 를 통해 version 을 관리한다
    • develop 브랜치:
      • 실제 작업이 일어나는 브랜치
      • 직접 코드를 푸시하는 작업이 이루어지기도 하고
      • 별도의 feature 브랜치 를 merge 하기도 한다
  • 임시 브랜치
    • feature 브랜치:
      • develop 브랜치 에서 분기
      • develop 브랜치 에 반영 후 제거한다
    • release-* 브랜치:
      • develop 브랜치에서 분기
      • 이 브랜치가 마스터에 반영되어, 출시될때 까지 존재할 수 있다
      • master / develop 브랜치 에 반영 후 제거한다
      • master 브랜치 에 반영하는 시점에 TAG 를 생성한다
    • hotfix-* 브랜치:
      • master 브랜치에서 분기
      • 현재 배포된 버전에서 발생한 문제를 해결하기 위해 생성하는 브래치 이다
      • master / develop 브랜치 에 반영 후 제거한다
      • master 브랜치 에 반영하는 시점에 TAG 를 생성한다


'개발' 카테고리의 다른 글

자바스크립트의 비동기 처리  (0) 2019.01.27
ELK + grafana 구축  (0) 2019.01.08
React 튜토리얼  (0) 2018.04.15
vi 사용하기  (0) 2018.02.08
React 의 특징  (0) 2017.12.20
Posted by 감각적신사
,

Robot framework 을 사용한 web page 테스트

  1. Prerequired

    • 관련 파이썬 라이브러리 설치
      # pip install --upgrade robotframework
      # pip install --upgrade robotframework-selenium2library
      
    • selenium 을 통해 webdriver 를 호출하기 위한 브라우저 모듈 설치
  2. Robot test 실행

     $ python -m robot.run {{실행파일}}
    
    • 실행 결과 를 xml 파일로 남긴다
      • output.xml
      • log.html
      • report.html
    • 예시
        MrSense:input mr.sense$ python -m robot.run input.robot
        ==============================================================================
        Input
        ==============================================================================
        Basic Test                                                            | PASS |
        ------------------------------------------------------------------------------
        Input                                                                 | PASS |
        1 critical test, 1 passed, 0 failed
        1 test total, 1 passed, 0 failed
        ==============================================================================
        Output:  /Users/mr.sense/Dev/robotframework/sample.code/robotframework/input/output.xml
        Log:     /Users/mr.sense/Dev/robotframework/sample.code/robotframework/input/log.html
        Report:  /Users/mr.sense/Dev/robotframework/sample.code/robotframework/input/report.html
      
  3. Input Tag 관련 테스트 파일

     *** Settings ***
     Library           Selenium2Library
    
     *** Test Cases ***
     Basic Test
         Open Html
         Insert Text To Input Field
         Insert File To Input Field
         Click The button
    
     *** Keywords ***
     Open Html
         Open Browser    http://localhost:8000/input.html   browser=chrome
         Maximize Browser Window
    
     Insert Text To Input Field
         Input Text    input-text    hello world
    
     Insert File To Input Field
         Choose File   input-file  /Users/mr.sense/Dev/input.html
    
     Click The button
         Click Element     input-button
    
  4. Click Event 관련 테스트 파일

     *** Settings ***
     Library           Selenium2Library
    
     *** Test Cases ***
     Basic Test
         Open Html
         Click The button
         Click The Selectbox
         Click The link
    
     *** Keywords ***
     Open Html
         Open Browser    http://localhost:8000/click.html   browser=chrome
         Maximize Browser Window
    
     Click The button
         Click Element     btn-click
    
     Click The Selectbox
         Select From List by Value    xpath=//select[@id="select-click"]    third
         Element Should Contain    select-click    third
    
     Click The link
         Click Link      /a.html
         Wait Until Page Contains    HIHIHI    2s
    
  5. Table 관련 테스트 파일 (id 없는 element 다루기)

     *** Settings ***
     Library           Selenium2Library
    
     *** Test Cases ***
     Basic Test
         Open Html
         Get Table Row Count
         Get Table Td text
    
     *** Keywords ***
     Open Html
         Open Browser    http://localhost:8000/table.html   browser=chrome
         Maximize Browser Window
    
     Get Table Row Count
         Assign Id To Element    xpath=//table[@class="xtable"]    my_table
         ${rowCount}=    Get Matching Xpath Count       .//table[@id="my_table"]/tbody/tr
         shouldBeEqualAsIntegers     3    ${rowCount}
    
     Get Table Td text
         Assign Id To Element    xpath=//table[@class="xtable"]    my_table
         ${cellValue}=  Get Table Cell    my_table   2   2
         shouldBeEqual  19  ${cellValue}


Posted by 감각적신사
,

Robot framework + Seleium

  1. Robot framework

    • 테스트 자동화 프레임 워크
    • 프로젝트는 GitHub 에서 호스팅 하고 있음
    • 설치:
        $ pip install robotframework
      
    • 표 형식의 테스트 데이터 구문이 있으며 키워드 기반 테스팅 방식을 사용함

      • 문법 가이드
      • 샘플

        # cat test.robot
        *** Settings ***
        Library           Selenium2Library
        
        *** Test Cases ***
        Google Devops And Find Eficode
            Open Browser To Google
            Search My blog
            Result Should Contain mrsence
        
        *** Keywords ***
        Open Browser To Google
            Open Browser    https://www.google.com    browser=chrome
            Maximize Browser Window
            Google Should Be Open
        
        Search My blog
            Input Text    lst-ib    mrsence tistory
            Press Key    lst-ib    \\13
        
        Result Should Contain mrsence
            Wait Until Page Contains    mrsence.tistory.com    10 s
        
        Google Should Be Open
            Location Should Contain    www.google.com
        
  2. seleium
    • 브라우저를 자동화 하는 tool
    • 다양한 브라우저 자동화 도구, API 및 프레임 워크의 핵심 기능을 가짐
    • SeleniumLibrary
      • Selenium 을 내부적으로 사용하는 Robot Framework 용 웹 테스트 라이브러리


Posted by 감각적신사
,
  1. opencv 란,

    • 실시간 이미지 프로세싱에 중점을 둔 라이브러리
    • 주요 지원 항목: TensorFlow , Torch / PyTorch 및 Caffe 의 딥러닝 프레임워크
  2. opencv-python

    • 설치:
    pip install opencv-python
    
  3. opencv 를 활용한 이미지 처리

    • 이미지 속 원 의 갯수 구하기
    import cv2
    import numpy as np
    
    path = '/Users/mr.sense/images/sample/colony.jpg'
    
    # 이미지 로딩
    img = cv2.imread(path)
    mask = cv2.threshold(img[:, :, 0], 255, 255, cv2.THRESH_BINARY_INV +  cv2.THRESH_OTSU)[1]
    
    stats = cv2.connectedComponentsWithStats(mask, 8)[2]
    label_area = stats[1:, cv2.CC_STAT_AREA]
    
    min_area, max_area = 50, 350  # min/max for a single circle
    singular_mask = (min_area < label_area) & (label_area <= max_area)
    circle_area = np.mean(label_area[singular_mask])
    
    n_circles = int(np.sum(np.round(label_area / circle_area)))
    
    print('Total circles:', n_circles)
    


Posted by 감각적신사
,

Python multiprocess vs multithread

  1. python GIL (Global Interprinter Lock)

    • 참고
    • 하나의 파이썬 인터프리터에서는 하나의 작업만 실행한다
    • GIL 회피 방법
      • multiprocess 를 사용한다 == 하나의 interpreter 를 실행하여 여럿의 프로세서를 구동한다
      • 구현 단에서, I/O bound 한 부분과 CPU bound한 부분을 나누는 것
      • GIL이 없는 Jython 이나 IronPython을 이용
  2. python multiprocess example

    • multiprocessing 패키지 소개
    • 샘플 테스트 코드

      from multiprocessing import Pool
      from datetime import datetime
      import random
      import time
      
      read_file = open("/Users/mr.sense/Dev/python/test/readfile.txt", 'r') // read 10000 lines
      write_file = open("/Users/mr.sense/Dev/python/test/writefile_multiprocess.txt", 'a')
      
      lines = read_file.readlines()
      read_list = []
      return_list = []
      
      for line in lines:
        line = line.replace('\n','')
        read_list.append(line)
      read_file.close()
      
      # sleep method
      def append_file(msg):
        sleep_time = random.randrange(1,10)
        time.sleep(sleep_time)
        write_file.write(msg+', sleep: '+str(sleep_time)+'\n')
        return msg
      
      # initialize pool
      pool = Pool(processes=1000) # start 1000 worker processes
      
      start = datetime.now()
      print 'start: '+str(start)
      
      # get result process
      for i in pool.imap_unordered(append_file, read_list):
        return_list.append(i)
      
      end = datetime.now()
      print 'end: ' + str(end)
      
      # get time
      print end - start
      
  3. python multithread

    • concurrent 패키지 설치 및 활용
    • 샘플코드

      from datetime import datetime
      import concurrent.futures
      import random
      import time
      
      read_file = open("/Users/mr.sense/Dev/python/test/readfile.txt", 'r') // read 10000 lines
      write_file = open("/Users/mr.sense/Dev/python/test/writefile_multithread.txt", 'a')
      
      lines = read_file.readlines()
      read_list = []
      return_list = []
      
      for line in lines:
        line = line.replace('\n','')
        read_list.append(line)
      read_file.close()
      
      def append_file(msg):
        sleep_time = random.randrange(1,10)
        time.sleep(sleep_time)
        write_file.write(msg+', sleep: '+str(sleep_time)+'\n')
        return msg
      
      start = datetime.now()
      print 'start: '+str(start)
      
      with concurrent.futures.ThreadPoolExecutor(max_workers=1000) as exe:
        write_result = {exe.submit(append_file, line): line for line in read_list}
        for future in concurrent.futures.as_completed(write_result):
            line = write_result[future]
            try:
                data = future.result()
            except Exception as exp:
                print("%r generated an exception: %s" % (line, exp))
      
        end = datetime.now()
        print 'end: ' + str(end)
        print end - start


'개발 > python' 카테고리의 다른 글

Robot framework + Seleium -- (1)  (0) 2018.09.09
python - opencv 를 이용한 이미지 처리  (0) 2018.08.25
django mysql rest api project  (0) 2018.03.11
Django 프로젝트에서 batch job 돌리기  (0) 2018.01.23
Django 프로젝트  (0) 2017.11.29
Posted by 감각적신사
,