cocos2d-x template 선택후 실행시에 발생한 자바스크립트 오류

게임개발/cocos2d-x 2013. 5. 28. 00:47


VS 2010 에서 

cocos2d-x template 선택후 실행시에 발생한 자바스크립트 오류 해결 방안


=> VS 2010 언어 설정을 한국어에서 영어로 변경 필요

=> 한국어 설정된 상태에서 install_xx_msvc.bat 실행시에, 언어 코드를 인식하지 못해서 디폴트인 VS 2010 Express 로 인식되어 설치되는 듯 함

:

오라클 cursor 반환

SQL/Oracle 2013. 4. 11. 17:35

 

ORACLE REF CURSOR 와 SYS_REFCURSOR 차이.

http://nephrolepis.tistory.com/entry/ORACLE-REF-CURSOR-%EC%99%80-SYSREFCURSOR-%EC%B0%A8%EC%9D%B4

 

 

REF CURSOR 예제 에서 아래 링크 페이지들 참조

http://msdn.microsoft.com/ko-kr/library/4s2zbbsz.aspx

 

:

영문폰트 설정시에 연결된 한글 폰트 바꾸기

Windows 2013. 4. 10. 14:12

 

 

http://systembus.com/xe/board33/1118

 

 

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink

Consolas        "malgun.ttf,맑은 고딕"

 

:

studiostyl.es, Visual Studio 폰트 색상 셋팅 변경하기 좋은 파일이 많은 사이트

Visual Studio 2013. 4. 9. 14:57

 

http://studiostyl.es/

 

http://sshioi.tistory.com/51

http://blog.naver.com/baek2187?Redirect=Log&logNo=150147832233

:

BAT 파일 명령어

Windows 2013. 4. 3. 18:27

 

http://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/dosbatch.html

 

부록 G. 도스(DOS) 배치 파일을 쉘 스크립트로 변환

아주 많은 프로그래머들은 PC 위에서 도는 도스에서 스크립트를 배웠습니다. 기능이 조금 떨어지는 도스 배치 파일 언어로도 꽤 강력한 스크립트나 어플리케이션을 작성할 수도 있지만 그렇게 하려면 아주 해박한 지식을 사용해 해결책을 찾거나 꽁수를 부려야 합니다. 가끔은 오래된 도스용 배치 파일을 유닉스 쉘 스크립트로 변환해서 써야될 경우가 생기지만 이렇게 하는것이 그렇게 어렵지만은 않습니다. 왜냐하면 도스 배치 파일 연산자들이 기능이 동일한 쉘 스크립트 연산자의 서브셋에 불과하기 때문입니다.

표 G-1. 배치 파일 키워드/변수/연산자 와 그에 해당하는 쉘 동의어

배치 파일 연산자 쉘 스크립트 동의어
% $ 명령어줄 매개변수 접두사
/ - 명령어 옵션 플래그
\ / 디렉토리 패스 구분자
== = (같음) 문자열 비교 테스트
!==! != (다름) 문자열 비교 테스트
| | 파이프
@ set +v 현재 명령어를 에코하지 말 것
* * 파일명 "와일드 카드"
> > 파일 재지향(덮어 쓰기)
>> >> 파일 재지향(덧붙여 쓰기)
< < 표준입력 재지향
%VAR% $VAR 환경 변수
REM # 주석
NOT ! 뒤에 나오는 테스트 부정
NUL /dev/null 명령어 출력을 없애기 위한 "블랙홀"
ECHO echo 에코 (Bash 에는 옵션이 많이 있음)
ECHO. echo 빈 줄 에코
ECHO OFF set +v 다음에 나오는 명령어를 에코하지 말 것
FOR %%VAR IN (LIST) DO for var in [list]; do "for" 루프
:LABEL 없음 (필요치 않음) 라벨
GOTO 없음 (대신 함수를 씀) 스크립트의 다른 곳으로 건너 뜀
PAUSE sleep 일정 간격을 두고 잠시 대기
CHOICE case 나 select 메뉴 선택
IF if if-test
IF EXIST FILENAME if [ -e filename ] 파일이 존재하는지 확인
IF !%N==! if [ -z "$N" ] 변경가능한 매개변수인 "N"이 없다면
CALL source 나 . (도트 연산자) 다른 스크립트를 "포함"
COMMAND /C source 나 . (도트 연산자) 다른 스크립트를 "포함"(CALL과 동일)
SET export 환경 변수를 세트
SHIFT shift 명령어줄 변수 목록을 왼쪽으로 이동(shift)
SGN -lt or -gt (정수) 부호(sign)
ERRORLEVEL $? 종료 상태
CON stdin "콘솔"(표준입력)
PRN /dev/lp0 (일반적인) 프린터 디바이스
LP1 /dev/lp0 첫번째 프린터 디바이스
COM1 /dev/ttyS0 첫번째 시리얼 포트

배치 파일은 대개 도스 명령어를 갖고 있습니다. 도스용 배치 파일이 쉘 스크립트로 변환되기 위해서는 이 명령어들은 꼭 동일한 유닉스 명령어로 변환되어야 합니다.

표 G-2. 도스 명령어와 동일한 유닉스 명령어

