2018년 5월 29일 화요일

Anaconda3 + OpenCV + Python 3.6.5 설치삽질

비슷한 강의도 많고 버전별로 바뀌는것도 너무 많아서 지금 내가 쓰는 환경을 정리차 작성

아래의 기술사항등은 급하게 작용을 위해 몇시간정도 시도해본 결과를 정리한 내용이므로 절대 정확하지도 않고, 패키지 설치 부분은 꼬리꼬리한 내용이 많은 상황이기 때문에,
무턱대고 따라하는것을 권장하지 않습니다..
설치할 환경은 Python 3.6.5 버전에 Opencv를 설치하여, 이미지 프로세싱 작업을 구축을 계획합니다.



우선 Python의 자체적인 문제가 있는데, 외부 패키지들은 해당 운영체제에 글로벌하게 적용이 된다합니다.
Npm --g 처럼 운영체제에 설치가 되는데, 이는 문제를 야기시킬수 있기 떄문에,
파이썬을 이용한 외부 패키지 작업을 할 때에는 이러한 문제를 해결하기 위한 외부적인 수단을 사용합니다.
npm --save 처럼 해당 프로젝트에만 원하는 패키지 설치를 하기 위함인것 같은데요,
또한 Tenserflow 는 윈도우 운용체제를 지원하지 않는것 같습니다..

위의 문제를 해결하기 위해, 대중적인 두가지가 있는데,
1.Docker
2.Anaconda

가 있습니다.
프로그램의 존재이유는 상기와 같습니다. 각각의 프로젝트별로 각기다른 패키지를 사용하게 하기위해, 별도의 개발환경을 구축합니다.

둘다 오래 써보지 않았으나(-_-)
Anaconda가 좀 더 설치가 덜 까다로웠기 때문에 채택했습니다.

Python 3.6 이상의 버전을 설치하면 pip라는 패키지 관리 모듈이 같이 설치가 됩니다.
구버전이라면 업데이트를 통해 pip를 사용할 수 있으며/ 아나콘다를 통해서도 pip가 설치되긴 하는것 같습니다.

그다음 Anaconda3 을 설치합니다.
Anaconda는 2와 3버전이 있는데, 뒤의 넘버링은 파이썬의 버전입니다.
저는 Python 3.6.5이기 때문에 Anaconda3 을 설치합니다.
설치과정은 그냥 next면 됩니다.

Anaconda설치가 완료되면, cmd창에서
python --version
pip --version
을 쳐보면, Anaconda 가 물려있음을 볼 수 있습니다.

이제 아나콘다로 새로운 작업환경을 만들기 위해, 위의 cmd창에
conda create --name "projectName" python=3.6.5
를 입력하면 projectName 라는 이름의 Env를 생성합니다.

conda env list를 치면, 방금 만든 projectName 이라는 작업환경과, 기본제공 작업환경이 나옵니다.

이제 projectName 작업환경으로 전환하기 위해서
conda activate projectName 을 입력하면,
cmd창에서
(projectName) C:/ :> 같이 나타나게 됩니다.

이제 최신버전(현제 Python버전과 호환되는) OpenCV를 설치하기 위해
conda install -c conda-forge opencv

를 타이핑하면, OpenCV설치가 끝이납니다.

추가적으로 필요했기 때문에, 다른 패키지들도 설치를 했는데,
단순히 pip install 'packageName' 를 타이핑함으로, 바로 적용이 되는것을 확인했습니다.




Run Python on Node.js

Node만의 기능으로만 재미보기에는 심심하기 때문에, 다른 언어를 사용해서 실행결과값을 주고받는 방법을 블로그를 완성했을때 즈음부터 했었는데요,
지난 한달간의 Opencv c++ 의 삽질끝에, 조금 더 돌아가더라도 유저가 많은 Python을 쓰는게 정신건강에 이로울것 이라는 판단이 났기 때문에 파이썬 공부를 준비중에 있습니다.

파이썬은 재쳐두고, 이번엔 Node에서 어떻게 파이썬 코드를 실행하는지 알아봤습니다.

우선 node에서 필요한 모듈은 python-shell 입니다.



동일한 directory에 위처럼 두 파일을 만들어 app.js를 실행하면

ta-da

더 자세하고 깊은 설정은 npm document에서 참조할 수 있습니다.

이제 파이썬을 배우면서 바로 장난질을 쳐볼 수 있겠네요

2018년 5월 21일 월요일

mariadb install on ubuntu/installing toad for gui workbench


