1. Apache superset이란?

   - 오픈소스 웹기반의 데이터 시각화 BI툴로 Airbnb에서 오픈소스(Apache2.0 라이센스)로 공개한 프로그램이다.

   - URL : https://superset.incubator.apache.org/

   - 상용 프로그램인 tableau의 대안으로 선택할 수 있다. 


2. 설치방법

   : superset 홈피에 보면 여러가지 설치방법이 나오는데 docker를 이용한 설치는 docker-build.sh 파일이 없어 

    에러가 발생한다. ==> 포기

    그래서 아래쪽에 pip로 설치해보니 정상적으로 작동되어 pip설치방법을 설명하도록 하겠음.

   1) 먼저 python3.6과 pip3 버전을 설치해야한다.

      : 설치방법은 기존글 참조 ==> CentOS 7 에 yum으로 python3.6 , pip3 설치하기 클릭


   2) superset 설치에 필요한 패키지를 설치한다.

      $ sudo yum upgrade python-setuptools 

      $ sudo yum install gcc gcc-c++ libffi-devel python-devel python-pip python-wheel openssl-devel libsasl2-devel openldap-devel   ==> sudo 부터 openldap-devel 까지 복사


   3) pip 로 superset 설치

      $ pip install superset 

  

   4) supserset admin 사용자 생성 (원하는대로 입력하면 됨.)

     : fabmanager create-admin --app superset      


     [root@localhost local]# fabmanager create-admin --app superset

     Username [admin]: dasdes                          ==> admin 사용자명

     User first name [admin]: dasdes                   ==> 사용자 이름

     User last name [user]: dasdes                      ==> 사용자 성

     Email [admin@fab.org]: dasdes@dasdes.com  ==> 사용자 이메일

     Password:                                               ==> 사용자비밀번호 (원하는대로)

     Repeat for confirmation:                            ==> 사용자비밀번호확인

     Recognized Database Authentications.          ==> 이하 생성성공메시지

     Admin User dasdes created.

 

※ 혹시 Was unable to import superset Error: cannot import name '_maybe_box_datetimelike' 에러가 나면

   원인은 pandas 버전 때문이라 기존버전을 지우고 0.23.X 버전으로 다운그레이드 하면 된다.

   -  pip uninstall pandas

   -  pip install pandas==0.23.4

   - 그런 다음 다시 fabmanager create-admin --app superset 하면 됨.



   5) superset db 초기화

     $ superset db upgrade 

 ※ 이 상황에서 에러가 나면 다음과 같은 에러가 나올거다.

sqlalchemy.exc.InvalidRequestError: Can't determine which FROM clause to join from, there are multiple FROMS which can join to this entity. Try adding an explicit ON clause to help resolve the ambiguity.

  그러면 pip 추가모듈을 설치해주고 다시 도전하면 된다.

  : pip install sqlalchemy==1.2.18


   6) 샘플데이터를 붙는다.

     $ superset load_examples 


   7) 초기 권한 자동셋팅

     $ superset init 

 

   8) centos7 에서 방화벽 port 8088을 열어준다.

     $ firewall-cmd --permanent --zone=public --add-port=8088/tcp 

     $ firewall-cmd --reload        ==> 방화벽 적용 


   9) 서버실행

    $ superset runserver -d


  10) 접속URL 

       http://localhost:8088

   그런다음 위에서 admin 계정만들때 사용했던 ID와 비밀번호를 입력하고 들어가면 됨.







 



어때요? 도움이 많이 되셨나요? ~~~~~~~도움이 되셨다면 아래 꾹~~~



◈ 설치순서

   1) ius repository 설치

     $ yum install -y https://centos7.iuscommunity.org/ius-release.rpm  

     * 참고

        - 위 명령을 실행했을 때 아래와 같은 오류가 발생했을 경우에는 다운로드 후 yum install을 실행하면 된다.

       [root@localhost local]#  yum install -y https://centos7.iuscommunity.org/ius-release.rpm

       Loaded plugins: fastestmirror

       Cannot open: https://centos7.iuscommunity.org/ius-release.rpm. Skipping.

       Error: Nothing to do

        - $ cd /usr/local ==> /usr/local 로 이동(다운로드 받으려고)

        - $ wget https://centos7.iuscommunity.org/ius-release.rpm --no-check-certificate ==> ius-release.rpm 다운로드

        - $ yum install -y ius-release.rpm  ==> repository 설치

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

        위에 wget으로 받은 후 yum install -y ius-release.rpm 했는데 ius-release.rpm 파일을 오픈할 수 없다는 둥...

        이런 메시지가 나오면 과감히 아래 링크에서 rpm을 따로 받아서 받은 rpm을 설치하세요.

         - 파일다운로드 : wget https://dl.iuscommunity.org/pub/ius/stable/CentOS/7/x86_64/ius-release-1.0-15.ius.centos7.noarch.rpm --no-check-certificate

         - Install 하기 :   yum install -y ius-release-1.0-15.ius.centos7.noarch.rpm

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


