2018년 9월 27일 목요일

git

파일 관리 차원에서 알아야 할 개념

Tracked / Untracked  ( Tracked : git 이 추적하며 버전관리를 하고 있는것 )
Stage / Unstage  ( Stage : Commit 직전 머무르는 영역 )
Working directory / Stage(Index) / HEAD
( HEAD : Stage에 머무르던 파일들이 Commit 명령으로 local에 최종 기록)
——————————————————————————————-

폴더가 있다.  Working directory 이다. 아무것도 없다.

m0.txt,  m1.txt,  m2.txt  파일 세개를 만들었다. 이 파일들은
Untracked & Unstage 상태이다.

세 파일들을 add 시켰다.  세 파일들은 
Tracked &  Stage 상태이다.

세 파일들을 commit 시켰다. 세 파일들은
Tracked &  HEAD 상태이다. 

m0.txt 의 내용이 없었는데 “000″을 기입하고 저장했다. 이 파일은
Tracked &  Unstage 상태이다.

m0.txt 파일을 add 시켰다.  이 파일은
Tracked &  Stage 상태이다.

m0.txt 파일을 commit 시켰다.  이 파일은 
Tracked &  Head 상태이다. 
——————————————————————————————-

clone

git clone 저장소주소( git clone https://github.com/***.git )

status

git status (작업 경로 내의 파일 상태를 보여준다.)

add

git add 파일명.확장자 ( git add rm1.txt )
반대로 Unstage 하려면
git reset HEAD 파일명.확장자 (  git reset HEAD rm0.txt )

revert 

내용 변경을 취소하고 최신 커밋 버전으로 돌아가고 싶을 때
git checkout – 파일명.확장자 ( git checkout – rm0.txt )

remove

git rm 파일명.확장자
하게 되면 파일이 지워지고 tracked 상태고 해제되고 Stage 상태가 된다.
이를 취소하기 위해서는 
git reset HEAD 파일명.확장자 사용해 Unstatge 상태로 만들고
git checkout – 파일명.확장자 로 revert 해준다
삭제는 하나 파일을 local에 남겨두고 싶을때
git rm –cached 파일명.확장자
여러 개의 파일이나 디렉토리를 한꺼번에 삭제 
git rm log/\*.log ( log 폴더 안의 *.log 파일 모두 삭제)
git rm \*~  ( ~로 끝나는 것 모두 삭제)

commit

git commit -m “커밋 시 남길 로그 내용” 
git commit -m “커밋 시 남길 로그 내용” -a
-a 는 tracked 상태인 파일들을 자동으로 stage에 넘기고 커밋.

push

 git push origin master

remote

git remote -v( 리모트 저장소 확인 )
git remote add 단축이름 url ( 리모트 저장소 추가 )
git fetch 단축이름

기타

git mv 파일명 파일명 ( 이름변경 )
git remote -v( 리모트 저장소 확인 )
git remote add 단축이름 url ( 리모트 저장소 추가 )

















라디안(Radian)

이 포스트를 쓰는 이유는
라디안 이라는 3.14…(ㅠ) 이라는 값을
진심으로 각도로 인식 할 수 있는
수학적 사고를 해보자는 취지이다.

라디안은 각도를  몇˚ 가 아닌 
실수로 표현하기 위해 고안된 단위 이다. 
어렵지 않다
즉 180˚  를 3.14……. 로 표현 하겠다는 것 뿐이다.
그리고 3.14… 의 소수점이 끝이 없기에 ㅠ 로 대체 하겠다는 것이다.
image
라디안의 정의
반지름과 호의 길이가 같을 때의 각도를 실수 1로 나타낸 것

여기까지는 그런가 보다 할 수 있다.
그런데 여기서 ㅠ(파이) 라는 라디안 값을 설명 해보라 한다면?
그냥 3.14… 인가? 어디에 써먹는 것인가?

ㅠ(파이) 란 원주율이다
바로 원의 지름에 대한 비율이다.
원의 지름이 몇 이든 ㅠ를 곱해주면 원의 둘레가 나온다는 것이다.
즉 원의 지름이 1일때 원의 둘레는 3.14… 이라는 것이다.
우리가 흔히 알고 있는 원의 둘레를 구하는 공식
2ㅠr 은  2r(지름) * ㅠ(3.14)에서 온 것이다.


여기서 체크해야 할 점은
라디안(호도법)의 출반점은 반지름 이고
원주율  ㅠ(파이)의 출발점은 지름 이라는 것이다.


이번엔  2ㅠr 에서 반지름을 지름으로 만드는 대신 반지름을 유지하고
ㅠ를 두배 시켜 보겠다
반지름 곱하기 2ㅠ(3.14… * 2) 가 원의 둘레가 된다.
다시 말해 반지름 곱하기 6.28… 가 원의 둘레가 된다. 

이같은 결과는 라디안 이라는 개념 없이 그저  2ㅠr 이라는 공식과
ㅠ는 3.14… 라는 것에서 착안한 것이다.

그렇다면 이제 라디안 개념을 끌어와 보겠다.
반지름 곱하기 6.28… 가 원의 둘레 라면
1라디안 곱하기 6.28… 은 어떻게 될까?
결과를 말하자면 1라디안 곱하기 6.28… 은 각도로 따지면 360˚ 가 된다.

1라디안에 대응하는 호의 길이는 반지름 이다
3*라디안 일때의 호의 길이는 3*반지름 이다
라디안 곱하기 6.28… 가 나타내는 각도가 그려내는
원호의 길이가 반지름 곱하기 6.28…  의 길이와 같은 것이다.

이것이 라디안을 이해하는 키가 된다.
원의 반지름의 길이가 1인 경우 
원주 자체가 그냥 라디안 수치인 것이다.
참고로 3.14.. 라는 값은 원주율이지만
180도 만큼 돌아간 경우의 원호의 길이 즉 원주의 반에 해당하는
길이이다.
따라서 호도법 라디안이라는 수치는 원주(둘레)를 그려내는
각도라고 생각하면 되는 것이다.

Vector 활용

Normalize ( 정규화? 규격화? )

 (1, 2, 3) 이라는 3차원 백터를 노말라이즈 하는 과정
 1. 백터의 힘을 구한다
  vectorForce = sqrt(1*1 + 2*2 + 3*3)
  vectorForce = 3.74…. 정도가 나온다. 이것이 백터가 가진 힘(길이)!
 2. 이제 이 힘으로 각 원소를 나누어준다
  x = 1 / vectorForce
  y = 2 / vectorForce 
  z = 3 / vectorForce 
해서 나오는 (x, y, z) 가 노말라이즈 된 백터이다
(0.267, 0.534, 0.801) 라는 백터가 나온다
이 백터의 힘을 구해본다면 그 힘(길이)이 1이 나올 것
방향은 유지하고 힘(길이)을 1로 맞추는 과정이 Normalize

Dot Product ( 내적 )

두 백터를 가지고 계산하여 나오는 실수 값
내적의 활용도는 무궁무진, 그 이유는?!

1. 내적의 계산 방법
v1 = (a, b, c)
v2 = (x, y, z)
내적의 표기는 ->  v1 · v2 ( 가운데 점이다. 그래서 dot product )
계산법 (  각 원소를 같은 위치의 원소들과 곱하고 그것들을 모두 더한다 )
 1) v1 · v2 = a*x + b*y + c*z
 2) v1 · v2 = v1Force *  v2Force * cos(theta) 
