제너레이터 설치

리엑트 프로젝트를 편리하게 만들어주는 제너레이터 설치

# npm install -g create-react-app

프로젝트 생성

# create-react-app PROJECT_NAME --typescript

 

* Typescript 기반으로 할 것이기 때문에 --typescript 옵션을 넣어준다.

* PROJECT_NAME은 소문자와 '_' 만으로 구성되어야 한다.

 

프로젝트 실행

# yarn start

 

Brew 설치

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

* 최신판은 https://brew.sh/index_ko에서 확인 할 수 있다.

 

Node 설치

$ brew install node

 

Yarn 설치

npm 대용으로 좀 더 진보된 Package manager인 Yarn을 설치 한다.

$ npm install --global yarn

 

Yarn Update

$ yarn self-update

 

Node 업그레이드

$ brew update

$ brew upgrade node

 

 

Deprecated -------------------------------------------------------

 

wget 설치

$ brew install wget

 

Node.js 다운로드 소스 얻기

아래 주소에서 설치할 OS에 맞추어 wget 할 주소를 얻어온다.

https://nodejs.org/en/download/

 

다운로드 후 설치

# cd /opt

# sudo wget https://nodejs.org/dist/v10.16.0/node-v10.16.0-linux-x64.tar.xz

# sudo tar xvf node-v12.13.1-darwin-x64.tar.gz

# sudo rm -r node-v12.13.1-darwin-x64.tar.gz

# sudo mv node-v12.13.1-darwin-x64 nodejs

 

Path 지정

# nano /etc/profile
export NODE_HOME=/opt/nodejs
export PATH=$PATH:$NODE_HOME/bin
# source /etc/profile

 

버전 검사

# node -v

 

NPM 권한 변경

node.js 폴더 얻기

# npm config get prefix

node.js를 윗글 방식대로 설치 했다면 (node.js 폴더) = /opt/nodejs/ 를 얻을 수 있을 것이다.

 

node.js 폴더 권한 보기

# ls -la (node.js 폴더)/lib/node_modules

 

폴더 권한 변경

# sudo chown -R (로그인 ID) (node.js 폴더)

# sudo chown -R (로그인 ID) (node.js 폴더)/lib/node_modules

# sudo chown -R (로그인 ID) (node.js 폴더)/bin/

# sudo chown -R (로그인 ID) (node.js 폴더)/share/

 

Yarn 설치

npm 대용으로 좀 더 진보된 Package manager인 Yarn을 설치 한다.

npm install --global yarn

 

Yarn Update

yarn self-update

 

'Developments > Node.js' 카테고리의 다른 글

Tensorflow.js 설치  (0) 2019.07.25
MongoDB 설치  (0) 2019.07.25
Express.js 설치  (0) 2019.07.25
Babel 설치  (0) 2019.07.25
Typescript 설치  (0) 2019.07.25

Type 1.

1. 윈도우 위치 찾기


GRUB의 부팅 선택화면에서 키보드 [C] 누르면 Prompt가 나온다. 다음과 같이 입력해서 윈도우 부트 파티션을 알아낸다.

> ls -I


2. 리눅스 부팅

# cd /boot/grub2

# cp grub.cfg grub.org

# vi grub.cfg


3. 명령어 차례대로 입력

# . /menuentry

# menuentry "윈도우 명"

# insmod NTFS

# insmod chain

# insmod drivemap

# set root=(1번에서 확인한 윈도우위치)

# chainloader +1



Type2.

Type1으로 해결이 되지 않을 경우 이 방법을 사용한다.


1. 우분투로 부팅 후 터미널 접속

# sudo grub-mkconfig -o /boot/grub/grub.cfg

간혹 # sudo grub2-mkconfig -o /boot/grub2/grub.cfg 이렇게 입력을 해야되는 상황도 있는데, 이는 grub.cfg의 파일의 디렉토리가 grub2에 있기 때문.

grub.cfg의 위치에 따라 명령어를 수정해 준다.


2. 계정 비밀번호 입력 후 재부팅

Windows를 found 했다는 메시지 확인 후 재부팅 하면 정상 작동한다. 






설치 할 리눅스 배포판은 사용하는데 익숙한 우분투 (Ubuntu)로 택했다.


개발용은 Ubuntu Desktop, 서비스용은 Ubuntu Server를 다운로드 한다.

다운로드 한 리눅스를 boot USB로 만들어 놓는다.


사용 용도에 따라 싱글 또는 멀티 부팅을 택하여 설치 하도록 한다.


리눅스 싱글 설치

서비스용은 그냥 USB를 통해 부팅하고 차례로 진행하면 간단히 설치 가능하다.


리눅스 + 윈도우 멀티부팅

하나의 머신에서 윈도우와 리눅스를 모두 사용하려면 다음과 같이 진행 한다.


1. 윈도우를 먼저 설치한다.

2. 윈도우에서 리눅스로 쓸 파티션을 분리 해 놓는다.

3. USB로 부팅하여 Install Ubuntu를 선택한다.

4. 설치 진행 도중 설치 형식을 [기타]로 선택하여 파티션 및 부트로더를 직접 제어한다.

5. 파티션 설정에서 EFI 시스템 파티션 영역을 만들어 준다.

6. 파티션 설정에서 Root (/) 영역을 만들어 준다.

7. 설치 형식의 부트로더 설정에서 EFI 시스템 파티션으로 지정한다.

8. 설치 후 재부팅 하면 된다.


* 주의

-  BIOS 화면에서 boot 타입을 UEFI 타입이 아니라 Multi boot type 으로 설정 후 리부팅 하여야 정상적인 멀티 부팅이 가능하다.

- 만약 부팅시 멀티 부팅 선택화면이 나오지 않는다면 시스템 EFI 설정에 잘 되지 않았을 경우다. 이럴땐 복구 방법을 사용하던가, 부팅시 마다 BIOS에서 원하는 부트 디스크를 바꾸어 원하는 OS로 부팅 하는 방법이 있다.


'Developments > Service' 카테고리의 다른 글

Webpack 을 이용한 모듈 관리  (0) 2019.09.27
유용한 Visual Studio Code Extension 들  (0) 2019.09.25
ESLint 를 이용한 코드 규격화  (0) 2019.09.18
Nodemon 설치  (0) 2019.07.25
Web Service 구성 요소  (0) 2019.07.17

서비스 구성요소

웹 서비스는 서버 파트와 클라이언트서버 파트로 구성된다.

 

설치 OS

Ubuntu

써 본 리눅스 중 그나마 가장 편안했던 배포 패키지라서 선택.

 

IDE

Visual Studio Code

- Prettier

- ESLint

- ES7 React/Redux/GraphQL/React-Native snippets

 

Visual Studio Code의 Extenstion settings 에서 다음을 활성화 시킨다.

"eslint.alwaysShowStatus": true,
"eslint.autoFixOnSave": true,
"editor.formatOnSave": true,
"prettier.eslintIntegration": true



공통 구성

Node.js

방대하고 훌륭한 서드파티 모듈들을 지원하고 프론트엔드, 백앤드를 가리지 않고 Javascript를 기반으로 한 플랫폼이기에 선택.

 

Typescript

Javascript는 소스의 규모가 커질 수록 그에 따른 관리에 어려움이 있다. Typescript를 도입하여 실수로 인한 오작동 코드 작성을 줄일 수 있다.

 

서버 구성

Express.js

Node.js에서 가장 인기있는 라우팅용 프레임워크.

Cluster.js

한대의 서버에서 클러스트로 여러 워커를 구성해 자원효율을 높여주는 프레임워크다.

 

MongoDB

SQL 사용에 취약한 지금의 나로써는 문법을 별도로 배우지 않아도 되는 NoSQL류를 사용하는 것이 이득이 매우 크다.

현대의 서비스는 빠른 개발 및 빠른 출시 후 개선하는 것이 중요시 되고 있다.

그에 맞는 개발 속도를 맞추려면 설계에 비용이 큰 RDBMS 보단 NoSQL이 좋다고 판단했다.

그 중 그나마 익숙한 MongoDB를 선택했다.

 

Tensorflow.js