2) 추가 패키지 설치

     $ yum install -y python36u python36u-devel python36u-libs python36u-pip


   3) pip명령어로 바로 pip3.6용 pip가 인식되도록 하기 위한 파일 다운로드 및 다운로드 파일 실행

     $ wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate

     $ python3.6 get-pip.py      

     위 명령어를 실행하고 pip -V 을 실행시 아래와 같이 python 3.6 용 pip가 설치된것을 알 수 있다.

     pip 18.1 from /usr/lib/python3.6/site-packages/pip (python 3.6) 


   * 참고

     - python 만 쳐도 python3.6을 인식하게 하기 위해서는 Python3.7 설치하기(https://dodo-it.tistory.com/69)의

       제일 아래쪽 글을 참고하면 됨.



어때요? 도움이 많이 되셨나요? ~~~~~~~도움이 되셨다면 아래 꾹~~~



1. 문제상황

  : CentOS7을 설치하고 나면 기본으로 설치되는 Python은 2.7이다.

   다른 프로그램을 설치해서 사용하고자 하는데 Python 최소요구버전이 3.7일 경우 

   따로 다운로드 받아서 설치해야 하는 상황임.


2. 설치순서

   1) 먼서 필요한 프로그램을 yum으로 설치한다.

      yum install gcc openssl-devel  libffi-devel bzip2-devel 

 

   2) python 최신버전 확인

      브라우저주소창에 붙여넣는다. (클릭하면 바로 뜸) ==> https://www.python.org/ftp/python/ 

      현재시점에서 최신버전은 3.7.1이다.


   3) 다운로드 한다. 다운로드 경로는 python3.7 폴더를 어디에 두고싶은지 본인이 결정하면 된다.

       본인은 /usr/src 나 /usr/local 로 이동 후 주로 다운로드 한다.

       여기서는 /usr/src 로 이동 ==> cd /usr/src      

      wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz


   4) 압축을 푼다.

     tar xzf Python-3.7.1.tgz 

     ==> 이렇게 하면 Python-3.7.1 폴더가 생김


   5) Python-3.7.1 폴더 안에 들어가서 configure를 실행한다.

      cd Python-3.7.1 

      ./configure --enable-optimizations

      ==> C 컴파일이 막 되는듯....


   6) 설치

     make altinstall 

      ==> 이 과정이 끝나면 python3.7의 설치과정이 끝난다. 


   7) 확인(python3.7이 어딨는지 보려면 which python3.7 로 확인)

     python3.7 -V 



   8) 그냥 python 명령어로 python3.7 을 실행하고 싶을 때...

      $ vi /root/.bashrc  ==> /root/.bashrc 편집창을 연다.

      $ 아래와 같이 alias python="/usr/local/bin/python3.7" 라고 붙여넣는다. (편집창을 저장 후 나간다) 

      $  source /root/.bashrc  ==> 적용

     

* 참고로 vi 에디터 사용법은 i 키는 편집, 입력 후 ESC클릭 :wq 입력 하면 종료하고 나간다.


   9) 확인  

     python -V   ==> 이러면 Python 3.7.1 이라고 나올것이다.


* 원래 상태로 되돌리기

   - 위에 입력한 alias 라인을 지운다. (저장후 나감)

   $ hash -r  ==>bash cache를 초기화(alias삭제후 python명령어 치면 계속  /usr/local/bin/python3.7 를 찾는다)