2) 번 식이 상당히 중요함. 왜냐하면  cos 과 theta 개념이 탑재 되어 있기 때문
위 식에 나온  theta 는 v1 과 v2 의 사이각을 의미한다.
그렇다 그 사이각의 변화에 따라 내적값이 변경 된다.
아 내적은 두 백터의 관계가 수치로 표현 되는 것이구나!!
그렇다면 이 관계? 로 부터 어떤 수치가 나오는걸까?
이를 알아보기 위해 우선 2번 식을 간소화 해보자
위에서 언급한 Normalize 를 이용하면 v1Force 와 v2Force 를
1로 만들 수 있다는 것에 착안한다.
v1 과 v2 의 내적을 구하기 전에 각각을 normalize 하고 2번 식을 구성해보자
그러면  v1 · v2 = 1 *  1 * cos(theta) 이런 식으로 나오게 되고
결국은  v1 · v2 = cos(theta) 이렇게 되는것이다.
실제로 내적은 대부분 노말라이즈된 백터를 가지고 수행하는 것이 원칙이다.
결국 내적의 값은 코사인 함수에 그 사이각을 라디안 으로 대입하면 나오는
값이다. 

이제 코사인 곡선을 그려보자




image

이 그래프를 잘 보면
cos() 의 괄호 안에 들어가는 라디안으로 표기 각도값에 따라
cos()  의 값이 1 과 -1 사이를 오르락 내리락 한다.

