올 한해 동안 테스트용으로 여러개의 Django 용 EC2 인스턴스를 만들면서 했던 삽질들 정리

작성할 내용의 99%는 구글링과 ChatGPT에서 얻은 내용이므로 컴플라이언스 이슈 없습니다

 

1. 기본 구조

데이터엔지니어링을 위한 테스트용 웹서버를 구축하는 간단한 구조입니다

- AWS EC2 서비스로 생성한 인스턴스를 사용합니다

- Django app의 view.py 에서 간단한 기능을 수행합니다 (주로 HTTP 요청 처리)

- NGINX 와 Gunicorn 으로 웹서버를 구축합니다

- AWS의 Route53와 Application Load Balancer 를 이용해서 HTTPS 인증서와 서브도메인을 할당합니다

 

 

2. EC2 인스턴스에 패키지 설치

 

2.1. Ubuntu + NGINX + Django + Gunicorn 설치

EC2 인스턴스를 생성할 때 OS를 선택할 수 있는데, 저는 기본적으로 Ubuntu LTS 를 선호합니다.

LTS(Long Term Support)는 Ubuntu 버전중에서 안정적인 버전이므로 특정기능을 테스트할 때 편리하게 사용할 수 있습니다

현재는 22.04 버전이 가장 최신버전입니다.

오래된 소스코드 및 라이브러리에 의존성이 있는 특수한 경우가 아니라면, 지나치게 오래된 버전을 고집하는 것도 지양합시다

 

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-pip nginx

pip install django gunicorn

Ubuntu 에는 버전에 맞는 파이썬이 설치되어있지만, 그 외 패키지들은 직접 설치해주어야합니다

pip 와 nginx 를 apt 로 설치해주고, Django, Gunicorn 를 pip 로 설치해줍니다.

단일 테스트용 EC2 서버에서는 가상환경을 설정할 필요가 없으므로 가상환경 설정은 생략합니다.

 

### Django Project
django-admin startproject my_project .

### Install test
python ~/my_project/manage.py runserver 0.0.0.0:8000

Django 프로젝트 생성에 대한 자세한 설명은 생략합니다

오류메시지가 없다면 설치가 잘 되었겠지만~

그냥 넘어가면 허전하니까 Django 설치를 확인하는 runserver 0.0.0.0:8000 를 테스트로 실행해줍시다!

브라우저의 localhost:8000 에서 Django 의 웰컴메시지를 볼 수 있습니다 :D

 

이 때, 아래와 같이 django-admin 을 찾을 수 없다는 에러가 발생한다면 PATH 설정이 되어있지 않은 상태입니다

>> WARNING: The script django-admin is installed in '/home/ubuntu/.local/bin' which is not on PATH.

 

PATH 설정을 하기위한 간단한 방법입니다

## SHELL 확인 
echo $SHELL 
>> /bin/bash 

## 편집 열기
sudo nano ~/.bashrc 

## 경로추가 - 다음의 내용을 추가해주세요
export PATH="$HOME/.local/bin:$PATH"

## reload 
source ~/.bashrc

먼저 SHELL 을 확인하기 위한 간단한 코드를 실행하면 bash 라고 응답을 받습니다

bashrc 파일을 열고 Django가 설치된 /bin 디렉토리를 PATH 에 추가합니다

 

 

 

2.2. Gunicorn 설정

### Edit gunicorn configure
sudo nano /etc/systemd/system/gunicorn.service

### 아래의 내용을 적어줍니다
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/workspace
ExecStart=/home/ubuntu/.local/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/workspace/my_project/my_project.sock my_project.wsgi:application

[Install]
WantedBy=multi-user.target

### Gunicorn 실행
sudo systemctl daemon-reload
sudo systemctl enable gunicorn.service
sudo systemctl start gunicorn.service

### 상태 확인
systemctl status gunicorn

gunicorn.service 에 위의 내용을 적어서 저장합니다

EC2 우분투 인스턴스에서 유저는 'ubuntu' 이므로, User = ubuntu 로 설정해줍니다.

worker 갯수는 적당히 3으로 설정하고, gunicorn 이 실행될 때 생기는 socket 위치를 설정합니다.