검색하면 떠오르는 최상단 글들은 5 버전이나, git을 통해 받는방법등이 있기 때문에
안정화버전으로 10버전이 올라간건 최근인듯 합니다.

apt를 통해 검색시, 이제는 10버전이 공식적으로 올라왔기 때문에, 설치는 매우 간단해 졌습니다.

//서버컴퓨터에서 db를 설치하고 준비합니다 //

apt-get install mariadb-server

실행은 sudo mysql
 역시 mysql개발진들이 퇴사해서 만든거 답게, 실행문도 당당하게 mysql..

 db생성
create database <dbname>

유저생성
create user <username>@<localhost> identified by <password>

방금 생성한 db의 모든 권한을 방금 생성한 유저에게 부여하기
grant all privileges on <dbname>.* to <username>@'%'

설명을 따르자면 db명 뒤의 .*을 추가적으로 입력함으로써 해당 db내부의 모든  차후 추가되는 스키마들에 대한 권한도 동일하게 부여하며,
유저이름 뒤의 @'%'는 localhost에서만 접속을 허용하는것이 아닌, 외부 ip에서의 접속도 허용해줌을 의미한다고 합니다.



 //작업용 pc에서 db의 편리한 접근을 위한 gui manager tool인 toad를 설치합니다.//

https://downloads.toadworld.com/tw-filestore/seed/ProductDownload/toad-edge-1-2-0-windows-64-bit-freeware/file/toadedge_1.2.0_x64_en.msi
로 Toad edge 무료판 다운로드

이후 설치/회원가입/로그인 까지 순조롭게 진행후,
connect 에서
db서버 ip / 3306(default)
생성한 userid / dbname 을 입력하고 접속!

2018년 5월 10일 목요일

opencv + contrib + cmake 설치 노트

opencv와 contrib 는 상당히 업데이트나, 안정성에 따라 설치방법등에 차이가 보이는것 같습니다.
네 다섯군대 블로그를 따라 시도했는데, 연이어 실패한뒤, 가장 최신자를 따라해서도 몇번의 실수끝에 성공했습니다.

그런이유료 VS17에서 Opencv 3.4.1 버전 기준 설치방법을 써 봅니다.

제가 가장 잘 참조한 블로그인 이곳도 꼭 한번 참조 해 주세요! 훨씬 더 정확한 설명이 있습니다.


우선 많은 블로그에서 강조가 안되어있던데, onepCv와 contrib의 버전은 동일해야 합니다.

https://opencv.org/releases.html
에서 3.4.1 버전을 source로 받습니다.
https://github.com/opencv/opencv_contrib/releases
에서 반드시 위의 버전과 동일한 3.4.1 을 받습니다.
CMake 를 받습니다. (이건 좋은 강의가 많으니 pass)

http://eigen.tuxfamily.org/index.php?title=Main_Page
에서 *선택적으로* eigen 패키지를 받습니다.
이 패키지는 계산을 편하게 해둔 패키지인데, 필수는 아니라 합니다.
남들이 해래서 일단 따라했습니다. 중간에 추가 하는것 보다, 나중에 빼는게 편하니깐(..)

이후 헌 폴더에 openCv와 contrib 폴더를 담고, output폴더도 하나 만들어 줍니다.
source code쪽은 opencv 폴더를, build the binaries쪽은 출력된 파일들을 담는곳 입니다.
그뒤, configure를 누르면, 위 처럼 빌드 IDE를 선택하는 창이 뜨고, 알맞는 IDE를 선택 한 후 finish를 누르면 opencv 라이브러리로 프로젝트를 만듭니다.


그럼 요로코롬 무섭게 빠랗게 칠해진 목록들이 뜨게 되는데,겁먹을 필요는 없습니다.
search창에 tests 를 검색


테스트 코드들을 만들것인가를 묻는가 본데, 지금 상황에서는 빌드 시간만 늘리기 때문에 그닥..

옵션인 eigen 활성화 여부인데, 안쓰면with_eigen을 비활성,
쓴다면 활성화 + path을 방금 받은 폴더로 제정의 합니다.

contrib패키지의 위치를 잡아줍니다.
이제 이상태로 다시configure를 하면

여기까지 별일 없으면, 아래 로그창에 configuration done이 뜰건데, 다른 문제가 생긴다면 이제 골 터집니다 구글링과 신의 가호가 있길 빠이빠이 짜이찌앤..
똑같은 환경에, 올바른 버전을, 올바른 path를 설정한다면 뜰일은 없을것 입니다.

 이건 블로그마다 상당히 다르던데, 3.4.1 버전에서는 체크하는것이 옳은것 같습니다.