도스 명령어 동일한 유닉스 명령어 효과
ASSIGN ln 파일이나 디렉토리를 링크
ATTRIB chmod 파일 퍼미션 변경
CD cd 디렉토리 변경
CHDIR cd 디렉토리 변경
CLS clear 스크린 지우기
COMP cmp or diff 파일 비교
COPY cp 파일 복사
Ctl-C Ctl-C 정지(시그널)
Ctl-Z Ctl-D EOF (end-of-file)
DEL rm 파일 삭제
DELTREE rm -rf 디렉토리의 하위 디렉토리까지 포함해서 삭제
DIR ls -l 디렉토리 보이기
ERASE rm 파일 삭제
EXIT exit 현재 프로세스 종료
FC comm, cmp 파일 비교
FIND grep 파일안에서 문자열 찾기
MD mkdir 디렉토리 생성
MKDIR mkdir 디렉토리 생성
MORE more 텍스트 파일 쪽단위(paging) 필터
MOVE mv 이동
PATH $PATH 실행파일들의 경로
REN mv 이름 바꾸기(이동)
RENAME mv 이름 바꾸기(이동)
RD rmdir 디렉토리 삭제
RMDIR rmdir 디렉토리 삭제
SORT sort 파일 정렬
TIME date 시스템 시간 보여주기
TYPE cat 파일을 표준출력으로 출력
XCOPY cp (확장) 파일 복사

참고: 사실 모든 유닉스, 쉘 연산자, 명령어들은 그들과 동일한 도스용보다 많은 옵션과 강력한 기능을 갖고 있습니다. 많은 배치 파일 스크립트들은 read의 불완전한 버전인 ask.com같은 외부 유틸리티에 의존합니다.

도스는 파일명 와일드 카드 확장에 대해서 오직 *? 문자만을 인식하는 제한되고 부족한 서브셋을 지원합니다.

도스 배치 파일을 쉘 스크립트로 변환하는 것은 일반적으로 매우 간단하고 가끔은 변환된 쉘 스크립트가 원래 도스 배치 파일보다 더 이해하기 쉬운 경우도 있습니다.

예 G-1. VIEWDATA.BAT: 도스용 배치 파일

REM VIEWDATA

REM PAUL SOMERSON의 "DOS POWERTOOLS"의 예제에서 영감을 받아 작성


@ECHO OFF

IF !%1==! GOTO VIEWDATA
REM  명령어줄 인자가 없다면...
FIND "%1" C:\BOZO\BOOKLIST.TXT
GOTO EXIT0
REM  문자열이 일치하는 줄을 출력후 종료.

:VIEWDATA
TYPE C:\BOZO\BOOKLIST.TXT | MORE
REM  한 번에 한 쪽씩 전체 파일을 보여줌.

:EXIT0

스크립트 변환을 하면 기능이 다소 개량됩니다.

예 G-2. viewdata.sh: VIEWDATA.BAT 의 스크립트 버전

#!/bin/bash
# VIEWDATA.BAT 를 쉘 스크립트로 변환.

DATAFILE=/home/bozo/datafiles/book-collection.data
ARGNO=1

# @ECHO OFF       여기서 이 명령어는 필요없습니다.