Python 기반의 기존 텐서플로우를 사용하기 보단 개발에 필요한 언어를 하나로(Javascript로) 통일 하고 싶었다.

다행히도 Tensorflow Javascript 버전이 출시하여 바로 선택했다.

 

Apollo Server

개발 할 서비스는 REST 방식이 아닌 GraphQL 방식으로 통신 할 것이므로 이를 보다 편리하게 관리하기 위해 사용.

 

클라이언트 서버 구성

React.js

사용에 익숙하고 프론트엔드 서버를 보다 빠르고 편하게 만들 수 있기 때문에 선택.

네이티브 앱 프레임워크인 React Native에도 비슷하게 사용 할 수 있으므로 Vue.js 및 Angular.js 프레임워크를 이용하기 보단 React로 통일하는 편이 더 낫다 판단했다.

 

Babel

자바스크립트의 하위 호환을 위해 선택.

 

Apollo Client

GraphQL 통신을 편리하게 관리하기 위해 사용.

 

운영 및 자동화 구성

PM2

웹서버가 강제종료됐을 시 알아서 재부팅 되는 등 모든 것을 자동화 하고 싶었다. PM2를 통해 서버 자동화 및 모니터링을 한다.

 

NginX

Node.js 자체가 웹서버 기능을 하지만 보안 향상 및 로드밸런싱 기능을 위해 사용한다.

 

Docker

배포의 자동화를 해 주는 도구이다. 단일 서버가 아닌 여러 서버를 확장 및 관리할 때 매우 유용하다. 자동화는 언제나 옳다.
서버 업데이트 도중에도 365일 24시간 Non-stop으로 동작하는 서비스를 원한다면 필히 적용해야 된다.



 

 
 
 

정리 해야할 것들

 

winstone.js (Logger)

https://blog.naver.com/couponpapa/221237495718

 

Agenda (작업관리자 - 여러 작업 동시 진행)

https://blog.naver.com/couponpapa/221242899397

 

 

 

https://blog.naver.com/catasy/221388866863

 

https://medium.com/@xoor/coding-a-graphql-api-with-node-js-c02d617f49f4

https://blog.naver.com/choseyoung45/221535788764

http://labs.brandi.co.kr/2018/05/25/kangww.html

'Developments > Service' 카테고리의 다른 글

Webpack 을 이용한 모듈 관리  (0) 2019.09.27
유용한 Visual Studio Code Extension 들  (0) 2019.09.25
ESLint 를 이용한 코드 규격화  (0) 2019.09.18
Nodemon 설치  (0) 2019.07.25
리눅스 설치  (0) 2019.07.17

금융데이터 분석 할 때에는 다양한 보조지표의 도움이 필요할 때가 있다.

다양한 기능들을 미리 구현해 놨으니 그대로 사용하면된다.

(이걸 지금까지 몰랐던 나는 괜히 노가다로 수십가지 지표를 스스로 만들었다... 모르면 개고생...)

 

공식 홈페이지: http://ta-lib.org/

도큐먼트: http://cryptotrader.org/talib

 

단, Node.js는 공식적으로 제공하지 않는다.

Wrapper를 통해서 이용하도록 하자.

임시로 찾은 wrapper는 talib-binding, node-talib 이다.

 

지원 함수 내역

AD                  Chaikin A/D Line
ADOSC               Chaikin A/D Oscillator
ADX                 Average Directional Movement Index
ADXR                Average Directional Movement Index Rating
APO                 Absolute Price Oscillator
AROON               Aroon
AROONOSC            Aroon Oscillator
ATR                 Average True Range
AVGPRICE            Average Price
BBANDS              Bollinger Bands
BETA                Beta
BOP                 Balance Of Power
CCI                 Commodity Channel Index
CDL2CROWS           Two Crows
CDL3BLACKCROWS      Three Black Crows
CDL3INSIDE          Three Inside Up/Down
CDL3LINESTRIKE      Three-Line Strike 
CDL3OUTSIDE         Three Outside Up/Down
CDL3STARSINSOUTH    Three Stars In The South
CDL3WHITESOLDIERS   Three Advancing White Soldiers
CDLABANDONEDBABY    Abandoned Baby
CDLADVANCEBLOCK     Advance Block
CDLBELTHOLD         Belt-hold
CDLBREAKAWAY        Breakaway
CDLCLOSINGMARUBOZU  Closing Marubozu
CDLCONCEALBABYSWALL Concealing Baby Swallow
CDLCOUNTERATTACK    Counterattack
CDLDARKCLOUDCOVER   Dark Cloud Cover
CDLDOJI             Doji
CDLDOJISTAR         Doji Star
CDLDRAGONFLYDOJI    Dragonfly Doji
CDLENGULFING        Engulfing Pattern
CDLEVENINGDOJISTAR  Evening Doji Star
CDLEVENINGSTAR      Evening Star
CDLGAPSIDESIDEWHITE Up/Down-gap side-by-side white lines
CDLGRAVESTONEDOJI   Gravestone Doji
CDLHAMMER           Hammer
CDLHANGINGMAN       Hanging Man
CDLHARAMI           Harami Pattern
CDLHARAMICROSS      Harami Cross Pattern
CDLHIGHWAVE         High-Wave Candle
CDLHIKKAKE          Hikkake Pattern
CDLHIKKAKEMOD       Modified Hikkake Pattern
CDLHOMINGPIGEON     Homing Pigeon
CDLIDENTICAL3CROWS  Identical Three Crows
CDLINNECK           In-Neck Pattern
CDLINVERTEDHAMMER   Inverted Hammer
CDLKICKING          Kicking
CDLKICKINGBYLENGTH  Kicking - bull/bear determined by the longer marubozu
CDLLADDERBOTTOM     Ladder Bottom
CDLLONGLEGGEDDOJI   Long Legged Doji
CDLLONGLINE         Long Line Candle
CDLMARUBOZU         Marubozu
CDLMATCHINGLOW      Matching Low
CDLMATHOLD          Mat Hold
CDLMORNINGDOJISTAR  Morning Doji Star
CDLMORNINGSTAR      Morning Star
CDLONNECK           On-Neck Pattern
CDLPIERCING         Piercing Pattern
CDLRICKSHAWMAN      Rickshaw Man
CDLRISEFALL3METHODS Rising/Falling Three Methods
CDLSEPARATINGLINES  Separating Lines
CDLSHOOTINGSTAR     Shooting Star
CDLSHORTLINE        Short Line Candle
CDLSPINNINGTOP      Spinning Top
CDLSTALLEDPATTERN   Stalled Pattern
CDLSTICKSANDWICH    Stick Sandwich
CDLTAKURI           Takuri (Dragonfly Doji with very long lower shadow)
CDLTASUKIGAP        Tasuki Gap
CDLTHRUSTING        Thrusting Pattern
CDLTRISTAR          Tristar Pattern
CDLUNIQUE3RIVER     Unique 3 River
CDLUPSIDEGAP2CROWS  Upside Gap Two Crows
CDLXSIDEGAP3METHODS Upside/Downside Gap Three Methods
CMO                 Chande Momentum Oscillator
CORREL              Pearson's Correlation Coefficient (r)
DEMA                Double Exponential Moving Average
DX                  Directional Movement Index
EMA                 Exponential Moving Average
HT_DCPERIOD         Hilbert Transform - Dominant Cycle Period
HT_DCPHASE          Hilbert Transform - Dominant Cycle Phase
HT_PHASOR           Hilbert Transform - Phasor Components
HT_SINE             Hilbert Transform - SineWave
HT_TRENDLINE        Hilbert Transform - Instantaneous Trendline
HT_TRENDMODE        Hilbert Transform - Trend vs Cycle Mode
KAMA                Kaufman Adaptive Moving Average
LINEARREG           Linear Regression
LINEARREG_ANGLE     Linear Regression Angle
LINEARREG_INTERCEPT Linear Regression Intercept
LINEARREG_SLOPE     Linear Regression Slope
MA                  All Moving Average
MACD                Moving Average Convergence/Divergence
MACDEXT             MACD with controllable MA type
MACDFIX             Moving Average Convergence/Divergence Fix 12/26
MAMA                MESA Adaptive Moving Average
MAX                 Highest value over a specified period
MAXINDEX            Index of highest value over a specified period
MEDPRICE            Median Price
MFI                 Money Flow Index
MIDPOINT            MidPoint over period
MIDPRICE            Midpoint Price over period
MIN                 Lowest value over a specified period
MININDEX            Index of lowest value over a specified period
MINMAX              Lowest and highest values over a specified period
MINMAXINDEX         Indexes of lowest and highest values over a specified period
MINUS_DI            Minus Directional Indicator
MINUS_DM            Minus Directional Movement
MOM                 Momentum
NATR                Normalized Average True Range
OBV                 On Balance Volume
PLUS_DI             Plus Directional Indicator
PLUS_DM             Plus Directional Movement
PPO                 Percentage Price Oscillator
ROC                 Rate of change : ((price/prevPrice)-1)*100
ROCP                Rate of change Percentage: (price-prevPrice)/prevPrice
ROCR                Rate of change ratio: (price/prevPrice)
ROCR100             Rate of change ratio 100 scale: (price/prevPrice)*100
RSI                 Relative Strength Index
SAR                 Parabolic SAR
SAREXT              Parabolic SAR - Extended
SMA                 Simple Moving Average
STDDEV              Standard Deviation
STOCH               Stochastic
STOCHF              Stochastic Fast
STOCHRSI            Stochastic Relative Strength Index
SUM                 Summation
T3                  Triple Exponential Moving Average (T3)
TEMA                Triple Exponential Moving Average
TRANGE              True Range
TRIMA               Triangular Moving Average
TRIX                1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
TSF                 Time Series Forecast
TYPPRICE            Typical Price
ULTOSC              Ultimate Oscillator
VAR                 Variance
WCLPRICE            Weighted Close Price
WILLR               Williams' %R
WMA                 Weighted Moving Average

