반응형

개요

OpenCV 에서는 오래전부터 nVidia CUDA를 사용할 수 있도록 해줬다. 그중 DNN 모듈은 기존 딥러닝 플랫폼인 텐서플로나 파이토치 같은 모델을 변형하여 사용할 수 있다.

이때 cuDNN을 통해서 그래픽 카드를 활용하면 기존 cpu를 사용한 것 보다 좀 더 빠른 연산을 수행할 수 있다. 이 과정은 일반적은 OpenCV 빌드보다 신경써줘야 할 것이 많다.

서버 환경이 아닌 소형 임베디드 환경을 전제로 하여 이글을 작성하는 시점에 가장 널리 사용중인 Ubuntu 20.04 desktop기준 개발환경으로 서술한다.

만약 nVidia의 jetson 시리즈 보드를 사용할 경우 기본적으로 openCV가 빌드되어 있다.

기존 OpenCV 삭제

기본적으로 python3 pip를 통해서도 openCV 라이브러리가 설치 되어 있기도 하다. ros를 설치 했을 경우에도 기본적으로 opencv가 함께 설치 된다. 그리고 이미 설치가 되어 있더라도 cuDNN가 지원이 되지 않다면 이 또한 새로 빌드를 해야 한다.

# 기존 opencv 4.x 설치 확인
pkg-config --modversion opencv4

# 기존 opencv 3.x 이하 설치 확인
pkg-config --modversion opencv

# uninstall opencv-python
pip3 uninstall opencv-python

# ros를 통해서 설치가 되어 있는 경우
sudo apt purge ros-*
sudo apt autoremove

# 과거에 source code를 직접 빌드해서 설치했었을 경우
sudo find /usr/local -name "*opencv*" -exec rm -i {} \;

위의 명령어를 순서대로 해도 상관이 없지만, 먼저 확인을 하고 순차적으로 진행하는 것을 권장한다.

그래픽 드라이버 설치

그래픽 드라이버 설치를 할 경우 ubuntu desktop일 경우 super 키로 검색하여 "addtional drivers" 창에서 설정을 해도 상관은 없다. 다만 설치를 할경우 meta 라고 표기 되어 있는 것을 설치해야 모니터 외에 연산을 용도로 그래픽 카드를 사용할 수 있다.

# 일반적인 desktop 환경의 경우
sudo apt update
sudo apt install cuda-dirvers

# desktop이 아닌 다른 장치의 경우
sudo lspci -v | less
sudo ubuntu-drivers devices

# 해당 경우는 rtx3090 경우 저장소 추가하여 설치하는 예시
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt-get install nvidia-driver-460

# 설치를 완료한 뒤에는 reboot 할 것
reboot

정상적으로 설치가 되었을 경우 아래의 명령어를 실행했을 때 그래픽 카드에 대한 정보가 출력이 되어야 한다. 만약 출력이 되지 않는다면, 제대로 그래픽 카드 드라이버가 설치 되지 않은 것이다.

nvidia-smi

그래픽 카드 정보를 보면 CUDA 다음 버전이 있는데, CUDA 버전을 의미하는 것이 아니라 사용 가능한 버전을 표시되는 것이다.

CUDA 설치

nVidia 웹에서 CUDA를 설치하려고 하면 최신 CUDA로 다운로드 받도록 유도하는데 최신 버전의 경우 안정화 지원이 덜되는 경우가 많기 때문에 가능하면 최신화 이전 버전을 설치하는 것이 좋다. 아래 링크에 접속하여 CUDA 버전을 고르고 OS 등에 맞춰서 local로 설치를 하려고 하면, 터미널에 입력하는 명령어가 표시된다 이를 따라서 진행하면 된다.

https://developer.nvidia.com/cuda-toolkit-archive

 

CUDA Toolkit Archive

Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production

developer.nvidia.com

cuDNN 설치

cuDNN은 딥러닝같은 연산을 최적화 시켜주는 라이브러리다. 시간이 지나면, 설치 패키지로 배포가 되겠지만, 아직은 직접 다운로드 받아서 복사를 해줘야 한다(복사가 설치다). 앞에 설치한 CUDA 버전에 맞춰서 다운로드 받아으면 된다.

