node.js로 백엔드를 구축하려 하는데 개발환경을 어떤식으로 구축하려 생각하다.. 개발한 내용을 저장하면 재시작 해주는게 없나... 구글링 했더니. 역쉬.. 있다.. 간단히 찾은 것이 supervisor 라는 모듈과 nodemon 이놈들 중 어떤 것이 더 버그없고 활용도가 좋은지는 모르겠으나.. 그냥 둘 다 써보자라는 생각으로.. 노트 해 둔다.. 사용법은 아래와 같다.
|
||
아.. 그리고 배포 후 운영시.. 어떤 에러로 프로세서가 종료 될때. forever라는 모듈을 이용하면, 다시 재시작 시켜준다. forever는 npm에서 전역으로 설치해놓고 사용하면 좋을것 같다
|
'분류 전체보기'에 해당되는 글 15건
- 2015.01.28 파일변경시 node 자동으로 재시작 모듈
- 2014.11.21 라즈베리파이 에 node.js 설치
- 2014.11.21 Upstart와 Monit으로 node.js Application 서비스 하기
- 2014.11.11 d-link dir-868l에서 dd-wrt 에서 iptv 설정
- 2014.11.06 OS X의 터미널에서 디렉토리 및 파일에 색상 변경하기
- 2014.11.01 타임머신 복구하기.
- 2014.10.23 엘리먼트가 화면에 나타나면 에니메이션 사용하기
- 2014.02.06 C#에서 C++ DLL 사용하기
- 2013.12.07 Phonegap 3.0 에서 플러그인을 추가
- 2013.11.18 [ubuntu] 우분투 12.04 아파치 사용자별 디렉토리 설정
1. RASPBIAN Package 정보 업데이트
그림 <sudo apt-get upgrade>
그림 <sudo apt-get update>
2. 라즈베리파이용 NodeJS 설치
Package 정보를 업데이트 했다면 node-arm 프로젝트 홈페이지 (http://node-arm.herokuapp.com)로부터 NodeJS deb 패키지를 받아 설치한다. 현재 (2014-8-27) NodeJS 최신 공식 버전인 v0.10.31, 30, 29를 제공하므로 필요에 따라 선택한다.
다음 명령어를 이용하면 최신 버젼의 NodeJS 설치 파일을 받을 수 있다.
$ sudo wget http://node-arm.herokuapp.com/node_latest_armhf.deb |
그리고 dpkg를 이용하여 nodejs를 설치한다.
$ sudo dpkg -i node_lasted_armhf.deb |
참고로 NodeJS 홈페이지에서도 라즈베리 파이용 패키지를 제공하고 있으나 v0.10.29 부터 v0.10.31까지는 배포되지 않고 있다.
v0.10.28 을 다음 명령어로 다운로드한다.
$ sudo wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-arm-pi.tar.gz |
그리고 파일의 압축을 해제한다.
$ tar -xzvf node-v0.10.28-linux-arm-pi.tar.gz |
다운로드 받은 node를 실행해 보면 현재 버젼을 확인해 볼 수 있다.
$ node-v0.10.28-linux-arm-pi/bin/node -v |
데비안 패키지와 달리 실행 파일만 설치된 것이므로 환경 설정을 해 주어야 한다.
home 디렉토리 (/home/pi) 의 .bash_profile에 다음과 같이 NODE_JS_HOME을 설정한다.
NODE_JS_HOME=/home/pi/node-v0.10.28-linux-arm-pi PATH=$PATH:$NODE_JS_HOME/bin |
'dev - web > javascript' 카테고리의 다른 글
Upstart와 Monit으로 node.js Application 서비스 하기 (0) | 2014.11.21 |
---|---|
엘리먼트가 화면에 나타나면 에니메이션 사용하기 (0) | 2014.10.23 |
node.js는 그 바탕이 Javascript이기 때문에 그나마 괜찮다고 하더라도 이런 부분에서 예외는 아니라고 생각합니다. 얼마전에 Socket.IO로 간단한 예제를 만들고 호스팅받고 있는 서버에 올려야겠다고 생각하고 로컬에서 수없이 돌려봤기 때문에 금방 서버에 적용할꺼라고 생각했지만 다 개발된 것을 서버에 서비스로 적용하는 것만도 많은 시간을 소비하게 되었습니다. 이 내용은 Kevin van Zonneveld가 작성한 Run Node.js as a Service on Ubuntu Karmic라는 글과 이 포스트를 보고 Tim Smart가 How To Node에 Deploying Node.js With Upstart and Monit를 보고 우분투 서버에 적용하면서 정리한 내용입니다.
처음에 node.js로 만든 것을 서버에 올려야겠다고 생각했을 때는 로컬에서 개발할 때처럼 node myapp.js로 실행하면 SSH등으로 터미널 원격접속한 상태에서는 터미널을 종료하는 순간 프로세스도 같이 죽어버리기 때문에 node myapp.js & 으로 백그라운드로 실행하였습니다. 이것은 잘 돌아가는 것처럼 보였지만 별로 적절한 방법은 아니었고 실제로 제가 올렸던 것은 딱 한번만 접속하면 무조건 프로세스가 죽어버리는 문제가 있었습니다.
제가 실제 서비스에 적용을 해보면서 느낀 문제점은 아래와 같습니다.
- node.js개발을 하면 console.log()나 sys.puts()으로 콘솔에 로그 메시지를 출력하는데 SSH등으로 서버에 원격접속하였을때 node.js app를 실행하더라도 터미널을 종료하면 STDOUT이 없기 때문에 콘솔에 로그메시지를 출력하는 부분이 있으면 프로세스가 죽어버립니다.
- 이러한 로깅은 소스에서 지워버려도 되겠지만 기본적으로 로그를 남기기 위해서 작성하는 것이므로 이런한 로그를 나중에 참조할 수 있도록 파일로 출력할 필요가 있었습니다.
- 위 문제가 아니더라도 예상치 못한 문제로 프로세스가 죽어버렸을 때 다시 복구해 주어야 합니다.(저같은 경우 개인서비스이므로 약간의 장애는 큰 문제 안되긴 하지만 그렇다고 마냥 죽어있을수는 없는 노릇이니까요.)
위 문제들을 해결하기 위해서는 node로 돌린 프로세스가 진짜 데몬( Demon)처럼 동작하게 해야 하고 이벤트기반의 init데몬을 위한 툴인 upstart와 프로세스와 파일등을 모니터링하고 관리하는 Monit으로 해결합니다.
Upstart
node앱을 Demon처럼 실행하기 위해서 Kevin은 Upstart를 제시했습니다. Upstart는 /etc/init.d 스크립트를 대체하고 속도, 간결함 등의 추가적인 특징을 가지고 있습니다. 최신 우분투 배포판에는 Upstart가 포함되어 있으며 설치되어 있지 않다면 sudo apt-get install upstart 로 설치할 수 있습니다.
upstart 스크립트는 아래와 같이 작성합니다.
1 2 3 4 5 6 7 8 9 10 | description "socket.io-slide server" author "Outsider" start on startup stop on shutdown script chdir /path/to/socketio-slide/socket.io exec sudo -u USERNAME sh -c "/usr/local/bin/node socketio-slide.js >> /var/log/node/socketio-slide.log 2>&1" end script |
9번 라인의 USERNAME부분은 명령어를 실행할 유저명을 적어주면 됩니다. 일반적으론 PATHS에 node.js가 잡혀있어서 그냥 node 명령어를 사용할 수 있지만 스크립트 내에서는 위처럼 절대경로를 사용해야했습니다. 이 파일을 /etc/init/myapp.conf로 저장을 하고 chomd u+x를 주어 실행가능하게 되도록 합니다. 이렇게 하면 node 앱을 데몬처럼 실행할 수 있고 node 앱의 시작과 중지를 위한 간단한 명령어를 통해서 사용할 수 있게 됩니다.
stop myapp
을 이용해서 node 앱을 실행하고 중지할 수 있으며 부팅시에 앱을 실행하고 로그는 /var/log/node/socketio-slide.log 파일에 남게 됩니다.
Monit
아직 문제점이 남아 있는데 Upstart를 이용해서 Demon으로 실행했다고 하더라도 node 앱은 죽어버릴 가능성이 있기 때문에 이에 대한 대처가 필요한데 일정한 인터벌을 두고 테스트를 수행하고 그 결과에 따라 액션을 취하는 모니터링 툴인 Monit으로 이 문제를 해결할 수 있습니다. 우분투에서는 sudo apt-get install monit 를 통해서 설치할 수 있습니다.
1 2 3 4 5 6 7 8 9 | set logfile /var/log/monit.log check host socketio-slide with address 127.0 . 0.1 start program = "/sbin/start myapp" stop program = "/sbin/stop myapp" if failed port 8001 protocol HTTP request / with timeout 10 seconds then restart |
위 파일이 Monit의 설정파일이고 이것을 /etc/monit/monitrc의 하단에 추가하면 됩니다.
1번 라인은 Monit의 로그파일을 지정한 부분이며 3번라인이 노드 인스턴스의 이름(로그에 이 이름이 사용됩니다.)과 위치를 지정해 주고 테스트 요청을 날릴 ip지정합니다.(여기서는 같은 서버에서 사용되므로 127.0.0.1을 사용합니다.) 4,5번 라인에서 node앱을 어떻게 시작하고 중지하는지 적어주는데 위에서 만든 upstart로 만든 명령어를 사용하며 이때는 절대주소로 적어주어야 합니다. 6번라인이 핵심적인 부분인 테스트부분인데 HTTP 8001포트로 루트(/)에 요청을 보내서 10초동안 결과가 오지 않는다면 node 앱을 재시작하도록 지정하였습니다.
이제 아래 명령어를 통해서 node앱을 실행하고 모니터링을 위해서 monit을 시작하면 됩니다.
sudo monit -d 60 -c /etc/monit/monitrc
-d 60 플래그는 monit이 60초마다 테스트를 수행하도록 하는 것이고 이렇게 실행해 놓으면 노드앱이 죽어도 자동으로 60초 이내에 재시작되게 됩니다.
여기서 myapp이 죽게 되면 재시작이 되며 monit의 로그에는 아래와 같이 로깅이 됩니다.
[KST Oct 29 22:59:40] info : 'socketio-slide' trying to restart
[KST Oct 29 22:59:40] info : 'socketio-slide' stop: /sbin/stop
[KST Oct 29 22:59:40] info : 'socketio-slide' start: /sbin/start
[KST Oct 29 23:00:40] info : 'socketio-slide' connection succeeded to INET[127.0.0.1:8001] via TCP
'dev - web > javascript' 카테고리의 다른 글
라즈베리파이 에 node.js 설치 (0) | 2014.11.21 |
---|---|
엘리먼트가 화면에 나타나면 에니메이션 사용하기 (0) | 2014.10.23 |
dd-wrt는 설치를 하셨다는 전제하에 팁을 올립니다.
저는 kong빌드 최신 버전을 사용하였습니다.
먼저 vlan설정을 합니다.
1) '설정메뉴->VLANs'로 들어갑니다.
2) 'vlan1'에 'port1,2,3'을 체크하고 브릿지 할당을 'LAN'으로 합니다.
3) 'vlan2'에 'port4'를 체크하고 브릿지 할당을 'LAN'으로 합니다.
4) 'vlan3'에 'wan'을 체크하고 브릿지 할당을 '없음'으로 합니다.
5) '설정 적용'을 합니다.
이제 네트워킹 설정입니다.
1) '설정메뉴->네트워킹'으로 들어갑니다.
2) 'Bridging' 섹션에서 'Bridging 작성' 그룹의 'IGMP snooping'을 'On'합니다.
3) 'Bridging' 섹션에서 'Bridging 할당' 그룹에서 'Assignment0 br0 Bridge 인터페이스 vlan2 Prio 63'이 되도록 설정합니다.
4) 그러면 'Bridging' 섹션의 '현재 Bridging Table' 그룹에 'br0 no vlan1 vlan2 eth0 eth1'로 설정됩니다.
5) 'Port 설정' 섹션에서 'WAN(인터넷측) Port 설정'을 'vlan3'으로 바꾸어 줍니다.
6) '설정 적용'을 합니다.
보안 설정을 바꿉니다.
1) '보안설정->방화벽(Firewall)'설정으로 이동합니다.
2) '보안 설정' 섹션의 '인터넷접속(WAN)측의 패킷을 끊습니다' 그룹에서 '멀티케스팅(다중 작업)을 필터링합니다'항목을 체크 해제합니다.
3) '설정 적용'을 합니다.
여기까지하면 iptv는 나옵니다만 multicast packet들이 다른 port들에 영향을 주기 때문에 firewall script를 수동으로 적용해야 합니다.
1) '관리자메뉴->Commands'설정으로 이동합니다.
2) '실행 명령(Command)'창에 다음 내용을 입력합니다.
insmod ebtables insmod ebtable_filter insmod ebt_pkttype ebtables -A FORWARD -o "vlan1" --pkttype-type multicast -j DROP ebtables -A OUTPUT -o "vlan1" --pkttype-type multicast -j DROP ebtables -A FORWARD -o "eth1" --pkttype-type multicast -j DROP ebtables -A FORWARD -o "eth2" --pkttype-type multicast -j DROP ebtables -A OUTPUT -o "eth1" --pkttype-type multicast -j DROP ebtables -A OUTPUT -o "eth2" --pkttype-type multicast -j DROP
3) '기동시 스크립트로 저장합니다' 버튼을 눌러 매번 부팅시 실행되도록 합니다.
이제 공유기를 재부팅해주면 됩니다.
1) '관리자메뉴->관리메뉴' 설정으로 이동합니다.
2) 맨 아래에 '공유기 리부팅'을 눌러줍니다.
저는 LG유쁠 IPTV를 사용하는데 아직까지 잘 아옵니다. 인터넷도 잘 되고 있습니다.
참고로 무선렌의 tx power가 18dbm으로 설정되어 있습니다.
20dbm으로 출력을 올리시면 좀더 쾌적합니다.
1) '무선설정->WL0-Advanced'설정으로 이동합니다.
2) '고급 무선 설정' 섹션의 '송신 출력'을 '100'으로 고쳐줍니다.
3) '설정 적용'을 합니다.
4) '무선설정->WL1-Advanced'설정으로 이동합니다.
5) '고급 무선 설정' 섹션의 '송신 출력'을 '100'으로 고쳐줍니다.
6) '설정 적용'을 합니다.
'os > linux' 카테고리의 다른 글
[ubuntu] 우분투 12.04 아파치 사용자별 디렉토리 설정 (0) | 2013.11.18 |
---|---|
[ubuntu] phpmyadmin 설치 (0) | 2013.11.18 |
[ubuntu] gmail 계정을 활용한 ssmtp설정 (0) | 2013.11.18 |
OS X에서 터미널을 사용하다보면 자연히 파일목록이나 디렉토리 목록을 조회하는 ls 명령어를 사용하게 된다.

나는 주로 터미널을 어두운 배경으로 사용하는데 OS X에서 폴더의 기본색인 파란색 볼드체는 어두운 테마에서는 가독성이 좋지 않기 때문에 모니터가 안좋거나 안좋은 모니터에서는 특히 보기가 어렵다. 귀차니즘에 맨날 그냥 쓰다가 색상을 변경하는 법을 검색하다가 Add Color to the Terminal in Mac OS X라는 글을 찾았다. .bash_profile같은 파일에 다음과 같은 환경변수를 설정하면 자유롭게 색상을 변경할 수 있다.(이코드는 bash를 사용할 때의 경우이다.)
1 2 | export CLICOLOR=1 export LSCOLORS=DxFxCxGxBxegedabagaced |
CLICOLOR는 칼라표시 여부를 활성화하는 걸로 보이는데 OS X에서는 기본으로 1인듯 하다. LSCOLORS는 CLICOLOR로 색상이 활성화 되었을 때 각 종류별 어떤 색으로 표시할 지를 지정하고 fb의 쌍으로 두글자씩 이뤄지는데 앞의 글자인 전경색(foreground)와 배경색(background)를 의미한다. 각 알파벳이 의미하는 색상은 다음과 같다. 그래서 Dx와 같이 쓰면 전경색을 두꺼운 갈색이고 배경색은 기본값을 사용한다는 의미이다.
- a : 검은색
- b : 빨강색
- c : 녹색
- d : 갈색
- e : 파란색
- f : 마젠타색(magenta)
- g : 시안(cyan)
- h : 밝은 회색
- A : 두꺼운 검은색(보통 어두운 회색으로 보인다.)
- B : 두꺼운 빨간색
- C : 두꺼운 녹색
- D : 두꺼운 갈색(보통 노란색으로 보인다)
- E : 두꺼운 파란색
- F : 두꺼운 마젠타색
- G : 두꺼운 시안
- H : 두꺼운 밝은 회색(밝은 흰색처럼 보인다)
- x : 전경생과 배경색의 기본색상
이 fb의 쌍을 여러개 이어서 쓰게 되는데 순서대로 다음의 값을 의미한다. 즉 처음 두글자는 디렉토리생상이고 두번째는 심폴릭 링크의 색상을 지정하게 된다.
- 디렉토리
- 심볼릭 링크
- 소켓
- 파이프
- 실행가능 파일
- 특수 블락
- 특수문자
- setuid 비트가 설정된 실행파일
- setgid 비트가 설정된 실행파일
- sticky비트가 있으면서 다름사람이 쓸 수 있는 디렉토리
- sticky비트가 없으면서 다름사람이 쓸 수 있는 디렉토리
디렉토리가 좀 눈에 띄도록 노란색(Dx)로 바꾸어서 이제 다음과 같이 가독성 좋게 잘 나온다.

'os > mac' 카테고리의 다른 글
타임머신 복구하기. (0) | 2014.11.01 |
---|---|
맥에서 아파치 설정하기 (0) | 2013.10.18 |
타임머신에서 sparsebundle 파일을 불러와서 복원하는 방법
0. 맥 전원을 켜는 동시에 Option + Command + R 을 동시에 누르고 있으면 인터넷복구모드로 들어간다.
1. 백업파일이름을 간단하게 변경 (한글, 공백제거)
2. 옵션키 > 복구모드 > 터미널실행
3. 아래 명령을 순서대로 실행
#> cd /Volumes
#> mkdir TimeMachine
#> mount -t afp afp://[your user log-in]:[password]@[192.168.xx.xx, etc., whatever the network NAS IP is]/[your Volume or Share Name]/Volumes/TimeMachine
#> hdid /Volumes/TimeMachine/[your back-up name].sparsebundle
4. 터미널을 종료하고 타임머신메뉴로 가면 복원지점을 확인할 수 있다.
# 참고
http://ialsowent.com/2012/08/13/recovering-from-time-machine-on-nas/
http://inthegrasp.wordpress.com/ 에서 퍼왔습니다...
'os > mac' 카테고리의 다른 글
OS X의 터미널에서 디렉토리 및 파일에 색상 변경하기 (0) | 2014.11.06 |
---|---|
맥에서 아파치 설정하기 (0) | 2013.10.18 |
아래같은 코드는 항상 사용하는 것이 아니라..생각이 별로 하기 싫어서 이렇게 만들어 놓고 필요할때 가져다 쓰려고 만들어 놓는다.
오브젝트가 윈도우 안에 들어 왔는지를 알아내는 코드이다.
마우스를 스크롤 할때,
현재 윈도우의 크기 ( $(window).height() )
이미 스크롤 했던 스크롤의 크기 ( $(window).scrollTop() ) 를 더해서
찾고자 하는 오브젝트의 바닥면의 위치 ( $("#item").position().top ) + ($("#item).outerHeight())
가 안에 들어 오면 발견 했다라고 치는 코드 이다..
에니메이션은 animate.css를 사용 했고 여기 서 가져왔다
<div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div id="item"> $(this).position().top : <span id="obj1_top"></span> <br> $(this).outerHeight() : <span id="obj1_height"></span> <br> object : <span id="obj1"></span> <br> $(window).scrollTop() : <span id="obj2_top"></span> <br> $(window).height() : <span id="obj2_height"></span> <br> win : <span id="win1"></span> <br>
</div> <script src="//code.jquery.com/jquery-1.11.0.min.js"></script> <script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script> <script> $(function(){ $(window).scroll(function(){ $('#item').each(function(i){ var bottom_of_object = $(this).position().top + $(this).outerHeight(); //outerHeight() : border를 포함한 높이 var bottom_of_window = $(window).scrollTop() + $(window).height(); //scrollTop : 스크롤되어 올라가있는 만큼의 높이 , $(window).height() : 브라우저 창높이 $('#obj1_top').text($(this).position().top); $('#obj1_height').text($(this).outerHeight()); $('#obj1').text(bottom_of_object); $('#obj2_top').text($(window).scrollTop()); $('#obj2_height').text($(window).height()); $('#win1').text(bottom_of_window); //오브젝트가 윈도우에 완전히 보이면 if( bottom_of_window > bottom_of_object){ $('#item').addClass('animated rubberBand'); } }); }); }); </script> |
'dev - web > javascript' 카테고리의 다른 글
라즈베리파이 에 node.js 설치 (0) | 2014.11.21 |
---|---|
Upstart와 Monit으로 node.js Application 서비스 하기 (0) | 2014.11.21 |
C#에서 C++ DLL 사용하기
개요
C#에서 C++ dll을 사용하기 위해서는 pinvoke(platform invoke)를 사용하면 된다. 아래의 내용은 사용법에 대한 간단한 정리이다. 내용 생략하고 Sample 를 받아도 된다.
C++
h
// Ŭnicode please
#pragma once
#include <cstdio>
namespace ns {;
typedef struct tTest {
char strTest[128]; //문자열 128
int intTest; //숫자형
char byteTest[64]; //바이트형 배열
unsigned int uintTest[4]; //유니트형 배열
} typeTest;
}
extern "C" __declspec(dllexport) void OnTest1(void); //기본형
extern "C" __declspec(dllexport) int intOnTest2(int intTemp); //입출력 숫자형
extern "C" __declspec(dllexport) int* strOnTest3(); //입출력 문자열형
extern "C" __declspec(dllexport) void OnTest4(ns::typeTest *testTemp); //입력 구조체(포인터 출력가능)
extern "C" __declspec(dllexport) void OnTest5(int *intTemp); //입출력 배열(포인터 출력가능)
- 문자열을 반환하는 경우 char포인터를 리턴하는 대신 int*를 리턴하고 C#쪽에서 적절히 캐스팅해서 받아야한다
- C#쪽에서 구조체를 구성하는것은 메모리 구조만 맞추면 되니까 네임스페이스건 뭐건 잇건 없건 큰 문제가 없다
- dll 인터페이스로 만들기 위해서
extern "C" __declspec(dllexport)
를 함수에 넣어준다
cpp
// Ŭnicode please
#include "sample.h"
void OnTest1(void)
{
//기본형
printf("fdsfd\n");
}
int intOnTest2( int intA)
{
//입출력 숫자형
++intA; //입력받은 숫자에 +1
return intA;
}
int* strOnTest3()
{
//입출력 문자열형
//static char strTemp2[128] = {0,}; //임시저장용 문자열
//sprintf_s( strTemp2, "%s strOnTest3 에서 리턴", strTemp); //문자열 합치기
static char strTemp2[256] = "asdfasds\n";
return (int*)strTemp2;
}
void OnTest4( ns::typeTest *testTemp )
{
//입력 구조체형(포인터 출력가능)
testTemp->byteTest[0] = 1;
testTemp->intTest = testTemp->intTest + 2;
sprintf_s( testTemp->strTest, "%s OnTest4에서 포인터", testTemp->strTest);
testTemp->uintTest[0] = 1;
}
void OnTest5(int *intTemp)
{
//입출력 배열형(포인터 출력 가능)
for( int i = 0 ; i < 2 ; ++i )
{
intTemp[i] = intTemp[i] + i;
}
}
C#
구조체
public struct typeTest
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public String strTest;
public int intTest;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] byteTest;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public UInt32[] uintTest;
}
함수
[DllImport("dll_sample.dll")]
extern public static void OnTest1();
[DllImport("dll_sample.dll", CallingConvention = CallingConvention.Cdecl)]
extern public static int intOnTest2(int intTemp);
[DllImport("dll_sample.dll", CharSet = CharSet.Ansi)]
extern public static IntPtr strOnTest3();
[DllImport("dll_sample.dll", CallingConvention = CallingConvention.Cdecl)]
extern public static void OnTest4(ref typeTest testTemp);
[DllImport("dll_sample.dll", CallingConvention = CallingConvention.Cdecl)]
extern public static void OnTest5(int[] intTemp);
private void button1_Click(object sender, RoutedEventArgs e)
{
OnTest1();
}
private void button2_Click(object sender, RoutedEventArgs e)
{
int a = 1;
a = intOnTest2(a);
System.Console.WriteLine(a);
}
private void button3_Click(object sender, RoutedEventArgs e)
{
IntPtr a = strOnTest3();
string s = Marshal.PtrToStringAnsi(a);
System.Console.WriteLine(s);
}
private void button4_Click(object sender, RoutedEventArgs e)
{
typeTest testTemp = new typeTest();
testTemp.byteTest = new byte[64];
testTemp.uintTest = new uint[4];
testTemp.strTest = "asd";
testTemp.intTest = 3;
testTemp.byteTest[0] = (byte)'a';
testTemp.uintTest[0] = 12;
OnTest4(ref testTemp);
System.Console.WriteLine(testTemp);
}
private void button5_Click(object sender, RoutedEventArgs e)
{
int[] intTemp = new int[2];
intTemp[0] = 1;
intTemp[1] = 2;
OnTest5(intTemp);
System.Console.WriteLine(intTemp);
}
- 함수호출할때 인자를 사용하는 경우,
CallingConvention = CallingConvention.Cdecl
가 필요하다 - C++에서 char포인터를 반환하는 경우, C#에서의 type은 IntPtr이다.
Marshal.PtrToStringAnsi
를 사용해서 string으로 바꿀수잇다. string으로 바로 받으면 에러가 발생한다
Reference
1. 플러그인 추가 방법
Phonegap 3.0 에서 플러그인을 추가하는 방법입니다.
추가 방법은 간단합니다.
프로젝트가 생성된 폴더로 이동하여
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-device.git
위와 같은 명령어로 설치하여 주시면 됩니다.
커멘드의 형대로 설치되는 플러그인의 모습
외에도 추가된 플러그인을 확인하기 위하여
$ phonegap local plugin list
를 이용하여 설치된 플러그인의 id를 확인하실수 있으시며
$ phonegap local plugin remove org.apache.cordova.core.console
위와 같은 remove 명령어로 플러그인의 삭제역시 가능합니다.
2. 명령어 정리
설치
$ phonegap local plugin add GIT_ADDRESS
삭제
$ phonegap local plugin remove PLUGIN_ID
리스트 보기
$ plugin local list
3. 플러그인 리스트
Basic device information (Device API): 기본 창치 정보
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-device.git
Network Connection and Battery Events: 네트워크 접속 및 베터리 이벤트
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-network-information.git
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-battery-status.git
Accelerometer, Compass, and Geolocation: 가속기, 나침반, 위치
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-device-motion.git
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-device-orientation.git
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git
Camera, Media playback and Capture: 카메라, 미디어, 캡쳐
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-camera.git
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-media-capture.git
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-media.git
Access files on device or network (File API): 장치 파일 및 네트워크 파일 관련 플러그인
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-file.git
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer.git
Notification via dialog box or vibration: 알람 박스 및 진동 관련 플러그인
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-dialogs.git
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-vibration.git
Contacts: 연락처
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-contacts.git
Globalization: 국제화
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization.git
Splashscreen: 시작화면
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-splashscreen.git
Open new browser windows (InAppBrowser): 새로운 브라우져 여는 플러그인
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git
Debug console: 콘솔 디버그
$ phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-console.git
여기서 제가 자주 쓰는 플러그인은
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-device.git
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-network-information.git
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-media.git
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-file.git
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer.git
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-dialogs.git
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-vibration.git
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-splashscreen.git
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-console.git
phonegap local plugin add https://github.com/phonegap-build/PushPlugin
정도가 되겠군요. ( 복사해서 붙여 넣을려고 굳이 자주 쓰는 것들을 정리했습니다. )
ps).
우선 apache2.2를 apt-get으로 설치한 상태이어야 한다.
그런 상태라면..
module userdir이 기본적으로 설치되어 있을 것이다. 다만 enable되어있지 않을 뿐이다.
따라서 초기로딩시 로드될 수 있도록 enable시켜주는 과정이 필요하다.
#cd /etc/apache2/mods-available
이곳으로 이동한다.
그리고나서
#ls -l
조회를 해보았을때
userdir.conf
userdir.load
라는 두개의 심볼릭 링크가 없다면 disable된 상태.
그러면 그 상태에서 다음과 같이 명령어를 입력한다.
# sudo ln -s ../mods-available/userdir.conf userdir.conf
# sudo ln -s ../mods-available/userdir.load userdir.load
# vi userdir.conf
그러면 두개의 심볼릭 링크가 잡히고, userdir.conf를 편집하는 상태가 된 것이다.
이것을
위와 같이 Indexes를 없애준다. 이는 index.html파일이 없을 때 웹브라우저상으로 파일들을 자동적으로 index해주는 기능을 없애주기 위함이다. 이래야 보안적으로 보았을 때 안전해진다.
그리고 확인해야 할 것은 UserDir 항목이다. 이곳이 위에서는 public_html이라고 설정되어 있기 때문에
/home/각사용자명/public_html/ 아래 들어가는 것을 홈디렉토리로 로드하게 된다.
이것을 변경해주면 자기 입맛에 맞게 웹루트를 지정할 수 있다.
추가로 php로딩까지 되게 하고 싶다면
#vi /etc/apache2/mods-enabled/php5.conf
위와같이 설정에 주석을 달아준다.
sudo a2enmod userdir
다 설정되었으면
#service apache2 restart
아파치 2.2재시작!
그러면 테스트를 위해서 해당 사용자의 홈디렉토리/public_html/ 로 들어가서
#vi index.html
<pre>
home directory setting complete!
</pre>
입력후 [esc] :wq 입력한다.
그다음 웹브라우저를 켠 후
http://웹주소/~유저명
이렇게 입력하면 아까 만든 index.html이 로드되는 것을 확인할 수 있다!
이젠 그 사용자로 즐기면 된다. :)
'os > linux' 카테고리의 다른 글
d-link dir-868l에서 dd-wrt 에서 iptv 설정 (0) | 2014.11.11 |
---|---|
[ubuntu] phpmyadmin 설치 (0) | 2013.11.18 |
[ubuntu] gmail 계정을 활용한 ssmtp설정 (0) | 2013.11.18 |