티스토리 뷰

학습경험 데이터를 xAPI형태로 저장하기 위한 ADLNET의 LRS Server 구축

진행하고 있는 프로젝트에서 사용자의 학습경험 데이터를 쌓고 분석하기 위한 표준 형태로 xAPI를 이용하기로 하였고, xAPI형태의 데이터를 효율적으로 저장, 검증, 관리, 이용하기 위해서 LRS를 구축해야 했다. xAPI란 학습환경에서 일어나는 경험을 문장으로 구성하여 학습 기록 저장소(Learning Record Store, LRS)에 저장하기 위한 과정을 정의하는 표준으로 LRS를 구축하기 위해선 이 xAPI에 대해 상당한 이해도가 필요하기 때문에 오픈소스를 찾던 중 Apache 라이선스 2인 ADL_LRS를 구축해보려 한다. 

 

xAPI에 대한 스펙은 이곳을 참고 https://github.com/adlnet/xAPI-Spec

 

adlnet/xAPI-Spec

Contribute to adlnet/xAPI-Spec development by creating an account on GitHub.

github.com

ADL_LRS에 대한 정보는 이곳을 보고 진행하였다 https://github.com/adlnet/ADL_LRS

 

adlnet/ADL_LRS

ADL's Open Source Learning Record Store (LRS) is used to store learning data collected with the Experience API. - adlnet/ADL_LRS

github.com

 

기본적으로 Ubuntu 14.04+ 환경으로 가이드 되어 있었으나, 여분의 Ubuntu 테스트 서버가 없어서 개인 PC에 설치하기 위해 확인해보니 windows환경으로 설치할 수 있도록 분기되어 있어서 해당 부분을 참고하였다. 그 외 내용을 살펴보면 데이터 저장을 위한 저장소로는 Postgres 9.6을, Django를 이용해 개발되어있어서 Python 2.7.6 버전을, LRS에서 사용하는 메시지 큐로는 RabbitMQ를(최신 버전을 설치함) 설치하였다. 

해당 github에서 아래의 내용을 담고있어서 참고하는 것이 좋을 것 같다. 그리고 windows 7, windows8.1 기준으로 작성된 내용이지만 windows10에서 설치하였고 이상 없이 동작함을 확인하였다.

이 버전은 안정적이지만 개념 증명으로 소수의 사용자 만 지원합니다. 프로그래밍 모범 사례를 사용하지만 엔터프라이즈 시스템을 대신하도록 설계되지 않았습니다.

1. Database 저장소 Postgres 9.6 설치

이곳에서 9.6.22 버전 windows x86-64을 다운로드한다.

Postgres 9.6.22 Windows버전 설치

설치는 어렵지 않았고, 몇 가지 단계만 캡처해서 확인해보자 아래와 같이 설치경로를 안내할 때 설치경로를 기억해두자, 가이드 대로는 C:\기준으로 설치되어있으나, 나는 Program Files에 설치하였고 해당 경로를 인지해두고 상황에 맞게 작업하였다.

Postgres 설치

슈퍼유저용 패스워드 및 패스워드 확인하는 부분이 있는데, 그냥 기억할만한 패스워드로 넣어두자 

패스워드 설정

포트는 기본 설정 그대로 5432로 설정해뒀다, LRS오픈소스 설정 파일에도 기본 포트로 지정되어있었다.

포트설정

Locale은 Korean, Korea로 설정을 바꾸긴 하였는데, 이후 언어에서 설정하는 시간과, DB의 시간의 차이로 문제가 발생할 수도 있을 것이라는 생각이 들었지만, 그냥 Korea로 설정하였다. 아마 설치하시는 분들은 그냥 기본 설정으로 두고, 이후 데이터를 활용할 때 가공해도 괜찮을 것 같다는 생각이 들기도 하였다. (물론 korea로 설정해도 문제가 없을 수도 있다.)

Locale설정

설치가 완료되면 Stack Builder를 설치하겠냐고 물어보는 게 있던데 무엇인지 잘 모르나, 가이드에도 설치를 해야 된다 아니다가 딱히 없어서 체크 해제를 하고 Finish버튼을 눌렀다.

설치완료

설치가 완료되면 cmd창(이후에도 계속 대부분의 실행은 우측 버튼을 눌러서 관리자모드로 실행하자)을 띄워서 가이드의 내용에 따라 아래의 내용을 수행해야 하는데, 조금 다른 부분이 있으니 아래에 실제 캡처 화면을 참고하자 <>로 쌓인 부분(사용자명, 패스워드)만 본인에 맞게 작성하면 된다, 

> cd c:\postgresql\pg96\bin
c:\postgresql\pg96\bin> createuser -U postgres -P -s <db_owner_name>

Enter password for new role: <db_owner_password>
Enter it again: <db_owner_password>