그렇다 내적은 -1 과 1 사이 값을 가진다.
사이각이 0, 즉 같은 방향의 백터들은 내적값이 1이고
사이각이 180도, 즉 반대 방향인 백터들의 내적은 -1
사이각이 직각을 이루는 경우는 0 이다.

내적 값은 알았고 반대로 theta 값 즉 두 백터의 사이각을 구하려면
어떻게 해야 할까
v1 · v2 = cos(theta) 을 바탕으로 양변에 acos를 곱해준다
acos( v1 · v2 ) = theta 가 된다

참고로 각도와 라디안 변화식은

180 가  π  라는 것을 기억한다면
1° = π / 180°
180° ->    180°  x  (π / 180) ->  π
0.5 rad -> 0.5 x (180 / π) -> 90 / π

Cross Product ( 외적 )

외적의 경우 계산후 실수값이 아닌 
두 백터에 모두 수직인 백터가 나온다 

1. 외적의 계산 방법
v1 = (a, b, c)
v2 = (x, y, z)
외적의 표기는 ->  v1 x v2 ( 가운데 x이다. 그래서 cross product )


활용법

1. 점과 직선의 최단거리








































2.점과 선분의 최단거리








































3.











2018년 6월 24일 일요일

C# 자료구조


[] 배열 : 
  값으로 검색할 필요 없는 경우( 해야한다면 HashTable 이 빠르다 )
  검색시 키가 숫자인 경우 ( 키가 숫자가 아니면 Dictionary 가 빠르다 )
  맨 앞 또는 맨 뒤만 접근 하는 경우 Queue, Stack 이 빠르다


동적배열( ArrayList, List<T> ) :
           ArrayList 는 자료형에 상관 없이 아무거나 넣는 구조
           List 는 특정 자료형을 선택하여 같은 종류의 것암 넣는 구조
  배열의 크기를 확정하지 않고 유동적으로 써야 할 때
 
  검색 코드 ->
  Transform t = myList.Find( delegate(Transform tm) { return tm.name == "name"; } );



Linked List :
           노드가 다음/이전 노드의 포인터를 갖고 있다
  삽입/삭제 빠르다( 위의 표 검색 값은 O(n)으로 표기 되었지만 O(1)임 )
  검색은 전체 검색을 함 비효율


Dictionary :
           키값으로 문자도 쓸수 있고 삽입, 삭제, 검색 골고루 효율적
  단점 찾아봐야함


HashTable :
           Generic 형식이 아닌 Object를 그대로 저장하는 방식
           C#에서는 형 변환에 자원을 많이 소비하기 때문에 Dictionary가 속도면에서 효율적

           
HashSet : 
           Key-Value 구조가 아니라 유니크한 값(Value)로만 이루어져 있음
           
           



















