반응형
반응형

SSH 서버 하나에 붙어서, 여러가지 명령을 처리해야 하는 경우 application 단에서는 SSH 서버에 인증을 한 후 RPC콜을 위해 요청 하나마다 세션을 하나씩 할당받아서 사용하게 되는데, Linux 머신의 sshd의 경우 MaxSession값이 Default값이 10으로 되어 있어서, 10개 이상 요청하려고하면 연결이 안된 것처럼 오동작을 할 때가 있다.

 

이런 경우 sshd_config 설정을 조금 건드려주면, 원활하게 처리가 가능하다.


아래 키워드를 sshd_config 설정 안에 포함을 시키면, 원하는 개수만큼 세션이 늘어나게 된다.

MaxSessions 200


위 내용을 추가하고, 서비스를 재시작 해주면 완료

$ service sshd restart       # 서비스 재시작 (환경에 따라 서비스명이 ssh일수도 있음)
$ /usr/sbin/sshd -T | grep -i maxsessions      # 적용된 내용 확인


반응형
,
반응형

3rd Party API를 jquery 단에서 여러번 호출해야 하는 일이 있는데, network latency 등 여러가지 이슈가 있기 때문에,

front단에서 한 번에 묶어서 보내고, back단에서 처리되게끔 하다보니, jquery 단에서 array형태로 묶어서,

back단(Spring)에서 List형태의 Model로 받아서 처리하니 깔끔하게 정리가 되어서, 이 방법에 대해 정리한다.


[Jquery]

var arr = [{"a":1, "b":2}, {"a":2, "b":4}];

$.ajax({
    url: 'url',
    , type: 'post'
    , dataType: 'json'   // 데이터 타입을 Json으로 변경
    , contentType: 'application/json'   // Content-Type을 Json으로 변경
    , data: JSON.stringify(arr)    // JSON String으로 전환하여 보낸다.
    , success: function(response) {
    }
});


위와 같이 전송을 하면, 서버에서는 javascript의 array를 Json Array로 인식을 하기 때문에, 

application/json 기반의 서비스라면, List Model로 매핑을 할 수가 있다. (Spring Boot가 기본 MessageConverter가 마침 Json이어서 이렇게 사용했다.)


[Spring Boot]

...
@Getter
@Setter
@ToString
public class Abc {
    Abc() { }

    private int a;
    private int b;
}

@PostMapping("url")
public void url(@RequestBody List abcs) {
    abcs.stream().forEach(abc -> {
        System.out.println(abc.toString());
    });
}
...


원하는 형태로 List로 잘 매핑이 된다.

반응형
,
반응형

리눅스 같은 경우는 pip3 install mysqlclient 키워드 하나로 종료되지만,

Windows의 경우 VisualStudio의 영향을 받는지, 이것저것 에러가 발생을 하기 때문에

mysqlclient을 직접 받아서 컴파일 하는 복잡한 과정을 거쳐야 한다.


하지만, 다행히도 누가 이미 컴파일을 해놓은 바이너리를 모아놓은 아래와 같은 사이트가 있다.

http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient


python과 os bit에 맞게 파일을 다운 받은 후 아래와 같이 설치를 하면 된다.

$ pip install 다운받은파일.whl


반응형
,
반응형

매번 VisualStudio를 몇시간씩 깔고 하는게 귀찮아서, 간단한 걸 찾아보던 중

Python에서도 지원하는 Form기반의 GUI 툴이 있었다.


일단 설치는 공식홈에서도 가능하긴하지만, QT Designer가 Windows에서는 잘 안되는 모양인 것 같으니,

아래 링크에서 설치하였다. (Python 3.4, 64bit OS 기준)

https://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.4.1/PyQt5-5.4.1-gpl-Py3.4-Qt5.4.1-x64.exe/download


설치하고 나면, 프로그램 목록에 아래와 같은 Qt Designer라는 GUI 구성을 편리하게 해주는 Tool이 덤으로 설치되어 나온다.


이것저것 편집을 하고나서 저장을 하려고 보면, .ui 파일만 하나 떨구게 되는데,

ui파일을 py파일로 변환을 해서 사용을 해야 한다.


변환방법은 아래와 같다.

Windows에서 기본 설치 기준으로 C:\Python34\Lib\site-packages\PyQt5 경로로 이동 후 아래 키워드 입력

$ python uic/pyuic.py -x ui파일명.ui -o 뽑아낼파일명.py


변환 과정에서 두 가지 예외 케이스가 있다.

1. PyQt5와 Python3.4의 OS bit 버전이 다르게 설치된 경우

  > 해결 : OS bit버전을 서로 맞춰서 재설치한다.


2. OS 자체에서 상대경로 참조를 못하는 경우

  > 해결 : pyuic.py 을 열어서 아래와 같이 절대경로로 바꿔준다. 

import sys
import optparse

from PyQt5 import QtCore
from PyQt5.uic.driver import Driver # 이 부분!

Version = "Python User Interface Compiler %s for Qt version %s" % (QtCore.PYQT_VERSION_STR, QtCore.QT_VERSION_STR)