어때요? 도움이 많이 되셨나요? ~~~~~~~도움이 되셨다면 아래 꾹~~~


  1. InKeun 2019.05.10 14:42

    질문이 있습니다.

    알려주신 방법으로 해봤는데

    root 계정에서
    source 명령어를 치면
    if: Expression Syntax
    then: Command not found

    라고 뜨네요....이거 어떻게 해결해야할까요?

    • dasdes 2019.05.10 17:11 신고

      아마 사용하시고 있는 shell이 /bin/csh 가 아닌가 하는 생각이 드네요...
      확인 명령 : echo $SHELL
      위와같이 csh 가 나온다면, bash shell로 변경해주세요.
      변경명령 : bash
      그럼 잘 되시길....

  2. park 2019.06.19 14:24

    안녕하세요, centos에서 python3 설치하려고 하는데, make antistall 부분에서 permission denied가 뜹니다.

    sudo 명령어를 사용할 수 없어서 local 계정에 설치해서 사용하려고 하는데 혹시 방법이 따로 있을지요.

    참고로 virtualenv를 사용해서 설치도 해봤는데 마찬가지로 permission denied가 뜹니다.

    • dasdes 2019.06.19 21:59 신고

      su 입력 후 root 계정으로 실행해보시기
      바랍니다. 저는 windows에 virtualbox깔고
      centos7 을 설치해서 root로만 로긴 후
      사용했습니다.

1. 문제상황

   : Linux 서버 console 환경에서 직접 프로그램소스를 수정하려면 vi 또는 vim 에디터를 통해 주로 수정하게 된다.

     아무래도 편의성이 떨어지기 때문에 익숙하지 않은 사람들은 불편할 수 있다.

     이럴때 Windows 에 설치된 eclipse에서 바로 수정할 수 있으면 하는 생각들을 했을 것이다.

     eclipse plugin 프로그램인 Remote System Explorer를 추가하면 문제를 해결할 수 있다.


2. 설치방법

   1) plugin 설치

     : Help > Eclipse Marketplace 에서 "remote"단어로 검색하면 아래에 Remote System Explorer가 나온다.==> install

   2) 오른쪽 상단의 Open Perspective 아이콘을 클릭하고 Remote System Explorer를 선택한다.


   3) 왼쪽 상단의 일반적인 연결 아이콘을 클릭한 후 SSH Only를 선택한 후 Next를 누른다. (요즘은 주로 SFTP이므로)

   4) 본인의 경우 Virtual Box에 CentOS를 설치했기에 Localhost Host Name을 셋팅했음.

       외부서버에 설치했으면 아이피를 host name자리에 입력하면 되겠다.



      - 위에서 Next 클릭한 화면


    - 위에서 Finish 클릭한 화면


   5) 이제 Sftp Files 하위를 열려고 시도하면 접속 ID, Password입력하라는 팝업이 뜬다.

      - 제대로 입력하면 아래와 같이 나오는데 파일을 찾아 바로 수정하고 저장하면 된다.



어때요? 도움이 많이 되셨나요? ~~~~~~~도움이 되셨다면 아래 꾹~~~



1. 무료쇼핑몰 QOR 

  - QOR은 비즈니스 애플리케이션, CMS 및 전자 상거래 시스템에 필요한 공통 기능을 추상화 한 Go로 작성된 라이브러리

   세트입니다. 원래 QOR은 Ruby on Rails로 만들어졌으나 Go언어로 재작성 된 CMS 쇼핑몰 오픈소스입니다.

  - example 사이트 : https://github.com/qor/qor-example

  

2. 설치순서

  - 사이트에 나와있는 설치순서대로 하면 되지만 정상적으로 돌아가게 하기 위해

    몇가지 추가적인 수정이 필요하여 그 경험을 공유합니다.

# go get으로 github에서 소스를 받는다. (git 설치 안되어있으면 yum install git 으로)

#아래 명령어를 실행하면 앞 게시물(https://dodo-it.tistory.com/65)에서 go 설치시 지정한 go_work 하위에 다운로드됨. 

$ go get -u github.com/qor/qor-example


# mariadb를 설치(https://dodo-it.tistory.com/7)하고 아래와 같이 접속(root계정으로)하여 

# qor_example 데이터베이스를 만든다. (mariadb 설치시 root의 접속비밀번호는 1로 설정함)

$ mysql -uroot -p

mysql> CREATE DATABASE qor_example;


# DB 설정 및 프로그램 수정

#1) DB 연결설정

#2) 프로그램수정 (원본예제대로 하면 로긴안되고 제품리스트에서 제품 클릭하면 상세페이지로 넘어가지 않는다.)

#==> 아래에 추가적으로 설명한것을 참고로 수정한다.


#샘플데이터를 DB에 생성한다.

