왼쪽 마우스로 임의의 영역을 선택하세요
Select an area to capture using left mouse button


동작 방식
  • 브라우저에서 레일즈로 Ajax 요청(Request)
  • 레일즈 콘트롤러에서 액티브 잡(Job)으로 큐잉
  • 레일즈 액티브 잡에서 OpenCV 스크립트 실행
  • OpenCV의 결과를 Redis를 통해 Node.js로 전달
  • Node.js에서 웹소켓을 통해 브라우저로 결과 전송
  • 브라우저 렌더링
OpenCV
모듈 위치 lib/opencv_workers/video_cropping/cropVideo.cpp 빌드 vi lib/opencv_workers/video_cropping/CMakeLists.txt

CMAKE_MINIMUM_REQUIRED (VERSION 2.8)
PROJECT ( cropVideo )
INCLUDE_DIRECTORIES (. /usr/local/include/hiredis)
FIND_PACKAGE ( OpenCV REQUIRED )
ADD_EXECUTABLE ( cropVideo cropVideo.cpp)
TARGET_LINK_LIBRARIES ( cropVideo ${OpenCV_LIBS} hiredis)
SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-overloaded-virtual -Wno-sometimes-uninitialized -Wno-unused-variable -std=c++11")
SET (EXECUTABLE_OUTPUT_PATH "../bin")
cmake -D OpenCV_DIR="$HOME/opencv-2.4.10/build" -D OpenCV_FOUND="true" .
make 실행 파일 lib/opencv_workers/bin/cropVideo
C++ json 라이브러리
  • https://github.com/nlohmann/json에서 json.hpp 파일을 다운로드 후 cropVideo.cpp에서 #include 할 것
  • CMakeLists.txt 에서 -std=c++11 스위치 지정
C++ redis 라이브러리 brew install hiredis
Node.js
디렉토리와 파일 lib/nodejs_app/node.coffee npm 패키지 설치 npm init
npm install express --save
npm install hiredis redis --save
npm install socket.io --save
npm install opencv --save
npm install lodash --save
npm install coffee-script -g
npm install pm2 -g 로컬에서 node.coffee 실행 pm2 start node.coffee 또는 pm2-dev run node.coffee
pm2-dev를 사용하면 node.coffee 파일 변경시 자동으로 재시작한다.
Rails
vi Gemfile

gem 'socket.io-rails'
gem 'redis'
vi Manifest
//= require socket.io
[임시] 서버에 hiredis 설치
git clone git://github.com/redis/hiredis.git
cd hiredis; make; sudo make install
sudo ldconfig
주. 카피스트라노 Redis 레시피와 통합 예정
배포(Deployment)
vi Gemfile
gem 'capistrano-npm'
vi Capfile
require 'capistrano/npm'
vi config/deploy/production.rb

set :npm_target_path, -> { current_path.join('lib/nodejs_app') } # default not set
set :npm_flags, '--production --silent --no-spin' # default
set :npm_roles, :all                              # default
set :npm_env_variables, {}                        # default
vi config/deploy.rb

set :linked_dirs, fetch(:linked_dirs, []).push('lib/nodejs_app/node_modules')
set :linked_dirs, fetch(:linked_dirs, []).push('lib/opencv_workers/bin')
vi .gitignore

# node.js
/lib/nodejs_app/node_modules/

# opencv_workers
**/CMakeFiles
cmake_install.cmake
CMakeCache.txt
/lib/opencv_workers/bin/
vi lib/capistrano/tasks/pm2.rake

require 'json'

namespace :pm2 do
  desc "Install PM2."
  task :install do
    on roles fetch(:npm_roles) do
      sudo "npm install pm2 -g"
      sudo "npm install coffee-script -g"
    end
  end

  desc 'Restart app gracefully'
  task :restart do
    on primary :app do
      case app_status
      when nil
        info 'App is not registerd'
        start_app
      when 'stopped'
        info 'App is stopped'
        restart_app
      when 'errored'
        info 'App has errored'
        restart_app
      when 'online'
        info 'App is online'
        restart_app
      end
    end
  end

  def app_status
    within current_path do
      ps = JSON.parse(capture :pm2, :jlist, fetch(:app_command))
      if ps.empty?
        return nil
      else
        # status: online, errored, stopped
        return ps[0]["pm2_env"]["status"]
      end
    end
  end

  def restart_app
    within fetch(:npm_target_path, release_path) do
      with fetch(:npm_env_variables, {}) do
        execute :pm2, :restart, 'node'
      end
    end
  end

  def start_app
    within fetch(:npm_target_path, release_path) do
      with fetch(:npm_env_variables, {}) do
        execute :pm2, :start, 'node.coffee'
      end
    end
  end
end

after "deploy:publishing", "pm2:restart"
배포 관련 태스크
bin/bundle exec cap production pm2:install
서버에 pm2와 coffee-script 패키지 설치
이 태스크는 deploy:install에 after hook에 연동해도 됨
bin/bundle exec cap production npm:install
서버의 current/lib/nodejs_all/ 으로 이동해서 npm 패키지를 설치
deploy:updated의 before hook에 연동되어 있음
bin/bundle exec cap production pm2:restart
서버의 current/lib/nodejs_all/node.coffee를 (재)시작
deploy:publising의 after hook에 연동되어 있음
[임시] OpenCV C++ 모듈 빌드
배포 작업 후 서버의 lib/opencv_workers/video_cropping/으로 이동 후 다음을 실행
cmake -D OpenCV_DIR="$HOME/opencv-2.4.10/build" -D OpenCV_FOUND="true" .
make
주. 별도의 카피스트라노 레시피 작성 예정