둘 중 고맙습니다가 권장되어 요즘은 일체의 TV 아나운서들도 모두 고맙습니다로 언어를 순화한 지 꽤 된 것 같다.


문제라면 그 이유에 대한 탐구인데,

감사感謝라는 단어가 일제의 잔재이므로 사용하지 말아야 한다...라는 잘못된 지식이 전파되고 있어서 문제다.

본래 취지는 고맙습니다의 경우 순우리말이고 감사합니다는 한자어이므로 우리말 보존의 차원에서 순화되었다.


감사라는 한자어는 한중일이 모두 동일하게 사용하고 있으며 우리나라의 경우 조선왕조실록에서도 기록되어 있으므로 일제 시대에 들어왔다는 의견은 얼토당토않다.


또한 잘못 퍼지고 있는 내용이 국립국어원에서 그렇게 이야기했다고 하는데, 그쪽에서는 우리말 보존 차원이라고만 이야기하고 있다.
http://www.korean.go.kr/09_new/minwon/qna_view.jsp?idx=63167

http://krdic.naver.com/rescript_detail.nhn?seq=411


다만 우리나라는 아직도 순우리말보다 한자어를 더 정중하고 격식있는 표현으로 취급하므로 감사합니다를 완전 버릴 수 있을 것 같지는 않다.

Posted by OOJJRS
,

제작 동기


1. 자체 라이브러리의 완성도 제고

2. AI 엔진 제작

3. 내 입맛에 맞는 매니지먼트 게임 제작

4. 오랜 시간을 (큰 노력 없이) 들여야하는 특성의 게임을 제작하고 싶은 욕구


자체 엔진을 활용한 연습용(튜토리얼용?) 제작 게임에 가까우며 삼국지 열전 제작의 기반이 될 것입니다.



게임 특징


1. 관찰

몇 가지의 간섭 방식을 제외하면, 플레이어는 신이 세계를 보는 것처럼 관찰하기만 합니다.

2. AI 자동화

플레이어는 게임 속 객체의 활동에 대해 강제할 수 없습니다.

3. 실시간

모든 객체는 실시간 속에서 활동합니다. 시간 단위는 물론 현실보다 훨씬 가속화되어 있습니다.

4. 추적

생성되었다 사라진 임의의 특정 객체 A에 대해 연대기를 생성할 수 있습니다. 실시간 추적도 가능합니다.

모든 객체는 자신의 역사를 갖고 실시간으로 기록됩니다.

5. 모눈

세계는 모눈 격자로 표시됩니다.

Posted by OOJJRS
,

단어 하마 (??)

언어 2013. 6. 14. 07:06

http://www.wordhippo.com/


사전 기능을 좀 더 세부적으로 만들어둔 곳이라고 할 수 있다.


단어의 유의어, 반의어 등을 찾을 때 유용하게 활용할 수 있어서 링크


그 외에도 많은 기능이 있더라

Posted by OOJJRS
,

사놓고 한동안 잊었던 AOE 2 HD 버전을 실행했다가, 5분만에 한 번 튕기고


한 35분여 플레이하다 또 튕겨서 빡쳐버렸다.


스팀 쪽 refund 는 시도해본 적이 없지만 귀찮아서 어쩔까 하다가

(행사로 싸게 샀기 때문에 어쩌구 저쩌구 설라무네?)


잠깐 검색해보니 다음과 같은 글이 있었는데


http://www.escapistmagazine.com/forums/read/9.405187-Age-of-Empires-2-HD-is-broken-much-anger-is-being-felt


결론은 실행 시 별도의 런처가 수행되는데 그 런처를 빼고 바로 다이렉트하게 하니까 잘 되었다...라는 내용이 있어서


한 번 시도해보려고 한다.


덤프 파일을 보고 나서 무의식중에 열어서 (pdb도 없이) 디버깅을 하다가 내가 지금 무슨 짓을, 이라는 생각이 들었다.

(동병상련 따위는 아니라고!)


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

글을 다시 읽어보니 정작 방법을 설명해두지 않아서 (링크해둔 글에 있기는 하지만) 잘 된 것 같아 방법도 게재한다.


설치된 폴더로 가서 Launcher.exe 를 없애고 대신 AoK HD.exe 파일을 Launcher.exe 로 변경하면 된다.

Posted by OOJJRS
,

가끔 vs를 사용하다보면 vs의 버그라든지 버그라든지 버그 같은 것을 만나서


신기한 상황에 봉착하곤 하는데 대개는 삽질을 여러 시간 한 뒤에 알아차리게 되므로


굉장히 우울한 경우가 대부분이다.


이번에도 역시 마찬가지로, 특정 파일이 계속 encoding 이 뻑나는 상황이 나오기에


나는 해당 텍스트 파일이 미쳤거나 모종의 파일 BOM 트릭 같은 것에 걸린 줄 알았다.


그러니까, 다음과 같은 상황인데





// Note : 호환 이라는 구문이 잘 보이는가?


하지만 닫았다 열면,



인코딩이 깨진다.


삽질을 한 줄로 요약하여 결론을 내자면,


다음과 같은 새 프로젝트에서도



그냥 호환 << 이라고 주석을 달아버리니 깨진다.


두 글자들이 다 깨지는 것도 아니고, // 호환 이라고 해도 깨진다.


이러다가 깨지지 않는 글자로 인해 인코딩이 정상적으로 먹으면, 그 뒤로는 호환 이라고 써도 깨지지 않는다.


내 진짜 억울해서 팔딱팔딱 뛸 일이다만... (내 30분...)


방심하다가 가끔 당한다.

Posted by OOJJRS
,