모든 경로는 각자의 개발환경에 맞게 잘 수정해주어야 오류가 나지않습니다.

start gunicorn.service 를 실행하면 설정된 경로에 .sock 파일이 생깁니다

 

2.3. NGINX 설정

### Edit configure
sudo nano /etc/nginx/sites-available/my_project

### 아래의 내용을 적어줍니다
server {
    listen 80;
    server_name {서버 주소};

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/ubuntu/workspace/my_project;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/workspace/my_project/my_project.sock;
    }
}

server_name 에는 웹서버 주소를 적어줍니다. IP주소 형식일 수도 있고, 서브도메인 주소일 수도 있겠죠.

Gunicorn 설정에서 만든 .sock 파일과 경로가 일치하는지 다시 확인해줍니다.

 

그리고 일반적인 EC2 환경에서 502 Permission Error 가 생기므로 반드시 수정해주어야 할 부분이 있습니다.

connect() to (생략)/my_project.sock failed (13: Permission denied) while connecting to upstream,

### 권한을 가진 유저 확인하기
ls -la workspace/my_project/my_project.sock
>> srwxrwxrwx 1 ubuntu www-data 0 Mar  2 07:50 workspace/my_project/my_project.sock

### Edit configure
sudo nano /etc/nginx/nginx.conf

### User 를 www-data 에서 ubuntu 로 바꾸어줍니다

nginx.conf 파일에 기본 유저가 www-data 로 설정되어있지만

.sock 파일에 접근 권한을 가진 EC2 루트유저의 이름은 ubuntu 이므로 권한 오류가 발생합니다

이것 때문에 꽤나 고생했네요

 

 

2.4. Django 테스트

장고에대해 쓰는 글은 아니지만 설정확인을 위한 간단한 방법을 만듭니다

### app 만들기
django-admin startapp my_app

각자의 개발환경에서 적절하게 디렉터리를 맞추고 startapp 으로 앱을 만들어줍니다

 

개발 메모에서 실제 프로그램 구조를 지우면서 글을 작성하다보니 urls.py 설정은 생략합니다.

 

ALLOWED_HOSTS=['*']

ALLOWED HOST 에러가 뜰 것이니 settings.py 에 모든 호스트를 허락해줍니다

from django.http import HttpResponse

def hello(request):
    return HttpResponse('hello world this is test')

view.py 에 테스트용 코드를 적어주고나서 HTTP 요청을 보내면 'hello workd this is test'라는 응답을 받습니다

 

 

2.5. (선택) Redis 로 캐시 저장하기

만약 Django 캐시를 사용하는 상황이라면,

위에서 Gunicorn worker 를 3으로 설정하다보니 각각의 worker가 다른 캐시를 가지고 있게 됩니다.

즉 웹사이트를 새로고침할때마다 다른 캐시 결과를 보여주는 문제가 생깁니다.

이 문제를 풀 간단한 해결방법으로 Redis 를 사용합니다

 

sudo apt-get install redis-server

pip install django-redis


### settings.py 에 다음의 내용을 추가
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",  # Adjust as needed
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

###

 

redis-server 와 django-redis 를 설치한 뒤에 장고의 settings.py 에 캐시에 대한 내용을 추가로 작성해주면

간단하게 모든 Gunicorn worker 가 동일한 캐시를 가집니다!

이제 태블로를 이용해서 가지고 있는 데이터를 다양하게 분석해보자

 

커뮤니티 신규 가입회원의 성별/연령 정보를 가진 테이블이 구글스프레드시트에 있다

데이터를 추출하는 과정이 자동화되지않고, 일단위 분석이 필요한 도메인이 아니라서

처음부터 월단위로 데이터를 추출했다

 

단, 데이터 추출과정에서 생긴 통계인 '연령별-전체', '비율' 은

태블로 사용법 습득을 위해 없는 것으로 가정하고 진행한다 

추출된 데이터테이블

 

[분석 목표]

신규 회원가입의 추세를 확인!
가입자의 인구통계적 특성과 추세를 확인!


[워크시트 만들기]