if [ $# -lt "$ARGNO" ]    # IF !%1==! GOTO VIEWDATA
then
  less $DATAFILE          # TYPE C:\MYDIR\BOOKLIST.TXT | MORE
else
  grep "$1" $DATAFILE     # FIND "%1" C:\MYDIR\BOOKLIST.TXT
fi  

exit 0                    # :EXIT0

# GOTO, 라벨, 속임수, 엉터리 구문등이 필요없어졌죠.
# 원래 배치 파일보다 더 짧고, 더 쉽고, 더 깔끔합니다.

Ted Davis 의 Shell Scripts on the PC 사이트에서는 구식 배치 파일 프로그래밍에 대한 포괄적인 튜토리얼을 소개하고 있습니다. 생각건대, 그의 독창적인 몇몇 테크닉들은 쉘 스크립트와 연관성이 있습니다.

:

CMD 명령어 정리

Windows 2013. 4. 3. 17:55

 

 

출처: http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=110&docId=163769414&qb=d21pYw==&enc=utf8&section=kin&rank=1&search_sort=0&spq=0

 

 

CMD의 내부 명령어는 아래와 같습니다.

그중에서 많이 쓰이는 명령어는 굵게 표시해드릴께요.

******************************************************************************

ASSOC 파일 확장명 연결을 보여주거나 수정합니다.
ATTRIB 파일 속성을 표시하거나 바꿉니다.
BREAK 확장된 CTRL+C 검사를 설정하거나 지웁니다.
BCDEDIT 부팅 로딩을 제어하기 위해 부팅 데이터베이스에서 속성을 설정합니다.
CACLS 파일의 액세스 컨트롤 목록(ACL)을 표시하거나 수정합니다.
CALL 한 일괄 프로그램에서 다른 일괄 프로그램을 호출합니다.
CD 현재 디렉터리 이름을 보여주거나 바꿉니다.
CHCP 활성화된 코드 페이지의 번호를 표시하거나 설정합니다.
CHDIR 현재 디렉터리 이름을 보여주거나 바꿉니다.
CHKDSK 디스크를 검사하고 상태 보고서를 표시합니다.
CHKNTFS 부팅하는 동안 디스크 확인을 화면에 표시하거나 변경합니다.
CLS 화면을 지웁니다.
CMD Windows 명령 인터프리터의 새 인스턴스를 시작합니다.
COLOR 콘솔의 기본색과 배경색을 설정합니다.
COMP 두 개 또는 여러 개의 파일을 비교합니다.
COMPACT NTFS 분할 영역에 있는 파일의 압축을 표시하거나 변경합니다.
CONVERT FAT 볼륨을 NTFS로 변환합니다. 현재 드라이브는 변환할 수 없습니다.
COPY 하나 이상의 파일을 다른 위치로 복사합니다.
DATE 날짜를 보여주거나 설정합니다.
DEL 하나 이상의 파일을 지웁니다.
DIR 디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.
DISKCOMP 두 플로피 디스크의 내용을 비교합니다.
DISKCOPY 플로피 디스크의 내용을 다른 플로피 디스크로 복사합니다.
DISKPART 디스크 파티션 속성을 표시하거나 구성합니다.
DOSKEY 명령줄을 편집하고, Windows 명령을 다시 호출하고, 매크로를 만듭니다.
DRIVERQUERY 현재 장치 드라이버 상태와 속성을 표시합니다.
ECHO 메시지를 표시하거나 ECHO를 사용 또는 사용하지 않습니다.
ENDLOCAL 배치 파일에서 환경 변경의 지역화를 끝냅니다.
ERASE 하나 이상의 파일을 지웁니다.
EXIT CMD.EXE 프로그램(명령 인터프리터)을 마칩니다.
FC 두 파일 또는 파일의 집합을 비교하여 다른 점을 표시합니다.
FIND 파일에서 텍스트 문자열을 찾습니다.
FINDSTR 파일에서 문자열을 찾습니다.
FOR 파일 집합에서 각 파일에 대해 지정된 명령을 실행합니다.
FORMAT Windows에서 사용할 디스크를 포맷합니다.
FSUTIL 파일 시스템 속성을 표시하거나 구성합니다.
FTYPE 파일 확장 연결에 사용되는 파일 형식을 표시하거나 수정합니다.
GOTO Windows 명령 인터프리터가 일괄 프로그램에서 이름표가 붙여진 줄로 이동합니다.
GPRESULT 컴퓨터 또는 사용자에 대한 그룹 정책 정보를 표시합니다.
GRAFTABL Windows가 그래픽 모드에서 확장 문자 세트를 표시할 수 있게 합니다.
HELP Windows 명령어에 관한 도움말을 제공합니다.
ICACLS 파일과 디렉터리에 대한 ACL을 표시, 수정, 백업 또는 복원합니다.
IF 일괄 프로그램에서 조건 처리를 수행합니다.
LABEL 디스크의 볼륨 이름을 만들거나, 바꾸거나, 지웁니다.
MD 디렉터리를 만듭니다.
MKDIR 디렉터리를 만듭니다.
MKLINK 기호화된 링크와 하드 링크를 만듭니다.
MODE 시스템 장치를 구성합니다.
MORE 출력을 한번에 한 화면씩 표시합니다.
MOVE 하나 이상의 파일을 한 디렉터리에서 다른 디렉터리로 옮깁니다.
OPENFILES 파일 공유에서 원격 사용자에 의해 열린 파일을 표시합니다.
PATH 실행 파일의 찾기 경로를 보여주거나 설정합니다.
PAUSE 배치 파일의 처리를 보류하고 메시지를 보여줍니다.
POPD PUSHD 명령으로 저장된 디렉터리로 바꿉니다.
PRINT 텍스트 파일을 인쇄합니다.
PROMPT Windows 명령 프롬프트를 바꿉니다.
PUSHD 현재 디렉터리를 저장한 후 디렉터리를 바꿉니다.
RD 디렉터리를 지웁니다.
RECOVER 불량이거나 결함이 있는 디스크에서 읽을 수 있는 정보를 복구합니다.
REM 배치 파일 또는 CONFIG.SYS에서 주석을 기록합니다.
REN 파일 이름을 바꿉니다.
RENAME 파일 이름을 바꿉니다.
REPLACE 파일을 대체합니다.
RMDIR 디렉터리를 지웁니다.
ROBOCOPY 파일과 디렉터리 트리를 복사할 수 있는 고급 유틸리티입니다.
SET Windows 환경 변수를 보여주거나, 설정하거나, 지웁니다.
SETLOCAL 배치 파일에서 환경 변경의 지역화를 시작합니다.
SC 서비스를 표시하거나 구성합니다(백그라운드 작업).
SCHTASKS 컴퓨터에서 실행할 명령과 프로그램을 예약합니다.
SHIFT 배치 파일에서 바꿀 수 있는 매개 변수의 위치를 바꿉니다.
SHUTDOWN 컴퓨터의 로컬 또는 원격 종료를 허용합니다.
SORT 입력을 정렬합니다.
START 지정된 프로그램이나 명령을 별도의 창에서 시작합니다.
SUBST 경로를 드라이브 문자로 지정합니다.
SYSTEMINFO 특정 컴퓨터의 속성과 구성을 표시합니다.
TASKLIST 서비스를 포함한 실행 중인 모든 작업을 표시합니다.
TASKKILL 실행 중인 프로세스나 응용 프로그램을 중지합니다.
TIME 시스템 시간을 보여주거나 설정합니다.
TITLE CMD.EXE 세션에 대한 창의 창 제목을 설정합니다.
TREE 드라이브 또는 경로의 디렉터리 구조를 그래픽으로 화면에 표시합니다.
TYPE 텍스트 파일의 내용을 보여줍니다.
VER Windows 버전을 보여줍니다.
VERIFY 파일이 디스크에 올바로 쓰였는지 검증할지 여부를 지정합니다.
VOL 디스크 볼륨 이름과 일련 번호를 보여줍니다.
XCOPY 파일과 디렉터리 트리를 복사합니다.
WMIC 대화형 명령 셸 내의 WMI 정보를 표시합니다.

******************************************************************************

내부 명령어의 간단한 설명은 되었다고 보구요,

내부 명령어 외에 {외부 명령어}는 해당 명령어가 exe, com형태의 파일로 있어야 합니다.

(ex. mouse.exe, edit.com 등)

예를들어 {이동식 디스크 E:\} 의 {NN.exe}를 실행하고 싶다면

확장자가 exe, bat, com 인 파일들은 {파일명}만 입력하면 실행이 됩니다.

굳이 확장자까지 포함하여 {nn.exe}라고 입력해도 됩니다.

/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-

참고로 CMD는 윈도우상에서 실행되기 때문에, 윈도우에서 실행가능한 파일은 CMD에서 열면

윈도우에서 실행이 됩니다.

예를들어 워드문서(*.DOC) 파일을 위와 같은 방법으로 열면

윈도우상에서 '워드'가 실행되면서 문서가 열립니다.

당연히 윈도우의 CMD 상태에서만 가능하며

순수한 도스로 부팅했을 경우엔 불가능합니다.

(도스에서는 도스전용 워드뷰어를 이용하여 불러와야 합니다.)

/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-/*/-

기본적으로 CMD에서 {폴더(디렉토리)}를 이동하는 경우엔 세가지 방법이 있습니다.

첫번째. {CD..}를 입력하면 한단계 위의 디렉토리로 이동합니다.

두번째. {CD\}를 입력하면 해당 드라이브의 최상위로 이동합니다.

세번째. {CD 경로명}을 직접 입력해주면 됩니다. (ex. cd c:\windows\system32)

명령어는 위에서와같이 너무 많기 때문에 님이 원하는 명령어에 대해서 직접 찾아보면

자세히 알 수 있습니다.

:

오라클 날짜계산

SQL/Oracle 2013. 3. 18. 14:33

 

오라클 날짜계산

** 날짜계산

-- '2011-01-20' 과 당일 사이의 달의 수를 NUMBER형 타입으로 반환
-- MONTHS_BETWEEN(A,B) = A-B/30
SELECT MONTHS_BETWEEN(SYSDATE,TO_DATE('2011-01-20','YYYY-MM-DD')) FROM DUAL;


-- 특정일의 달수 더한 날
SELECT ADD_MONTHS(SYSDATE, 10) FROM DUAL;


-- 특정일의 다음주 요일
SELECT NEXT_DAY(SYSDATE,'FRIDAY') FROM DUAL;


-- 특정일의 해당 월의 마지막 날
SELECT LAST_DAY(SYSDATE) FROM DUAL;

-- 특정일의 반올림(오후면 다음날..)
SELECT ROUND(SYSDATE,'DD') FROM DUAL;

-- 특정일의 전주 토요일(해당 전주의 마지막 날)에해당하는 날짜
SELECT TRUNC(SYSDATE,'WW') FROM DUAL;

-- 특정일의 주 일요일(해당 주의 첫째 날)에해당하는 날짜
SELECT TRUNC(SYSDATE,'D') FROM DUAL;


** WHERE 조건에 날짜칼럼을 기준으로 함.
/* 어제 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE - 1) AND TRUNC(SYSDATE - 1) + 0.99999421
/* 오늘 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + 0.99999421
/* 내일 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE + 1) AND TRUNC(SYSDATE + 1) + 0.99999421
/* 금주 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE + 1) - TO_CHAR(SYSDATE, 'D') AND TRUNC(SYSDATE + 1) - TO_CHAR(SYSDATE, 'D') + 6.99999421
/* 다음주 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE + 8) - TO_CHAR(SYSDATE, 'D') AND TRUNC(TRUNC(SYSDATE) + 14.99999421) - TO_CHAR(SYSDATE, 'D')
/* 금월 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE + 1) - TO_CHAR(SYSDATE, 'DD') AND TRUNC(LAST_DAY(SYSDATE)) + 0.99999421
/* 전월 */ 날짜칼럼
BETWEEN TRUNC(ADD_MONTHS(SYSDATE, -1) + 1) - TO_CHAR(SYSDATE,'DD') AND TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE, -1))) + 0.99999421
/* 다음달 */ 날짜칼럼
BETWEEN ADD_MONTHS(TRUNC(SYSDATE), 1) - TO_CHAR(SYSDATE, 'DD') + 1 AND LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE), 1) + 0.99999421)


