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 로 만들어서 실행시키고 로그를 남기는 예제 입니다.

일정 때문에 끝까지 듣지는 못했지만 공유할 만한 사항이라 생각해서 정리합니다.

핀테크 업체들중에서 흔히 잘 나간다고 인식되는 업체에서 발표자가 나와서 마인드셋, 사고방식 어떻게 해야 빠르게 만들어 낼 수 있는지에 관해서 설명했습니다. UX 에 관한 발표라고 알고 있었지만 실제로 들어보면 벤쳐 정신에 대한 강의에 더 가깝더군요. (적어도 토스 디자이너 분은 그랬습니다.)

토스 디자이너


  • 돈 떨어지기 전에 시장에서 통하는 제품을 빠르게 만들자.
     스타트업은 돈이 떨어지면 그냥 끝이기 때문에 길게 생각하면서 만들 여유가 없다고 합니다. 빠르게 자주 만들면서 목표에 다가가는지 항상 체크하면서 개발하자. (본인 생각으로는 린 스타트업 정신과 일맥상통합니다)
  • 빠른 실행을 위한 마인드셋 
    '그거 안 넣으면 망해? 망하면 그거 때문이야?' 정말 처절하게 핵심만 남기기 위한 사고방식이라고 생각합니다. 의사결정자들을 거치면 거칠수록 늘어나는 기능 때문에 일정이 계속 늘어나는 경우 때문에 만들어 진 사고방식이라고 봅니다.
  • 가혹하게 줄여야 MVP (Minimum viable product) 다.
     '토스 초기에는 이체를 신청하면 대표가 공인 인증서로 송금을 했다.' 라는 식의 처절한 MVP 를 말한다. 실제 이랬는지…
  • 제품 개발의 목표는 '완성'이 아니라 '가설 검증'이다. 
    스프린트의 목표를 '이러면 이러할 것이다' 라는 가설을 세우고 그것을 검증하기 위해서 일정 계획을 세워야 한다는 것이다.
  • 데이타 수집과 분석은 절대 타협하지 않습니다. 
    다른 모든 것을 희생하더라도 데이타 수집과 분석은 상당한 공을 들여야 합니다.
  • 퍼널 리포트 (Funnel reports)를 만들어야 한다. 
    토스는 이메일 인증때문에 수 많은 사람들이 빠져나갔다는 것을 데이타 기반으로 알아냄, 퍼널 분석만으로 충분하다. (깔때기 분석)


내가 있는 곳이 구글 캠퍼스인 관계로 (구글 안다님 ㅋㅋ) 구글 관련 세미나를 종종 들을 때가 있다. 2년전부터 운영하는 광고 플랫폼에 관한 세미나라서 들어봄. 그래서 정리함 

뭔가 새로운 것을 들으면 정리해보는 습관을 들여야 나중에 편하다는 것을 깨달아서


구글 UAC 앱 마케팅 오피스아워

UAC 란?

Universal App Campaign , 구글의 통합형 광고 지원시스템이라고 볼 수 있다.

기존의 광고 체계

  • 플레이스토어내의 광고
  • 구글 검색내의 광고
  • 앱 내부의 광고
  • 쥐메일(Gmail) 의 광고
  • 유튜브의 광고

UAC 광고 플랫폼

전반적으로 페북의 광고 플랫폼을 많이 카피했다는 생각을 지울 수 없다. 아니면 통합 광고 플랫폼이 보통 저런 형식이던지.

  • 광고 소재
  • 타겟 지역
  • KPI
  • 입찰 단가
  • 예산

UAC 의 특징?

  • 유니버셜 앱 캠페인 + 머신러닝이 포함 된 형태 사람이 한 행동을 분석해서 그 사람과 비슷한 사람을 찾아서 정보를 기반으로 하여 광고 캠페인은 진행함 일반적인 알고리즘이긴 하다. 대표적인 추천 알고리즘
  • 2년전에 런칭, 알게된 클라이언트들이 모두 사용하고 있다고 한다. (확인할 길은 없다)
  • 이제 UAC 만 사용할 수 있다. 다른 개별 개별의 인벤토리(쥐메일이나 유튜브 등을 이리 말하는 것 같다)용 광고는 사용 못함
  • 통합형 광고이지만 개별 개별의 인벤토리 광고 단가보다 싸다. 최대 60% 까지 쌈 (1/3 가격)
  • 기존 캠페인의 생성은 10/15 까지 가능이고, 지금 운영되는 모든 단독 캠페인은 11/14 까지만 운영 가능하다. 이제 UAC 만 가능하다.

