2017년 2월 27일 월요일

웹 프로그래밍 개발환경 구축 ( JDK, 아파치 톰캣, 이클립스, MySQL ) for Windows


1. 파일 다운로드

 설치할 컴퓨터의 사양에 따라 다운로드합니다.

 JDK : http://www.oracle.com/technetwork/java/index.html
     JAVA SE (Standard edition) 최신버전 설치
 Eclipse ( 개발 도구 IDE ) : http://www.eclipse.org
      Eclipse IDE for java EE Developers 다운로드

 Apache Tomcat 9.0 : http://tomcat.apache.org/
      
 MySQL : https://dev.mysql.com/downloads/
     MySQL connector/J (zip 파일),
     MySQL Server (msi 파일) 다운로드


2. JDK 설치 및 환경변수 등록

 JDK 설치 후 C:\programfiles\JAVA 폴더에서 jdk 와 jre 가 설치됨을 확인하고 jdk 폴더안의 bin 폴더까지의 경로를 환경변수로 등록
 ( 제어판 - 시스템 - 고급 시스템 설정 - 환경변수 - 시스템변수 - Path 에  ...\jdk\bin 경로 추가, 세미콜론(;) 으로 구분 )


3. Tomcat 설치
   설치 경로를 C:\ 로 하면 추후에 eclipse 와 연동하기 편함


4. eclipse 와 Tomcat 연동
   작업표시줄 오른쪽에서 Tomcat 서비스 실행 중이면 stop 버튼으로 중지
   eclipse 실행 후 server 패널이 있는지 확인
   (없으면 상단의 탭 Window - Show View - server  ( 없으면 other 에서 찾기))
   server 패널에 Tomcat 이 없으면 상단 탭 Window - Preferences
   Preference 에서 Server - Runtime Environment 에서 Add 로 Tomcat 9.0 추가
   Tomcat 설치 경로 및 jdk 설치하면서 생성된 jre 버전 선택 -> 없으면 추가하여 jre 경로 지정
   eclipse server 패널에 tomcat 생성된 것 확인


5. tomcat 연동 결과 확인
    File - New - Dynamic Web Project 생성 ( 없으면 other 선택, web 폴더에 있음 )
    생성된 프로젝트에 우클릭 - new - JSP file
    생성된 JSP 파일의 <body> 태그 사이에 12345 작성 후 저장
    jsp 파일에 우클릭 - run as - run on server 해서 웹페이지에 12345 확인


6. MySQL 설치
     port number(3306) , root password(자유)

     user(자유) , host(localhost),role(DB admin), password(자유)
       - user 와 password 는 기억해두어야 후에 연동 테스트에 db 연결이 가능함

     설치 과정 중에 user 와 password 로 연결 테스트가 있음

     환경변수에 MySQL Server 의 bin폴더 경로 추가
     (C:\Program Files\MySQL\MySQL Server 5.7\bin)