** 특정일 까지의 간격을 년, 개월, 일로 표현하기
SELECT
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20000101', 'YYYYMMDD'))/12) "년",
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20000101', 'YYYYMMDD')) -
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20000101', 'YYYYMMDD'))/12) * 12) "개월",
TRUNC((MONTHS_BETWEEN(SYSDATE,TO_DATE('20000101', 'YYYYMMDD')) -
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20000101', 'YYYYMMDD')))) * 30.5) "일"
FROM DUAL;

** 당월의 주차 구하기..
SELECT
'20000101' AS "날짜", CEIL((TO_NUMBER(SUBSTRB('20000101', -2, 2)) + 7 - TO_NUMBER(TO_CHAR(TO_DATE('20000101', 'YYYYMMDD'), 'D'))) / 7) AS "월별 주차"
FROM DUAL;


** 시간 계산 SQL
SELECT TRUNC(TO_DATE('20110101012345', 'YYYYMMDDHH24MISS') - TO_DATE('20110501213344', 'YYYYMMDDHH24MISS')) || ' DAY ' ||
TRUNC(MOD((TO_DATE('20110101012345', 'YYYYMMDDHH24MISS') - TO_DATE('20110501213344', 'YYYYMMDDHH24MISS')), 1) * 24)|| ' HOUR ' ||
TRUNC(MOD((TO_DATE('20110101012345', 'YYYYMMDDHH24MISS') - TO_DATE('20110501213344', 'YYYYMMDDHH24MISS')) * 24, 1) * 60)|| ' MINUTE ' ||
TRUNC(ROUND(MOD((TO_DATE('20110101012345', 'YYYYMMDDHH24MISS') - TO_DATE('20110501213344', 'YYYYMMDDHH24MISS')) * 24 * 60, 1) * 60))|| ' SEC '
" TIME INTERVAL "
FROM DUAL ;

[출처] [ORACLE] 오라클 날짜계산 |작성자 구름나그네

 

 

오라클에서 요일구하기
to_char(날짜, 'd')
ex) select to_char(sysdate, 'd') from dual;
========================================
1 : 일요일
2 : 월요일
3 : 화요일
4 : 수요일
5 : 목요일
6 : 금요일
7 : 토요일
========================================

 

-- Week 값 반환  ---

W: 해당월내에서 몇주인지

WW: 해당년내에서 몇주인지

IW: 1년중에서 몆주인지

 

WW와 IW는 같다

주의사항) W, WW, IW 등 모두가 일요일 시작이 아닌 월요일 시작으로 계산됨