UAC 의 종류

UAC 인스톨

  • 가격이 싸다.
  • 충성도가 높지 않은 대량의 사용자를 유입시키고 싶을때 쓰는 옵션

UAC 액션

  • 사용자의 행동 행동을 분석해서 알맞은 광고를 진행
  • 가격이 비쌈
  • 대신 광고 대상 사용자의 리텐션이 높고, 퀄리티 (진행자의 표현)가 높다.

UAC 인스톨 어드밴스

  • UAC 인스톨과 UAC 액션의 중간 포지션
  • 가격도 중간 사용자의 리텐션과 퀄리티도 중간

UAC 밸류

  • 아직 런칭 전이다.

UAC 의 유의점

테스트가 좀 까다롭다. 최적화를 위해서는 사용자들도 '노력'을 많이 해야 하고, 구글의 베스트 프랙티스를 꼭 따라줘야 한다. (강하게 권고함)

사용자가 해야 할일

  • 본인들의 앱 환경을 데이타 기반으로 이해하는게 중요함.
  • 이를 위해서 분석툴 설치가 필수
  • 3rd 파티툴인 애드브릭스 (무료), 코차바(유료) 추천
  • 자사(구글)의 파이어베이스 추천 , 구글 어날리틱스는 웹에 특화되어 있다고 함
  • 결론적으로 파이어베이스 추천하는 것임


일단

http://crazia.org

입니다. 별거 아니지만 누르고 들어가면 https://crazia.org 로 바뀝니다. 정말 너무 일반적인 형태의 웹사이트로 보이지만 나름 최신 기술들로 잘 버무려져 있습니다. http2 도 지원함 ㅋㅋ

1 AWS 의 Certificate Manager 를 이용해서 SSL 인증서를 발급 받았습니다.

  • 혁신적이죠. 기존에는 항상 싼 SSL 인증서를 사서 사용했는데, 여기는 클릭 몇번으로 공짜로 인증서를 받을 수 있습니다.

2 AWS 의 ELB (Elastic LoadBalancer) 를 사용하고 ELB 에 인증서를 포함시켰습니다.

  • 기존에는 NginX 에 인증서를 포함시키는 방법을 썼는데 이제는 이렇게 하는게 편하더군요. 알아서 갱신까지 해줘서 설정만 해주면 문제 없습니다.

3 Nginx 를 사용했습니다.

  • 웹서버는 Nginx 죠!! 아파치는 이제 설정하는 법도 까먹었네요 ㅎㅎ
  • SSL 인증서가 ELB 에 있기 때문에 기존에 SSL 인증서 가진 웹서버 세팅으로는 TOO_MANY_REDIRECT 가 발생할 수가 있습니다.
    server{
       listen 80;
    
       server_name crazia.org;
    
       access_log /var/log/portfolio_access.log;
       error_log /var/log/portfolio_error.log;
    
       if ($http_x_forwarded_proto != 'https') {
         rewrite ^ https://$host$request_uri? permanent;
       }
    
       server_tokens off;
       location / {
             proxy_pass http://localhost:3000/;
             proxy_set_header Host $http_host;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto $scheme;
             proxy_redirect  off;
     }
    
      gzip on;
      gzip_disable "msie6";
    
      gzip_vary on;
      gzip_proxied any;
      gzip_comp_level 6;
      gzip_buffers 16 8k;
      gzip_http_version 1.1;
      gzip_types text/plain text/css application/json \
        application/x-javascript text/xml application/xml \ 
        application/xml+rss text/javascript
    }
    

    이렇게 80 포트만 신경 써주면 됩니다.

