2015.07.06 17:59

아래 주소에서 package를 다운로드 할 수 있다. 이 글 작성일 기준으로 아직 베타임.


https://github.com/googleanalytics/google-analytics-plugin-for-unity?hl=ko



이를 사용하기 위한 정책이 있다.(변경 될 수 있으니 , https://developers.google.com/analytics/devguides/collection/unity/policy?hl=ko 를 꼭 읽어볼 것!)


1. 당연하지만, Google Analytics Account가 필요하다.


2. End User에서 당신이 Analytics로 전송하는 데이터에 대한 동의를 얻어야 하며, 유저에게 보낼지 말지를 선택할 수 있는 옵션을 제공해야 한다.


3. 이메일, Social Security Numbers(주민등록번호 같은), 기기를 구별할 수 있는 특별한 정보 등의 개인 혹은 장비를 식별 할 수 있는 중요한 정보를 업로드하면 안된다. 


4. 개인을 식별할 수 있는 어떤 정보를 넘긴다면, 당신의 계정은 삭제될 것이며, 업로드된 데이터 또한 잃어버리게 될 것이다.



설정하는 과정은 아래와 같다.


Android 용


1. 빌드 타겟을 Android로 한 후 build를 하면 Temp/StagingArea 디렉토리(당신이 빌드를 선택한 디렉토리 아래에 생성될 것이다.)에서 AndroidManifest.xml 파일을 복사해서 <YOUR PROJECT ROOT>/Assets/Plugins/Android/ 폴더에 복사하라. 


2. AndroidManifest.xml 파일, <application> tag 위에 아래의 permissions를 추가하라. (이 어플리케이션이 네트웍에 접속을 허용한다는 권한임.)

  <uses-permission android:name="android.permission.INTERNET"/>

  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


3. Campaign Tracking을 활성화 하길 원한다면, 아래 서비스를 추가하라.

<service android:name="com.google.analytics.tracking.android.CampaignTrackingService" />
<receiver android:name="com.google.analytics.tracking.android.CampaignTrackingReceiver"
         
android:exported="true" >
 
<intent-filter>
   
<action android:name="com.android.vending.INSTALL_REFERRER" />
 
</intent-filter>
</receiver>

IOS 용


1. XCode 프로젝트에 아래 라이브러리들을 추가해라.

  AdSupport,framework

  CoreData,framework

  SystemConfiguration.framework

  libz.dylib

  libsqlite3.dylib


2. 만약 빌드할 때 자동으로 추가되길 원한다면 iOS Extras 디렉토리에서 PostProcessBuildPlayer_GA 파일을 복사하여, <YOUR PROJECT ROOT>/Assets/Editor 디렉토리에 넣어라.


3. mod_pbxproj.py 스크립트를 다운로드해서 Editor 디렉토리에 복사해라. 라이브러리들은 빌드할 때 자동으로 추가될 것이다.


* 참고 : libsqlite3.dylib는 Xcode에서 -ObjC 링커 플래그를 사용할 때만 필요하며 만약 그 플래그를 사용하지 않는다면 PostProcessBuildPlayer_GA 파일에서 삭제해도 괜찮다.



GAv3 prefab 설정하기


1. GAv3.prefab을 클릭하라. Project View,  Assets/Plugins/GoogleAnalyticsV3안에서 찾을 수 있다.
2. Inspector view에서는 여러 정보들의 리스트를 볼 수 있으며, 당신의 프로젝트에 알맞은 값으로 설정해야 한다.
3. Object Hierarchy에 삽입하라.

* 참고 : 모든 플렛폼에 같은 값은 사용할 수 있다. 

오브젝트 트랙하기

GAv3 prefab을 설정 한 후, 아래 스탭들을 따라가면 특정 오브젝트를 추적할 준비가 완료된다.

1. 추적할 오브젝트를 클릭하고 해당 객체의 스크립트를 편집하자. 없다면 Add Component 버튼으로 새로운 스크립트를 만들자.

2. 해당 클래스에 아래처럼 GoogleAnalyticsV3 오브젝트를 생성하자.
public GoogleAnalyticsV3 googleAnalytics;

3. 스크립트를 저장하고 Unity 윈도우로 돌아가자.


4. 추적하고 싶은 객체의 Inspector view를 보자. 이제 googleAnalytics라고 명명된 필드를 볼 수 있고, 이곳에 Object Hierarchy view에서 GAv3 객체를 찾아 드래그 하여 넣어주자.


5. 이제 해당 객체를 추적할 준비가 되었다. 다른 객체들도 추척할 내용이 있다면 위의 과정을 반복하여 설정하면 된다.



이제 본격적으로 API 페이지를 읽어봐야겠다. +_+ GOGO !!!





2015.06.30 16:56

(windows 환경)


nodejs에서 80포트 열어 쓰던 어플이 있는데, 어느날 갑자기


error: listen EACCES 0:0:0:0:80 에러를 뱉으면서 안된다. --a


netstat -ano 하면 ip,port 그리고 해당 포트를 사용하는 PID를 볼 수 있다. 


찾아보니 4 ... System이 쓰고 있다고. -- ㅁ.... 모지..


이래저래 찾아보니.. 최근에 로컬에 mssql을 설치했는데.. 


SQL Server Reporting Services가 내부적으로 80포트를 쓰고 있었네 --;


서비스 중지 시키니 잘 돌아감. 


휴 ~ 



2015.06.04 15:54

방법을 몰라서 인터넷을 찾아보니 사람마다 다 방법이 다르다. --;;


var old = new Date ( 특정일 );

var now = new Date();

var gap = new Date( 0,0,0,0,0, now- old);


이렇게 처리한 분도 있던데.. 내가 원하는 값은 아니었고.. 


시간, 분, 초, ms 차이를 알고 싶었기에.. 이거저거 뒤져보다.. 

getTime 인터페이스가 있어 사용해보니.. OK!!


var old = new Date ( 특정일  or 시간);

var now = new Date();


var gap = now.getTime() - old.getTime();

var sec_gap = gap / 1000;
var min_gap = gap / 1000 /60;

이런 식으로 처리 가능!!

 


2015.05.01 18:16

이전에서는 LED를 주기적으로 깜밖이는 것만 했었다. 이번에는 두가지를 복합적으로 해봐야겠다. 


이거 다음엔 바로 인터넷 라디오로 간다. -0-a


일단 오늘의 보드는 아래와 같이 설정한다.




LED : 11번 핀에서 입력을 받아 330옴 저항을 통해 LED의 긴다리(+)로 연결되고 짧은다리(-)에서 GND로 나간다. 


YELLOW BUTTON : 3.3V로 전원이 들어가고 10K옴을 통해 버튼으로 들어간다. 위 그림에서 위 오른쪽 다리 방향으로 GND로 이어지고, 버튼의 입력은 18번 핀으로 받도록 설정했다. 


Raspberry pi2 이름로 각 핀의 wiringpi 번호는 아래와 같다. 



개발 목표는 버튼을 누르면 10초간 LED가 켜지고, 지정한 사운드를 출력하도록 한다. 출력 중 입력이 다시 들어오면 기존의 사운드를 중지하고 다시 출력하도록 하자. 


코드는 아래와 같다. 

#include <stdio.h>

#include <stdlib.h>

#include <wiringPi.h>


int main (void)

{

  int SWITCH = 5; //  pin 18

  int LED = 0; // pin 11

  int sndPID = 0;

  

  if(-1 == wiringPiSetup())

    return 1;

  pinMode( SWITCH, INPUT); // 버튼의 입력을 받는다.

  pinMode (LED, OUTPUT) ;  // LED에 신호를 보낸다.


  for (;;)

  {

    digitalWrite (LED, 0) ;

    if( digitalRead(SWITCH) == 0)

    {

       digitalWrite (LED, 1) ;

       sndPID = fork();

       if(sndPID == 0)

       {

          // 사운드 출력에는 mplayer를 사용한다. 기존에 출력 중이라면 중지시킨다.

          system("killall mplayer");

          execlp("/usr/bin/mplayer", " ", "/home/pi/media/sound/dragon.wav", NULL);  

       }


       delay(10000); // ms. 10초간 불을 켜둔다.

    }

  }

  return 0 ;

}


mplayer 설치법은 여기 를 참고하길 바란다.


테스트 사운드는 아이가 가지고 노는 요괴워치 중 하나를 녹음 한거라 음질이 엄청 나쁘니 양해 바란다. ^^a





이상. 다음은 인터넷 라디오 프로토타입으로 하단의 "인터넷 라디오" 카테고리에 업데이트 됩니다. ^^

'개발/경험 > RaspberryPi' 카테고리의 다른 글

버튼으로 LED, Sound 처리하기  (0) 2015.05.01
blink 샘플 실행  (0) 2015.04.29
기본적이지만 중요 정보 몇가지  (0) 2015.04.18
드디어 왔다!!  (0) 2015.04.17
2015.04.29 03:25

gpio의 helloworld 예제인 블링크를 wiringPi를 이용해 샘플을 실행해 봤다.


일단 wiringPi lib 설치부터... 아래와 같다. 


설치


1. git 설치

sudo apt-get install git-core


2. wiringPi 프로젝트 다운

git clone git://git.drogon.net/wiringPi


3. build

clone한 위치에 wiringPi안에 들어가서 ./build 실행.

빌드가 이상없이 되었다면 "find / -name "gpio"를 실행해 보자. 

"/usr/local/bin"과 방금 빌드한 곳, 두 곳에 gpio를 발견할 수 있다.

빌드한 곳 gpio 폴더 안에서 ./gpio -v 한 결과와, 

gpio -v 한 결과가 다르다면 gpio 파일을 "/usr/local/bin"에 복사해주라. 

build하면 복사될 줄 알았는데 안된 듯. pi2라서 gpio old version에서 제대로 인식을 못해서 한참 원인을 찾다보니 이거였어.


4. raspberryPi의 핀 번호 및 역할 보기

gpio를 활용하면 보드에 핀 번호를 어떻게 보는지 쉽게 알 수 있다.

"gpio readall" 을 해보면 아래와 같은 결과를 볼 수 있다.     

보드에는 두 줄의 핀이 있는데 rapberryPi2는 위와 같은 순서로 구성되어 있다. 위 표 중앙에 Physical 부분이 보드의 핀 순서와 일치한다. (1,2번이 보드의 전원램프 쪽. 39,40이 usb가 위치한쪽)

Physical을 중심으로 양쪽의 컬럼명이 일치하는 것을 볼 수 있다. (노란색 라인을 참고할 것!)

각 컬럼의 정보는 다음과 같다. 

 BCM 

 Broadcom의 BCM2835 칩에서 사용하는 핀번호

 wPi 

 WiringPi 라이브러리의 핀번호

 Name 

 GPIO의 이름

 Mode 

 IN - 입력모드 ,  OUT - 출력모드

 V

 핀의 값. 1 - 전압이 High상태, 0 - Low상태

 Physical

 핀헤더의 번호

붉은색 라인 부분을 보자.

wiringPi의 blink 샘플을 보면 pin값을 0으로 사용한다. wiringPi에서 0은 wPi가 0인 것이며, 핀헤더 번호는 11번, 핀의 위치는 전원램프 쪽에서 6번째에 위치하다는 걸 알 수 있다. 

이제 샘플 코드를 보자. 


5. 샘플 코드

#include <wiringPi.h>

int main (void)

{

  int PIN = 0;

  wiringPiSetup () ;

  pinMode (PIN, OUTPUT) ;

  int max_count = 5;

  int cnt = 0;

  for (;;)

  {

    digitalWrite (PIN, HIGH) ;

    delay (500) ;

    digitalWrite (PIN,  LOW) ;

    delay (500) ;

    ++cnt;

    if(cnt>=max_count)

        break;

  }

  return 0 ;

}

기존의 샘플 코드에서 LED의 깜밖임이 5번 반복 후 종료하도록 수정했다. PIN변수는 wPi값을 의미한다. 


빌드는 아래와 같이 하면된다.

gcc -o blink blink.c -l:libwiringPi.so.2.25 -I/usr/local/include -L/usr/local/lib

어떤 샘플에서 lib 링크할 때 -lwiringPi 로 되어 있는데 libwiringPi.so 를 링크하겠다는 이야기다. 
새로 받아 빌드한 경우 버전명이 lib 끝에 붙는데 이를 정확히 사용하기 위해서는 위와 같이 입력하면 된다

6. 실행
./blink를 실행해보자. 아래와 같은 결과를 볼 수 있다.




'개발/경험 > RaspberryPi' 카테고리의 다른 글

버튼으로 LED, Sound 처리하기  (0) 2015.05.01
blink 샘플 실행  (0) 2015.04.29
기본적이지만 중요 정보 몇가지  (0) 2015.04.18
드디어 왔다!!  (0) 2015.04.17
2015.04.18 15:28

기본 id는 "pi", pw는 "raspberry".

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

sd에 라즈비안 설치 시 기본 비번은 변경하는게 좋으며, 

초기 설정에서 놓쳤다면 이후 "raspi-config"를 입력하면 다시 설정할 수 있다.


보드에 전원 스위치가 없다.

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

전원이 연결되면 바로 가동되는데, 종료시 전원을 바로 내리면 주변장치에 문제가 발생할 수 있다. ( sd카드와 같은.. )

" shutdown -h now " 커멘트를 통해 꼭 모든 디바이스가 unmount 된 이후 종료되도록 해줘야 한다.

재가동하려면 전원선을 뺐다가 다시 연결하니 되네. 이거 몰라서 한참 찾음.


SD 카드는 가능한 큰걸로

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

http://www.raspberrypi.org/downloads 에서 os 이미지를 다운받아 http://sourceforge.net/projects/win32diskimager/ 유틸리티를 이용해 SD에 구워 사용하게 되며, 보통 이 sd를 통해 계속 운영하게 된다. 

GPIO용이 아닌 개발 device로 사용하려면 여러가지 라이브러리를 사용해야 하기 때문에 가능한 큰 용량의 sd로 시작하는게 좋다.


전원만 연결하면 원격으로 바로 사용할 수 있게 세팅하자.

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

이를 위해 무선랜 설치, 자동 로그인 두가지 설정이 필요하다. 

아래 과정시 관리자 권한을 필요로 하기 때문에 sudo를 입력하거나 혹은 sudo su를 입력 후 아래 절차를 진행하자.


무선랜 설치

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

공간활용을 위해 가능한 무선랜을 추천한다. 난 처음 구매시 netis 제품이 동봉되어 도착했다.

무선랜은 아래와 같은 순서로 설치하면 된다. (x-windows에서 설정은 간단하니 패스, 콘솔에서 설정하는 방법을 다룬다.)


1. 설치된 공유기에 접속 설정

nano /etc/wpa_supplicant/wpa_supplicant.conf 를 실행하면 아래와 같은 화면이 뜬다.



아래와 같이 입력하자. ssid와 psk는 각자 공유기의 설정에 따른 값을 입력해야 한다.



nano editor는 vi보다는 좀 더 사용하기 쉽다. 


문자열을 찾을 때는 ctrl+w 입력 후 찾고자 하는 문자를 입력하면 된다. 

ctrl+x를 입력하면 수정된 경우, overwrite할지 물어보고 Y를 입력하면 저장하고 종료된다.


2. nic(network interface card) 설정


nano /etc/network/interfaces 를 입력하고 해당 정보를 아래와 같이 수정한다.



이제 설정은 모두 마무리 되었다. 아래와 같이 무선 인터넷을 재시작해보자.


ifdown wlan0

ifup wlan0


만약 에러가 발생한다면 해당 메세지에 따라 수정이 필요할 수 있다. 잘 안된다면 전체 오류 메세지를 댓글로 달아주면 확인 후 답변 할지도 ^^;;;


재시작되면 ifconfig 명령으로 할당된 ip를 확인할 수 있다. 이제 자동 로그인 되도록 해보자.


2. 자동 로그인 설정


nano /etc/inittab 를 입력해 시스템 기동시 처리되는 내용이 기록된 파일을 연다.


각 런레벨별로 실행하는 정보 라인을 찾아보자. 


1:2345:respawn:/sbin/getty --noclear 38400 tty1  => 이와 유사한 라인을 찾아볼 수 있다. ctrl+w로 noclear를 검색해서 찾아보자.


이를 주석 처리하고 (문장 제일 앞에 #을 붙이면 된다.), 아래 라인을 입력하자.


1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 > /dev/tty1 2>&1


위 문장의 상세한 설명은 생략한다. -0-a

이제 시스템을 재시작해보면 자동으로 로그인 되는 모습을 볼 수 있다.


'개발/경험 > RaspberryPi' 카테고리의 다른 글

버튼으로 LED, Sound 처리하기  (0) 2015.05.01
blink 샘플 실행  (0) 2015.04.29
기본적이지만 중요 정보 몇가지  (0) 2015.04.18
드디어 왔다!!  (0) 2015.04.17
2015.04.17 06:18

작년부터 라즈베리파이를 살까 말까 고민했었는데.. 


무얼 만들지를 고민하다가 최근 아내가 간단한 라디오를 원해서, 


1) 부엌에 설치할 음성인식 인터넷 라디오.. 


아이가 요괴워치 시계를 사고 싶어 하는데 갈 때 마다 없어서 만들기로 한.


2) 메달을 삽입하면 TFT 화면에 소환 영상이 같이 출력되면서 소리가 나는 요괴워치 장남감.


