반응형

오랫만에 어떤 리눅스를 골라 설치할까 하다가 다시 만자로 리눅스를 설치해보기로 했습니다. 물론 Windows와 듀얼부팅으로요. 버전은 manjaro-gnome-22.0.2 입니다. 

 

1. 파티션

다른 부분은 사실 거의 Next만 눌러줘도 되지만, 항상 어려웠던 부분이 바로 파티션이 아닐까 합니다. 요즘은 UEFI 방식의 BIOS지원으로 이를 적용하고자 뭔가 좀 더 복잡해진 것 같아...애를 먹었습니다. 그런데 사실 힘들었던 부분은 UEFI(GPT)방식이냐 옛날방식(MBR)방식이냐가 아니라... 부트로더를 제대로 설정하지 못해서 생긴 문제였습니다. 

- 윈도우즈에서 우선 리눅스를 사용할 공간을 마련합니다. 추가로, 부트로더 8MB를 위한 파티션을 현재 부팅하드인 C드라이브에 함께 추가합니다.

리눅스는 D드라이브 300GB에 설치할 예정입니다. Windows는 다른 하드(C드라이브)에 있습니다. 그리고 부팅을 위한 공간도 Windows와 같은 드라이브에 있어야 하는데....C드라이브 옆에 8메가가 아니라 500메가를 만들었네요..^^;;

 

- 다음으로 리눅스 파티션공간으로 가면 ...

D드라이브였던 하드디스크 300GB부분을 적절히 나눠줍니다. 저는 스왑 파티션 외에는 별도로 나누지 않고 모두 루트(/)에 할당해버렸네요. 

여기서 주의할 점이 화면 아래쪽의 부트로더 설치 위치입니다. 이부분을 현재 Windows가 설치된 C드라이브의 장치로 변경해줍니다. (저는 /dev/sdb. 위 화면은 바꾸기 전입니다.)

 

 

그리고 /dev/sdb디스크에서도 부트로더 부분을 만들어줍니다. 화면 캡쳐를 못했네요. 아래 화면은 수정하기 전 화면입니다. 여기서 8MB의 fat32파티션을 생성하고, 플래그를 bios-grub으로 설정합니다.

 

그럼 아래와 같이 변경 전/후 상태를 정리해서 보여주는 화면이 나타납니다.

8MiB는 GPT로 잘 인식이 된 것 같습니다. 아....저 남는 490메가는 엊다가 쓸까요....찝찝하게ㅠㅠ.. 이번에 성공할줄 몰랐엉..

 

설치 버튼을 누르면 GPT 파티션 관련되어 뭐라뭐라 합니다. 전단계에서 이미 설정을 해 놓았네요. 설정상태와 상관없이 계속 뜨는 팝업같습니다.

파티션/포맷을 진행한다니 조금 불안하겠지만, 용기를 내어 진행해봅니다.^^;;

 

2. 한글

사실 파티션이 설치의 가장 큰 문제라고 생각합니다. 설치가 다 끝나면 가장 먼저 부딛히는 다음문제는 바로 한글입력입니다. 저는 보통 한글을 IBus를 사용합니다. UIM, fcitx가 있긴 한데 왠지 그것들보다는 좀 더 표준인 것 같기도 하고 다른건 사실...아주 오래전에 NABI를 써본 것 외엔 아는 바가 없어서...

 

ibus 설치과정

 

그런데 이번에 설치한 IBus가 웬일로 말을 안듣습니다. 메모장이나 터미널에서는 한글이 먹히는데, 오히려 웹브라우저(파폭이나 크로미움)에서 듣질 안더군요. 이것때문에 이번에 삽질좀 했습니다. 괜히 UIM을 깔게 되었네요.

$ sudo pacman -S uim
$ vi ~/.xprofile

IM='uim'
export GTK_IM_MODULE=$IM
export XMODIFIERS='@im=$IM'
export QT_IM_MODULE=$IM
export XIM=$IM
uim-xim &

 

그리고 키 문제가 있는데, 아래와 같이 해결하면 된다고 하는데....코드만 보관하겠습니다. 저는 잘 안되네요(키보드 한/영키가 Alt_R로 인식이 되는데, 벼루에서는 좌/우 상관없이 그냥 Alt로 인식되네요)

1. $ vi ~/.xprofile

xmodmap -e 'remove mod1 = Alt_R'
xmodmap -e 'keycode 108 = Hangul'
xmodmap -e 'remove control = Control_R'
xmodmap -e 'keycode 105 = Hangul_Hanja'

추가. 로그아웃 후 재로그인

그런데 문제가 이게 다가 아닌 것 같습니다.

최근 리눅스의 윈도우환경이 아주 오래전부터 사용되던 Xwindow에서 wayland를 적용하는 추세가 되어가는 것 같습니다. 이번 만자로 버전..에서도 기본으로 wayland를 사용하는데, 혹시나 하는 마음에 세션 선택창에서 그놈 (Xorg)를 선택했네요. 그랬더니 거짓말처럼 한글이 모두 정상적으로 입력됩니다. 혹시 최신 만자로(다른 리눅스 배포판은 아직 시도해보지 않음) 설치하고 한글입력에 문제있으신 분들은 세션 변경해보시기 바랍니다. (아직 wayland환경에서 한글이 정상 입력되는지는 잘 모르겠네요..)

 

 

그럼 이만~~~

 

반응형
반응형

회사 동료 PC에서 파일명을 일괄 변경시켜줘야 하는 일이 발생했습니다. 예를들면 앞부분에 특정 구문을 붙인다던지, 뒷부분에 날짜를 일괄 붙인다는지 하는 식으로 말이죠. 검색해보면 여러가지 툴/방법이 있긴 합니다만 오랫만에 직접 프로그램을 짜서 도움을 줘볼까 합니다. 그래서 이번엔 쉽게 실행파일 생성이 가능한 Go언어를 이용해서 만들어보기로 했습니다. Java나 C#은 가상머신 세팅에서 약간의 까다로움이 발생하거나 괜히 덩치만 커질 수도 있었고, Python은 친구 PC에 Python을 굳이(개발자도 아닌데) 깔아야 하는 번거로움이 있고, Javascript는...음....?? 

 

Go언어 설치나 세팅 부분은 다른 글들에도 많으니까 패스하도록 하겠습니다.

 

src 폴더 하위에 신규 폴더하나를 생성하고, 파일명은 test.go로 하여 아래와 같이 작성하였습니다.

 

<test.go>

 

package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"strings"
)

func main() {
	// fmt.Println("Hello, World!")
	targetDir := "./temp"
	files, err := ioutil.ReadDir(targetDir)
	if err != nil {
		fmt.Println(err)
		return
	}
	for _, file := range files {
		
		fmt.Println(file.Name())  // 파일명 확인
		file_name := file.Name()  // 단순파일명
		file_fullname := targetDir + "/" + file_name  // 전체 파일명

		new_name := strings.Replace(file_name, "CMM_ROOM_", "2022", 1) //원본 문자열, 바꿀문자열, 신규문자열, 바꿀횟수
		new_fullname := targetDir + "/" + new_name  // 신규 파일명(경로포함)

		os.Rename(file_fullname, new_fullname) // 변경
	}
}

 

테스트를 위해 현재 프로젝트 폴더 하위에 temp폴더를 생성하고, 내부에 몇개의 파일들을 생성해보도록 하겠습니다.

 

이 프로그램의 목적은 파일명의 "CMM_ROOM_" 부분을 "2022"로 일괄 변환하는 것입니다. 프로그램을 실행해보면..

go run test.go

잘 변환되네요..

이제 이걸 배포파일로 만들어주면 오늘의 작업 끝~~

go buil test.go

반응형
반응형

특정 폴더의 파일 전체에 대해서 일괄 수정하는 기능을 구현해 보았습니다.

add_string 함수는 파일명에 접두사 접미사를 붙여서 출력하는 기능이고,

change_string 함수는 파일명에 특정 문자열을 다른 문자열로 바꾸는 기능입니다.

 

<주의>
우선은 파일명을 확인하는 부분까지만 구현하고, 실제 변경하는 부분은 주석 처리하였습니다. 사용하실 분은 해당 부분 주석 해제후 사용하세요.
import os

def add_string(path, prefix, suffix):
    for filename in os.listdir(path):
        name_only, ext = filename.split('.')    # 파일명과 확장자로 분리
        print(name_only, ext)
        new_name = prefix + name_only + suffix + '.' + ext  # 새 파일명 조합
        print(new_name)
        # os.rename(path+filename, path+new_name)

def change_string(path, prev, next):
    for filename in os.listdir(path):
        new_name = filename.replace(prev,next)
        print(new_name)
        # os.rename(path+filename, path+new_name)

add_string('d://test', 'test','뭐뭐뭐')
change_string('d://test','abc','abcdef')

 

<원본>

 

<add_string>

 

<change_string>

반응형
반응형

프론트엔드 프레임워크 하면 Angular / React / Vue 그리고 최근 부각되고 있는 Svelte가 있는데요. 전문 개발자는 아니지만 조금은 손대본 경험을 토대로(Angular제외..) 특성을 알아보도록 하겠습니다.

 

Stackoverflow Ranking에서 여러 프로그래밍 언어 및 프레임워크에 대한 점유율, 선호도 등 자세한 정보는 확인하실 수 있습니다. 해당 정보에 따르면 웹 프레임워크의 점유율은 아래 그래프와 같습니다. 이 중에 프론트엔드 프레임워크만 보면 React가 제일 상단에 있고, jQuery, Angular, Vue 그리고 한참 아래쪽에 Svelte가 있네요

 

< 점유율 >

 

역시 Stackoverflow Ranking에 따르면 이번엔 Svelte가 제일 위에 있고, 그다음 React, Vue이고 Angular가 하위에 있는 모습입니다. Svelte가 가장 신생 프레임워크인데, 선호도 측면에서는 많은 개발자들이 만족하고 있다는 의미네요.

 

< 가장 사랑받는 / 피하고싶은>

 

그럼 각 프레임워크의 특징을 한번 살펴보겠습니다.

1. Angular

Angular는 구글에서 만든 Javascript 프레임워크로 초기 1.0버전에서는 AngularJS, 2.0버전부터는 그냥 Angular라고 칭했습니다. 특이한 것은 1.0은 Javascript, 2.0은 Typescript를 기본 언어로 채택하였습니다. Angular는 필요한 요소들을 모두 포함하고 있는 것이 특징입니다. 그만큼 다른 라이브러리들을 추가로 설치할 필요가 없으며, 대신 학습해야할 양이 많은 것으로 알려져 있습니다. 

양방향 데이터바인딩을 지원하며, 태그이름, 템플릿 파일, CSS파일 정보를 decorator문법을 이용하여 전달하는 선언적 코딩 스타일을 사용한다는 특징을 갖고 있습니다. 

 

 

2. React

React는 페이스북에서 만든 라이브러리입니다. 라이브러리냐 프레임워크냐로 갑론을박이 많이 있었지만, 최근에는 라이브러리다라는 의견이 대체적으로 받아들여지고 있는 모습입니다. React는 Virtual-DOM이라는 개념을 적용하였습니다. DOM은 HTML문서를 제어할 수 있는 API 트리 자료구조인데, 실제 DOM을 사용하여 변경시마다 모든 요소를 Update하기에는 무거우며 속도가 느려지는 한계가 있어 가상 DOM이라는 개념을 적용하고 있습니다. 이는 Vue도 마찬가지입니다. 

또다른 특징으로는 Component에 의한 재사용 가능한 UI 생성을 들 수 있으며, 이를 위해 내부적으로 JSX라는 특별한 문법을 사용합니다. 이는 자바스크립트에 HTML을 내포한듯한 모습을 하고 있습니다. 

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Hello React
        </a>
      </header>
    </div>
  );
}

Component로 각 요소를 구분해가며 전체 페이지를 구축해가는 방식은 개발자들이 쉽게 접근할 수 있도록 도왔던 것으로 보입니다. Props, State 등의 개념을 익히다가 나중에 상태관리자로 Redux라는 개념을 사용할 때즈음 되면 슬슬 멘붕이 오기 시작합니다. 요즘은 Redux toolkit를 써서 쉽게 접근할 수 있도록 했다고는 하지만, 개념이 바뀌는 것은 아니므로  학습곡선이 완전히 낮아졌다고 하기는 힘들어보입니다.

 

3. Vue

Evan You에 의해 시작된 Frontend Framework로 React와 마찬가지로 Virtual-DOM의 개념을 사용합니다. Evan You는 Angular를 이용한 개발을 하던 중 본인이 필요한 기능들만 추려서 만들었다고 하고, 시기적으로도 React보다 1년 뒤에 나온만큼 Angular, React 등으로부터 영향을 받았을 것으로 보입니다. 단방향 데이터 바인딩만 지원하는 React와는 달리 Vue는 양방향 데이터바인딩을 지원합니다. React를 공부하다보면 Redux 상태관리자를 사용하면서 학습난이도가 올라가는데, Vue에서의 상태관리자인 Vuex는 이보다 훨씬 이해하기 쉬운 장점이 있습니다. 아래는 컴포넌트를 정의하는 샘플 Vue 코드인데, 보시면 template, script, style의 세 부분으로 나뉘어져 있습니다. 이런 구분에 대해서는 개발자마다 호불호가 있지만, 처음 접근하는 입장에서 가독성이 좋은 것은 큰 장점 같습니다.

<template>
    <div class="btn">
        <slot></slot> <!--버튼처럼 텍스트를 표시하기위한 속성-->
    </div>
    <h1 @dblclick="$emit('abc')">
		ABC
    </h1>
</template>
    
<script>
export default{
	emits: [
		'abc'
	]    
}
</script>

<style scoped>
.btn{
    display: inline-block;
    margin: 4px;
    padding: 6px 12px;
    border-radius: 4px;
    background-color: gray;
    color: white;
    cursor: pointer;
}
</style>

 

4. Svelte

기존의 Angular/React/Vue에이어 Svelte는 상당히 나중에 진출한 후발주자입니다. 그런데도 Stackoverflow Ranking에서 보면 개발자가 사랑하는 프레레임워크 2위를 차지할 정도로 관심도가 엄청나며(1위는 Phoenix), 다른 프레임워크들을 추격하고 있습니다. 

The State of JS 2021 Web Frontend Framework

svelte 는 라이브러리/프레임워크가 아닌 컴파일러라고 합니다. Svelte코드를 실행시점에서 해석하지 않고 컴파일 단계에서 Vanilla Javascript 번들로 만들기 때문에 다른 라이브러리를 함께 배포할 필요가 없어집니다. 또다른 특징으로는 React나 Vue처럼  Virtual-DOM을 사용하지 않고 실제 DOM을 직접 제어합니다. 성능적으로 작은 번들사이즈와 DOM의 직접제어 덕분에 다른 프레임워크보다 빠른 반응속도를 보여줍니다. 

문법은 개인적인 느낌이 Vue랑 유사하게 생겼습니다. 가시성도 좋고 쉽다고 생각이 듭니다. 화면 Update할 시점을 인식시켜주기 위한 특이한 용법들도 있습니다만 다른 라이브러리들의 학습곡선에 비할 바가 아니라고 생각됩니다. 상태관리에서도 redux, vuex와 같이 외부 라이브러리를 설치할 필요가 없이 내부에 store를 기본으로 내장하고 있습니다. 

<script>
let name = "teo.yu"
</script>

<div>Hello world! {name}</div>

<style>
div { color: red }
</style>

<번들사이즈 비교>

파일사이즈가 작으면 다운로드속도가 올라가서 체감속도가 빨라집니다. 아래 결과를 보면 Svelte가 가장 작은 사이즈를 보이고 있습니다.

 

이런 성능과 러닝커브 등의 잇점으로 최근 svelte의 인기가 올라가고 있는 것으로 보입니다. 하지만 아직까지 시장의 메인은 React, 그리고 최근에는 Vue도 많이 도입하고 있는 것 같습니다. 저도 Vue를 주로 사용하여 개인 프로젝트들을 만들고 있는데 React에서 어려운 개념들을 익히고 나서 접근해서인지, Vue 너무 좋습니다. 성능도 준수하게 뽑아주는 것 같고, Reference도 잘 되어있어서 당분간은 Vue를 활용할 것 같습니다. Svelte는 조금 더 저변이 넓어지면 그때 적용해볼까 합니다. 

반응형
반응형

Django앱을 Gitlab에 올리고, Heroku로 자동 배포하는 방법, 그리고 Freenorm의 무료 DNS를 적용하는 방법을 알아보겠습니다. 순서는 아래와 같습니다.

  1. django 앱 생성 (본문은 Django의 사용법을 다루는 글이 아니므로, 기본적인 앱은 만들어져 있어야 합니다.)
  2. Heroku repo 생성
  3. Gitlab repo 생성
  4. CD/CI설정 (Gitlab 추가설정 및 파일 추가 생성)
  5. 추가 설정 (오류 점검)
  6. 외부DNS(Freenom) 적용

1. Django 앱 생성

기본적인 앱이 구현되어있겠지만, 앱을 배포하기 위해서는 추가적인 라이브러리 설치가 필요합니다. 

pip install gunicorn whitenoise django-herok

# gunicorn: 위에서 설명한 파이썬 HTTP 서버(Python WSGI HTTP Server)입니다.
# whitenoise: 헤로쿠(Heroku)에서 정적 파일(Static files)을 사용하기 위해 필요한 모듈입니다.
# django-heroku: 헤로쿠(Heroku)에 배포하는 django 프로젝트의 각종 설정을 간단하게 해주는 모듈입니다.

 

settings.py에 아래의 내용을 추가해줍니다.

import django_heroku
import dj_database_url

# Add this line
PRODUCTION = os.environ.get('DATABASE_URL') != None

ALLOWED_HOSTS = ['wilky.ga','.herokuapp.com']

MIDDLEWARE = [
    ....중략....
    'whitenoise.middleware.WhiteNoiseMiddleware',
]


if PRODUCTION:
    DATABASES['default'] = dj_database_url.config()

django_heroku.settings(locals())

 

2. Heroku에 앱 생성

터미널에서 아래와 같이 입력하여 heroku에 로그인 후 새로운 앱을 생성합니다. (Heroku CLI는 설치되어 있어야 합니다.)

heroku login # Heroku 로그인
heroku create django-repo  # 앱 생성
heroku git:remote -a django-repo # 저장소를 등록해서 연결합니다.
git remote -v  # 원격 저장소 확인

이렇게 생성 및 연결이 되었다면, 이번엔 Heroku 사이트로 이동하여 몇가지 확인해놓아야 하는 부분을 체크합니다.

(1) App Name 확인: django-repo 라고 만들었습니다.

(2) App URL 확인 : django-repo.herokuapp.com이 됩니다. App의 settings하단에 Domains 섹션에 보시면 URL이 나와있습니다. 또는 Open App으로 직접 이동하여 URL을 확인할 수도 있습니다.

(3) API 키 확인 (내 계정 - Account Settings)

 

 

 

3. Gitlab에 Repository 생성 후 업로드

Gitlab에 Repository를 만들어줍니다. Repository 만드는 방법이나 Git 사용법은 다른 사이트를 참고하시기 바랍니다.

 

git을 이용해 소스코드를 저장해야 하는데, 저장하기전에 .gitignore파일을 아래의 사이트를 이용해 생성해 놓습니다. 

 

그런 다음 git을 시작하고, 코드를 Gitlab에 저장합니다.

# git 시작
git init  

# git 원격저장소 추가
git remote add origin https://gitlab.com/front42/django_blog.git

# 변경/추가/삭제
git add .

# git 커밋
git commit -m "initial commit"

# push
git push origin master
## 요즘은 main으로 되어있는데, 기본값을 설정에서 master로 바꿔서 진행합니다.

 

4. CI/CD를 위한 설정

(1) Gitlab - Heroku 연결

-Settings -> CI/CD에서 Variables를 Expand하여 변수를 추가합니다.

 

만들어야 되는 변수는 HEROKU_APPKEY, HEROKU_APP_HOST, HEROKU_APPNAME입니다. Heroku에서 App생성시 적어두었던 정보를 이용해 변수를 만듭니다. 단, Flags에 Protect variable을 해제해야 실행시 오류가 없습니다.이것으로 Gitlab과 Heroku가 연결이 되었습니다.

 

(2) 추가 파일 생성

라이브러리 설치 및 서비싱을 위한 설정파일들을 생성합니다.

<requirements.txt>

pip freeze > requirements.txt

 

<.gitlab-ci.yml>

stages:
  - test
  - deploy

# Uncomment these lines if you would use tdd using selenium in your project
# UnitTest:
#   image: python:3.6
#   stage: test
#   before_script:
#     - wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
#     - echo "deb http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list
#     - pip install -r requirements.txt
#     - python manage.py makemigrations
#     - python manage.py migrate
#     - apt-get update -qq && apt-get install -y -qq unzip
#     - apt-get install -y google-chrome-stable
#     - apt-get install -y xvfb
#     - wget https://chromedriver.storage.googleapis.com/2.32/chromedriver_linux64.zip
#     - unzip chromedriver_linux64.zip
#     - python manage.py collectstatic --no-input
#     - python manage.py runserver 8000 &
#   when: on_success
#   script:
#     - coverage run manage.py test
#     - coverage report -m

Deployment:
  image: ruby:2.6
  stage: deploy
  before_script:
    - gem install dpl
    - wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
  script:
    - dpl --provider=heroku --app=$HEROKU_APPNAME --api-key=$HEROKU_APIKEY
    - export HEROKU_API_KEY=$HEROKU_APIKEY
    - heroku run --app $HEROKU_APPNAME python manage.py migrate
  environment:
    name: production
    url: $HEROKU_APP_HOST

 

<Procfile>

migrate: bash python manage.py migrate
web: gunicorn my_app_name.wsgi  # my_app자리에 앱 이름을 넣는다.

추가파일을 생성 후 "git push origin master"를 수행하면, 해당 시점부터는 자동으로 Heroku로 배포가 되어, 사이트 확인이 가능해집니다.

 

5. Collectstatic 설정 변경

배포를 하는 과정을 보다보면 collectstatic 부분에서 에러가 나는 모습을 볼 수 있습니다.

이를 해결하기 위해서는 터미널에 아래와 같이 입력해줍니다.

heroku config:set DISABLE_COLLECTSTATIC=1

다른 방법도 여럿 보였지만, 위 방법이 제일 간단하고 정상작동됩니다.

참고로, Database(db.sqlite3)를 못읽어오는 경우도 있었는데, 혹시 다른 폴더 하위에 있다면(예: "db/db.sqlite3") 프로젝트폴더 내 바로 두고 실행하시기 바랍니다.

 

이렇게 하여 Heroku에 직접 소스코드를 push하여 올리지 않고 Gitlab만 관리하더라도 배포가 되는 것을 확인할 수 있습니다.

6. Freenom의 무료 DNS 적용하기

Heroku에서 제공하는 URL이 있긴 하지만, 좀더 우리가 원하는 URL을 적용하기 위해 DNS를 적용하는 방법을 알아보겠습니다. 우선 Freenom으로 가서 원하는 이름의 도메인을 만듭니다. (다른 사이트를 참조하시기 바랍니다.) 우선 만들기만 하고 추가적인 세팅은 잠시 뒤에 하겠습니다.

 

얼마전 Heroku 정책 변경으로 인해 DNS를 변경하기 위해서는 신용카드를 등록해야한다고 합니다. 돈이 나가는 것은 아니고 보안 목적이라고 하니 걱정은 안해도 될 것 같습니다. 우상단의 Account Setting > Billing 메뉴로 진입하여 개인의 신용카드를 등록합니다.

Settings > Domains 섹션에서 "Add domain"버튼을 클릭해줍니다.

그러면 우측에 아래와 같은 화면이 나타나는데, 위의 freenom에서 만들어준 주소를 적어주고, 하단의 Next버튼을 눌러줍니다. 그러면 DNS target이 나타납니다. 이 주소를 메모해서 Freenom에 적용시켜줘야 합니다.

Freenom에 로그인 후 Services > My Domains > Manage Domain > Manage Freenom DNS로 진입한 후,

 

Heroku에서 제공받은 DNS Target의 정보를 붙여넣습니다. 그리고 다른 정보는 아래와 같이 설정합니다.

Name: WWW

Type: CNAME

TTL: 144400

 

이렇게 하면 드디어 내 주소가 반영된 모습을 확인하실 수 있을겁니다.

 

※ 아직 데이터베이스(sqlite3)연결이 잘 안된는 것 같습니다. 블로그/로그인/사용자등록 기능이 제대로 나오지 않고 있는데, 좀 더 공부해봐야 겠습니다.

반응형
반응형

dotnet core3.1 쓰다가 업그레이드 된 닷넷이 있다고 하여 dotnet6를 설치하고 스캐폴딩을 수행해보겠습니다.

 

1. 필요한 라이브러리를 설치하고(Oracle DB)

필요한 라이브러리도 설치됨

2. 스캐폴딩......근데, 스캐폴딩하다가 에러가 발생했습니다.

dotnet ef dbcontext scaffold "User Id=abc;Password=1234;Data Source=abcd.efghijk.com:1521/dbname;" Oracle.EntityFrameworkCore -t TBL_ITMAN_AUTH -t TBL_ITMAN_CONSUMABLE -t TBL_ITMAN_ERP -t TBL_ITMAN_OH_UPLOAD -t TBL_ITMAN_PRT_MDL -t TBL_ITMAN_PRT_MST -t TBL_ITMAN_P_C_RS -t TBL_ITMAN_REQ_CON -t TBL_ITMAN_USELOG -o Models -f
지정된 명령 또는 파일을 찾을 수 없으므로 실행할 수 없습니다.
가능한 원인은 다음과 같습니다.
  * 기본 제공 dotnet 명령 철자가 잘못 입력되었습니다.
  * .NET 프로그램을 실행하려고 했지만, dotnet-ef이(가) 없습니다.
  * 전역 도구를 실행하려고 했지만, 이 이름의 dotnet 접두사가 있는 실행 파일을 PATH에서 찾을 수 없습니다.

 

 

찾다보니 아래와 같은 문구를 발견했는데요...

 

이 도구는 더 이상 기본 제공되지 않으며 명시적인 설치가 필요하다는 ASP.NET Core 3 Preview 4 발표 를 참조하십시오 .

dotnet ef 도구는 더 이상 .NET Core SDK의 일부가 아닙니다.

이 변경 dotnet ef으로 전역 또는 로컬 도구로 설치할 수있는 일반 .NET CLI 도구로 제공 할 수 있습니다. 예를 들어, 마이그레이션 또는 스캐 폴드 a를 관리 하려면 다음 명령을 입력하여 전역 도구로 DbContext설치 dotnet ef하십시오.

 

3. 결론은 아래와 같이 dotnet-ef를 전역으로 설치해줘야 한다고 합니다.

dotnet tool install --global dotnet-ef

그 후에는 잘 되네요..

반응형
반응형

Python의 주요 사용처가 엑셀, CSV 등의 데이터를 이용한 데이터 분석인데, 매번 함수를 찾아다니기 귀찮아서 한곳에 모아놓습니다. 

df=pd.read_csv('test.csv')
df.to_csv('test.csv', index=False)
df.head()
df.tail()
df.info()
df.dtypes
df.shape
df.describe()
df['나이'].describe()
df['나이'].value_counts() # 컬럼 값 분포
df['나이'].value_counts().index # 시리즈 인덱스
df['나이'].value_counts().tolist()
df['나이'].value_counts().reset_index() # 인덱스를 하나의 칼럼으로..
df['나이'].sort_values() # 특정 컬럼 정렬
df.sort_values(by=['나이','잔고']) # 특정 컬럼 정렬2
df['나이대']=df['나이'].apply(lambda x : in_business_age_name(x)) # Apply 함수 사전 정의 필요

df.isna()
df.isnull()
df.fillna(0)
df.rename(columns={'컬럼_origin','컬럼_new'}, inplace=True)
df.T
df.loc[0:1, 'name':'addr'])
df.iloc[:2]
df.iat[2,2]
df.at[2,'컬럼1']
df.drop('컬럼4', axis=1, inplace=True) # 컬럼4가 삭제됨
df.drop(4, inplace=True) # 인덱스4가 삭제됨
df['컬럼1'].unique()

df.tolist()
df.dict()
df.groupby('나이').count()
df.corr(method='pearson')
df.cov(min_periods=None, ddof=1)

df_col = pd.concat([df1, df2]) # 아래로 합침
df_col = pd.concat([df1, df2], axis=1) #오른쪽으로 합침

table=pd.pivot_table(df, values='국어', index=['반'], columns=['전공'], aggfunc=np.mean)
반응형
반응형

Pycharm이던 Jupyter Notebook이던 Dataframe형태의 결과를 볼 때, 칼럼의 수가 많아지면 기본적으로는 중간이 ....으로 표시됩니다. 간단하게 확인만 할건데 매번 추가코드를 작성하기도 귀찮고....

 

이럴 때 옵션 하나면 간단히 처리할 수 있습니다.

# row 생략 없이 출력
pd.set_option('display.max_rows', None)
# col 생략 없이 출력
pd.set_option('display.max_columns', None)

 

누군가에겐 도움이 되었길

반응형

+ Recent posts