이 블로그 검색

레이블이 python인 게시물을 표시합니다. 모든 게시물 표시
레이블이 python인 게시물을 표시합니다. 모든 게시물 표시

2023년 12월 30일 토요일

vscode, jupyterlab 에서 vim 사용시 esc keymap 문제 해결

 ‘esc’를 눌러 insert mode 종료 시 현재 cell 밖으로 나가버리는 문제를 해결하기 위한 깨알 tip.

2023년 6월 18일 일요일

airflow ExternalTaskSensor 사용 시 고려해야 할것들

 지금 하고 있는 프로젝트에서 airflow ExternalTaskSensor 를 사용해서 다른 dag 에서 호출한것을 감지하는 부분이 있다. 이것을 사용할 때 몇가지 고려할 사항이 있었는데 한번 정리해 본다.

2022년 9월 2일 금요일

(python) docker container 에서 scipy, numpy 사용 시 thread 과다 생성 문제 (incorrect cpu count)

개발 중인 python 프로젝트에서 scipy 패키지 interpolate 를 사용하는 코드가 있는데, docker 기반 클라우드 환경에서 실행하니 먹통이 되고 멈추는 현상이 발생 했다. 하지만, 이 코드를 내 랩탑 에서 돌려보면, 정상 동작한다.

문제의 원인을 찾아보니, docker container 를 생성하면서 할당한 cpu 개수와 실제 머신의 전체 CPU 개수 불일치로 인한 문제였다. 이 현상에 대해 정리 해 본다.


  • docker container 기반에서 OpenBLAS, MLK 를 사용하는 numpy, scipy 등의 패키지 내부에서 과도한 thread 생성이 안되게 주의 해야 한다.
  • 비록 명시적으로 thread 를 사용하지 않았어도, numpy, scipy 내부적으로는 multi thread 가 생성 된다는 것을 알아둘 필요가 있다.
  • 코드가 동작하는 환경을 분석하고, 성능 문제가 있는 경우에만 시도한다


좀 더 자세히 알아보면, 

2022년 8월 21일 일요일

(pthon) pandas 처리 속도 개선에 대하여

지금 하고 있는 프로젝트에서 python pandas 와 numpy를 사용해서 데이터를 처리하는 부분이 있다.
그런데 기존에 있던 처리 속도가 느려서 이 부분을 검토하면서,
처리 속도를 높이기 위해 이것 저것 수정해서 테스트 하다 보니 알게 된 것들이 있어서 정리해 본다.


- 최선의 방식은 numpy ndarray vectorization 처리다.

- for loop를 이용해서 모든 데이터를 순회하는 방식은 피해야 한다. 
  (nested for loop 방식은 어떤 식 으로 든 개선의 여지가 있다)


그럼 위 내용에 대해서 상세히 확인 해 보도록 하자.
우선 기존 소스 분석을 통해서 로직을 심플 하게 추려서 만들어 보면 다음과 같았다.

2012년 9월 10일 월요일

python decorator


#!/usr/bin/env python
# -*- encoding:utf-8-*-
import time

def elapsed_time(functor):
    def decorated(*args, **kwargs):
        start = time.time()
        functor()
        end = time.time()
        print "Elapsed time: %f" % (end-start)
    return decorated
    
@elapsed_time
def hello():
    print 'hello'

# 위의 코드는 다음과 동일.
# def hello(*args, **kwargs):
#     print 'hello'
# 를 정의후 다음을 호출하는것과 같음,
# hello = elapsed_time(hello)
# hello()

if __name__ == "__main__":
    hello()
    # hello = elapsed_time(hello)
    # hello()

Python Flask 설치 (windows)


0. 당연히 python은 먼저 설치되어 있어야 함.

1. easy_install, pip 설치 : 이것들은 Python 패키지들을 설치하고 관리하기 위한 도구이다. 다음 순서대로 수행.

  - easy_install 설치
  http://python-distribute.org/distribute_setup.py 을 다운받아서 실행.

  - PC path에 C:\Python27\Scripts 를 추가.  

  - pip 설치 : easy_install pip

2. 이제 Flask를 설치 할수 있다. 다음을 실행. 
  
  pip install Flask


* 여기서 부터는 옵션.

  virtualenv : 서로 다른 버전의 파이선, 라이브러리들과 작업해야 하는 경우에 자신의 프로젝트만을 위한 파이선 개발 환경을 만들수 있다. 사용하고 싶다면 다음을 실행.
  
  pip install virtualenv
  (혹은 easy_install virtualenv 으로도 가능)

  그리고 프로젝트 폴더상에서 다음을 실행
  virtualenv venv

  이제 관련 폴더들이 생성되고, 해당 프로젝트를 위한 환경이 구성되었다.
  해당 환경을 활성화 시키기 위해 다음을 실행한다.

  venv\scripts\activate

  프롬프트가 (venv) 로 변경됨을 알아두자. 이상태에서, pip install Flask 을 수행해서 개발환경을 만들수 있다. 이경우,
  \venv\Lib\site-packages 에 관련 패키지가 설치된다(즉, 프로젝트별 환경이 구성됨).

