'\n' 으로 될 줄 알았는데 그냥 문자로 취급된다. Enter 키를 누르면 입력이 완성되어 버린다. 결국 마법의 Shift + Enter 로 하니 잘 동작했다.
해본 것/팁과 정보
- UE4 : BP 에서 계행문자 추가하기 2018.07.07
- aws : 콘솔에서 EC2 인스턴스 유형 변경 2018.07.02
- IncrediBuild : 다른 subnet 에서 사용하기 2018.06.27
- Perforce : reconcile 2018.06.14
- Jenkins : workspace 경로 변경 2018.06.12
- Jenkins : Slack 알림 연동 2018.06.10
- 윈도우즈 배치 파일 : startswith 2018.06.08
- 윈도우즈 배치 파일 : 가변 길이 부분문자열 추출 2018.06.01
- Perforce : 배치 파일로 현재 작업 경로 기준으로 workspace 변경하기 2018.05.30
- UE4 : incredibuild 오류 확인 2018.05.05
UE4 : BP 에서 계행문자 추가하기
aws : 콘솔에서 EC2 인스턴스 유형 변경
EC2 인스턴스가 cpu 나 memory 가 부족해 type을 바꾸고 싶을 때는 기존 instance 를 중지 후 콘솔에서 Change Instance Type 메뉴를 선택 후 변경하면 됩니다.
참고 : https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ec2-instance-resize.html
IncrediBuild : 다른 subnet 에서 사용하기
IncrediBuild 는 기본적으로 다른 subnet 에서 사용하는 것을 권장하지 않는 것 같다.
The communication between a coordinator and its agents, and between the agents themselves, should be direct and on the same subnet. Therefore, in a case where an organization needs to serve agents on different subnets, it would be better to install one coordinator per subnet.
출처 : https://www.incredibuild.com/frequently-asked-questions-pricing-licensing.html#q201
일단 subnet 간에 통신을 위해 아래 포트가 열려 있어야 한다.
Coordinator : TCP 31104
service : TCP 31105
helper : TCP 31106 ~ (각 cpu 마다 포트를 추가로 사용한다.)
윈도 방화벽 허용이 필요하다.
윈도우즈 방화벽 > 고급 설정을 누른다.
인바운드 규칙 에서 아래 항목을 체크한다.
: IncrediBuild Agent Service
: IncrediBuild Build Helper
: IncrediBuild Helper #1 ~ #8 (CPU 개수만큼 있다.)
속성 창 > 고급 > 프로필에서 subnet 간에 적절히 열려있는지 확인한다.
도메인, 개인, 공용 3가지 체크 표시가 있는데 subnet 간의 연결이 어떤 type인지는 확인이 필요하다.
이제 문제가 되는 부분인 netbios 다. incredibulid 는 agent 이름을 가지고 ip 를 찾아내 접속하는 구조인 것 같다. 해결 방법은 여러가지 있겠지만 dns 를 이용한 방법과 hosts 를 이용하는 방법이 있다.
hosts 를 이용하는 방법은 모든 agent PC 에 상대 subnet 의 정보를 추가하는 방식이다. 윈도우즈 hosts 파일(기본 : c:\windows\system23\drivers\etc\hosts ) 에 ip 이름 형식으로 추가해주면 된다. 모든 PC가 상대방에 새로운 agent 가 추가되거나 이름이 바뀔 때 마다 설정해줘야 하는 귀찮음이 있는 것 같다.
dns 를 이용하는 방법은 한쪽 subnet 에 dns 서버를 설치 후 다른 subnet 에서 설치된 dns 서버를 연결하도록 설정하는 방식이다. 반대편 subnet 에 대한 처리 문제와 dns 설치 및 유지 보수 비용을 고려해야 한다.
Perforce : reconcile
Perforce 는 P4V 라는 클라이언트로 workspace 에서 상태를 관리하는데 P4V 를 통하지 않고 탐색기 등에서 변경을 가하는 경우 오류가 발생한다.
이 문제를 해결하는 명령이 reconcile 이다. P4V 에서 문제가 있는 경로에서 오른쪽 마우스 메뉴 'Reconcile Offline Work...'를 선택하면 선택한 경로 아래 폴더 파일들의 상태를 체크해서 처리한다.
p4 command 로 add / edit / delete 처리를 하고 싶으면 아래와 같이 하면 된다. status -A 는 reconcile -aed 와 동일한 명령이다. -a : add, -e : edit, -d : removed 를 나타낸다.
p4 status -A <파일 경로>
Jenkins : workspace 경로 변경
윈도우에서 Jenkins 를 설치하면 기본으로는 'C:\Program Files(x86)' 같은 공백이 포함된 경로에 설치되어 plugin 도 문제가 생기고 배치 파일 실행시에도 문제가 생길 경우가 많다.
재설치하기 힘든 경우에 기본 workspace 라도 변경해보자.
- 'Jenkins 관리' > '시스템 설정' 버튼을 누르면 최상위에 '홈 디렉터리' 아래에 '고급...' 버튼을 누른다.
- 작업공간 최상위 디렉토리를 원하는 경로로 변경하자.
Job 아이템 단위로 workspace 가 생성되는데 다른 Job 의 workspace 에서 작업되어야하는 경우도 있다.
- Job 아이템을 선택하고 왼쪽 메뉴에서 '구성' 버튼을 클릭한다.
- General 영역에서 '고급...' 버튼을 클릭합니다.
- '사용자 빌드 경로 사용'을 체크하시면 아래에 디렉터리를 설정할 수 있는 영역이 보입니다.
- '디렉터리' 영역에 다른 Job 의 workspace 를 입력하면 됩니다.
Jenkins : Slack 알림 연동
Slack 설정
- Slack App Directory 에서 Jenkins CI 를 찾아 Add Configuration 을 눌러 Post 설정을 추가합니다.
- Integration Settins 에서 Post to Channel 과 Token 을 메모합니다.
Jenkins 설정
- Jenkins 에 Slack Notification Plugin을 설치합니다.
- Jenkins Credentials 에 Secret Text 로 Token 정보를 추가합니다.
- Job 구성에서 '빌드 후 조치'에 Slack Notifications'를 추가합니다.
- '고급...' 을 눌러 Base URL 에 'https://<name>.slack.com/services/hooks/jenkins-ci/' 주소를 입력합니다.
- Integration Token Credential ID 에 Secret text 로 추가한 Token 정보를 선택합니다.
- 'Project Channel' 에 메시지를 알릴 채널을 입력합니다.
- 'Not Built', 'Success' 등 Slack으로 알릴 이벤트를 선택합니다.
- 주의! Failure 의 경우 반복해서 실패하는 경우 알림이 오지 않습니다. '고급...'에서 보이는 'Notify Repeated Failure'도 같이 선택해주세요.
윈도우즈 배치 파일 : startswith
:startsWith [%1 - string to be checked;%2 - string for checking ]
@echo off
rem :: sets errorlevel to 1 if %1 starts with %2 else sets errorlevel to 0
setlocal EnableDelayedExpansion
set "string=%~1"
set "checker=%~2"
rem set "var=!string:%~2=&echo.!"
set LF=^
rem ** Two empty lines are required
rem echo off
for %%L in ("!LF!") DO (
for /f "delims=" %%R in ("!checker!") do (
rem set "var=!string:%%~R%%~R=%%~L!"
set "var=!string:%%~R=#%%L!"
)
)
for /f "delims=" %%P in (""!var!"") DO (
if "%%~P" EQU "#" goto :yes
goto :no
)
:yes
endlocal & verify set_error 2>nul
goto :eof
:no
endlocal & ( echo | shift )
goto :eof
출처 : https://ss64.org/viewtopic.php?id=1687 - split, indexof, last index of, reverse, startsWith, ends With
윈도우즈 배치 파일 : 가변 길이 부분문자열 추출
윈도우에서도 bash 를 쓸 수 있는 세상에 이게 무슨 짓인가 싶지만 배치 파일로 부분문자열을 추출해보자.
부분문자열은 아래와 같은 변수 문법을 사용한다.
%variable:~num_chars_to_skip,num_chars_to_keep%
예를 들어 처음 5글자를 추출하는 방식은 다음과 같다.
SET _test=123456789abcdef0
SET _result=%_test:~0,5%
저 시작하는 위치와 종료 위치를 가변적으로 하고 싶으면 다음과 같이 하면 된다.
CALL SET _substring=%%_donor:~%_startchar%,%_length%%%
Perforce : 배치 파일로 현재 작업 경로 기준으로 workspace 변경하기
Perforce 작업은 Perforce Helix P4V 라는 클라이언트를 통해 해야한다. P4 라는 명령어나 탐색기 플러그인이 있지만 쓸만하지 않은 것 같다.
여러 폴더에 workspace(working copy) 를 만들고 쓸 때 P4 설정이 폴더에 맞춰 바뀌지 않아서 P4 커맨드 실행시 짜증이 난다.
언리얼 에디터를 보니 소스 컨트롤을 연동할 때 workspace 의 경로를 보고 연동 가능한 workspace 목록을 보여주도록 되어 있었다. 비슷한 식으로 배치 파일을 구현해서 사용하면 된다.
: p4 clients 명령으로 현재 유저와 연동된 workspace 목록을 가져온다.
: 배치 파일 실행 경로가 workspace 경로를 포함하고 있는지 비교한다.
: 포함하고 있으면 p4 set 으로 P4CLIENT 를 설정한다.
for /f "tokens=2,4* delims= " %%a in ('p4 clients -u %UserName%') do call :remove_desc_and_call "%%a" "%%c"
p4 set P4CLIENT
exit /b 0
:remove_desc_and_call [%1 - a workspace name;%2 - a workspace path and a description]
setlocal EnableDelayedExpansion
set WsName=%~1
set WsPathAndDesc=%~2
set /a SepIdx=0
call :indexof "%WsPathAndDesc%" "'" "SepIdx"
set /a SplitIdx=%SepIdx%-1
call set WsPath=%%WsPathAndDesc:~0,%SplitIdx%%%
call :compare_and_set_p4_client "%WsName%" "%WsPath%"
endlocal
goto :eof
:compare_and_set_p4_client [%1 - a workspace name;%2 - a workspace path]
set WsName=%~1
set CurDir=%~dp0
set Target=%~2
echo call :startsWith "%CurDir%" "%Target%\"
call :startsWith "%CurDir%" "%Target%\"
if %errorlevel% == 1 (
p4 set P4CLIENT=%WsName%
)
goto :eof
:startsWith [%1 - string to be checked;%2 - string for checking ]
@echo off
rem :: sets errorlevel to 1 if %1 starts with %2 else sets errorlevel to 0
setlocal EnableDelayedExpansion
set "string=%~1"
set "checker=%~2"
rem set "var=!string:%~2=&echo.!"
set LF=^
rem ** Two empty lines are required
rem echo off
for %%L in ("!LF!") DO (
for /f "delims=" %%R in ("!checker!") do (
rem set "var=!string:%%~R%%~R=%%~L!"
set "var=!string:%%~R=#%%L!"
)
)
for /f "delims=" %%P in (""!var!"") DO (
if "%%~P" EQU "#" goto :yes
goto :no
)
:yes
endlocal & verify set_error 2>nul
goto :eof
:no
endlocal & ( echo | shift )
goto :eof
:indexof [%1 - string ; %2 - find index of ; %3 - if defined will store the result in variable with same name]
@echo off
setlocal enableDelayedExpansion
set "str=%~1"
set "s=!str:%~2=&rem.!"
set s=#%s%
if "%s%" equ "#%~1" endlocal& if "%~3" neq "" (set %~3=-1&exit /b 0) else (echo -1&exit /b 0)
set "len=0"
for %%A in (2187 729 243 81 27 9 3 1) do (
set /A mod=2*%%A
for %%Z in (!mod!) do (
if "!s:~%%Z,1!" neq "" (
set /a "len+=%%Z"
set "s=!s:~%%Z!"
) else (
if "!s:~%%A,1!" neq "" (
set /a "len+=%%A"
set "s=!s:~%%A!"
)
)
)
)
endlocal & if "%~3" neq "" (set %~3=%len%) else echo %len%
exit /b 0
UE4 : incredibuild 오류 확인
언리얼 엔진 4의 경우 코드 빌드나 셰이더 컴파일을 IncrediBuild 를 이용하여 분산 처리해서 빌드 시간을 단축시킬 수가 있다.
1. 라이센스 확인
IncrediBuild Core
Dev Tool Acceleration
Visual Studio C/C++
위 3가지 라이센스가 필요하다. RunUAT 라는 배치 파일을 통해 incredibuild 를 실행하는 구조라서 Dev Tool Acceleration 패키지는 반드시 필요하다. Visual Studio C/C++ 라이센스는 코드 빌드를 위해 필요하다.
2. 셰이더 컴파일에 Incredibuild 를 사용하려면 다음 내용을 확인한다.
프로젝트별 속성의 경우 DefaultEngine.ini 에 아래 Section을 확인한다.
[SystemSettings]
r.XGEShaderCompile = 1
배포된 엔진 속성의 경우 ConsoleVariables.ini 를 검사한다.
; r.XGEShaderCompile is now enabled by default in source. Uncomment to disable XGE shader compilation.
;r.XGEShaderCompile = 0
3. 패키징이나 코드 빌드 실행 시 noxge 옵션이 활성화되는 경우
incredibuild 체크를 여러가지로 하는데 그 중 하나는 환경 변수 'PATH' 값에서 'Xoreax\IncrediBuild' 를 검사한다. 설치 경로에 위 문자열이 포함되어 있었는지 환경 변수 수정 과정에서 위 항목이 삭제되었는지 확인해보자.