c:\postgresql\pg96\bin> psql -U postgres template1

template1=# CREATE DATABASE lrs OWNER <db_owner_name>;
template1=# \q (exits shell)

실제 수행내용

이렇게 되면 Postgres의 설치 및 설정은 끝이 났다.

 

2. Python 2.7.10 설치

가이드에서는 Python 2.7.6을 설치하라고 되어있지만 나는 설치하고 나서 보니 2.7.10이었으나 이상 없이 동작하였다.

이곳으로 가서 아래 캡처 화면을 참고해서 다운로드하자

Pyhton2.7.10 설치
Python2.7.10 윈도우 64비트용

다운로드한 파일을 설치하는데 그냥 기본 경로(C:\Python27)로 설치를 해도 가이드의 경로와 일치하였다. 전부 기본적으로 Next만해서 설치하였다. (캡처 생략) Python설치경로를 시스템 환경변수로 해당 설치 위치를 잡으면 편하겠지만, 가이드에서도 잡지 않고 하는것이 가이드 되어 있어서 별도로 환경변수로 잡지않고 진행하겠다.

 

일단 가이드는 아래와 같이 나와있는데, 저대로 하면 에러가 났었다. (pip버전 때문에 문제가 발생하는 듯)

> cd c:\python27\scripts
c:\python27\scripts> easy_install pip
c:\python27\scripts> pip install virtualenv
c:\python27\scripts> pip install fabric

 

이리저리 찾아보다가 성공한 방법은 아래와 같다. 일단 curl명령을 사용하기 위해 이곳에서 curl을 다운로드한다

그리고 압축을 풀고 cURL.exe 파일을 c:\windws\system32 , c:\windws\sysWOW64 두 군데 복사하여 , 콘솔에서 바로 사용할 수 있게 한다. 굳이 cURL을 다운로드하지 않아도 된다, 왜냐면 get-pip.py파일을 받기 위해서 이기 때문이다.

해당 파일은 여기 있다. 아래의 파일을 다운로드하여서 C:\Python27에 넣어둔다.

get-pip.py
1.82MB

curl를 설치해서 다운로드를 하겠다는 분은 이곳을 참고해서 curl를 설치하고 아래의 명령을 진행하면 위의 get-pip.py파일을 받을 수 있다.

c:\python27> curl -O https://bootstrap.pypa.io/pip/2.7/get-pip.py

cmd창에서 C:\Python27 경로로 이동하고 아래의 명령을 통해 pip를 설치하자

c:\python27> python get-pip.py
c:\python27> python -m pip install --upgrade "pip < 21.0"

그리고는 위에 작성해둔 가이드 내용 중에서 easy_install pip를 제외한 나머지 두 명령을 실행한다.

c:\python27\scripts> pip install virtualenv
c:\python27\scripts> pip install fabric

 

 

파이썬 설치 및 필요한 라이브러리 설치가 완료되었다.

 

3. LRS 설치 및 환경설정

LRS프로젝트를 구성할 워크스페이스 경로로 이동하여 git명령을 이용해서 프로젝트를 내려받는다. (git설치는 생략하겠다, 찾아보면 많이 나옴) 나는 E:\workspace에서 아래의 명령을 통해 프로젝트를 받았다.

E:\workspace> git clone https://github.com/adlnet/ADL_LRS.git
E:\workspace\> cd ADL_LRS
E:\workspace\ADL_LRS> cd adl_lrs
E:\workspace\ADL_LRS\adl_lrs> 

위의 최종 경로를 잘 확인하고 해당 경로에 settings.ini파일을 생성해서 아래 내용을 작성 및 등록한다. 아래가 예제 원본이다. database부분은 1번의 database설정 시 사용했던 이름과 패스워드를 넣고, email부분은 일단 잘 모르겠어서 구글 기준으로 작성했다. 아래 가이드 아래에 내가 작성한 내용을 다시 붙여 넣겠다.

 

[기본 제공 양식]

[database]
NAME: lrs
USER: <db_owner_name>
PASSWORD: <db_owner_password>
HOST: localhost
PORT: 5432


[email]
EMAIL_BACKEND: django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST: <email_host>
EMAIL_PORT: 465
EMAIL_HOST_USER: <email_host_user>
EMAIL_HOST_PASSWORD: <email_host_user_password>
EMAIL_USE_SSL: True


[debug]
DEBUG: True


[auth]
ALLOW_EMPTY_HTTP_AUTH: False
OAUTH_ENABLED: True


[hooks]
USE_HOOKS: False


[preferences]
SERVER_STMT_LIMIT: 100
STMTS_PER_PAGE: 10
TIME_ZONE: America/New_York
LANGUAGE_CODE: en-US


[secrets]
SECRET_KEY: <whatever key you want-just a string of characters>