게이머로부터 긍정적인 감응을 끌어내는 행위를 몇 가지 부류로 얼기설기 나누어 보자면


1. 적극적 경쟁 부류

남들과 경쟁하여 우위에 서는 것으로 만족을 얻는 성향이다. 빠르고 확실한 피드백을 줄 필요가 있다. 대개의 경우 승/패, 순위, 기여도, 성적표 등과 같은 방식으로 <모두에게 오해의 여지 없이> 공지되는 방식을 활용한다.

달성 과정이 납득 가능한 방식(*1-1*)라는 가정 하에, 왜곡할 수 없는 공지 방식은 이 부류에게 승/패에 상관없이 만족감을 주거나 동기부여를 할 수 있다. 결과의 우열에 대해 직관적으로 이해하기 쉽고, 공정하고 객관적이라고 (암묵적으로) 동의할 수 있으므로 유저 개인의 광고 수단으로 활용될 수 있다.

다만 현실에서와는 몇 가지 차이점이 있다. 위와 같은 방식은 모두 <비교>를 적극 활용하여 유저 간 경쟁을 붙이는 것인데 현실의 교육 심리학 등에서는 학생 개인의 자존감과 연관하여 비교는 극히 피하지만 게임에서는 노력의 과정을 쉽게 은폐(*1-2*)할 수 있고, 핵/어뷰징 등 불공정한 수단을 동원하거나 최악의 경우 다른 게임을 찾아 떠나는 등 심리적 방어기제를 동원할 손쉬운 방법이 여러 가지가 있으므로 오히려 극한까지 비교하는 양상을 보인다(*1-3*).

주의할 것은 이 부류에 속한다고 해서 이 유저들이 PVP 컨텐츠를 좋아하는 경향성을 가졌다는 이야기는 아니다. 경쟁은 좋아하지만 견제 받기를 싫어하거나 정상에 서는 과정을 드러내기를 꺼리는 유저라면 오히려 PVP 컨텐츠는 독이 된다.

이 부류를 위해 다음과 같은 서비스를 제공하면 효과적이라고 생각한다.

확실한 승/패 이펙트 또는 1등 강조/2등 아차상 이펙트

전체 참여자의 성적표와 그 중 자신의 위치 강조 이펙트

방해받지 않고 자신만의 자원(시간, 돈, 노력)을 극도로 투입하여 결과를 뽑아낼 수 있는 컨텐츠

혼자 연습하거나 AI 와 대전할 수 있는 컨텐츠

 

2. 상생 부류

이들은 남과 경쟁하는 것을 좋아하지 않는 수준이 아니라 처음엔 가능한한 회피한다. 이른바 경쟁 회피 부류로 현실에서도 조심성 많고 소극적이거나 자기 방어 기제가 높을 수 있다. 많은 라이트 유저가 이 성향에서 시작하는데(*2-1*) 유저의 <번데기> 시절에 비유할 수 있겠다. 몇 가지 사건이나 경험으로 다른 부류로 진화(?)할 수 있기 때문.

안전을 도모하는 단계이므로 게임에 '터를 잡을 때'까지 <파티>, <길드> 등 "확고한 내 편"이라고 할 만한 것들에 관심이 많으며 그 안에서는 부정적인 감응을 회피한다. 이 단계에서 실패하면 그들은 게임을 이탈한다.

이들은 게임을 하면서 자신에게 부정적인 감응이 일어나는 사태를 매우 싫어하지만, 남에게 일방적으로 일으킬 수 있다면 (죄책감을 약간 가질지는 몰라도) 저지를 수 있다(*2-2*). 자신의 행위로 인한 주위의 피드백, 커뮤니케이션 내용 등에 민감하며 자존감이 부족한 유저의 경우와 이 특성이 결합하면 서비스 제공에 따라서는 코어 유저보다 더 게임에 대한 열의를 폭증시킬 수 있다(*2-3*).

확고한 내 편이 마련되면 이들은 단체의 힘을 자신의 힘이라고 생각하여 적극적인 경쟁 구도로 나선다. 친구끼리 파티를 맺고 난동(?)을 부리거나 PVP 컨텐츠에 진입하는 등의 유저들이 이 부류에 속한다.

'확고한 내 편' 안에서는 방어기제의 수단(*2-4*)이 많으므로 적극적인 경쟁 양상도 자주 일어난다.

이 부류를 위해 다음과 같은 서비스를 제공하면 효과적이라고 생각한다.

손쉬운 집단 형성/해체 시스템

편리한 커뮤니케이션/필터링/차단 시스템

별다른 손해 없이 일방적으로 주위에 해를 저지를 수 있는 컨텐츠 (일명 뒤치기나 PK, 린치 시스템)

나/우리 만의 공간 (본인의 선택에 따라 오픈할 수 있는)

그룹 대 그룹 컨텐츠

캐릭터 위치 추적 시스템 / 근방 이동 시스템 (인스턴스 게임류는 방 쫓아가기 기능)

그룹 내 순위표

파티 내 불공평한 PVP 매칭

 

3. 지원 부류

이들도 경쟁 회피 부류 중 하나로 의식 상태(*3-1*)에 관계 없이 지원 성향을 갖고 있다는 사실을 스스로 알고 있으며 그러한 행위의 결과에 만족한다. 내면에서는 자신의 지원을 받아 활약하는 동료를 보면서 넌 나 없으면 안 돼, 와 같은 긍정적 감응을 한다(*3-2*). 따라서 이들은 더 많은 사람에게 영향을 주고 그 반응을 크게 수집할수록 긍정적으로 감응한다.