7. MySQL Server 테스트  ( 생략 가능 )
    시작 - MySQL - MySQL5.7 Command Line Client 실행 (설치 때 사용한 비밀번호 필요)
    명령어 입력 ( // 뒤의 내용은 명령어가 아님 ) 
    show databases;   // db 조회

    create database test_db;  //test_db라는 데이터베이스 생성
    grant all on test_db.* to 'user' @'localhost' identified by 'password';
    //localhost로 접속한 'user'라는 사용자에게 test_db에 대한 모든 권한을 줌.  '' 안의 내용은 모두 설치 시 입력한 내용
    connect test_db;     //DB에 연결
    show tables;    // 현재 db의 table 조회
    create table test_table (
          id varchar(8) not null,
          pw varcahr(16) not null,
          primary key (id)
     );
     //test_table이라는 테이블을 생성
     show tables;
     quit;   // 종료


8. MySQL 연동 및 테스트
     MySQL connector/J 압축파일을 풀어서 mysql-connector-java-5.1.40-bin.jar 파일을 Tomcat 폴더의 lib 폴더와 C:\Program Files\Java\jre1.8.0_121\lib\ext 로 각각 복사한다.

     이클립스에서 jsp 문서를 생성 후 *** 사이의 코드를 복사함 ( 코드 수정 필요 )
***********************************************
<%@ page contentType="text/html; charset=euc-kr" language="java" %>
<%@ page import="java.sql.*" %>

<%
 Connection con = null;
 PreparedStatement pstmt = null;
 ResultSet rs = null;

 try {
  String DB_SERVER = "localhost:3306";  // MySQL 설치시 등록한 포트로 수정필요
  String DB_USERNAME = "user";          // MySQL 설치시 등록한 user 로 수정필요
  String DB_PASSWORD = "password";   // MySQL 설치시 등록한 user 로 수정필요
  String DB_DATABASE = "test_db";       // db 테스트 때 생성한 db 로 수정 필요
  String DB_TABLE = "test_table";          // db 테스트 때 생성한 table 로 수정필요

  String jdbcUrl = "jdbc:mysql://" + DB_SERVER + "/" + DB_DATABASE;

  Class.forName("com.mysql.jdbc.Driver");
  con = DriverManager.getConnection(jdbcUrl, DB_USERNAME, DB_PASSWORD);
  %>

 <h1>Database 연결 테스트</h1>
  Database 연결 성공<br>
  <%
  
  String query = "select * from "+DB_TABLE;
  pstmt=con.prepareStatement(query);
  rs=pstmt.executeQuery();

  int count=0;
  while(rs.next()) {
   
   String number=rs.getString("id");
   String name = rs.getString("pw");
   %>
   <p>[<%=count%>] number : <%=number%>, name : <%=name%></p>
   <%
   count++;
  }
  
 } catch(Exception e) {
  e.printStackTrace();
  out.println("Fail");
 }
%>
**************************************************************************

jsp 실행
Database 연결 성공 이라는 문구가 보이면 JDK, Tomcat, Eclipse, MySQL 연동 성공

텐서플로우 설치 (TensorFlow for windows)

1. 파일 다운로드

  - Anaconda 4.3.0 for windows : https://www.continuum.io/downloads

  - CUDA 8.0.44 : https://developer.nvidia.com/cuda-downloads
      local 버전 권장 ( network 버전은 비교적 오래걸림 )

  - NVIDIA cuDNN : https://developer.nvidia.com/cudnn
      deep learning 용 추가 라이브러리 ( CUDA8.0 은 cuDNN 5.1 설치 )
      회원가입 필요

  - Python 3.5 : https://www.python.org/downloads/release/python-350/
      윈도우에서 tensorFlow 를 시작하려면 3.5 버전이상 필요


2. Anaconda 4.3.0 , CUDA 8.0, Python3.5 설치
    python 설치 시 path 등록에 체크하면 환경변수 등록하는 작업을 생략할 수 있다.


3. cuDNN 압축 해제 후 CUDA 8.0 의 경로에 붙여넣기
    CUDA 경로 : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0


4. TensorFlow-GPU 설치
 
  1) cmd 관리자 실행하여 다음 명령어를 입력한다.
   pip install tensorflow-gpu

  2) 이전의 명령어에서 pip 버전이 낮아서 불가하다는 문구가 나오면 다음명령어로 pip를 업그레이드 한 후에 다시 1) 을 수행한다.
   python -m pip install --upgrade pip

  3) tensorflow 가 성공적으로 설치가 완료되면 다음의 명령어를 수행한다.
   pip install --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-0.12.0rc0-cp35-cp35m-win_amd64.whl


5. 설치 확인

   Anaconda prompt를 관리자 권한으로 실행하고 Python 에서 다음의 code 를 입력한다.

   import tensorflow as tf
   hello = tf.constant('Hello, TensorFlow')
   sess = tf.Session()
   print(sess.run(hello))

   결과 : Hello, TensorFlow


텐서플로우 설치에 참고할만한 사이트
1. 텐서플로우 문서 한글 번역본
https://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/get_started/os_setup.html
2. 블로그
http://comajava.blogspot.kr/2017/01/windows-tensorflow-python-35-anaconda.html

2017년 1월 8일 일요일

NavMesh (Navigation Mesh) 네비게이션 메쉬

네비게이션 메쉬 + A* (Navigation Mesh + AStar)