[ampq]
USERNAME: <username_for_rabbitmq>
PASSWORD: <password_for_rabbitmq>
HOST: localhost
PORT: 5672
VHOST: <vhost_name>

[내가 작성한 내용] - 이메일 주소나 패스워드는 바꿔야 한다.

[database]
NAME: lrs
USER: {xxxx}
PASSWORD: {xxxx}
HOST: localhost
PORT: 5432


[email]
EMAIL_BACKEND: django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST: smtp.gmail.com
EMAIL_PORT: 587
EMAIL_HOST_USER: {xxxxxxxx@gmail.com}
EMAIL_HOST_PASSWORD: {xxxxxxxx}
EMAIL_USE_SSL: True


[debug]
DEBUG: True


[auth]
ALLOW_EMPTY_HTTP_AUTH: False
OAUTH_ENABLED: True


[hooks]
USE_HOOKS: False


[preferences]
SERVER_STMT_LIMIT: 100
STMTS_PER_PAGE: 10
TIME_ZONE: America/New_York
LANGUAGE_CODE: en-US


[secrets]
SECRET_KEY: <whatever key you want-just a string of characters>

[ampq]
USERNAME: guest
PASSWORD: guest
HOST: localhost
PORT: 5672
VHOST: my_vhost

 

환경설정 파일을 작성했다면 git으로 내려받은 ADL_LRS의 소스를 살펴보자, 나는 편의상 vscode로 열어서 확인하였다.

일단 해당 프로젝트 root폴더에서 requirements.txt내용을 아래와 같이 변경하자, Ubuntu환경에서만 지원되는 라이브러리가 있어서 변경해주는 것이다. (requirements.txt는 python라이브러리에 대한 설치 정보가 들어있다.)

Django==1.9.1
amqp==1.4.9
bencode==1.0
celery==3.1.19
django-cors-headers==1.1.0
django-jsonify==0.3.0
importlib==1.0.3
isodate==0.5.4
oauth2==1.9.0.post1
pycryptodome==3.4.11
psycopg2==2.6.1
python-jose==2.0.2
pytz==2015.7
requests==2.9.1
rfc3987==1.3.4
supervisor==3.2.0

내용을 변경했다면 python의 pip명령을 이용해서 파일에 명시된 라이브러리들을 아래 명령을 통해서 설치하자

E:\workspace\ADL_LRS> c:\python27\scripts\pip install -r requirements.txt

 

설치가 이상 없이 완료되었다면 아래 내용들을 참고해서 Ubuntu환경으로 설정되어있는 설정 정보들 내용을 변경해주자

E:\workspace\ADL_LRS> Fabfile.py

import os
import sys
from fabric.api import local


def setup_env():
    INSTALL_STEPS = [
        'c:\\python27\\scripts\\virtualenv env', 
		'env\\scripts\\activate',
		'env\\scripts\\pip install -r requirements.txt',
		'env\\scripts\\deactivate']
    for step in INSTALL_STEPS:
        local(step)


def setup_lrs():
    # Media folder names
    agent_profile = 'agent_profile'
    activity_profile = 'activity_profile'
    activity_state = 'activity_state'
    statement_attachments = 'attachment_payloads'

    # Add env packages and project to the path
    cwd = os.path.dirname(os.path.abspath(__file__))

    if cwd not in sys.path:
        sys.path.append(cwd)

    env_dir = os.path.join(cwd, 'env/lib/site-packages')
    if env_dir not in sys.path:
        sys.path.append(env_dir)

    log_dir = os.path.join(cwd, '../logs')
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)

    celery_log_dir = os.path.join(log_dir, 'celery')
    if not os.path.exists(celery_log_dir):
        os.makedirs(celery_log_dir)

    supervisord_log_dir = os.path.join(log_dir, 'supervisord')
    if not os.path.exists(supervisord_log_dir):
        os.makedirs(supervisord_log_dir)

    uwsgi_log_dir = os.path.join(log_dir, 'uwsgi')
    if not os.path.exists(uwsgi_log_dir):
        os.makedirs(uwsgi_log_dir)

    nginx_log_dir = os.path.join(log_dir, 'nginx')
    if not os.path.exists(nginx_log_dir):
        os.makedirs(nginx_log_dir)

    # Add settings module so fab file can see it
    os.environ['DJANGO_SETTINGS_MODULE'] = "adl_lrs.settings"
    from django.conf import settings
    adldir = settings.MEDIA_ROOT

    # Create media directories
    if not os.path.exists(os.path.join(adldir, activity_profile)):
        os.makedirs(os.path.join(adldir, activity_profile))

    if not os.path.exists(os.path.join(adldir, activity_state)):
        os.makedirs(os.path.join(adldir, activity_state))

    if not os.path.exists(os.path.join(adldir, agent_profile)):
        os.makedirs(os.path.join(adldir, agent_profile))

    if not os.path.exists(os.path.join(adldir, statement_attachments)):
        os.makedirs(os.path.join(adldir, statement_attachments))

    # Create cache tables and sync the db
    local('env\\scripts\\python manage.py createcachetable')
    local('env\\scripts\\python manage.py migrate')
    local('env\\scripts\\python manage.py makemigrations adl_lrs lrs oauth_provider')
    local('env\\scripts\\python manage.py migrate')
    local('env\\scripts\\python manage.py createsuperuser')