구성원이든 비구성원이든 이 부류를 의식하고 기대려하기 때문에 많은 경우 리더(파티장, 길드장, 길잡이, 지휘관 등)의 역할을 맡게 되는 부류다. 이들은 단순히 개인 간의 경쟁에서 벗어나 그룹 간의 경쟁을 주도하고 자신이 패하더라도 그룹이 승리하면 만족하는 성향을 가진다. 그렇기 때문에 결정권 같은, 다수에게 영향을 줄 수 있는 기능 등에 긍정적으로 감응한다.

이 부류를 위해 다음과 같은 서비스를 제공하면 효과적이라고 생각한다.

그룹 관리 시스템 (그룹 일정/ 구성원 등급/권한 조절 등)

자신의 영향력이 미치는 범위 강조 이펙트(*3-3*)

구성원/비구성원 피드백 수집 시스템

다양한 지원 시스템 (캐릭터 스킬/아이템 사용/생산/경제 등 넓은 분야에서)

구성원장 강조 이펙트(*3-4*)

편리한 명령 전달 시스템 (미니맵 위치 표시, 후퇴 표시 등)


4. 마이웨이 부류

분석적인 이유(직업적인?)로 게임을 접하거나 모든 회피성 기제가 총동원된 경우가 이 부류다. 분석을 위해 접근한 경우도 자신의 목표를 달성하는 것 외에는 감응도가 높지 않으므로(*4-1*) 회피성 기제로 봐도 무방하다.

이들은 자신이 즐기는 방식 외엔 관심이 없으므로 간섭도 싫어하고 외부 환경과의 상호작용도 거부하는 편이다. 현실에서의 내 세계가 게임 안으로 그대로 끌려들어오는 경우가 많으며 주도적으로 이목을 끄는 행위를 하는 경우도 드물다.

자신의 사상이 뚜렷하거나, 정통적인 방식 외의 비주류로 인정받으려는 의도(*4-2*), 또는 방어기제가 극도로 높은 사람일 수 있다. 코어 유저 중 마이웨이 부류의 비중은 조사해본 적이 없으나 주목할 만하다고 판단된다.

또한 이들은 주도적으로 자신을 광고하지는 않지만 수동적으로 선전되는 것은 거부하지 않는다.

본인의 입맛에 맞는 컨텐츠만 취하는 경우가 많고 무엇에서 재미를 느꼈는지 알 수가 없어(*4-3*) 이후의 행동 양태도 딱히 추측하기 어렵다.

이 부류를 위해 다음과 같은 서비스를 제공하면 효과적이라고 생각한다.

세부적인 세계관 / 배경 설정

주의를 기울이지 않으면 알기 어려운 히든 컨텐츠

유의미한 결과를 얻을 때까지 비효율적 요소가 많이 포함된 컨텐츠

비정기적 이벤트 / 미니 게임

업적 시스템(*4-4*)

하드코어 시스템



*1-1*. 아무도 모르는, 개발자만이 아는 비법이라거나 버그를 통해서만 할 수 있다면 공감을 얻기는 어렵다.

*1-2*. 아이디를 여러 개 만들 수 있다는 익명성, 컴퓨터는 보통 둘 이상이 같은 화면을 보면서 하지는 않는다는 환경적, 프로게이머 같은 경우 외에는 게임하는데 무슨 피나는 노력인가 식의 사회심리적 요인 등이 합쳐져 있다. 마지막 요인의 경우는 기본적으로 게임의 목적성이 부재한다는 깔보는 시선이 포함되어 있기 때문이다. 상금이 걸린 대회에 참가한다고 하면 그제야 대중적 이해를 받는 경우가 많다.

*1-3*. 이 현상이 지나칠 경우 신규 유저의 유입에 어려움을 겪게 되므로 많은 게임들이 그룹별 비교를 도입했다. 그러나 개인적인 생각으로, 그룹 방식은 큰 도움이 되지 않는다고 본다. 그룹 방식에서 얻을 수 있는 장점은 소속을 대면 그 유저의 수준을 대략적으로 추측할 때 "묻어갈 수 있다"는 것이다(예를 들면 유저A가 골드 등급 100명 중 98위여도 나는 골드 클래스다라고 이야기할 수 있다). 이 장점은 한정적이고 조건도 빡빡한데 그 외에는 모두 무의미하거나 불리한 점들이 있다. 해당 게임을 어느 정도 해보지 않은 사람에게는 그룹의 등급이 생소하다는 점(말해줘도 얼마나 대단한지 잘 모름), 같은 그룹의 소속 유저가 보기에는 하위 등급이 묻어가려는 것이 괘씸해보인다는 점, 어차피 신규 유저는 상위 그룹에 갈 때까지 넘어야할 산이라는 점(그룹이건 아니건 그들은 경쟁 대상이다). 그룹 방식을 할 바에는 그냥 1위부터 마지막까지 일렬로 세우는 편이 낫다고 보여진다.

*2-1*. 연령에 따라 차이는 있으나 낯선 것에서 위협을 느끼는 인간의 특성이 게임 내에서도 고스란히 드러난다. 이 위협을 회피하는 부류가 대부분 네 번째 마이웨이 부류가 된다.

*2-2*. 익명성은 대상의 반격을 회피할 수 있기 때문에 인간의 심리에 큰 용기를 준다. 마찬가지로 일방적으로 할 수만 있다면 많은 사람들이 폭력도 거리낌없이 저지를 수 있다.

*2-3*. 이 부류에 속하는 유저들 중 대부분이 적 캐릭터의 현재 위치를 파악하여 죽이고 싶어한다.

