요즘 바빠서 글을 잘 못 남기지만 정말 추천할 만한 포스트가 있어서 추천합니다. 간단한 파이썬 코드만 알면 요즘 유행하는 블록체인의 기본 원리를 알고 응용이 가능합니다. 쭈욱 따라하시면 됩니다. 


http://ecomunsing.com/build-your-own-blockchain



끝으로 요즘 여러 이야기가 있지만, 저는 블록체인을 흠잡을 이유가 없습니다. 분산 저장은 시대에 맞는 트렌드라고 봅니다. 다만 거래소가 안전하냐는 이야기는 절대 반대입니다. 돈이 오고 가는 서비스를 그리 허술하게 만들면 안된다고 봅니다. 



crontab 으로 스케쥴 잡 등록 시키기

python 과 crontab 을 잘 연결시키면 스케쥴 작업을 완벽하게 만들 수가 있습니다. 간단한 배치 작업들은 굳이 다른 시스템을 사용할 이유가 없습니다.

기본 editor 를 emacs 로 변경하기

$ export EDITOR=emacsclient

아무 설정을 하지 않으면 vi 로 설정되어 있습니다.

기본적인 기능

CRUD 에서 U 는 C 와 동일하니 기능을 살펴보기로 합니다.

입력 (Create)

$ crontab -e

보기 (Read)

$ crontab -l

지우기 (Delete)

$ crontab -d

주기 결정

*          *        *        *       *
분(0-59)  시간(0-23)  일(1-31)  월(1-12)   요일(0-7)

실제 예

* * * * * ls -la

인코딩 관련

crontab 으로 파이썬 스케쥴을 돌릴때 특히나 console 에 한글을 출력하는 경우에 에러가 자주 발생합니다. Unicode 에러 인데요. crontab 은 shell 환경을 가져오지 않기 때문에 발생합니다. 해결 방법은 의외로 간단합니다. crontab 에서 입력 할때 마치 쉘 환경 처럼 적어주면 끝입니다.

   PYTHONENCODING=utf-8
   LANG=ko_KR.UTF-8          
   0 * * * 1-5 source /Users/crazia/miniconda3/bin/activate /Users/crazia/miniconda3/envs/cr-mon/ && 
   /Users/crazia/miniconda3/envs/cr-mon/bin/python /Users/\
crazia/work/python-projects/cr_mon/manage.py stats >> /Users/crazia/work/stats.log 2>&1

miniconda 상에서 cr-mon 이라는 환경을 만들고 django style console 로 만들어서 실행시키고 로그를 남기는 예제 입니다.

systemd 와 연동해서 서비스를 구현하는 버릇을 들이다 보니 없으면 피곤하게 됐습니다. 그래서 python 과 uwsgi 와 systemd 를 연결해보자고 해서 시작했습니다.

1 Anaconda 설치하기

이거저거 써봤지만 저는 이게 제일 편한 virtualenv 관리자더군요.

$ wget https://repo.continuum.io/archive/Anaconda3-4.4.0-Linux-x86_64.sh
$ chmod +x Anaconda3-4.4.0-Linux-x86_64.sh
$ Anaconda3-4.4.0-Linux-x86_64.sh

다 설치하고 난 뒤 env 를 만들어 줍니다. app 정도 이름으로 합니다.

$ conda create -n app python=3.6
$ source activate app

2 uwsgi 용 스크립트 만들기

설명이 필요합니까? python 배포의 친구죠.

PROJECT_HOME = /home/[user-id]/[project-name] 이라고 하면 $PROJECT_HOME 에 app.ini 라고 만듭니다.

[user-id] 는 본인 아이디, [project-name] 은 파이선 프로젝트명입니다. 장고(django)를 가정합니다.

[uwsgi]
chdir=/home/[user-id]/[project-name]
module=[project-name].wsgi:application
socket=127.0.0.1:8900
buffer-size=65535
protocol=http
master=true
# daemonize=/home/[user-id]/uwsgi.log
pidfile=/home/[user-id]/uwsgi.pid
processes=1

이제 실행입니다.

$ cd $PROJECT_HOME
$ uwsgi app.ini

3 systemd 용 스크립트 만들기

  1. systemd 용 스크립트 만들기
    $ sudo emacs /lib/systemd/system/[project-name].service
    

    간단하게 프로젝트 이름으로 스크립트를 만들어줍니다. 내용은

    [Unit]
    Description=[project-name] appserver
    After=network.target
    
    [Service]
    User=[user-id]
    WorkingDirectory=/home/[user-id]/[project-name]
    Environment="MYSQL_HOST=127.0.0.1"
    Environment="MYSQL_NAME=[DB name]"
    Environment="MYSQL_USER=[DB user]"
    Environment="MYSQL_PWD=[DB password]"
    Environment="MYSQL_PORT=3306"
    Environment="REDIS_SERVER=127.0.0.1"
    Environment="LOG_LEVEL=DEBUG"
    Environment="IS_DEBUG=True"
    ExecStart=/bin/bash -c 'source /home/[user-id]/anaconda3/bin/activate \
    /home/[user-id]/anaconda3/envs/app/ \
    && /home/[user-id]/anaconda3/envs/app/bin/uwsgi \
    --ini /home/[user-id]/[project-name]/app.ini --die-on-term '
    KillSignal=SIGTERM
    Restart=on-failure
    Type=notify
    StandardError=syslog
    NotifyAccess=all
    
    [Install]
    WantedBy=multi-user.target
    

    Independent WEB 방식이라 환경 변수에 config 내용이 있으니 Environment 로 선언해줍니다. 각각에 자신의 정보를 채워넣으면 되고

    $ sudo systemctl daemon-reload
    $ sudo systemctl enable [project-name].service
    

    시작할때 자동으로 실행되게 등록하고

    $ sudo systemctl start aimserver.service
    $ sudo systemctl stop aimserver.service
    

    이제 시작하고 끄는것이 쉽게 가능해진다.