'Developments > Finance' 카테고리의 다른 글

트레이딩 Open-API 정리 (한국 및 글로벌)  (0) 2019.07.14

한국

Updated: 7.11.2018

API 명칭 매매 가능 종목 API 형식 소개 / 지원 사이트 증권사
LIG-API 선옵,ELW,주식. DLL 고객센터/트레이딩채널/LIG-API (다운로드,매뉴얼 가능) LIG 투자증권.
d-EOS API 선옵,ELW,ETF,주식. DLL 소개. 신영증권.
xingAPI 선옵,CME선옵,EUREX야간옵션,주식. DLL, COM 지원. 이베스트 투자증권.
API 선옵, DLL. OCX 소개. 지원 (네이버카페)
개요,다운로드 별도정리
NH선물.
Open API+ 선옵,주식선물,주식. OCX 지원. - OpenAPI+ 키움증권.
Open API-W 해외선옵전용. OCX 지원 - OpenAPI-W
설치상세 별도정리
키움증권.
1Q Pro 해외,FX,한국선옵/주식 COM 소개, 지원
설치상세 별도정리
하나금융투자
able XpertPlus 선옵,ELW,ETF,주식. COM 소개(매뉴얼,다운로드) 현대증권.
GOM 선옵 COM 지원 유안타증권.
Open API 한국선물,해외선물 COM 지원 유안타증권.
CYBOS Plus 선옵,주식, COM 지원 대신증권.
WAPI 선옵,ELW,주식. DLL 지원 SK증권
QV Open API 선옵,ELW,주식. DLL 고객센터/트레이딩채널/QV Open API NH투자증권
eFriend Expert 선옵,주식,CME선물,EUREX옵션 OCX 소개, 지원, 다운로드 한국투자증권
동부증권 API들 한국주식,선옵 ,
해외선물옵션 따로 제공됨.
- 계좌개설로그인해서 사이트에서 신청해야 다운로드가능(방법 상세). 공개접근가능 경로없음. 동부증권
FNDirect S 선옵,해외선물 OCX 소개, 다운로드. 설명문pdf 삼성선물.
AnyLink 선옵,해외선물 OCX 소개. 사용불가. 사유 . HTS Q Way 연동되어 서비스 되었으나 Q-Way 대신 KAIROS HTS로 서비스 되면서 2017년 7월 10일부터 사용못함. 미래에셋대우
OpenAPI 해외선물,선옵. DLL 소개,
개요 활용준비 별도정리.
유진투자선물

* 선옵 : KOSPI200 선물 & 옵션.

 

한국 DMA

Updated: 7.11.2018

DMA 명칭 DMA 매매가능 종목 DMA 형식 DMA소개,지원 증권사
DMA 선물,옵션,ELW - 고객센터/트레이딩채널/DMA 간략소개만있음. LIG 투자증권.
d-EOS DMA 선물,옵션,ELW,주식. - 소개. 신영증권.
X-PERT 선물,옵션. DLL(X-PERT API),
FIX4.2이상.
소개. 지원 (네이버카페) NH선물
DMA 선물,옵션 - 소개. 유진투자선물

* 평가 : 상기 DMA 서비스 내용을 보면  NH선물의 X-PERT 가 가장 접근성이 좋고 X-PERT API까지 제공되어 개발속도 향상가능함. 

 

글로벌

Updated: 7.16.2018

API 명칭 거래가능종목 API 형식 API 소개/지원 API 주체 회사, 위치
SaxoOpenAPI - REST API 소개. 상세

Saxo Bank. 덴마크 코펜하겐

Saxo Direct FIX API FX, Futures, CFD 등. FIX 소개

Saxo Bank. 덴마크 코펜하겐

Rithmic API Future등 DLL 개요

Rithmic,LLC. 미국 뉴욕.

CQG API Future등 COM 개요 CQG Co. 미국 덴버.
E*Trade API - VC++용 DLL 소개/다운로드

E*Trade Financial Corporation . 미국.

AmeriTrade API - - 소개 (이메일로 요청해야함)

TD Ameritrade Holding Corp. 미국.

 

암호화폐

Updated: 7.5.2018

거래소 거래가능종목 API 형식 API 정보

API 주체회사, 위치.

BitMEX (비트맥스) 암호화폐 파생 REST, WebSocket 상세 BitMEX, 미국
bybit (바이빗) 암호화폐 파생 REST, WebSocket 상세 bybit, 싱가폴
GOPAX (고팍스) 암호화폐 현물 REST 상세 GOPAX, 한국
BINANCE (바이낸스) 암호화폐 현물,파생 REST 상세 BINANCE. 몰타

 

 

 

원문: https://igotit.tistory.com/493

 

트레이딩 API, DMA정리. 한국, 글로벌.

한국 Trading API 2018년 7월11일 시점. API 명칭. API 매매가능 종목 API 형식. API 소개/지원 사이트 증권사 LIG-API 선옵,ELW,주식. DLL 고객센터/트레이딩채널/LIG-API (다운로드,매뉴얼 가능) LIG 투자증권...

igotit.tistory.com

'Developments > Finance' 카테고리의 다른 글

Ta-lib 금융 보조지표 라이브러리  (0) 2019.07.14

Node.js + Express + GraphQL + Apollo 를 사용하는 편이 Javascript라는 언어로 통일화 시킬 수 있고 매우 편함.


굳이 Django를 사용해야 할 이유를 전혀 찾지 못함.


결론적으로 영구적으로 쓰지 않기로 판단 함.

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

Django RESTful frameworks  (0) 2018.08.26
Windows + Pycharm + Django 설치부터 시작까지  (0) 2018.08.20

OpenCV를 활용한 이미지 특징점을 찾을때엔 SIFT, SURF와 같은 훌륭한 함수들이 있다.


다만 이 두가지 알고리즘은 특허가 걸려있어 상용화된 제품에는 별도의 사용료 협의가 필요하다.


여기서 우리는 모두 공짜로 사용할 강력한 특징점 찾는 알고리즘은 없을까? 라고 생각하게 된다.


그렇다면 OpenCV에서 자체적으로 만든 ORB가 대안이다.


SIFT, SURF와 같이 아니 오히려 더 빠르고 강력하면서도 무료이다!


앞으로 특징점을 찾을 때에는 ORB를 사용하도록 하자.