*2-4*. 커뮤니케이션이 활발하게 일어나고 나의 행위에 대한 피드백이 반드시 넘어올 것이란 기대를 갖는다. 따라서 상대가 나를 잘 이해해준다고 생각하게 되면 그것만으로도 많은 위로를 받는다. 실수를 하거나 경쟁에서 패배하더라도 변명, 핑계 등이 잘 먹힌다고 생각하므로 치유 효과가 높다.

*3-1*. 실수에 대한 비난 등의 회피 목적으로 전면에 나서기 어려워하거나, 심리적 방어기제(적극 경쟁에서 패배하는 두려움에 대한 회피)를 귀찮음으로 위장하거나, 게임 플레이 자체에 대한 동기 미약 등의 이유를 스스로 의식하고 있거나 모르고 있거나.

*3-2*. 소극적인 사회적 자존감 확인 방식

*3-3*. 단순히 파티 보조용 아이템 하나를 사용하더라도 어느 사람이 사용했고, 그것으로 내 캐릭터가 이만큼 강해졌다 라는 것이 명백하게 보여져야 효과가 있다.

*3-4*. 파티장은 캐릭터가 좀 더 크다든지 주장/지휘관 등은 더 화려하다든지 하는 강조 이펙트도 효과적이다.

*4-1*. 파티 플레이를 하게 되더라도 상대의 반응을 보고 관찰한다는 개념으로 접근하게 되어 부정적인 감응을 겪더라도 쉽게 회피할 수 있다.

*4-2*. 대다수가 도전하는 방식으로는 경쟁이 치열하여 승산이 없다고 판단하고 쉽다고 보여지는 비주류적인 방법을 찾은 것을 뜻한다.

*4-3*. 의도가 어려워서 모르는 게 아니라 경우가 다양하고 표본 모수가 적어서 그렇다.

*4-4*. 수집과 달성을 자극하는 이 요소는 다른 부류에서도 어느 정도 유도가 가능하나 대중적이라고 하긴 어렵다. 추후 연구가 더 필요한 분야라고 생각한다.



* 참고자료

http://psychology.wikia.com/wiki/Competition

http://www.hci.iastate.edu/REU09/pub/Main/723/yee-psychology-mmorpg.pdf

http://scholar.google.co.kr/scholar_url?hl=ko&q=http://summit.sfu.ca/system/files/iritems1/212/1562c67fc9c841406d83750020ba.doc&sa=X&scisig=AAGBfm1jdqBS0UFmUaxgz2hgQqBcnaqWow&oi=scholarr&ei=ZZdOUbd0gduQBYSBgeAB&ved=0CC4QgAMoATAA

http://www.sciencedirect.com/science/article/pii/S0360131509001274

http://apjis.or.kr/pdf/MIS019-003-4.pdf (한글)

http://www.cyberpsychology.eu/view.php?cisloclanku=2008060901&article=5

http://www.digra.org/dl/db/07312.54479.pdf

http://is.muni.cz/th/181145/ff_m/Diplomova_prace_Pavla_Radostova.pdf


Posted by OOJJRS
,

1

아직 분류 없음 2013. 3. 10. 00:14
지식의 양
방어적 태도
과시 허영
인지도

자신의 지식이 어설플 때, 그것을 감추기 위해 다른 의견을 인정치 않고 아는 척 과시하고 비판에 방어적이 된다.

고 생각했으나 본질은 지식의 양이 아닌 듯 하다.
그것은 자신이 얼마만큼 주위에서 인정을 받고 있는가에 따르며 허영심이 충족되었는가에 연관이 있는 것 같다.
Posted by OOJJRS
,

http://gamsung.org/hk/sboard3/download.php?db=geo&uid=13&upfile=upfile

Posted by OOJJRS
,

설계 시 위험 신호

개발 2013. 2. 12. 17:56

아키텍처를 현재 조직구조에 맞추도록 한다.

DB가 추가된 이유가 DB팀이 일거리를 찾기 위해서 라는 식은 곤란하다.


25개 이상의 최상위 아키텍처 컴포넌트가 존재하는 건 너무 복잡하다.


한 개의 요구사항이 설계의 전체 방향을 이끌어나간다.

이 요구사항이 없어지면 그 아키텍처는 다른 이슈를 감당하기엔 지나치게 다른 길을 걸어왔다.

하나의 요구사항에 집중하면, 다른 이슈들을 건성으로 다루는 경향이 있기 때문이다.


아키텍처가 운영체제의 특정 버전에 의존적이다.

생각보다 이런 경우가 잦다.


표준 컴포넌트가 사용될 수도 있는 곳에 독점적인 컴포넌트를 사용한다.


하드웨어 단위 구분과 동일하게 컴포넌트를 나눈다.

시스템이 진화하여 하드웨어가 변경되면, 넌 x 된다. 소프트웨어 조직을 하드웨어에 끼워맞추지 말라.


신뢰성 확보라는 명분 하에 필요하지 않은 중복이 있다.

DB 이중화, 2개의 시작 루틴 따위는 시스템을 필요 이상으로 복잡하게 한다.


설계가 예외상황 중심적이다.

핵심 공통성이 아닌 기능의 확장성만을 강조한다.


개발조직에서 시스템 아키텍트를 식별할 수 없다.


아키텍트 또는 프로젝트 관리자가 아키텍처의 이해 관계자를 식별하는데 어려움이 있다.

관계도가 명확하지 않다는 것은 고려 없이 만들었을 가능성이 높다.


개발자가 두 컴포넌트의 상호작용을 코딩하는데 있어서 지나치게 많은 선택권을 갖는다.

아키텍처가 과다하게 선택권을 제공하거나 해당 이슈를 간과하도록 설계됐다면, 아직 아키텍처를 정의하는 중이다.


아키텍트에게 아키텍처 문서 작성을 요청하면, 클래스 다이어그램만 만들고 다른 것은 만들지 않는다(못 한다).


