336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


[ IOS ] Agreements Message ITunes Connect



App Store Connect( https://appstoreconnect.apple.com/ )를 들어가보니 


약관에 동의하라고 나타납니다.


이 약관을 동의하지 않으면 기능 작동이 안되더라구요.


Agreements Message

Review the updated Paid Applications Schedule.

....




하단에 "계약, 세금 및 금융거래( Agreements, Tax, and Banking ) 을 눌러줍니다.




Request Amendments에 보면 


Request 버튼이 파란색으로 되어있는데 그걸 눌러줍니다.




다음 화면에서 동의를 체크하고 Submit을 눌러줍니다.




마지막 정보가 나타나면 Done을 눌러주면 됩니다.


이제 정상 사용 가능해집니다.






'게임 프로그래밍 > 기타' 카테고리의 다른 글

[기타] 젠킨스 유니티 빌드 설정하기  (0) 2018.03.13
[기타] 젠킨스 설치하기  (0) 2018.03.04
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


젠킨스 유니티 빌드 설정하기(Windows 기준)




젠킨스 메인화면에서 좌측 상단 새로운 Item 선택합니다.




이름을 설정하고 Freestyle project 선택하고 확인을 눌러줍니다.




여기에서는 SVN 연동할 것이므로, 소스 코드 관리에서 Subversion 선택합니다.


그리고 Repository URL 설정해줍니다



그리고 Credentials 우측에 Add 눌러 svn 계정을 등록합니다.





계정이 추가되었다면 Credentials 해당 계정을 선택해줍니다.





이제 빌드설정만 해주면 끝이 납니다.


하단에 내리면 Build 라는 항목이 있는데 Add build step 눌러줍니다.


 여러 방법이 있겠지만 여기에서는 명령어를 Windows batch command 사용하겠습니다.


그리고 명령어를 넣어줍니다. 형식은 다음과 같습니다.

 

"유니티 실행파일 경로" -quit -batchmode -projectPath "프로젝트경로" -executeMethod "빌드스크립트함수명"

 

Ex> "C:\Program Files\Unity\Editor\Unity.exe" -quit -batchmode -projectPath "D:\Work\trunk\Client2017" 

-executeMethod PnBuilder.Builder.Build

 



6. 빌드스크립트함수는 아래 링크를 참조하시면 됩니다.

https://wiki.jenkins.io/display/JENKINS/Unity3dBuilder+Plugin



나의 설정

(빌드스크립트는 파일첨부)

Builder.zip


 

echo %PATH%

echo %USERDOMAIN%\%USERNAME% 

"C:\Program Files\Unity\Editor\Unity.exe" -quit -batchmode -projectPath "D:\Work\trunk\Client2017" -logFile "D:\buildlog.txt" -executeMethod PnBuilder.Builder.Build -outputprefix "Dev"

 

ECHO DONE

 


 

위의 커맨드를 보면

 

echo %PATH%

echo %USERDOMAIN%\%USERNAME% 

 


있는데, Unity 2007.1 .2 버전에서 .dll could not found

 


참고로 Unity3D 2007 버전에서는 .dll could not be found 에러가 발생합니다.


참고링크

 


이럴 경우 계정을 지정해주어야 합니다.

 

윈도우 시작 버튼을 눌러 service 가줍니다.






서비스에서 Jenkins 찾습니다.





마우스 오른쪽을 눌러 속성을 들어갑니다.





그리고 다음처럼 계정을 설정해주고 Jenkins 서비스를 재시작해줍니다.




설정이 완료되었습니다.


젠킨스로 가서 빌드를 하면됩니다.


안되면 댓글 달아주세요.









'게임 프로그래밍 > 기타' 카테고리의 다른 글

[IOS] Agreements Message  (1) 2018.08.15
[기타] 젠킨스 설치하기  (0) 2018.03.04
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


젠킨스 설치하기(Windows 기준)


게임을 만들면서 실행파일 배포하는게 너무 힘들었습니다.


그래서 젠킨스(Jenkins)를 통해 바이너리와 패치까지 모두 연동하려고 합니다.


그래서 오늘은 젠킨스(Jenkins)를 설치하려고합니다.




1. 다음 페이지로 가서 다운을 받습니다.

https://jenkins.io/





2. 다운받은 파일의 압축을 풀고 jenkins.msi를 실행합니다.





3. 설치가 완료되면 다음과 같은 페이지가 나타납니다.





4. 위에 명시된 경로로 가서 해당파일을 열어 비밀번호를 복사해줍니다.





5. 붙여넣기를 하고 continue 버튼을 눌러줍니다.





6. 그러면 다음과 같이 플러그인을 설치하라고 나오는데


좌측은 추천 플러그인 설치이고, 


우측은 원하는 플러그인을 선택해서 설치하는 것입니다.





7. 저는 추천 플러그인으로 설치하였습니다. 


그러면 다음처럼 플러그인이 설치됩니다.





8. 플러그인 설치가 완료되면 계정을 생성하라고 합니다.


원하는 계정을 만드시면 됩니다. 





9. 완료되었습니다.





10. Start using Jenkins 버튼을 눌러주면 (또는 http://localhost:8080) 젠킨스 페이지로 이동합니다.


참고로 저는 로컬에 설치했으므로 url이 localhost입니다. 





설치가 다 되었으니, 새 작업을 만들어봐야겠네요.


다 되면 추가 포스팅 올리겠습니다.


도움 되셨길 바랍니다.

'게임 프로그래밍 > 기타' 카테고리의 다른 글

[IOS] Agreements Message  (1) 2018.08.15
[기타] 젠킨스 유니티 빌드 설정하기  (0) 2018.03.13
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

[ Xcode ] 실행중인 디바이스 알아오기



IPhone X 해상도 대응을 하려고 하는데, 


현재 실행중인 디바이스가 IPhoneX인지 알아야 돼서 구글링을 했습니다.

( https://stackoverflow.com/questions/46192280/detect-if-the-device-is-iphone-x )


가장 쉬운 방법은 스크린 사이즈의 높이값을 이용한 것이었습니다.



( https://i.stack.imgur.com )


위 표를 이용하여 높이값을 찾으면 되겠습니다.





위 링크에 더 자세한 내용있으니 참고하시면 될것 같습니다.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

[Unity3D] Mac 에셋번들(asset bundle) 오류


Mac에서 에셋번들(asset bundle)을 만들고 파일질라(FileZila)를 통해서 업로드를 했는데


Error while downloading Asset Bundle: Failed to decompress data for the Assetbundle.. 


이런 오류가 나타났습니다.




잘 사용하고 있었던건데 금일 수정한것 때문에 그런것인지 당황했네요.


검색을 조금해보니 전송유형이 문제였습니다.


전송유형이 자동으로 되어있었습니다.



해결을 위해 전송유형을 바이너리(Binary)로 변경해주시면 됩니다.




쉽게 해결될 일이었는데 시간을 많이 소비했네요.


Error while downloading Asset Bundle: Failed to decompress... 


이런 문제로 당황스러운 분들은 참고하시면 좋을 것 같습니다.


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

[Unity3D] 안드로이드 플러그인 만들기(안드로이드 스튜디오 2.3.3)


build.gradle

 


기존 포스팅에서 안드로이드 스튜이도 2.1.1로 플러그인을 만들었는데,

 

안드로이드 스튜디오가 업데이트 되면서 release 폴더가 안생기는 문제가 있었습니다.

 

그래서 많은 분들이 댓글을 달아주셨는데, 이제서야 포스팅을 하네요.

 

간략하게 쓰도록 하겠습니다. (순서 이미지는 다 있습니다.)

 

잘 안되시는 분들은 기존 포스팅 참고 하시면 수월하십니다.

 

 

안드로이드 스튜디오(Android Studio)를 실행하여 New Proejct를 하고,

 

Application name과 Company domain을 써줍니다.

 

실제 사용은 하지 않을 클래스 입니다. 아무거나 치셔도 됩니다. 그리고 Next를 눌러줍니다.

 

 

 

Phone과 Tablet에서 사용할 예정이니 그대로 Next를 눌러줍니다.

 

 

 

그리고 Empty Activity를 선택하고 Next를 눌러줍니다.

 

 

아래 체크 박스들은 쓸 일이 없으므로, 체크 해제 해주시고,

 

Activity Name도 그냥 두시기 바랍니다. (사용하지 않습니다)

 

그리고 Next를 눌러줍니다.

 

 

완료되었으면, 이제 File->New Module을 눌러줍니다.

 

 

 

기존에는 프로젝트 생성해서 바로 했지만, 이제 모듈을 추가해서 할 예정입니다.

 

Android Library를 선택하고 Next를 눌러줍니다.

 

 

 

라이브러리 이름을 작성하시고 Finish를 눌러줍니다.

 

 

 

방금 만든 모듈 루트에서 마우스 오른쪽을 눌러

 

Open Module Settings를 눌러줍니다.

 

UnityActivity를 사용하기 위해, Unity에 있는 classes.jar를 추가할 것입니다.

 

 

 

방금 만든 모듈이 선택되어있는지 재 확인 하시고,

 

Dependenceis로 가서 + 버튼을 누른 후 Jar dependency를 눌러줍니다.

 

 

 

현재 저는 Unity 5.3를 사용중입니다.(classes.jar 파일의 경로가 예전 버전과 달라졌습니다.)

 

만약 해당 파일이 존재하지 않는다면(예전 버전이라면)

 

이전 포스팅을 참고해주세요.

 

classes.jar 파일을 복사해서, 다음 경로(바로 윗 단계에서 경로 확인가능)에 붙여넣기 해줍니다.

 

 

 

넣어주고 다음 화면으로 돌아오면,  아래 이미지처럼 jar파일이 들어간 것을 확인할 수 있습니다.

 

 

 

확인을 눌러주시고, 좀전에 만든 모듈의 다음 패키지에서

 

마우스 오른쪽을 눌러 새로운 Java Class를 만들어 줍니다.

 

 

 

이름은 MyPluginActivity로 하겠습니다. 그리고 확인을 눌러줍니다.

 

 

 

거의 완료가 되었습니다.

 

테스트 할 수 있도록 몇개의 함수를 만들어 줍니다.

 

 

 

 

그리고 좌측에 Gradle을 통해 jar파일을 만들 예정입니다.

 

myplugin 모듈 이름이 써있는 build.gradle을 더블클릭해서

 

스크립트를 열어줍니다.

 

다음은 몇가지를 추가하여 작성한 파일입니다.

 

 

 

위 스크립트 내용입니다.

apply plugin: 'com.android.library'

android {
compileSdkVersion 26
buildToolsVersion "26.0.0"
publishNonDefault true
defaultConfig {
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
testCompile 'junit:junit:4.12'
compile files('libs/classes.jar')
}

task deleteObjectJar(type: Delete){
delete 'release/AndroidPlugin.jar'
}

task exportJar(type: Copy){
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
rename('classes.jar', 'AndroidPlugin.jar')
}

exportJar.dependsOn(deleteObjectJar, build)

 

 

다 작성하였으면 Build->Clean Project를 한번 해줍니다.

 

 

 

그리고 안드로이드 스튜디오 우측에 있는 Gradle을 눌러

 

myplugin->Tasks->other->exportJar를 더블클릭해줍니다.

 

 

 

그러면 다음처럼 프로젝트 폴더 release쪽에 jar파일이 나온것을 확인할 수 있습니다.

 

 

도움되셨길 바랍니다.

 

질문은 댓글 달아주세요^^

 


******************* 추가 *****************

Plugin 모듈을 추가 하셨는데, 그 모듈의 gradle 파일을 첨부하였습니다.


모듈 gradle을 설정하고, 이를 실행시켜야 release 폴더가 나옵니다.


프로젝트 만들 때 지정한 그 프로젝트가 아니라, 


추가한 모듈입니다. 이점 헷갈리시지 마세요.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


[엑셀] 문자열 비교하기

Office 2016 기준




다음과 같은 조건이 있습니다.


"만약 이름이 홍길동 이면 TRUE, 그렇지 않으면 FALSE"


IF문처럼 보이지만, 문자열 비교는 IF가 아닌 EXACT 함수를 사용해야 합니다.


레퍼런스 : 링크



설명


두 텍스트 문자열을 비교하여 정확히 같으면 TRUE를 반환하고 그렇지 않으면 FALSE를 반환합니다. 


EXACT 대/소문자를 구분하지만 서식 차이는 무시합니다.


포멧 => EXACT( 문자열1, 문자열2)




다음처럼 데이터가 있을 때 홍길동을 찾기 위해서는 다음과 같은 수식을 써주면 됩니다.


=EXACT(A1, "홍길동")





그러면 TRUE 또는 FALSE를 반환합니다.


여기에서는 A2가 홍길동이므로 TRUE를 반환합니다.





좀 더 나아가 IF와 조합하여 사용할 수 있습니다.


IF 포스팅 클릭


만약 조건이 TRUE이면 1을, FALSE는 0으로 설정하도록 하겠습니다.


= IF(EXACT(A2, "홍길동", 1, 0 )






그리고 설정하고자 하는 셀들을 선택해 쭉 내려주면


모두 적용됩니다.





엑셀 문자열 비교할 때는 IF가 아닌 EXACT라는것만


주의하시면 됩니다.



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


North Korea's rocket engine test: World will 'soon witness' significance


* witness : (사건, 사고를) 목격하다

* significance : 중요성


By Lionel Lim and Taehoon Lee, CNN

Updated 1152 GMT (1952 HKT) March 19, 2017

Link : http://edition.cnn.com/2017/03/19/asia/north-korea-high-thrust-engine-test/index.html



Seoul, South Korea (CNN) - North Korean leader Kim Jong Un oversaw the test of a new high-thrust engine seen as a "great leap forward" for the country's rocket industry, state media reported Sunday.

* oversee : (작업, 활동이 제대로 이뤄지는지) 감독하다

* thrust : (거칠게)밀다, 밀치다, 찌르다, 추진력


The test measured the thrust power in the combustion chamber, the structural safety and reliability of the engine, and the movement of the turbine pump, state-owned Korean Central News Agency reported.

* combustion : 불이탐, 연소

* chamber : -실(室)

* combustion chamber : 연소실


It took place at the Sohae Satellite Launching Ground, in North Pyongpan Province, it said.


'Historic significance'


State media said the test was successful and marked an event of "historic significance" that could lead to the rebirth of the country's indigenous rocket industry.


Kim emphasized the whole world would "soon witness what eventful significance the great victory won today carries," KCNA reported.


The announcement came hours before US Secretary of State Rex Tillerson met with President Xi Jingping of China -- North Korea's only major global ally -- in Beijing.


Although neither side brought up the subject publicly, Tillerson was expected to raise the prospect of financial penalties on Chinese companies and banks that do business with North Korea.

* prospect : 가망[가능성]


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


[엑셀] 텍스트 나누기

Office 2013 기준




다음과 같은 텍스트가 메모장에 있습니다.


안녕하세요|반갑습니다|즐겁습니다|행복합니다


1. 엑셀을 열고 A1에 붙여줍니다.




2. 메뉴에서 데이터 -> 텍스트 나누기를 눌러줍니다.





3. 구분 기호로 분리됨을 선택하고 다음을 눌러줍니다.





4. 기타를 체크하고, 구분자를 설정합니다. 


여기에서는 | 입니다.


그리고 마침을 눌러줍니다.





5. 완료. 텍스트가 분리되어 각 셀에 들어갔습니다.





336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


[알고리즘] 이진트리(Binary Tree)

* 리스트 구현


1. 이진 트리(binary tree)란 한 노드가 최대 두 개의 자식 노드를 가지는 트리를 뜻한다. 보통 첫 번째 노드를 부모 노드라고 하며 자식 노드는 왼쪽(left)과 오른쪽(right)으로 불린다. 이진 트리는 이진 탐색 트리 이진 힙의 구현에 흔히 쓰인다.( Wiki )


From : http://www.silverwolf.co.kr/algorithm/4810



2. 순회

- 연결 리스트와 1차원 배열과 같은 선형 자료 구조에서는 한 가지의 논리적인 순회 방법만이 존재하지만, 

트리 구조의 순회에는 많은 방법이 존재한다. 

이진 트리의 루트 노드에서 시작해서, 세 가지 주요 단계를 거치며 순회를 진행하는데, 

그 단계에는 현재 노드를 방문하는 것, 

왼쪽 자식 노들 순회하는 것과 오른쪽 자식 노드를 순회하는 것이 있다. 이러한 과정은 재귀로 쉽게 설명할 수 있다.(Wiki)


* Images are from Wiki

A. 전위순회

- 노드 방문 -> 왼쪽 서브 트리를 전위 순회 -> 오른쪽 서브 트리를 전위 순회




B. 중위순회

- 왼쪽 서브 트리를 중위 순회 ->노드 방문 -> 오른쪽 서브 트리를 중위 순회



C. 후위순회

- 왼쪽 서브 트리를 후위 순회 -> 오른쪽 서브 트리를 후위 순회 -> 노드 방문




< BT.h >

#pragma once

typedef int BTData;

typedef struct _bTreeNode
{
	_bTreeNode *left;
	_bTreeNode *right;

	BTData data;
} BTreeNode;

// 노드(트리) 생성
BTreeNode* MakeBTreeNode( void );
// 데이터 반환
BTData GetData( BTreeNode *bt );
// 데이터 설정
void SetData( BTreeNode *bt, BTData data );
// 왼쪽 자식 얻기
BTreeNode* GetLeftSubTree( BTreeNode *bt );
// 오른쪽 자식 얻기
BTreeNode* GetRightSubTree( BTreeNode *bt );
// 왼쪽 자식 설정
void MakeLeftSubTree( BTreeNode *main, BTreeNode *sub );
// 오른쪽 자식 설정
void MakeRightSubTree( BTreeNode *main, BTreeNode *sub );
// 방문시 행할 함수포인터
typedef void VisitFuncPtr( BTData data );
// 전위 순회
void PreorderTraverse( BTreeNode *bt, VisitFuncPtr action );
// 중위 순회
void InorderTrasverse( BTreeNode *bt, VisitFuncPtr action );
// 후위 순회
void PostorderTraverse( BTreeNode *bt, VisitFuncPtr action );
// 트리 삭제
void DeleteTree( BTreeNode *bt );



< BT.cpp >

#include "BT.h"
#include 


BTreeNode* MakeBTreeNode( void )
{
	BTreeNode *node = (BTreeNode*)malloc( sizeof( BTreeNode ) );
	node->left = nullptr;
	node->right = nullptr;
	node->data = 0;

	return node;
}

BTData GetData( BTreeNode *bt )
{
	if ( bt == nullptr ) return -1;

	return bt->data;
}

void SetData( BTreeNode *bt, BTData data )
{
	if ( bt == nullptr ) return;

	bt->data = data;
}

BTreeNode* GetLeftSubTree( BTreeNode *bt )
{
	if ( bt == nullptr ) return nullptr;

	return bt->left;
}

BTreeNode* GetRightSubTree( BTreeNode *bt )
{
	if ( bt == nullptr ) return nullptr;

	return bt->right;
}
/// free하는 노드의 자식들이 있으면 메모리 누수남!
void MakeLeftSubTree( BTreeNode *main, BTreeNode *sub )
{
	if ( main == nullptr ) return;

	/// 이렇게 하면 메모리 누수
	//if ( main->left != nullptr )
	//	free( main->left );
	if ( main->left != nullptr )
		DeleteTree( main->left );

	main->left = sub;
}

void MakeRightSubTree( BTreeNode *main, BTreeNode *sub )
{
	if ( main == nullptr ) return;
	
	/// 이렇게 하면 메모리 누수
	//if ( main->right != nullptr )
	//	free( main->right );
	if ( main->right != nullptr )
		DeleteTree( main->right );

	main->right = sub;
}

void PreorderTraverse( BTreeNode *bt, VisitFuncPtr action )
{
	if ( bt == nullptr )
		return;

	action( bt->data );
	PreorderTraverse( bt->left, action );
	PreorderTraverse( bt->right, action );
}

void InorderTrasverse( BTreeNode *bt, VisitFuncPtr action )
{
	if ( bt == nullptr )
		return;

	InorderTrasverse( bt->left, action );
	action( bt->data );
	InorderTrasverse( bt->right, action );
}

void PostorderTraverse( BTreeNode *bt, VisitFuncPtr action )
{
	if ( bt == nullptr )
		return;

	PostorderTraverse( bt->left, action );
	PostorderTraverse( bt->right, action );
	action( bt->data );
}

void DeleteTree( BTreeNode *bt )
{
	if ( bt == nullptr )
		return;

	DeleteTree( bt->left );
	DeleteTree( bt->right );
	free( bt );
}



< BTMain.cpp >

#include "BT.h"
#include 

//void InorderTraverse( BTreeNode *bt )
//{
//	if ( bt == nullptr )
//		return;
//
//	InorderTraverse( bt->left );
//	printf( "%d \n", bt->data );
//	InorderTraverse( bt->right );
//}
//
//void PreorderTraverse( BTreeNode *bt )
//{
//	if ( bt == nullptr )
//		return;
//
//	printf( "%d \n", bt->data );
//	PreorderTraverse( bt->left );
//	PreorderTraverse( bt->right );
//}
//
//void PostorderTraverse( BTreeNode *bt )
//{
//	if ( bt == nullptr )
//		return;
//
//	PostorderTraverse( bt->left );
//	PostorderTraverse( bt->right );
//	printf( "%d \n", bt->data );
//}

void ShowIntData( int data );

int main( void )
{
	BTreeNode *bt1 = MakeBTreeNode();
	BTreeNode *bt2 = MakeBTreeNode();
	BTreeNode *bt3 = MakeBTreeNode();
	BTreeNode *bt4 = MakeBTreeNode();
	BTreeNode *bt5 = MakeBTreeNode();
	BTreeNode *bt6 = MakeBTreeNode();

	SetData( bt1, 1 );
	SetData( bt2, 2 );
	SetData( bt3, 3 );
	SetData( bt4, 4 );
	SetData( bt5, 4 );
	SetData( bt6, 4 );

	MakeLeftSubTree( bt1, bt2 );
	MakeRightSubTree( bt1, bt3 );
	MakeLeftSubTree( bt2, bt4 );
	MakeRightSubTree( bt2, bt5 );
	MakeRightSubTree( bt3, bt6 );

	PreorderTraverse( bt1, ShowIntData );
	printf( "\n" );
	InorderTrasverse( bt1, ShowIntData );
	printf( "\n" );
	PostorderTraverse( bt1, ShowIntData );

	DeleteTree( bt1 );

	return 0;
}

void ShowIntData( int data )
{
	printf( "%d ", data );
}


From : 열혈 C 자료구조

+ Recent posts