if sys.hexversion >= 0x03000000:
    from PyQt5.uic.port_v3.invoke import invoke  # 이 부분!
else:
    from PyQt5.uic.port_v2.invoke import invoke  # 이 부분!


주석 달아놓은 세 군데 정도만 바꿔주면 정상적으로 .py 파일로 변환을 해준다.

본 포스팅에선 세팅이 목표이므로, 사용법은 다루지 않겠다.

반응형

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

[Python 2.x] UTF-8 인코딩 관련  (0) 2017.08.09
[Python] Python 3.x no module MysqlDB  (0) 2017.02.14
[Python] pyYaml을 이용한 yaml parsing  (0) 2017.02.10
[Python] asyncio  (0) 2017.02.10
[Python] paramiko for SSHClient  (0) 2017.02.10
,
반응형

Python으로 온갖 자동화를 하다보니, 이제 소스는 그대로 두고 설정파일만으로 뭔가를 해봐야겠다는 생각을 하던 중,

yaml이 Python과 호환성이 좋다는 얘기를 들었었기 때문에, parser가 있는지 찾아보던 중 pyYaml이라는 lib를 찾게 되었다.


설치 방법은 아래 링크로 대체하겠다.

http://pyyaml.org/wiki/PyYAMLDocumentation


사용방법은 아래 예제를 참고하면 된다.

# test.yaml
strs:
  - a
  - b
  - c


import yaml

doc = yaml.load(open('test.yaml', 'r'))
strs = doc['strs']

for s in strs:
    print(s)  # a, b, c
반응형

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

[Python] Python 3.x no module MysqlDB  (0) 2017.02.14
[PyQt5] GUI 개발을 위한 PyQt5 세팅  (0) 2017.02.14
[Python] asyncio  (0) 2017.02.10
[Python] paramiko for SSHClient  (0) 2017.02.10
[Python] requirements.txt  (0) 2017.01.31
,

[Python] asyncio

개발/Python 2017. 2. 10. 10:31
반응형

서버 한대에 SSH로 붙어서, 여러개의 원격 서버에 request를 해야 하는 일이 생겼는데,

SSH를 매번 붙여서 하기엔 SSH접속이 너무 느려서, async하게 처리하는 방법을 찾던 중,

coroutine이라는 비동기 처리를 할 수 있는 기능이 있다는 것을 알았다.


다만, python에서 제공하는 비동기 처리는 GIL (global interpreter lock)이라고 해서, lock이 존재하기 때문에 비동기 처리 같지 않은 비동기처리라고 많이 불리고 있었다. 


이런 문제점을 해결하기 위해 Python 3.4 버전이상부터 사용할 수 있는 asyncio(https://docs.python.org/3/library/asyncio.html)라는 lib가 있어서, 사용법에 대해 간단히 설명을 하고자 한다. (이 기능때문에 Python 2.7에서 3.4 이상 버전으로 갈아탈 준비를 하고 있다.)


일단 설치는 pip로 가능하다.

$ pip install asyncio


아래는 예제소스인데, 이 포스팅에서는 정말 간단한 기능만 다루기 때문에 (실제로도 간단한 기능만 사용했고;;),

상세한 정보 획득을 위해선 공식 홈을 참조하는 게 좋다. https://docs.python.org/3/library/asyncio.html

예제소스에서는 asyncio에서 사용하는 event_loop를 초기화해서, print찍는 부분을 async하게 동작하도록 해볼 생각이다.

import asyncio

@asyncio.coroutine
def print_string(str):
    print(str)

    # 아래와 같이 텀을 두지 않으면, 동시에 여러개의 Thread를 생성하면서 초기화하는 과정에서, 문제가 발생한다.
    yield from asyncio.sleep(0.1)

@asyncio.coroutine
def print_all():
    strs = ['a', 'b', 'c']

    # coroutine기반의 Task를 생성한다.
    fetches = [asyncio.Task(print_string(str)) for str in strs]  

    # asyncio에 Task들을 등록한다.
    yield from asyncio.gather(*fetches)

def main():
    # Event Loop를 초기화 한 후 coroutine으로 돌릴 메서드를 지정하여, 완료될때까지 loop한다.
    asyncio.get_event_loop().run_until_complete(print_all()) 

if __init__ == '__main__':
    main()


반응형
,
반응형

특정 서버에 SSH로 접속하여, 원격 커맨드를 날릴 일이 있어서 이것저것 찾아보던 중,

Python에서는 paramiko라는 lib를 많이 사용한다는 걸 알았다.


설치방법은 아래와 같이 pip로 원 커맨드로 가능함.

$ pip install paramiko


테스트했던 Python버전은 3.6이었지만, Python 2.x나 그 전 버전에서도 잘 동작하는 것으로 보인다.


아래는 예제소스다. 

ssh.connect부분은 각 Case에 맞춰서 하나만 사용하면 된다.

import paramiko

def main():
    ssh = paramiko.SSHClient()

    # HostKey 저장 여부를 결정하는 옵션인데, 왠만하면 그냥 넣어주자.
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())       

    # CASE 1: 인증 시 username과 password를 사용
    ssh.connect('서버 IP', username='인증 ID', password='패스워드')  

    # CASE 2: AWS의 EC2같은 경우 password를 key_filename로 바꾸어서 파일 명을 지정할 수 있다.
    ssh.connect('서버 IP', username='인증 ID', key_filename='Key파일 위치') 

    stdin, stdout, stderr = ssh.exec_command('커맨드 입력')    
    ssh.close()
    