아키텍트에게 아키텍처 문서를 요청하면, 누구도 보지 못한 도구에서 자동으로 생성된 다량의 문서더미를 제시한다.

자동으로 생성이라도 되면 다행이다. 너무 복잡해서 생성하다가 프로그램이 터지는 프로젝트를 나는 알고 있다.


전달된 문서가 예전 내용이라면 당연히 최신 내용으로 관리되지 않고 있다.


설계자 또는 개발자에게 아키텍처를 설명하도록 요청하면, 못 하거나 상이한 아키텍처에 대해서 설명하고 있다.



- 소프트웨어 아키텍처 평가 286p



굵은 글씨는 내 경험 상 깊이 느꼈던 부분들이다.


Posted by OOJJRS
,

http://codeka.com/blogs/index.php/2009/03/21/got-visual-studio-2008-professional-want

 

Posted by OOJJRS
,

http://veblush.blogspot.kr/2012/10/map-vs-unorderedmap-for-string-key.html


매우 정리가 잘 되어 있는 글입니다

Posted by OOJJRS
,

static lib 파일

개발 2012. 12. 30. 23:51

http://en.wikipedia.org/wiki/Library_(computing)


http://stackoverflow.com/questions/140061/when-to-use-dynamic-vs-static-libraries


http://msdn.microsoft.com/en-us/library/958x11bc.aspx


http://stackoverflow.com/questions/4546507/lib-linking-other-libs

Posted by OOJJRS
,

로 출발한 내용들


일단 기본 지식부터


SxS

http://en.wikipedia.org/wiki/Side-by-side_assembly



/MD, /MT 설정들

http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=vs.100).aspx




제기한 주제와는 큰 관련 없지만 그럭저럭 /MD 와 /MT 설정에 대한 토론글

http://stackoverflow.com/questions/757418/should-i-compile-with-md-or-mt


역시 별 관련은 없지만 마침 나처럼 부스트 라이브러리를 빌드하는 사람의 글이 찾아져서

http://stackoverflow.com/questions/9527713/mixing-a-dll-boost-library-with-a-static-runtime-is-a-really-bad-idea




이건... 내 의문과 딱 떨어지는 누군가의 질문

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/a98b46f1-2d26-45c5-89c5-30714b18596a/





전통적으로 인스톨러를 좋아하지 않는 나는 기본인 /MD 설정보다 /MT 를 즐겨쓴다.


Posted by OOJJRS
,

VisualC.PDF


매번 찾기 힘들어서 링크 2


http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx


http://msdn.microsoft.com/en-us/library/hh567368.aspx


우씨 근데 정작 찾는 페이지가 없네 어디갔지

Posted by OOJJRS
,

매번 찾기 힘들어서 링크


http://msdn.microsoft.com/ko-kr/library/b0084kay(v=vs.100).aspx

Posted by OOJJRS
,

프로젝트 규모가 조금 커지면 간혹 만나볼 수 있는 문제다.


주로 프로젝트 관리가 체계적이지 못하거나 잘못되어 발생하는 문제인데, 의외로 원인을 찾는데 시간이 조금 걸린다.


문제의 원인이 여럿이기 때문이지만, 크게 중요한 문제가 아니라서 생각되어 그냥 넘어가기도 한다.


하지만 개인적으로는 이 문제를 매 수행 시 개발자를 번거롭게 할 뿐 아니라 빌드의 정합성을 보장하지 못 하게 하는 문제로 판단한다.


지금까지 경험했던 원인은 다음과 같았는데,



1. 빌드 대상인 파일이 모종의 원인에 의하여 마지막 수정 시간이 현재 시간보다 꽤나 앞으로 설정된 경우

이 경우 obj 파일에 찍힌 timestamp 보다 cpp 파일의 수정 시간이 항상 크기 때문에 항상 빌드를 요청한다.

대개 시간과 얽힌 테스트를 할 때 시스템(OS) 시간을 조정하면서 작업을 하다보면 저도 모르게 발생함.


2. 실제 include 되어 사용하지만 프로젝트에는 포함되지 않은 파일이 있는 경우

대개 헤더파일의 경우가 많이 발생하는데 (유니티 빌드의 경우는 cpp도 발생함) 결국 timestamp 비교가

온전치 못해 발생한다.

또는 프로젝트에는 필터에 포함되어 있으나 실제 파일이 없는 경우도 동일하게 발생한다.


3. lib 파일의 timestamp 가 꼬여서 현재 시간보다 먼 미래로 가버렸을 때

꼬임의 이유야 몇 개 있겠지만 본질적으로 1번과 크게 다르지 않고 소스와는 달리 알아채기 어렵지 않다.

소스는 파일이 매우 많아서 찾기 어려울 수 있지만 lib 파일은 출력폴더의 특정 확장자만 뒤져보면 되기 때문



기억나지는 않지만 아마 몇 가지 사소한 원인이 더 있었다고 기억하는데, 오늘 새로운 원인을 접했다.


이것도 본질적으로는 그냥 프로젝트 관리 실수에다 timestamp 와 연관이 있는 문제여서 다른 원인들과 같은 범주다.



4. 프로젝트들의 PCH 파일명이 동일하여 뒷 프로젝트가 앞 프로젝트 PCH 를 덮어쓴 경우

이 원인을 찾기 위해 헤맸던 이유가, out of date 가 나는 양상이 기존 것들과 약간 차이가 있었기 때문인데,

clean and rebuild(build) => 성공

바로 리빌드 시 => 빌드 실패 (가장 이해하기 힘들었던 부분)

+ 빌드 => 리링킹(?)