* 각 알고리즘별 성능은 이곳에서 보도록 하자.

https://computer-vision-talks.com/2011-07-13-comparison-of-the-opencv-feature-detection-algorithms/

'Developments > OpenCV' 카테고리의 다른 글

Mat + Overlay Mat 합성하기  (0) 2020.01.07

웹 API를 제공하기 위해선 AJAX, jSON, XML등 여러 형식을 지원해야 한다.

손수 모든 것을 구현하기엔 매우 번거롭다.

자동차 바퀴를 재차 만들 필요는 없기 때문에 이를 제공하는 framework를 사용하도록 한다.


Django에는 다음과 같은 RESTful API를 제작하는데 도움되는 framework이 존재한다.


1. django-rest-framework

장고의 기본 클래스 기반 뷰를 바탕으로 브라우징이 가능한 편리한 API 기능 등을 제공한다.

가장 유명한 프레임워크이다. 고르기 귀찮으면 그냥 이거 쓰면 된다.


2. django-tastypie

자체적으로 구현된 클래스 기반 뷰 시스템을 제공하는 안정된 도구다.


3. django-piston

Python3를 지원하지 않는다.


4. django-braces(클래스 기반 뷰)와 django-jsonview(함수 기반 뷰)

매우 단순하고 빠르게 REST API를 제작하고 싶다면 이것이 좋은 대안이 된다. 다만 이 도구들은 API를 제작하는데만 중점을 두고 있지는 않기 때문에 HTTP 메서드의 모든 기능을 다 이용한다거나 복잡한 디자인을 구현해야 할 때 문제가 생길 것이다.



* 자세한 장단점 비교는 이곳에서 보도록 한다.

https://djangopackages.org/grids/g/api/

서비스하기 전까지는 Linux가 아닌 Windows 또는 Mac 환경에서 작업하는 것이 편하다.

여기서는 윈도우에서 편하게 개발하기 위한 Back-End 환경을 조성하는 방법을 알아보자.


* 개발 환경

OS: Windows 10

Language: Python 3.7

IDE: Pycharm community

Framework: Django


1. Python과 PyCharm 설치

아래 과정대로 간단히 설치 하도록 한다.

http://7stocks.tistory.com/6?category=658880


2. Django 설치

pip를 이용하여 간편하게 설치 한다.

$ pip install django 


RESTful 기반의 웹을 만들 것이므로 REST Framework도 함께 설치 해 준다.

$ pip install django-rest-framework


3. Django 프로젝트 시작 및 앱 설치

- 진행하기 전 알아둘 것!

PyCharm 프로젝트는 다수의 Django 프로젝트를 보유할 수 있으며 Django 프로젝트는 다수의 Django App을 보유할 수 있다.

- PyCharm을 구동 후 프로젝트를 생성

다음과 같이 새 프로젝트를 생성한다.


- Django 프로젝트 생성

PyCharm 터미널(단축키: Alt + F12)을 띄운 뒤 다음과 같은 명령어로 Django 프로젝트를 생성한다.

> django-admin startproject (프로젝트명)


프로젝트의 이름을 지을 때 파이썬이나 장고 컴포넌트의 이름은 피해준다. 특히 django(장고 어플리케이션 이름) 나 test(디폴트 파이썬 패키지 이름) 등의 이름의 사용은 꼭 피해 준다. 만약 생성에 실패하였다면, django-admin 실행 문제를 참고한다.


생성에 성공한다면 다음과 같이 생성됨 폴더를 확인 할 수 있다.



여기서 각 폴더 및 파일들의 속성을 알아보자!


최상 루트 폴더 FirstProject/: 프로젝트 폴더를 담고 있는 단순한 컨테이너이다. 이 디렉터리의 이름은 장고 어플리케이션에게는 아무 상관이 없으며 어떤 이름으로도 변경 가능하다. django-admin and manage.py에서 자세한 내용을 알 수 있다.


manage.py: 장고 프로젝트와 다양한 방법으로 커뮤니케이션 할 수 있는 커맨드라인 유틸리티 이다. 


두번째 단의 FirstProject/ 폴더는 실제 프로젝트의 파이썬 패키지이다. 폴더의 이름이 파이썬 코드를 임포트할 때 사용할 실제 파이썬 패키지 이름 이다. (e.g. FirstProject.urls)


mysite/__init__.py: 아무것도 들어 있지 않은 빈 파일이며 파이썬 에게 현재 폴더가 파이썬 패키지임을 알려 준다. 파이썬 초보자라면 more about packages를 참고 한다.


mysite/settings.py: 장고 프로젝트의 셋팅과 설정이 포함된 파일이다. Django settings에서 자세한 사용 방법을 알 수 있다.


mysite/urls.py: 장고 프로젝트 안의 URL을 선언하는 곳 입니다. 장고 사이트의 컨텐츠 목록이다. URL dispatcher에서 자세한 내용을 알 수 있다.


mysite/wsgi.py: WSGI 프로토콜을 사용하는 웹서버가 프로젝트의 페이지를 보여주기 위하여 가장 먼저 사용하는 파일이다. How to deploy with WSGI에서 자세한 내용을 알 수 있다.


- Django 앱 생성

여기서 "api"라는 앱을 임시로 생성 했다.

> cd "Django 프로젝트 폴더"

> django-admin startapp api


다음과 같은 폴더가 생성됨을 확인 할 수 있다.



- 서버 구동하기

Django 프로젝트 폴더의 manage.py를 이용하여 서버를 구동시킨다.

> python manage.py runserver


실행 후 http://127.0.0.1:8000에 접속해 보면 다음과 같이 Django가 구동 된 화면을 볼 수 있다.



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

Django 개발 포스트 종료 --------------------------  (1) 2019.07.14
Django RESTful frameworks  (0) 2018.08.26

import pickle


간단한 파일 입출력은 pickle 모듈을 이용하여 제어하면 편하다.


pickle은 바이너리 형식의 파일을 제어하기 편하다.


자세한 설명은 구글링 하자.




'Deprecated > Python' 카테고리의 다른 글

Python OSX Path 설정  (0) 2023.10.23
30분만에 파이썬 배우기.  (0) 2018.05.02
Numpy array 갖고 놀기  (0) 2018.03.18
numpy.random 함수들  (0) 2018.03.18
Binary to String, String to Binary  (0) 2018.03.09

출처: https://learnxinyminutes.com/docs/python/


