Pandas/Numpy 숫자의 출력 옵션 조정

numpy 와 pandas 에서 수를 출력할 때 형식, 크기 및 범위를 설정할 수 있다. 간단히 보면 아래 테이블 같이 형식을 바꿔준다.

column 변환 column
1e6 precision 1,000,000
1.1e-6 format 0.1

아래 요약한 옵션 방법을 사용해서 Numpy 와 Pandas에 있는 숫자를 출력할 때 표현방법, 표기법, 환률, 정밀도 등을 변경해 사용할 수 있다

numpy 출력 형식 변경

numpy 숫자 출력 형식 변경

numpy.set_printoptions 을 사용할 수 있다.

1
2
numpy.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None,
nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None, *, legacy=None)

현재 출력형식 확인

np.get_printoptions() 으로 현재 상태를 출력할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
> np.get_printoptions()
{'edgeitems': 3,
'threshold': 1000,
'floatmode': 'maxprec',
'precision': 8,
'suppress': False,
'linewidth': 75,
'nanstr': 'nan',
'infstr': 'inf',
'sign': '-',
'formatter': None,
'legacy': False
}

Numpy 에서 실수 Float 의 출력 형식을 바꾸는 몇가지 사례를 보자

- formatter 이용

1
2
import numpy as np
np.set_printoptions(formatter={'float_kind': lambda x: "{0:0.3f}".format(x)})

- precision 이용

1
2
3
> np.set_printoptions(precision=4)
> np.array([1.123456789])
[1.1235]

- threshold 이용

개수가 많은 아이템을 출력할 때 요약해 출력할 수 있다.

1
2
3
> np.set_printoptions(threshold=5)
> np.arange(10)
array([0, 1, 2, ..., 7, 8, 9])

numpy.printoptions 사용

numpy.printoptions 를 with 구문과 함께 사용해 제한된 출력 조정을 할 수 있다.

출력시 printoptions 를 with 구문과 사용할 수 있다. set_printoptions 의 인자를 동일하게 적용할 수 있다

  • precision, threshold, edgeitems, linewidth, suppress, nanstr, infstr, formatter, sign, floatmode
1
numpy.printoptions(*args, **kwargs)[source]

소수점 출력 변경

1
2
3
4
5
6
> np.array([2.0]) / 3
array([0.66666667])


> with np.printoptions(precision=3):
> print( np.array([2.0]) / 3 )

pandas 숫자 출력 형식 변경

pandas에서 몇 가지 옵션을 바꾸는 방법을 정리해 보자. pandas의 옵션은 pd.options 를 사용한다.

pd.options.display

출력의 형태, 표기를 변경하는 것은 pd.options.display 아래에 있다. 여기서 사용할 수 있는 옵션은 describe_option() 으로 확인할 수 있다.

1
2
3
4
5
6
7
> pd.describe_option()
compute.use_bottleneck : bool
Use the bottleneck library to accelerate if it is installed,
the default is True
Valid values: False,True
[default: True] [currently: True]
...

- row, column 출력 개수 조정

  • pd.options.display.max_rows : 표를 출력할 때 최대 행 수입니다.
  • pd.options.display.min_rows : 표를 출력할 때 최소 행 수입니다.
1
2
3
4
5
import pandas as pd
> pd.options.display.max_rows
60
> pd.options.display.min_rows
10

min_row, max_row에 직접 대입하면 해당 옵션의 현재 값이 변경된다.

1
2
3
> pd.options.display.min_rows=100
> pd.options.display.min_rows
100

max_rows에 값을 입력하면 테이블의 최대 행수를 바꿀 수 있다.

이미지 참조 1

1
2
3
> pd.options.display.max_rows = 100
> pd.options.display.max_rows
100

- pd.get_option(), pd.set_option() 함수

pd.get_option() 함수를 이용해서 옵션인자에 대한 정보를 확인할 수 있다.

1
2
> pd.get_option('min_rows')
100

get_option은 옵션 이름의 일부만 일치해도 된다.

1
2
> pd.get_option('min_r')
100

max_rows 수를 설정한다. set_option도 일부만 일치해도 된다.

1
2
3
4
5
6
> pd.set_option('max_rows', 20)
> pd.options.display.max_rows
20
> pd.set_option('max_r', 50)
> pd.options.display.max_rows
50

- 컬럼의 폭 조정

display.max_colwidth 는 보통 50~70자 정도 정해져 있다. 컬럼에 표시되는 텍스트가 50자가 넘으면 ... 줄임 표시가 나타난다.

1
2
> pd.options.display.max_colwidth
50

- chop_threshold

chop_threshold 는 값의 크기 한계를 지정해서 이 값보다 작은 수는 모두 0으로 표시한다.

1
2
3
4
5
6
> pd.options.display.chop_threshold = 0.99
> pd.DataFrame({'x': [10, 1, 0.1]})
> print(x)
0 10.0
1 1.0
2 0.0

숫자 포매팅

다양한 사례는:

- float_format

float_format 는 실수 값을 출력시 소수점의 출력의 정밀도를 조정할 수 있다. 아래 람다 함수 lambda x: f'{x:.1f} 는 실수 x를 받아 소수점 첫째 자리까지 출력해 준다.

1
2
3
4
> pd.options.display.float_format = lambda x: f'{x:.1f}'
> pd.DataFrame({'x': [3.141592]})
x
0 3.1

또한 set_option 을 사용할 수 있다.

1
> pd.set_option('display.float_format', '{:.2f}'.foramt )

금액 단위에 사용하는 천단위 구분을 위해서 {:,.2f} 형식을 사용하면 화폐 단위를 추가하고 천단위 구분자를 추가해 주고 소수점 2자리수 정밀로를 지정한다.

1
2
3
4
5
> pd.set_option('display.float_format', '${:,.2f}'.format )
> pd.DataFrame({'x': [10000000.0, 34589234.4]})
x
0 $10,000,000.00
1 $34,589,234.40

- precision

실수의 소수점은 precision 로 과학적 표기법으로 변환할 자릿수를 지정한다. 아래와 같이 하면 소수점 셋째 자리 밑으로는 과학적 표기법으로 표시합니다.

1
2
3
4
> pd.options.display.precision = 3
> pd.DataFrame({'x': [0.5], 'y': [0.0005]})
x y
0 0.5 5.000e-04

과학적 표기법으로 3.000e-04는 3.000 이다. 자릿수가 아주 작거나 큰 수를 표기할 때 유용합니다.

- 설정 초기화 reset_option()

설정을 초기화할 때 사용한다.

1
2
3
4
# chop_threshold 옵션 초기화
pd.reset_option('display.chop_threshold')
# float_format 옵션 초기화
pd.reset_option('display.float_format')

- 옵션 설명 describe_option()

pd.describe_option(OPTIONS) 를 사용하면 해당 옵션에 대한 설명을 출력해 준다.

1
2
3
4
5
> pd.describe_option("max_rows")
display.max_rows : int
If max_rows is exceeded, switch to truncate view. Depending on
`large_repr`, objects are either centrally truncated or printed as
a summary view. 'None' value means unlimited.

참고

1: Try These Pandas Display Configurations

2: Pandas options

Python - 파이썬 프로젝트 패키징과 배포하기

파이썬에서 작업한 소스를 공개/비공개 배포하기 위해서 패키징을 하는 방법을 요약, 정리했다.

파이썬 모듈 배포하기

이 글은 setuptools, builds 그리고 PyPI 업로드를 위한 twine 를 사용하고 있다.

[핵심 용어]

  • PyPi, Python Package Index: 파이썬 사용자를 위한 오픈소스 패키지의 공개 저장소 일명 PyPi
  • PyPa, 파이썬 패키징 위원회: 표준 패키징 도구/메타 데이터/파일 형식 표준을 GitHub 와 Bitbucket 을 통해서 여러 패키징 도구, 문서, 이슈 추적기를 관리하고 있다.
  • distutils: 1998년/파이썬 표준 라이브러리 최초의 빌드 및 배포 시스템. 대부분 직접 사용이 단계적으로 폐지되고 있다.
    • distutils는 파이썬 3.10부터 deprecated, 3.12에서 삭제될 예정.
  • setuptools : 2004 공개/ distutils 의 드롭인(drop-in) 대체품. distutils 와 큰 차이는 다른 패키지에 대한 의존성을 선언할 수 있다.
  • [pyproject.toml]: 2016년 setuptools의 메타 파일 setup.py 의존성을 피하고자 독립한 빌드용 선언적 메타정보 파일.
  • wheel: distutils/setuptools 에 bdist_wheel 명령을 추가하는 프로젝트이다. 파이썬 라이브러리를 바이너리 확장을 포함/크로스 플랫폼 바이너리 패키징 형식 지원 (“휠”,”휠 파일”, PEP 427 정의).

도구 설치

setuptools 기반 배포도구 설치

1
python -m pip install setuptools wheel twine

파이썬 패키징

https://packaging.python.org/en/latest/tutorials/packaging-projects/ 내용을 요약, 정리, 보충한다.

프로젝트 생성

패키징 수행하면 별도의 가상환경을 생성해서 진행한다.

프로젝트를 패키징하는 과정을 위해서 packaging_tutorial 폴더 아래에 같은 구조를 갖는다.

1
2
3
4
5
packaging_tutorial/
└── src/
└── example_package_YOUR_USERNAME_HERE/
├── __init__.py
└── example.py
  • example_package_YOUR_USERNAME_HERE : 프로젝트 이름이고 중복하지 않게 한다.
  • __init__.py : 빈 파일로 폴더를 패키지로 인식하게 한다.
  • example.py : 모듈.

example.py 모듈 소스.

1
2
def add_one(number):
return number + 1

패키징용 파일 생성

배포를 위한 프로젝트의 구성을 위해 패키징에 필요한 파일을 추가한 구조는 아래 같다.

1
2
3
4
5
6
7
8
9
packaging_tutorial/
├── LICENSE
├── pyproject.toml
├── README.md
└── src/
│ └── example_package_YOUR_USERNAME_HERE/
│ ├── __init__.py
│ └── example.py
└── tests/
  • LICENSE : 라이센서 선언
  • pyproject.toml : 프로젝트 배포 프로젝트 생성에 사용하는 프론트엔드 빌드도구 pip, 백엔드 밸드도구 build
  • README.md
  • tests/ : 테스트 파일용 공간. Leave it empty for now.

패키징의 프론트엔드, 백엔드는 참조의 5번 항목을 살펴보자.

pyproject.toml 구성

보통 파일 내용은 아래 항목으로 구성한다. 이 파일은 TOML 형식의 구조를 따르고 있다. 여기에 대해서는 아래 참조 4번 항목 내용을 보기 바란다.

1
2
3
4
5
6
7
8
9
[build-system]
...

[project]
...

[project.urls]
...

빌드 도구를 명시하는 명세서 pyproject.toml에 setuptools 를 사용한 예이다.

1
2
3
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
  • requires : 빌드용 도구 지시.
  • build-backend : 프론트엔드 (pip)에서 빌드에 사용하는 백엔드 도구

다음은 Hatching 이란 빌드 도구를 사용한 예이다.

1
2
3
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

메타 정보를 포함한 간단한 pyproject.toml 구성 결과.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "example_package_YOUR_USERNAME_HERE"
version = "0.0.1"
authors = [
{ name="Example Author", email="author@example.com" },
]
description = "A small example package"
readme = "README.md"
requires-python = ">=3.7"
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]

[project.urls]
"Homepage" = "https://github.com/pypa/sampleproject"
"Bug Tracker" = "https://github.com/pypa/sampleproject/issues"

자세한 메타 정보 내역은 프로젝트 메타정보 정의를 참조한다. 주요 메타 정보의 인자:

  • [project]:
    • requires-python : 패키지가 요구하는 최소 파이썬 버전 명시
    • classifiers: pip가 인지하는 패키지에 대한 정보

README.md / LICENSE 파일

README.md 파일에 패키지 모듈를 설명한다.

1
2
3
4
5
# Example Package

This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.

LICENSE 파일에 저작권을 명시한다.

1
2
3
Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy

배포 묶음 생성하기

배포를 위한 build 도구를 설치한다.

1
python3 -m pip install --upgrade build

packaging_tutorial 폴더 아래 pyproject.toml 파일이 있는 위치에서 배포를 위한 build 명령으로 소스를 패키징을 한다.

build 를 수행하면 별도의 venv 가상환경을 생성해서 의존성에 명시된 setuptools 등을 설치하고 빌드를 진행한다.

1
2
3
4
5
6
7
> python3 -m build
* Creating venv isolated environment...
* Installing packages in isolated environment... (setuptools>=61.0)
...
...
removing build\bdist.win-amd64\wheel
Successfully built example_package_YOUR_USERNAME_HERE-0.0.1.tar.gz and example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl

이 명령의 결과로 dist 폴더에 우리 프로젝트에 대한 배포용 패키징으로 소스 패키징 .gz 파일, built distribution 패키징 .whl 2개의 파일이 생성된다.

1
2
3
dist/
├── example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
└── example_package_YOUR_USERNAME_HERE-0.0.1.tar.gz

pip 로 wheeels 설치하기

pip 에서 built distribution 파일을 직접 설치할 수 있다. installing-from-wheels 참조.

다음은 우리 프로젝트의 wheel 패키징을 설치한다.

1
python -m pip install example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl

혹은 provides_extras 메타 정보를 사용해 추가 설치를 한다면,

1
python -m pip install './somepackage-1.0-py2.py3-none-any.whl[my-extras]'

Upload

처음 PyPi 에 업로드를 하려면 아래 2가지 단계를 거쳐서 진행해 본다.

  1. https://test.pypi.org/account/register/ 에서 등록
    1. 실제 pypi 가 아닌 튜토리얼과 테스트를 위한 곳.
  2. PyPi 업로드를 완성하려면 PyPI API token 을 발급받아야 한다.
    1. https://test.pypi.org/manage/account/#api-tokens

PyPI에 업로드가 완료되면 pip 를 통해서 패키지를 설치할 수 있다. 업로드를 위해서 Twin 패키지를 설치하고 사용해야 한다.

1
python3 -m pip install --upgrade twine

twine 모듈을 사용해서 dist/ 아래의 모든 소스/휠 패키징 묶음을 업로드할 수 있다. 지금은 testpypi 에 업로드를 해보자.

1
python3 -m twine upload --repository testpypi dist/*
  • 업로드시 username은 __token__ 사용.
  • 패스워드는 발급받은 pypi- 으로 시작하는 token 값.

업로드 진행은 아래 같을 것이다.

1
2
3
4
5
6
7
Uploading distributions to https://test.pypi.org/legacy/
Enter your username: __token__
Uploading example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.2/8.2 kB • 00:01 • ?
Uploading example_package_YOUR_USERNAME_HERE-0.0.1.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.8/6.8 kB • 00:00 • ?

여기서 repository로 testpypi 를 지정했으므로 업로드한 결과는 다음 같이 확인할 수 있다.

  • https://test.pypi.org/project/example_package_YOUR_USERNAME_HERE

저장소에서 설치하기

위에 testpypi 에 업로드한 패키지를 설치하려면 아래 같이 --index-url 로 저장소를 지정해서 사용한다.

1
python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-package-YOUR-USERNAME-HERE

PyPI 에 업로드

마지막으로 실제 패키지를 PyPI에 업로드하려면 https://pypi.org 등록을 하고, 등록한 사용자 아이디를 사용하고 --repository 인자를 제외하고 업로드하면 된다.

1
python3 -m twine upload dist/*

통합 메타 정보로서 pyproject.toml 활용

테스트, 코드 포맷팅 등에 대한 정보로 활용한다. 대표적으로는 코드 포맷팅 도구인 black, 테스트용 프레임워크인 pytest 등이 pyproject.toml에 설정 값을 저장하고 있다 - 파이썬 패키징의 역사, blog

1
2
3
4
5
# pyproject.toml of black
[tool.black]
line-length = 88
target-version = ['py36', 'py37', 'py38']
include = '\.pyi?$'

다음

이후에 다른 빌드 도구들, 테스트 도구들을 다뤄보자.

참고

  1. 파이썬 모듈 배포하기, python.org
  2. Tool recommendations, python.org
    1. 주요 패키징에 필요한 도구 안내
  3. 파이썬 패키징의 역사, blog
  4. TOML의 이해와 기본 활용, itworld
  5. Python package의 build frontend 와 backend

bitbuket 에 SSH key 등록하기

github, bitbucket 같은 클라우드 사이트에 Client 프로그램으로 SSH 접속을 위해서는 SSH 키 쌍 생성하고 클라우드 사이트에 등록해야 한다. 보통 github, bitbucket 등 같은 SSH 접근을 지원하는 사이트는 ssh-agent forwarding 방식을 사용한다.

  1. 클라이언트에서 ssh 키 쌍을 생성
  2. 클라이언트에 개인키를 ssh-agent 에 등록
  3. 클라우드 서비스에 공개키를 등록
  4. 클라이언트 프로그램에서 ssh 사용시 ssh-agent 등록한 개인키로 암호화

여기서는 bitbucket 을 예로 들고 있다.

과정은 bitbucket 을 예로 들었지만 github 도 유사한 과정을 거친다. github에서 Key 등록에 대해서는 링크를 참조한다. github 에 SSH key 등록하기


SSH 구성과 2단계 인증

Git Credential Manager (GCM) 를 git client 에서 bitbucket 에 접속해 사용하는데 이용할 수 있다. SSH 구성을 하지 않고 bitbucket 을 사용하려면 GCM 을 사용하면 된다. Git Credential Manager

단, GCM works over HTTPS, not SSH. 그래서 git clone https://{username}@bitbucket.org/{workspace}/{repository}.git 이렇게 요청해야 한다.

설명에 따라서 먼저 ssh host key 를 생성하고 bitbucket 에서 사용하는 개인용 ssh key 를 만든다. 이후 bitbucket 에 등록하면 된다.

SSH Client Keys

저장소에 접근하는 url은 HTTPS or SSH 에 따라 달라진다.

  1. HTTPS

https://<repo_owner>@bitbucket.org/<accountname>/<reponame>.git

  1. SSH

git@bitbucket.org:<repo_owner>/<reponame>.git

or

ssh://git@bitbucket.org/<repo_owner>/<reponame>.git

bitbucket은 암호 알고리즘으로 keys: Ed25519, ECDSA, RSA, and DSA 를 지원한다.

예를 들어 아래 같이 생성한 공개키를 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
#Ed25519 (ed25519) / 256
$ ssh-keygen -t ed25519 -b 256

# ECDSA (ecdsa) / 256
$ ssh-keygen -t ecdsa -b 256

# RSA (rsa) / 2048
$ ssh-keygen -t rsa -b 2048

# DSA / DSS (dsa) / 1024
$ ssh-keygen -t dsa -b 1024

SSH Host Key 생성

아래는 bitbucket 서버의 공개키 이다.

1
2
3
256 SHA256:FC73VB6C4OQLSCrjEayhMp9UMxS97caD/Yyi2bhW/J0 bitbucket.org (ECDSA)
256 SHA256:ybgmFkzwOSotHTHLJgHO0QN8L0xErw6vd0VhFA9m3SM bitbucket.org (ED25519)
2048 SHA256:46OSHA1Rmj8E8ERTC6xkNcmGOw9oFxYr0WF6zWW8l1E bitbucket.org (RSA)

해당 공개키가 적적할지 확인은 다음 같이 curl 로 테스트해볼 수 있다.

1
curl https://bitbucket.org/site/ssh

개별키 생성

ssh 를 사용해서 bitbucket 클라우드에 접근하려면 사용하는 클라이언트에서 SSH 로 개인키와 공개키를 생성해야 한다. SSH 키를 생성하려면 아래 과정이 필요하다.

  1. Open SSH 설치
  2. SSH 서비스
  3. SSH 키 생성

여기서 Linux/macOS 그리고 Windows 11 에서 키 쌍을 생성해서 bitbucket에 등록하는 과정을 살펴보겠다.


Windows 11에서 키 생성

Windows 11 에서 Git 이 설치되어 있다고 가정.

1
2
3
> get-command git

Application git.exe 2.38.1.1 C:\Program Files\Git\cmd\git.exe

Openssh 확인

1
2
> ssh -V
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3

ssh 명령 위치 확인

1
> Get-Command ssh

결과 ssh 명령을 git config 로 ssh 명령을 지정

1
git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe

SSH agent 시작

git 이 ssh 키를 사용하려면 SSH agent 가 시작되어야 한다. 보통 Git for windows 와 Windows 11 이후 Windows OpenSSH 를 사용하므로

Windows OpenSSH 사용자는 다음 같이 agent를 확인하고 시작한다.

1
2
3
4
5
> Get-Service ssh-agent

Status Name DisplayName
------ ---- -----------
Stopped ssh-agent OpenSSH Authentication Agent

ssh-agent 서비스를 시작 하려면 Windows service에서 OpenSSH Authenticate Agent 서비스를 시작해 두어야 한다.

속성에서 시작으로 한다.

서비스가 정상적으로 시작되면 아래 명령으로 시작/종료 그리고 재시작을 할 수 있다. - 시작 안되어 있으면 알수없는 에러가 난다.

1
> Start-Service ssh-agent

Git for windows 를 사용하면 Git for windows의 bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

bitbucket에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다. 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다. 생성시 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.

1
> ssh-keygen.exe -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
9
10
> dir .ssh

Directory: C:\Users\daddy\.ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
> ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host bitbucket.org
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

macOS / Linux

Openssh 확인

1
2
$ ssh -V
OpenSSH_8.2p1 macOS, OpenSSL 1.1.1f 31 Mar 2020

ssh 명령이 없으면 macOS는 brew 로 설치한다.

1
$ brew install openssh

Linux 는 apt, dnf, pacman 을 사용해 설치한다.

1
$ sudo apt update && sudo apt install openssh-client

SSH agent 시작

git 에서 ssh 키를 사용하려면 SSH agent 가 시작한다. bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

이 명령을 ~/.bashrc, ~/.zshrc, ~/.profile, 등에 등록해 둔다. 에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

bitbucket에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다.

  • 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다.
  • 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.
1
$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
$ ls -l .ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키 쌍를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
$ ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host bitbucket.org
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

Bitbucket Cloud with your public key

bitbucket 을 위해 생성한 키 쌍에서 공개키 KEY_FILE.pub 를 bitbucket 의 계정에 등록해 주어야 한다.

  1. Settings -> Personal Settings
  1. Secutiry -> SSH Keys -> Add key

생성한 키 쌍에서 bitbucket_work.pub 같이 공개키를 등록하는데, 공개키 파일 내용을 복사해 붙여넣기를 하면 된다.

cat 명령 등으로 내용을 복사한다.

1
2
3
4
5
> cat .\.ssh\bitbucket_work.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDo+7VGfxlhxFsy0Edu+PPmqngJVzwLQuLPanOi5x8t2yu7RmFNlEfU32AgA7vkoLno98XFZaUZ3ZjMwVu7LWeLMNczx5nH//
...
...
+v7ttamzvFe8idOtCjJszG5l8rn4poIN2E24AWGvCGbzs55WRXY/amYEqP5/maH0NT+pYM2ZMV7Nt8Jb86iQ== james@thinkbee.kr

사이트의 Add key 창에 붙여 넣는다.

이제 새 SSH 키가 등록되었다.

클라이언트에서 bitbucket 에 SSH 접속이 가능한지 테스트한다. 단, 모든 SSH 연결은 최초 접속시 호스트 접속 여부를 묻는다. 아래 같이 bitbucket.org 접속시 접속 여부를 묻는 다이얼로그가 나온다.

1
2
3
4
5
6
7
8
9
$ ssh -T git@bitbucket.org
The authenticity of host 'bitbucket.org (104.192.141.1)' can't be established.
ED25519 key fingerprint is SHA256:ybgmFkzwOSotHTHLJgHO0QN8L0xErw6vd0VhFA9m3SM.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'bitbucket.org' (ED25519) to the list of known hosts.
authenticated via ssh key.

You can use git to connect to Bitbucket. Shell access is disabled

결과적으로 아래 같이 결과가 출력되면 성공한 상태다.

1
2
3
authenticated via ssh key.

You can use git to connect to Bitbucket. Shell access is disabled

이제 git 클라이언트에서 HTTPS, SSH 를 통해서 bitbucket 과 ssh 연결이 가능하다. git 클라이언트로 push, pull 등을 수행할 수 있다.


참고

  1. https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/
  2. github 에 SSH key 등록하기

mysqladmin CLI 주요 사용

mysqladmin, mysqldump 명령 사용

mysqladmin 명령 사용하기

  • MYSQL의 root 패스워드 변경하기
  • MYSQL의 일반계정 사용자 패스워드 변경하기
  • 새로운 데이터베이스 생성하기
  • 사용중인 데이터베이스 삭제하기
  • MYSQL의 현재상황 살펴보기
  • MYSQL에 접속한 클라이언트(threads)리스트 확인하기
  • MYSQL 캐쉬 데이터 동기화하기
  • MYSQL 종료하기
  • MYSQL 실행 환경변수 확인하기
  • MYSQL에 접속한 사용자 접속끊기
  • MYSQL의 버전 및 여러가지 실행 정보들 확인하기
  • MYSQL이 정상적으로 살아있는지 죽었는지 확인하기
  • 기타 MYSQL관리에 필요한 유용한 설정 및 정보확인

사용법

1
2
3
4
mysqladmin [-h서버] -u아이디 -p 데이터베이스명 <명령어>

<명령어>: reload, shutdown, create, status등

- MYSQL의 root 패스워드 변경하기

- MYSQL의 일반계정 사용자 패스워드 변경하기

- 새로운 데이터베이스 생성 / 사용중인 데이터베이스 삭제하기

새로운 스키마를 생성할 때 create 명령을 사용한다.

1
mysqladmin -u root -p create 새로운데이터베이스명

기존 스키마를 삭제 할 때 drop 명령을 사용한다.

1
mysqladmin -u root -p drop  데이터베이스명

- MYSQL의 현재상황 살펴보기

status 명령으로 MySQL의 상태를 확인할 수 있다.

  • MYSQL의 총 실행시간
  • 현재 처리중인 스레드(Threads)수
  • 오픈된 데이터베이스 및 테이블 수
  • 초당 평균 처리속도
  • Slow query, Flush tables등
1
mysqladmin -u root -p status

i 인자에 상태 확인 간격을 주어 계속 관찰이 가능하다.

1
2
# 5초 간격
mysqladmin -i5 status -u root -p

- MYSQL의 현재상황 자세히 살펴보기

extended-status라는 명령어는 SQL 명령의 SHOW STATUS 로 보는 시스템 상태와 거의 동일.

1
mysqladmin -u root -p extended-status

- MYSQL에 접속한 클라이언트(threads)리스트 확인하기

- MYSQL 캐쉬 데이터 동기화하기

reload, flush-privileges 를 사용해서 테이블 및 권한 테이블의 캐시를 갱신한다.

MYSQL의 모든 실제 데이터들은 각각의 데이터베이스 내에 존재하는 테이블(table)에 저장되므로 MYSQL의 테이블(table)을 reload 혹은 priviliges 테이블을 flush 해서 갱신한다.

1
2
mysqladmin -u root -p reload
mysqladmin -u root -p flush-privileges

- MYSQL 실행 환경변수 확인하기

mysql client 로 접속해 show variables; 명령을 mysqladmin 명령으로 사용이 가능하다.

1
mysqladmin -u root -p variables

- MYSQL 실행 프로세스 확인하기

mysql client 로 접속해 processlist; 로 mysqladmin 명령으로 사용이 가능하다.

1
mysqladmin -u root -p processlist

- MYSQL에 접속한 사용자 접속끊기

보통 processlist 로 실행중인 ID 를 끊을 수 있다.

1
2
3
4
+----+-----------+------------------+-----------+---------+------+----------+-----------------+----------+
| Id | User | Host | db | Command | Time | State | Info
+----+-----------+-----------------+-----------+---------+------+----------+------------------+----------+
| 31 | stockmart | 192.168.0.2:564 | fedb | Sleep | 18 |

processlist 의 Id컬럼에 있는 접속 Id를 끊는다.

1
mysqladmin -u root -p kill 사용자ID

- MYSQL의 버전 및 여러가지 실행 정보들 확인하기

  • MYSQL의 버전

사용형식 : mysqladmin -u root -p version

  1. MYSQL이 죽었는지 살았는지 확인하기

사용형식 : mysqladmin -u root -p ping

  • MYSQL 소켓파일 위치정보

  • MYSQL의 총 실행시간 정보

- 기타 MYSQL관리에 필요한 유용한 설정 및 정보확인

  • MYSQL의 총 스레드(threads)수

  • MYSQL의 오픈된 데이터베이스와 테이블 수

  • MYSQL의 초당 응답완료 시간

- MYSQL 종료하기



mysqldump 명령

예: 문자셋 latin1 데이터 덤프

문자셋을 mysql> show variables like 'c%' 등으로 확인해서 적절히 덤프를 한다.

1
mysql> mysqldump -u [username] –p[password] --default-character-set=utf8 -N --routines --skip-triggers --databases [database_name] > [dump_file.sql]

덤플 사례: https://itzone.tistory.com/711

github 에 SSH key 등록하기

github, bitbucket 같은 클라우드 사이트에 Client 프로그램으로 SSH 접속을 위해서는 SSH 키 쌍 생성하고 클라우드 사이트에 등록해야 한다.

보통 github, bitbucket 등 같은 SSH 접근을 지원하는 사이트는 ssh-agent forwarding 방식을 사용한다.

  1. 클라이언트에서 ssh 키 쌍을 생성
  2. 클라이언트에 개인키를 ssh-agent 에 등록
  3. 클라우드 서비스에 공개키를 등록
  4. 클라이언트 프로그램에서 ssh 사용시 ssh-agent 등록한 개인키로 암호화

여기서는 github 에 ssh key 등록 과정을 요약하고 있다.


SSH 구성과 SSH 인증

먼저 ssh host key 를 생성하고 github 과 사용할 개인 key 를 만든다. 개인키를 ssh-agent 방식으로 등록하고 공개키를 github 에 등록하면 된다.

ssh-agent 키 관리

로컬 머신에서 사용하는 SSH Key 쌍에 대한 접근을 ssh-agent 를 통해서 진행한다. managing deploy keys 에 설명되어 있다.

  • 에이전트 전달은 로컬 개발 컴퓨터에서 사용하는 것과 동일한 SSH 키를 사용합니다.
  • 단 사용자 클라이언트에 SSH에 있어야 합니다

SSH Client Keys

저장소에 접근하는 url은 HTTPS or SSH 에 따라 달라진다.

  1. HTTPS

https://<repo_owner>@github.com/<accountname>/<reponame>.git

  1. SSH

git@github.com:<repo_owner>/<reponame>.git

or

ssh://git@github.com/<repo_owner>/<reponame>.git

github은 암호 알고리즘으로 keys: Ed25519, ECDSA, RSA, and DSA 를 지원한다.

예를 들어 아래 같이 생성한 공개키를 사용할 수 있다.

1
2
3
4
5
6
7
8
#Ed25519 (ed25519) / 256
$ ssh-keygen -t ed25519 -b 256

# ECDSA (ecdsa) / 256
$ ssh-keygen -t ecdsa -b 256

# RSA (rsa) / 2048
$ ssh-keygen -t rsa -b 4096

개별키 생성

ssh 를 사용해서 github 에 접근하려면 사용하는 클라이언트에서 SSH 로 개인키와 공개키를 생성해야 한다. SSH 키를 생성하려면 아래 과정이 필요하다.

  1. Open SSH 설치
  2. SSH 서비스
  3. SSH 키 생성

여기서 Linux/macOS 그리고 Windows 11 에서 키 쌍을 생성해서 github에 SSH Key를 등록하는 과정을 살펴보겠다.


Windows 11에서 키 생성

Windows 11 에서 Git 이 설치되어 있다고 가정.

1
2
3
> get-command git

Application git.exe 2.38.1.1 C:\Program Files\Git\cmd\git.exe

Openssh 확인

1
2
> ssh -V
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3

ssh 명령 위치 확인

1
> Get-Command ssh

결과 ssh 명령을 git config 로 ssh 명령을 지정

1
git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe

SSH agent 시작

git 이 ssh 키를 사용하려면 SSH agent 가 시작되어야 한다. 보통 Git for windows 와 Windows 11 이후 Windows OpenSSH 를 사용하므로

Windows OpenSSH 사용자는 다음 같이 agent를 확인하고 시작한다.

1
2
3
4
5
> Get-Service ssh-agent

Status Name DisplayName
------ ---- -----------
Stopped ssh-agent OpenSSH Authentication Agent

ssh-agent 서비스를 시작 하려면 Windows service에서 OpenSSH Authenticate Agent 서비스를 시작해 두어야 한다.

속성에서 시작으로 한다.

서비스가 정상적으로 시작되면 아래 명령으로 시작/종료 그리고 재시작을 할 수 있다. - 시작 안되어 있으면 알수없는 에러가 난다.

1
> Start-Service ssh-agent

Git for windows 를 사용하면 Git for windows의 bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

github에서 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다. 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다. 생성시 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.

1
> ssh-keygen.exe -t ed25519  -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: github 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

참고: Ed25519 알고리즘을 지원하지 않는 레거시 시스템을 사용하는 경우 다음을 사용합니다.

1
>$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
9
10
> dir .ssh

Directory: C:\Users\daddy\.ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
> ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 github 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host github.com
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

macOS / Linux

Openssh 확인

1
2
$ ssh -V
OpenSSH_8.2p1 macOS, OpenSSL 1.1.1f 31 Mar 2020

ssh 명령이 없으면 macOS는 brew 로 설치한다.

1
$ brew install openssh

Linux 는 apt, dnf, pacman 을 사용해 설치한다.

1
$ sudo apt update && sudo apt install openssh-client

SSH agent 시작

git 에서 ssh 키를 사용하려면 SSH agent 가 시작한다. bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

이 명령을 ~/.bashrc, ~/.zshrc, ~/.profile, 등에 등록해 둔다. 에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

github에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다.

  • 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다.
  • 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.
1
$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

참고: Ed25519 알고리즘을 지원하지 않는 레거시 시스템을 사용하는 경우 다음을 사용합니다.

1
>$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
$ ls -l .ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키 쌍를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
$ ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host github.com
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

github 에 public key 등록하기

github 계정의 SSH and GPG keys에서 등록해 주어야 한다. 키 쌍 중 공개키 KEY_FILE.pub 내용을 등록해 준다.

  1. Settings -> Personal Settings
' >

cat 명령 등으로 내용을 복사한다. 사이트의 Add key 창에 붙여 넣는다.

클라이언트에서 github SSH 접속이 가능한지 테스트한다. 단, 모든 SSH 연결은 최초 접속시 호스트 접속시 접속 여부를 묻는 다이얼로그가 나온다.

결과적으로 아래 같이 결과가 출력되면 성공한 상태다.

1
2
3
$ $ ssh -T git@github.com

Hi USER! You've successfully authenticated, but GitHub does not provide shell access.

이제 git 클라이언트에서 HTTPS, SSH 를 통해서 github 과 ssh 연결이 가능하다. git 클라이언트로 push, pull 등을 수행할 수 있다.


참고

  1. Connect with SSH, github
  2. SSH 연결 테스트, github
  3. bitbucket 에 SSH key 등록하기

Jupyterlab 의 extension 을 설치하고 build 시 npm 에러.

jupyterlab 의 확장 모듈을 다운받아 설치시 nodejs 실행 환경이 제공되야 한다.

jupyterlab 확장 build error

jupyterlab 의 확장 모듈을 다운받아 설치하다 보면 npm 과 연계한 프로그램이 많다. 아래 같은 nodejs 관련 에러를 발생한다.

1
2
3
4
5
6
daddy> jupyter lab build
...
...
An error occurred.
RuntimeError: npm dependencies failed to install
See the log file for details: C:\Users\USERID\AppData\Local\Temp\jupyterlab-debug-4kr1lkn1.log

결론으로 현재 jupyterlab 을 실행하는 환경에서

  1. nodejs 버전이 설치되어 있고
  2. jupyterlab extensions가 활성화 되어 있다면

해당 로그 파일을 확인해 보면 대부분 nodejs 버전이 일치하지 않아서 아래 같은 로그를 기록하고 있어 보인다.

1
2
error readable-stream@4.3.0: The engine "node" is incompatible with this module. Expected version "^12.22.0 || ^14.17.0 || >=16.0.0". Got "14.15.0"
error Found incompatible module.

nodejs 버전을 업그레이드 하고 빌드를 수행하니 잘 된다.

MySqLI CLI 주요 명령

mysql CLI 에서 MySQL/MariaDB 관리자로서 사용할 수 있는 명령을 요약한다.

  • create user, grant, drop, delete, remove …

MySqLI CLI Client 로 접속하기

1
mysql [-h서버] -u아이디 -p 데이터베이스명

데이터베이스 스키마

1
mysql> SHOW DATABASES;

use 명령을 사용하여 사용할 데이터베이스/스키마를 선택

1
mysql> USE TESTDB;

선택된 데이터베이스 안의 테이블 확인

1
2
mysql> SHOW TABLES;
mysql> SHOW TABLES LIKE 't%'; # t로 시작하는 테이블

특정 스키마 혹은 테이블의 생성 쿼리를 출력

1
2
mysql> SHOW CREATE DATABSE SAKILA;
mysql> SHOW CREATE TABLE STUDENTS;

데이터베이스의 생성 및 삭제

1
mysql> CREATE DATABASE testdb CHARACTER SET utf8 COLLATE utf8_general_ci;
  • utf8_general_ci 는 대소문자를 구분하지 않는다.
  • 대소문자를 구분하려면 binary 타입으로 지정. 예) “utf8_bin”

캐릭터셋과 COLLATE 를 생략하면 서버 설치시 지정한 기본 값으로 설정

1
mysql> CREATE DATABASE testdb;

스키마 제거

1
mysql> DROP [SCHEMA]DATABASE testdb;

시스템 환경 확인

서버의 환경 변수

1
2
# 모든 변수
mysql> SHOW VARIABLES;

DBMS 버전

1
2
3
mysql> select @@version;       -- DBMS version

mysql> SHOW VARIABLES LIKE 'version';
1
mysql> SHOW VARIABLES LIKE 'innodb_%';

지원하는 문자세트 구성

1
2
3
mysql> SHOW CHARACTER SET;

mysql> SHOW CHARACTER SET LIKE 'utf%';

문자세트 확인

1
2
-- 환경변수에서 확인
mysql> SHOW VARIABLES LIKE 'c%';

지원하는 콜레이션

1
2
3
mysql> SHOW COLLATION;

mysql> SHOW COLLATION WHERE Charset = 'utf8mb4';

외부 파일 실행하기

첫 번째는 mysql cli 에 지정하여 실행하는 방법

1
2
3
$ mysql -u dbuser -p testdb < insert.sql

Enter password: ****

두 번째 방법을 mysql cli에서 source 명령을 사용

1
mysql> SOURCE C:\Users\USERID\insert.sql;


User & Privileges

사용자 db

mysql 스키마의 user 테이블을 사용한다.

SELECT Host,User,plugin,authentication_string FROM mysql.user;

사용자 추가

사용자를 생성시 호스트 주소에 ‘%’, ‘localhost’로 호스트 범위를 지정한다

1
2
3
mysql> CREATE USER 'USERID'@'localhost' IDENTIFIED BY 'password';
mysql> CREATE USER 'USERID'@'%' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;

grant 명령: [권한 부여]

사용자가 특정 자원에 접근하기 위해서 grant 명령 사용.

1
2
3
4
5
6
GRANT ALL PRIVILEGES ON DB이름.테이블이름 TO 아이디@호스트 IDENTIFIED BY '비밀번호' with grant option;

- ALL PRIVILEGES : 모든 권한 추가
- SELECT, INSERT, UPDATE, DELETE, ... : 권한을 일부분을 추가
- with grant option : GRANT를 사용할 수 있는 권한 추가
- Grant 로 주어지는 권한은 여기 [grant: privilege-levels](https://mariadb.com/kb/en/grant/#privilege-levels) 명령에서 찾을 수 있다.

아래는 userid 사용자가 특정 sampledb 에만 모든 권한을 부여하고 있다.

1
2
mysql> GRANT ALL PRIVILEGES ON sampledb.* TO 'USERID'@'localhost';
mysql> FLUSH PRIVILEGES;

다음 GRANT 명령에서 ALL PRIVILEGES ON *.* 는 모든 권한(ALL PRIVILEGES)을 모든 스카마의 모든 테이블 *.* 에 준다는 의미.

1
2
mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERID'@'localhost' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
  • WITH GRANT OPTION 의 의미는 다른 사용자에게 자신이 가진 권한을 주거나 회수할 수 있다는 의미.
  • ALL PRIVILEGES 부분에는 SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER 등 권한 명칭을 콤마로 분리해서 나열하는 방식으로 특정 권한만을 줄 수도 있다.

[권한 제거]

권한을 없앨때는 REVOKE 명령을 사용한다. 두가지 형식을 사용한다.

1
2
3
REVOKE priv_type ON db.tables FROM user[,user]  ...

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

아래 명령으로 ‘localhost’ 에서 접속가능한 ‘testdbuser’ 에게서 모든 권한을 제외한다.

1
mysql> REVOKE ALL PRIVILEGES *.* FROM 'USERID'@'localhost';

GRANT 명령과는 달리 REVOKE 명령은 모든 권한을 제거해도 mysql.user 테이블 사용자 정보는 완전히 삭제되지 않는다.

사용자 정보의 완전한 제거를 원한다면 DROP USER 명령을 사용한다.

1
mysql> DROP USER 'USERID'@'localhost';

권한 조회

사용자별 권한 확인

1
mysql> SHOW GRANTS FOR 'USERID'@'HOST';

접속된 계정 권한 확인

1
mysql> SHOW GRANTS FOR CURRENT_USER;


실행 프로세스 확인

현재 접속자를 확인하고, lock 이 걸린 프로세스를 죽이거나 하는 작업

  • 프로세스 리스트보기
1
2
3
4
5
6
7
8
mysql> SHOW PROCESSLIST;
+------+-----------+----------------------+-----------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+----------+
| Id | User | Host | db | Command | Time | State | Info
| Progress |
+------+-----------+----------------------+-----------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+----------+
| 1371 | dbkmart | 205.22.168.143:29762 | yourdb | Sleep | 2673 | | NULL
| 0.000 |
|
  • 프로세스 죽이기(프로세스 아이디는 리스트에 나오는 Id.)
1
mysql> kill 프로세스아이디

ex: DB 생성해 사용자 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 1. mysql/mariadb 데이터베이스 생성
create database webdb;

-- 2. mysql/mariadb 계정 생성
create user 'webdb'@'192.168.1.%' identified by 'webdb';

-- 3. 권한주기
grant all privileges on webdb.* to 'webdb'@'192.168.1.%';

-- 4. flush privileges;

-- 5. 사용자 계정 삭제
drop user 'webdb'@'192.168.1.%';

-- 6. 데이터베이스 삭제
drop database webdb;

  1. grant: privilege-levels : https://mariadb.com/kb/en/grant/#privilege-levels

Python 에서 secret 키 값 이용하기 - json

크롤링, 데이터 베이스 연결등에 사용자 인증번호를 사용하는데 코드 자체에 아이디/비밀번호를 입력해서 사용하면 유출의 염려가 있으므로 이를 외부 파일에 두고 관리하고자 한다.

여러가지 방법이 있겠지만 여기서는 json 을 사용한다.

key:value 형식의 properties, 윈도우 ini 같은 형식을 지원하는 configparser 모듈도 좋은 선택 같다.

json 이용 키 관리

외부에 아래 형식의 secret 파일을 생성한다.

  • 디렉토리: .api_keys/ 폴더 사용
  • 파일: secret_keys.json

secret_keys.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{   "naver.com" : {
"userid": "UR_ID",
"password" :"votmdnjem" },
"apple.net": {
"userid": "UR_ID",
"password" : "votmdnjem" },
"api.twitter.com": {
"CONSUMER_KEY" : "unJgTOc0aZkk7NoX4LlD5g",
"CONSUMER_SECRET":"uHdmctDcPM66s9OasrKnr2x3pu88",
"ACCESS_TOKEN" : "98948674-J9auHiBiOGoWUJOzRafp",
"ACCESS_TOKEN_SECRET" : "kKgT9tlSY2rCIAbWJrCEEiTsR37" },
"my_database" : {
"userid" : "UR_ID",
"password" : "votmdnjem"}
}

파일 사용

json 모듈을 사용해서 해당 파일을 읽으면 키:값 형식으로 참조해서 사용할 수 있다.

1
2
3
4
import json

with open('../../.api_keys/secret_keys.json') as f:
secrets = json.loads(f.read())

이렇게 읽어들인 json 은 dict 같이 사용할 수 있다.

1
DB_USER, DB_PW = secrets['my_database']['userid'], secrets['my_database']['password']

MariaDb 10/ MySQL 8 - data 디렉토리 변경 (Ubuntu)

data 폴더 위치를 변경해 이동한다.

  • 여기서는 MariaDB 를 사용하고 있다.
  • rsync 를 사용해서 복사한다.

위치 이동

my.cnf 에 있는 기본 디렉토리를 /data 폴더로 변경하고 적용한다.

  1. 기본 data 디레토리 확인

my.cnf 에서 datadir 로 지정된 항목을 찾아 보자.

1
2
~$ grep datadir /etc/mysql/mariadb.conf.d/*
/etc/mysql/mariadb.conf.d/50-server.cnf:#datadir = /var/lib/mysql

기본으로 Ubuntu 종류에서는 /var/lib/mysql 를 기본 데이터 디렉토리로 지정하고 있다.

  1. data 디렉토리를 /data 로 변경한다.

my.cnf 를 수정해서 /data로 변경하자

1
~$ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
  1. data 폴더 권한

mysqld / mariadbd 데몬은 mysql 사용자, mysql 그룹으로 사용권이 실행되고 있다. 데이터베이스에서 접근하는 모든 자원(폴더, 파일, 로그 등등)은 mysql 사용자로 접근이 가는해야 한다. 그래서 /data 디렉토리 권한을 변경한다.

mysql 사용자와 그룹 확인한다.

1
2
3
4
5
$ grep mysql /etc/passwd
mysql:x:111:117:MySQL Server,,,:/nonexistent:/bin/false

$ grep mysql /etc/group
mysql:x:117:

소유권을 mysql 사용자로 변경한다.

1
2
3
4
5
$ sudo chown -R mysql:mysql /data
[sudo] 암호:
$ ls -al /data
drwxr-xr-x 3 mysql mysql 4096 5월 6 22:35 .
drwxr-xr-x 20 root root 4096 5월 6 17:15 ..
  1. data 이동

rsync 를 사용해서 /var/lib/mysql 데이터를 /data 아래로 복사한다.

1
$ sudo rsync -avzph /var/lib/mysql/ /data/
  1. mysqld 데몬을 재시작하고 확인한다.
1
2
3
4
$ sudo systemctl restart mysql
$ sudo systemctl status mysql

● mariadb.service - MariaDB 10.11.2 database server

데이터베이스에 접속해 데이터를 확인해 보자. @@datadir 환경변수를 출력해서 /data 가 출력되면 my.cnf 의 설정이 잘 구성된 상태를 확인할 수 있다.

1
2
3
4
5
6
7
8
$ sudo mysql -u root -p

> select @@datadir;
+-----------+
| @@datadir |
+-----------+
| /data/ |
+-----------+

rsync 로 복사한 실제 데이터들은 각 스키마에서 확인해 보자.

[git] Sparse Checkout

git checkout 은 보통 브랜치의 모든 구조를 가져온다. checkout 은 다음 링크 설명을 보고 이해해 보자,

Sparse checkout 은 checkout 전체 대상중 일부 만을 checkout 할 수 있다.

git sparse checkout 기능은 Git 2.25.0 이상부터 사용이 가능하다.

Sparse checkout 이해

git 블로그 글 Bring your monorepo down to size with sparse-checkout 의 그림 설명을 빌려오자.

다음 원격 레포지토리가 있다고 가정하자

전체 디렉토리 중에서 client/android 부분만 checkout 을 하고 싶다.

다음 같이 클론을 하고 sparse-checkout 을 초기화 한 후에 대상인 client/android 디렉토리를 sparse-checkout 하면 해당 디렉토리만 다운로드한다.

1
2
3
4
git clone https://github.com/tensorflow/examples.git
cd examples
git sparse-checkout init --cone
git sparse-checkout set client/android

sparse-checkout 을 수행하면 해당 디렉토리 컨텐츠만 남게 된다.

사용 방법

사용시 몇가지 사례가 있다.

방법1

첫번째 방법으로 git 레포지토리를 pull로 clone 한 후에 sparse-checkout 대상 파일/폴더를 지정하고 sparse-checkout 을 수행한다.

1
git clone https://github.com/tensorflow/examples.git

spase-checkout 을 수행하기 위해서 초기화 하고 대상이 되는 파일/폴더를 지정한다.

1
2
3
4
cd examples
git config core.sparseCheckout true
git sparse-checkout set lite/examples/object_detection/android_play_services
git pull origin master

희소 체크아웃을 사용하도록 git 인스턴스를 구성하면 지정한 파일/폴더만 남게 된다.

저장소에서 config core.sparseCheckout true 대신 git sparse-checkout init --cone 를 이용해도 된다.

방법2

레포지토리를 클론하지 않고 클라이언트에서 초기화 후 sparse-checkout 으로 대상 디렉토리를 지정한 후에 pull 을 수행한다.

원격 레포지토리를 지정한다.

1
2
3
4
mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>

spase-checkout 을 수행하기 위해서 초기화 하고 대상이 되는 파일/폴더를 set 으로 지정한다. 여러 파일/디렉토리를 추가할 수 있다.

1
2
git config core.sparseCheckout true
git sparse-checkout set lite/examples/object_detection/android

pull 을 수행한다.

1
2
3
4
git pull origin master
From https://github.com/tensorflow/examples
* branch master -> FETCH_HEAD
Updating files: 100% (61/61), done.

저장소에서 config core.sparseCheckout true 대신 git sparse-checkout init --cone 를 이용해도 된다.

방법3

방법2와 동일하지만 설정 파일을 통해서 수행하는 점만 다르다.

1
2
3
4
mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>

원격 레포지토리를 지정하고 git 설정에 추가한다.

1
git config core.sparseCheckout true

checkout 하려는 파일과 폴더를 sparse-checkout 파일에 추가한다. 여러 파일/디렉토리를 추가할 수 있다.

1
2
echo "lite/examples/object_detection/android" >> .git/info/sparse-checkout
echo "lite/examples/bert_qa/android" >> .git/info/sparse-checkout

pull 을 수행한다.

1
git pull origin master

함께 보면 유용한 git 명령

간단하게 빌드/테스트 를 하기위해 저장소의 특정 폴더만 clone 할 때 Swallow Clone 을 함께 이용해도 좋을 것 이다.

[git] Swallow clone



- 참고