+ 빌드 => 변경된 파일이 없으므로 빌드는 하지 않고 최후 lib 파일만 작성(timestamp 갱신)

+ 빌드 => 빌드 성공 (이후로는 빌드하지 않음)



웃기는 건 저 다섯 단계 사이에서 어느 시점에 실행하느냐에 따라 계속 out of date 가 나기도 하고


한 번만 더 빌드하기도 하고 한다는 점이다.


이런 랜덤한 양상을 겪고 나니 그 동안 희석되었던 PCH 에 대한 거부감이 다시 살짝 살아날 뻔했지만...


빌드 환경을 정리해주는 것으로 해결하였다.

Posted by OOJJRS
,

http://stackoverflow.com/questions/10604243/call-stack-corruption-in-win32-vs2010-null-dereference-but-not-in-x64



자세한 해석은 귀찮으니 패스


결국 심볼이 잘못 연결된 문제


혹시 잊어먹을까 싶어 남겨둔다

Posted by OOJJRS
,

파일, db, 네트워크 어떠한 기반 장치로부터인지에 관계 없이 데이터가 구축될 때 구조를 두 가지로 나눌 수 있을 것 같다.

(편의상 의미를 알아볼 수 있는 정도의 수도Pseudo 코드를 사용하였습니다. 그런 API 없는데요? 라고 하시면 곤란합니다 :-D)




1. 정형화Normalize된 데이터 구조라고 명명함. 혹은 목적형For Objective 스크립트라고 해도 되겠다(내 맘대로 명명했다).


이러한 데이터들은 코드에서 직접적인 행위를 통해 접근이 가능한 집단이다. 완전히 일반적인 언어를 만들고 있지 않는 한 데이터의 가공 및 처리 편의성을 위해 명확한 목적을 지닌 하드코딩 연결부가 존재하는데,



<server ip="192.168.0.1" port="15000" />

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

if(!LIB_NET::connect(xml["server"]["ip"], xml["server"]["port"]))

{

    cout << "접속 실패" << endl;

    return 1;

}



와 같은 예가 정형화된 데이터를 사용한 예다. 코드는 명확하게 xml 로 server 가 존재함(예외 처리가 추가될 수 있다고 하더라도)을 알고 있으며 "server" 라는 토큰은 명확히 어딘가로의 접속을 위해 사용되는 매개체가 된다. 조금 더 시간을 투자한다면 복잡한 일반화를 통해 코드에서 server 를 직접적으로 활용하여 connect 를 호출하지 않고 스크립트에 코드를 두며 해당 parser 를 제작하는 식으로 처리할 수도 있지만, 웬만큼 크지 않은 프로젝트 대부분에서 이는 낭비에 속할 것 같다.



정형화된 데이터는 개발자 입장에서 읽고 쓸 때 명쾌하며 빠른 개발 속도도 보장한다.


빠른 대신 독립성의 이점은 별로 없다. 개발자가 모두 관리한다고 가정했을 때 이런 어중간한 데이터의 분리보다는 차라리 코드로 한 몸에 있는 것이 훨씬 낫다.


즉, 장단점을 하나로 정리하자면,


독립성, 관리비용 : 동적 데이터 구조 > 목적형 구조 > 코드


위와 같은 어중간한 방법이 가장 좋은 효율을 내는 경우가 아이템 1,000개를 만들 때 제작자와 개발자가 다른 경우다. 이때 목적형 스크립트는 서로 간에 의사소통 비용을 적절히 조율할 수 있고 요구사항/제공사항을 명확하게 나열할 수 있어 데이터의 1차 관리로 많이 활용되는 것으로 보인다.


<name>    아이템 이름

<stat>      아이템을 착용했을 때 증가하는 스탯 정의부

<desc>    아이템 설명


와 같은 명세서가 있다고 할 때 제3작업자인 스크립터는 쉽고 빠르게 단순반복 작업이 가능하다.


그러나 이 방식의 치명적인 단점이 있는데, 재활용하는 스크립트의 수가 적은 곳에 사용되면 1회용 코드가 난무하게 된다는 것이다. 위의 connect 에 사용된 server 정보와 같은 예다.




2. 동적Dynamic 데이터 구조


위의 구조를 좀 더 발전시켰다, 라는 개념보다 반대의 구조를 찾는다고 하면 동적 데이터 구조다. 목적형 구조는 하드코딩을 발전시킨 개념으로 보이지 하드코딩과 반대 개념이라고 보여지진 않는다.


동적 데이터 구조는 말 그대로 언어의 처리 방식과 비슷하다. 데이터가 얼마나 들어올 지, 무슨 데이터가 들어올 지 정해져 있지 않기 때문에 정형화된 모양으로 읽어들일 수가 없다.



<color name="black" r=0 g=0 b=0 />

<color name="blue" r=0 g=0 b=255 />

<color name="yellow" r=0 g=255 b=255 />



위와 같은 데이터는 얼마나 중복으로 들어올 지 알 수 없다. 동적 데이터를 처리하는 구조가 더욱 복잡해지는 이유는, 무엇이 들어올 지도 잘 모르지만 "얼마나 중복이 생길 지"도 잘 모른다는 사실이 더욱 구조를 복잡하게 만든다. 단순히 위의 예를 처리하려고 해도 정형화된 아이템 구조에서는 필드 하나로 끝날 스크립트가 리스트 구조 등을 요구하게 된다.


동적 데이터 구조는 코드에서 명확하게 그 대상을 지칭할 수 없다는 문제를 항상 염두에 두어야할 것 같다. 그렇게 만들려고 한다면 못 할 것은 없겠지만, 스크립트로 만든 데이터들을 코드에서 임의대로 지칭하려면 고려해야할 것들이 꽤 많다. 생성 영역과 관리 영역domain 이 다르기 때문이다. 반면, 스크립트에서 만들었다면 스크립트에서 해당 구조를 지칭하는 것은 그리 어렵지 않다.