https://developer.nvidia.com/rdp/cudnn-archive

 

cuDNN Archive

Download releases from the GPU-accelerated primitive library for deep neural networks.

developer.nvidia.com

압축 파일을 다운로드가 완료가 되었다면 압축을 해제하고 각 필요한 파일들을 맞는 위치에 복사를 한뒤에 권한을 설정해주면 된다. 이때 앞의 CUDA 버전에 맞춰서 맞는 폴더로 복사를 하면 된다. 아래 예시는 cuda-11.8 을 설치했을 경우이다.

tar -xvf cudnn-linux-x86_64-8.8.1.3_cuda11-archive.tar.xz
cd cudnn-linux-x86_64-8.8.1.3_cuda11-archive
sudo cp include/cudnn*.h /usr/local/cuda-11.8/include
sudo cp -P lib/libcudnn* /usr/local/cuda-11.8/lib64
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*

update-alternatives

gcc 같은 빌드 툴들이 여러버전이 설치 되었을 경우 디폴트로 실행하도록 할 필요가 있다. 이 경우 전통적으로 심볼 링크를 사용하는데, 이를 관리해주는 update-alternatives 를 활용하면 억지로 심볼링크를 쓸 필요가 없다. 아래의 예제는 cuda-11.8 일 경우를 전제로 작성한다.

# update-alternatives config 확인
sudo update-alternatives --config cuda

# 아무것도 없는 경우
sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-11.8 11

# update-alternatives config 재확인
sudo update-alternatives --config cuda
# 추가된 항목이 보이게 됨

전통적인 심볼링크

위의 update-alternatives 가 없거나 자신이 상남자라고 생각한다면 전통적인 방식으로 직접 심볼링크로 해도 상관은 없다.

# 기존 심볼링크 제거
sudo rm /usr/local/cuda
# 새 심볼링크 생성
sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda

nvcc 확인

터미널에서 nvcc가 정상적으로 작동되는지 확인한다. 표시되는 정보에 설치된 CUDA와 같은 버전이 표시되어야 한다. 만약 nvcc가 실행되지 않는다면 환경변수를 아래와 같이 설정해준다. 그리고 이 터미널에서 opencv를 빌드해야 한다.

# nvcc 정보 확인
nvcc -V

# nvcc -V 정보가 안보일 경우
export PATH=$PATH:/usr/local/cuda/bin
export CUDADIR=/usr/local/cuda
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64

컴파일러 변경

opencv4.x 빌드시 gcc/g++ 버전이 너무 높으면 빌드가 되지 않는다. Ubuntu 20.04 LTS desktop 에 기본적으로  gcc-9 버전이 설치되어 있다. 이 경우 빌드를 시도하면 gcc-8, g++-8 이상은 빌드할 수 없다는 에러메시지를 볼 수 있다. 따라서 gcc-7, g++-7을 설치하자.

sudo apt install -y gcc-7 g++-7

이렇게 설치한 뒤에도 여전히 gcc-9와 g++-9가 default로 되어 있기 때문에 update-alternatives를 이용해서 바꿔주자

# 변경 및 우선순위 확인
sudo update-alternatives --config gcc
sudo update-alternatives --config g++

# 누락 되었을 경우
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 7
sudo update-alternatives --instlal /usr/bin/g++ g++ /usr/bin/g++-7 7

역시 update-alternatives가 없거나(없으면 설치하면 됨), 자신이 상남자라면 직접 심볼링크를 생성해서 사용해도 상관 없다. 물론 평범한 겁쟁이라면 아래 방법은 가능하면 피하자.

sudo rm /usr/bin/gcc /usr/bin/g++ /usr/bin/cc /usr/bin/c++
sudo ln -s /usr/bin/gcc-7 /usr/bin/gcc
sudo ln -s /usr/bin/g++-7 /usr/bin/g++
sudo ln -s /usr/bin/gcc-7 /usr/bin/cc
sudo ln -s /usr/bin/g++-7 /usr/bin/c++

# 버전확인
gcc --version

gcc 와 g++ 버전이 7로 보인다면 이제 다음단계로 넘어가면 된다.

VTK 설치

OpentCV가 viz 부분을 VTK 모듈을 의존한다. 만약 사용하지 않는다면 OpenCV 빌드시 해당 부분을 off 하고 빌드를 해도 된다.