체크후에 다시 configure를 합니다. 역시 별 탈 없다면, generate버튼이 활성화 된것이 보일건데요, 고놈을 클릭합니다.

이제 cmake파트는 끝이났습니다. 아까만든 output폴더에 가 보면 새로운 프로젝트가 생성되어 있는데, 고놈을 실행하거나, cmake에 open project를 누릅니다.



프로젝트의 솔루션 탐색기를 펴보면 뜨악 스럽게 뭔가 많이 생긴걸 볼 수 있는데,
CMakeTarget 폴더의 INSTALL을 찾습니다.
우클릭 - 빌드 를 누릅니다.

매우 길고 두려운 빌드 시간이 끝이나면, 성공이나 실패가 출력됩니다.
제가 겪은 실패의 경우에는, 대부분 CV_OVERRIDER 를 찾을수 없다는 에러가 대부분 이었습니다.
이 경우는, 앞서 설명 했지만, opencv와 contrib의 버전이 반드시 동일해야만 합니다.
매칭이 되지 않을시, 오류를 뿝을것 입니다.
이외에도 여기서 CMake 설정의 후폭풍이 쏟아져 나오는데, 경우에 따라 오류는 다양하고, 대부분 해결법은 답이 없는..

이제 debug/release 모두 빌드를 한뒤, output/install/ 의 경로들을 opencv라이브러리로 사용하면 됩니다.
voila

2018년 5월 7일 월요일

[Postgresql] arrag_agg와 if문을 사용한 문제.

노드공부방에서 표류중에 db질문이 올라왔는데, 재미있을거 같기도 하고 어려워보이기도 해서 한번 풀어 보기로 했습니다.




주어진 테이블은 위와 같으며,


질문자는 위와 같은 방식의 출력을 원했습니다.

a 와 b 칼럼을 출력하는데, b가 null일때는 아무런 출력물이 없으나, b에 값이 있는경우,
b의 값과 동일한 모든 컬럼들을 하나로 묶어 출력하는것 입니다.

목적은 긴 줄의 질의를 하나의 질의로 압축시키는것 이었습니다.


간단할 줄 알고 무작정 덤볐는데, select문을 몇번 날리다가 당연한 문제에 도달했습니다.

select a,(select * from test) from test; 와 비슷한 방식의 쿼리를 먼저 날렸었는데요,

ERROR: subquery must return only one column
서브 쿼리는 하나의 컬럼만을 리턴해야합니다.

라는 출력문을 날리기만 할 뿐입니다.
그도 그럴것이,


요놈을 어떻게 1차원으로 출력하겠느냐는 생각까지만 하면 당연한 결과인데 말이죠.

우선 위의 결과물을 1차원 배열로 묶는 방법을 검색했고,
array_agg()함수가 제가 찾는 놈이었습니다.




짠! 1차원배열로 결과물들이 나왔습니다.

이제 남은 작업들은,a 와 b 컬럼을 출력하되, b가 null 이 아닌 컬럼에다가 위의 결과를 띄우는것 입니다.


 이제 슬슬 결과물에 근접하고 있습니다.
하지만, b컬럼이 null인가 아닌가를 따지려면 추가적으로 함수가 필요해 보였습니다.

if문을 생각했지만, postgresql에는 if문이 없는 대신
case 문이 존재했습니다.

case when <조건문> then <true일때> else <false일때> end
다행히도 구조는 똑같네요.

이제 b가 널인가 아닌가에 따라 다르게 출력을 해 봅니다.


좀 더 답에 근접했습니다!

마지막으로 다시 질문자가 원한게 뭔지.Araboza


b의 값에 해당하는 컬럼들만 모아서 배열타입으로 출력하는군요!

그럼 array_agg를 출력할때 b가 원하는 값들만 출력되게 바꾸면 되네요!.


제일 부모쿼리의 test 를 testM으로 별명을 지어주어, 부모쿼러의 b값을
서브 쿼리에서 접근이 가등하게 되었으며,
35번 라인에서, 서브쿼리의b 가 보무쿼리b의 값과 동일한것 으로 조건문을 달았습니다.
이로써 array_agg()로 나오는 결과는, 부모 컬럼의 b 값과 동일한 결과만을 가져오게 되죠.


하다보니 오기가 생겨서 붙잡았는데, 의외로 상당한 공부가 되었습니다. 다음 db서버 개발에는 써봐야겠어요.