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



언리얼 엔진 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' 를 검사한다. 설치 경로에 위 문자열이 포함되어 있었는지 환경 변수 수정 과정에서 위 항목이 삭제되었는지 확인해보자.

clang toolchain 설치

- https://wiki.unrealengine.com/Compiling_For_Linux 에서 필요한 clang toolchain 을 다운 받는다.
- 적절한 경로에 압축을 풀고 setup.bat 을 실행한다.
- OutputEnvVars.txt 에 있는 내용 중 LINUX_MULTIARCH_ROOT 를 환경 변수에 수동으로 추가한다.

빌드

- GenerateProjectFiles.bat 을 실행하고 MSVC 를 기동하면 플랫폼에 Linux 가 보인다.
- Shipping / Linux 설정으로 빌드하면 된다.

패키징

- 에디터에서 패키지 프로젝트 > 리눅스 를 선택한다.

(4.18 기준입니다.)

참고 : 리눅스용 크로스 컴파일 (http://api.unrealengine.com/KOR/Platforms/Linux/GettingStarted/index.html)

아래에 있는 폴더처럼 'PluginA', 'PluginB' 아래에 있는 모든 모듈을 가져오고 싶으면 2중 loop 를 돌아야하는데 윈도우 배치 파일 for 에서는 바로 중첩을 사용할 수 없다.

< 폴더 구조 >

Plugins/PluginA/Source/ModuleA1
                              /ModuleA2
                              /ModuleA3
Plugins/PluginB/Source/ModuleB1
                              /ModuleB2

python 이나 powershell 로 하면 쉽겠지만 윈도우 배치 파일로만 처리해야한다면 for 와 call 을 이용하여 처리할 수 있다.

for /f %%a ('dir /ad /b Plugins') do call :process_sub Plugins\%%a
goto :eof

:process_sub
for /f %%b ('dir /ad /b %1\Source') do echo %1\Source\%%b
goto :eof

label 을 이용해서 subroutine 을 만든다. 그리고 call 을 이용해서 호출하고 'goto :eof' 나 'exit /b' 이용하여 리턴하면 된다.

출처 :

'nested for loop in cmd' 

'windows cmd : call' 

Gitlab Hook Plugin 에 ruby-runtime 이 필요해서 설치했는데 아래와 같은 로딩 오류가 있었다.

(LoadError) no such file to load -- haml

윈도우 기본 설치 경로인 "Program Files (x86)" 에서 '(' 부분이 문제가 되는 것 같다.

'C:\jenkins' 같은 경로로 다시 설치할 필요가 있다고 한다. ㅜㅜ

참고 : https://github.com/elvanja/jenkins-gitlab-hook-plugin/issues/9

C 드라이브 용량 중 hiberfil.sys 파일이 생각보다 큰 용량을 차지한다. 최대 절전 모드용 파일인데 데스크탑에서는 삭제해도 큰 문제가 없는 파일이라고 본다. 삭제하는 방법은 아래와 같다.

명령 프롬프트를 관리자 권한으로 실행하고 'powercfg -h off' 라고 입력한다.

출처 : http://liverex.net/709

Jenkins : 재시작하기

해본 것/팁과 정보 2018.04.19 00:00 posted by 이밋

웹페이지에서 Jenkins 를 재기동하고 싶을 때는 아래 url 을 이용하면 된다.

(jenkins_url)/safeRestart - Allows all running jobs to complete. New jobs will remain in the queue to run after the restart is complete. 

(jenkins_url)/restart - Forces a restart without waiting for builds to complete.

출처 : https://stackoverflow.com/questions/8072700/how-to-restart-jenkins-manually

P.S. 참고로 'safe restart' Plug-in 을 설치하면 관리 페이지에 'Restart Safely' 버튼이 추가된다.

ruby-runtime 에 초기화 문제가 있어 비활성화 혹은 제거하려고 했는데 초기화가 안되니 관리 목록에 보이지 않아 제거나 비활성화할 수 없었다.

수동으로 비활성화하려면 plug-in 폴더에 disabled 파일을 추가하면 된다고 한다.

출처 : https://wiki.jenkins.io/display/JENKINS/Removing+and+disabling+plugins

base64decode

해본 것/팁과 정보 2018.03.06 00:00 posted by 이밋

e-mail 에 첨부된 파일의 경우 base64 로 인코딩되어 있다. 인코딩된 문자열을 파일로 디코딩하고 싶을 때 아래 웹 페이지를 이용하면 된다.

https://www.base64decode.org/

인코딩된 문자열을 붙여넣고 'DECODE' 버튼을 누르면 디코딩된 파일을 다운받을 수 있다.

CALL :NORMALIZEPATH "..\..\..\foo\bar.txt"
SET BLAH=%RETVAL%

ECHO "%BLAH%"

:: ========== FUNCTIONS ==========
EXIT /B

:NORMALIZEPATH
  SET RETVAL=%~dpfn1
  EXIT /B

출처 : https://stackoverflow.com/questions/1645843/resolve-absolute-path-from-relative-path-and-or-file-name