sudo apt install vtk7

GTK 2.0 이상 설치

OpenCV가 리눅스에서 imshow() (image show) 같은 독자적인 창을 생성할 경우 사용하는 의존 모듈이다. 만약 개발중이 아니거나 중간중간 로컬에서 이미지를 표시하지 않는다면, OpenCV를 빌드할때 해당 옵션들을 off 한 상태에서 빌드하면 된다. 버전은 최소 2.0 이상이 필요하다.

일반적인 개발환경이라면, 해당 모듈도 미리 설치를 해주자.

sudo apt install -y libgtk2.0-dev

OpenCV 빌드

다운로드

이제 OpenCV 소스코드를 다운로드 받을 차례이다. OpenCV 본가 외에 contrib 모듈이 존재하는데 해당 모듈은 beta 수준의 모듈들을 담고 있다. 충분한 시간이 지나면 OpenCV 본 소스에 편입이 되지만, 최신 기능을 사용하기 위해서는 contrib가 필수 적이다.

둘다 버전에 맞춰서 다운로드를 받아야 한다. 예시에서는 4.6.0 버전으로 받는데 url 체계는 같으므로 존재하는 버전이면 숫자만 바꿔서 wget으로 다운로드 받아도 된다.

cd ~
wget -O opencv-4.6.0.zip https://github.com/opencv/opencv/archive/4.6.0.zip
wget -O opencv-contrib-4.6.0.zip https://github.com/opencv/opencv_contrib/archive/4.6.0.zip
unzip opencv-4.6.0.zip
unzip opencv-contrib-4.6.0.zip

압축을 풀는 과정에서 opencv-contrib-4.6.0.zip 이 생성하는 폴더이름이 opencv_contrib-4.6.0로 바뀌는 경우 있으니 주의 하자.

CMake-gui

대부분 CMake로 makefile을 생성할 경우 스크립트를 만들어서 사용을 한다. 하지만, 직관적으로 어떤 옵션을 빼고 넣어야 하는지 확인하기 어렵기 때문에 여기서는 CMake-gui 를 사용한다. 우선 CMake-gui를 설치하도록 하자.

sudo apt install -y cmake cmake-gui

cmake-gui 를 실행하기 전에 소스파일 폴더 안에 build 폴더를 먼저 만든다. 여기서는 opencv 4.6.0을 다운로드 받아서 진행하는 것을 전제로 한다.

cd ~/opencv-4.6.0
mkdir build

이 터미널은 아직 닫으면 안된다.

super키(윈도키) 를 누른뒤 cmake-gui 를 실행한다. 처음 cmake-gui 를 실행한다면 공란으로 보이는데 우선 where is the source code 경로를 ~/opencv-4.6.0 으로 직접 입력하거나 Browse source 버튼으로 위치를 찾아도 된다. 경로는 가능하면 절대경로로 작성하는 것이 좋다.

where to build the binaries 항목은 아까 만든 ~/opencv-4.6.0/build 경로로 잡는다. 이후에 하단의 configure 버튼을 클릭하면, cmakelist.txt를 찾으면서 초기 설정들을 찾아서 표시해준다.

이제 옵션을 수정하면 된다. JAVA로 개발하지 않는다면, search에 java를 입력해서 해당되는 체크표시를 해제하면 된다. 우리가 지금 빌드하는 목적은 그래픽 카드를 이용해서 opencv DNN 모듈을 사용하려는 거니 다음 항목들을 체크한다.

  • WITH_CUDA
  • BUILD_CUDA_STUBS
  • OPENCV_DNN_CUDA

이외에 유료 모듈과 pkg-config 를 설치 되게 위해서 아래 항목들도 체크 표시를 해준다.

  • OPENCV_ENABLE_NONFREE
  • OPENCV_GENERATE_PKGCONFIG

그리고 시행착오로 에러메시지를 통해 삽질(?)로 알게된 옵션을 추가한다. 옵션을 추가하는 방법은 add entry 를 통해서 추가하면 된다.