(1) 연령구분을 무시하고 시계열 추세를 보여주는 꺾은선그래프

- '연령별'에서 Create - Group 으로 모든 연령을 그룹핑한 새로운 필드를 만든다

- 연령대그룹과 가입자수를 Rows로, 월별구분을 Columns 로 지정

월별 가입자 추이

 

(2) 연령대/성별 그룹 비중을 나타내는 그래프

 

두가지 categorical 필드를 사용하기 때문에 먼저 다음의 질문을 해야한다

Q. 연령과 성별 중 어떤 것이 더 중요한 의미를 가지는가?

1안: 성별을 먼저 구분하고 연령대별 구분을 적용
2안: 연령대별를 먼저 나누고 성별 구분 적용

A. 

본 서비스에는 연령대별로 이용목적이 다소 다르게 나타나는 특성을 가지고 있는 자명한 사실이 있다.

하지만, 위의 두 그래프를 비교해보면 40대-50대에서만 성별에 따른 차이가 크게 발생하는 것을 볼 수 있다.

그러므로 2안과 같이 연령대별 구분을 기본으로 하되, 남여의 비율차이 또한 확인할 수 있어야 한다

 

그리고 더 나은 시각화를 위해 고려할 사항이 있다

- 2안처럼 Analytics-Total 기능을 이용해서, 남/여/total 로 나타내면 막대의 갯수를 많아서 가시성이 떨어진다

- 파이차트는 연령대별 비율을 직관적으로 보여줄 수 있으나 2가지 필드를 동시에 보여주기 어렵다

 

그리하여 만들어진 그래프는...

- 누적막대그래프(Stacked Bars) 스타일로 연령대별 막대그래프 생성

- 성별 비율을 Color Mark 로 표현

연령대별 누적막대그래프로 성별 비율을 나타냄

 

서비스 이용목적에 차이가 생기는 연령대 구분을 명확하게 보여주면서도

연령대별로 성별비율의 차이가 생기는 40-50대 연령구간의 특징을 잘나타낼 수 있다

... 고 생각함 ^-^

태블로(Tableau)를 이용한 데이터 대시보드 만들기 학습 노트