4 clojure 를 사용했습니다.

  • 무지하게 마이너 언어지만 제가 사랑하는 언어입니다.
  • 리습의 방언(dialect) 이고 JVM 기반의 프로그래밍 언어입니다.

5 Luminus 를 사용했습니다.

  • clojure 의 웹프레임워크중의 하나입니다. 그나마 자동화가 많이 되어 있고, 프레임워크 구조 설계가 좋아서 종종 애용하고는 합니다.

6 Jetty 임베디드 방식입니다.

  • WAR 를 만들고 앱엔진에 배포하는 방식이 아니라 Jetty 를 임베디드 시켜서 jar 파일 한개로 앱엔진 + WAS 의 기능을 하게 만들어 주는 것입니다.
  • 일반 스크립트 형 WAS 랑 차이가 뭔가? 바로 그 방식과 유사한 것입니다.

7 Bootstrap 을 이용해서 간단한 화면을 구성했습니다.

  • 말이 필요 없는 그 부트스트랩 입니다.
  • HTML, CSS, JS 를 한꺼번에 알맞게 제공해주죠. 저 같은 디자인 고자(?) 도 대충 이쁜 사이트를 구성하는게 가능해집니다.

8 Systemd 를 이용해서 관리합니다.

  • Ubuntu 16.04 부터 자주 이용해야 하는 관리 스크립트입니다.
  • /lib/systemd/system/myapp.service 위치에 스크립트를 만들고
    [Unit]
    Description=My Application
    After=network.target
    
    [Service]
    WorkingDirectory=/var/myapp
    EnvironmentFile=-/var/myapp/env
    Environment="DATABASE_URL=jdbc:postgresql://localhost/app?user=app_user&password=secret"
    ExecStart=/usr/bin/java -jar /var/myapp/myapp.jar
    User=deploy
    
    [Install]
    WantedBy=multi-user.target
    

    이와 같이 만들어주고 저장하고

    sudo systemctl daemon-reload
    sudo systemctl start myapp.service
    

    스크립트를 인식시키고 시작하면 됩니다. start|stop|restart 가 될 것이고요.

    sudo systemctl enable myapp.service
    

    인스턴스가 재부팅시에 자동으로 시작되게 세팅도 가능합니다. (멋진 기능!!)

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
    

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

이번에 스칼라로 프로젝트를 진행하게 되서 급하게 공부하게 되었습니다. 도움이 되는 사이트 2종을 소개합니다. 



자바프로그래머를 위한 스칼라 튜토리얼


쉽게 스칼라의 기본중의 기본만 알게 해주는 훌륭한 페이지 입니다. 


스칼라 학교 


기초부터 중급까지 간단한 사이트까지 만들 수 있게 도와주는 사이트 입니다. 귀찮은 자바랑 같이 프로젝트 만드는 방법등 유용합니다. 추천 !



스칼라로 진행해본 결과는 스칼라로 사이트 만드는 건 좀.. 공부하는 건 모르는데 상용 사이트는 좀 에러가 있군요. 

가상환경에서는 Matplotlib 이 제대로 동작하지 않기 때문에 OSX 환경에서 사용하는 팁이 존재한다. 


The default python provided in (Ana)Conda is not a framework build. However, the Conda developers have made it easy to install a framework build in both the main environment and in Conda envs. To use this install python.app conda install python.app and use pythonw rather than python