if __name__ == '__main__':
    main()


반응형

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

[Python] pyYaml을 이용한 yaml parsing  (0) 2017.02.10
[Python] asyncio  (0) 2017.02.10
[Python] requirements.txt  (0) 2017.01.31
[SMTPlib] mail loops back to me (MX problem)  (0) 2016.12.27
[Python] file read / write  (0) 2016.11.09
,
반응형

python의 의존 라이브러리 관리를 위해 setup.py와 requirements.txt가 사용되는데,

여기서는 requirements.txt에 대해 포스팅한다.


python 프로젝트 내에 requirements.txt 파일이 들어 있다면,

아래 커맨드 하나 만으로 모든 의존성이 설치가 되게 된다.

$ pip install -r requirements.txt


requirements.txt를 일일히 수작업으로 구성해도 괜찮지만, pip freeze를 이용하면 현재 세팅된 시스템이 가지고 있는 의존성을 아래 키워드로 한 번에 뽑아낼 수가 있다.

$ pip freeze > requirements.txt


단, pip freeze의 경우, 현재 폴더 기준이 아닌 글로벌한 환경 기준으로 의존성을 뽑아내기 때문에,

여러개의 Python 프로젝트를 운용하는 경우 원치않는 결과가 나올수도 있다.


그런 경우, pigar(https://github.com/Damnever/pigar)를 이용하여, 특정 폴더 기준으로 의존성을 추출해 낼 수 있다.

pip 를 이용해서 pigar를 설치한 후, pigar 명령어 뒤에 argument로 폴더 경로를 입력해주면,

해당 폴더부터 의존성을 검색하여 requirements.txt 파일을 뽑아준다.

$ pip install pigar # install pigar
$ pigar



반응형

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

[Python] asyncio  (0) 2017.02.10
[Python] paramiko for SSHClient  (0) 2017.02.10
[SMTPlib] mail loops back to me (MX problem)  (0) 2016.12.27
[Python] file read / write  (0) 2016.11.09
[Python] multipart file upload  (0) 2016.11.09
,
반응형

environment 속성에다가 TZ라는 환경변수만 추가해주면 된다.

abc:
  environment:
    TZ: "Asia/Seoul"


반응형
,
반응형

docker-compose 같은경우 기준이 되는 image를 선택할 때, image라는 속성을 사용할 수도 있지만,

build라는 속성을 이용하여, Dockerfile을 지정해줄 수가 있다.


예) docker-compose.yml (image)

db:
  image: mysql/mysql-server:latest         # dockerhub에 있는 image를 가져오는 경우


예) docker-compose.yml (Dockerfile이 abcd/Dockerfile 경로에 있는 경우)

db:
  build: ./abcd


docker-compose가 아직 Dockerfile이 가지고 있는 기능 전체를 지원하진 않기 때문에,

디테일한 기능들도 컨트롤 하기 위해서는, build 속성을 많이 사용하는 것 같다.


다만, 이 방식의 경우 volume을 컨트롤하는 데 문제가 하나 있다.


docker-compose의 volumes 속성을 이용해서, 폴더 단위로 link를 걸었을 때는 문제가 없지만,

docker-compose가 build 속성에 명시되어 있는 Dockerfile을 참조하는 과정에서 Dockerfile에 ADD나 COPY 구문이 들어있는 경우에 문제가 발생한다.


문제가 되는 케이스는 아래와 같다. (Nginx webroot에 파일을 추가하는 경우)


1. docker-compose를 이용하여, 최초에 image, container를 생성한다. (정상적으로 파일 ADD, COPY가 이루어짐)


2. 수정사항이 발생하여 파일을 수정 및 추가하여, docker-compose를 통해 container를 재배포한다. (반영되지 않음)


3. docker-compose를 통해 생긴 image, container를 삭제하고, 재생성 후 다시 배포한다. (정상적으로 반영)


아마 docker image를 docker-compose가 자체적으로 caching하고 있어서 발생하는 문제가 아닐까한다.


이런 경우 아래 예시 처럼 docker-compose에 volumes 속성을 사용하여, 폴더째로 link 시켜버리는 게 편한 것 같다.

예) docker-compose.yml (volumes)

db:
  build: ./abcd
  volumes: ./nginx_files:/var/www/html


이런식으로 링크를 걸어두면 host 머신에 있는 nginx_files 경로에 어떤 파일을 넣고, 빼면 container 안에 있는 /var/www/html 에도 즉시 반영이 되게 되어,

파일 배포 시에 docker-compose build라던지 할 필요가 없어지게 된다.


단, .dockerignore파일을 이용하여 메타정보 등의 파일을 빼고 배포시키는 등의 기능은 아직 docker-compose에서는 미지원하는 것 같다.

적절하게 잘 섞어서 쓰면 좋을듯..

반응형
,
반응형