학습은 밀버스 유투브 채널 (https://www.youtube.com/@data-drivenmarketing2414) 영상을 기초로 하였습니다

 

1. 데이터 불러오고 연결하기

데이터 파일을 태블로의 데이터 소스로 불러온다

나는 사이드프로젝트에 이용하는 구글드라이브의 스프레드시트 데이터를 불러옴

 

각각 불러온 데이터 테이블은 RDB처럼 Union, Join 할 수 있고,

참조관계(relation)을 만들 수 있다.

RDB와 SQL의 기본을 이해하고있다면 어렵지 않은 개념인듯.

현재는 각 스프레드시트끼리 관계형으로 연결할 일은 없으니 패스

 

2. 태블로 인터페이스 알아보기
'시트'메뉴로 들어가면 분석 인터페이스가 열림

태블로 버전의 차이인지 데스크탑/클라우드의 차이인지 강의와 사용 인터페이스가 약간 다르지만 차이는 무시할만하다

내가 보고있는 태블로클라우드의 인터페이스

각 메뉴별로 자세히 알아보면

- 데이터 필드

상단은 차원인 measure names, 하단은 측정값인 measure values로 구분되어있다

차원을 매개로하여 측정값을 집계처리하여 나타낸다 (SUM, AVG 등등)

필드를 클릭하면 이를 column 또는 row로 지정할 수 있다

 

- 대시보드

자동으로 추천하는 형태로 (막대그래프, 꺾은선그래프 등등) 나타나고

우상단의 'SHOW ME' 버튼을 누르면 여러가지 그래프/대시보드 형태를 고를 수 있다

'Mark'에 강조표기하고싶은 필드를 직접 드래그해서 넣을 수 있고, 강조표기의 상세 설정을 변경할 수 있다

 

짜잔-!

그렇게 만든 테스트 대시보드

위의 데이터는 특정키워드의 증가추이를 모니터링 하는 데이터이다

column으로는 '연월일' 값을 쓰고 exact date 로 사용

rows 로는 count데이터를 SUM 으로 집계하여 사용

데이터라벨과 색상은 그냥 테스트겸으로 입혀보았다. 물론 라인그래프에 굳이 색을 입히는 경우는 드물 것이다

 

 

3줄 요약

(1) 태블로에서 데이터를 불러오고 차트를 만드는 인터페이스에 대해 알아보았다

(2) 데이터소스를 관계형테이블로 만지는 것은 현재 그정도 복잡한 데이터가 없어서 테스트못해서 아쉽다
      근데 사실 이건 태블로에서 많이 만지는 것보다 DB 설계부터 잘해서 쉽게 만드는게 좋겠다.
(3) 대시보드 시각화 기능이 꽤 편리하다.
      특히 최근에 썼던 GCP Looker Studio 보다 기능/인터페이스 모두 훨씬 좋다 (진작 쓰자고해볼걸)

'데이터 분석 & 기획 > 태블로' 카테고리의 다른 글

태블로 활용 - 가입자 데이터  (0) 2023.01.19

국내에서 HVAC 분야의 여러 자료를 보다보면 용어가 혼재된 경우도 있고,

북미 중심의 학술자료들과 국내의 건축물현황이 다르다보니 헷갈리는 경우들이 있습니다

한번쯤 정리를 해보고 싶어서 오랜만에 블로그에 포스팅을 합니다

 

이 포스팅에서는 각 설비별 작동원리를 자세히 설명하기보다는

명칭을 구분하는 주요한 특징에 집중합니다

 

HVAC (Heating, Ventilation, Air Conditioning) 의 첫번째 목표는

실내에 냉방 또는 난방 에너지를 공급해주는 것입니다

이를 담당하는 설비를 열원설비 또는 열원장치라고 합니다

 

(1) 칠러

북미 등 해외지역이나 국내의 대형시설에서 주로 사용하는 열원설비는 칠러(Chiller) 입니다

냉동기라고 번역할 수 있는데, 난방용 온수도 공급할 수 있는 칠러는 냉온수기로 부릅니다

'냉수' 또는 '온수'를 공급하는 수배관 시스템으로 구분할 수 있습니다.

냉매를 이용한 냉각사이클을 이용하며 운전방식에 따라 압축식과 흡수식으로 구분할 수 있습니다

 

좌: 압축식 냉동기 , 우: 흡수식 냉동기 (출처: LG전자)

 

(1-1) 수랭식 칠러

냉수를 공급하고 나서 발생한 열을 냉각수를 통해 배출하는 방식을 수랭식이라고 합니다

계통도에서 압축기(1번)에서 고온고압의 냉매가 응축기(4번)에서 냉각수에 의해 냉각됩니다

이 냉각수는 냉각탑으로 이동되어 증발에 의해 건축물 밖으로 열을 배출합니다

수랭식 칠러 계통도 (출처: 천우엔지니어링)
냉각탑 (출처: ST E&C)

 

(1-2) 공랭식 칠러

냉각수를 이용하지 않고 직접 대기중으로 열을 배출하는 방식을 공랭식이라고합니다

공랭식 칠러의 경우 아래 그림처럼 냉매에서 발생하는 열을 직접 배출할 수 있는 구조입니다

계통도에서 응축기FAN(2번)이 고온고압의 냉매가스가 가진 열을 대기로 방출합니다 

공랭식 칠러 (출처: LG전자)
공랭식 칠러 계통도 (출처: 천우엔지니어링)

 

 

'건축&공간 연구 > 건축설비' 카테고리의 다른 글

공조설비 플레넘 공간 (Plenum Space)  (0) 2022.01.17

빅데이터 처리에서 파이썬 API를 이용하는 pyspark 를 배워보고자합니다

가볍게 로컬에서 pyspark를 연습하기 위해서 WSL 기반의 연습환경을 구축합니다.

 

 

(1) 윈도우에 WSL2설치 

Powershell을 관리자 권한으로 실행하고 wsl을 설치합니다

wsl --install

>> 시스템을 다시 부팅할 필요가 없습니다.

위와 같은 오류메시지와 함꼐 실행되지 않을 경우에는 아래처럼 wsl 사용을 활성화합니다.

이 단계에서 여러 유형의 오류가 발생할 수 있는데 마소의 WSL 공식매뉴얼을 보는 것도 좋습니다. 

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

 

wsl을 설치하고 우분투를 설치합니다.

현재는 버전 정보를 입력하지 않을 경우 Ubuntu 20.04(LTS)가 default로 설치됩니다.

wsl --install --d Ubuntu

 

그리고 ubuntu를 실행하면 다음과 같은 메시지가 뜹니다.

Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)