2012년 8월 8일 수요일

Django 게시판 만들기 4 - 검색 기능 구현


이제 검색 기능만 구현하면 이 간단 게시판은 완성이다. 우리는 전체목록 출력을 위한 listSpecificPage.html 템플릿 작성시, 검색 버튼을 누르면 /searchWithSubject/ 로 이동하게 해 놓았다. 그러므로, 지금까지 해왔던 것처럼 url 맵핑 및 컨트롤러 구현을 실시한다.

- url 맵핑
urlpatterns = patterns('',
    url(r'^$', views.home),
    url(r'^show_write_form/$', views.show_write_form),
    url(r'^DoWriteBoard/$', views.DoWriteBoard),
    url(r'^listSpecificPageWork/$', views.listSpecificPageWork),
    url(r'^viewWork/$', views.viewWork),
    url(r'^listSearchedSpecificPageWork/$', views.listSearchedSpecificPageWork),
    url(r'^listSpecificPageWork_to_update/$', views.listSpecificPageWork_to_update),
    url(r'^updateBoard/$', views.updateBoard),
    url(r'^DeleteSpecificRow/$', views.DeleteSpecificRow),
    url(r'^searchWithSubject/$', views.searchWithSubject),
)

- 컨트롤러 작성
@csrf_exempt
def searchWithSubject(request):
    searchStr = request.POST['searchStr']
    print 'searchStr', searchStr

    url = '/listSearchedSpecificPageWork?searchStr=' + searchStr +'&pageForView=1'
    return HttpResponseRedirect(url)

컨트롤러는 이미 우리가 작성해 놓은 /listSearchedSpecificPageWork 로 redirection 만을 하고 있다. 이전 시간에 게시물 보기 기능을 구현하면서 목록으로 돌아가기 기능 구현시, 먼저 검색을 위한 컨트롤러를 작성해 놓은 것이 기억날 것이다. 원래 그것은 검색 기능 구현시에 작성이 되어야 했던 것 (즉 지금)인데, 먼저 작성을 했었다. 그때 작성해놓은 것을 지금 사용하는것이니 착오없기를 바란다. 이미 만들어 놓은것이 있기 때문에 검색 기능 구현은 이처럼 간단하게 끝난다.

지금까지 django를 이용한 간단 게시판 작성 예제를 만들어 보았다. 오로지 실제 돌아가는 게시판 속성 작성을 염두에 두고 글을 썼고, django를 이루는 상세 내용은 건너뛴 부분이 많기 때문에 지금까지의 내용만 가지고는 django를 상세히 알수 없을 것이다. 자세한 세부 사항은 공식 사이트 문서를 참조하시길 바라면서 나처럼 실질적인 예제를 찾고 계셨던 분들에게 조금이나마 도움이 되었으면 하는 바람이다.


이 예제의 전체 소스는 아래에서 받을 수 있다.
https://github.com/jeremyko/dj_board


참고
https://www.djangoproject.com/
http://www.djangobook.com/en/2.0/



2012년 8월 7일 화요일

Django 게시판 만들기 3 - 글 조회 및 수정, 삭제 기능 구현


목록에서 글 보기를 위한 url은 /viewWork 로 설정했고, GET방식으로 글 조회를 위한 정보를 전달하게 되어 있었다. 그럼 할일은 앞서와 마찬가지로 url 과 컨트롤러 맵핑이 되겠다. 먼저 컨트롤러 추가.

def viewWork(request):
    pk= request.GET['memo_id']
    boardData = DjangoBoard.objects.get(id=pk)

    
    # 조회수를 늘린다.    
    DjangoBoard.objects.filter(id=pk).update(hits = boardData.hits + 1)

    
    return render_to_response('viewMemo.html', {'memo_id': request.GET['memo_id'],
                                                'current_page':request.GET['current_page'],
                                                'searchStr': request.GET['searchStr'],
                                                'boardData': boardData } )

여기서는 테이블의 PK값인 id를 알고 있으므로, model의 DjangoBoard.objects.get(id=pk) 츨 호출해서 해당 데이터를 얻을수 있다. 그리고 구한 게시물 정보를 템플릿으로 넘겨주고 있다. url을 추가한다.

urlpatterns = patterns('',
    url(r'^$', views.home),
    url(r'^show_write_form/$', views.show_write_form),
    url(r'^DoWriteBoard/$', views.DoWriteBoard),
    url(r'^listSpecificPageWork/$', views.listSpecificPageWork),
    url(r'^viewWork/$', views.viewWork),
)