2018년 6월 21일 목요일

C언어 출력타입 %d %s

%d: 10진수(정수형)
%i: %d

%f: 실수형
%F: 무한수 표현

%e: 지수형

%o: 8진수

%x: 16진수 소문자
%X: 16진수 대문자

%u: 부호없는 10진수

%g: 실수형, 크기 작으면 %f 크면 %e

%p: 포인터의 주소

%c: 문자
%C: %c

%s: 문자열

%n: ?

2018년 5월 15일 화요일

프레젠테이션

영어 발표의 시작

1. 시전 끌기 (이목 집중)
   Can I get attention please
   Perhaps we should begin?
   Let's get start
   If we can start?
   Nice to meet you


2. 자기 소개
   name , rule
   i am charge of ...
   For those of you who don't know me, My name is Brandon
3. 프레젠테이션의 목적
   I'd like to present ...
   I'd like discuss
   What i want to do is to show you how ...
   I gonna talking about 

4. 질문에 대한 코멘트( 중간중간 or 끝나고 )
   If you have any question, feel free to raise your hand
   Perhaps we can leave any questions you have until the end.
   There will be a plenty of time for questions at the end

2018년 5월 7일 월요일

Windows Game Development ( UWP: Universal Window Platform)

Hololens 작업 정리

PC와 Hololens의 개발자모드, 디바이스포탈 활성화

시스템 설정으로 이동하여 '업데이트 및 보안'을 선택하세요. 다음으로 '개발자용'을 선택합니다. 여기서 '개발자 모드'를 선택하여 활성화하면 됩니다.



PC의 개발자 버전이 제대로 적용 되지 않아 디바이스포털 활성화 안된다면 USB를 사용
다만 홀로렌즈 id, pw 값을 모를경우 재설정 하여 진행해야 함


사용 메뉴얼
1. 참조 : 유니티빌드 + vs deploy( 빌드관련 )
2. 참조 : 좀 더 개발적 튜토리얼


====================================================
hololens에서의 vuforia 개발 튜토리얼
기본 튜토리얼 : 링크

====================================================
새 프로젝트에 순서 복기
1. 프로젝트 생성 (베이스를 기본 생성된 프로젝트로 한다)
   company name, product name 은 된 것으로 간주
2. 기존 메인카메라 삭제 및 ARCamera 추가 ( vuforia 패키지 따라 설치 됨 )
3. ImageTarget 추가, child object 추가
4. BuildSettings / SwitchPlaform : Universal Windows Platform
   BuildSettings / Target Device : Hololens
5. PlayerSettings / XR Settings / Virtual Reality Supported check
   PlayerSettings / XR Settings / Vuforia Augmented Reality Supported check
6. PlayerSettings / Publishing Settings / Capabilities
   InternetClient check
   WebCam check
   Microphone check

7. PlayerSettings / Other Settings / Configuration / Scripting Backend
   IL2CPP 라면 .NET 으로 바꿈
 

8. Resources 의 VuforiaConfiguration 내용 수정
   Digital Eyewear / Device Type -> Digital Eyewear
   Digital Eyewear / Device Config -> HoloLens
 

9. ImageTarget 속성변경
   Image Target Behaviour / Advanced / Extended Tracking -> check

x. 혹시나 ImageTarget 에 Custom Turn Off Behaviour 가 컴퍼넌트로 있다면
   Turn Off Rendering 을 Play Mode And Device 로 해준다.

 
111. visual studio 빌드 세팅
   x86 / Device






====================================================
참고해야할 사항들
참조






unity 2017 + vuforia

참조

unity 설치시

Vuforia Game Objects

Vuforia will be visible in the Unity Game Object menu and also in Build Settings and Player Settings.
Vuforia Image

Activate Vuforia in your project
You must activate Vuforia in your project before you will be able to build a Vuforia app, or use Vuforia in Play Mode. Go to Player Settings to activate Vuforia under the "XR Settings" section