예를 들어,

 

 날짜

요일 

 TO_CHAR('', 'IW')

 20130317

일요일 

 11

 20130318

월요일

 12

때문에, 일요일 시작 Week값을 구하려면 해당 날짜에 + 1 이 필요

TO_CHAR( SYSDATE + 1, 'IW'), TO_CHAR( TO_DATE('20130317', 'YYYYMMDD')  + 1, 'IW')

 

참고로, TO_CHAR( SYSDATE, 'D') 값은 일요일 부터 시작

일:1, 월:2, 화:3, 수:4, 목:5, 금:6, 토:7

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

:

cocos2d-x 설치

게임개발/cocos2d-x 2013. 2. 16. 23:50

How to set up the Android Cocos2D-x development environment on Windows 7

http://cocos2d-x.org/projects/cocos2d-x/wiki/How_to_set_up_the_Android_Cocos2D-x_development_environment_on_Windows_7

http://westwoodforever.blogspot.kr/2012/07/c-cocos2d-x.html

 

준비

  1. Java SE
    1. 다운 및 설치
    2. 환경변수 등록
      1. JAVA_HOME : C:\Program Files\Java\jdk1.7.0
  2. Cygwin
    1. 다운로드
    2. 설치
      1. Devel, Editors 카테고리 선택및 설치
      2. 설치 폴더: C:\cygwin
      3. PATH 추가
        1. C:\cygwin\bin;C:\cygwin\usr\include;
  3. Android SDK 설치
    1. 다운로드
    2. 설치 폴더: C:\Android\adt-bundle-windows-x86_64
    3. SDK Manager 실행 및 SDK 설치
      1. Tools 모두
      2. Android 최신 버전 및 2.3.3 버전
    4. PATH 추가
      1. C:\Android\adt-bundle-windows-x86_64\sdk\platform-tools;C:\Android\adt-bundle-windows-x86_64\sdk\tools;
  4. Android NDK 설치
    1. 다운로드
    2. 설치 폴더: C:\Android\android-ndk
      1. 설치 폴더명을 "android-ndk-r8d-windows" 에서 "android-ndk" 로 변경
  5. CrystaX.net의 커스텀 NDK 설치
    1. 다운로드
    2. 설치 폴더: C:\Android\android-ndk-crystax
      1. "android-ndk-crystax-5.beta3"에서 "android-ndk-crystax"로 변경
    3. Crystax.net의 NDK는 커스터 마이징 된 것이라고 합니다. c++ exceptions, RTTI, Standard c++ Library를 지원하고 c++0x, Objective-C 등도 지원하는 듯 하네요
  6. cocos2d-x 설치
    1. 다운로드
    2. 설치 폴더: D:\Acorun\Develop\Cocos2d-x


개발 환경 설정
  1. cocos2d-x 개발 환경 
    1. create-android-project.bat 파일 편집
      1. D:\Acorun\Develop\Cocos2d-x\cocos2d-2.1beta3-x-2.1.1\create-android-project.bat 파일 편집
      2. 편집 내용
        • set _CYGBIN=c:\cygwin\bin
        • set _ANDROIDTOOLS=C:\Android\adt-bundle-windows-x86_64\sdk\tools
        • set _NDKROOT=C:\Android\android-ndk
      3. 권리자권한-cmd 로 create-android-project.bat 파일 실행
        1. project location 입력, 예: com.acorun.test123
        2. project name 과 target ID 입력, test1, id : 2
        3. test1 폴더 생성 여부 확인
    2. NDK_ROOT 환경 변수 설정
      1. home\<youname>\.bash_profile
        (in this case:C:\cygwin\home\iven\.bash_profile) 폴더를 열어서 파일 끝에 아래과 같은 내용 추가

        NDK_ROOT=/cygdrive/C/Android/android-ndk
        export NDK_ROOT

      2. Cygwin terminal 실행 (C:\cygwi\cygwin.bat)
        1. cd $NDK_ROOT 명령어를 입력해서 경로 확인

 

신규 프로젝트 생성

create-android-project.bat 파일 실행
  1. 권리자권한-cmd 로 create-android-project.bat 파일 실행
    1. D:\Acorun\Develop\Cocos2d-x\cocos2d-2.1beta3-x-2.1.1\create-android-project.bat
  2. project location 입력, 예: com.acorun.test123
  3. project name 과 target ID 입력, test1, id : 2
  4. test1 폴더 생성 여부 확

 

 

신규 프로젝트 빌드

  1. build_native.sh 파일 실행
    1. cygwin termianl 실행
    2. build_native.sh 파일 실행
      1. 경로 이동
        cd /cygdrive/d/Acorun/Develop/Cocos2d-x/cocos2d-2.1beta3-x-2.1.1/test1/proj.android
      2. ./build_native.sh 실행
    3. 만일 실패시에는, 
      http://cocos2d-x.org/projects/cocos2d-x/wiki/How_to_set_up_the_Android_Cocos2D-x_development_environment_on_Windows_7
      에서 Execute the build_native.sh file  내용을 참고하여 추가 조치 필요