<text color="yellow">안녕하세요?</text>



만약 yellow 가 하나 더 추가되어 2개가 되었을 경우 이를 코드 영역에서 지칭하려면 수정 후 리빌드 과정이 필요하지만, 같은 스크립트 레이어에서 이를 지칭하기 위해선 그냥 식별자identifier 만 수정하면 된다. 이는 코드에서 만든 것을 스크립트에서 지칭하기 어려운 이유와도 일맥상통하는데, 결국 관리자가 다르다는 것이 이유인 것 같다.


그래도 사용을 하려고 들면 못 하진 않는다. 다만 다음과 같은 일이 생기면 껄끄러운 것은 나 뿐인가?



while( xml["color"].IsValid() )

colormap[xml["color"]["name"]] = RGB( xml["color"]["r"], xml["color"]["g"], xml["color"]["b"] );

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

DrawLine(10, 10, 100, 100, colormap["black"]);



동적 스크립트로부터 얻은 데이터로부터 특정 키 값을 주어 라인을 그릴 때 색상 값을 취하고 있다. 아마 이 스크립트에는 다음과 같은 주석이 항상 따라다닐지도 모르겠다.



<color name="black" r=0 g=0 b=0 /> <!-- 코드에서 사용하고 있으니 변경 시에 개발자에게 문의하세요 -->



저런 경우가 많아지면 설계 상으로 꽤 곤란할 것 같은데, 나만 그렇게 느끼는 건지도 모르겠다.





위의 두 가지를 모두 지원하려니, 라이브러리가 DOM 형식과 반복자 형식을 항상 같이 지원해야 한다.


작금의 많은 XML 라이브러리들을 위시하여 스크립트 파서나 데이터 관리자 클래스들이 두 가지 모양을 모두 지원하는 이유에 대해 짧게 고찰해보았다.


DOM 형식이 코드도 보기 예뻐서 좋은데, 여러 모로 참 귀찮다. 으아아아아아!!!!!!!


결론은 한탄 뻘글

Posted by OOJJRS
,

Wrapper, Bridge, Mediator

개발 2012. 8. 24. 11:26

세 가지는 모두 비슷한 개념으로 여겨진다. 역할은 모두 인터페이스 교정에 사용되므로 공통점이 많은 이 세 가지 기법의 주요 차이점을 알아본다.


개인적으로 브릿지에 대한 오해가 약간 있었다.




Wrapper


Decorator 패턴의 주요 기법. 어떤 Component 의 기능을 그대로 놔두고 그 위에 기능을 얹는다(단순히 어댑터의 역할만 할 수도 있다).

어떤 Component 의 Wrapper Class 는 대상 Component 에 당연히 의존성Dependency이 강하다. 즉, Wrapper Class 만 따로 배포할 수는 없다는 뜻.




Bridge


Bridge 패턴으로도 사용됨. BUS, 공통 언어 같은 개념으로 보아도 무방할 듯. 대개의 경우 어댑터 역할을 할 때 설계 문서상으로는 암묵적으로 생략되는 경우가 많다고 함. 이는 임시적인 속성을 지니는 브릿지의 특성 상 그럴 듯하지만 구현과 설계의 괴리를 높이는 요소로 지적될 수 있을 듯.




Mediator


중재자 패턴은 링크 생략. 래퍼와 브릿지의 속성을 모두 지니고 있으며 두 패턴의 끝판왕 같은 기분으로 등장했다. 임시적인 녀석이 아니라 설계 단계에서도 명확하게 표현되는 특징적인 방식. 말하자면 서로 다른 라이브러리를 소통하게 하고 활용하고 꾸미기 위해 필수로 필요할 경우 해당 기능(래핑, 브릿지)을 모조리 모아 패키지로 구성했다고 생각할 수 있다.

게임의 비즈니스 로직에서 만약 중재자를 사용해야 한다면 엄청나게 슬픈 일이 될 것 같다. 엔진과 라이브러리 등의 밑단으로 잘 내려보자.

Posted by OOJJRS
,

http://news.kukinews.com/article/view.asp?page=1&gCode=all&arcid=0001317814&code=11141100&cp=nv1

Posted by OOJJRS
,

http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=103&oid=001&aid=0003044402

Posted by OOJJRS
,

http://thisisgame.com/board/view.php?id=372800&category=102&subcategory

Posted by OOJJRS
,

http://www.gamechosun.co.kr/article/view.php?no=65399

Posted by OOJJRS
,

http://www.3dmodelfree.com/

Posted by OOJJRS
,
Posted by OOJJRS
,

태생이 게을러 하질 못 하는 구나...

Posted by OOJJRS
,

indexes vs indices

언어 2012. 5. 7. 23:20

http://grammarist.com/usage/indexes-indices/


http://www.antimoon.com/forum/t2028.htm


Posted by OOJJRS
,

childs vs children

언어 2012. 5. 7. 23:18

http://www.kneoh.com/blog/2009/11/23/war-of-the-plural-suffixes-childs-vs-children/

Posted by OOJJRS
,

주시자Beholder

