출처 : http://magenta.egloos.com/1454578

Subversion(SVN)과 Mantis의 연동

1. 연동하려는 SVN 저장소에 속성 설정합니다.
bugtraq:label = issue
bugtraq:url = http://localhost/mantis/view.php?id=%BUGID%
bugtraq:message = issue %BUGID%
bugtraq:warnifnoissue = true

2. SVN 저장소의 hooks디렉토리에 다음에 나오는 배치 명령이 들어있는 post commit hook 파일 생성(C:\Repository\hooks\post-commit.bat). SVN이 commit되는 동안에 Mantis에 이슈노트로 추가될 내용들을 넣습니다.
REM Post-commit hook for MantisBT integration
SET REPOS=%1
SET REV=%2
SET DETAILS_FILE=C:\Repository\GNIS4M\svnfile_%REV%
SET LOG_FILE=C:\Repository\GNIS4M\svnfile_%REV%_Log

echo ****** Source code change ******>>%DETAILS_FILE%
svnlook info -r %REV% %REPOS%>>%DETAILS_FILE%
echo SVN Revision:%REV%>>%DETAILS_FILE%
svnlook diff -r %REV% %REPOS%>>%DETAILS_FILE%

C:\APM_Setup\Server\PHP4\php.exe C:\APM_Setup\htdocs\mantis\core\checkin.php <%DETAILS_FILE% >%LOG_FILE%
DEL %DETAILS_FILE%
DEL %LOG_FILE%

3. 다음 내용을 Mantis config_inc.php에 추가합니다.
#Integration to SVN
$g_source_control_notes_view_status = VS_PRIVATE;
$g_source_control_account = 'Administrator';
$g_source_control_set_status_to = OFF;
$g_source_control_regexp = "/\bissue [#]{0,1}(\d+)\b/i";

추가로 연동할 SVN저장소에는 1,2만 반복하면 됩니다.

해보니까 연동은 잘되는데 한글이 깨지는 문제가 생깁니다.

Windows의 Command Prompt는 기본적으로 시스템의 locale을 따르는데..

그게 euc-kr입니다...

문제는 연동배치파일에서 svnlook을 쓰는데 이 프로그램은 Command Prompt의 Locale에 맞춰서 문자열을 출력한다는거..

우리의 Mantis는 UTF-8을 써서 한글을 표현하기 때문에...euc-kr로 된 SVN 정보들은 다 깨집니다.
(물론 euc-kr로 할수도 있지만...그러면 Mantis가 자꾸 워닝을 뿌리기때문에...)

해결책으로 Mantis의 Core디렉토리에 있는 checkin.php를 직접 수정합니다..

42번째 줄의...