Import project to Eclipse

  1. eclipse 실행하여, new/project --> Android Project from Existing Code 를 선택
  2. Root Directory를 cocos2d-x 루트 폴더, D:\Acorun\Develop\Cocos2d-x\cocos2d-2.1beta3-x-2.1.1 로 지정해야 한다.
    주의) Copy projects into workspace 는 절대로 체크하면 안된다!!
  3. Finish
원문내용

Ok, this is almost done! Time to import the project to Eclipse. Now go to Eclipse, create a new project -> Import from existing project.

Important: Do not enable the option “copy projects into workspace”, and the root directory must be under the cocos2d-x installation folder.

After creating the project, you might experience several problems regarding to the @override keyword in front of several functions. To fix this issue, just right click the project on Eclipse -> Properties -> Java Compiler and make sure the compiler compliance is set to 1.6.

 

Build HelloWorld on android x86 platform

http://cocos2d-x.org/projects/cocos2d-x/wiki/Build_HelloWorld_on_android_x86_platform 참고

 

Build and Run

Time to celebrate. Go to Project -> Build, and then Run As -> Android Application:

 

 

:

ORA-12571 오류

SQL/Oracle 2013. 2. 13. 16:57


ORA-12571: TNS: 패킷 라이터 실패 

// 안년하세요 김영대(http://www.howto.pe.kr) 입니다
// 자료를 찾아보니 Oracle 의 실수라고 하네요
// 아래 두가지 답변을 보시고 테스트 해보세요

--------------------------- 첫번째 --------------------------------
You are right, ORA-12571 is a common error associated with SQL*Net V2,
SQL*Net thinks the connection is broken while you are inserting lots of
rows into the Oracle database. The default timeout period is 10 secs.
In the Listener.ora you can set a longer timeout period with the line
CONNECT_TIMEOUT_LISTENER = 300 , which means 5 minutes. Myself and others
have encountered this error with the TCP/IP protocol. You raised an
interesting point, that DECNET works ok. without this parameter being
set. But I am a bit surprised that an INSERT of 500 records would cause
this error, normally I would expect many many more.

---------------------------- 두번째 -------------------------------
I often get the same messages.  I talk to Oracle support and didn't get
much help.  They put blame on faulty network equipment.  What they
suggested is to edit the sqlnet.ora file on the server and the client.
Change the SQLNET.EXPIRE_TIME = 0 and increase
CONNECT_TIMEOUT_LISTENER=300.


CONNECT_TIMEOUT_LISTENER = 0 (타임아웃 없음?) 

:

Abstract Factory - 제품군별 객체 생성 문제

C++/디자인패턴 2013. 1. 30. 10:44

최종 수정: 2013/01/30

 

 

문제사례 설명

  • 제품군별 객체 생성 문제
  • 컴파일러 (Scanner, Parser, Code Generator, Optimizer, .. 등으로 구성) 를 개발한다고 가정하면,
    • 다양한 운영체제를 어떻게 지원
    • HPScanner, HPParser, HPxxx
    • SunScanner, SunParser, Sunxxx

 

다양한 접근(해결) 방법

  • 기본적인 방법
    • 조건 비교 방식
    • class Scanner { };

      class HPScanner : public Scanner { };

       

      void ScanParse()

      if (_CurrentOs == HP_OS)

      {

      HPScanner Scanner;

      HPParser Parser;

      ..

      }

      else if (_CurrentOs == SUN_OS)

      {

      }

      else

      {

      }

      }

       

이런 비교 방식은 운영체제에 맞추어 객체를 생성해야 하는 소스 곳곳에 조건 비교 문장이 존재하게 되어서 새로운 조건을 추가(새로운 OS 지원)할 경우가 발생하면, 소스 전체를 다시 개발하는 것과 비슷한 노력이나 비용이 들 수 있다.

 

비용이 많이 든다!

  • 좀더 나은 방법

변경될 가능성이 많은 프로그램 부분을 한 곳으로 모아 변경이 필요할 경우 그부분만 고치도록 하는 방법이 있을 것이다.

 

(변경이 예상되는 부분을 국지화시킴으로써 변경에 소용되는 비용을 최소화하는 것으로 이를 '변경의 국지화 (Localization of Change') 라고 한다. )

 

객체 생성 전담 클래스를 활용한 컴파일러 관련 클래스의 객체 생성 방식

(Factory Method ?)

 

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

ComplierFactory

+ CreateScanner() : Scanner*

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

 

void CreateScanner()