# Single line comments start with a number symbol. """ Multiline strings can be written using three "s, and are often used as comments """ #################################################### # 1. Primitive Datatypes and Operators #################################################### # You have numbers 3 # => 3 # Math is what you would expect 1 + 1 # => 2 8 - 1 # => 7 10 * 2 # => 20 35 / 5 # => 7 # Division is a bit tricky. It is integer division and floors the results # automatically. 5 / 2 # => 2 # To fix division we need to learn about floats. 2.0 # This is a float 11.0 / 4.0 # => 2.75 ahhh...much better # Result of integer division truncated down both for positive and negative. 5 // 3 # => 1 5.0 // 3.0 # => 1.0 # works on floats too -5 // 3 # => -2 -5.0 // 3.0 # => -2.0 # Note that we can also import division module(Section 6 Modules) # to carry out normal division with just one '/'. from __future__ import division 11 / 4 # => 2.75 ...normal division 11 // 4 # => 2 ...floored division # Modulo operation 7 % 3 # => 1 # Exponentiation (x to the yth power) 2 ** 4 # => 16 # Enforce precedence with parentheses (1 + 3) * 2 # => 8 # Boolean Operators # Note "and" and "or" are case-sensitive True and False # => False False or True # => True # Note using Bool operators with ints 0 and 2 # => 0 -5 or 0 # => -5 0 == False # => True 2 == True # => False 1 == True # => True # negate with not not True # => False not False # => True # Equality is == 1 == 1 # => True 2 == 1 # => False # Inequality is != 1 != 1 # => False 2 != 1 # => True # More comparisons 1 < 10 # => True 1 > 10 # => False 2 <= 2 # => True 2 >= 2 # => True # Comparisons can be chained! 1 < 2 < 3 # => True 2 < 3 < 2 # => False # Strings are created with " or ' "This is a string." 'This is also a string.' # Strings can be added too! "Hello " + "world!" # => "Hello world!" # Strings can be added without using '+' "Hello " "world!" # => "Hello world!" # ... or multiplied "Hello" * 3 # => "HelloHelloHello" # A string can be treated like a list of characters "This is a string"[0] # => 'T' # You can find the length of a string len("This is a string") # => 16 # String formatting with % # Even though the % string operator will be deprecated on Python 3.1 and removed # later at some time, it may still be good to know how it works. x = 'apple' y = 'lemon' z = "The items in the basket are %s and %s" % (x, y) # A newer way to format strings is the format method. # This method is the preferred way "{} is a {}".format("This", "placeholder") "{0} can be {1}".format("strings", "formatted") # You can use keywords if you don't want to count. "{name} wants to eat {food}".format(name="Bob", food="lasagna") # None is an object None # => None # Don't use the equality "==" symbol to compare objects to None # Use "is" instead "etc" is None # => False None is None # => True # The 'is' operator tests for object identity. This isn't # very useful when dealing with primitive values, but is # very useful when dealing with objects. # Any object can be used in a Boolean context. # The following values are considered falsey: # - None # - zero of any numeric type (e.g., 0, 0L, 0.0, 0j) # - empty sequences (e.g., '', (), []) # - empty containers (e.g., {}, set()) # - instances of user-defined classes meeting certain conditions # see: https://docs.python.org/2/reference/datamodel.html#object.__nonzero__ # # All other values are truthy (using the bool() function on them returns True). bool(0) # => False bool("") # => False #################################################### # 2. Variables and Collections #################################################### # Python has a print statement print "I'm Python. Nice to meet you!" # => I'm Python. Nice to meet you! # Simple way to get input data from console input_string_var = raw_input( "Enter some data: ") # Returns the data as a string input_var = input("Enter some data: ") # Evaluates the data as python code # Warning: Caution is recommended for input() method usage # Note: In python 3, input() is deprecated and raw_input() is renamed to input() # No need to declare variables before assigning to them. some_var = 5 # Convention is to use lower_case_with_underscores some_var # => 5 # Accessing a previously unassigned variable is an exception. # See Control Flow to learn more about exception handling. some_other_var # Raises a name error # if can be used as an expression # Equivalent of C's '?:' ternary operator "yahoo!" if 3 > 2 else 2 # => "yahoo!" # Lists store sequences li = [] # You can start with a prefilled list other_li = [4, 5, 6] # Add stuff to the end of a list with append li.append(1) # li is now [1] li.append(2) # li is now [1, 2] li.append(4) # li is now [1, 2, 4] li.append(3) # li is now [1, 2, 4, 3] # Remove from the end with pop li.pop() # => 3 and li is now [1, 2, 4] # Let's put it back li.append(3) # li is now [1, 2, 4, 3] again. # Access a list like you would any array li[0] # => 1 # Assign new values to indexes that have already been initialized with = li[0] = 42 li[0] # => 42 li[0] = 1 # Note: setting it back to the original value # Look at the last element li[-1] # => 3 # Looking out of bounds is an IndexError li[4] # Raises an IndexError # You can look at ranges with slice syntax. # (It's a closed/open range for you mathy types.) li[1:3] # => [2, 4] # Omit the beginning li[2:] # => [4, 3] # Omit the end li[:3] # => [1, 2, 4] # Select every second entry li[::2] # =>[1, 4] # Reverse a copy of the list li[::-1] # => [3, 4, 2, 1] # Use any combination of these to make advanced slices # li[start:end:step] # Remove arbitrary elements from a list with "del" del li[2] # li is now [1, 2, 3] # You can add lists li + other_li # => [1, 2, 3, 4, 5, 6] # Note: values for li and for other_li are not modified. # Concatenate lists with "extend()" li.extend(other_li) # Now li is [1, 2, 3, 4, 5, 6] # Remove first occurrence of a value li.remove(2) # li is now [1, 3, 4, 5, 6] li.remove(2) # Raises a ValueError as 2 is not in the list # Insert an element at a specific index li.insert(1, 2) # li is now [1, 2, 3, 4, 5, 6] again # Get the index of the first item found li.index(2) # => 1 li.index(7) # Raises a ValueError as 7 is not in the list # Check for existence in a list with "in" 1 in li # => True # Examine the length with "len()" len(li) # => 6 # Tuples are like lists but are immutable. tup = (1, 2, 3) tup[0] # => 1 tup[0] = 3 # Raises a TypeError # You can do all those list thingies on tuples too len(tup) # => 3 tup + (4, 5, 6) # => (1, 2, 3, 4, 5, 6) tup[:2] # => (1, 2) 2 in tup # => True # You can unpack tuples (or lists) into variables a, b, c = (1, 2, 3) # a is now 1, b is now 2 and c is now 3 d, e, f = 4, 5, 6 # you can leave out the parentheses # Tuples are created by default if you leave out the parentheses g = 4, 5, 6 # => (4, 5, 6) # Now look how easy it is to swap two values e, d = d, e # d is now 5 and e is now 4 # Dictionaries store mappings empty_dict = {} # Here is a prefilled dictionary filled_dict = {"one": 1, "two": 2, "three": 3} # Look up values with [] filled_dict["one"] # => 1 # Get all keys as a list with "keys()" filled_dict.keys() # => ["three", "two", "one"] # Note - Dictionary key ordering is not guaranteed. # Your results might not match this exactly. # Get all values as a list with "values()" filled_dict.values() # => [3, 2, 1] # Note - Same as above regarding key ordering. # Get all key-value pairs as a list of tuples with "items()" filled_dict.items() # => [("one", 1), ("two", 2), ("three", 3)] # Check for existence of keys in a dictionary with "in" "one" in filled_dict # => True 1 in filled_dict # => False # Looking up a non-existing key is a KeyError filled_dict["four"] # KeyError # Use "get()" method to avoid the KeyError filled_dict.get("one") # => 1 filled_dict.get("four") # => None # The get method supports a default argument when the value is missing filled_dict.get("one", 4) # => 1 filled_dict.get("four", 4) # => 4 # note that filled_dict.get("four") is still => None # (get doesn't set the value in the dictionary) # set the value of a key with a syntax similar to lists filled_dict["four"] = 4 # now, filled_dict["four"] => 4 # "setdefault()" inserts into a dictionary only if the given key isn't present filled_dict.setdefault("five", 5) # filled_dict["five"] is set to 5 filled_dict.setdefault("five", 6) # filled_dict["five"] is still 5 # Sets store ... well sets (which are like lists but can contain no duplicates) empty_set = set() # Initialize a "set()" with a bunch of values some_set = set([1, 2, 2, 3, 4]) # some_set is now set([1, 2, 3, 4]) # order is not guaranteed, even though it may sometimes look sorted another_set = set([4, 3, 2, 2, 1]) # another_set is now set([1, 2, 3, 4]) # Since Python 2.7, {} can be used to declare a set filled_set = {1, 2, 2, 3, 4} # => {1, 2, 3, 4} # Add more items to a set filled_set.add(5) # filled_set is now {1, 2, 3, 4, 5} # Do set intersection with & other_set = {3, 4, 5, 6} filled_set & other_set # => {3, 4, 5} # Do set union with | filled_set | other_set # => {1, 2, 3, 4, 5, 6} # Do set difference with - {1, 2, 3, 4} - {2, 3, 5} # => {1, 4} # Do set symmetric difference with ^ {1, 2, 3, 4} ^ {2, 3, 5} # => {1, 4, 5} # Check if set on the left is a superset of set on the right {1, 2} >= {1, 2, 3} # => False # Check if set on the left is a subset of set on the right {1, 2} <= {1, 2, 3} # => True # Check for existence in a set with in 2 in filled_set # => True 10 in filled_set # => False 10 not in filled_set # => True # Check data type of variable type(li) # => list type(filled_dict) # => dict type(5) # => int #################################################### # 3. Control Flow #################################################### # Let's just make a variable some_var = 5 # Here is an if statement. Indentation is significant in python! # prints "some_var is smaller than 10" if some_var > 10: print "some_var is totally bigger than 10." elif some_var < 10: # This elif clause is optional. print "some_var is smaller than 10." else: # This is optional too. print "some_var is indeed 10." """ For loops iterate over lists prints: dog is a mammal cat is a mammal mouse is a mammal """ for animal in ["dog", "cat", "mouse"]: # You can use {0} to interpolate formatted strings. (See above.) print "{0} is a mammal".format(animal) """ "range(number)" returns a list of numbers from zero to the given number prints: 0 1 2 3 """ for i in range(4): print i """ "range(lower, upper)" returns a list of numbers from the lower number to the upper number prints: 4 5 6 7 """ for i in range(4, 8): print i """ While loops go until a condition is no longer met. prints: 0 1 2 3 """ x = 0 while x < 4: print x x += 1 # Shorthand for x = x + 1 # Handle exceptions with a try/except block # Works on Python 2.6 and up: try: # Use "raise" to raise an error raise IndexError("This is an index error") except IndexError as e: pass # Pass is just a no-op. Usually you would do recovery here. except (TypeError, NameError): pass # Multiple exceptions can be handled together, if required. else: # Optional clause to the try/except block. Must follow all except blocks print "All good!" # Runs only if the code in try raises no exceptions finally: # Execute under all circumstances print "We can clean up resources here" # Instead of try/finally to cleanup resources you can use a with statement with open("myfile.txt") as f: for line in f: print line #################################################### # 4. Functions #################################################### # Use "def" to create new functions def add(x, y): print "x is {0} and y is {1}".format(x, y) return x + y # Return values with a return statement # Calling functions with parameters add(5, 6) # => prints out "x is 5 and y is 6" and returns 11 # Another way to call functions is with keyword arguments add(y=6, x=5) # Keyword arguments can arrive in any order. # You can define functions that take a variable number of # positional args, which will be interpreted as a tuple by using * def varargs(*args): return args varargs(1, 2, 3) # => (1, 2, 3) # You can define functions that take a variable number of # keyword args, as well, which will be interpreted as a dict by using ** def keyword_args(**kwargs): return kwargs # Let's call it to see what happens keyword_args(big="foot", loch="ness") # => {"big": "foot", "loch": "ness"} # You can do both at once, if you like def all_the_args(*args, **kwargs): print args print kwargs """ all_the_args(1, 2, a=3, b=4) prints: (1, 2) {"a": 3, "b": 4} """ # When calling functions, you can do the opposite of args/kwargs! # Use * to expand positional args and use ** to expand keyword args. args = (1, 2, 3, 4) kwargs = {"a": 3, "b": 4} all_the_args(*args) # equivalent to all_the_args(1, 2, 3, 4) all_the_args(**kwargs) # equivalent to all_the_args(a=3, b=4) all_the_args(*args, **kwargs) # equivalent to all_the_args(1, 2, 3, 4, a=3, b=4) # you can pass args and kwargs along to other functions that take args/kwargs # by expanding them with * and ** respectively def pass_all_the_args(*args, **kwargs): all_the_args(*args, **kwargs) print varargs(*args) print keyword_args(**kwargs) # Function Scope x = 5 def set_x(num): # Local var x not the same as global variable x x = num # => 43 print x # => 43 def set_global_x(num): global x print x # => 5 x = num # global var x is now set to 6 print x # => 6 set_x(43) set_global_x(6) # Python has first class functions def create_adder(x): def adder(y): return x + y return adder add_10 = create_adder(10) add_10(3) # => 13 # There are also anonymous functions (lambda x: x > 2)(3) # => True (lambda x, y: x ** 2 + y ** 2)(2, 1) # => 5 # There are built-in higher order functions map(add_10, [1, 2, 3]) # => [11, 12, 13] map(max, [1, 2, 3], [4, 2, 1]) # => [4, 2, 3] filter(lambda x: x > 5, [3, 4, 5, 6, 7]) # => [6, 7] # We can use list comprehensions for nice maps and filters [add_10(i) for i in [1, 2, 3]] # => [11, 12, 13] [x for x in [3, 4, 5, 6, 7] if x > 5] # => [6, 7] # You can construct set and dict comprehensions as well. {x for x in 'abcddeef' if x in 'abc'} # => {'a', 'b', 'c'} {x: x ** 2 for x in range(5)} # => {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} #################################################### # 5. Classes #################################################### # We subclass from object to get a class. class Human(object): # A class attribute. It is shared by all instances of this class species = "H. sapiens" # Basic initializer, this is called when this class is instantiated. # Note that the double leading and trailing underscores denote objects # or attributes that are used by python but that live in user-controlled # namespaces. You should not invent such names on your own. def __init__(self, name): # Assign the argument to the instance's name attribute self.name = name # Initialize property self.age = 0 # An instance method. All methods take "self" as the first argument def say(self, msg): return "{0}: {1}".format(self.name, msg) # A class method is shared among all instances # They are called with the calling class as the first argument @classmethod def get_species(cls): return cls.species # A static method is called without a class or instance reference @staticmethod def grunt(): return "*grunt*" # A property is just like a getter. # It turns the method age() into an read-only attribute # of the same name. @property def age(self): return self._age # This allows the property to be set @age.setter def age(self, age): self._age = age # This allows the property to be deleted @age.deleter def age(self): del self._age # Instantiate a class i = Human(name="Ian") print i.say("hi") # prints out "Ian: hi" j = Human("Joel") print j.say("hello") # prints out "Joel: hello" # Call our class method i.get_species() # => "H. sapiens" # Change the shared attribute Human.species = "H. neanderthalensis" i.get_species() # => "H. neanderthalensis" j.get_species() # => "H. neanderthalensis" # Call the static method Human.grunt() # => "*grunt*" # Update the property i.age = 42 # Get the property i.age # => 42 # Delete the property del i.age i.age # => raises an AttributeError #################################################### # 6. Modules #################################################### # You can import modules import math print math.sqrt(16) # => 4 # You can get specific functions from a module from math import ceil, floor print ceil(3.7) # => 4.0 print floor(3.7) # => 3.0 # You can import all functions from a module. # Warning: this is not recommended from math import * # You can shorten module names import math as m math.sqrt(16) == m.sqrt(16) # => True # you can also test that the functions are equivalent from math import sqrt math.sqrt == m.sqrt == sqrt # => True # Python modules are just ordinary python files. You # can write your own, and import them. The name of the # module is the same as the name of the file. # You can find out which functions and attributes # defines a module. import math dir(math) # If you have a Python script named math.py in the same # folder as your current script, the file math.py will # be loaded instead of the built-in Python module. # This happens because the local folder has priority # over Python's built-in libraries. #################################################### # 7. Advanced #################################################### # Generators # A generator "generates" values as they are requested instead of storing # everything up front # The following method (*NOT* a generator) will double all values and store it # in `double_arr`. For large size of iterables, that might get huge! def double_numbers(iterable): double_arr = [] for i in iterable: double_arr.append(i + i) return double_arr # Running the following would mean we'll double all values first and return all # of them back to be checked by our condition for value in double_numbers(range(1000000)): # `test_non_generator` print value if value > 5: break # We could instead use a generator to "generate" the doubled value as the item # is being requested def double_numbers_generator(iterable): for i in iterable: yield i + i # Running the same code as before, but with a generator, now allows us to iterate # over the values and doubling them one by one as they are being consumed by # our logic. Hence as soon as we see a value > 5, we break out of the # loop and don't need to double most of the values sent in (MUCH FASTER!) for value in double_numbers_generator(xrange(1000000)): # `test_generator` print value if value > 5: break # BTW: did you notice the use of `range` in `test_non_generator` and `xrange` in `test_generator`? # Just as `double_numbers_generator` is the generator version of `double_numbers` # We have `xrange` as the generator version of `range` # `range` would return back and array with 1000000 values for us to use # `xrange` would generate 1000000 values for us as we request / iterate over those items # Just as you can create a list comprehension, you can create generator # comprehensions as well. values = (-x for x in [1, 2, 3, 4, 5]) for x in values: print(x) # prints -1 -2 -3 -4 -5 to console/terminal # You can also cast a generator comprehension directly to a list. values = (-x for x in [1, 2, 3, 4, 5]) gen_to_list = list(values) print(gen_to_list) # => [-1, -2, -3, -4, -5] # Decorators # A decorator is a higher order function, which accepts and returns a function. # Simple usage example – add_apples decorator will add 'Apple' element into # fruits list returned by get_fruits target function. def add_apples(func): def get_fruits(): fruits = func() fruits.append('Apple') return fruits return get_fruits @add_apples def get_fruits(): return ['Banana', 'Mango', 'Orange'] # Prints out the list of fruits with 'Apple' element in it: # Banana, Mango, Orange, Apple print ', '.join(get_fruits()) # in this example beg wraps say # Beg will call say. If say_please is True then it will change the returned # message from functools import wraps def beg(target_function): @wraps(target_function) def wrapper(*args, **kwargs): msg, say_please = target_function(*args, **kwargs) if say_please: return "{} {}".format(msg, "Please! I am poor :(") return msg return wrapper @beg def say(say_please=False): msg = "Can you buy me a beer?" return msg, say_please print say() # Can you buy me a beer? print say(say_please=True) # Can you buy me a beer? Please! I am poor