옵션라벨 타입
CUDNN_INCLUDE_DIR PATH /usr/local/cuda/include
CUDNN_LIBRARY PATHFILE /usr/local/cuda/lib64/libcudnn.so
CUDNN_VERSION STRING 8.8
OPENCV_EXTRA_MODULES_PATH PATH ~/opencv_contrib-4.6.0/modules

opencv-python 모듈처럼 하나의 통합된 형태의 라이브러리를 사용하는 것이 아니면, BUILD_opencv_world 항목도 찾아서 체크를 해제하면 된다.

모든 설정을 마쳤으면 configure 버튼을 다시 클릭한다. 설정을 적용하는 과정에서 필요한 파일을 다운로드 받기도 한다. 아무런 에러가 없이 무사히 완료가 되었다면, generate 버튼을 클릭하여 빌드 파일을 생성한다. 여기까지 무사히 마쳤다면 cmake-gui 창은 닫아도 된다.

make & install

이제 다시 터미널에서 생성된 파일들이 있는 build 폴더로 이동한다. make를 입력하여 빌드를 시작하면 된다. 만약 빌드 시간을 측정하고 싶다면 time make 처럼 입력해도 된다. 컴퓨터 성능에 따라서 걸리는 시간의 차이가 있다.

cd ~/opencv-4.6.0/build
# 큰무리가 없다면
make

# 만약 빌드 환경의 메모리가 부족하다면 $(nproc) 보다 작은 숫자
make -j $(nproc)

만약 메모리가 부족할 것 같다면, -j 옵션으로 job(사실상 thread) 수를 줄여서 빌드하면 된다. 대신 시간이 더 걸린다.

무사히 빌드를 마쳤다면 이제 라이브러리 설치를 하면 된다.

sudo make install

정상적으로 마친뒤에 설치 여부를 확인한다.

pkg-config --modversion opencv4

opencv 버전이 표시가 된다면 정상적으로 설치가 된 것이다. pkg-config 는 c++ 코드를 빌드할때 필요한 존재니 반드시 있어야 한다.

참조

 

 

OpenCV + CUDA 직접 빌드하기 (Windows/Linux 종합)