환상의 세계 2012. 3. 26. 00:02
※ 이 글들은 모두 1999년 ~ 2005년 정도까지 운영되던 http://user.chollian.net/~oojjrs 에 올렸던 글들을 편집, 재가공하여 최신화한 내용들입니다. 어린 나이에 어설픈 내용들을 인터넷에 떠돌아다니게 만든 것들에 책임을 져보고자 시작하였습니다(그래서 검색하면 여기 올라온 것보다 더 많은 내용이 있을 수 있습니다). 근데 업데이트는 느릴 수 있어요



  비홀더, 주시자는 D&D 초기판본에서부터 등장한, 근원이 명확한 몬스터다. 워낙 명확하다보니 정보를 얻을 경로도, 외따로 시비가 붙을 일도 별로 없는 단순명쾌한 고유명사라고 하겠다. D&D에서의 비홀더를 먼저 소개해보자면,



방어도   : 0
몬스터 레벨 : 11
이동속도
  : 9m(3m)
내성    : 마법사11
사기    : 12
경험치   : 5,100
기타 등등



  D&D에 익숙하지 않은 사람이라면 알아들을 수 없는 내용 투성이므로 적당히 알아볼 수 있는 것들만 기재해보았는데, 그래도 감이 잘 안 올 것이므로 광범위한 비교를 해보자면 일단 이 몬스터는 초보/숙련자/상급자/마스터(폐인) 등급의 D&D 오리지널 체계에서 폐인 단계에 등장하며 대對 마법사 특화 몬스터로 동급 레벨의 마법사가 상대일 경우 3, 4명은 충분히 찜쪄 먹을 수 있는 힘을 가졌다. 부연하자면, D&D 오리지널에서 일반적인 11레벨의 마법사는 자연재해로 취급받으며 한 방에 수십 명의 사람을 몰살시킬 수도 있는 힘을 지녔다.

  주시자는 최초 1975년 Wizards of the Coast 시나리오에서 등장한 몬스터들 중 하나다. 대개 D&D에서 등장하는 몬스터들은 신화를 기초로 한 것들이 많으나 주시자는 순수한 D&D의 창작물로 궤를 달리한다. 이 몬스터는 공들여 만들어진 만큼 인기가 제법 좋았던 것인지 AD&D로 금방 넘어갔고 D&D 3.5 버전 이후까지도 잘 살아남아 발전했다.



  주시자는 공 모양의 몸통에 10개의 작은 눈이 촉수처럼 붙어있고(전부 머리(?) 위쪽을 향해 붙어있다) 큰 눈이 몸통(?) 중앙에 자리하고 있는 모양이다.


출처 : www.wizards.com, 워낙 확고한 설정 탓에 일러스트들도 모두 작은 눈은 10개다

 

출처 : 위키



  정감 안 가게 생겼는가? 마법사를 좋아하는 사람이라면 더욱 마음에 들지 않을 특징이 있다. 이들은 특별한 마법적인 능력을 매우 많이 갖고 있다.

  커다란 눈으로 마법사를 주시하면 항마법Anti-Magic 효과가 있어 마법이 무효화된다. 게다가 작은 눈들은 각각이 어떤 마법들을 사용할 수 있다(최초 설정에 따르면 디스인티그레이트나 석화, 수면, 유혹 등 온갖 치명적인 마법은 다 사용할 수 있다). 후에 제법 많은 변종 설정들이 나타나는데, 그 중 어떤 변종은 일반적인 주문 능력을 지닌 눈알이 아니라 완전 엉뚱한 능력을 지닌 설정으로 등장하기도 했다. 주시자의 설정은 위키 등에서도 쉽게 찾아볼 수 있으므로(영어지만) 이 정도 요약으로 그치겠다.


Posted by OOJJRS
,

결론부터 말하자면 그런 방법 없다.


#include 와 #pragma comment(lib, file) 은 동작 방식에 차이가 있다.

#include는 강력한 경로 조합 기능을 갖추고 있으나 #pragma 는 현재 폴더를 기준으로 하는 상대경로 조합 밖에 되지 않는다.

왜 그렇게 만들었는지 누가 MS에 물어보고 답을 얻으면 내게도 공유해주길 바란다.



따라서 다음과 같은 경우

C:\MyProject\MyProject.sln 파일을 빌드한다고 하고

C:\MyLib\lib\FileManager.h
C:\MyLib\lib\FileManager.lib
 
가 있고 MyProject.sln 파일은 C:\MyLib 를 include 및 lib 폴더 경로에 지정했다고 한다면


#include "lib/FileManager.h"

#pragma comment(lib, "lib/FileManager.lib")

는 빌드되지 않는다. #include "lib/FileManager.h" 는 잘 되지만 #pragma 가 파일을 찾을 수 없다며 링크 에러가 난다.
(여담이지만 #pragma 는 역슬래시 경로를 먹이기 위해선 \\ 가 두 개 필요하여 귀찮으므로 보통 슬래시 경로를 많이 사용한다)

이유는 #include 의 경우 lib/FileManager.h 를 찾기 위해 우리가 미리 설정해둔 include 폴더 경로를 모두 조합하여

결국 C:\MyLib\lib/FileManager.h 를 조합하여 찾아내지만

#pragma 의 경우는 그런거 다 안 되므로 다음과 같은 결과가 되어

C:\MyProject\lib/FileManager.lib

당연히 없다고 나오게 된다. 물론 저 위치에 복사해 넣으면 잘 되지만 우리가 원하는건 그런 게 아니잖아?



그냥 오늘도 새벽녘에 코딩하다가 상기의 예와 비슷한 처리를 해둔 코드가 눈에 보여 포스팅해보았다.



아차, 해결책을 공유하지 않았는데 참 웃기는 일이지만 다음과 같이 lib 경로에 포함시키고 코드를 수정하면 잘 된다.

C:\MyLib\lib

#pragma comment(lib, "FileManager.lib")


그냥 MS가 이상하게 만들었다고 생각되지 않는가?


Posted by OOJJRS
,