그 다음은? viewMemo.html 템플릿을 생성한다. 간단한 게시판이라서 그런지 정말 간단하다.^^
  <html>
  <head>
  <title>글보기</title>
  </head>

  <script language="javascript">
      function boardlist()
      {
          var s = "{{searchStr}}";

          if(s=="None")
              location.href = '/listSpecificPageWork?current_page={{current_page}}';
          else
              location.href = '/listSearchedSpecificPageWork?pageForView={{current_page}}&searchStr={{searchStr}}';
      }

      function boardmodify()
      {
          location.href='/listSpecificPageWork_to_update?memo_id={{memo_id}}&current_page={{current_page}}&searchStr={{searchStr}}';
      }

      function boarddelete()
      {
          location.href='/DeleteSpecificRow?memo_id={{memo_id}}&current_page={{current_page}}';
      }
  </script>
  <table cellspacing = 0 cellpadding = 5 border = 1 width=500>
      <tr><td><b>조회수</b></td><td> {{ boardData.hits }} </td></tr>
      <tr><td><b>이름 </b></td><td> {{ boardData.name }} </td></tr>
      <tr><td><b>이메일 </b></td><td> {{ boardData.mail }} </td></tr>
      <tr><td><b>제목 </b></td><td> {{ boardData.subject }} </td></tr>
      <tr><td><b>내용 </b></td><td width=350> {{ boardData.memo }} </td></tr>
  </table>

  <table  cellspacing = 0 cellpadding = 0 border = 0 width=500>
      <tr><td>
          <input type=button value="수정" OnClick="javascript:boardmodify()">
          <input type=button value="목록" OnClick="javascript:boardlist()">
          <input type=button value="삭제" OnClick="javascript:boarddelete()">
      </td></tr>
  </table>
  </html>

여기까지 작업한 결과, 글 목록에서 해당 게시물을 클릭하면 다음처럼 내용이 조회된다.

Django 게시판 만들기 2 - 글쓰기 기능 구현

글쓰기 기능 구현

이제 글쓰기 기능을 구현할 차례이다. 글쓰기 버튼을 클릭시에 /show_write_form 이 호출되므로, 이 url을 컨트롤러에 맵핑해서 글쓰기 기능을 구현하면 된다. 먼저 /sample_board/view.py파일에 글쓰기를 위한 컨트롤러를 추가한다.

def show_write_form(request):
    return render_to_response('writeBoard.html')

그리고 dj_board/urls.py 에 다음처럼 추가한다.

urlpatterns = patterns('',
    url(r'^$', views.home),
    url(r'^show_write_form/$', views.show_write_form),
)

요청을 받으면 글작성을 위한 템플릿만을 화면에 출력하는 부분이므로 간단하게 처리한다. 그럼 이제, writeBoard.html 템플릿을 작성해야 한다. templates 폴더에 writeBoard.html 를 다음처럼 생성한다. form을 이용한 간단한 작성화면이 되겠다.

Django 게시판 만들기 1 - 설치 및 설정


Python 을 이용한 웹 개발 프레임워크인 django를 이용해서, 간단한 게시판을 만들어 보자. 앞서 스프링을 이용해서 작성된 게시판 과 동일한 기능을 수행하는 간단한 게시판이다. 먼저 django 프레임워크를 설치해야 한다.

2019-05-06 : 이글은 2012년도 기준으로 설명된 글이라서 현재 최신 django 버전과 일치 안되는 부분이 많습니다. 공식 django 문서를 참고하시기 바랍니다. (시간나는데로 업데이트 해보려고는 하는데 기약이 없음).

1. django 프레임워크 설치

* python 설치 : 일단 python이 설치가 되어 있어야 한다.

* Django 설치
직접 다운로드 받아 압축을 풀어서 셋업을 수행해도 되고, Svc, Git 등을 이용해서 최신소스를 받아오는 방법도 있다.  나는 git을 사용하므로 다음처럼 적당한 위치의 폴더에서 clone을 생성하여 소스를 받았다.

git clone https://github.com/django/django.git

그다음, 받은 폴더에서 다음을 수행한다.

python setup.py install

만약 'ImportError: No module named setuptools' 에러를 만나면 다음을 실행한다.
sudo curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python

파이선에서 다음을 실행해서  django 가 제대로 설치되었는지 확인한다.
>>> import django
>>> print django.get_version()
혹은 
>>> print (django.get_version()) 
혹은 
>>> python -m django --version

3.0

버전을 출력하면 설치는 제대로 된것이다.

* 윈도우 환경에서는 환경변수 PATH 설정:
django가 설치되면 python 설치 폴더의 \Lib\site-packages 안에 django가 복사된다. 이 경로를 PATH에 추가한다.  python 설치 폴더\Lib\site-packages\django\bin; 를 추가. python을 처음 설치했다면, python bin 경로도 PATH에 추가하는것을 잊지말자.

2. 프로젝트 생성 및 설정

이제 환경 설정이 완료되었으니, 실제 게시판을 생성해보자. 프로젝트 생성을 원하는 위치에서 다음 명령을 수행한다.


django-admin startproject dj_board


django게시판이란 의미로 프로젝트명을 dj_board로 하였다. 다음처럼 디렉토리가 구성된다.

dj_board/
      manage.py
      dj_board/
          __init__.py
          settings.py
          urls.py
          wsgi.py

본격적인 개발에 앞서 간단한 테스트를 해보자, 생성한 프로젝트 폴더에서 django에 내장된 개발용 웹 서버를 실행한다.