postgresql 관련

Postgresql 설치

sudo apt-get install postgresql

2.사용자 및 데이터베이스 생성, 권한부여

Postgresql

‘sudo -u postgres psql’ 명령어로 콘솔에 접속

psql -U 사용자이름 -d 데이터베이스 -h 서버아이피(예:127.0.0.1)

  기본적으로는 사용자이름과 같은 이름의 데이터베이스에 접속한다.

포트는 5432

원격접속 설정

  • /etc/postgresql/9.x/main/postgresql.conf 파일에 ‘listen_addresses = ‘*’ ‘ 추가
  • /etc/postgresql/9.x/main/pg_hba.conf 파일에 ‘host all all 0.0.0.0/0 md5’ 추가. ‘Host database user address method’ 형태이니, 적당히 수정해서 추가.
  • service postgresql restart 로 서비스 재시작

php-pgsql 설치

  • sudo apt install php-pgsql

\l 데이터베이스 보기

\dn 스키마 확인

\dt 테이블 보기

\du  사용자 목록 보기

\? 도움말

\d+ 표이름   표에 대한 상세정보 확인

pg_tables 테이블에 테이블 목록 있음

1.사용자 추가/제거

사용자 및 권한 생성: CREATE USER 사용자명 WITH 권한1 권한2 … ; —여기서 권한은 CREATEDB, REPLICATION, CREATEROLE, SUPERUSER 등이 있다.

또는 CREAT ROLE 사용자명 WITH LOGIN 권한~

비밀번호 있는 아이디 만들기 CREATE ROLE 사용자명 WITH LOGIN PASSWORD ‘암호’ 권한1 권한2;

비밀번호 변경:

ROLE 기능 
SUPERUSERUSER들을 생성하고 권한을 부여해 주는 USER
CREATE ROLEUSER가 새로운 ROLE을 정의하는 기능을 생성
CREATE DBUSER가 DB를 생성하는 권한을 부여하는 기능
REPLICATIONUSER가 DB를 실시간으로 복사하는 기능

사용자 제거: DROP USER ‘사용자명’; 또는 DROP USER ‘사용자명’;

권한 추가:  ALTER USER ‘사용자명’ WITH 권한1 권한2;

권한 제거:  ??

2.데이터베이스 추가

CREATE DATABASE 데이터베이스 이름OWNER 사용자;

3.테이블 추가 및 변경

CREATE TABLE 테이블 이름

(

컬럼1 data_type NULL/NOT NULL PRIMARY KEY,

컬럼2 data_type NULL/NOT NULL

);

주요 data_type는 다음과 같다.

char(n) : n바이트 문자열

integer, int: 정수, 10자까지 가능

int8, bigint: 8비트 정수, 19자까지 가능

date: 날짜

boolean: 참/거짓

float: 소수점16자리 유리수

real: 소수점7자리 유리수

text: 가변길이 텍스트

테이블 제거

DROP TABLE 테이블이름;

테이블이름 변경

ALTER TABLE 테이블이름 RENAME TO 테이블새이름;

테이블 컬럼 추가

ALTER TABLE 테이블이름 ADD COLUMN컬럼이름 data_type;

테이블 컬럼 제거

ALTER TABLE 테이블이름 DROP COLUMN컬럼이름;

테이블 컬럼 이름변경

ALTER TABLE 테이블이름 RENAME 컬럼이름 TO 새로운컬럼이름;

테이블 컬럼 데이터타입 변경

ALTER TABLE 테이블이름 ALTER COLUMN 컬럼이름 TYPE data_type;

주 키 지정

ALTER TABLE 테이블이름 ADD PRIMARY KEY (컬럼이름);

4.테이블에 열 추가 및 삭제

INSERT INTO 테이블이름(컬럼1, 컬럼2,…) VALUES(값1,값2,…);

INSERT SELECT:  SELECT로 가져온 결과를 테이블에 삽입하기 위해 사용.

INSERT INTO 테이블이름(컬럼1, 컬럼2…) SELECT 컬럼a, 컬럼b… FROM 테이블이름1, 테이블이름2… WHERE … ;

DELETE FROM 테이블이름 WHERE …;

기록된 내용 변경하기

UPDATE 테이블이름 SET 컬럼=’변경할데이터’ WHERE…;

5.테이블에서 원하는 내용 가져오기

SELECT 컬럼이름 FROM 테이블이름 WHERE … ;

SELECT SUM(필드명) FROM 테이블명 WHERE …;

json 처리

SELECT * FROM table WHERE (col_name::json->0->’key’)::text=’key_value’;

6.인덱스 설정

CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] 이름 ] ON [ ONLY ] 테이블이름 [ USING 색인방법 ]     ( { 칼럼이름 | ( 표현식 ) } [ COLLATE 문자정렬규칙 ] [ 연산자클래스 ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )     [ INCLUDE ( 칼럼이름 [, ...] ) ]     [ WITH ( 저장_매개변수 =  [, ... ] ) ]     [ TABLESPACE 테이블스페이스이름 ]     [ WHERE 조건절 

일반적으로 다음과 같이 활용할 수 있다.

CREATE INDEX CONCURRENTLY index_name ON table_name (column_name1, column_name2,...

여기서 CONCURRENTLY 옵션은 인덱스를 만드는 도중에도 테이블을 잠그지 않도록 해준다. postgresql 한정 옵션이다.

생성된 인덱스 보기

SELECT * FROM pg_indexes WHERE tablename = '테이블명'

기타.

외래키 지정

ALTER TABLE OrderItems ADD CONSTRAINT FK_OrderItems_Orders FOREIGN KEY (order_num) REFERENCES Orders (order_num);

Json 데이터 입력과 출력

select col1->0,col1->1 from test where cast(col1->>0 as INTEGER) >= -1;

insert into test(col1) values ('[]');

PFC

Personal Food Computer

https://www.media.mit.edu/posts/build-a-food-computer/

전자 부분

190308

v4.0 파일을 디바이스마트 SMT 실장 서비스에 넘겼더니, 거버 파일이 안 열린다고 함.

v3.0 거버 파일을 넘기고 대기 중.

샷시 부분

단위가 인치기반. mm 단위로 변경 필요.

Data
Part NameTranslated NameQuantityParent AssemblyMaterialMaterial Thickness
BBFBBottom Box, Front/Back2Bottom BoxKomatex1/4″
BBIBottom Box, Inside1Bottom BoxKomatex1/4″
BBOBottom Box, Outside1Bottom BoxKomatex1/4″
BBLRBottom Box, Left/Right2Bottom BoxKomatex1/4″
TRTray1Bottom BoxKomatex1/8″
TBITop Box, Inside1Top BoxKomatex1/4″
TBFBTop Box, Front/Back1Top BoxKomatex1/4″
TBFBHTop Box, Front/Back w/Hole1Top BoxKomatex1/4″
TBLRTop Box, Left/Right1Top BoxKomatex1/4″
TBLRHTop Box, Left/Right w/Hole1Top BoxKomatex1/4″
TBSTop Box Support2Top BoxKomatex1/4″
TBOTop Box, Outside1Top Boxpolycarbonate1/8″
WDSWindow Short3Side Panelpolycarbonate1/8″
WTWindow Tall1Side Panelpolycarbonate1/8″
SPSide Panel4Side PanelKomatex1/8″
NEONeoprene4Side Panelneoprene3/8″
CDGRColumn Diagonal, Right4ColumnKomatex1/4″
CDGLColumn Diagonal, Left4ColumnKomatex1/4″
CFColumn Face4ColumnKomatex1/4″
CFCColumn Face4ColumnKomatex1/4″
CSRColumn Side, Right4ColumnKomatex1/4″
CSLColumn Side, Left4ColumnKomatex1/4

두께 단위 변경 두께 변경하면 장부맞춤 안됨. 두께 수정 없이 진행

1/4인치 > 5mm

1/8인치 > 3mm

3/8인치 > 8mm

재질 변경

Komatex > 포맥스 (어차피 둘다 발포 PVC, 제품명이 다를 뿐)

polycarbonate > 폴리카보네이트 혹은 아크릴

neoprene > 포맥스

SP와 NEO를 합쳐서 1/2인치로 가공

소프트웨어

https://github.com/OpenAgInitiative/openag-device-software
첨부파일

라즈베리파이에 위의 깃허브 소프트웨어 설치

  • 설치 시 데스크톱 로그인 무한 반복
  • sudo apt install –reinstall lxsession

Raspi-config 에서 다음 설정

  • ssh 허용
  • 파이카메라 허용


Modbus (pyModbusTCP)

설치

pip3 install pyModbusTCP

클라이언트 가동

from pyModbusTCP.client import ModbusClient
import sys

c = ModbusClient(host="localhost",port=502) #set host and port
if not c.is_open():
c.open()

if not c.is_open():
print("연결실패. 프로그램 종료")
sys.exit()

addr = 0 # 주소 할당 ( 0 to 65533 )
c.write_single_coil(addr,True) #코일 입력
c.write_single_register(addr,12345) #레지스트리 입력
c.write_multiple_coils(addr,[True,True,True]) # addr주소부터 주소값을 하나씩 늘려 리스트에 입력된값을 차례대로 할당
c.write_multiple_registers(addr,[11,222,333]) # addr주소부터 주소값을 하나씩 늘려 리스트에 입력된값을 차례대로 할당
n_read = 3 #읽어들일 값의 갯수
c.read_coils(addr,n_read)
c.read_holding_registers(addr,n_read)

c.close() #종료

서버 가동

 
from pyModbusTCP.server import ModbusServer

server = ModbusServer(host="192.168.aa.bb", port=502) #서버정보와 포트정보 입력. 서버는 localhost라고 쓰면 안되고, 아이피주소를 명시해야하는 듯
server.start()

flask + apache2

아파치2, wsgi 설치

sudo apt-get install apache2
sudo apt-get install libapache2-mod-wsgi
sudo apt-get install libapache2-mod-wsgi-py3


apache2 site 정보 작성

/etc/apache2/sites-available/flask_wsgi.conf

<VirtualHost *>
ServerName {앱이름}
WSGIDaemonProcess {앱이름} user={사용자이름} threads=5
WSGIScriptAlias / {앱경로}/app.wsgi
<Directory {앱경로}>
WSGIProcessGroup {앱이름}
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *>
ServerName example.jhin.kr
WSGIDaemonProcess hello_world user=philomoral threads=5 #실행할 앱 이름 helloworld, user는 philomoral
WSGIScriptAlias / /home/philomoral/web_test/flask_test/app.wsgi
<Directory /home/philomoral/web_test/flask_test>
WSGIProcessGroup hello_world #앱 이름 helloworld
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Require all granted
</Directory>
</VirtualHost>

사이트 비활성화/활성화

sudo a2dissite 000-default
sudo a2ensite flask_wsgi

ssl

SSL 페이지 정리 참고하여 작성한 후 사이트 설정을 다음과 같이 바꾼다.

일반 사이트 설정과 비슷하나 주요 차이점으로는 다음과 같다.

  • Virtualhost의 포트를 443으로 설정하는 점
  • SSL관련 설정 내용이 추가되는 점
  • IfModule 영역으로 감싸는 점
  • ServerName, WSGIDaemonProcess 이름을 일반 사이트 설정과 중복되지 않게 설정해야하는 점
<IfModule mod_ssl.c>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
ServerName tero.example.com:443
WSGIDaemonProcess hello_world_ssl user=philomoral threads=5
WSGIScriptAlias / /home/philomoral/web_test/flask_test/app.wsgi
<Directory /home/philomoral/web_test/flask_test>
WSGIProcessGroup hello_world_ssl
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Require all granted
</Directory>
</VirtualHost>
</IfModule>

flask 앱 작성

앱생성경로: /home/philomoral/web_test/flask_test

Virtualenv 경로: /home/philomoral/web_test/venv

/home/philomoral/web_test/app.wsgi

#가상환경 활성화
activate_this = '/home/philomoral/web_test/venv/bin/activate_this.py'
with open(activate_this) as file_:
exec(file_.read(), dict(file=activate_this))
#가상환경 활성화 완료
import sys
sys.path.insert(0,"/home/philomoral/web_test/flask_test") #앱 경로
from hello_world import app as application #hello_world.py 앱 실행

가상환경에서는 psycopg2 라이브러리가 잘 작동되지 않는 문제가 있음. 로컬환경에서는 적용 가능

hello_world.py

from flask import Flask
app = Flask(__name__)
@app.route('/')def home():    return 'Hello World!'
if __name__ == '__main__':    app.run(host="0.0.0.0",port=5050)


업로드파일 파일이름 한글 저장 (인코딩)

/etc/apache2/envvars 파일의 해당부분을 다음과 같이 변경한다.

	#export LANG=C
	export LANG=ko_KR.utf8

Anaconda

아나콘다 3 설치

홈페이지에서 받아서 설치

.Do you wish the installer to initialize Anaconda3 in your /home/#####/.bashrc ? [yes|no] [no] >>> yes

yes로 대답한다.

bunzip2 명령어를 못 찾는 경우,

sudo apt-get install bzip2 

명령어 활성. ~/.bashrc  최하단에 다음 내용 추가

source anaconda3/etc/profile.d/conda.sh


환경생성

conda create -n [환경이름]

환경 활성/비활성화

conda activate [환경이름]
conda deactivate [환경이름]

환경 목록

conda info --envs

환경 제거

conda remove -n [환경이름] --all

환경 복사본

conda create --name [새로운환경이름] --clone [복사대상환경이름]