Accessing Vuforia features in Unity
After activating Vuforia, you can add features of the Vuforia SDK to you project from the Unity GameObject Menu.
Start by adding an ARCamera. This is a special camera type that supports augmented reality apps for both handheld devices and digital eyewear. 
Steps:
  1. Add an ARCamera
  2. Open the global Vuforia Configuration Inspector
  3. Activate the target databases
  4. Add targets to your scene





Print Physical Targets

This is a good time to print some targets to work with. You can find these in /Editor/Vuforia/ForPrint. We’ve provided a complete set of high-resolution target prints to get you started.
Vuforia Image
Printable target PDFs can be found in /Editor/Vuforia/ForPrint


player settings / Publishing Settings / Capabilities

check WebCam, Microphone, InternetClient














2018년 1월 1일 월요일

Google Play Service / Apple Game Center 연동

영문 메뉴얼

우선은 구글에서 만들어둔 플러그인을 사용
GitHub 페이지 ( https://github.com/playgameservices/play-games-plugin-for-unity )


다운 받아서 압축 푼다.
풀린 파일 있는 폴더의 경로에 플러그인이 있다.



이 플러그인은 구글 플레이 게임서비스와 애플 게임센터 두 플랫폼 다 지원함
출처: http://minhyeokism.tistory.com/70 [programmer-dominic.kim]

이 플러그인은 구글 애플 둘다 지원한다는데 해봐야 아는거다.

우선 다운로드 받은 플러그인을 유니티에 적용

다음, 구글 콘솔 사이트에 들어가서 앱 추가 또는 정보 확인

게임 서비스 / 연결된 앱 확인


업적 / 리더보드 작성



리소스 받기  눌러서 아래와 같은 화면이 나오게 하고



안드로이드 탭 상태에서 내용을 복사

유니티의 아래 메뉴 그림을 참고하여


구글 플레이 게임 - 안드로이드 셋업 창 열어

아래와 같이 복사한 내용을 붙여 넣는다.


Setup 버튼을 눌러 준다.

정상 처리 되면 아래와 같이
GPGSIds 라는 cs 파일이 생성됨



그 내용은 아래와 같으며 업적의 잠금 해제나 리더보드에 스코어 올릴때
GPGSIds 라는 static 클래스의 string 변수를 이용함







본격 진행전 설명

필요한 using
using GooglePlayGames;
using GooglePlayGames.BasicApi;
//using UnityEngine.SocialPlatforms;// 이건 보류
using UnityEngine.SocialPlatforms.GameCenter;

코드 부분은 아래와 같이 한다.



좀더 자세하게는
PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
        // enables saving game progress.
        .EnableSavedGames()
        // registers a callback to handle game invitations received while the game is not running.
        .WithInvitationDelegate(<callback method>)
        // registers a callback for turn based match notifications received while the
        // game is not running.
        .WithMatchDelegate(<callback method>)
        // requests the email address of the player be available.
        // Will bring up a prompt for consent.
        .RequestEmail()
        // requests a server auth code be generated so it can be passed to an
        //  associated back end server application and exchanged for an OAuth token.
        .RequestServerAuthCode(false)
        // requests an ID token be generated.  This OAuth token can be used to
        //  identify the player to other services such as Firebase.
        .RequestIdToken()
        .Build();

    PlayGamesPlatform.InitializeInstance(config);
    // recommended for debugging:
    PlayGamesPlatform.DebugLogEnabled = true;
    // Activate the Google Play Games platform
    PlayGamesPlatform.Activate();
출처 : Configuration & Initialization Play Game Services 를 ctrl + f


다음으로는 Sign In
주석 처리된 GooglePlayGames.PlayGamesPlatform.Instance.Authenticate....
부분은 영문 메뉴얼에 그렇게 안되있어서 일단 주석처리


Sign Out



Player Statistics


Setting popup gravity