프로그래밍 언어는 python을 이용하고 웹 프레임워크는 Django 를 사용하고, 데이타베이스로는 MySQL 을 사용중인데 admin 사이트 구현중에

date_hierarchy = 'created_at'

이 구문 때문에

Database returned an invalid value in QuerySet.dates(). Are time zone definitions and pytz installed?

이런 에러가 발생한다.

해결을 위해서는 일단 pytz 를 설치해줘야 한다.

$ pip install pytz

그리고 우분투에 설치된 mysql 에 한하여 (docker 로 설치한 mysql 도 괜찮다, 테스트 해보니 osx 도 된다)

$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p  mysql

하고 데이타베이스를 재시작 하면 된다. docker 데이타베이스는 설정을 바꾸면 재시작이 안되니 조심해야 한다. 원격 데이타베이스에 관해서는 (Google App Engine 의 Cloud SQL 도 가능하다)

$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p  -h $REMOTE_SERVER mysql

클로져(Closure)에 대한 말들은 많다. 최근 핫하다고는 하지만 전산의 태동기부터 존재하던 문법이다. 1급 객체(First class Object)를 지원하는 언어는 자연스럽게 지원하지만 개념 자체를 이해 못하는 경우가 많다.

파이선과 연계해서 클로져(Closure)를 설명하는 좋은 설명이 있어서 소개하고자 한다.

Objects are data with methods attached, closures are functions with data attached.

객체는 메서드가 달라붙어 있는 데이타라면, 클로져는 데이타가 달라붙은 함수이다.

예제는

def make_counter():
  i = 0
  def counter(): # counter() is a closure
    nonlocal i
    i += 1
    return i
  return counter

c1 = make_counter()
c2 = make_counter()

print (c1(), c1(), c2(), c2())
# -> 1 2 1 2

위에서 보면 counter 라는 함수가 i 라는 데이타를 포함하고 있는 클로져(closure)다.

http://stackoverflow.com/questions/13857/can-you-explain-closures-as-they-relate-to-python

flake8 [2.5.4] 를 OSX El Capitan (10.11.3) 에 pip 이용해서 설치시 flake8 실행파일이 설치 안되는 문제가 있다.

https://pypi.python.org/pypi/flake8#downloads

에서 수동으로 다운로드 받고 압축 풀린 디렉토리로 이동후에

$ python setup.py install

해주면 pyenv 관련 실행 파일 디렉토리에 저장된다.

$ ln -s /Users/crazia/.pyenv/versions/3.4.3/bin/flake8 /usr/local/bin/flake8

해주면 제대로 동작하기 시작한다.

SQLite 관련 라이브러리가 컴파일이 안된다. 찾아봐도 자료가 쉽게 안나오는 걸 보면 El Capitan 의 문제로 생각된다.

컴파일을 방해하는 가장 큰 요소는 루트리스(Rootless) 라고 생각이 된다. 일단 그 기능을 끈다. 솔직히 개발자에게는 필요 없는 옵션이라고 생각된다. 저번에도 언급했지만 끄는 방법은

재부팅시에 Command + R 을 눌러서 복구모드로 들어가서 , Terminal 을 실행해서 다음과 같이 입력한다.

$ csrutil disable

그리고 다시 재 부팅 하고 나서 Terminal 을 실행하고 Xcode 가 설치되어 있다면 (안되어 있다면 설치하고)

$ xcode-select --install

하면 설치하라고 팝업창이 뜨고 설치해준다 하면 완성입니다. 여기까지 하고 나면 Python3.4 에서 sqlite3 가 포함되서 컴파일 됨

1 플라스크 (Flask) 소개

파이썬 에서 쓰이는 웹 프레임워크라고 하면 장고 를 떠올리기 쉽습니다. 그런데 실은 장고는 이제 덩치가 많이 커져서 예전만 못하다는 이야기가 많습니다. 그래서 정말 간단한 웹이나 모바일 앱 서버를 만들기에 적합한 웹프레임워크를 찾게 됐는데 그게 바로 플라스크 입니다.

소개만 하고 직접 가셔서 보시는게 빠를 것 같습니다. 정말 단순하고 빠르게 웹을 만들 수가 있습니다. 제가 지금까지 접해온 웹 프레임워크중에 가장 가볍게 빠를꺼라고 자부합니다. (express 안녕~)


http://flask-docs-kr.readthedocs.org/ko/latest/index.html


위에 가서 보시면 되고 한글화도 잘 되어 있습니다. 빠르게 시작하기(Quick Start)튜토리얼(Tutorial) 을 보며 기본 공부를 하고 나머지 확장을 공부하시면 편할 듯 합니다. 튜토리얼(Tutorial) 은 이런 계열에서는 유명한 블로그 만들기 입니다. 확장으로 볼마한 것은 역시 큰 어플리케이션을 만들때 필요한 것들인데 이것들 또한 패턴들(Patterns) 에서 소개가 되고 있습니다.

마지막으로 제일 중요한 'Hello World' 를 출력하는 예제만 보기로 하지요.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

뭐 경기 끝이죠? 7줄입니다. ㅎㅎ

Author: crazia

Created: 2014-12-12 Fri 12:57

+ Recent posts