'Deprecated > Python' 카테고리의 다른 글

Python OSX Path 설정  (0) 2023.10.23
간단한 파일 입출력 모듈  (0) 2018.06.12
Numpy array 갖고 놀기  (0) 2018.03.18
numpy.random 함수들  (0) 2018.03.18
Binary to String, String to Binary  (0) 2018.03.09

t = numpy.array([0, 1, 2, 3, 4, 5, 6])


t.ndim # 몇 차원(Rank)인가?

-> 1


t.shape # Array의 모양(Shape)은 어떻게 생겼나?

-> (7, 0)


t[0] # 0 인덱스의 값

-> 0


t[1] # 1 인덱스의 값

-> 1


t[-1] # 맨 뒷 인덱스의 값

-> 6


t[2:5] # 2~5 미만 까지의 값을 잘라서 생성

-> [2, 3, 4]


t[4:-1] # 4~마지막 미만 까지의 값을 잘라서 생성

-> [4, 5]


t[:2] # 처음부터 2 미만 까지의 값을 잘라서 생성

-> [0, 1]


t[3:] # 3부터 마지막 까지의 값을 잘라서 생성

-> [3, 4, 5, 6]


-------------------------------------------------------


t = numpy.array([0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11])

t.ndim

-> 2


t.shape

-> (4, 3)