원문 링크 : http://yoysh.egloos.com/25000 
네비게이션 메쉬 + A* (Navigation Mesh + AStar)
: 3차원 지형을 2D처럼 간단하게 표현 하는 방식으로 Object가 이동 가능한 모든 지형을 Cell(삼각형)으로 표시 하여 A*와 같은 길찾기 알고리즘을 쉽게 적용 할 수 있게 해줍니다.

[Navigation Mesh]
1. NaviCell 만들기
Cell 이란? vetex 세 개로 구성되어 이루어진 하나의 삼각형입니다.
- 삼각형의 사이드 라인 세 개를 만듭니다.
- 평면 방정식을 위한 Plane을 생성합니다.
- Cell의 중점을 계산합니다.
- Cell의 세 사이드 라인의 중점을 계산합니다.(mid[0], mid[1], mid[2])
- Cell의 중점에서 사이드 라인의 중점까지의 거리를 계산해둡니다.
(ArrivalCost)

2. NaviMesh 만들기
Navigation Mesh 란? 지형의 모든 이동 가능한 삼각형의 집합
앞에서 만든 NaviCell의 바로 이웃한 셀들을 연결시켜줍니다.
Link[0], Link[1], Link[2]가 이웃한 NaviCell을 가리키며,
만약 이웃한 Cell이 없다면 NULL

[A*]
3. Actor 만들기
NaviMesh로 부터 자신의 좌표와 자신이 위치한 Cell을 미리 계산해둡니다.
여기서 Actor는 x, z만 알면 평면방정식으로 부터 y값을 구합니다.
(앞으로 x,z는 평면의 좌표이며 y는 높이 값입니다.)

4. Heap 만들기
heap은 End좌표로 부터 거꾸로 start까지의 셀 노드들의 리스트입니다.
end cell은 시작점, start cell이 목표점으로 생각합니다.
EndCell로 부터 인접한 셀들을 구합니다. 이 인접 셀들중 비용이 가장 싼 것을 계산 합니다. 계산식은 Heuristic + ArrivalCost 입니다.
여기서 Heristic은
deltax = (목표점.x - 현제셀중점.x)
deltay = (목표점.y - 현제셀중점.y)
deltaz = (목표점.z - 현제셀중점.z)
max(max(deltax, deltay), deltaz) 값입니다.
이웃 셀중 비용이 싼 셀이 현재 셀로 되며 같은 방식으로 다시 이웃 셀을 비교합니다.
이를 반복 하면 start 셀까지 셀이 이동됩니다.

5. Path 만들기
앞에서 만든 heap으로 부터 start로 부터 end까지의 mid좌표와 cell을 연속적으로 저장해둡니다.

6. 추가 작업
삼각형의 중점으로 Cell들을 이동해 다니게 되면 술취한(갈지자) Actor처럼 보이므로, 앞에서 구해진 Path로 부터 line테스트를 하여 직선 경로를 구해 이를 이동 경로로 사용합니다.
추가사항
네비게이션 메쉬와 A*는 같은 내용의 알고리즘이 아닙니다.
A*는, 경로가 표현되는 공간의 구체적인 표현방식과는 관계없는 알고리즘입니다.
어떠한 형태의 공간이 주어지든(2D격자, 3D격자, 불규칙 메쉬, 6각형2D격자 등등 ..)
이웃(neighbor)에 대한 표현만 주어지면 그 공간에서 실시간으로 최적화된 길찾기를 할 수 있는 알고리즘이 A*입니다.
네비게이션 메쉬는 '불규칙한 메쉬'로 이루어진 3D월드에서 보다 부드러운 주행을 위해서
길찾기에 이용될 월드 표현방법을 단순화시켜 보자는 알고리즘입니다. 말하자면 길을 찾는
것이 최종적인 목적이 아니라, 복잡한 3D공간을 단순화시켜서 생각하기에 편하도록 만들어보자는 겁니다.
네비게이션 메쉬에서 실제로 길을 찾는 알고리즘은 뭐든 상관없습니다.

-----------------------------------------------------------------------

Hun's review

 네비게이션 메쉬 오픈소스
c++ : https://github.com/memononen/recastnavigation
c# : https://github.com/Robmaister/SharpNa

Navigation Mesh 는 맵 또는 씬마다 각각 계산되어야 합니다.