첫 실행에서는 UNIX user 계정과 비밀번호를 설정해야합니다.

sudo 명령어를 입력할때 비밀번호를 입력해야하므로 기록해둬야합니다.

 

 

(2) 파이썬 설치

실제 개발할 때, 개발환경 구축에 대한 연습을 하기 위해서

conda보다는 직접 가상환경을 만들고 모듈을 설치해볼 계획입니다.

 

먼저 pyenv 를 설치합니다.

이 때 .bashrc 파일에 pyenv에 관련한 PATH를 추가해줍니다.

$ curl https://pyenv.run | bash
## 경고메시지출력
## WARNING: seems you still have not added 'pyenv' to the load path.

--------- .bashrc 파일에 아래 내용 추가 -------

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv virtualenv-init -)"

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

## 쉘 재실행
$ exec "$SHELL"

## 설치확인
$ pyenv --version

 

그리고 파이썬을 설치하기전에,

파이썬, pyspark 등 모듈에 필요한 기본 dependency를 설치해줍니다.

 

그 뒤에 pyenv를 이용해서 파이썬을 설치해줍니다.

저는 최신버전인 3.10.4를 설치했습니다.

 

버전이나 개발환경에 따라 여러가지 에러가 뜰 수 있는데

그때마다 에러메시지를 구글링하면 어떤 모듈을 설치해야하는지 쉽게 알 수 있습니다.

https://github.com/pyenv/pyenv/wiki/Common-build-problems

설치한 뒤에 해결이 안된다면 파이썬을 재설치 해줍니다.

 

아래는 메모삼아 정리해둔건데 다시보니 중복되는 것도 있네요. 이 부분은 개인환경에 따라 잘 설치하면 됩니다.

## 파이썬에 필요한 모듈 설치 
sudo apt-get install build-essential
sudo apt-get install libedit-dev libffi-dev libbz2-dev
sudo apt-get install autoconf automake autopoint autotools-dev blt-dev debhelper dh-autoreconf
  dh-strip-nondeterminism diffstat docutils-common gettext intltool-debian
  libarchive-zip-perl libbluetooth-dev libbluetooth3 libbz2-dev libcroco3 libdb-dev
  libdb5.3-dev libexpat1-dev libffi-dev libfile-stripnondeterminism-perl libfontconfig1-dev
  libfreetype6-dev libgdbm-dev libice-dev libjs-jquery libjs-sphinxdoc libjs-underscore
  liblzma-dev libmpdec-dev libncursesw5-dev libpixman-1-0 libpng-dev libpthread-stubs0-dev
  libreadline-dev libsm-dev libsqlite3-dev libssl-dev libtcl8.6 libtext-unidecode-perl
  libtimedate-perl libtinfo-dev libtk8.6 libtool libx11-dev libxau-dev libxcb1-dev
  libxdmcp-dev libxext-dev libxfont2 libxft-dev libxkbfile1 libxml-libxml-perl
  libxml-namespacesupport-perl libxml-sax-base-perl libxml-sax-perl libxrender-dev
  libxss-dev libxss1 libxt-dev m4 pkg-config po-debconf python-babel-localedata
  python3-alabaster python3-babel python3-docutils python3-imagesize python3-lib2to3
  python3-pygments python3-roman python3-sphinx python3-tz quilt sgml-base sharutils
  sphinx-common tcl tcl-dev tcl8.6 tcl8.6-dev tex-common texinfo tk tk-dev tk8.6
  tk8.6-blt2.5 tk8.6-dev x11-xkb-utils x11proto-core-dev x11proto-dev
  x11proto-scrnsaver-dev x11proto-xext-dev xml-core xorg-sgml-doctools xserver-common
  xtrans-dev xvfb zlib1g-dev
  
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev
  
