라벨이 python_lib인 게시물 표시

Python TDD 기능 테스트를 위한 macOS Selenium 웹 드라이버 세팅

웹 드라이버 세팅 코드 최신화 TDD를 복습할 겸, 개인 프로젝트에 기능 테스트를 위해 Selenium 웹 드라이버를 세팅했다. 각 라이브러리들이 업데이트 되고 macOS에서 실행하는만큼  이전 코드와는 호환이 되지 않아서 웹 드라이버 세팅 코드를 수정했다. TDD 관련 테스트 서적과 비교해서 웹 드라이버 세팅 코드가 다른 경우 참고.  작업 환경 2024-11-24 Apple M2, macOS 14.2.1 geckodriver 0.35.0  Firefox 32.0.2 (aarch64) 세팅법 firefox 설치 brew install geckodriver ( brew 없으면 brew 설치 ) 코드 service = webdriver.FirefoxService({geckodriver 설치 위치}, port=4444) # 기본 port=4444 browser = webdriver.Firefox(service=service) geckodriver설치 위치 mac의 경우 ~/Downloads/bin/dev/webdriver/ 에 위치

Socket.IO 2 : python-socketio 서버 배포와 비동기 옵션 eventlet, node.js 서버에서의 호출

서버 개발이 나의 주된 업무이므로, 서버단 socket.io 설정 위주로 설명함. socket.io 클라이언트- socket.io 서버 구성 프론트엔드 코드가 무사히 사용자 브라우저에 전달되고 사용자의 브라우저가 호환된다면 js기반의 socket.io로 통신할 준비를 마치게된다. 여기서 서버측은 python-socketio의 패키지를 사용한다 가정. socket.io 프론트엔드 서버 - 백엔드 서버 구성 이번에는 node.js 서버가 django 백엔드 서버를 호출하고, django는 동기식 rest api를 사용한다 가정하자. 전체구조를 살펴보면 다음과 같다. [ Client ] <-Socket.IO-> [ Node.js Server ] <-HTTP-> [ Django REST API ] <-ORM-> [ Database ] client - node.js 사이에 활성화돼있는 연결이  django rest api를 호출한 후 응답을 받기까지는 동기식으로 처리된다. 때문에 django rest api - database 라인의 최적화 처리가 되어있지 않으면 node.js 서버가 응답받는 시간이 늘어나고 client 또한 응답을 늦게 받을 수 있다. 어느 서버에 탑재할 것인가? WSGI, ASGI 서버 비동기 통신에 기반하기 때문에 socket.io가 어느 서버 환경에서 실행되는 지 중요하다. 따라서 socket.io 서버 객체를 만들 때 - async_mode - cors_allowed_origins - logger 의 옵션 중에 async_mode에 비동기 처리 설정을 해주어야한다. WSGI 서버 -> Client - Server ASGI 서버 -> AsyncClient - AsyncServer gunicorn과 같은 WSGI 서버에서 python-socketio 사용을 위해서는 python2, 3에서 coroutine을 사용한 동시성 네트워킹을 지원하는 eventlet 라이브러리가 설치돼있어야한다. 설치시 g...

Pandas dataframe의 정렬

Dataframe의 정렬 소스코드   https://github.com/pandas-dev/pandas/blob/v2.2.3/pandas/core/frame.py#L6997-L7232 https://github.com/pandas-dev/pandas/blob/v2.2.3/pandas/core/arraylike.py 계산과 관련된 function은 pandas/core/arraylike의 OpsMixin에 있다.     Series     Index     ExtensionArray 와 같은 array-like class 사이에서 공유 가능. SortKind sortkind로 어떤 정렬 방법을 쓸지 지정한다. DataFrame sort는 기본적으로 quick sort를 사용한다. Dataframe.sort_index() 현재 설정된 인덱스를 기준으로 정렬한다. 퀵 정렬 내림차순, 오름차순 설정 Dataframe.sort_values() 어떤 열을 기준으로 정렬할 것인지 선택할 수 있다. 퀵 정렬 내림차순, 오름차순 설정

Pandas dataframe 객체끼리 == 연산자를 사용할 때의 동작

Pandas DataFrame.rename 메서드 실습을 진행하다가 DataFrame.rename 메서드에서 inplace 옵션을 True로 설정하지 않으면 새 df 객체를 반환한다는 것을 알게되었다. 확인을 위해 원본 dataframe과 inplace=False로 행,및 열을 교체한 dataframe을  == 연산자로 비교해보았다. 파이썬 기본 객체처럼 True나 False가 반환될 줄 알았지만 반환되는 것은 boolean 객체가 아니라 True, False를 원소로 가지고 있는 2차원 배열이었다. id()를 통해 dataframe 자체는 다른 객체임을 확인했지만 ==, eq 연산자가 예상한대로 작동하지 않아서  pandas의 DataFrame class에 대해 조금 파보았다. pandas DataFrame 에서의 __eq__ https://github.com/pandas-dev/pandas/blob/main/pandas/core/frame.py#L7840 https://github.com/pandas-dev/pandas/blob/main/pandas/core/internals/ops.py def _flex_cmp_method(self, other, op, *, axis: Axis = "columns", level=None): axis = self._get_axis_number(axis) if axis is not None else 1 self, other = self._align_for_op(other, axis, flex=True, level=level) new_data = self._dispatch_frame_op(other, op, axis=axis) return self._construct_result(new_data) @Appender(ops.make_flex_doc("eq", "dataframe")) de...

Pandas 기초 데이터형과 조작법

실습 코드 자료는 좌측 상단의 Repository를 참고 Pandas python기반 오픈소스 데이터 분석 라이브러리. numpy object를 내부적으로 활용하고있다. Series 열 벡터로 이루어진 데이터형. 데이터 주소값인 index, 데이터 값인 value의 쌍으로 이루어져있다. index는 정수형 위치 index와 이름 index(label index)가 있고 이 값들로 데이터나 Slicing된 데이터 범위에 접근할 수 있다. (Series의 Index는 RangeIndex객체로 표현된다.) numpy 1.26.4 pandas 2.2.2에서 정수형 위치 index로 접근할 경우  FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior).To access a value by position, use `ser.iloc[pos]` 의 Future warning이 뜬다. 정수형 인덱스로 접근을 할 때는 iloc 을 이용하도록 명시되어있다. python의 dict, tuple을 Series로 변환할 수 있다. dict는 key,value쌍이기 때문에 그대로 변환되지만 tuple은 인덱스가 없는 값들이기 때문에 Series로 변환 시 index를 지정해주어야한다. Dataframe 2차원 배열. 열의 모음이며, 시리즈의 모음이라고 할 수 있다. 열벡터의 모음이기 때문에 2차원 벡터이다. 딕셔너리의  key -> 열 이름 = 시리즈 이름 = 데이터프레임의 열 이름 value -> 행 값의 리스트 로 변환되어 데이터 프레임을 구성한다. python의 딕셔너리와 이중 리스트를 DataFrame으로 변환할 수 있다. 2차원 배열 형태이기 때문에 Series와 달리  딕셔너리...

Python SMTP + Application

소스코드 SMTP_SERVER = '' SMTP_ID = '' SMTP_PW = '' SMTP_SSL = True SMTP_PORT = 587 FROM_NAME = "" FROM_EMAIL = "" TO_EMAIL = "" import smtplib import datetime from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart def set_smtp_session(): try: # SMTP session smtp = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) smtp.set_debuglevel(True) # SMTP authentication smtp.ehlo() smtp.starttls() # TLS 사용시 호출 smtp.login(SMTP_ID, SMTP_PW) # 로그인 except Exception as e: print(f"smtp session error : {e}") return smtp def send_email(_session, sender, receiver): try: msg = MIMEText("test code") msg['Subject'] = "Verification email" msg['From'] = sender msg['To'] = receiver _session.sendmail(sender, receiver, msg.as_string()) except Exception as e...

Python math 라이브러리, 제곱근

이미지
코딩 테스트 문제를 풀다가 python math 라이브러리의 trunc()를 쓸 일이 생겼다. math 라이브러리의 trunc()와 floor() 모두 인자로 받은 값의 소숫점을 버리는 역할을 한다. floor()는 더 낮은 수로 소숫점을 버리지만, trunc()는 그냥 소숫점 첫째자리부터 끝까지 지워버린다. 오래전에 C로 이런 로직을 과제로서 구현했던 기억이 나지만  Python 상에서는 어떻게 구현이 되어을지 궁금해서 인터넷 검색을 해 보았다. "Python의 math라이브러리의 소스 코드를 열람할 수 있는지." Python은 C의 math함수를 사용한다고 한다. Cpython 구현체의 경우 C의 표준 라이브러리 ( C99 ) Jpython 구현체의 경우 Java의 math 라이브러리를 사용한다. Python의 math는 C 함수의 wrapper이다. 위에서 말한 Python math 라이브러리의 함수들은 표준과도 관련이 있는데, IEEE 754와 관련있다. IEEE 754는 IEEE에서 개발한 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 표준이다. 제곱근을 구하는 함수를 호출했다고 가정하면 바로 C library로 참조하는 것이 아니라, 제곱근을 구하는 데에 특화된 연산을 하는 이진형태의 파일을 이용한다. 이는 OS안에 배포되어 있으며 많은 마이크로프로세서가 연산에 특화된 명령어를 사용한다고 한다. 컴파일러 또한 기계어로 변환할 때 이를 이용한다고 한다. 사용자의 머신에서 어떤 C 표준 라이브러리의 알고리즘이 쓰일지는 알 수 없지만 쓰일 가능성이 높은 알고리즘들은 다음과 같다고 한다.  https://mathworld.wolfram.com/SquareRootAlgorithms.html https://en.wikipedia.org/wiki/Methods_of_computing_square_roots 컴퓨터로 제곱근을 구하는 알고리즘도 방식이 다양하다는 것을 알 수 있다. 파이썬은 스레드 성능을 유지하기 위하여 동시에 하나의 스레드만 ...

이 블로그의 인기 게시물

실무진 면접 경험으로 정리하는 백엔드 (1) : 에듀 테크 기업 면접

노마드코더 개발자북클럽 Clean code 완주, 독후감

Blogger 커스터마이징 : CSS 수정 (sticky-header)