위와 같이 이용한다. 즉 python.app 을 conda 를 이용해서 설치하고 pythonw 이용해서 실행시키면 된다. 




  호러형 미션 임파서블 느낌으로 초중반 시작합니다. 탐형 영화 답게 스토리 진행이 아주 빠릅니다. 후반부 가면서 맥이 좀 풀리는 느낌입니다. 혹자는 다음 편하고 연계때문에 그렇다고 하는데 반지의 제왕 1편급 마무리는 아니지만 충분히 마무리가 덜 된 느낌입니다. 


  다음은 제가 영화에서 느낀 것입니다. 


  1. 호러풍 영화의 여주인공은 보통 엄청난 미녀가 나오는게 일반적이라고 합니다. 호불호가 꽤 갈릴 듯한 외모입니다. (이쪽 저쪽 둘다)

  2. 톰형 나이든게 팍팍 티가 납니다. 그럼에도 불구하고 몸은 진짜 열심히 관리 했더군요. 

  3. 대형 배우를 써서 돈이 없었다고 하던 소리를 들었습니다.미이라가 몸에 걸치고 다니는 붕대는 CG 가 아니라 타이즈 더군요. 어찌나 어색하던지..

  4. 지킬박사와 하이드가 나온다고 해서 살짝 다크 유니버스판 헐크를 기대했는데 옷도 안 찢어지는 얌전한 버젼(?) 이더군요

  5. 요즘 영화답게 마무리 액션씬이 영.. '쾅쾅 쪽' 입니다. 

  6. 마지막 클라이막스에 톰형이 하는 행동의 의미를 어떻게 알았는지 궁금합니다. 우디르급 태세전환이라 좀 당황함


  걍 톰형 영화라 가만히 있으면 시간이 잘 가는 효과는 확실합니다. 


  개인 토마토 지수는 66 입니다. 

  

  EDITED: 

   로튼 토마토 지수는 20 이군요 -ㅅ- 



  영화를 볼 때 참조하는 사이트가 있습니다. 로튼 토마토 입니다. 




  최근 영화 볼 때 이 사이트 참조하면 실패가 없었습니다. 이 사이트에서 원더우먼은 무려 94% 입니다. '훌륭하다!! 드디어 디씨가 정신을 차렸구나.' 그래서 보러 갔습니다. 

  애매한 수치입니다. 볼만한 영화 이긴 하지만 94% 까지 되는 건 좀 무리 같습니다. 다크 나이트 이후 쓰레기 같던 디씨 의 영화중에서 그나마 괜찮은게 나와서 반사 이익을 누리는 거 같습니다. 


원더우먼 이미지 싱크로율이 아주 높습니다.



  물론 볼만합니다. 여 주인공이 이쁩니다. 본성과는 상관 없이 이쁩니다. 이쁘면 본성이 무슨 상관이 있겠습니까? 하지만 다음 번 영화를 볼지 말지 고민하게 할 정도는 되더군요. 


  다음은 제가 영화에서 느낀 것입니다. 


  1. 마을 전투씬이 제일 좋았습니다. 

  2. 최종 전투씬은 디씨의 고질병인 '가장 강한 빌런의 임팩트를 약하게 하기'가 다시 도진것 같습니다.

  3. 아! 수염! 수염! 수염! (보신 분은 아실것 입니다)

  4. 방패 쓰는 무술은 캡틴 아메리카에게 좀 배워야 할 것 같습니다. 생각보다 약하더군요. 

  5. 스토리 자체는 평이합니다. 

  6. 신들의 이름이 그리스 식인데 (제우스, 아레스), 주인공은 로마식이더군요. 아르테미스가 아니라 다이아나 


  투덜 거린 것만 있는거 같지만 영화는 재밌습니다. 두 번은 안 보겠지만. 


  개인 토마토 지수는 74 입니다. 

  



Q:좋아하는 일을 해야 하나요? 잘 하는 일을 해야 하나요. 

A:폭 넓게 시도를 해보고 좋아하는 것 들중에서 잘 하는 것을 해야 한다. 가장 좋아하는 것을 가장 잘하면 좋지만 그렇지 않다면 좋아하는 것들을 취미로 즐겨라. 


  제자들이나 후배들한테 제일 많이 질문 받았던 내용입니다. 최근 마리텔에서 유시민 작가가 이야기 하던 것을 듣고 나니 공감 되서 메모 남깁니다. 


자신이 좋아하는 모든 스펙트럼에서 가장 잘하는 분야를 자신의 일적인 방향으로 정하면 힘들어도 참고 견뎌가면서 실력이 쌓입니다. 저도 호기심이 많아서 수 많은 것 들을 건드리면서 이 걸로 먹고 살 수 있을까? 고민을 했지만 저는 프로그램쪽 일이 좋아하기도 하고 그나마 잘 하기도 해서 잘 선택했다고 위안합니다 ㅎㅎ 



+ Recent posts