728x90
728x90
728x90

함수를 정의하는 데에 있어서 "유의사항"위주로 정리한다.

 

def func(a, b=i):

# func 정의 후에 i를 다른 값으로 정의하더라도, 이전에 정의한 값을 사용한다. 이는 함수 정의할 때 default값이 계산된다는 것이다.

 

def func(a, L=[]):

    L.append(a)

# default를 list, dictionary, instances of classes etc, "mutable"인 것을 받아서 함수 내부에서 mutable인 것을 수정하는 형태면, 그 func이 여러번 call될 때 마다 그 수정이 누적된다.

 

def func(a,b=2,c=3):

# 함수를 정의하는 데에 있어서 a가 positional argument인지 keyword argument인지 구분되는 것이 아니다. call할 때 구분한다.

# 함수를 call할 때 positional argument는 keyword argument보다 선행되어야 한다.

# func(a=1)  # a는 keyword argument

# func(1,b=3)  # positional argument 1개와 keyword argument 1개

# func(1, a=2)  # a에 2개 값을 넣는 형태의 error, "got multiple values for keyword argument 'a'"가 뜬다.

 

def func(a,b=2,*args, **kwargs):

# 함수를 정의할 때 *args는 **kwargs보다 선행되어야 한다.

# arg는 func내부에서 tuple, kwargs는 dictionary type이다.

# func(1, c=3)  # a=1, b=2, args=(), kwargs={'c':3}, 즉 default value가 args로 들어가는 것보다 우선순위가짐

# func(1,2,3,c=4)  # a=1, b=2, args=(3,), kwargs={'c':4} 

# func(1,2,3,4)  # a=1, b=2, args=(3,4), kwargs={}

# func(1,2,3,4,**{'c':5, 'd':6})  # a=1, b=2, args=(3,4), kwargs={'c':5, 'd':6}

# func(1,2,3,4, **{'a':5})  # error, "got multiple values for keyword argument 'a'"

# kwargs에 들어간 keyword arguments의 순서는 call할 때 넣은 순서를 따른다.

 

def func(a,b=3):

# 함수를 call할 때 a,b모두 positional/keyword argument로 받을 수 있다.

# 함수를 정의할때부터 call할 때 positional/optional/keyword 어떤 형태로 받을지 강제할 수도 있다.

# def func(pos1, pos2, /, opt1, opt2, *, kwd1, kwd2):  pos:positional-only, opt:optional, kwd:keyword-only

# 하지만 /과 *는 함수 정의할 때 optional이다. 하지만 적어준다면 call할 때 각 argument를 어떻게 받아야만 하는지 바로 이해할 수 있다.

 

def func(a,/):

# 즉 func은 반드시 positional argument로 call해야한다.

# func(a=3)는 "got come positional-only arguments passed as keyword arguments:'a'" ERROR

# def func(a)였다면 func(a=3), func(3) 모두 작동함

 

def func(*,a):

# func(3), "func takes 0 positional arguments but 1 was given" ERROR

# func(a=3)은 동작함

 

def func(a,/,b,*,c):

# func(1,2,c=3), func(1,b=2,c=3) 모두 동작함

# 즉 b는 positional/keyword 어떤 형태로든 받을 수 있음

 

def func(a,/,b=3,*,c):

# func(1,3,c=3), func(1,b=3,3), func(1,c=3) 모두 같은 동작함

# Positional-only인 a외에는 모두 default value 설정 가능

 

def func(a,b,*args, c):

# 입력을 여러개 받으면 args가 variadic variable인데 어디까지가 args이고 c인지를 알 수가 없는 형태

# 정의는 되지만 call하면 ERROR발생

 

def func(a,b,*args, c=4):

# 여러개 positional arguments를 받으면 a,b외 나머지는 args로, c는 4

# c를 4가 아닌 다른 값으로 사용하려면 반드시 keyword argument형태로 입력해줘야한다.

 

def func(a, **kwargs):

# **kwargs를 추가해줌으로써 함수를 정의할 때 여러개의 argument를 받을 수 있게 정의 가능

# func(**{'a':1, 'b':2})를 call하면 func내부에서 a=1이고 kwargs={'b':2}가 된다. 즉 kwargs(dictionary)를 unpack하여 함수 정의에 쓰였던 argument에 value를 assign하고, 함수 정의에 없던 argument는 kwargs가 갖고 있는다.

즉, def func(a, **kwargs): print(a, kwargs)에서 func(**{'a':1, 'b':2})를 call하면 1, {'b':2}를 print함

 

 

요약:

-함수를 call할 때 무조건 positional로 입력을 받아야할 때, /을 사용하여 강제를 하자.

(예를 들면 function을 call하는 입장에서 parameter name을 몰라야할 때)

-함수를 call할 때 keyword argument형태로 입력해야 사용자가 편리할 때 *을 사용하여 keyword argument를 강제하자.

(예를 들면 parameter의 순서보다는 parameter name이 의미가 있어서 입력을 할 때 함수를 좀 더 이해할 수 있을 때)

-함수를 정의할 당시에 가변적인 argument를 받아야하는데 parameter name이 유의미하지 않다면 *args를 사용

-함수를 정의할 당시에 가변적인 argument를 바다야하는데 parameter name이 유의미하다면 **kwargs를 사용, 이 때 kwargs로 받을 때 다른 argument name과 충돌하는 key-value를 받으면 multiple value assign ERROR발생

-함수를 정의를 어케하든 call할 때 **kwargs를 사용하여 argument에 value assign가능

 

참고자료:

https://docs.python.org/3/tutorial/controlflow.html#positional-only-parameters

 

4. More Control Flow Tools — Python 3.9.0 documentation

 

docs.python.org

 

728x90
728x90

# ES와 관계형 DB 비교

ES/관계형DB

Index/Database

Type/Table

Document/Row

Field/Column

Mapping/Schema

 

# CRUD에 있어서 ES와 관계형 DB 비교

POST/INSERT/CREATE

GET/SELECT/READ

PUT/UPDATE/UPDATE

DELETE/DELETE/DELETE

(즉 POST, GET만 다름)

 

# ES 실행
sudo service elasticsearch start

# ES에 존재하는 모든 index가져오기
curl -X GET 'localhost:9200/_cat/indices?v'

# ES에 새로운 index만들기
curl -X PUT 'localhost:9200/newindex?pretty'  # ?pretty는 response를 예쁘게 보여주기 위한 옵션

# ES에 새로운 document만들기

curl -X PUT 'localhost:9200/newindex/info/1?pretty' -H 'Content-Type: application/json' -d '{"name":"SAMPLE"}'

  *-index는 newindex, type은 info, id가 1인 document를 추가하는 예제

  *-d는 --data-binary의 축약어로, 추가할 데이터를 받음

  *-d에 들어갈 데이터는 반드시 double quote를 사용해야함 ""

  *newindex라는 이름의 index가 없었으면 새로 만듦

  *info라는 이름의 type이 없었으면 새로 만듦

  *-id를 생략하면 임의의 문자열로 들어감, 즉 newindex/info/?pretty......형태로 쓰다면

  *_source에 입력한 data가 박히게됨

 

# ES에 새로운 document만들기 from data.json file

curl -X PUT 'localhost:9200/newindex/info/1?pretty' -H 'Content-Type: application/json' -d @data.json

 

# ES에 한 index 내에 있는 모든 documents 조회

curl -X GET 'localhost:9200/newindex/_search?pretty'

 

# ES에 모든 index에 있는 모든 documents조회

curl -X GET 'localhost:9200/_all/_search?pretty'

 

# ES에 (index, type, id)를 이용하여 document조회

curl -X GET 'localhost:9200/index/type/id?pretty'

 

# ES에 (index, type, id)를 이용하여 document조회하는데, 특정 key만 조회

curl -X GET 'localhost:9200/index/type/id?pretty&filter_path=_source'  # _source만 조회

curl -X GET 'localhost:9200/index/type/id?pretty&filter_path=_source.name  # _source내 name만 조회

 

# ES에 (index, type, id)에 해당하는 document update

curl -X PUT 'localhost:9200/index/type/id?pretty' -H 'Content-Type: application/json" -d '{"name":"UPDATED_SAMPLE"}'

  *-_source내 name의 값이 바뀌어 짐

  *-_version이 +1됨

(_seq_no는 해당 index에서 operation이 발생한 횟수를 가리킴)

(_version은 해당 document를 update한 횟수를 가리킴)

(_primary_term, _seq_no, _version 3개를 통해 document를 uniquely identify가능)

 

# ES에 CRUD를 하는 파이썬 코드

mygit...

 

 

# Elasticsearch 시스템 구조에 대한 요약

-용어정리

  -색인(indexing):데이터가 검색될 수 있는 구조로 변경하기 위해 원본 문서를 검색어 토큰들로 변환하여 저장하는 일련의 과정

  -인덱스(Index, indices):색인 과정을 거친 결과물, 또는 색인된 데이터가 저장되는 저장소

  -검색(search):인덱스에 들어있는 검색어 토큰들을 포함하고 있는 문서를 찾는 과정

  -질의(query):사용자가 원하는 문서를 찾거나 집계 결과를 출력하기 위해 검색 시 입력하는 검색어 또는 검색 조건

-Elasticsearch는 대용량 데이터의 증가에 따른 scale out과 데이터 무결성을 유지하기 위한 클러스터링을 지원

-클러스터-노드(마스터, 마스터후보, 데이터)

-노드란 Elasticsearch에 저장소 단위

-하나의 index는 여러개의 노드에 분리되어 저장됨, 이 분리된 단위를 샤드(shard)라 함

-마스터 노드는 index의 metadata, 클러스터 상태, 샤드의 위치 등의 정보를 저장하는 역할, 클러스터마다 1개 존재

-마스터 후보 노드(master eligible node)는 현재 마스터 노드가 죽으면 마스터 노드 역할을 대행, 마스터 후보는 항시 마스터 노드와 정보를 공유하고 있기 때문에 가능

-데이터 노드가 샤드들을 저장

-먼저 생성된 샤드를 primary shard라 함, 복제본을 replica라 함(index를 생성할 때 별도 설정 하지 않으면 ES version 7.0이상부터는 샤드1개로 구성, 그 미만 버전은 5개의 shard로 구성)

-먼저 생성된 샤드라는 것이 index가 1개가 5개의 shard로 분리되고 각각 replica샤드가 생겨 총 10개 샤드면, 앞선 5개의 샤드들을 primary shards라 한다.

-만약 index가 5개의 shard로 구성되어 있다면, 각 샤드마다 복제본도 반드시 생기고, 여러 node에 골고루 분배되며 각 노드마다 다른 샤드(즉 1번 샤드와 1번 복제본이 한 노드에 있는 것을 막으며)가 들어가게 저장->이는 데이터 무결성을 위한 과정, 만약 하나의 노드가 유실이 된다면 그 노드에 존재하던 원본 샤드의 복제본은 다른 노드에서 원본 샤드로 승격되고 복제본을 새로이 만들어서 다른 노드에 분배, 만약 유실된 노드안에 복제본의 샤드가 있으면 다른 노드에 있던 원본 샤드를 통해 복제본을 만들어 분배)

-document에서 _primary_term은 해당 document를 포함하는 index가 저장된 여러 primary shard중 몇번째 shard에 document가 저장되어있는지를 가리킴

 

# Error

 

AuthorizationException(403, 'cluster_block_exception', 'blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];')

->

curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d "{index.blocks.read_only_allow_delete":null}'

Disk의 용량이 95% 이상 찼을 때, ES는 자동적으로 read_only를 활성화하는데, 그것을 disable하게 해줘야한다.

 

참고자료:

esbook.kimjmin.net/04-data

 

4. Elasticsearch 데이터 처리

이 문서의 허가되지 않은 무단 복제나 배포 및 출판을 금지합니다. 본 문서의 내용 및 도표 등을 인용하고자 하는 경우 출처를 명시하고 김종민(kimjmin@gmail.com)에게 사용 내용을 알려주시기 바랍�

esbook.kimjmin.net

 

728x90
728x90

현재 디렉터리 내 및 하위 모든 디렉터리에서 파일/디렉터리 검색 -> find . -name [NAME]

전체 시스템 내에서 파일/디렉터리 검색 -> find / -name [NAME]

 

*을 사용하여 prefix, suffix 설정 -> [NAME]에 prefix*나 *suffix, 혹은 둘다 가능

ex) find . -name '*project*' -> project를 포함(substring)하는 파일 검색

 

728x90
728x90

현재 상황:

docker환경

OS:ubuntu 18.04.5 LTS

python3.8 installed

 

목표:

python3실행하면 python3.9가 실행되며

기존 python library들도 잘 실행되게

 

Python3.9설치과정:

sudo apt update

sudo apt install software-properties-common

sudo add-apt-repository ppa:deadsnakes/ppa

# 여기서 ModuleNotFoundError:no module named 'apt_pkg'에러가 뜨면

#  sudo vim /usr/bin/add-apt-repository를 입력 후 상단에 #!/usr/bin/python 을 #!/usr/bin/python3.6으로 변경, 혹은 3.5로 변경

sudo apt install python3.9

sudo apt list *distutils*

sudo apt-get install -y python3.9-distutils

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

python3 get-pip.py --force-reinstall

 

 

 

설치확인:

python3.9 -V

pip3 -V

 

python3입력하면 python3.9로 실행되게 변경:

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1

sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.9 2

sudo update-alternatives --config python3  # type the number corresponding to python3.9 and then hit the enter

 

pip3입력하면 pip3.9로 실행되게 변경:

필요 없음

 

python3.8에 설치된 라이브러리를 3.9에도 설치하기:

python3.8 -m pip freeze > requirements.txt

pip3 install -r requirements.txt

 

기타 error 대응:

"sudo apt-get install python3.9-dev"

# cannot compile 'python.h'. perhaps you need to install python-dev python-devel error발생시 실행(특히 numpy깔다가)

 

"sudo apt-get install gfortran libopenblas-dev liblapack-dev"

# numpy.distutils.system_info.NotFoundError: no lapack/blas resources found error 발생시 실행(특히 scipy깔다가)

 

무엇보다 중요한 것은, 아직 tensorflow==2.3.0은 python3.9에선 안된다는 것...따라서 tf2쓰려면 아직 python3.8쓰는게 맞다.ㅠㅠ

https://www.tensorflow.org/install/source

 

소스에서 빌드  |  TensorFlow

소스에서 TensorFlow pip 패키지를 빌드하고 Ubuntu Linux 및 macOS에 설치합니다. 명령어는 다른 시스템에도 적용될 수 있지만, Ubuntu 및 macOS용으로만 테스트되었으며 지원됩니다. 참고: 잘 테스트되고 ��

www.tensorflow.org

 

728x90
728x90

Table 1, Table 2 가 있다고 하자.

Table 2의 특정 column(Ck)을 foreign key로 설정하여 만든 테이블이라 하자, Table 1의 column(Ck)을 참조하는

Table 2에다가 row를 추가하는데 Ck에 해당하는 데이터가 Table 1의 Ck에 존재하지 않으면 error가 생김

 

이러한 foreign key에 들어올 data를 확인하는 것을 "Foreign key check"라 한다.

 

SQL사용시 해당 설정을 끄고, Table 2에 row를 추가하고, 다시 해당 설정을 키도록 하자.

(이미 Inserted된 row에 대해서는 Foreign key check를 하지 않는다.)

 

MySQL에서는

 

qry = "SET FOREIGN_KEY_CHECKS=0"

cursor.execute(qry)

"Do your job"

qry = "SET FOREIGN_KEY_CHECKS=1"

cursor.execute(qry)

 

728x90
728x90

1. DELETE

DML의 일종(Data Manipulation Language)

DELETE는 TABLE의 RECORDS만 지울 뿐, TABLE을 지우진 않는다.

Ex) DELETE FROM table_nm WHERE col=val;

one, some, all records를 삭제할 때 사용

return은 삭제된 row개수

삭제된 row는 모두 lock이 걸려서 rollback이 가능하다. 즉 트랜잭션 로그를 기록하기에 많은 데이터 삭제시 오래 걸릴 수 있다.

auto-increment를 keeping한다. 즉, ID 20(=last)을 지우고 새 row를 추가하면 ID 20이 아니라 21로 들어감

따라서, Table의 정의를 유지하면서도 rows(records)을 지우는 데에 사용

 

2. TRUNCATE

DDL의 일종(Data Definition Language)

TRUNCATE는 TABLE의 RECORDS를 모두 지움

roll back이 안되는 패키지가 존재 (SQL Server, PostgreSQL은 가능, MySQL이랑 Oracle은 불가)

DELETE보다 빠름(매 row를 scan하지 않기 때문)

DELETE보다 less transaction space를 사용, whole table을 lock하기 때문

auto-increment가 reset됨(패키지마다 옵션이 좀 다름)

 

3. DROP

DDL의 일종

DROP은 TABLE 자체를 지움(with all records)

roll back 지원(MySQL은 안됨)

 

정리하면,

테이블 전체 내용 삭제하며 테이블 구조가 필요없다면 DROP

테이블 전체 내용 삭제하며 테이블 구조가 필요하다면 TRUNCATE

트랜잭션 로그를 남겨야하는 삭제라면 DELETE

 

 

 

 

 

 

 

참고자료:

learnsql.com/blog/difference-between-truncate-delete-and-drop-table-in-sql/

 

TRUNCATE TABLE vs. DELETE vs. DROP TABLE: Removing Tables and Data in SQL

What’s the difference between DROP TABLE, TRUNCATE TABLE, and DELETE in SQL? We’ll look at the syntax of each operation and discuss their usage, details, and differences.

learnsql.com

 

728x90

+ Recent posts