while ( ( $t_line = fgets( STDIN, 1024 ) ) ) {

...를

while ( ( $t_line_euc = fgets( STDIN, 1024 ) ) ) {
        $t_line = ( iconv("EUC-KR","UTF-8",$t_line_euc)?iconv("EUC-KR","UTF-8",$t_line_euc):$t_line_euc );

...로 바꾸니까 해결되는군요..

윈도우2003서버에서 Mantis 1.0.6과 svn 1.4.0으로 작업했습니다.

'자료 > Article' 카테고리의 다른 글

/ENTRY(진입점 기호)  (2) 2007.03.01
Compiler Support for Type Traits  (0) 2007.02.13
라그나로크2 클라이언트 분석  (2) 2006.12.31
[펌] 디스크 캐쉬 제대로 알기  (2) 2006.12.29
[펌] Resource Management Best Practices  (0) 2006.11.02

- 파일 분석


- 그래픽 분석


머 전체적으로는 특별히 눈에 띄는 내용은 수영과 점프로 아무데나 올라갈 수 있다와 다양한 페이셜 연출...
말고는 특별한건 보이지 않았다.
다만 생각보다 메모리 사용량이 많지 않았다.

파일이 패킹되어 있지 않아서 분석하기는 좋았지만...
혹시 오베까지 저렇게 내용이 오픈되어있는 상태로 가면 좀 문제가 있겠다..;

평가는 첫 클베치고는 괜찮았다..라고도 생각되지만 개발기간과 언리얼2.x를 생각할때는 생각보다 별로.. 라고도 생각된다.

출처 : http://testors.net/tt/767

오래간만에 재미난 퀴즈.

Q. Win32 환경에서 모든 함수가 성공적으로 수행되었다고 가정할 경우, #END 시점에서 데이터가 실제로 disk 에 쓰여졌다고 기대할 수 있는 코드를 모두 선택하시오.

1.
FILE *fp = fopen( "test", "wb" );
fwrite( "DATA", 4, 1, fp );
// #END

2.
FILE *fp = fopen( "test", "wb" );
fwrite( "DATA", 4, 1, fp );
fflush( fp );
// #END

3.
FILE *fp = fopen( "test", "wb" );
fwrite( "DATA", 4, 1, fp );
fclose( fp );
// #END

4.
FILE *fp = fopen( "test", "wb" );
fwrite( "DATA", 4, 1, fp );
fflush( fp );
fclose( fp );
// #END

5.
HANDLE hFile = CreateFile( "test", 0, FILE_SHARE_WRITE, 0, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL );
DWORD sz = 0;
WriteFile( hFile, "data", 4, &sz, NULL );
CloseHandle( hFile );
// #END



 

정답은 놀랍게도 하나도 없다. -_-;

우선 Win32 API 의 경우 CloseHandle() 을 이용해서 파일 핸들을 닫았다고 해서 실제로 disk 에 write 되는것은 아니다. CloseHandle() 이 flush 를 해줄것이라고 생각할지도 모르겠지만 CloseHandle 한다고 해서 file 이 flush 된다는 얘기는 MSDN 어디에서도 찾아볼 수 없다. 실제로도 CloseHandle() 만으로는 물리적으로 disk 에 write 되지 않고 단지 캐쉬에 write 저장될 뿐이다. 다시 open 해보면 변경된 내역을 확인이 가능한것처럼 보이겠지만 그것은 write/close/open/read 가 모두 OS 의 디스크 캐쉬상에서 이루어 졌기 때문이다. CloseHandle() 후에 PC 코드를 뽑았다 다시 부팅해서 읽게 되면.. 운이 나쁘면 뒤의 일부분은 write 되지 않는것을 발견할 수 있을 것이다.

그렇다면 Win32 에서 데이터가 원하는 시점에 disk 에 기록되게 하려면 어떻게 해야하느냐? 방법은 FlushFileBuffers() 를 명시적으로 호출 해 주는 것이다. 여전히 CloseHandle() 과는 별개라는것을 주의 할것. CloseHandle() 은 내부적으로 FlushFileBuffers() 를 호출하지 않는다.

이제 CRT 의 경우를 살펴보자. CRT 의 fflush() 가 disk 에 write 해주는것 아니었냐고? 안타깝게도 대답은 'No' 이다. CRT 의 fopen()/fwrite()/fclose() 들은 내부적으로 FILE 단위의 버퍼링을 가지고 있으며 fflush() 는 그 버퍼링을 flush 해주는 것일 뿐이다. 그러니까 CRT 에서 fflush() 를 호출하게 되면 FlushFileBuffers() 가 호출되는게 아니라 그동안 쌓여있던 데이터를 그냥 WriteFile() - UNIX 계열에서는 write() - 해 줄 뿐이다. 결국 여전히 데이터가 OS 의 디스크 캐쉬에만 기록되고 물리적으로는 기록되지 않을 가능성이 남아있게 된다. system-call 로 구현될 수 밖에 없는 CRT 의 특성상 이는 모든 OS 에서도 일어날 수 있는 증상이다.

그래서 M$ 의 경우 fopen()/fflush() 의 extension 을 제공한다. 물론 이것은 표준이 아니다. 사용법은 간단한데 fopen() 시에 'c' 플래그를 추가하게 되면 fflush() 시에 FlushFileBuffers() 가 추가적으로 호출된다.물론 여기서도 fclose() 만으로는 물리적인 기록을 기대할 수 없다.

정리해보면, Win32 의 경우 disk 에 저장될 것이라 기대할 수 있는 코드는 다음 두가지다.

FILE *fp = fopen( "test", "wbc" );
fwrite( "DATA", 4, 1, fp );
fflush( fp );
fclose( fp );
// #END

HANDLE hFile = CreateFile( "test", 0, FILE_SHARE_WRITE, 0, TRUNCATE_EXISTING, FILE_FLAG_WRITE_THROUGH );
DWORD sz = 0;
WriteFile( hFile, "data", 4, &sz, NULL );
FlushFileBuffers( hFile );
CloseHandle( hFile );
// #END

아래에 PC 의 전원을 꺼버리는 험악한 방법을 사용하지 않고 이 동작을 확인할 수 있는 코드를 소개한다.

while( true )
{
    FILE *fp = fopen( "test", "wb" );   // #1
    fwrite( "data", 4, 1, fp );         //
    //fflush( fp );                     // #2
    fclose( fp );
}

위의 코드를 수행해 보고 HDD 램프를 지켜보라. 간헐적으로 깜빡일 것이다. fclose() 만으로는 실제 disk 에 기록이 되지 않는다는 얘기다. #2 의 주석을 제거해도 마찬가지다. "wb" 옵션을 "wbc" 로 바꾸고 #2 의 주석을 제거해야 비로소 HDD 램프가 미친듯이 깜빡이고 시스템이 엄청나게 느려지는것을 확인할 수 있을 것이다. Win32 API 도 마찬가지.

어찌보면 사소한 문제로 보일수도 있지만 어플리케이션의 업데이트 루틴을 작성하는 사람이라면 꼭 알아두어야 한다. 유저가 수만명 단위로 늘어나게 되면, 분명히 발생하기 때문이다. 나역시 직접 당해보기 전까지는 fflush() 를 하고 파일 핸들을 닫으면 당연히 disk 에 저장 될거라고 알고 있었기 때문에 이것을 알아내는데에 고생을 좀 했다. 부디 이 포스팅을 읽는 분들은 같은 삽질을 하지 마시길...

DX의 리소스 관리는 꽤 쉬운듯 보이지만 의외로 생각보다 어렵다.
관련된 좋은 글이 jacking님의 블로그에 올라와서 퍼왔다.

원본 주소 : http://blog.naver.com/jacking75/140030532889

http://ruliweb2.dreamwiz.com/ruliboard/read.htm?num=19075&table=game_ps04&main=ps

네이버 번역기로 보고 있었는데 루리웹에서 정식(?) 번역판을 찾았다.
SIGGRAPH 2006에 발표되어 화제를 모으고 있는 기법
http://gamma.cs.unc.edu/logsm/
abs(a)
Absolute value (per component).
reflect(i, n)
Returns the reflection vector v, given the entering ray direction i, and the surface normal n. Such that v = i - 2 * dot(i, n) * n
sin(x)
cos(x)
tan(x)
Returns the sine/cosine/tangent of x.
refract(i, n, eta)
Returns the refraction vector v, given the entering ray direction i, the surface normal n, and the relative index of refraction eta. If the angle between i and n is too great given eta, refract returns (0,0,0).
cross(a, b)
Returns the cross product of two 3-D vectors.
round(x)
Rounds x to the nearest integer.
distance(a, b)
Returns the distance between two points, a and b.
rsqrt(a)
Inverse square root: 1 / Square root (per component).
dot(a, b)
Returns the dot product of two vectors a and b.
saturate(x)
Clamps x to the range [0, 1].
frac(x)
Returns the fractional part f of x, such that f is a value greater than or equal to 0, and less than 1.
sqrt(a)
Square root (per component).
lerp(a, b, s)
Returns a + s(b - a). This linearly interpolates between a and b, such that the return value is a when s is 0, and b when s is 1.
tex1D(s, t)
1-D texture lookup. s is a sampler or a sampler1D object.  t is a scalar.
max(a,b)
min(a, b)
Selects the greater/lesser of a and b.
tex2D(s, t)
2-D texture lookup. s is a sampler or a sampler2D object.  t is a 2-D texture coordinate.
mul(a, b)
Performs matrix multiplication between a and b. If a is a vector, it’s treated as row vector. If b is a vector, it is treated as column vector.
tex3D(s, t)
3-D volume texture lookup. s is a sampler or a sampler3D object.  t is a 3-D texture coordinate.
normalize(x)
Returns the normalized vector x / length(x). If the length of x is 0, the result is indefinite.
texCUBE(s, t)
3-D cube texture lookup. s is a sampler or a samplerCUBE object.  t is a 3-D texture coordinate.
pow(x, y)
Returns xy

'자료 > Article' 카테고리의 다른 글

Logarithmic Shadow Maps  (0) 2006.10.27
Inverse Kinematics 자료 (IK)  (0) 2005.12.22
How To: Use CLR Profiler  (0) 2005.07.06
c++ stl에서 에서 유니코드 스트링 사용하기  (0) 2005.06.21
stl을 dll로 만들때 문제점  (0) 2005.06.08

원본글 : http://www.gosu.net/GosuWeb/Article-detail.aspx?ArticleCode=345

int main(int argc, char* argv[])

{

 std::locale::global( std::locale( "kor" ) );

 std::wstring wideString=L"테스트 문자열 - 유니코드";

 std::wcout<<wideString<<std::endl;

 return 0;

}

위와 같이 처리하면 화면에 "테스트 문자열 - 유니코드" 라고 찍히는 것을 볼 수 있습니다.핵심은 볼드체 처리한 부분의 코드입니다.

std::wcin.imbue( std::locale( "korean" ) );

std::wcout.imbue( std::locale( "korean" ) );

다음과 같이 지정하면 현재 쓰고 있는 wcin과 wcout 에만 영향을 미치게 됩니다. 따라서 위와 같이 골치 아픈 문제는 일단 피할 수 있겠죠?

그리고 이에 대한 자료가 더 필요하시면 http://www.cantrip.org/locale.html 여기 가서 더 읽어보시거나 Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference 또는 C++ Standard Library 라는 책을 참고하시길 바랍니다.

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

오늘의 교훈

책을 사면 좀 읽쟈

+ Recent posts