def test_lrs():
    local('env\\scripts\\python manage.py test lrs.tests')

위의 내용으로 수정되었다면, 다음 명령을 수행하자 (가이드에는 없는 내용인데 오류가 나서 찾아보고 작성 한 내용)

(아래 내용은 가상 환경을 만들고, 활성화하는 과정이다.)

E:\workspace\ADL_LRS> c:\python27\scripts\pip uninstall fabric
E:\workspace\ADL_LRS> c:\python27\scripts\pip install fabric3
E:\workspace\ADL_LRS> c:\python27\scripts\fab setup_env
E:\workspace\ADL_LRS> env\scripts\activate
(env) E:\workspace\ADL_LRS> 

위에서 가상 환경이 활성화되면 프롬프트 쪽 경로가 (env) E:\workspasce\ADL_LRS> 이와 같이 나타난다. 여기서 LRS설정을 해보자

(env) E:\workspace\ADL_LRS> c:\python27\scripts\fab setup_lrs

오류 없이 실행되면 LRS설정이 끝났다.

 

4. RAbbitMQ 설치 

RAbbitMQ설치를 위해 이곳을 방문해서 보니 Erlang이 설치되어야 한다고 해서 Erlang을 먼저 받아서 설치하고, RAbbitMQ를 설치하였다. 

Erlang 설치 - https://erlang.org/download/otp_versions_tree.html

 

OTP Versions Tree

The main track including the maintenance branch of the current release

erlang.org

Erlang 설치

Erlang설치는 그냥 기본으로 Next만 눌렀다.

 

RAbbitMQ 설치 - https://www.rabbitmq.com/install-windows.html#installer

 

Installing on Windows — RabbitMQ

Installing on Windows This guide covers RabbitMQ installation on Windows. It focuses on the two recommended installation options: The guide also covers a few post-installation topics in the context of Windows: and more. These topics are covered in more det

www.rabbitmq.com

RabbitMQ 다운로드

RabbitMQ도 기본 옵션으로 Next만 입력해서 설치했다. 가이드에서는 아래와 같은 내용을 고지하고 있다.

 

Celery 및 AMQP 설정

셀러리는 활동 메타 데이터를 검색하고 순서가 잘못되었을 수 있는 진술을 무효화할 수 있습니다. 자세한 지침 은 Using Celery wiki 페이지를 참조하십시오. 그러나 기본 설정에 대한 지침을 제공합니다.

이 단계를 건너뛰면 모든 POST 요청이 응답 500 하고 대상 컴퓨터가 연결을 거부했다는 메시지를 표시합니다.

 

RabbitMQ설치가 완료되면 cmd를 통해 설치된 위치(C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.18\sbin)로 이동하여 아래 명령을 실행한다.

rabbitmqctl add_vhost my_vhost
rabbitmqctl set_permissions -p my_vhost guest ".*" ".*" ".*"

 

5. LRS_SERVER 실행

위에서 가상 환경((env) E:\workspace\ADL_LRS> )으로 설정 커멘드 창에서 아래 명령을 통해 서버를 기동 한다. 

(env) ADL_LRS> env\scripts\python manage.py runserver

아래와 같이 localhost:8000 서버로 기동이 됨을 확인할 수 있다.

LRS서버 구동완료

브라우저로 접속해보니 정상으로 접속됨을 확인할 수 있다.

LRS서버 구동 완료

 

6. 마치며

LRS_SEVER는 xAPI를 검증, 저장, 관리하는 용도로 LRS만 설치되었다고 많은 부분이 해결된 것은 아니다. xAPI의 스펙을 면밀히 분석하여 원하는 데이터를 xAPI의 스펙에 맞게 수집하여 LRS로 전송, 저장된 데이터를 AI를 이용해 의미 있는 데이터를 만들어서 제공하여야 하기 때문에 아직 갈길이 멀다고 할 수 있다.

 

다음번 글의 주제는 내가 수집할 수 있는 데이터를 이용해서 xAPI 변환할 목록을 정의하고, xAPI스펙에 맞게 변환하는 과정과 변환된 xAPI json데이터를 LRS로 전송하여 LRS를 통해 저장된 데이터를 확인하는 과정이 될 것 같다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함