최근에 opencv에 있는 dnn을 한번 써보려고 직접 소스를 받아서 빌드(build)해 보았다. 역시나 엄청난 삽질의 연속이고 할 때마다 이것 저것 해결책을 검색하느라 많은 시간을 소모한다 (삽질은 누구

darkpgmr.tistory.com

 

OpenCV Building with CUDA CUDNN - No CUDNN

Hi, It seems that you already find in in this comment: For Jetson 4.5, include path is /usr/include/ and the library path is /usr/lib/aarch64-linux-gnu/. Thanks.

forums.developer.nvidia.com

 

반응형
반응형

개요

github 에서 private repository를 사용하다보면 https 방식으로 소스코드를 clone 하는 것을 금지 하고 github에서 자체적으로 제작한 CLI 나 ssh-key를 사용할 것을 강제하고 있다. 문제는 github 정책상 다른 계정에서 하나의 ssh-key를 등록해서 사용하고 있는 경우 다른 계정에서 ssh-key를 등록할 수 없다는 것이다. 이는 보안을 위한 올바른 정책이다.

하지만, github를 개인 계정만 사용하는 것이 아니라 회사 계정과 구분해야 사용해야 할 경우가 있기 때문에 어쩔 수 없이 복수의 계정을 사용해야 하는 경우가 발생된다. 이 경우 ssh-key를 복수로 사용해야 한다.

ssh rsa key 추가 생성

우선 기본적으로 기존에 사용하는 ssh-key가 있다는 전제하에 추가 생성을 한다. github에서는 기본적으로 레거시 rsa 키보다는 추천하는 알고리즘으로 생성한 ssh-key 사용하기를 권장하고 있다. 그러나 아직(?)은 rsa 방식을 허용하고 있다.

windows 경우 git-bash 에서 리눅스나 OS X 에서는 터미널에서 다음과 같은 옵션으로 ssh-key 를 생성한다.

# 일반적인 방법
ssh-keygen -C "<your_email@example.com>" -f ~/.ssh/id_rsa_<option>

# github에서 권장하는 알고리즘 필수요소는 아님
ssh-keygen -t ed25519 -C "<your_email@example.com>" -f ~/.ssh/id_rsa_<option>

-f 옵션으로 id_rsa_<option> 이름으로 키가 생성 할 수 있다. 일반적으로 생성과정에서 경로를 묻지 않고 생성을 하게 된다. 이후 추가 패스워드를 넣지 않는다면 enter를 연타하여 생성을 하면 된다. 여기서 다음 예시를 위해 <option> 자리에 임으로 add 라고 이름을 붙이도록 하겠다.

config 설정

windows 에서는 ~/.ssh/config 파일이 생성되어 있는 경우가 있다. 유닉스 계열(리눅스, OS X)에서는 없기 때문는 경우가 있는데 이 경우 생성해주면 된다. 여기서는 vs code로 편집을 하는데 편한 편집 프로그램을 사용해서 작성을 하면 된다.

# ~/.ssh/config
# default
Host github.com
	HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.pub
    
# addition option 추가된 ssh-key
Host github.com-add
	HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_add.pub

감이 있는 사람은 config 파일 목록에서 보면, Host 이름에 따라서 다르게 동작하게 한다는 것을 알 수 있을 것이다.

git clone from remote repository

우선은 github 의 두번째 계정에 새로 생성한 id_rsa_add.pub 키를 등록을 먼저 하도록 하자.

이제 git 명령어로 github에 있는 repository를 당겨 오도록 하자. 이 경우 ssh-git url 구성 방식에 대해서 이해를 해야 한다. url를 구성하는 위치중에서 host에 해당 되는 부분을 다른 ~/.ssh/config 에 설정한 host 이름으로 대체를 하면 HostName은 유지되지만 사용한 ssh-key는 다르게 사용한다.

# git clone 예시
git clone git@{host}:{github_id}/{repository_name}.git

# add로 git clone을 할 경우
git clone git@github.com-add:{github_id}/{repository_name}.git

정상적으로 clone이 되었다면, 이제 github 에 복수의 계정으로도 ssh-key 를 사용할 수 있게 되었다. 이렇게 clone으로 받아 생성된 workspace는 host 부분이 처음 받은 이름으로 되어 있어 commit/push/pull 등을 정상적으로 사용을 할 수 있게 된다.

참조

 

Github 다수 계정을 위한 SSH key 설정 :: 마이구미

이번 글은 하나의 서버에서 Github 계정을 둘 이상 사용할 수 없는 이슈에 대해 해결 방안을 다뤄본다.이번에 private 저장소를 만들어서 개발서버를 셋팅하는 과정에서 얻은 무식함과 깨달음으로

mygumi.tistory.com

 

새 SSH 키 생성 및 ssh-agent에 추가 - GitHub Docs

SSH 키 암호 정보 SSH(Secure Shell Protocol)를 사용하여 GitHub.com의 리포지토리에서 데이터에 액세스하고 쓸 수 있습니다. SSH를 통해 연결할 때 로컬 머신에서 프라이빗 키 파일을 사용하여 인증합니다.

docs.github.com

 

한 컴퓨터에서 여러 개의 깃허브 계정 사용하기

😀SSH 설정을 통해 한 컴퓨터에서 여러개의 깃허브 계정을 사용해보자.

velog.io

 

github 에 여러 계정 등록하고 ssh 설정하기

새로운 id 는 new-github-id 입니다.

www.lesstif.com

 

반응형
반응형

python 3.8.12, 3.x 버전 설치

버전 설치라고 하지만, 실제로는 빌드작업이다. 여기서는 3.8.12 버전을 빌드한다. 글을 적는 시점에서 최신버전인 3.9.x를 설치하더라도 버전 숫자만 바꿔서 진행을 해도 무난하다.

배경

간만에 방 구석에서 굴러다니는 raspberry pi3 를 2021년 9월 시점의 rasbian lite 버전을 설치했다. 여기에는 python 3.7.3 이 기본적으로 설치가 되어 있다. 얼마전 pyqt5 를 윈도에서 시험삼아서 테스트할 때 python3.8.10 이상이 되어야 다른 package에 문제가 없는 것을 확인했기 때문에 3.8.12를 설치하려 했다. 하지만, apt install 명령어는 기본적으로 이미 빌드가 되어 있는 파일을 설치하는 것이라 apt에 등록되어 있는 repository에 새로운 빌드된 것이 없다면, apt install 로 설치할 수 없다.

이 때문에 자신의 (독특하고 까다로운?) 입맛대로 버전을 바꿔서 설치를 하기 위해서는 필요한 python 3.8.12 소스파일을 직접 다운로드 받아서 직접 빌드 하여 설치하는 방법이 있다. 문제는 이 방법은 상당한 시간이 걸린다.

따라서 만약 해당 환경을 양산을 해야 한다면, deb package로 만들거나 img로 만들어 놓고 쓰는 것을 추천한다.

빌드 방법

우선 빌드에 필요한 빌드 도구들이 필요하다. python 공식 문서에서 찾을 수 있을 것이다(아마도).

sudo apt install -y build-essential tk-dev libncurses5-dev libncursesw5-dev \
    libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev \
    libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev \
    libffi-dev tar wget vim

python 소스코드 다운로드

https://www.python.org/ftp/python/ 에서 소스코드 압축 파일을 마우스 우클릭 한뒤 링크복사를 선택하여 복사한다음에 wget 명령어 뒤에 붙여넣어서 다운로드를 받자.

wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz

빌드

다운로드된 압축파일을 풀고 해당 폴더에서 make 명령어를 순서대로 입력하면 된다.

sudo tar zxf Python-3.8.12.tgz
cd Python-3.8.12
sudo ./configure --enable-optimizations
sudo make -j4
sudo make altinstall

만약 sudo make -j4 진행중에 실패를 했다면 메모리 부족일 가능성이 높다. 이경우 -j 뒤의 숫자를 줄여서 다시 시도하면 된다. 자신이 상남자가 아닌 겁쟁이라면 처음부터 -j2로 해도 상관 없다.

설치 확인

그냥 python 버전으로 확인해보면 된다.

python3.8 -V

환경변수 설정

python 명렁어의 환경변수를 수정하여 3.8.12가 실행되도록 하자, 다음 명령어 한줄이면 된다. 만약 잘못 입력을 했다면, vim 혹은 nano 같은 편집 툴로 마지막줄을 수정하면 된다.

echo "alias python=/usr/local/bin/python3.8" >> ~/.bashrc
source ~/.bashrc
python --version

패키지 관리

pip 도 경로를 확인하고 환경변수를 변경해도 된다. 기본적으로 sudo apt install python3-pip 로 설치할 경우 3.7.3 버전에 해당되는 pip3가 설치된다. python -m pip install $package 형태로 사용하면 된다.

python -m pip --version

참조

 

How to install Python 3 - Raspberry Pi Forums

billintad wrote: As far as I am aware the recommended way to install a python package is to use : man says: NAME pip - A tool for installing and managing Python packages SYNOPSIS pip [options] pip3 [options] DESCRIPTION pip is a Python package installer, r

forums.raspberrypi.com

 

 

Updating Python 3.7 to 3.8 on Raspberry Pi

I recently updated my Raspberry Pi with sudo apt update and sudo apt full-upgrade to the system. Even if Python 3.8 is out, when I run python3 in terminal, it shows me version 3.7, instead of 3.8. ...

raspberrypi.stackexchange.com

 

[Python] 라즈베리파이에서 python 최신 버전 설치하기

라즈베리3b+를 기준으로 작성되었습니다.라즈베리파이에 Python 3.5.3 버전이 제공되고 있다python을 최신 버전으로 변경하는 방법은 아래와 같다 ( 3.8.5 버전을 기준으로 작성 )1. Python을 설치하기 전

power-of-optimism.tistory.com

 

반응형
반응형

list boolean 판별 all, any

배경

Python의 가장 큰 매력은 있으면 편할 것 같은 내장함수가 많다는 것이다. 종종 여러요소들을 검사할 경우 검사 결과에 대해서 list에 담아서 확인을 하고 싶은 경우가 있다. 경우에 따라 모두 True이어야 하거나 하나라도 True 인 경우가 필요하다면, all()과 any() 내장 함수를 사용하면 된다.

사용 조건은 iterable (반복자 사용가능)으로 즉, 좀 더 쉽게 접근하자면 for in 문 사용이 가능한 list 같은 자료구조에 사용할 수 있다.

 

all()

입력받은 list 인스턴스중 모두다 True 이여야 True 값을 반환한다. 즉, 각 list내의 boolean 값이 각각 and 논리연산을 한 것과 같다.

a = [True, True, True]
b = [True, False, True]
all(a)
# True
all(b)
# False

 

any()

입력받은 list 인스턴스중 하나라도 True이면 True를 반환한다. 각 list내에 boolean 값이 각각 or 논리연산을 한 것과 같다.

a = [False, False, False]
b = [True, False, False]
any(a)
# False
any(b)
# True

 

 

반응형
반응형

datetime, timestamp, str 변환

배경

 어쩌다보니 플라스크를 이용해서 서버관련된 개발을 하게 되었다. 원래 도쿠 위키에 정리를 해놓은 문서이지만, 다시 블로그에 올리는게 나을 것 같아 정리를 한다.

 서버쪽에서 데이터를 수집 및 표시를 할 때 시간에 대해서 자주 다룬다. 특히 실시간으로 뭔가를 처리해야 할 경우나 데이터를 처리하는 경우 더 더욱 자주 사용한다. 참고로 하드웨어 쪽 펌웨어의 timestamp와 서버에서 말하는 timestamp 간 차이가 있으니 주의해서 이해를 해야 오해가 없다.

 

datetime 관리 팁

 서버에서 timestamp의 의미는 unix timestamp로 1초는 1의 값이 된다.

 

 파이썬에서는 내장모듈인 datetime을 중심으로 코드를 작성하는 것이 좀 더 단순한 구조가 된다. 이는 내장 모듈이기 때문에 어지간하면 ORM 모듈에서 지원을 하기 때문이다.

1. datetime now

from datetime import datetime

datetime.now()
# datetime instance now

 

2. datetime to timestamp

from datetime import datetime

timestamp = datetime.now().timestamp()

 

3. datetime to str

from datetime import datetime

datetimeStr = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%L")
# ex) 2021-06-07 14:57:01.113000

 

4. timestamp to datetime

from datetime import datetime

timestamp = datetime.now().timestamp()
dt = datetime.fromtimestamp(timestamp)

 

5. str to datetime

from datetime import datetime

datetimeStr = "2021-06-07 14:58:01.11100"
dt = datetime.strptime(datetimeStr, "%Y-%m-%d %H:%M:%S.%L")

 

참조 자료

(추후 추가)

반응형
반응형

기본 키 맵 해제

 VS Code로 사실 충분히 사용을 하고 있지만, PyCharm의 명성을 듣고 있던 터라 개인적으로 한번 사용을 해보게 되었다. 그런데, 키 맵이 범상치 않았다. 일반적인 편집 키인 Ctrl + a 라던가 Ctrl + c 같은 윈도우에서 사용하는 일반적인 단축키가 먹히지 않았다.

 

 검색을 하던중 알게 된 것은 PyCharm의 기본 플러그인으로 Vim 으로 인해서 기존의 원도우 단축키가 먹히지 않았었다. 따라서 플러그인 설정을 해제하면, 사용할 수 있다.

 

 근데, vim 플러그인이 기본으로 활성화 되어 있다는 것은 Vim 단축키가 개발에 편리하니 한 것 아닐까 하는 생각이 든다.

참조 자료

반응형

'각종 툴' 카테고리의 다른 글

CMake 익히기 : 기초문법 (2)  (0) 2018.02.21
CMake 익히기 : 기초문법 (1)  (0) 2018.02.19
CMake : 공식예제 step1 해보기  (0) 2017.12.11
반응형

jinja2와 vuejs 혼용하여 사용하기

배경

내용이 그리 많지는 않다. vuejs 와 jinja2에서 '{{', '}}'해당 기호 용도가 중복이 된다. 때문에 같이 혼용하기 위해서는 해당 기호를 바꿔야 한다.

다행스럽게도 vuejs의 경우 JavaScript 기반이다 보니 문법을 parsing 하는 delimiters 를 변경할 수 있다.

vuejs 기호 변경

<!-- jinja2 -->
<div id="app">
    {% set val = hello -%}
    <span>[[ {{ val }} ]]</span>
</div>
// javascript
let app = new Vue({
    el: "#app",
    data: {
        hello: "world"
    },
    delimiters: ['[[', ']]']
});

참조

  • 추후 다시 찾게 되면 추가 예정
반응형
반응형

jinja2 에서 javascript로 값 넘기기

배경

주로 웹 개발보다 기능을 개발해서 API 형식으로 구현을 하다보니 Django 보다는 Flask가 적합하다고 생각하고 사용중에 또 다시 인력 부족으로 웹페이지를 만들던 중 jinja2 에서 javascript로 데이터를 넘겨야 하는 경우가 발생해서 기록으로 남긴다.

유용한 경우

해당 기능은 ajax 통신 이전 초기에 웹 페이지가 새로로드 할때마다 초기화 해야하는 데이터가 바뀌어야 하는 경우에 사용하면 유용하다.

예를 들어 로그인된 사람마다 대시보드에 처음 표시되는 데이터를 전달하는 경우.

Flask(python3) -> Jinja2 -> javascript

원리는 Flask에서 Jinja2 템플릿을 html 문서로 만든다음에 Client에 전성한 다음에 javascript가 로드되는 순서로 동작된다는 것을 이용한 것이다. 더군다나 json은 문자기반 데이터이기 때문에 이것이 가능하다.
즉 Flask에서 데이터를 Jinja2를 통해서 문자형태로 전달 가능하다. 그럼 json을 Jinja2를 통해 작성하면 충분히 전달이 가능하다.

#Flask
import json

@app.route("/")
def index():
    data = { "a" : "b" }
    return render_templete("index.html", data=json.dumps(data, ensure_ascii=False))
<!-- jinja -->
<script>
    let initdata = JSON.parse( {{ data | safe }} );
</script>

이제 jinja2로 삽입된 위의 script 태그 이후에 받아서 사용하거나 모두 페이지로드 뒤에 해당 데이터를 사용하도록 작성하면 된다.

참조

https://stackoverflow.com/questions/15321431/how-to-pass-a-list-from-python-by-jinja2-to-javascript/22157700

 

How to pass a list from Python, by Jinja2 to JavaScript

Let's say I have a Python variable: list_of_items = ['1','2','3','4','5'] and I pass it to Jinja by rendering HTML, and I also have a function in JavaScript called somefunction(variable). I am tr...

stackoverflow.com

 

반응형
반응형

bootstrap 4 datetimepicker(Tempus Dominus)

배경

어쩌다 보니 4년만에 웹 개발관련된 업무를 하게 되었다. 요즘 트렌드는 어떤지 모르겠지만, 라이브러리는 과거 보다 확실이 다양해졌다. 일단 리서치 했을 때 국내에서는 Bootstrap 이 인기 있는 것 같아서 간단히 적용을 하던 중 bootstrap에서는 datetimepicker에 대한 지원이 없어서 이를 보강해주는 보조(?) 라이브러리가 있었다.

설치 방법

웹 분야가 늘 그렇듯이 html 문서에 script 항목에 추가를 시켜주면 된다. 다만, 설명에는 CDN 주소만 있고, 정작 다운로드 주소 없이 경로를 넣어주면 된다고 설명되어 있다.

AngularJS나 Django의 경우 설치를 하면 간단하나, 필자는 Flask를 사용하고 있기 때문에 따로 다운로드를 받아야 한다.

공식 페이지 주소를 보면 알 수 있듯이 github 에 있다. 즉, 레포지토리에 가서 dist 혹은 build 또는 min 으로 된 폴더에 있는 것을 다운로드 받으면 해결된다. 의존 라이브러리인 moment 라이브러리 링크도 아래에 추가한다.

참조

반응형
반응형

URI, URL 의미

작성 배경

한동안 생각을 안하면, 개념을 잊어버려서 작성을 해 놓는다.

이해한 의미

자연스럽게 URI와 URL을 혼용하여 사용하고 있는데, 이 둘은 정확히는 약자도 다른 용어이다.

URI는 Uniform Resource Identifier 로 웹 페이지 주소와 같은 개념인데 반해 URL은 Uniform Resource Locator 의 약어로 웹 페이지의 주소에서 자원의 위치까지를 지칭한다.

참조

반응형

+ Recent posts