#생성시 SSL오류가 발생하면 /etc/yum.conf 을 vi에디터로 열고 sslverify=false 로 설정한다.

$ go run config/db/seeds/main.go config/db/seeds/seeds.go


# qor-example 경로로 이동 후 서버를 구동시켜본다.

# 참고로 윈도우에서 경로이동시에는 cd %GOPATH%/src/github.com/qor/qor-example 를 사용한다.

$ cd $GOPATH/src/github.com/qor/qor-example

$ go run main.go



3. DB 설정 및 프로그램 수정

  1) DB설정

    - /usr/local/go_work/src/github.com/qor/qor-example/config 하위에 보면 샘플설정파일이 몇개 있다.

     그중에 샘플데이터 생성을 위해 database.example.yml 파일을 database.yml 로 복사 후 내부에 패스워드를 설정한다.

#경로이동

$ cd $GOPATH/src/github.com/qor/qor-example/config


#파일 복사 후 rename

$ mv database.example.yml database.yml

 

#database.yml 파일 수정 ==> password: 1 을 아래에 추가함.(패스워드는 mariadb root 패스워드 설정시 1로 설정함)

$ vi database.yml 

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

db:

  adapter: mysql

  name: qor_example

  user: root

  password: 1          

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

# 저장 후 빠져나오기 ==> esc클릭-> ':' 입력 후 --> wq 입력



  2) 프로그램수정

    a) 로긴안되는 문제 수정

      ==> /usr/local/go_work/src/github.com/qor/auth/providers/password/handlers.go 파일 수정

package password


import (

"reflect"

"strings"


"github.com/qor/auth"

"github.com/qor/auth/auth_identity"

"github.com/qor/auth/claims"

"github.com/qor/qor/utils"

"github.com/qor/session"

)


// DefaultAuthorizeHandler default authorize handler

var DefaultAuthorizeHandler = func(context *auth.Context) (*claims.Claims, error) {

var (

                //authInfo    auth_identity.Basic <== 기존소스 Basic을 AuthIdentity 로 수정             

authInfo    auth_identity.AuthIdentity               

req         = context.Request

tx          = context.Auth.GetDB(req)

provider, _ = context.Provider.(*Provider)

)


req.ParseForm()

authInfo.Provider = provider.GetName()

authInfo.UID = strings.TrimSpace(req.Form.Get("login"))


if tx.Model(context.Auth.AuthIdentityModel).Where(authInfo).Scan(&authInfo).RecordNotFound() {

return nil, auth.ErrInvalidAccount

}


if provider.Config.Confirmable && authInfo.ConfirmedAt == nil {

currentUser, _ := context.Auth.UserStorer.Get(authInfo.ToClaims(), context)

provider.Config.ConfirmMailer(authInfo.UID, context, authInfo.ToClaims(), currentUser)


return nil, ErrUnconfirmed

}


if err := provider.Encryptor.Compare(authInfo.EncryptedPassword, strings.TrimSpace(req.Form.Get("password"))); err == nil {

return authInfo.ToClaims(), err

}


return nil, auth.ErrInvalidPassword

}


// DefaultRegisterHandler default register handler

var DefaultRegisterHandler = func(context *auth.Context) (*claims.Claims, error) {

var (

err         error

currentUser interface{}

schema      auth.Schema

//authInfo    auth_identity.Basic <== 기존소스 Basic을 AuthIdentity 로 수정             

authInfo    auth_identity.AuthIdentity       

req         = context.Request

tx          = context.Auth.GetDB(req)

provider, _ = context.Provider.(*Provider)

)


req.ParseForm()

if req.Form.Get("login") == "" {

return nil, auth.ErrInvalidAccount

}


if req.Form.Get("password") == "" {

return nil, auth.ErrInvalidPassword

}


authInfo.Provider = provider.GetName()

authInfo.UID = strings.TrimSpace(req.Form.Get("login"))


if !tx.Model(context.Auth.AuthIdentityModel).Where(authInfo).Scan(&authInfo).RecordNotFound() {

return nil, auth.ErrInvalidAccount

}


if authInfo.EncryptedPassword, err = provider.Encryptor.Digest(strings.TrimSpace(req.Form.Get("password"))); err == nil {

schema.Provider = authInfo.Provider

schema.UID = authInfo.UID

schema.Email = authInfo.UID

schema.RawInfo = req


currentUser, authInfo.UserID, err = context.Auth.UserStorer.Save(&schema, context)

if err != nil {

return nil, err

}


// create auth identity

authIdentity := reflect.New(utils.ModelType(context.Auth.Config.AuthIdentityModel)).Interface()

if err = tx.Where(authInfo).FirstOrCreate(authIdentity).Error; err == nil {

if provider.Config.Confirmable {

context.SessionStorer.Flash(context.Writer, req, session.Message{Message: ConfirmFlashMessage, Type: "success"})

err = provider.Config.ConfirmMailer(schema.Email, context, authInfo.ToClaims(), currentUser)

}


return authInfo.ToClaims(), err

}

}


return nil, err

}



   b) 제품리스트에서 제품 클릭하면 상세페이지로 넘어가지 않는 문제 수정

      ==> /usr/local/go_work/src/github.com/qor/qor-example/app/products/views/gender.tmpl 수정

<main class="container product_index">


<div class="grid">

  <div class="grid__col is-2 product_options">

    <h2>CATEGORIES</h2>

    <ul>

      {{ range $category := get_categories }}

        <li><a href="{{ $category.DefaultPath }}">{{$category.Name}}</a></li>

      {{ end }}

    </ul>


    <h2>COLORS</h2>

    <ul class="product_options-color">

      <li><a rel="nofollow" href="#"><span style="background:#eae3d3"></span>Beige</a></li>

      <li><a rel="nofollow" href="#"><span style="background:#222"></span>Black</a></li>

      <li><a rel="nofollow" href="#"><span style="background:#f79858"></span>Blue</a></li>

      <li><a rel="nofollow" href="#"><span style="background:#f56060"></span>Brown</a></li>

      <li><a rel="nofollow" href="#"><span style="background:#44c28d"></span>Green</a></li>

      <li><a rel="nofollow" href=""><span style="background:#999"></span>Grey</a></li>

      <li><a rel="nofollow" href=""><span style="background:#f79858"></span>Orange</a></li>

      <li><a rel="nofollow" href=""><span style="background:#b27ef8"></span>Purple</a></li>

      <li><a rel="nofollow" href=""><span style="background:#f56060"></span>Red</a></li>

      <li><a rel="nofollow" href=""><span style="background:#fff;border: 1px solid #e8e9eb;width:13px;height:13px;"></span>White</a></li>

    </ul>


    <h2>SIZES</h2>

    <ul class="product_options-size">

      <li><a rel="nofollow" href="#">XS</a></li>

      <li><a rel="nofollow" href="#">S</a></li>

      <li><a rel="nofollow" href="#">M</a></li>

      <li><a rel="nofollow" href="#">L</a></li>

      <li><a rel="nofollow" href="#">XL</a></li>

      <li><a rel="nofollow" href="#">XXL</a></li>

    </ul>

  </div>


  <div class="grid__col is-10 product_lists">

    <h1>ALL PRODUCTS (8)</h1>

    <ul class="grid">

      {{range .Products}}

        <li class="grid__col is-3">

          <!--<a href="{{.DefaultPath}}"> ==> 이미지클릭시 상세링크 부분으로 계속 초기페이지로 간다.  -->

          <a href="{{.DefaultPath}}products/{{.Code}}"> <!-- ==> 정확한 상세페이지 URL이 되도록 수정한다. -->

            <div class="product_image" style="background-image: url({{.MainImageURL}});">

              <div class="image_overlay"></div>

              <div class="add_to_cart">Add to cart</div>

              <div class="stats">

                <div class="stats-container">

                  <span class="product_price">${{.Price}}</span>

                  <span class="product_name">{{.Name}}</span>


                  <div class="product_meta">

                    <strong>SIZES</strong>

                    <span>

                      XS, S, M, L, XL, XXL

                    </span>

                    <strong>COLORS</strong>

                    <div class="colors">

                      <span style="background:#f79858"></span>

                      <span style="background:#f56060"></span>

                      <span style="background:#44c28d"></span>

                      <span style="background:#f79858"></span>

                    </div>

                  </div>

                </div>

              </div>

            </div>

          </a>

        </li>

      {{end}}

    </ul>

  </div>

</div>

</main>

 


4. 실행화면

  1) 사용자 접속 URL : https://localhost:7000






  2) 관리자 접속 URL : http://localhost:7000/admin




어때요? 도움이 많이 되셨나요? ~~~~~~~도움이 되셨다면 아래 꾹~~~



+ Recent posts