을 만들려고 구매를 결정.


어제 손이 들어왔다. 


새로운걸 배우는건 언제나 두근두근이라.. ^^


게다가 이런 소식도... 윈도우10 라즈베리파이 지원!!


'개발/경험 > RaspberryPi' 카테고리의 다른 글

버튼으로 LED, Sound 처리하기  (0) 2015.05.01
blink 샘플 실행  (0) 2015.04.29
기본적이지만 중요 정보 몇가지  (0) 2015.04.18
드디어 왔다!!  (0) 2015.04.17
2015.04.14 18:09

(링크포멜로 아키텍처 개요


잘 정리되어 있어서 링크만 업데이트 합니다. 


곧 프레임워크의 흐름(링크)을 정리해서 업데이트 하겠습니다. 


^^

2015.04.13 18:31


클라이언트는 브라우저, 서버는 nodejs로 가정.


업데이트 진행 과정을 확인할 수 있도록 만들었다.


브라우저에서는 아래와 같은 코드로 작업을 하면 된다. 스트림으로 보낼 파일을 지정하고, 해당 서버로 소켓 연결해서 보낸다. 'data' 메세지를 통해 현재 업데이트된 사이즈를 확인할 수 있다.

var fn =$("input[type=file]")[0].files[0]; // input 폼을 이용해서 지정된 파일 확인

var AllSize = fn.size; // 진행 사항을 체크하기 위한 파일 전체 사이즈

var UploadedSize = 0; // 현재 업로드된 용량

var socket = io.connect('localhost:8765');

var stream = ss.createStream();

ss(socket).emit('upload', stream, {path: tarpath, name: fn.name, size: fn.size});

var blobstream = ss.createBlobReadStream(fn);

blobstream.on('data',function(chunk){

UploadedSize += chunk.length;

      console.log(' updated >> ' + UploadedSize + '/' + AllSize );

});

blobstream.pipe( stream );


서버에서는 upload 메세지로 전송되는 데이타를 받아 지정된 파일로 저장한다.

(*path.basename 는 지정된 경로명을 제외하고 파일명만 추려낸다.)

var io = require('socket.io').listen(8765);

var ss = require('socket.io-stream');

var path = require('path');


io.sockets.on('connection', function(socket){

ss(socket).on('upload', function(stream,data){

var fn = path.basename(data.name);

stream.pipe(fs.createWriteStream(fn));

});

});


필요해서 만들어 봄. -0-



2015.04.10 13:58

없으면 인스톨.. 


apt-get install mpstat


기본으로 mpstat를 입력하면 아래와 같은 결과가 출력됨.


sudo mpstat


Linux 3.13.0-45-generic (rs2mapp1)      04/10/2015      _x86_64_        (2 CPU)


CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle

all       0.02    0.01      0.00   0.02     0.00    0.00    0.00    0.00      0.00    99.95


이걸 코더별로 사용률을 보려면 아래와 같이 실행하면 된다. 

sudo mpstat -P ALL


01:54:52 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle

01:54:52 PM  all    0.02    0.01    0.00    0.02    0.00    0.00    0.00    0.00    0.00   99.95

01:54:52 PM    0    0.02    0.01    0.00    0.03    0.00    0.00    0.00    0.00    0.00   99.94

01:54:52 PM    1    0.01    0.00    0.00    0.01    0.00    0.00    0.00    0.00    0.00   99.97


각 CPU에 대한 내용만 보고 싶다면..

sudo mpstat -P ALL | tail -2 (cpu가 2개니까 밑에서 두줄만 보겠다는 필터 적용)

01:56:08 PM    0    0.02    0.01    0.00    0.03    0.00    0.00    0.00    0.00    0.00   99.94
01:56:08 PM    1    0.01    0.00    0.00    0.01    0.00    0.00    0.00    0.00    0.00   99.97

특정 시간 간격으로 계속 나오게 하고 싶다면

sudo mpstat -P ALL 5 (5초 간격으로 계속 출력하기.)


예전에 한참 사용할 땐 알겠는데, 너무 오랜동안 사용 안하니 당췌 기억이 안나네. 


찾아서 정리해둔 내용.