pyenv install 3.10.4

pyenv versions

 

다음으로 pyenv로 가상환경을 생성합니다.

저는 venv_spark 라는 이름으로 가상환경을 생성했습니다.

vscode는 이미 설치해뒀고 윈도우용 설치에 어려움이 없으므로 자세한 방법은 생략합니다.

## 가상환경 생성
pyenv virtualenv 3.10.4 venv_spark

## 현재 환경을 "venv_spark"로 설정
pyenv local venv_spark

## vscode 실행
code .

 

(3) spark 설치

spark는 java 기반으로 개발되었으므로 먼저 openjdk 를 설치해줍니다.

그리고 https://spark.apache.org/downloads.html 에서 이용하려는 버전의 링크를 복사해서 wget으로 입력해줍니다.

다운받은 뒤에는 tar 명령어로 압축해제를 해줍니다.

여기서는 spark버전 3.2.1으로 입력했습니다.

$ sudo apt-get install openjdk-8-jrea

$ wget {https://dlcdn.apache.org/spark/spark-3.2.1/spark-3.2.1-bin-hadoop3.2.tgz}
$ tar spark-3.2.1-bin-hadoop3.2.tgz

 

그리고 spark 또한 PATH에 추가해줘야겠지요

vi 편집기를 이용해서 아래의 내용을 입력해줍니다

{spark_folder}는 위에서 압축해제된 폴더경로를 입력해주고

{python_folder}에 which python 으로 출력되는 파이썬 설치경로를 입력해줍니다.

$ sudo vi /etc/profile.d/spark.sh

--------리눅스 vi 편집기 입력 -----------

export SPARK_HOME={spark_folder}
export PATH=$SPARK_HOME/bin:$PATH
export PYSPARK={python_folder}

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

# 환경설정을 적용합니다
$ . /etc/profile

 

우분투에서 pyspark 를 열어서 설치를 확인해봅니다.

여기서 dependency 오류가 발생하면 계속 검색하면서 추가모듈을 설치해야합니다 

$ pyspark

 

웰컴메시지가 뜨면 성공적으로 설치가 되었음을 확인합니다

 

(4) 파이썬에서 import pyspark 확인

 

하지만 파이썬 터미널에서 import pyspark 를 실행하면,

pyspark 와 py4j 모듈 위치를 못찾아서 오류가 발생했습니다.

 

.bashrc 파일을 열어서 아래처럼 경로를 추가로 적어줍니다

export SPARK_HOME=/home/hyungmin/spark-3.2.1-bin-hadoop3.2
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH
export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.10.9.3-src.zip:$PYTHONPATH

그러고나면 드디어 파이썬에서 

import pyspark 가 오류없이 실행됩니다 !!

 

 

 

[참고 블로그]

https://livebook.manning.com/book/data-analysis-with-python-and-pyspark/a-installing-pyspark-locally/v-1/5

 

A Installing PySpark locally · Data Analysis with Python and PySpark

 

livebook.manning.com

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=semtul79&logNo=221489908486 

 

how to install apache spark on ubuntu ( 우분투에서 spark 설치 )

ubuntu 18 에서 apache spark 을 설치해서 구동해 봅시다. ( 일단 python 으로 프로그래밍하는 전제로 환경...

blog.naver.com

https://smothly.github.io/develop%20environment/linux/2020/03/07/윈도우에-우분투(wsl)-파이썬-개발환경-구축하기.html 

 

윈도우에 우분투(wsl) 파이썬 개발환경 구축하기 | Seungho's Blog

윈도우에 우분투(wsl) 파이썬 개발환경 구축하기 최근에 우분투를 지우고 다시 윈도우로 돌아왔습니다. 윈도우에서 개발환경을 맞추려고 하니 환경변수 설정이나 터미널 환경 등이 불편해서 윈

smothly.github.io

 

+ Recent posts