python datetime

app/python 2019.06.04 23:57

from datetime import datetime, timedelta
import pytz

# 현재 시간
now = datetime.now()
print(now)

# 시간 지정 생성
set_datetime = datetime.strptime('2019-12-31 00:00:00', '%Y-%m-%d %H:%M:%S')
print(set_datetime)

# 시간 더하기 뺴기
before = now - timedelta(hours=7)
after = now + timedelta(hours=7)
print(before, after)

# UTC time
dt = datetime.utcnow()
print(dt)

# iso8601
# Timezone을 설정
local_timezone = pytz.timezone('Asia/Seoul')
local_date = now.replace(tzinfo=pytz.utc).astimezone(local_timezone)
print(local_date)

# iso8601 밀리세컨드 제거
local_date = now.replace(tzinfo=pytz.utc).astimezone(local_timezone).replace(microsecond=0)
print(local_date)

# timezone
tz = local_date.tzinfo
print(tz)

# datetime to str
nowDatetime = now.strftime('%Y-%m-%d %H:%M:%S')
print(nowDatetime, type(nowDatetime))

# datetime to timestamp
timestamp = now.strftime('%s')
print(timestamp)

# timestamp to datetime
now_datetime = datetime.utcfromtimestamp(int(timestamp)).strftime('%Y-%m-%d %H:%M:%S')
print(now_datetime)


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

1. 싱글톤 : 객체 하나를 통한 이벤트 

                - 클래식싱글톤 : 상속을 해도 오직 상위객체의 데이터/함수만 사용가능

                - borg 싱글톤 : 상속을 해서 하위단의 데이터를 사용가능/함수만 상위단의 것을 사용

 

2. 팩토리 : 변수에 따른 객체를 리턴

                - 여러개의 공통된 클래스의 집합을 통해 하나의 클래스에서 변수를 통해 해당 클래스를 리턴 

                - 사용자는 상위단을 알 필요 없이 선택에 따라 객체를 받을수 있음

                                         - ex : Connect() ------> httpConnect()

                                                                   |

                                                                   ------->ftpConnect()

                                           - 사용자의 입력에 따라 http or ftp 객체를 리턴 

                    - 상위단에서는 하위단에서 구현되여야 할 함수를 선언(abstract)

 

3. 파사드 : 인터페이스를 통해 사용자의 편의성 제공 목적

                 - 사용자가 인터페이스를 통해 원하는 액션을 받을수 있도록 하나의 인터페이스로 여러개의 클래스를 집약시킴

                 - 팩토리와 다른점은 팩토리는 사용자의 선택에 따라 객체를 선택해서 받음, 파사드는 오직 하나의 동작만을 수행하지만 인터페이스를 통한 간소화가 목적

 

4. 프록시 : 다른 객체의 기능을 확장할때 사용 (중간에서 어떠한 행위를 할때 사용)

               - 보안상의 필요성을 위해 몇몇의 변수/함수만을 허락할때 

               - subject의 모든 호출 및 파라미터를 기록할때 

               - 값을 반환하기 전에 임시로 저장하기 위해 

               - 객체에 대한 참조를 세기 위해 

                - ex :                                       client --------------------->   proxy   ------------------->    subject(interface)

                                                                                                                      |                                                       ^

                                                                                                                     %                                                      |

                                                                                                                  realSubject--------------------------| 

                    - realSubject에 모든 구현이 되어 있지만 client는 proxy를 통해 사용

                   -  proxy에서 중간에서 수행할 기능 구현 

 

5. 옵저버 : 일대다 관계 ( 다수의 상태를 바꿔야 할때 )의 객체간 의존성을 낮출 때 

                - 모든 사용자들에게 알림요청

                - 특정 상태를 다수의 객체에 전달할때

'뇌세포덩어리"" > 리팩토링&객체지향' 카테고리의 다른 글

디자인패턴  (0) 2019.06.02
sonarQube 정적 코드 분석 (기초편)  (0) 2019.05.26

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

1. docker kitematic를 통한 sonarqube 다운로드 및 설치

 

2.  http://localhost:32768/about 로 접속 로그인  (아이디 /  패스워드  :  admin / admin )

 

3. create new project ( 이름은 아무거나 )

 

4. 토큰 생성 클릭

5. 언어와 실행할 os 선택 ( python // macos 선택 )

download를 클릭하여 sonar-scanner 실행 파일 다운로드

"soanr-scanner는 정적 분석 후 sonarqube에 전송하는 역활"

하단의 커맨드 부분을 copy 후 실행 하면 정적분석 시작!!

파라미터를 보면  "sonar.sources=. " 부분이 어떤 폴더를 실행할지를 결정하므로 

커맨드를 실행하는 해당 폴더의 파일들을 분석하게됨 (각자 알아서 폴더 경로를 넣어주면 됨  " . " 일 경우 현재 폴더를 의미)

 

6. 명령어 실행시 정적 분석을 시작  / 완료 후 클릭해 보면 분석 데이터를 볼수 있음

7. 버그와 중복 코드가 많은것을 볼수 있음......

 

8. 나의 경우 pytest를 통한 분석용페이지에서 중복 코드가 대부분 나왔다. 해당 폴더를 제외 시키자

 

9. 메뉴 Administration -> Analysis Scope -> Files -> Source File Exclusions 에 제외시키고 싶은 경로를 쓰면 된다. ( 특정 폴더의 모든 파일들을 제외 시킨다면 다음과 같이 쓴다. ex : 폴더명/*.* ) 

저장을 하고 5번에서의  sonar-scanner 명령어를 다시 실행하면 해당 폴더가 제외된 실행 결과를 볼수 있다. 

10. 해당 폴더가 제외된 결과 상황 ( *.py만 나왔다.. 중복 코드가 너무 많다.. )

 

11. 리포팅을 통해 버그와 중복을 제거하자. 끝! 

 

추가 부분 

12.  현재  pytest를 통해 테스트코드 작성과 커버리지를 하고 있었음.

pytest의 리포트 기능을 통해 sonarqube에 coverage와 test를 보여줄수 있음

먼저 pytest 실행시 두개의 옵션 추가 

$ pytest --cov-report=xml:coverage.xml --junitxml=./pytest-report.xml

--cov-report 는 커버리지 내용을 다음에 저장하라는 명령어. 

--junitxml 은 테스트 코드가 어디곳에 작성되어 돌아가는지 저장하는 명령어

해당 명령어를 돌리면 두개의 파일 coverage.xml / pytest-report.xml 이 생성 됩니다. 

 

13. sonar-sanner 실행시 옵션을 추가 합니다. 

sonar-scanner \
-Dsonar.projectKey=test_sonarqube \
-Dsonar.sources=. \
-Dsonar.host.url=http://localhost:32768 \
-Dsonar.login=80a2d40fd130938312a5a776c0e406f205ca9d5a \
-Dsonar.python.xunit.reportPath=./pytest-report.xml \
-Dsonar.python.coverage.reportPaths=./coverage.xml

unit과 coverage 파일의 경로를 추가 해주면 아래와 같이 리포팅된 값을  sonarqube에서 볼수 있습니다. 

coverage에 커버리지 %를 볼수 있게 되었습니다. 
어느 부분에서 테스트코드가 작성되지 않았는지 볼수 있습니다. 

 

진짜 끝!

'뇌세포덩어리"" > 리팩토링&객체지향' 카테고리의 다른 글

디자인패턴  (0) 2019.06.02
sonarQube 정적 코드 분석 (기초편)  (0) 2019.05.26

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

장담한다. 

기본 기능 이외의 기능을 찾는다면 웬만하면 쓰지 말자.

그냥 그 시간에 만드는게 더 빠르다. 

정말이다.

swagger에서 지원하는 기능을 이제야 만들고 있으므로 큰 기대 말고, 

기본 기능외는 찾지 말고 그냥 하나 만들어서 쓰는 게 당신에게 이익이다.

'web > Django_rest_framework' 카테고리의 다른 글

django에서 swagger로 한다면 drf_yasg 는 왠만하면....  (0) 2019.05.20
django REST_FRAMEWORK login  (0) 2019.01.11
9. href  (0) 2016.07.30
8 pagination  (0) 2016.07.29
7 search  (0) 2016.07.28
6 저장/수정시 유저 저장  (0) 2016.07.27

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

ec2에 jenkins 설치

https://docs.aws.amazon.com/ko_kr/aws-technical-content/latest/jenkins-on-aws/installation.html

git 설치

https://webisfree.com/2017-06-22/amazon-linux-yum에-git-설치하는-방법

python3설치

https://aws.amazon.com/ko/premiumsupport/knowledge-center/python-boto3-virtualenv/

slack 연동

https://dogbirdfoot.tistory.com/16

만일 slack연동 중 Client error : the token with the provided ID could not be found and no token was specified  에러가 난다면 

setting -> Global Slack Notifier Settings -> intergration Token Credential ID 에서 Add->*jenkins user*(사용자 이름) 클릭

 

kind -> Secret Text 선택

Secret : slack에서 발급한 Token

ID : 아무거나 써도 됨

 

이렇게 저장하면 됩니다!!!!!! 시바!!!! 

 

 

'쓰레기장""' 카테고리의 다른 글

jenkins 설치 및 연동  (0) 2019.05.14
우주라이크  (0) 2018.12.28
왜 윈도우의 파일이 맥에서 오면 한글이 깨지는가?  (0) 2018.12.09
jetbrains day  (0) 2018.11.23
dev day seoul  (0) 2018.11.07
sublime text sass Syntax Highlighting 설치  (0) 2016.06.11

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret


python 프로젝트를 할때마다 환경 설정이 다르기 때문에 (python 버전이나 설치 패키지들.) virtualenv 모듈을 통해 가상환경을 만들어 줘야 합니다. 

해당 포스팅은  pycharm에서의 virtualenv 셋팅에 대한 글입니다. 

(mac 환경에서 진행하였으며, python3.7 / pip3 를 기본으로 하였습니다.)


먼저 하단의 terminal를 실행 시켜 보면 로컬에 설치 되어 있던 모든 모듈/패키지가 작동하지 않습니다. 


$ echo $PATH

일반 터미널에서 해당 명령어를 실행하면 아래와 같이 설정이 잡힌것을 볼 수 있습니다. 


다시 pycharm의  터미널에서 실행하면 아래 환경설정만 나오는것을 볼수 있습니다. (/url/local/bin 이 빠진것을 확인할 수 있습니다.)

pycharm의 새 프로젝트 시작시 다른 PATH가 설정되어 명령어가 동작하지 않습니다. 먼저 PATH 를 잡아줍니다.


$ export PATH=$HOME/bin:/usr/local/bin:$PATH

위의 명령어를 pycharm의 터미널에서 실행 후 다시  echo $PATH로 확인해보면 local/bin 이 추가 되었음을 확인 할 수 있습니다.


이제 기존에 로컬에 설치 하였던 모듈과 패키지들을 불러올수 있습니다. pip3 가 작동하는지 확인합니다. 

(혹시 pip3가 설치가 되있지 않다면 $ sudo apt-get install python3-pip 를 실행하여 설치하시면 됩니다. )

$ pip3 -v

pip3의 버전이 확인 되었습니다. 이제 virtualenv를 통해 가상환경을 만들어 줍니다. 

pycharm의 터미널에서 아래의 명령어를 실행 합니다. 

$ python3 -m virtualenv venv

(혹시 virtualenv가 설치 되지 않았다면 $ pip3 install --upgrade virtualenv 를 실행하여 설치 합니다.)


완료가 되었다면 해당 프로젝트 내에 venv라는 폴더 생성과 함께 가상환경의 기본 모듈들이 들어가 있음을 확을 확인 할수 있습니다. 

이제 해당 가상 환경을 적용하기 위해 아래의 명령어를 실행합니다. 

$ source venv/bin/activate


터미널의 명령줄 앞에 (venv)라고 표기가 되면 정상적으로 적용이 된 것입니다. 

하지만!!!!  pycharm을 끝내면 해당 activate한 환경이 다시 풀려 있음을 확인할수 있습니다.

pycharm의 환경설정에서 해당 가상환경으로 셋팅을 추가해줘야 합니다. 

메뉴바 -> Pycharm -> Preferences -> Project -> Project Interpreter 로 이동합니다. 

해당 화면에서 오른쪽 상단의 설정 버튼을 눌러주면 add / show all 선택 화면이 나옵니다. show all 버튼을 눌러줍니다.


아래 화면과 같이 기존의 로컬 환경 설정이 나옵니다. (저의 경우 기존 추가한 환경 설정이 보입니다.)

아래의 + 버튼을 눌러줍니다. 


Add Python Interpreter 화면이 나옵니다. 

첫번째 virtualenv Environment 탭에서 Existing environment 를 선택해 줍니다. 

Interpreter는 현재 폴더에 추가한 venv폴더를 선택해 줍니다.(자동 선택 되어 있을겁니다.)

OK를 눌러줍니다. 


방급 추가한 가상환경을 선택하고  OK를 눌러줍니다. 


이제 Project Interpreter는 가상환경이 적용되어 설치된 모듈이 3가지 밖에 없는 깨끗한? 환경을 볼수 있습니다. 


터미널을 다시 켜면 앞에 (venv)가 적용되어 가상환경이 적용된것을 확인할수 있습니다. 



참고

https://intellij-support.jetbrains.com/hc/en-us/community/posts/208567485-Pycharm-terminal-is-missing-part-of-PATH


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

프로그램을 작성시 테스트를 통해 수많은 에러를 겪으며 프로그램을 작성한다.  

단위 테스트, 통합 테스트 등 수많은 테스트를 겪었으니 해당 프로그램은  에러가 없을까?

세상에 완벽한 프로그램이 없듯이 자의든 타의든 프로그램엔 에러가 있을 수 밖에 없다. 

에러 발견을 메신져 알림을 통해 바로 확인하게 할수도 있고, 디비에 해당 내역을 기록할수 도 있다. 

수많은 프로그램이 난무 하는 가운데 그중 하나인 sentry.io를 소개 한다. 


사용법이 간단하고(아마도??) 통합적으로 관리할수 있는 뷰가 있어서 sentry.io를 선택했다. 


먼저 회원가입을 하면 사용하는 언어/프레임워크를 선택한다. 

저의 경우 python을 선택했다.

sentry-sdk 라는 패키지 설치 및 해당 프로젝트에 해당 api key를 선언해 준다.

sentry.io로 에러 부분을 보내는 방법은 exception 부분으로 감싸져 있는 부분만 보내진다. (설치한 패키지가 exception이 발생하면 에러를 전송한다.)


파이썬엔 데코레이션이라는 아주 좋은 기능이 있으므로 logging을 데코레이션으로 한후 해당 데코레이션 함수에 try로 감싸서 해결했다.

import logging

import functools

logger = logging.getLogger()


def log_error(logger):
def decorated(f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
try:
return f(*args, **kwargs)
except Exception as e:
if logger:
logger.exception(e)
raise
return wrapped
return decorated

위와 같이 데코레이션을 선언후 함수 상단에 데코레이션을 선언해주면 된다.

@log_error(logger)
def solution(n):
pass .....


일부러 에러를 발생시켜 보면 (ret_arr의 max값은 100이다. 해당 배열은 참조없으므로 에러가 발생한다.) 실행시켜 보면


@log_error(logger)
def solution(n):
ret_arr = [x for x in range(1, n+1)]
ret_arr[999999999]

위와 같이 에러가 전송된것을 확인할수 있다. 


강제 메시지 전송 및 캡쳐는 다음의 링크를 참조 하자. 

https://docs.sentry.io/error-reporting/capturing/?platform=python


sentry.io는 개인 보다는 회사나 프로젝트 단위로 관리되어야 하며, 여러 사람이 과거에 어떤 에러가 발생했었고, 어떻게 해결 했는지를 관리 할수 있는 툴이다. ( 에러에 대한 기록 내역 서비스) 개발자 회의에서 에러에 대해 확인하고, 향후 개발해야 하는 방향을 정할수도 있으며,  효과적인 에러 관리를 통해 프로젝트의 관리 및 서비스 품질을 높힐 수 있을 것이다.



WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret


REST_FRAMEWORK에서 오른쪽 상단의 로그인을 통해 로그인을 해도 세션이 유지가 안되고, 

유저 객체가 AnonymousUser만 뜬다면


setting 의 REST_FRAMEWORK 속성에 auth관련 속성을 추가해 주면 된다.

REST_FRAMEWORK = {

    .......

    'DEFAULT_AUTHENTICATION_CLASSES': (

        'rest_framework.authentication.TokenAuthentication',

        'rest_framework.authentication.SessionAuthentication'

    )

}


'web > Django_rest_framework' 카테고리의 다른 글

django에서 swagger로 한다면 drf_yasg 는 왠만하면....  (0) 2019.05.20
django REST_FRAMEWORK login  (0) 2019.01.11
9. href  (0) 2016.07.30
8 pagination  (0) 2016.07.29
7 search  (0) 2016.07.28
6 저장/수정시 유저 저장  (0) 2016.07.27

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

nginx + uwsgi 연동

web/Django 2019.01.11 03:29


uwsgi 연동 에서 이어짐


nginx 설치 

$ sudo apt-get install nginx


nginx에 프로젝트 설정 파일 추가 

$ cd /etc/nginx/sites-available/

$ sudo vi django_project.conf

server {

    listen 80; # 수신 포트 설정

    server_name _; # 도메인 설정 ip로 할경우 언더바 _ 로 하면 됨 

    location / { 

        # 요청을 전달할 소켓 파일 지정 (해당 파일은 uwsgi.ini에서 socket로 지정했음)

        uwsgi_pass unix:///tmp/django_project.sock; 

        include uwsgi_params; # uwsgi 사용, 리눅스에서 소켓은 파일처럼 취급된다.

    }

}


/etc/nginx/sites-enabled/ 에도 같은 파일이 필요. 심볼릭 링크로 추가

$ ln -s /etc/nginx/sites-available/django_project.conf /etc/nginx/sites-enabled/


!! 아이피로 할경우 default의 파일과 충돌하여 작동하지 않습니다. 도메인이 아닌 ip로 할경우 default파일을 지워줘야 합니다. ( 도메인이면 지우지 않아도 됩니다.)

$ sudo rm /etc/nginx/sites-enabled/default

$ sudo rm /etc/nginx/sites-available/default



nginx 재시작

$ sudo service nginx start

'web > Django' 카테고리의 다른 글

nginx + uwsgi 연동  (0) 2019.01.11
uwsgi -- unavailable modifier requested: 0 --  (0) 2019.01.10
ubuntu uwsgi  (0) 2019.01.10
django middleware  (0) 2016.08.15
django-summernote 사용하기  (4) 2016.07.23
get 방식의 글자 256자 제한은 잘못된 상식  (2) 2016.05.24

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret


nginx + uwsgi 로 진행시 


-- unavailable modifier requested: 0 --

-- unavailable modifier requested: 0 --

-- unavailable modifier requested: 0 --



와 같이 접근이 안된다면 python3의 패키지나 옵션을 추가해 주시면 됩니다. 


1. uwsgi-plugin-python3 를 설치하고 다시 시작

$ sudo apt-get install uwsgi-plugin-python3


2. uwsgi 실행시  --plugin python3 옵션을 추가해서 시작

$ sudo uwsgi -i uwsgi.ini --plugin python3

'web > Django' 카테고리의 다른 글

nginx + uwsgi 연동  (0) 2019.01.11
uwsgi -- unavailable modifier requested: 0 --  (0) 2019.01.10
ubuntu uwsgi  (0) 2019.01.10
django middleware  (0) 2016.08.15
django-summernote 사용하기  (4) 2016.07.23
get 방식의 글자 256자 제한은 잘못된 상식  (2) 2016.05.24

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret