sudo apt-get install fonts-unfonts-core
기술
IT 기술
IT 기술
파이썬 코드 보안을 위하여 컴파일 하는 경우 아래 명령어 적용
python -m py_compile [파일명] #python2, python3 모두 해당 pycompile [파일명] #python2 py3compile [파일명] #python3
pycompile 코드를 이용하여 컴파일하면 python2의 경우에는 원본 코드와 같은 폴더 내에 pyc 파일이 생성되며, python3 의 경우에는 원본코드와 같은 폴더의 __pycache__ 폴더 내에 pyc 코드가 생성된다.
생성된 pyc 파일을 실행 시 위와 같은 에러가 발생하였을 때에는, 파이썬 버전을 명시하여 컴파일한다.
파이썬2에서 컴파일한 코드를 파이썬3에서 실행할 때, 혹은 그 반대의 경우에도 발생한다. python의 하위버전이 맞지 않을 때에도 발생. (예: 파이썬 3.6을 이용하여 컴파일하고, python3.7에서 실행하는 경우)
py3compile -V3.1-3.8 [파일명] #파이썬 버전 3.1 - 3.8까지 모두 작동하도록 작성
Gitlab 주소: https://gitlab.com/JiNong_Public/farmosV2
문서목록: https://gitlab.com/JiNong_Public/farmosV2/-/tree/master/docs
Ubuntu 18.04, 구글클라우드 플랫폼 컴퓨트엔진에서 진행 > NUC에서 진행
#의존성패키지 설치 sudo apt install mariadb-server mosquitto nodejs -y #다운로드 및 설치 git clone https://gitlab.com/JiNong_Public/farmosV2.git cd farmosV2/scripts sudo ./install.sh
실행
sudo service fui start sudo service fcore start sudo service cvtgate start
8081 포트로 웹 접속
유저정보 확인하라고 뜨며, 로그인 안됨.
mysql을 지우고, 재설치 시 작동
기본 아이디 비밀번호: farmos / farmosv2@
KSX3267에 따라 장비를 제작하고, NUC에 연결하였으나, 장비검색이 안됨
200424
각 페이지의 정보는 ui/src/views/app/page에 있음
200507
gate에 파이썬 코드가 있음. 파이썬2 환경에서 실행되는 듯
gate/connection.py를 실행하였을 때에, 오류가 발생
다음 명령 후 재부팅
sudo usermod -a -G dialout 사용자이름
여전히 장비검색 안 됨. 다음 스크립트 시도
sudo chmod 777 /dev/ttyACM0
여전히 장비검색 안 됨
시작시 실행되는 스크립트는 fcore, fui , cvtgate인데, 이것들은 /etc/init.d 폴더에 포함돼 있다. 각 스크립트가 실행하는 코드는 다음과 같다.
여기서 WORK_DIR = “/home/changho/farmosV2/” 를 기본으로 한다.
fcore
WORK_DIR = "/home/changho/farmosV2/fcore/" python fcore.py start
fui
WORK_DIR = "/home/changho/farmosV2/server/api" forever start --uid "farmosV2" -a "${WORK_DIR}/app.js"
cvtgate
WORK_DIR = "/home/changho/farmosV2/gate/cvtgate" python couplemng.py start
fui 실행시 이용하는 api 문서 : http://localhost:8081/docs
다섯가지 KS 온실표준. 현실성없다.
하드웨어 – 범용이라 아무거나 갖다놔도 돼서
통신 – 위와 비슷한 이유로
소개한 모든기능이 올라가있는지? 아니다. 인공지능, 비표준 장비 업데이트 기능이 빠져있다. 비표준 장비는 오픈할 계획이 없다. 인공지능은 내년..
아키텍쳐
백엔드 통신을 관장하는 cvtgate. ~gate/couplemng.py 코드를 실행하여 관리하는 구조.
couplemng.py 의 134줄
adaemon = Daemon('cpmng', runner)
from daemon import Daemon, Runner
같은 폴더 내의 daemon.py를 열어보니, #Daemon을 만들어주는 클래스를 정의함’ #이라고 돼 있음
class Daemon의 def __init__(self, pname, runner, stdin=’/dev/null’, stdout=’/dev/null’, stderr=’/dev/null’): 을 참조, couplemng.py 134줄의 Daemon 클래스의 인자 cpmng와 runner 는 class Daemon에서 pname, runner에 해당되는 것을 알 수 있다.
pidfile 은 self.pidfile = “/var/run/” + pname + “.pid”, 즉 /var/run/cpmng.pid 에 데몬 pid를 기록한다.
runner 정보는 ~/conf/cpmng.conf 에 json 형식으로 기록되어 있음. 아래와 같은 형식으로 되어 있음
{ "id" : "24969c48-da01-45a4-af73-da7f9aabbdff", "sleep" : 1, "iter" : 60, "mode" : "local" }
sleep은 몇초마다 다시 동작할 것인지 (couplemng.py 124줄)
iter은 수집한 샘플 데이터 중 몇 개의 후보군 중에 선택할 것인지, 후보군의 갯수 (couplemng.py 97 – 125줄) 후보군은 loadcandidates 로 불러오는데, 이는 ../conf/localcouple.json의 json정보를 불러와서, extracouples(gate) 함수를 호출한다. (여기서 gate 는 localcouple.json 파일의 내용) extractcouples 함수는 config.json에 정의된 couples 키가 없다면, localcouple.json 정보의 gate[“children”] 정보를 반환한다.
localcouple.json 을 python에서 josn.loads로 읽어들이면 다음과 같다.
{u'children': [{u'ssmate': {u'opt': {u'mqtt': {u'svc': u'cvtgate', u'id': u'4157859e-df55-48e5-b3ac-8e6288f2165e'}, u'db': {u'host': u'localhost', u'password': u'farmosv2@', u'db': u'farmos', u'user': u'farmos'}, u'conn': {u'host': u'localhost', u'port': 1883, u'keepalive': 60}}, u'class': u'FarmosMate', u'mod': u'mate_farmos'}, u'children': [{u'opt': {}, u'dt': u'gw', u'children': [{u'dt': u'nd', u'children': [{u'dt': u'sen', u'children': [], u'id': u'5', u'dk': u'[1,211,["value","status"]]'}, {u'dt': u'sen', u'children': [], u'id': u'6', u'dk': u'[1,221,["value","status"]]'}], u'id': u'4', u'dk': u'[1,201,["opid","status"],501,["operation","opid"]]'}], u'id': u'ACM0', u'dk': u'ACM0'}], u'name': u'\uc2dc\ud5d8\uc628\uc2e4#1', u'dsmate': {u'opt': {u'sleep': {u'noti': 2, u'obs': 10, u'time': 3}, u'conn': [{u'baudrate': 9600, u'method': u'rtu', u'timeout': 5, u'port': u'/dev/ttyACM0'}]}, u'class': u'KSX3267MateV2', u'mod': u'mate_ksx3267v2'}, u'id': u'4157859e-df55-48e5-b3ac-8e6288f2165e'}], u'id': u'c315cb82-0f6c-4ed6-b8cc-b00331789494', u'name': u'Sample'}
localcouple.json –>> children –>0–>> ssmate : gate에서 mqtt를 통해 fui와 통신하는 정보
localcouple.json –>> children –>0–>> dsmate : 센서와 gate 사이의 통신 정보
def loadcandidate 은 localcouple.json의 children 키를 반환하고,
run 명령을 수행하면 위에서 반환된 localcouple.json 의 children의 항목을 def execute의 인수로 입력함. 인수를 전달받아 실행되는 execute에서는 loadmate 함수를 실행하여 실제 메시지 교환, 구동을 하게된다.
def loadmate의 일부는 다음과 같다.
def loadmate(self, conf, devinfo, coupleid): module = importlib.import_module(conf['mod']) class_ = getattr(module, conf['class']) self._logger.info("load a mate : " + str(conf['class']) + " " + str(coupleid)) mate = class_(conf['opt'], devinfo, coupleid, self._logger) return mate
이 때에 conf 는 localcouple.json –>> children –>0–>> dsmate 혹은 ssmate 이며, dsmate일 경우 mod는 ‘mate_ksx3267v2‘로서 프로토콜을 반환한다. importlib.import_module(conf[‘mod’]) 줄에서 mate_ksx3267v2.py를 실행하는데, 해당코드는 표준센서노드와의 통신을 수행한다.
conf[‘class’] = “KSX3267MateV2”
conf[“id”]=’4157859e-df55-48e5-b3ac-8e6288f2165e’
2020.03.12
Tensorflow 버전 2.0이상을 설치하기 위해서는 pip를 우선 업데이트 해야한다. pip 버전 19.0이상이 필요하다.
sudo pip3 install --upgrade pip sudo pip3 install tensorflow
GPU 지원. CUDA를 지원하는 NVIDIA 그래픽카드와 소프트웨어가 필요.
#그래픽카드 확인 lspci | grep NVIDIA #NVIDIA GPU 드라이버 설치 # Add NVIDIA package repositorieswget
http://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.debsudo dpkg -i
cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.debsudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt-get update
# NVIDIA 드라이버 설치sudo apt-get install --no-install-recommends nvidia-driver-418
# Reboot. Check that GPUs are visible using the command: nvidia-smi # 런타임 및 개발용 라이브러리 설치 (~4GB)sudo apt-get install --no-install-recommends cuda-10-1 libcudnn7=7.6.4.38-1+cuda10.1 libcudnn7-dev=7.6.4.38-1+cuda10.1
# TensorRT 설치. 위에서 설치한 libcudnn7 이 필요sudo apt-get install -y --no-install-recommends libnvinfer6=6.0.1-1+cuda10.1 libnvinfer-dev=6.0.1-1+cuda10.1 libnvinfer-plugin6=6.0.1-1+cuda10.1
GPU 이용가능한 지 확인
import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
#nvidia 드라이버 확인
nvidia-smi
위과정까지 마쳤는데도, 실제로 계산수행할 때에 에러가 발생함. 에러 내용은 다음과 같음
tensorflow.python.framework.errors_impl.UnknownError: [Derived] Fail to find the dnn implementation. [[{{node CudnnRNN}}]] [[sequential/lstm/StatefulPartitionedCall]] [Op:__inference_distributed_function_2865] Function call stack: distributed_function -> distributed_function -> distributed_function
해결방법
model.save('model.sav') model = tf.keras.models.load_model('model.sav')
Docker를 이용한 GPU를 지원하는 tensorflow 설치를 시도
테서플로 공식홈페이지 설치 설명은 다음과 같다.
docker -v
로 Docker 버전을 기록합니다. 19.03 이전 버전에는 nvidia-docker2와 --runtime=nvidia
플래그가 필요합니다. 19.03 이상 버전에는 nvidia-container-toolkit
패키지와 --gpus all
플래그를 사용합니다. 두 옵션 모두 위 링크된 페이지에 설명되어 있습니다.Docker 설치.
sudo apt install docker.io docker -v #버전확인 #Docker version 19.03.6, build 369ce74a3c
NVIDIA container toolkit 설치
sudo apt-get install nvidia-cuda-toolkit distribution="ubuntu18.04" curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker ##위 과정에서 오류가 발생해여 다음 과정을 수행함 #dpkg: error processing archive /var/cache/apt/archives/nvidia-cuda-dev_9.1.85-3ubuntu1_amd64.deb (--unpack): # '/usr/include/cublas.h'의 덮어쓰기를 시도합니다. 이 파일은 libcublas-dev 10.2.1.243-1 패키지에도 들어있습니다 # dpkg-deb: 오류: 붙여넣기 subprocess was killed by signal (파이프가 깨어짐) sudo apt download nvidia-cuda-dev sudo dpkg --force-overwrite -i nvidia-cuda-dev_9.1.85-3ubuntu1_amd64.deb
재부팅 후 CUDA 공식이미지 불러오기 테스트
sudo docker run --gpus all nvidia/cuda:10.0-base nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.00 Driver Version: 418.87.00 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 GeForce GTX 960M On | 00000000:02:00.0 Off | N/A | | N/A 50C P0 N/A / N/A | 223MiB / 2004MiB | 11% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| +-----------------------------------------------------------------------------+
tensorflow 이미지 설치
docker pull tensorflow/tensorflow:latest-gpu-py3 #오류발생 #docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied. # See 'docker run --help'. sudo hcmod 777 /var/run/docker.sock
tensorflow 이미지 실행
docker run --gpus all -it tensorflow/tensorflow:latest-gpu-py3 #UID와GID 지정 docker run --gpus all -u1000:1000 -it tensorflow/tensorflow:latest-gpu-py3 #폴더공유 docker run --gpus all -it -v <호스트디렉토리>:<컨테이너디렉토리> tensorflow/tensorflow:latest-gpu-py3 #rm 옵션은 종료시 컨테이너 초기화 docker run --gpus all -it --rm tensorflow/tensorflow:latest-gpu-py3
https://www.tensorflow.org/install
https://www.tensorflow.org/install/docker#tensorflow_docker_requirements
Nginx 설치
sudo apt install nginx
sudo service nginx restart #이 명령으로 재시작 가능
Nginx 기본 설정은 /etc/nginx/etc/sites-available 에 저장되어 있으며, 기본 홈폴더는 /var/www/html 이다. sites-enable 에 사이트설정 symlink를 만듦으로서 사이트를 활성화할 수 있다.
사이트 설정
#디폴트 사이트 설정 복사
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/flask
#디폴트 사이트 설정 비활성화
sudo rm /etc/nginx/sites-enabled/default
#새로운 사이트 설정 활성화
sudo ln -s /etc/nginx/sites-available/flask /etc/nginx/sites-enabled/flask
flask 웹사이트 정보 설정
/etc/nginx/sites-available/flask 파일의 내용을 다음과 같이 수정한다.
server {
listen 80;
listen [::]:80;
root /var/www/html;
server_name 192.168.43.159; #접속할 주소
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:60080;
}
}
uWSGI 설치 및 실행
sudo pip3 install uwsgi
uwsgi -s 127.0.0.1:60080 --wsgi-file app.wsgi
한편, app.wsgi의 내용은 다음과 같다.
#flask app 경로 : /home/changho/flask_web_basic
#flask app 파일명: flask_web.py
import sys
sys.path.insert(0,"/home/changho/flask_web_basic")
from flask_web import app as application
크론탭에 uwsgi 정보를 등록해두어 자동실행되게 한다.
@reboot cd /home/changho/flask_web_basic;sudo -uchangho uwsgi -s 127.0.0.1:60080 --wsgi-file app.wsgi -b65535#flask app을 실행할 사용자이름을 지정해준다
참고: https://rogerdudler.github.io/git-guide/index.ko.html
#git 복제 git clone /로컬/저장소/경로 <복사할 디렉토리> git clone http://원격경로 <복사할 디렉토리> git clone -b<브랜치네임> <원격경로> #git 저장소 시작 git init #파일 추가, 삭제 및 발행 git add <파일이름> git add * git rm <파일이름> #파일 삭제 git rm --cached <파일이름> #추적중지 git rm -r--cached <폴더이름> #폴더 추적중지 git commit -m "이번 확정본에 대한 설명" git push origin master #여기서 master는 branch 이름. 다른 가지를 선택하려면 가지 이름을 입력 git remote add origin <원격 경로> #가지(branch) 만들기 git checkout -b feature_x #master 가지로 돌아오기 git checkout master #가지 삭제 git branch -d feature_x #가지에 파일 전송 git push origin feature_x #갱신. 업데이트된 내용 내려받기 git fetch --all git stash git pull #다른가지에 있는 변경내용을 현재 가지에 병합하려면 git merge <가지 이름> #변경내용 병합 전, 어떻게 바뀌었는지 비교 git diff <원래 가지> <비교대상 가지> #요소들의 상태 확인 git status #gui 방식의 git gitk
sudo apt-add-repository ppa:hodong/nimf
sudo apt update
sudo apt install nimf nimf-libhangul
im-config -n nimf
nimf-settings
sudo add-apt-repository ppa:yunnxx/elementary
sudo apt update
sudo apt install indicator-application wingpanel-indicator-ayatana
then you need to edit a file (i used nano, use any editor you want – avoiding a holy war)
sudo nano /etc/xdg/autostart/indicator-application.desktop
find the line
OnlyShowIn=Unity;GNOME;
and add Pantheon
OnlyShowIn=Unity;GNOME;Pantheon;