t[:, 2]

-> [2, 5, 8, 11]


-------------------------------------------------------


참고자료:

https://youtu.be/ZYX0FaqUeN4

'Deprecated > Python' 카테고리의 다른 글

간단한 파일 입출력 모듈  (0) 2018.06.12
30분만에 파이썬 배우기.  (0) 2018.05.02
numpy.random 함수들  (0) 2018.03.18
Binary to String, String to Binary  (0) 2018.03.09
넘파이 (Numpy) 함수들  (0) 2017.01.13

numpy.random.seed / 어떤 특정한 시작 숫자를 정해주어 난수를 발생, 그 다음에 만들어지는 난수


numpy.random.rand / 0.0~1.0 사이의 난수 생성


numpy.random.shuffle / 데이터의 순서 바꾸기


numpy.random.choice / 샘플링, 데이터 집합에서 일부를 무작위로 선택함


numpy.random.randint / 주어진 최소/최대 범위 안에서 임의의 난수를 추출한다. 


numpy.random.rand / 균등분포에서 표본을 추출한다. 


numpy.random.randn / 기댓값이 0이고 표준편차가 1인 가우시안 표준 정규 분포를 따르는 난수를 


numpy.unique, bincount / 난수가 정수 값이라면 데이터 값 분석


numpy.bincount / bincount에 minlength를 설정하여 0부터 minlength-1까지 숫자에 대해 각 카운트 한다.


random.randrange(x,y) / x부터 y까지의 숫자를 random하게 뽑는다


numpy.random.normal / 정규분포로부터 무작위 샘플을 만듬


numpy.random.binomial / 이항분포로부터 무작위 표본 추출


numpy.random.poisson / 포아송분포로부터 무작위 표본 추출


'Deprecated > Python' 카테고리의 다른 글

30분만에 파이썬 배우기.  (0) 2018.05.02
Numpy array 갖고 놀기  (0) 2018.03.18
Binary to String, String to Binary  (0) 2018.03.09
넘파이 (Numpy) 함수들  (0) 2017.01.13
Python에서 차트 그리기  (0) 2016.11.02

MongoDB를 백업하는 방법에는 Journaling을 지원하는 Block 장치일 경우 snapshot, lock & fsync, mongodump & mongorestore 등의 여러 가지가 있다. mongo.org 에 의하면 증분 백업(incremental backup)을 지원하지는 않고 있으며, 아직까지 이러한 기능을 수행하는 도구 또한 존재하지 않는 상황이다.




데이터베이스 엔진이 중단되지 않아야 하는 상황의 경우 dump & restore를 통한 방법이 일반적이므로 아래에 그 사용법에 대해 정리해 둔다. 이 방식은 쉽게 표현하자면 단순히 레코드 단위로  백업(dump)을 받고, 복구시에도 레코드 단위로 insert를 반복적으로 수행하게 된다.




[mongodump]


# 전체 데이터베이스 Full backup


/mongo/bin/mongodump --out /mongobackup/20120901 --oplog --host 10.10.0.10 --port 28017 -uuser -ppass




* 특정 데이터베이스 스키마만 백업할 경우에는 --db dbsname 옵션을 사용한다.


* --oplog 옵션은 백업이 진행되고 있는 도중에 발생한 트랜잭션에 대한 데이터를 별도로 처리하여 누락되는 백업데이터가 없도록 해 주는 기능이다.


* 백업이 끝나면 /mongobackup/20120901 디렉토리에 각 데이터베이스 스키마별로 서브디렉토리가 생성되어 컬렉션별로 .bson 파일들이 생성된다.


* 용량과 서버 성능에 따라 수십분 내지 수시간이 걸릴 수 있으며, 백업되는 디스크의 용량도 수백GB 또는 수TB까지도 사용 가능하여야 할 수도 있다.




[mongorestore]


# 전체 데이터베이스 Full restore


/mongo/bin/mongorestore --host 10.10.0.10 --port 28017 -uuser -ppass --oplog --drop  /mongobackup/20120901/




* 특정 데이터베이스 스키마만 복구하려면 아래와 같이 수행한다. 백업디렉토리의 하위 디렉토리 위치에 대상 데이터베이스명을 정확히 기입하여야 한다.


/mongo/bin/mongorestore --host 10.10.0.10 --port 28017 -uuser -ppass --drop --db dbname /mongobackup/20120901/dbname/




* --drop 옵션은 복구시에 해당 컬렉션을 삭제하는 방식이다. 즉 복구시에 동일한 컬렉션이 존재할 경우 컬렉션을 초기화하고 dump된 데이터만을 채워 넣으므로, dump 이후에 저장된 데이터는 소실됨을 의미하므로, 데이터베이스 전체를 dump된 시점으로 되돌릴 때 사용한다.


*  데이터베이스 개별 복구일 경우 --oplog 옵션은 적용되지 않는다.




출처: http://bryans.tistory.com/73 [Barracuda MemoLog]

'Developments > MongoDB' 카테고리의 다른 글

몽고DB 맥(OSX)에 설치 및 실행  (0) 2019.08.10
GridFS를 이용한 대용량 도큐먼트 처리  (0) 2018.03.09
몽고DB 설치 on Ubuntu  (0) 2016.10.31
pymongo 도움말  (0) 2016.08.07
몽고DB 스키마 디자인  (0) 2016.08.05

간단하다.


Code snippets to show you how to convert string to bytes and vice versa.

1. To convert a string to bytes.

data = ""  			#string
data = "".encode()	#bytes
data = b"" 			#bytes

2. To convert bytes to a String.

data = b""  		#bytes
data = b"".decode() #string
data = str(b"")  	#string

P.S Tested with Python 3.4.3


'Deprecated > Python' 카테고리의 다른 글

Numpy array 갖고 놀기  (0) 2018.03.18
numpy.random 함수들  (0) 2018.03.18
넘파이 (Numpy) 함수들  (0) 2017.01.13
Python에서 차트 그리기  (0) 2016.11.02
파이썬 유용한 모듈  (0) 2016.10.14

MongoDB의 Document의 최대 크기는 16Mb이다.


만약 위의 사이즈를 초과하게 되면 도큐먼트 삽입이 그대로 무시된다.


미디어(영상 및 음악) 파일을 제외하더라도 하나의 도큐먼트가 16Mb를 넘는 경우는 허다하다.


예를 들어 2001년 부터 2018년까지의 삼성전자 주식의 5분봉을 받아 온다고 가정하자.


단순히 OHLC 데이터만 해도 5분봉 하나에 Double 형태 4개 = 8 * 4 = 32byte이다.


1시간에 12 * 32byte, 하루에 24 * 12 * 32byte = 9216byte, 1년에 3,363,840byte로 3메가를 단숨에 넘어간다.


위의 경우에는 Collection을 5분봉으로 잡고 그안에 Document를 개별로 OHLC로 만들 수도 있겠지만..


이는 매우 바보같은 생각이라 본다.



그럼 MongoDB에서는 이러한 것을 어떻게 해결할까?


바로 직접 파일저장소를 제어하여 저장하는 것이다.


직접 폴더를 정해놓고 파일명으로써 관리 할 수도 있지만 이는 백업&복구시 누락이 될 수도 있는 단점이 있다.


그리하여 MongoDB에서는 GridFS라는 것을 제공한다.


GridFS를 이용하면 다음과 같은 이점이 있다.


1. 파일을 저장하는 구조를 단순화 할 수 있다.

2. 별도의 파일 저장소를 만들 필요가 없다.

3. 안정성을 위한 복제, 샤딩등의 기능을 그대로 적용할 수 있어서 분산과 장애복구가 용이하다.

4. 대용량의 파일을 저장할 때 생기는 파일시스템의 문제(FAT32인지 NTFS인지의 문제)가 발생하지 않는다.


무엇보다도 사용법이 매우 간단하므로 쓰지 않을 이유가 없다.


아래 링크를 통해서 사용법을 익히도록 하자.


http://api.mongodb.com/python/current/examples/gridfs.html

'Developments > MongoDB' 카테고리의 다른 글

몽고DB 맥(OSX)에 설치 및 실행  (0) 2019.08.10
몽고DB 백업 및 복구하기  (0) 2018.03.16
몽고DB 설치 on Ubuntu  (0) 2016.10.31
pymongo 도움말  (0) 2016.08.07
몽고DB 스키마 디자인  (0) 2016.08.05

윈도우즈에서는 텐서플로우를 매우 쉽게 설치할 수 있다.


먼저 아나콘다 64Bit를 통하여 python 3.5 or 3.6을 설치 한다.

https://www.anaconda.com/download/


CUDA 9.0을 설치한다.


cuDNN 7.0을 설치한다.

cuDNN을 다운로드 받아 압축을 풀면 bin, include, lib 폴더가 나온다.

c:\Program Files\Nvidia Computing Toolkit\CUDA 폴더 안에 v8.0, v9.0등의 폴더가 존재하는데

CUDA 9.0을 설치했으므로 v9.0 폴더 안에 압축을 풀고 나온 데이터들을 덮어쓰기 한다.



그런 다음 텐서플로우는 아래 링크를 따라가서 순차적으로 진행하면 바로 끝난다.

https://www.tensorflow.org/install/install_windows



원문: https://docs.scipy.org/doc/numpy/reference/routines.array-manipulation.html


Array manipulation routines


Basic operations

copyto(dst, src[, casting, where]) Copies values from one array to another, broadcasting as necessary.


Changing array shape

reshape(a, newshape[, order]) Gives a new shape to an array without changing its data.
ravel(a[, order]) Return a contiguous flattened array.
ndarray.flat A 1-D iterator over the array.
ndarray.flatten([order]) Return a copy of the array collapsed into one dimension.


Transpose-like operations

moveaxis(a, source, destination) Move axes of an array to new positions.
rollaxis(a, axis[, start]) Roll the specified axis backwards, until it lies in a given position.
swapaxes(a, axis1, axis2) Interchange two axes of an array.
ndarray.T Same as self.transpose(), except that self is returned if self.ndim < 2.
transpose(a[, axes]) Permute the dimensions of an array.


Changing number of dimensions

atleast_1d(*arys) Convert inputs to arrays with at least one dimension.
atleast_2d(*arys) View inputs as arrays with at least two dimensions.
atleast_3d(*arys) View inputs as arrays with at least three dimensions.
broadcast Produce an object that mimics broadcasting.
broadcast_to(array, shape[, subok]) Broadcast an array to a new shape.
broadcast_arrays(*args, **kwargs) Broadcast any number of arrays against each other.
expand_dims(a, axis) Expand the shape of an array.
squeeze(a[, axis]) Remove single-dimensional entries from the shape of an array.


Changing kind of array

asarray(a[, dtype, order]) Convert the input to an array.
asanyarray(a[, dtype, order]) Convert the input to an ndarray, but pass ndarray subclasses through.
asmatrix(data[, dtype]) Interpret the input as a matrix.
asfarray(a[, dtype]) Return an array converted to a float type.
asfortranarray(a[, dtype]) Return an array laid out in Fortran order in memory.
ascontiguousarray(a[, dtype]) Return a contiguous array in memory (C order).
asarray_chkfinite(a[, dtype, order]) Convert the input to an array, checking for NaNs or Infs.
asscalar(a) Convert an array of size 1 to its scalar equivalent.
require(a[, dtype, requirements]) Return an ndarray of the provided type that satisfies requirements.


Joining arrays

concatenate((a1, a2, ...)[, axis]) Join a sequence of arrays along an existing axis.
stack(arrays[, axis]) Join a sequence of arrays along a new axis.
column_stack(tup) Stack 1-D arrays as columns into a 2-D array.
dstack(tup) Stack arrays in sequence depth wise (along third axis).
hstack(tup) Stack arrays in sequence horizontally (column wise).
vstack(tup) Stack arrays in sequence vertically (row wise).


Splitting arrays

split(ary, indices_or_sections[, axis]) Split an array into multiple sub-arrays.
array_split(ary, indices_or_sections[, axis]) Split an array into multiple sub-arrays.
dsplit(ary, indices_or_sections) Split array into multiple sub-arrays along the 3rd axis (depth).
hsplit(ary, indices_or_sections) Split an array into multiple sub-arrays horizontally (column-wise).
vsplit(ary, indices_or_sections) Split an array into multiple sub-arrays vertically (row-wise).


Tiling arrays

tile(A, reps) Construct an array by repeating A the number of times given by reps.
repeat(a, repeats[, axis]) Repeat elements of an array.


Adding and removing elements

delete(arr, obj[, axis]) Return a new array with sub-arrays along an axis deleted.
insert(arr, obj, values[, axis]) Insert values along the given axis before the given indices.
append(arr, values[, axis]) Append values to the end of an array.
resize(a, new_shape) Return a new array with the specified shape.
trim_zeros(filt[, trim]) Trim the leading and/or trailing zeros from a 1-D array or sequence.
unique(ar[, return_index, return_inverse, ...]) Find the unique elements of an array.


Rearranging elements

fliplr(m) Flip array in the left/right direction.
flipud(m) Flip array in the up/down direction.
reshape(a, newshape[, order]) Gives a new shape to an array without changing its data.
roll(a, shift[, axis]) Roll array elements along a given axis.
rot90(m[, k]) Rotate an array by 90 degrees in the counter-clockwise direction.

'Deprecated > Python' 카테고리의 다른 글

numpy.random 함수들  (0) 2018.03.18
Binary to String, String to Binary  (0) 2018.03.09
Python에서 차트 그리기  (0) 2016.11.02
파이썬 유용한 모듈  (0) 2016.10.14
아나콘다 업데이트 방법  (0) 2016.10.06

+ Recent posts