{

if ( _CurrentOS == HP_OS)

{

return new HPScanner;

}

else if (_CurrentOs == SUN_OS)

{

}

else

{

}

  

위 방식의 문제점은 여전히 소스코드 내에 비교 문장이 존재한다는 것이다.

이는 새로운 조건의 추가를 이전 소스코드와는 무관하게 독립적으로 수행할 수 없다는 것을 의미.  => 만약 이때 소스코드가 바이너리 코드 형태로만 존재한다면 이전 소스코드를 아예 분석허거나 변경할 수 없을 것이기 때문에 문제는 더욱 심각해질 것이다.

 

라고 하는데, 문제의 심각성이 조금은 납득가지 않음. (대부분 소스코드를 수정할 수 있으므로..)

 

객체 생성을 전담하는 클래스를 활용하는 방식의 문제는,

이전 소스코드와 독립적으로 새로운 것을 추가하기 힘들다는 점이었다.

  • 패턴 활용 방법

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

CompilerFactory

+ CreateScanner() : Scanner*

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

 

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

HPCompilerFactory

+ CreateScanner() : Scanner*

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

 

 

int main()

{

CompilerFactory* pFactory = NULL;

if ( CurrentOS == HP_OS)

{

pFactory = new HPCompilerFactory;

}

 

 

Scanner* pScanner = pFactory->CreateScanner();

}

 

Abstract Factory 패턴을 적용한 경우, 두가지문제를 효율적으로 해결할수있다.

 

1. 개별 제품 클래스의 객체를 생성할 때마다 동일한 제품군에 속하는 객체를 생성하기 위해 일일이 조건 검사를 할 필요가 없어졌고

 

2. 새로운 제품군을 생성하려고 할 경우 기존 소스코드와는 독립적으로 새로운 제품군을 추가하는 것이 가능하다는 점

 

 

샘플 코드

없음

 

구현 관련 사항

실제 구현에서 고려 사항은, Factory 객체를 하나만 생성&유지할지(Singleton) 혹은 객체 생성시 원본 객체를 복제하는 방식 (Prototype) 으로 객체를 생성할지를 고려가 필요하다

 

  • Factory 객체를 하나만 생성, 유지하는 방법

class CompilerFactory

{

public:

virtual Scanner* CreateScanner() = 0;

protected:

CompilerFactory() {}

CompilerFactory(const CompilerFactory& rhs);

static CompilerFactory* pInstance_;

};

 

class HPCompilerFactory : public CompilerFactory

{

public:

static HPCompilerFactory* CreateInstance()

{

if (pInstance_ == 0) pInstance_ = new HPCompilerFactory;

return (HPCompilerFactory*) pInstance_;

}

 

Scanner* CreateScanner() { new HPScanner; }

}

 

 

int main()

{

if ( CurrentOS == HP_OS)

{

HPCompilerFactory::CreateInstance();

}

 

CompilerFactory* pFactory = CompilerFactory::CreateInstance();

Scanner* pScanner = pFactory ->CreateScanner();

}

 

 

  • 복제를 통해 제품 객체를 생성하는 방법

class Scanner

{

public:

virtual Scanner* Clone() = 0;

};

 

class HPScanner : public Scanner

{

public:

Scanner* Clone { return new HPScanner(*this); }

}

 

class CompilerFactory

{

public:

CompilerFactory(Scanner* pScanner, Parser* pParser, ...)

: pScanner_(pScanner), pParser_(pParser), ..

{}

 

Scanner* CreateScanner() { return pScanner_->Clone(); }

}

 

int main()

{

CompilerFactory* pFactory = NULL;

if ( CurrentOS == HP_OS)

{

HPScanner Scanner;

HPParser Parser;

..

 

pFactory = new CompilerFactory(&Scanner, &Parser, &xxx,...);

}

 

Scanner* pScanner = pFactory->CreateScanner();

}

 

 

Prototype 패턴을 활용할 경우에는 다음과 같은 특징이 있다.

1. 제품군별로 concrete Factory 클래스를 정의할 필요가 없다. 대신 제품의 종류별로 한개씩 객체를 생성해서 Factory 클래스에 등록해두어야 하는 비용이 발생한다. 특히 생성해야 할 제품의 종류가 많을 경우, Factory 클래스의 생성자 인터페이스가 복잡해지고, 객체 저장에 따른 비용도 커질 수 있다.

 

 

  • 새로운 제품 종류의 추가 시 문제 해결 방법

Abstract Factory 패턴은 특정 제품군에 속하는 제품 객체를 생성하는 프로그램 (? 코드) 를 한 곳으로모아, 새로운 제품군의 추가가 용이하게 만든 클래스 설계이다.

 

이런 Abstract Factory 패턴의 가장 큰 단점은

 

새로운 제품군이 아닌 제품(예를 들어 ErrorHandler)가 새로 추가될 경우, 모든 Factory 클래스들도 수정해야 하는 단점이 있다. (CreateErrorHandler 메서드 추가 필요)

 

 

그렇다면 이런 단점을 극복할 수 있는 방법은 없을까?

 

(문제의 원인은 Factory 클래스에 새로운 종류의 제품 생성을 요청할 경우 왜 모든 Factory 클래스가 수정되어야 하는가? 그것은 Factory 클래스가 생성할 제품의 종류에 따라 각기 다른 생성 멤버 함수를 가지고 있기 때문이다.)

 

해결 방법은 생성할 제품의 종류에 무관하게 Factory 클래스가 사용하는 멤버 함수를 하나로 통일 시키면 될것이다. CreateProduct()

 

허나 아래와 같이 구현하면 해결이 안되고 똑같은 문제를 가지고 있다.

 

class Product  { };

class HPScanner : public Product { };

class HPErrorHandler : public Product { }; // -- 추가 필요

 

class CompilerFactory

{

public:

virtual Product* CreateProduct( int type) = 0;

};

 

class HPCompilerFactory : CompilerFactory

{

public:

Product* CreateProduct( int type)

{

switch (type)

{

case SCANNER : return new HPScanner;

case ERRORHANDLER : return new HPErrorHandler; // -- 추가 필요 

}

}

};

 

int main()

{

CompilerFactory* pFactory = NULL;

 

if (CurrentOS == HP_OS)

{

pFactory = new HPCompilerFactory;

}

else if (CurrentOS == SUN_OS)

{

pFactory = new SUNCompilerFactory;

}

 

Product* pScanner = pFacotry->CreateProduct( SCANNER );

 

// -- Product* pErrorHandler = pFacotry->CreateProduct( ERRORHANDLER );

}

 

위와 같이 하면, 새로운 종류의 제품 추가시에 기존 클래스 구현의 변경이 역시나 필요하기 때문에, Abstract Factory 패턴의 목적을 만족시키지 못한다.

 

그렇다면 기존 클래스 구현에는 영향을 주지 않고 새로운 종류의 객체를 쉽게 생성할 수 있게 만들어 줄 수 있는 다른 방법은 없을까?

한가지 고려해볼 수 잇는 방법은 CreateProduct() 멤버 함수의 인자로 생성하고자 하는 객체의 원형을 직접 전달하고, CreateProduct() 멤버 함수는 그 객체의 복제 객체를 생성해 주는 Prototype 패턴을 활용하는 것이다.

 

아래 내용은 이를 구현한 코드이다. 단, 이때 Client 입장에서는 미리 생성할 객체의 종류별로 원형 객체를 하나씩 생성해서 관리하고 있어야 하는 불편은 존재한다. (Prototype 패턴의 불편으로 당연한 불편일 듯..)

 

class Product

{

public:

virtual Product* Clone() = 0;

};

 

class HPScanner : public Product

{

public:

Product* Clone() { return new HPScanner(*this); }

};

 

// -- 추가 필요 부분 시작

class HPErrorHandler : public Product

{

public:

Product* Clone() { return new HPErrorHandler(*this); }

};

 

class SunErrorHandler : public Product

{

public:

Product* Clone() { return new SunErrorHandler (*this); }

};

// -- 추가 필요 부분 끝

 

class CompilerFactory

{

public:

virtual Product* CreateProduct( Product* p) = 0;

};

 

class HpCompilerFactory : public CompilerFactory

{

public:

Product* CreateProduct( Product* p)

{

return p->Clone();

}

};

 

class SunCompilerFactory : public CompilerFactory

{

public:

Product* CreateProduct( Product* p)

{

return p->Clone();

}

};

 

CompilerFactory *g_pFactory;

 

int main()

{

Product *pScanner, *pParser;

Product *pErrorHandler;

 

if (CurrentOs == HP_OS)

{

pScanner = new HPScanner;

pErrorHandler = new HPErrorHandler;    // -- 추가 필요

 

g_pFactory = new HPCompilerFactory;

}

else if (CurrentOs == SUN_OS)

{

pScanner = new SunScanner;

pErrorHandler = new SunErrorHandler; // -- 추가 필요

g_pFactory = new SunCompilerFactory;

}

 

Product* pNewScanner = g_pFactory->CreateProduct( pScanner );

// -- Product* pNewErrorHandler = g_pFactory->CreateProduct( pErrorHandler );

}

 

 

응용 관련 사항

 

정리

Abstract Factory 패턴의 유용한 경우를 정리하면 다음과 같다.

 

  • 객체의 생성을 클라이언트가 직접적으로 하는 것이 아니라, 간적적으로 수행함으로써 클라이언트가 객체의 생성이나 구성 또는 표현 방식에 독립적이도록 만들도록 할때.
  • 여러 제품군 중 사용할 제품군을 쉽게 선택할 수 있도록 만들고 싶을 때.
  • 서로 관련된 제품들이 하나의 제품군을 형성하고, 이런 제품군이 여러 개 존재하는 상황에서 생성되는 제품 객체가 항상 같은 제품군에 속하는 것을 확실히 보장하고 싶을때.
  • 제품들에 대한 클래스 라이브러리를 만들어야 하는데 그 인터페이스만 드러내고 구현은 숨기고 싶을 때, 이때 각각의 인터페이스는 Abstract Factory 클래스와 제품 종류별 Abstract Base Class (ABC라고 함)에 의해 외부에 드러나며, 구체적인 구현은 하위 크래스에 의해 이루어진다.

Abstract Factory 장/단점

  • Abstract Factory 패턴의 장점은 객체가 생성되는 방식이나 과정 및 책임을 클라이언트가 모르도록 만들어 준다. 이때 클라이언트는 다만 Abstract Factory 클래스와 Abstract Product 클래스의 인터페이스만을 사용하면 된다. 이로서 클라이언트 소스코드는 객체가 생성되는 방식이나 과정 및 생성하는 종류가 변경되더라도 그 부분이 국지화될 수 있다.
  • Abstract Factory 패턴의 또 다른 장점은 제품군 (Product Family) 간 교체가 쉽다는 것이다.
    즉, Concrete Factory 클래스의 객체가 생성되는 부분만 변경시켜 주면 얼마든지 다른 제품군 (Product Family)를 생성하도록 바꿀 수 있다.
  • Abstract Factory 패턴을 사용하게 되면 여러 제품군들이 실수로 섞여서 사용되는 것이 자연스럽게 방지된다. 왜냐하면 특정 Concrete Factory 클래스는 특정한 제품군 (Product Family) 만을 생성하기 때문이다.
  • Abstract Factory 패턴의 단점은 제품군의 개수가 늘어날수록 Concrete Factory 클래스의 개수도 늘어나야 한다는 점이다. 따라서 제품군의 개수가 많아 졌을 경우 클래스가 너무 많아져 설계가 복잡해지게 된다.
  • 일반적인 Abstract Factory 패넌의 가장 큰 단점은 제품군에 새로운 제품이 추가되어야 할 경우, 모든 Factory 클래스를 수정해야 한다는 것이다. 예를 들어 컴파일러 문제에서 ErrorHandler와 같이 새로운 제품을 생성할 필요가 생기면 모든  Factory 클래스에 CreateErrorHandler() 멤버 함수를 추가해야 하는 문제가 발생한다.

 

Abstract Factory 패턴은 최선의 해결책이 아니라, 최적의 해결책이라는 사실이다. 상황에 따라서 적절히 변경할 수 있는 능력을 키워야 할 것이다.

: