2016년 3월 27일 일요일

redis 로 nodejs session관리하기(passport 로 로그인 인증 관리 할 때)

1. redis 설치

On Mac
redis 서버 설치
brew install redis
redis 서버 실행
redis-server &
On ubuntu
sudo apt-get install redis-server

2. nodejs 서버 코드 수정: app.use(session({secret : 'session_secret_keys'})); 코드만 수정해주면 된다.
// required for passport
app.use(session({secret : 'session_secret_keys'}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

==>

var redis = require('redis')
redisStore = require('connect-redis')(session)

var client = redis.createClient()
app.use(session({
    secret: 'session_secret_keys',
store: new redisStore({ host: 'localhost', port: 6379, client: client }),
saveUninitialized: false, // don't create session until something stored,
resave: false // don't save session if unmodified
}));

app.use(passport.initialize());
app.use(passport.session());
app.use(flash());


3. npm package install
redis, connect-redis 두 개의 패키지를 설치해 준다.
npm install redis connect-redis --save

4. 이제 nodejs서버를 실행하면 서버를 재시작해도 session이 유지됨을 확인할 수 있다.

참고:

https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/

2016년 3월 18일 금요일

Browser unit test with Selenium + Nightwatch.js


툴선택

웹서비스 개발을 하면서 보다 편하게 브라우저 상에서 테스트를 진행하기 위해 여러 툴들을 찾아본 결과 Selenium과 Nightwatch.js 를 채용하기로 결정을 했다. 먼저 각각에 대하여 간단하게 알아보자.
  1. Selenium: 브라우저 상에서 일어나는 행위들을 자동으로 동작시키거나, 값들을 체크할 수 있다. Selenium은 목적에 따라 크게 두 개로 구성되어 있다. 하나는 Selenium WebDriver이고 다른 하나는 Selenium IDE이다.
    • Selenium WebDriver: 다양한 언어로 브라우저를 컨트롤 하고 테스트할 수 있는 인터페이스를 제공한다. 따라서 웹서비스를 개발하는 언어에 통합해 UnitTest를 생성하고 통합테스트를 진행할 수 있다.
    • Selenium IDE: firefox plug-in으로 브라우저를 통해 쉽게 testcase를 기록하고, 테스트를 할 수 있다. java/python/ruby와 같은 언어로 생성한 testcase를 추출해 낼 수도 있다.
  2. Nightwatch.js
    • Node.js를 기반으로 하는 browser 앱 테스트 솔루션이다. Selenium WebDriver API를 통해 브라우저에 명령을 내린다.

준비물

Selenium WebDriver를 통해 다양한 브라우저를 통한 UnitTest를 생성하고 테스트를 진행할 수 있다. 여기서는 Chrome을 통한 테스트를 만들어보도록 하자

1. Nightwatch.js
npm을 통해 설치하거나, 
$ npm install nightwatch
$ git clone git@github.com:nightwatchjs/nightwatch.git
$ cd nightwatch
$ npm install

2. Selenium WebDriver:
selenium다운로드 페이지에서 Selenium Standalong Server를 다운로드한다. jar로 되어 있기 때문에 JAVA가 설치되어 있어야 한다.

3. ChromeDriver - WebDriver for Chrome
selenium다운로드 페이지 하단에 보면 Third Party Browser Driver들을 다운로드할 수 있는 링크가 있다. 아니면 직접 구글페이지에 가서 다운로드 받을 수 있다.

시작하기

이제 테스트를 시작해보자. 테스트를 생성할 프로젝트 디렉토리를 만들고, 아래와 같이 testNightwatchjs/bin 디렉토리 아래에 Selenium Webdriver와 chromedriver를 둔다. 다음으로 testcase를 저장할 tests디렉토리를 만든다. 그리고 다음과 같이 nightwatch.json 으로 설정 파일을 만든다. 여기서 server_path와 webdrive.chrome.driver는 실제 파일이 있는 경로를 입력한다. 그리고 start_process 값을 true로 해 준다. 이 값을 false로 할 경우에는 selenium server를 별도로 수행하거나 localhost가 아닌 다른 컴퓨터에 selenium server가 존재할 경우 설정한다.
{
        "src_folders" : ["tests"],
                "output_folder" : "reports",
                "custom_commands_path" : "",
                "custom_assertions_path" : "",
                "page_objects_path" : "",
                "globals_path" : "",
                "selenium" : {
                        "start_process" : true,
                        "server_path" : "./selenium-server-standalone-2.53.0.jar",
                        "log_path" : "",
                        "host" : "127.0.0.1",
                        "port" : 4444,
                        "cli_args" : {
                                "webdriver.chrome.driver" : "./chromedriver",
                                "webdriver.ie.driver" : ""
                        }
                },
                "test_settings" : {
                        "default" : {
                                "launch_url" : "http://localhost",
                                "selenium_port"  : 4444,
                                "selenium_host"  : "localhost",
                                "silent": true,
                                "screenshots" : {
                                        "enabled" : false,
                                        "path" : ""
                                },
                                "desiredCapabilities": {
                                        "browserName": "firefox",
                                        "javascriptEnabled": true,
                                        "acceptSslCerts": true
                                }
                        },
                        "chrome" : {
                                "desiredCapabilities": {
                                        "browserName": "chrome",
                                        "javascriptEnabled": true,
                                        "acceptSslCerts": true
                                }
                        }
                }
}

다음으로 testcase코드를 만들어보자. tests 폴더 아래에 google.js파일을 다음과 같이 생성한다.
module.exports = {
'Demo test Google' : function (browser) {
browser
.url('http://www.google.com')
.waitForElementVisible('body', 1000)
.setValue('input[type=text]', ['nightwatch', browser.Keys.ENTER])
.waitForElementVisible('button[name=btnG]', 3000)
.click('button[name=btnG]')
.pause(1000)
.assert.containsText('#main', 'Night Watch')
.end();
}
};

여기까지 하면 디렉토리 구조가 다음과 같다.
testNightwatchjs/
├── bin
│   ├── chromedriver
│   └── selenium-server-standalone-2.53.0.jar
├── nightwatch.json
└── tests
    └── google.js

이제 nightwatch를 콘솔에서 입력해 테스트를 수행해보자. firefox 브라우저가 실행되고 google에서 nightwatch를 검색하고 테스트를 마친다.
nightwatch 
Starting selenium server... started - PID:  95618
[Google] Test Suite
===================
Running:  Demo test Google
  Element <body> was visible after 270 milliseconds.
  Element <button[name=btnG]> was visible after 1060 milliseconds.
  Testing if element <#main> contains text: "Night Watch".
OK. 3 assertions passed. (9.792s)

reports 디렉토리가 생기고, 그 아래에 테스트를 구행한 브라우저와 os, testcase이름으로 된 파일에 테스트 수행결과가 정리되어 있음을 확인할 수 있다.

testNightwatchjs/
├── bin
│   ├── chromedriver
│   └── selenium-server-standalone-2.53.0.jar
├── nightwatch.json
├── reports
│   ├── CHROME_49.0.2623.87_MAC_google.xml
│   └── FIREFOX_45.0.1_MAC_google.xml
├── selenium-debug.log
└── tests
    └── google.js

chrome으로 테스트를 수행하기 위해서는 다음과 같이 명령을 내리면 된다.


nightwatch  --env chrome

firefox와 chrome으로 테스트를 수행하기 위해서는 다음과 같이 명령을 내리면 된다.


nightwatch  --env default,chrome
이런 명령도 가능하다.


nightwatch  --env default,chrome,chrome,chrome,chrome
테스트 케이스를 만들기 위해서는 화면 내에서 특정 요소를 선택해, 다음과 같은 작업들을 수행해 테스트케이스를 만든다.

  • 동작을 수행
  • 값을 변경
  • 원하는 요소가 맞는지 확인

이와 관련한 자료들은 쉽게 찾을 수 있기 때문에 여기서는 생략하고 웹서비스 페이지 내에서 Javascript Ojbect값을 검사하는 코드예제를 살펴보자. Nightwatch.js의 execute명령을 통해 브라우저에서 javascript 코드를 수행하고, 이 결과를 testcase에서 얻어올 수 있다. 아래 코드는 페이지에서 user Object를 받아서 name이 'testname'이고, id가 'testid'인지 확인한다.
client.execute("return window.user;", [], function(response) {
    var loginUser = response.value;
    this.assert.ok(loginUser.name, 'testname');
    this.assert.ok(loginUser.id, 'testid');
});


참고

http://nightwatchjs.org/guide
http://www.slideshare.net/sethmcl/join-the-darkside-nightwatchjs
http://techblog.daliworks.net/Nightwatchjs/
http://techblog.daliworks.net/Nightwatchjs-part2/

2016년 2월 10일 수요일

sphinx 로 python api문서 만들기.

1. Sphinx

python 으로 개발을 하면서 javadoc와 같은 역할을 하는 문서생성 툴을 찾다 보니 sphinx가 가장 널리 사용되는 툴이라서 간단한 사용법을 정리한다.

먼저 Sphinx에 대한 소개는 다음과 같다.
Sphinx is a tool that makes it easy to create intelligent and beautiful documentation, written by Georg Brandl and licensed under the BSD license.

Sphinx: http://www.sphinx-doc.org/en/stable/index.html
Sphinx autodoc - automated API documentation: http://www.slideshare.net/shimizukawa/sphinx-autodoc-automated-api-documentation-europython-2015-in-bilbao

2.  Sphinx 설치

아래 명령으로 Sphinx를 설치한다.
pip install -U Sphinx

3. 샘플 python project 디렉토리

다음에서 http://pythonhosted.org/an_example_pypi_project/sphinx.html#full-code-example 샘플 코드를 아래와 같이 생성한다.

testSphinx/

└── an_example_pypi_project

    ├── __init__.py

    ├── useful_1.py

    └── useful_2.py



1 directory, 3 files

4. docs 디렉토리 및 sphinx-quickstart 데이터 생성

4.1 docs 디렉토리 생성

다음과 같이 문서를 저장할 docs디렉토리를 생성한다.
aljeon@aljeon-computing:~/workspace/testSphinx$ ls

an_example_pypi_project

aljeon@aljeon-computing:~/workspace/testSphinx$ mkdir docs

aljeon@aljeon-computing:~/workspace/testSphinx$ cd docs/

4.2 sphinx-quickstart 실행

aljeon@aljeon-computing:~/workspace/testSphinx/docs$ sphinx-quickstart 
Welcome to the Sphinx 1.3.5 quickstart utility.
Please enter values for the following settings (just press Enter to
accept a default value, if one is given in brackets).
Enter the root path for documentation.
> Root path for the documentation [.]: 
=> 현재 docs디렉토리에 있기 때문에 엔터를 친다.
You have two options for placing the build directory for Sphinx output.
Either, you use a directory "_build" within the root path, or you separate
"source" and "build" directories within the root path.
> Separate source and build directories (y/n) [n]: y
=> y를 입력하면 source(설정파일들의 위치)와 build(결과물의 위치)를 분리하고 기본값인 n을 입력하면 하나의 디렉토리에 그대로 저장된다. 관리의 편리성을 위해 y를 입력해 둘을 분리했다.
Inside the root directory, two more directories will be created; "_templates"
for custom HTML templates and "_static" for custom stylesheets and other static
files. You can enter another prefix (such as ".") to replace the underscore.
> Name prefix for templates and static dir [_]: 
The project name will occur in several places in the built documentation.
> Project name: sphinx doc example
> Author name(s): alife.jeon
=> 프로젝트 이름과 작성자를 입력한다.
Sphinx has the notion of a "version" and a "release" for the
software. Each version can have multiple releases. For example, for
Python the version is something like 2.5 or 3.0, while the release is
something like 2.5.1 or 3.0a1.  If you don't need this dual structure,
just set both to the same value.
> Project version: 0.1
> Project release [0.1]: 
If the documents are to be written in a language other than English,
you can select a language here by its language code. Sphinx will then
translate text that it generates into that language.
For a list of supported codes, see
http://sphinx-doc.org/config.html#confval-language.
> Project language [en]: 
The file name suffix for source files. Commonly, this is either ".txt"
or ".rst".  Only files with this suffix are considered documents.
> Source file suffix [.rst]: 
One document is special in that it is considered the top node of the
"contents tree", that is, it is the root of the hierarchical structure
of the documents. Normally, this is "index", but if your "index"
document is a custom template, you can also set this to another filename.
> Name of your master document (without suffix) [index]: 
Sphinx can also add configuration for epub output:
> Do you want to use the epub builder (y/n) [n]: 
Please indicate if you want to use one of the following Sphinx extensions:
> autodoc: automatically insert docstrings from modules (y/n) [n]: y
> doctest: automatically test code snippets in doctest blocks (y/n) [n]: y
> intersphinx: link between Sphinx documentation of different projects (y/n) [n]: y
> todo: write "todo" entries that can be shown or hidden on build (y/n) [n]: y
> coverage: checks for documentation coverage (y/n) [n]: y
> pngmath: include math, rendered as PNG images (y/n) [n]: 
> mathjax: include math, rendered in the browser by MathJax (y/n) [n]: 
> ifconfig: conditional inclusion of content based on config values (y/n) [n]: 
> viewcode: include links to the source code of documented Python objects (y/n) [n]: y
=> 필요에 따라 기본값을 그대로 두던가 설정을 변경한다.
A Makefile and a Windows command file can be generated for you so that you
only have to run e.g. `make html' instead of invoking sphinx-build
directly.
> Create Makefile? (y/n) [y]: 
=> Linux 일 경우 y
> Create Windows command file? (y/n) [y]: y
=> Windows 일 경우 y
Creating file ./source/conf.py.
Creating file ./source/index.rst.
Creating file ./Makefile.
Creating file ./make.bat.
Finished: An initial directory structure has been created.
You should now populate your master file ./source/index.rst and create other documentation
source files. Use the Makefile to build the docs, like so:
   make builder
where "builder" is one of the supported builders, e.g. html, latex or linkcheck.
aljeon@aljeon-computing:~/workspace/testSphinx/docs$ 

4.3 결과

현재까지 진행한 결과 다음과 같은 디렉토리와 파일들이 생긴다.
testSphinx/
├── an_example_pypi_project
│   ├── __init__.py
│   ├── useful_1.py
│   └── useful_2.py
└── docs
    ├── build
    ├── make.bat
    ├── Makefile
    └── source
        ├── conf.py
        ├── index.rst
        ├── _static
        └── _templates
6 directories, 7 files

5. html 문서 생성

docs 디렉토리에서 make html 명령을 수행하면 docs/build/html 아래에 html문서가 생긴다.
aljeon@aljeon-computing:~/workspace/testSphinx/docs$ make html
sphinx-build -b html -d build/doctrees   source build/html
Running Sphinx v1.3.5
making output directory...
loading pickled environment... not yet created
loading intersphinx inventory from https://docs.python.org/objects.inv...
building [mo]: targets for 0 po files that are out of date
building [html]: targets for 1 source files that are out of date
updating environment: 1 added, 0 changed, 0 removed
reading sources... [100%] index                                                                                                                                                                       
looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
writing output... [100%] index                                                                                                                                                                        
generating indices... genindex
writing additional pages... search
copying static files... done
copying extra files... done
dumping search index in English (code: en) ... done
dumping object inventory... done
build succeeded.

docs/build/html/index.html을 브라우저에서 열여보면 다음과 같은 화면을 볼 수 있다.

하지만 Module Index를 클릭해보면 모듈 API문서가 생성되지 않았음을 확인할 수 있다.

6. 모듈 API 문서 생성

6.1 sphinx-apidoc 수행

모듈 API문서를 생성하기 위해서는 sphinx-apidoc 명령을 통해 각 모듈에 해당하는 rst문서를 만들어주어야 한다.
다음과 같은 명령을 수행한다.
aljeon@aljeon-computing:~/workspace/testSphinx$ sphinx-apidoc -f -o docs/source/ an_example_pypi_project/
Creating file docs/source/an_example_pypi_project.rst.
Creating file docs/source/modules.rst.
결과로 modules.rst와 an_example_pypi_project.rst가 생성된 것을 확인할 수 있다.
testSphinx/
├── an_example_pypi_project
│   ├── __init__.py
│   ├── useful_1.py
│   └── useful_2.py
└── docs
    ├── build
    │   ├── doctrees
    │   │   ├── environment.pickle
    │   │   └── index.doctree
    │   └── html
    │       ├── genindex.html
    │       ├── index.html
    │       ├── objects.inv
    │       ├── search.html
    │       ├── searchindex.js
    │       ├── _sources
    │       │   └── index.txt
    │       └── _static
    │           ├── ajax-loader.gif
    │           ├── alabaster.css
    │           ├── basic.css
    │           ├── comment-bright.png
    │           ├── comment-close.png
    │           ├── comment.png
    │           ├── doctools.js
    │           ├── down.png
    │           ├── down-pressed.png
    │           ├── file.png
    │           ├── jquery-1.11.1.js
    │           ├── jquery.js
    │           ├── minus.png
    │           ├── plus.png
    │           ├── pygments.css
    │           ├── searchtools.js
    │           ├── underscore-1.3.1.js
    │           ├── underscore.js
    │           ├── up.png
    │           ├── up-pressed.png
    │           └── websupport.js
    ├── make.bat
    ├── Makefile
    └── source
        ├── an_example_pypi_project.rst
        ├── conf.py
        ├── index.rst
        ├── modules.rst
        ├── _static
        └── _templates
10 directories, 38 files

6.2 module path 추가

다음으로 docs/source/conf.py 파일을 열고 아래 코드를 추가한다.
sys.path.insert(0, os.path.abspath('../..'))

6.3 html 생성

aljeon@aljeon-computing:~/workspace/testSphinx/docs$ make html
sphinx-build -b html -d build/doctrees   source build/html
Running Sphinx v1.3.5
/media/aljeon/workspace/testSphinx/docs/source
loading pickled environment... done
building [mo]: targets for 0 po files that are out of date
building [html]: targets for 0 source files that are out of date
updating environment: 0 added, 1 changed, 0 removed
reading sources... [100%] an_example_pypi_project                                                                                                                                                     
looking for now-outdated files... none found
pickling environment... done
checking consistency... /media/aljeon/workspace/testSphinx/docs/source/modules.rst:: WARNING: document isn't included in any toctree
done
preparing documents... done
writing output... [100%] modules                                                                                                                                                                      
generating indices... genindex py-modindex
highlighting module code... [100%] an_example_pypi_project                                                                                                                                            
writing additional pages... search
copying static files... done
copying extra files... done
dumping search index in English (code: en) ... done
dumping object inventory... done
build succeeded, 1 warning.
Build finished. The HTML pages are in build/html.

6.4 결과확인

모듈 페이지가 제대로 생성된 것을 확인할 수 있다.

7. 테마 변경

다음의 두 페이지를 참고로 doc 문서의 테마를 변경할 수 있다. 여기서는 sphinx_rtd_theme을 적용하는 것을 정리했다.
  • http://www.sphinx-doc.org/en/stable/theming.html
  • https://github.com/snide/sphinx_rtd_theme
다음 명령으로 sphinx_rtd_theme를 설치한다.
$ pip install sphinx_rtd_theme
conf.py를 열여서 파일 중간에 html_theme를 찾아 다음 코드로 대체한다.
import sphinx_rtd_theme

html_theme = "sphinx_rtd_theme"

html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
다시 docs 디렉토리로 가서 make html명령을 수행하고 docs/build/html/index.html을 브라우저에서 열면 다음과 같은 화면을 확인할 수 있다.

8. github sample

샘플 코드들은 github에서 확인할 수 있다.
https://github.com/shjeon78/testSphinx

참고:

Quick Sphinx documentation for Python: http://scriptsonscripts.blogspot.kr/2012/09/quick-sphinx-documentation-for-python.html
Sphinx for Python documentation: http://gisellezeno.com/tutorials/sphinx-for-python-documentation.html

2016년 1월 5일 화요일

sublimetext에서 git 연동하기

Sublime text에서 git 을 연동하기 위해서는 아래 사항들이 준비되어 있어야 한다.


  • git repository 준비
  • sublime text 설치
  • sublime text: Package control 설치
  • sublime text: git plug-in 설치


1. git repository 준비

Sublime text와 연동을 하기 위해서, 당연히 git 저장소가 필요하다. 다양한 방법이 있겠지만, 크게 외부 서비스를 활용하는 방법과 자체 저장소를 유지하는 방법이 있다. 외부 서비스를 사용할 때는 github이나 bitbucket, gitlab 등의 서비스가 있고, 자체 git저장소를 구성하기 위한 방법으로는 gitolite를 통해 설치하는 방법이 있다.

  • github이나 bitbucket, gitlab 비교: http://www.slant.co/topics/153/compare/~github_vs_bitbucket_vs_gitlab
  • gitolite 설치: http://gitolite.com/gitolite/index.html

2. sublime text 설치

http://www.sublimetext.com/ 에서 다운로드 받아서 설치를 하도록 한다.
sublime text는 2와 3이 있는데, 성능이나 안정성, 한글 인코딩 문제 등에 차이가 있으니 확인 후 잘 선택해야 한다.

3. sublime text: Package control 설치

sublime text에 plug-in을 설치하는 방법은 여러가지가 있지만 package control을 설치하고 이를 통하는 것이 가장 편하다.
먼저 단축키 ctrl+` 을 입력하거나 메뉴에서 View > Show Console 을 선택해 console창을 띄운다.

다음으로 브라우저 창에 https://packagecontrol.io/installation를 입력해 package control 설치 가이드 사이트로 이동한다.
여기서 sublime text 3 와 sublime text 2 가 설치하는 방법이 갈리는데,
sublime text 3 의 경우, 아래와 같은 명령을 복사해 console 창에 입력하고
import urllib.request,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

아래와 같이 하단 console바에 위 명령을 입력하면 아래와 같다.

엔터를 입력해 명령을 수행하면 package control이 설치된다.



sublime text 2는 아래와 같은 명령을 복사해 console 창에 입력한다.
import urllib2,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')

4. sublime text: git plug-in 설치

Package Control을 설치하고 나면 Control-Shift-P(맥에서는 Command-Shoft-P)를 눌러 Command Pallette를 수행한 뒤 install을 입력하면 나오는 하단 메뉴 중 Package Control: Install Package를 클릭하면 아래와 같이 plug-in을 설치할 수 있는 창이 뜬다.

git 를 입력하면 나오는 plug-in들 중에서 Git 을 선택해 plug-in을 설치한다.

Control-Shift-P(맥에서는 Command-Shoft-P)를 눌러 Command Pallette를 수행한 뒤 git 를 입력하면 아래와 같이 git 관련 명령들이 추가된 것을 확인할 수 있다.




2016년 1월 4일 월요일

Portable Format for Analytics (PFA) - 데이터 분석 모델 설명



1. 필요성: 데이터 분석을 위한 다양한 프레임워크와 라이브러리가 존재한다. 데이터의 크기와 특성 그리고 분석 목적에 따라 서로 다른 프레임워크나 라이브러리를 활용이 있을 수 있다. 또한 새로운 라이브러리의 출현으로 데이터 분석 코드의 구현이 달라질 수는 있다.
url: http://dmg.org/pfa/docs/motivation/pfatoeverything.png
하지만 데이터를 분석하는 행위의 본질은 크게 변하지 않는다. 따라서 새로운 시스템이나 프레임워크, 라이브러리의 출현에 따라 변하지 않는 데이터 분석에 대한 기술이 필요하다.

ur: http://dlib.net/ml_guide.svg

2. Portable Format for Analytics(PFA):  앞서 이야기한 분석 프로그램 구현과 독립적인 분석 모델에 대한 하나의 해결책으로 PFA를 활용할 수 있다. PFA는 입력/출력/액션 을 정의한 문서이다. http://dmg.org/pfa

  • 입력(input): 입력 값의 속성 이나 명칭 등을 정의
  • 출력(output): 출력 값의 속성을 정의
  • 액션(action): 출력값을 얻기 위한 입력 값에 적용할 액션(수식이나 분석 모델)을 정의
3. Hadrian : 앞서 소개한 PFA에는 모델을 설명하는 문서에 대한 spec.만 존재하고 이를 실제로 구현해놓고 있지는 않다. 이를 실제로 구현한 라이브러리를 하나 소개한다.