Effective Modern C++ (스콧 마이어스, 2015) 독후감
다시 C++을 만지게 됐다. 책장에 꽂혀 있던 ’Effective Modern C++’ 책을 다시 읽었다. 예전에 읽었던 것 같은데, 새롭고 놀랐다. 나보다 더 깊이 생각한다. 여기까지 설명하겠지 하면서 읽다 보면 예상한 것보다 한 발짝 더 깊이 들어가서 설명한다. 스콧 마이어스 ...
다시 C++을 만지게 됐다. 책장에 꽂혀 있던 ’Effective Modern C++’ 책을 다시 읽었다. 예전에 읽었던 것 같은데, 새롭고 놀랐다. 나보다 더 깊이 생각한다. 여기까지 설명하겠지 하면서 읽다 보면 예상한 것보다 한 발짝 더 깊이 들어가서 설명한다. 스콧 마이어스 ...
forwarding reference(universal reference)가 있게 한 제안서(proposal)다. std::forward() 함수를 보면 생각날 문서다.
양 정말 많다. 번역본을 사고 싶었는데, 들고 다니면서 볼 엄두가 안 났다. 그래서 kindle로 사서 읽었다.
DO name interfaces with adjective phrases, or occasionally with nouns or noun phrases. Nouns and noun phrases should be used rarely and they might...
warning level 4로 만든 프로젝트는 총 3개다. 모두 덩치가 있는 게임 프로젝트였다. 크고 지루한 작업이었다. 하나를 제외하곤. 드물게 엔진이 level 4였다.
vec3 calc_respawn_position(...);
(column-number-mode 1) (column-number-mode)
```c++ template struct CompileTimeError; template<> struct CompileTimeError {};
C++ incomplete type is not allowed class inner use?
템플릿 만으로 이만큼 분량을 뽑아낼 수 있구나. 자세한 설명으로 템플릿 내공을 쌓는데 그만이다.
윈도우 하부구조를 알려주는 책. 프로세스, 스레드, 동기화 오브젝트, 메모리 관리, DLL, IOCP 등을 자세히 다룬다.
글 주소는 http://www.viva64.com/en/l/
Object* object = NULL; if (object && object->IsValid()) { // ... }
STL에는 auto_ptr라는 스마트 포인터가 있지만 할당하면 소멸식 복사(destructive copy)로 자원에 대한 소유권을 넘겨주는 동작을 한다. STL 알고리즘은 값에 의한 복사가 기본 동작이라서 컨테이너에 못 넣는 스마트 포인터가 되겠다. 이게 이슈가 많이 돼서 이름도 ...
```c++ class RVO { public: RVO() { PrintLine(“constructor”); } RVO(const RVO& rhs) { PrintLine(“copy constructor”); } ~RVO() ...
```c++ class Base { public: Base() { WriteLine(“Base::Base()”, typeid(this).name()); f(); } void f() { WriteLine(...
사실 style guide가 나와서 말인데, 나는 조엘이 엄선한 소프트웨어 블로그 베스트 29선에서 본 ’스타일은 언어 요소다 - 켄 아놀드’글을 완전 지지한다. 많은 언어가 무시하는 공백 문자를 언어 요소로 넣자고 주장하는데, 지겨운 스타일 논쟁을 완전 없앨 수 있고 파싱이 쉬워...
목적은 Construct On First Use와 같다. 즉, global static object, global object 초기화 순서가 명확하지 않아서 발생하는 static initialization order fiasco를 막기 위한 idiom이다.
global static object, global object 가 사용되기 전에 초기화되는 걸 보장하는 idiom이다.
포팅을 위해 64bit로 빌드를 하면 갑자기 담배가 급하게 땡기게 된다. 수백 개의 에러를 보면 “어휴~ 이걸 언제 다 잡지?”라는 생각이 절로 든다. 하지만 다 저마다 독특한 상황에서 발생하는 에러가 아니라 에러는 수백 개라도 공통된 패턴이 있기 마련이다. viva64.com에 ...
계산한 값을 메모리에 저장해서 여러 번 같은 값 계산을 피하는 최적화 기법을 메모이제이션(memoization)이라고 한다. 실행 속도와 공간을 바꾸는 가장 기초적인 기법이기도 하다. 실수로 메모리제이션이라고 하기도 하는데 메모이제이션이 정확한 용어이다.
PerfHUD나 DirectX Caps Viewer로 볼 수 있지만, 비디오 메모리 사용량을 렌더링하는 게 그리 힘든 일이 아니라 보통 이 정도는 렌더링해준다. 그건 좋은데 문제는 DirectX9 인터페이스로는 사용 가능한 전용 비디오 메모리를 알 수 없는 거다. 그래서 보통 Di...
컴파일할때 파일 간의 디펜던시를 줄이려고 사용하는 관용구(idiom)이다. public 접근 권한으로 정의된 함수가 변경될 때, 이 파일을 include 하는 녀석들이 다시 컴파일되는 건 당연한데, 다른 녀석들이 못 보는 private 접근 권한의 멤버 함수나 변수가 변경될 때도 ...
사용자 입력은 서식화된 입력(공백 문자 무시 등)이 필요하지만 파일 입출력에서는 서식화된(formatted) 입력이 필요 없는 경우가 대부분이다. 서식화된 입출력은 쌩 입출력보다 처리를 하는 게 많아서 속도가 느린 게 당연하다. 공백 문자 무시 옵션을 켜도 되지만 이런 서식화 입출...
두 값이 같은가를 판단하는 두 가지 방법이 존재한다. 첫 번째 방법은 두 값이 같은지를 바로 판단하는 것이고 두 번째 방법은 작지도 않고 크지도 않다는 것을 확인해서 두 값이 같은지를 판단한다. 이 첫 번째 방법은 operator== 로 판단하는데, A == B 이면 두 값이 같다...
transform(), copy() 알고리즘과 같이 연산을 하거나 단순 복사를 하는 알고리즘을 사용할 때, 결과물을 쓰기 위한 반복자(iterator)를 함수 인자로 받는다. operator = 로 값을 쓰기 때문에 결과물을 특정 컨테이너 뒤에 삽입하려면 귀찮은 과정을 거쳐야 한다...
O(logN)으로 수행되는 바이너리 검색(binary search)이다. 물론 바이너리 검색 알고리즘의 전제 조건인 정렬된 순서를 보장해야 하므로 원소들이 정렬된 컨테이너에서만 제대로 동작한다.
함수 어댑터(function adaptor)?!
Effective STL 항목 15에서 string이 여러 가지 방식으로 구현되어 있다는 걸 상기시키고 있다. 구현 방법까지 표준 문서에 정의하지 않았기 때문에 당연한 결과이기도 하다. VS 2005에 포함된 딩컴웨어 STL은 어떻게 구현되었나 궁금해서 찾아봤다.
STL 알고리즘 이름의 _if 접미사는 술어 함수(predicate)를 인자로 받는 것을 의미한다. 이 술어 함수를 알고리즘 안에서 호출해서 돌려받은 반환 값에 따라 동작을 수행할지 말지를 결정하게 된다. 예를 들면 count_if()는 술어 함수 호출결과가 true인 원소들의 개...
컨테이너 정렬이 필요할 때, sort를 사용하고 순서가 유지돼야 하면 stable_sort를 사용했다. partial_sort와 nth_element는 한 번도 사용해본 적이 없는데, 일부분만 정렬이 필요하거나 몇 번째 원소를 뽑을 때 유용하게 사용할 수 있을 것 같다. 예를 들면...
변태적인 복사 동작을 하는 스마트 포인터다. 꼭 필요한 경우가 아니라면 레퍼런스 카운팅을 하는 스마트 포인터를 사용하자.
for_each 알고리즘으로 대체 구현이 가능한 거라 한 번도 사용해보지 않은 알고리즘이다. Effective STL 37번 항목에서 accumulate알고리즘에 대한 언급이 나오는데, 으.. 읽고 보니 좋은 걸 안 쓰고 있었구나.
predicate 발음듣기 [미] [prédikət] 【문법】 술부, 술어 (cf. SUBJECT) 【컴퓨터】 술어 구글 사전
CQS는 간단하게 설명하면 멤버 변수를 변경하는 동작과 멤버 변수 값을 반환하는 동작 중 하나의 동작으로만 멤버 함수를 구현하는 원칙이다. 양다리는 금지.
```c++ class CCAImage { protected: void SetSnapRegion(int x, int y, int dx, int dy); };
파티션을 나눠서 응용 프로그램들을 D 드라이브에 설치하는데, 프로그램 파일 패스가 “C:\Program Files”로 세팅되어 있어서 설치할 때마다 Home –> Del -> D 콤보로 드라이브 명을 바꿔서 설치했다. 웹 서핑하던 중에 레지스트리를 수정해 프로그램 파일 ...
NOOP 혹은 NOP 로 사용하는데, NO OPerator의 줄임말이다. 말 그대로 아무런 연산을 하지 않는 명령어를 뜻한다. 표준이 아니라 VC++ 키워드라는 게 걸리는데, 다른 컴파일러에서 동작하도록 쉽게 수정할 수 있으니 포팅 걱정은 안 하고 VC++에서 편하게 써도 된다. ...
EASTL - Electronic Arts Standard Template Library은 거대 게임 개발사인 EA가 C++ 표준 라이브러리인 STL을 게임 개발에 맞게 수정한 라이브러리이다.
웹 서핑 중에 간단히 잘 정리된 사이트를 찾아서 가물가물 하던 터에 한번 정리해봤다.
```c++ #include #include #include
Win32 console application에서 Unicode 문자를 표준 출력을 통해 출력하려고 한다. 그러나 console window가 Unicode를 지원하지 않는 문제점이 있다. 이런 문제점을 해결하려면 locale 설정을 한 후 출력을 한다.
2판이 있는데, 목차를 살펴보니 새로 추가된 내용이 많아서 샀다. 상당히 많은 부분이 추가 되었고 내용들도 수정되고 추가 되었다. TR1에 대한 소개도 추가되었고 템플릿쪽에 대한 얘기가 늘어났다. 두번째로 보는 C++ 책이라 불리는 책이니 책에 대한 다른 칭찬의 말은 필요도 없을 ...
The conversion truncates; that is, the fractional part is discarded. 4.9 Floating-integral conversions, ISO/IEC 14882
Suppose you’re on a game show, and you’re given the choice of threedoors: Behind one door is a car; behind the others, goats. You pick adoor, say No. 1, a...
에셋 속성(property)을 조회할 수 있는 프로그램이다. 해상도가 2048 이상인 텍스쳐, 2000 폴리곤 이상을 쓰지만 LOD가 없는 에셋 등을 조회할 수 있다.
일인칭 게임 애니메이션에서는 스테이징이 중요
역할 분담으로 만드는 앙상블을 소개. 오랜 기간 널리 쓰인 조합.
design-based puzzle이라. 이름 참 적절하네. 이 발표 보고 플레이해봤다.
’리그 오브 레전드’는 긴장도가 높은 게임이다. 그래서 욕설이 많이 나오게 된다. 게임 디자인에 수반되는 이런 약점을 알고 연구하는 모습을 보면 배울 게 많다.
#gdc10 One-Page Designs를 발표했던 아저씨. 심시티 사례로 설명. 게임 디자인 문서만 책으로 팔아도 되겠다.
기술(mechanics)은 만족을 만들어야 한다. 카운터 플레이와 팀플레이 만족 요소 설명.
게임 아트를 구조적으로 보는 방법을 제공하는 게 인상적이다. luma, chroma, edge trace, … 도구를 사용
서버 thread 개수 결정 배경과 스트레스 테스트.
빌드 시스템이야말로 블리자드 스케일이로구나.
interest map, danger map을 사용하는 단순한 steering이 인상적
자세한 애니메이션 아키텍처 설명, 명확한 용어 사용이 인상적이다.
ref graph를 활용한 load list 구축. #gdc12 Data is a Four-Letter Word 참고. 개발할 땐 loose loading, 릴리즈에선 loading list를 만들어서 사용.
Frostbite 2 terrain system을 소개. 자극 많이 받는 발표.
havok에서 사용하는 RTTI 코드 생성 자동화, script binding 정책, memory reporting 방법을 소개
구축한 crowd system을 소개. 구축할 때, 참고할 수 있는 자료.
contact solve를 이렇게 설명할 수 있구나. NDC 12에서 발표한 게임 물리 엔진의 내부 동작 원리 이해 발표보다 훨씬 세련되게 설명한다. 한 수 배웠다. 설명 방법이 돋보였던 발표.
엔진 툴 UX 이야기. 코드보다는 photoshop으로 빠른 디자인 iteration을 한다고 하는데, XAML 또한 좋은 선택이 될 것 같다. 명심해야 할 것들이 많다. 용어 통일은 선택이 아니라 당연한 것.
랙돌 구현 노하우가 듬뿍 담긴 발표자료. active, leaf, intermediate로 강체가 본에 미치는 영향을 개념화.
게임 디자인 요소인 Autonomy, Competence, Relatedness를 설명. 그리고 그걸 깼을 때, 어떤 효과를 얻을 수 있는지 예제를 든다. 포탈과 엘더 스크롤 4: 오블리비언에서 Autonomy가 깨졌을 때, 느꼈던 감정이 생각났다.
집중, 주의(attention)에 관한 이야기. 경계 피로(vigilance fatigue)를 줄이는 방법으로 인벤토리 정리가 사용될 수 있다는 건 생각도 못 해봤어.
path 후처리(post-processing)로 step에 맞추는 방법을 소개. Hitman: Absolution에서는 path 변경은 무리여서 speed 조절로 CA(collision avoidance).
사용하고 있는 멀티플레이어 매치 분석 시스템을 소개. 분석에 대한 노하우나 이런 건 없다. UI쪽에 도움이 더 많이 될 듯
얼~ 이 정도까지 하는 거야? 2011년 발표니깐 지금은 더 발전했겠네.
blur를 먼저하고 edge를 찾고 마스킹. 여기서 long, short edge를 구분하고 blur 커널 크기를 다르게 적용해서 original layer에 blend한다. 사진으로 보니 MLAA(morphological anti-aliasing)와 비슷한 품질이 나오고 더 빠르...
UI가 있으니 안 무서워서 게임 플레이 안에 UI 삽입. 그리고 피처를 빨리 쳐내고 더 많이 폴리싱해서 좋은 결과가 나왔다.
NPC 애니메이션 그래프가 메모리를 많이 사용해서 그걸 줄이려고 노력했다.
mega mesh, mega texture, virtual texture, SH lighting 소개. 아티스트 친화적으로 만든 작업 파이프라인.
GPU를 미친 듯이 괴롭힌 이펙트 종결 발표. 거기다 충돌도 구현했다.
DOD로 기존 컬링 코드(Frustum vs sphere)를 3배 더 빠르게 만들었다.
윤곽을 잡는 방법이 신기했고 overdraw, 자연스러운 길 유도, … “이런 것까지 생각하는구나.” 라며 감탄.
에셋(asset) 버전 컨트롤에 어떤 포맷을 해야 할까? 게임에서 빠르게 읽을 수 있게 최적화한 game ready data? 만약 이 포맷으로 저장한다면 maya와 같은 저작(authoring) 툴에서 export 하면 이전 변경 내용이 모두 없어진다. 특히 editor에서 ga...
프로파일러 구현할 때 많이 참고했다. instrument profiler 종결자.
GDC2010부터 시작해 4번째다. 이제는 안 하면 뭔가 찝찝하다. 공개된 발표자료만 보고 정리.
인상 깊었던 아티클들
GDC2012를 간단히 정리했다. 발표하는 분야가 넓어. 이거 다 이해하기는 무리. 잘 모르는 분야는 맛만 본다는 마음가짐으로 간단히 봤다.
지금은 2012년. 그리고 올해 GDC 행사가 끝난 시점. 작년부터 틈틈이 정리하긴 했지만 질질 끌어오던 GDC2011 정리를 마무리 짓고 싶었다. 그래서 서둘러 마무리. 아직 GDC 2012 볼트가 안 열렸으니. 뭐 오케이.
Elixir, OTP, Phoenix로 웹 애플리케이션을 짜는 걸 설명하는 책이다. 어떤 애플리케이션을 만들까? 번갈아 가며 섬의 위치를 추측하는 Island Game이라는 게임을 만든다. 책 한 권을 할애해 처음부터 끝까지 짜면서 설명하기 적당한 예제다.
Enum.all?/1 함수를 사용한 함수 테스트할 때였던 걸로 기억한다. 비어 있는 리스트를 넣어서 테스트했을 때, 기대하지 않은 값이 나와서 의아했다. 비어 있는 리스트를 인자로 넘겼을 때, false 값이 나올 것으로 기대했다. 하지만 true 로 나오는 것이었다. Enum.a...
이제는 Clojure를 거의 안 쓴다. 요즘 많이 쓰고 있는 Elixir로 다시 구현해 볼까? 언제 이런 생각이 들었을까? 아마 Heroku에서 무료 인스턴스(dyno)를 중지한단 소식을 들었을 때였던 걸로 기억한다.
Heroku란?
프로그램에 실행 옵션을 넘기는 방법
어떤 상황에서 이런 걸 고민하게 됐는가?
구성이 마음에 들어서 책을 읽었다. otp, ecto schemas, ecto queries, phoenix를 테스트하는 방법이 목차에 담겨있다. 언어만 elixir로 바꾼 일반 테스팅 책이 아니라는 기대가 있었다. 하지만 막 감탄하면서 읽지는 않았다. 주제가 달라진다고 테스트하는...
We believe good software design is about building layers, so perhaps the most important aspect of this book is helping good programmers understand where l...
피닉스(phoenix) 웹 프레임워크를 사용하다 보면 plug 매크로를 자주 보게 된다. 어떻게 구현했는지 궁금해서 찾아보고 편의 기능과 예외 처리를 제외한 간단한 버전을 구현해봤다.
```elixir defmodule Loader do def load_some_a() do Process.sleep(:timer.seconds(1)) end
그룹 채팅 툴 slack의 elixir 클라이언트 라이브러리인 Elixir-Slack을 보다가 재미있는 코드를 발견했다. 명색이 slack 클라이언트면 slack api 호출을 편하게 할 수 있는 래핑 함수 정도는 제공해야 한다. 하지만 이게 몇 개여. 호출하는 함수를 일일이 언제...
Metaprogramming Elixir 책에서 간단한 예제를 가져왔다. HTML DSL(Domain-specific language)를 매크로로 구현하는 예제를 가져오고 싶었지만 멋진 만큼 설명이 많이 필요했다. 그래서 이거 매크로로 만들어서 어디에 쓸 거야? 하는 unless ...
GenStage - elixir로 비트코인 시세 스크랩 (feat. 업비트) 1/3 JWT - elixir로 비트코인 시세 스크랩 (feat. 업비트) 2/3 prometheus, grafana - elixir로 비트코인 시세 스크랩 (feat. 업비트) 3/3
GenStage - elixir로 비트코인 시세 스크랩 (feat. 업비트) 1/3 JWT - elixir로 비트코인 시세 스크랩 (feat. 업비트) 2/3 prometheus, grafana - elixir로 비트코인 시세 스크랩 (feat. 업비트) 3/3
GenStage - elixir로 비트코인 시세 스크랩 (feat. 업비트) 1/3 JWT - elixir로 비트코인 시세 스크랩 (feat. 업비트) 2/3 prometheus, grafana - elixir로 비트코인 시세 스크랩 (feat. 업비트) 3/3
강력한 매크로(macro)를 배우는 재미에 푹 빠졌다. 예제 코드가 다 훌륭하다.
elixir 언어에서 표준으로 쓰는 데이터베이스 래퍼(wrapper)이자 쿼리 생성기 라이브러리인 ecto를 설명한 책이다. 잘못 사용하고 있는 게 있지 않을까? 편한 걸 놔두고 어렵게 사용하고 있지 않을까? 이런 걸 배우고 싶어서 이 책을 선택했다. 생각보단 영양가가 없었다. e...
deadtrickster/prometheus.erl은 모니터링 시스템인 prometheus.io의 erlang 클라이언트다. 각종 메트릭(metric)을 프로메테우스가 파싱할 수 있는 포맷으로 텍스트를 만든다. deadtrickster/prometheus.ex는 prometheus...
telemetry는 erlang과 elixir에서 표준처럼 쓰는 메트릭(metric) 및 계측(instrumentation) 용도로 사용하는 동적 디스패치(dynamic dispatching) 라이브러리다.
phoenix 웹 프레임워크는 지표(metrics) 내보내기를 쉽게 할 수 있는 prometheus_plugs 패키지가 있어서 쉽게 프로메테우스 연동을 했다. slack 봇인 slab은 어떻게 프로메테우스를 연동할 수 있을까? phoenix 웹 프레임워크를 쓰지 않은 애플리케이션이...
수집하고 분석할 지표(metric)를 phoenix 웹 프레임워크로 만든 프로젝트에서 노출한다. 프로메테우스(prometheus)는 주기적으로 노출한 지표 정보를 긁어서 저장한다. 이 데이터를 그라파나(grafana)가 보기 좋게 가공해서 보여준다.
map을 합치고 싶을 때, Map.merge/2 함수 또는 Enum.into/2 함수를 사용할 수 있다. Enum.into/2 함수는 모듈 이름처럼 더 범용적이다. map뿐만 아니라 다른 자료구조에도 사용할 수 있다.
elixir 언어로 만든 웹 프레임워크 phoenix를 설명한다. phoenix에 관심이 없더라도 추천하고픈 책이다. 잘 만든 웹 프레임워크를 내공 짱짱 맨들이 설명해주기 때문이다. elixir 언어를 만든 Jose Valim도 저자 중 한 명이다. 설명도 좋고 예제 코드도 좋다....
본격적인 사이드 프로젝트 시작에 앞서 몸풀기로 만들었다. 재미있는 주제가 안 떠올랐다. 조금 시간을 들여 뭘 만들지 고민하다가 만만한 검색 랭킹을 골랐다. 동작은 간단하다. 텔레그램 봇에 /start 명령을 입력하면 1분마다 네이버 검색 랭킹 알림이 온다. 그만 받아보려면 /end...
텔레그램은 훌륭한 메신저이자 클라이언트다. 훌륭한 클라이언트가 된 건 bot api 덕분이다. 간단한 iOS 앱을 만들려고 했는데, 텍스트로 제어가 충분하다고 생각하니 텔레그램 봇으로 만들면 되겠단 생각이 들었다. 혼자 쓸 거라 만들어 본 슬랙(slack) 봇은 과하다.
Enum 모듈과 다르게 Stream 모듈은 지연 열거를 지원한다. Stream 모듈 설명 페이지에 있는 비교 예제를 보면 차이가 명확하다.
url을 입력하면 프리뷰를 url 밑에 붙여주는 unfurling links 기능이 필요했다. gitlab을 내부망에 설치해 사용하고 있다. 내부망에 접근할 방법이 없어 slack이 기본으로 제공하는 gitlab 이슈 프리뷰가 안 나온다. slack과 gitlab에 접근할 수 있는...
다음 사이드 프로젝트는 slack 봇(bot)이다. 관리 시간을 줄일 아이디어가 떠올랐다. 언어는 요즘 쓰고 있는 elixir 언어로 결정했다. 처음부터 만들어야 하는 거 아니야? 노노. 이쪽 생태계를 무시하면 안 된다. 1986년에 발표된 32살 erlang 언어가 뒤를 든든하게...
elixir 기본을 익히기엔 <#book Programming Elixir 1.3 / Dave Thomas> 책으로 충분했다. 책에서 맛만 보여주고 만 OTP(Open Telecom Platform)를 더 보고 싶어서 고른 책이다. 만족. 두 번째 elixir 책으로 부...
{:poison, "~> 3.1"}
챕터 배치 신경 많이 썼네. 처음부터 pattern matching을 설명한다. = operator가 다른 것을 본다. 다른 세계에 왔구나. 이걸 처음부터 느낄 수 있었다. 그래서 그런지 아껴서 쓰는 control flow는 미루고 미루다가 뒤에 설명한다.
에셋 속성(property)을 조회할 수 있는 프로그램이다. 해상도가 2048 이상인 텍스쳐, 2000 폴리곤 이상을 쓰지만 LOD가 없는 에셋 등을 조회할 수 있다.
프로파일러 구현할 때 많이 참고했다. instrument profiler 종결자.
입사하면 보게 되는 안내서. 안내서만 보면 어떤 회사인지 알 수 있다. 이렇게 호기롭게 지르고 싶지만 내가 본 안내서가 몇 개 안 될뿐더러 안내서를 공개한 회사 내부 사정을 잘 모른다. 회사 구성원은 어떤 소양을 가진 입사자를 원할까? 자기 동료에게 바라는 건 뭘까? 실상과 다르더...
재현이 안 된 버그는 고칠 수 없다. 재현을 바탕으로 버그를 고쳤는지 확인할 수 있기 때문에. 진짜 못 찾는 건 의심 코드를 저격하고 동향을 살펴 볼 뿐이다. 발견 안 된다고 해도 찝찝해.
하츠네 미쿠. 처음 보고 충격받았던 콘서트 영상이 생각난다.
모에. 뭔지 모르지만 익숙하다. 왜냐면 내 첫 게임 프로젝트에서 많이 쓰였기 때문이다. 모델 뷰어는 MoeView였고 월드 에디터는 MoeTanz였다. 뭔지는 모르겠지만 일반적이지 않다는 건 느꼈다. 아. 다행히 클래스 이름 접두어는 Moe가 아니었… 아니, 있었던 거 같기도 하고.
클로즈 베타 하기 전에 챙겨야 할 리스트다. 왜 클로즈 베타인가? 클라이언트 바이너리가 가장 취약한 시기이기 때문이다.
Side Projects by Sacha Greif. 사이드 프로젝트 완성 노하우를 담은 발표자료.
Advanced Git 발표 영상을 봤다. 무엇보다 눈에 띄는 건 세련된 데모. 이얼~ 정말 많이 해본 것 같다.
빌드 시간이 더 길어진 것 같지 않아요?
GDC2010부터 시작해 4번째다. 이제는 안 하면 뭔가 찝찝하다. 공개된 발표자료만 보고 정리.
Building an army of robots by Kyle Neath. github 내부 툴을 소개한 발표자료. github 아저씨들은 발표자료 참 잘 만든다.
The elements of this language are entities called patterns. Each pattern describes a problem that occurs over and over again in our environment, and then ...
인상 깊었던 아티클들
밸브 신입사원 안내서가 번역됐다. @SunBKim님 덕에 편하게 읽었다.
10 Papers Every Programmer Should Read (At Least Twice)란 글을 봤다. 패기 좀 보소. 꼭 읽어! 두 번 읽어! 시간이 중요하다. 과연 투자할 가치가 있을 것인가? 하지만 2009년에 읽은 책 중 최고였던 Working Effectivel...
GDC2012를 간단히 정리했다. 발표하는 분야가 넓어. 이거 다 이해하기는 무리. 잘 모르는 분야는 맛만 본다는 마음가짐으로 간단히 봤다.
지금은 2012년. 그리고 올해 GDC 행사가 끝난 시점. 작년부터 틈틈이 정리하긴 했지만 질질 끌어오던 GDC2011 정리를 마무리 짓고 싶었다. 그래서 서둘러 마무리. 아직 GDC 2012 볼트가 안 열렸으니. 뭐 오케이.
github 개발 프로세스를 소개하는 발표자료. http://zachholman.com/talk/how-github-uses-github-to-build-github에서 발표자료와 발표를 볼 수 있다.
글 주소는 http://www.viva64.com/en/l/
간략한 shadow volume 소개와 여러 shadow mapping 알고리즘을 소개한 아티클이다. 프로그래머뿐만 아니라 게임에 관심이 있는 사람들도 읽을 수 있도록 쉽게 써서 그림자를 구현하기 전에 살짝 읽기에 좋은 글이다.
사실 style guide가 나와서 말인데, 나는 조엘이 엄선한 소프트웨어 블로그 베스트 29선에서 본 ’스타일은 언어 요소다 - 켄 아놀드’글을 완전 지지한다. 많은 언어가 무시하는 공백 문자를 언어 요소로 넣자고 주장하는데, 지겨운 스타일 논쟁을 완전 없앨 수 있고 파싱이 쉬워...
종종 어떤 XPers들은 많은 디자인 활동과 디자인 패턴을 쓸모없다고 한다. 또 어떤 XP 비방자들은 XP를 디자인도 없는 짜보고 고치는(code and fix) 개발방식으로 회귀라고 말한다. 마틴 파울러(Martin Fowler)가 “어휴 둘 다 오해하고 자빠졌네.”라며 교통정리...
최근에 SICP 스터디가 끝났는데 , SICP에서 배우는 리스프(Lisp)의 방언(dialect)인 스킴(Scheme)의 역사와 중요 개념의 소개를 다룬 글이라서 너무 재미있게 읽었다. 관심 없는 역사는 연도와 사건들의 map으로 밖에 안 느껴져서 너무 지겨운데, 관심이 있거나 지...
특허는 … 알고리즘이 같다면 어떤 컴퓨터 언어로 표현되었는지에 상관없이 침해로 규율할 수 있기 때문이다. … 그러나 출원 및 등록유지 비용이 든다는 점이 단점이다. 이에 비해 저작권은 알고리즘이 표현된 것을 보호하므로 보호받는 범위가 좁고 프로그램 저작물을 의도적으로 보...
맨티스, 버그 질라, 트랙 등 유명한 이슈 트래커가 팀 요구 사항에 맞지 않아 ECUS라는 사내 이슈 트래커를 개발하면서 겪은 경험담을 적어 놓았다. 많이 쓰이는 오픈 소스 기반의 이슈 트래커들의 장단점과 ECUS에서 어떤 걸 버리고 개선했는지에 대한 얘기를 1부에서 다뤘고 이슈 ...
NDC22에서 ’달빛조각사에서 서버 테스트 코드를 작성하는 방법’에 대한 발표했다.
Object* object = NULL; if (object && object->IsValid()) { // ... }
STL에는 auto_ptr라는 스마트 포인터가 있지만 할당하면 소멸식 복사(destructive copy)로 자원에 대한 소유권을 넘겨주는 동작을 한다. STL 알고리즘은 값에 의한 복사가 기본 동작이라서 컨테이너에 못 넣는 스마트 포인터가 되겠다. 이게 이슈가 많이 돼서 이름도 ...
```c++ class RVO { public: RVO() { PrintLine(“constructor”); } RVO(const RVO& rhs) { PrintLine(“copy constructor”); } ~RVO() ...
```c++ class Base { public: Base() { WriteLine(“Base::Base()”, typeid(this).name()); f(); } void f() { WriteLine(...
사실 style guide가 나와서 말인데, 나는 조엘이 엄선한 소프트웨어 블로그 베스트 29선에서 본 ’스타일은 언어 요소다 - 켄 아놀드’글을 완전 지지한다. 많은 언어가 무시하는 공백 문자를 언어 요소로 넣자고 주장하는데, 지겨운 스타일 논쟁을 완전 없앨 수 있고 파싱이 쉬워...
목적은 Construct On First Use와 같다. 즉, global static object, global object 초기화 순서가 명확하지 않아서 발생하는 static initialization order fiasco를 막기 위한 idiom이다.
global static object, global object 가 사용되기 전에 초기화되는 걸 보장하는 idiom이다.
계산한 값을 메모리에 저장해서 여러 번 같은 값 계산을 피하는 최적화 기법을 메모이제이션(memoization)이라고 한다. 실행 속도와 공간을 바꾸는 가장 기초적인 기법이기도 하다. 실수로 메모리제이션이라고 하기도 하는데 메모이제이션이 정확한 용어이다.
PerfHUD나 DirectX Caps Viewer로 볼 수 있지만, 비디오 메모리 사용량을 렌더링하는 게 그리 힘든 일이 아니라 보통 이 정도는 렌더링해준다. 그건 좋은데 문제는 DirectX9 인터페이스로는 사용 가능한 전용 비디오 메모리를 알 수 없는 거다. 그래서 보통 Di...
컴파일할때 파일 간의 디펜던시를 줄이려고 사용하는 관용구(idiom)이다. public 접근 권한으로 정의된 함수가 변경될 때, 이 파일을 include 하는 녀석들이 다시 컴파일되는 건 당연한데, 다른 녀석들이 못 보는 private 접근 권한의 멤버 함수나 변수가 변경될 때도 ...
사용자 입력은 서식화된 입력(공백 문자 무시 등)이 필요하지만 파일 입출력에서는 서식화된(formatted) 입력이 필요 없는 경우가 대부분이다. 서식화된 입출력은 쌩 입출력보다 처리를 하는 게 많아서 속도가 느린 게 당연하다. 공백 문자 무시 옵션을 켜도 되지만 이런 서식화 입출...
두 값이 같은가를 판단하는 두 가지 방법이 존재한다. 첫 번째 방법은 두 값이 같은지를 바로 판단하는 것이고 두 번째 방법은 작지도 않고 크지도 않다는 것을 확인해서 두 값이 같은지를 판단한다. 이 첫 번째 방법은 operator== 로 판단하는데, A == B 이면 두 값이 같다...
transform(), copy() 알고리즘과 같이 연산을 하거나 단순 복사를 하는 알고리즘을 사용할 때, 결과물을 쓰기 위한 반복자(iterator)를 함수 인자로 받는다. operator = 로 값을 쓰기 때문에 결과물을 특정 컨테이너 뒤에 삽입하려면 귀찮은 과정을 거쳐야 한다...
O(logN)으로 수행되는 바이너리 검색(binary search)이다. 물론 바이너리 검색 알고리즘의 전제 조건인 정렬된 순서를 보장해야 하므로 원소들이 정렬된 컨테이너에서만 제대로 동작한다.
함수 어댑터(function adaptor)?!
Effective STL 항목 15에서 string이 여러 가지 방식으로 구현되어 있다는 걸 상기시키고 있다. 구현 방법까지 표준 문서에 정의하지 않았기 때문에 당연한 결과이기도 하다. VS 2005에 포함된 딩컴웨어 STL은 어떻게 구현되었나 궁금해서 찾아봤다.
STL 알고리즘 이름의 _if 접미사는 술어 함수(predicate)를 인자로 받는 것을 의미한다. 이 술어 함수를 알고리즘 안에서 호출해서 돌려받은 반환 값에 따라 동작을 수행할지 말지를 결정하게 된다. 예를 들면 count_if()는 술어 함수 호출결과가 true인 원소들의 개...
컨테이너 정렬이 필요할 때, sort를 사용하고 순서가 유지돼야 하면 stable_sort를 사용했다. partial_sort와 nth_element는 한 번도 사용해본 적이 없는데, 일부분만 정렬이 필요하거나 몇 번째 원소를 뽑을 때 유용하게 사용할 수 있을 것 같다. 예를 들면...
변태적인 복사 동작을 하는 스마트 포인터다. 꼭 필요한 경우가 아니라면 레퍼런스 카운팅을 하는 스마트 포인터를 사용하자.
for_each 알고리즘으로 대체 구현이 가능한 거라 한 번도 사용해보지 않은 알고리즘이다. Effective STL 37번 항목에서 accumulate알고리즘에 대한 언급이 나오는데, 으.. 읽고 보니 좋은 걸 안 쓰고 있었구나.
predicate 발음듣기 [미] [prédikət] 【문법】 술부, 술어 (cf. SUBJECT) 【컴퓨터】 술어 구글 사전
CQS는 간단하게 설명하면 멤버 변수를 변경하는 동작과 멤버 변수 값을 반환하는 동작 중 하나의 동작으로만 멤버 함수를 구현하는 원칙이다. 양다리는 금지.
```c++ class CCAImage { protected: void SetSnapRegion(int x, int y, int dx, int dy); };
파티션을 나눠서 응용 프로그램들을 D 드라이브에 설치하는데, 프로그램 파일 패스가 “C:\Program Files”로 세팅되어 있어서 설치할 때마다 Home –> Del -> D 콤보로 드라이브 명을 바꿔서 설치했다. 웹 서핑하던 중에 레지스트리를 수정해 프로그램 파일 ...
NOOP 혹은 NOP 로 사용하는데, NO OPerator의 줄임말이다. 말 그대로 아무런 연산을 하지 않는 명령어를 뜻한다. 표준이 아니라 VC++ 키워드라는 게 걸리는데, 다른 컴파일러에서 동작하도록 쉽게 수정할 수 있으니 포팅 걱정은 안 하고 VC++에서 편하게 써도 된다. ...
EASTL - Electronic Arts Standard Template Library은 거대 게임 개발사인 EA가 C++ 표준 라이브러리인 STL을 게임 개발에 맞게 수정한 라이브러리이다.
웹 서핑 중에 간단히 잘 정리된 사이트를 찾아서 가물가물 하던 터에 한번 정리해봤다.
```c++ #include #include #include
Unicode 문자 개수 구하기.
UTF-8 문자의 크기는 그림과 같이 1-byte에서 4-byte까지 가질 수 있다. 가장 큰 특징인 기존 US-ASCII와 호환성을 위해 이런 가변 길이 인코딩을 선택했는데, 덕분에 영어는 1-byte로 표현할 수 있지만 한글은 3-byte가 필요하다. 양키들이 쓰는 US-ASC...
Windows에서 Unicode 인코딩은 UTF-16을 기본으로 사용하고 Unicode라고 부르기보다는 wide character라고 부른다. 그래서 Windows에서 wide character는 UTF-16 character라고 생각하면 된다. wide character 자료형인...
Win32 console application에서 Unicode 문자를 표준 출력을 통해 출력하려고 한다. 그러나 console window가 Unicode를 지원하지 않는 문제점이 있다. 이런 문제점을 해결하려면 locale 설정을 한 후 출력을 한다.
Debugging시 Watch창으로 내부 변수들을 볼 수 있다. 위의 그림은 IDirect3DDevice9를 Watch창으로 본 화면. 어휴! 역시 DirectX 새로운 SDK 나오면 무조건 Document부터 다 훑어봐야 한다. 발견한 지 일주일이 안 됐지만 그전부터 사용 가능한...
Suppose you’re on a game show, and you’re given the choice of threedoors: Behind one door is a car; behind the others, goats. You pick adoor, say No. 1, a...
’테스트’라고 하면 ’유닛 테스트(Unit Testing)’를 떠올린다. 좀 더 해상도를 높여서 테스트 코드를 상상하면 ’예제 기반 테스트(Example-based Testing)’을 떠올린다.
속성 기반 테스트 프레임워크인 PropEr, PropCheck를 사용하면 ’Cache 예제코드를 테스트하며 맛보는 Stateful Property-Based Testing’ 예제를 손쉽게 병렬 테스트로 바꿀 수 있다.
속성 기반 테스트(Property-Based Testing)라 하면 Stateless Property를 사용한 테스트를 연상한다. 상태가 없는(stateless) 속성이다. 즉 입력에 대한 결과가 항상 같아야 한다.
’예제로 보는 Property-Based Testing (feat. Kata09: Back to the Checkout)’ 글에서 ’Kata09: Back to the Checkout’ 코드를 짜고 속성 기반 테스트(Property-Based Testing)를 했다. 짠 테스트를 ...
’속성 기반 테스트(Property-based Testing)와 속성 정의에 도움을 주는 네 가지 방법’ 글에서 속성 기반 테스트를 간략히 살펴봤다. 대략 감은 잡겠지만 속성 기반 테스트를 짜라고 하면 막막하다. 이럴 때는 좋은 예제가 도움을 줄 수 있다.
속성 기반 테스트(Property-based Testing)에 대해 들어본 적이 있다. SUT(System Under Test)에 대한 속성(Property)을 정의한다. 테스트 프레임워크 도움을 받아서 테스트를 자동화한다. 하지만 유닛 테스트(Unit Testing)를 처음 접했...
단위 테스트(Unit Testing)에 관한 책을 한 권만 꼽는다면 이 책을 꼽고 싶다. 늦게 알아서 억울한 책이다. 예제가 C#이지만 자신이 사용하는 언어와 상관없이 읽으면 도움이 되는 내용들로 가득하다.
데이터베이스에 값을 저장하고 로드하는 건 스텁(Stub)이나 목(Mock)으로 대체해야 할까? 그냥 직접 사용해도 되는 걸까? 달빛조각사 게임에서는 데이터베이스에 목을 사용하지 않고 테스트를 했다. 통합 테스트(Integration testing) 레벨로 테스트를 짰다. 그러면 통...
테스트 대상이 되는 SUT(System Under Test)와 협력자(Collaborator) 사이에 일어나는 상호 작용을 검사할 때, 테스트 대역(Test double)을 사용한다. 테스트 대역은 크게 목(Mock)과 스텁(Stub)으로 나눌 수 있다. ’단위 테스트 (블라디미르...
단위 테스트(Unit Testing)에서 단위(Unit)의 경계는 무엇일까? OOP(Object-Oriented Programming) 언어로 테스트를 짜고 있다면 클래스(Class)를 단위로 생각하면 되는 걸까? FP(Functional Programming) 언어로 테스트를 짜...
구현 세부 사항(Implementation Details)을 테스트하지 말아야 한다. 리팩터링하면 쉽게 깨지는 테스트가 되기 때문이다. 테스트 코드는 리팩터링을 안전하게 할 수 있게 지켜주는 방어막인데, 장애물이 되어 버린다. 리팩터링했는데, 고쳐야 하는 테스트가 많다면 구현 세부...
’단위 테스트 (블라디미르 코리코프, 2021)’ 책의 ’7장 가치 있는 단위 테스트를 위한 리팩터링’을 보고 정리한 내용이다. 모든 코드를 테스트할 수는 없다. 그래서 중요하고 의미 있는 영역부터 테스트를 짜야 한다. 중요한 영역부터 시작해 덜 중요한 영역까지 테스트 커버리지를 ...
구성이 마음에 들어서 책을 읽었다. otp, ecto schemas, ecto queries, phoenix를 테스트하는 방법이 목차에 담겨있다. 언어만 elixir로 바꾼 일반 테스팅 책이 아니라는 기대가 있었다. 하지만 막 감탄하면서 읽지는 않았다. 주제가 달라진다고 테스트하는...
팀 패스워드 관리 프로그램 tpass 개발하면서 간단하게 만들어서 썼다. 독립된 환경을 가진 유저 2 명으로 테스트를 해야 했기 때문에 테스트 환경에 공을 들였다. 독립된 환경을 구축하는 데 docker를 사용했다. 스크립트 언어로 bash를 사용했다.
컴퓨터 프로그램의 구조와 해석(SICP), 해커와 화가 책을 통해 Lisp에 대한 빠심을 계속 충전해왔다. 이제 그 막연한 빠심을 실체화해야 할 시기.
테스트 코드도 계속 관리해야 하는 코드다. 릴리즈 빌드에 포함이 안 된다고 해서 악취가 진동하게 놔뒀다가는 하나만 고쳐도 엄청나게 많은 테스트 코드가 깨지는 등 감당을 못하게 된다. 좋자고 하는 건데, 테스트 코드가 오히려 병목이 될 수도 있다. ’Invoice를 테스트하려니깐 C...
TDD(Test-Driven Development, 테스트 주도 개발)를 처음 접했을 때, 개발 방법이 충격적이었다. 테스트를 먼저 추가하면서 시작되는 TDD의 리듬을 타면 테스트가 바탕이 된 매우 견고한 코드로 갈 수 있을 것 같다. 하지만 낯선 개발 방법에 적용하는 시간과 노력...
```c++ class CCAImage { protected: void SetSnapRegion(int x, int y, int dx, int dy); };
피닉스(phoenix) 웹 프레임워크를 사용하다 보면 plug 매크로를 자주 보게 된다. 어떻게 구현했는지 궁금해서 찾아보고 편의 기능과 예외 처리를 제외한 간단한 버전을 구현해봤다.
```elixir defmodule Loader do def load_some_a() do Process.sleep(:timer.seconds(1)) end
낯선 예제는 저리가라. 게임 프로그래머 입장에서 모든 예제가 다 친숙하다. observer 패턴을 설명하면서 어떤 걸 예시로 설명할까? 이 책에서는 업적 시스템을 설명한다.
The elements of this language are entities called patterns. Each pattern describes a problem that occurs over and over again in our environment, and then ...
패턴과 리팩토링에는 자연스러운 관계가 있다. 패턴은 우리가 있고 싶은 곳이고, 리팩토링은 그곳에 이르는 방법이다. 리팩토링 p133
뭔가 약을 파는 느낌이 드는 제목. 뭔가 재미없는 이론서를 연상시키는 표지. 저거 안드로메다인가? 속지 말고 저자를 봐야 한다. 엉클 밥이 지은 책.
도메인 주도 설계는 복잡한 도메인을 다뤄야 하는 소프트웨어 프로젝트에 박차를 가하는 것을 목표로 삼는 사고방식이자 우선순위의 모음이다. - 서문 33
’멀티스레드 프로그래밍에 능숙하다.’ 무엇을 의미할까? 스레드, 뮤텍스, 세마포어 등등 의미를 알고 조작할 수 있는 API 사용에 능숙한 것? 아니. 그건 분명히 아닐 것이다. 멀티스레딩으로 깨지지 않고 빠르게 돌아가는 디자인을 할 수 있는 능력이라 생각한다.
책 제목 보고 이 책 안 사려고 했다. 책 제목이 마음에 안 든다. 아꿈사 스터디 책으로 선정돼서 어쩔 수 없이 사긴 했지만 그닥 내키진 않았다. 예전에 읽었던 ’사랑하지 않으면 떠나라’와 비슷해 보였고 어디서 긁어모은 멋진 말들로 도배된 책에 질려 있었는데, 제목을 보니 딱 멋진...
테스트 코드도 계속 관리해야 하는 코드다. 릴리즈 빌드에 포함이 안 된다고 해서 악취가 진동하게 놔뒀다가는 하나만 고쳐도 엄청나게 많은 테스트 코드가 깨지는 등 감당을 못하게 된다. 좋자고 하는 건데, 테스트 코드가 오히려 병목이 될 수도 있다. ’Invoice를 테스트하려니깐 C...
원조. 뭔 말이 더 필요할까? 읽기가 딱딱해서 그렇지 사실 여기 있는 내용을 이해하기 쉽게 풀어놓은 책이 태반이다. 결국 그 말은 이 책에 있는 내용 이상을 쓴 책이 잘 없다는 뜻. 다른 책을 먼저 읽다가 “아~ 이런 시각을 가질 수 있구나!”라고 생각한 항목이 몇 개 있었는데, ...
GoF 디자인 패턴이 어떻게 실제로 쓰이는지 예제로 설명하는 책이다. 책 서문에서 밝히듯이 패턴을 다 쓰려고 남발했지만 적절하게 사용해서 소스 코드를 보는 것만 해도 많은 공부가 됐다.
종종 어떤 XPers들은 많은 디자인 활동과 디자인 패턴을 쓸모없다고 한다. 또 어떤 XP 비방자들은 XP를 디자인도 없는 짜보고 고치는(code and fix) 개발방식으로 회귀라고 말한다. 마틴 파울러(Martin Fowler)가 “어휴 둘 다 오해하고 자빠졌네.”라며 교통정리...
CQS는 간단하게 설명하면 멤버 변수를 변경하는 동작과 멤버 변수 값을 반환하는 동작 중 하나의 동작으로만 멤버 함수를 구현하는 원칙이다. 양다리는 금지.
“IT 서적이 이런식으로 쓰일 수도 있구나!” 처음 한 챕터를 읽고 난 뒤에 충격을 받았다. 기술서적으로는 항상 딱딱한 구성의 책만 보아왔고, 또 당연히 그렇다고 생각했는데 말이다. 이런 구성과 설명이 내 뇌를 어떻게 자극하는지는 모르지만, 분명한 건 이런 구성이 나한테는 꽤 잘 ...
일인칭 게임 애니메이션에서는 스테이징이 중요
역할 분담으로 만드는 앙상블을 소개. 오랜 기간 널리 쓰인 조합.
design-based puzzle이라. 이름 참 적절하네. 이 발표 보고 플레이해봤다.
’리그 오브 레전드’는 긴장도가 높은 게임이다. 그래서 욕설이 많이 나오게 된다. 게임 디자인에 수반되는 이런 약점을 알고 연구하는 모습을 보면 배울 게 많다.
#gdc10 One-Page Designs를 발표했던 아저씨. 심시티 사례로 설명. 게임 디자인 문서만 책으로 팔아도 되겠다.
기술(mechanics)은 만족을 만들어야 한다. 카운터 플레이와 팀플레이 만족 요소 설명.
게임 아트를 구조적으로 보는 방법을 제공하는 게 인상적이다. luma, chroma, edge trace, … 도구를 사용
서버 thread 개수 결정 배경과 스트레스 테스트.
빌드 시스템이야말로 블리자드 스케일이로구나.
interest map, danger map을 사용하는 단순한 steering이 인상적
자세한 애니메이션 아키텍처 설명, 명확한 용어 사용이 인상적이다.
ref graph를 활용한 load list 구축. #gdc12 Data is a Four-Letter Word 참고. 개발할 땐 loose loading, 릴리즈에선 loading list를 만들어서 사용.
GDC2010부터 시작해 4번째다. 이제는 안 하면 뭔가 찝찝하다. 공개된 발표자료만 보고 정리.
발표자는 Stephan T. Lavavej. 줄이면 STL. 운명을 받아들여 MS에서 STL을 구현 중이다. tuple에 관한 건 다 훑어본다. C++11, C++14, C++17. 처음 보는 함수도 있었음.
STL에는 auto_ptr라는 스마트 포인터가 있지만 할당하면 소멸식 복사(destructive copy)로 자원에 대한 소유권을 넘겨주는 동작을 한다. STL 알고리즘은 값에 의한 복사가 기본 동작이라서 컨테이너에 못 넣는 스마트 포인터가 되겠다. 이게 이슈가 많이 돼서 이름도 ...
사용자 입력은 서식화된 입력(공백 문자 무시 등)이 필요하지만 파일 입출력에서는 서식화된(formatted) 입력이 필요 없는 경우가 대부분이다. 서식화된 입출력은 쌩 입출력보다 처리를 하는 게 많아서 속도가 느린 게 당연하다. 공백 문자 무시 옵션을 켜도 되지만 이런 서식화 입출...
두 값이 같은가를 판단하는 두 가지 방법이 존재한다. 첫 번째 방법은 두 값이 같은지를 바로 판단하는 것이고 두 번째 방법은 작지도 않고 크지도 않다는 것을 확인해서 두 값이 같은지를 판단한다. 이 첫 번째 방법은 operator== 로 판단하는데, A == B 이면 두 값이 같다...
transform(), copy() 알고리즘과 같이 연산을 하거나 단순 복사를 하는 알고리즘을 사용할 때, 결과물을 쓰기 위한 반복자(iterator)를 함수 인자로 받는다. operator = 로 값을 쓰기 때문에 결과물을 특정 컨테이너 뒤에 삽입하려면 귀찮은 과정을 거쳐야 한다...
O(logN)으로 수행되는 바이너리 검색(binary search)이다. 물론 바이너리 검색 알고리즘의 전제 조건인 정렬된 순서를 보장해야 하므로 원소들이 정렬된 컨테이너에서만 제대로 동작한다.
함수 어댑터(function adaptor)?!
Effective STL 항목 15에서 string이 여러 가지 방식으로 구현되어 있다는 걸 상기시키고 있다. 구현 방법까지 표준 문서에 정의하지 않았기 때문에 당연한 결과이기도 하다. VS 2005에 포함된 딩컴웨어 STL은 어떻게 구현되었나 궁금해서 찾아봤다.
STL 알고리즘 이름의 _if 접미사는 술어 함수(predicate)를 인자로 받는 것을 의미한다. 이 술어 함수를 알고리즘 안에서 호출해서 돌려받은 반환 값에 따라 동작을 수행할지 말지를 결정하게 된다. 예를 들면 count_if()는 술어 함수 호출결과가 true인 원소들의 개...
컨테이너 정렬이 필요할 때, sort를 사용하고 순서가 유지돼야 하면 stable_sort를 사용했다. partial_sort와 nth_element는 한 번도 사용해본 적이 없는데, 일부분만 정렬이 필요하거나 몇 번째 원소를 뽑을 때 유용하게 사용할 수 있을 것 같다. 예를 들면...
변태적인 복사 동작을 하는 스마트 포인터다. 꼭 필요한 경우가 아니라면 레퍼런스 카운팅을 하는 스마트 포인터를 사용하자.
for_each 알고리즘으로 대체 구현이 가능한 거라 한 번도 사용해보지 않은 알고리즘이다. Effective STL 37번 항목에서 accumulate알고리즘에 대한 언급이 나오는데, 으.. 읽고 보니 좋은 걸 안 쓰고 있었구나.
predicate 발음듣기 [미] [prédikət] 【문법】 술부, 술어 (cf. SUBJECT) 【컴퓨터】 술어 구글 사전
EASTL - Electronic Arts Standard Template Library은 거대 게임 개발사인 EA가 C++ 표준 라이브러리인 STL을 게임 개발에 맞게 수정한 라이브러리이다.
```c++ #include #include #include
맥 미니(Mac mini M2, 2023)를 꺼본 적이 없다. 매직 트랙패드(Magic Trackpad) 2를 손가락으로 간지럽히면 언제든 깨어난다. 팬이 있는지도 모르겠다. 이게 다 조용해서 그렇다.
회사에서는 아웃룩을 쓰고 개인적으론 구글 캘린더를 사용하고 있다. 일정을 분리해서 관리하지만 같이 보고 싶을 때도 있어서 구글 캘린더에서 아웃룩 일정도 같이 보고 있다. 한 달 정도 사용하니 일정이 제대로 동기화되지 않는 문제를 발견했다 그걸 해결하는 Google Apps Scri...
참 애정하는 기능이다. Todo를 모아서 보여준다. 나를 맨션(@mention) 하거나 담당자로 지정하면 자동으로 Todo 항목이 된다. 물론 이슈에 있는 Add Todo 버튼을 눌러 직접 추가할 수도 있다.
사용자 정의 링크를 지원한다. 써보니 편하다. 규칙에 맞게 타이핑하면 자동으로 링크를 만들어 준다. C.[카드번호]로 trello 카드에 연결했다.
많은 HR은 아직 잘 모르고 있지만 사실 자바, 루비, .NET, 혹은 아이폰 SDK를 아는지 모르는지는 별로 중요하지 않습니다. 배워야 할 신기술이나 예전 기술의 새 버전은 끊임없이 등장합니다. 기술 자체는 별로 중요하지 않습니다. 중요한 것은 지속적으로 배우는 것입니다.
실용주의 프로그래머는 무엇이 다른가? 우리는 태도와 스타일 그리고 문제와 해법에 접근하는 철학에 차이가 있다고 생각한다. 그들은 직면한 문제 너머를 생각하며, 문제를 항상 더 큰 맥락에 놓으려 노력하고, 항상 더 큰 그림을 보려 한다. 어쨌건 이런 더 큰 맥락 없이 도대체 어...
GPU Gems3 Ch28. Practical Post Process Depth Of Field 아티클의 결론이다. 결론이 참 인상적이다. 내가 읽은 아티클은 보통 뭐보다 몇 배 빠르고 킹왕짱이다라고 말하거나 PC 사양을 적어놓고 FPS(Frame Per Second)를 비교했었다...
사실 이제까지 아무런 불평불만 없이 잘 써왔다. Lisp를 틈틈이 배우고 있는데, 가장 잘 어울리는 환경이 Emacs라서 설치하고 도움말을 찾아봤다. 그런데 얼씨구! 키 입력에 왜 이리 컨트롤 키(Ctrl)가 많은지 모르겠다. 같이 누르기가 너무 불편하다. 단축키를 배정한 사람이 ...
네에, 사람은 슬퍼서 우는게 아니라 울기 때문에 슬퍼지는 거라고 합니다. 등을 곧게 펴고 억지로 웃음을 띄우고 있다 보면 동요했던 마음이 차분히 가라앉을 때가 있습니다. 술을 넣는 순서, 보틀 쥐는 방법, 코스터 위치… 나도 처음엔 다 쓸데 없는 짓이라고 생각했어요. 하지만 ...
머리로 하는 직업인데, 머리가 안 돌아가면 정말 막막하다. XP의 아버지 켄트 벡(Kent Beck)은 머리가 안 돌아갈 때 밖에 나가서 톱질한다고 한다. 육체적인 움직임이 머리를 돌리는데 도움을 준다는 얘기인데, 여기저기 찾아볼 필요없이 내 경험만 들추어봐도 이런 경험을 한 경우...
repository templates?
merge 한 커밋(commit)이 잘못됐다. push 해버려서 amend는 불가능. amend 가능해도 못하겠네. 꽤 복잡한 문제라서 revert를 하고 찬찬히 봐야겠다.
“커밋이 사라졌어요”
느슨한 규칙을 사용해도 충분히 도움이 된 코드 리뷰
dotfiles를 버전 컨트롤 한다. 리파지토리는 github 서비스를 사용. 덕분에 회사와 집에서 같은 세팅을 쉽게 적용하고 있다.
Advanced Git 발표 영상을 봤다. 무엇보다 눈에 띄는 건 세련된 데모. 이얼~ 정말 많이 해본 것 같다.
amend는 약간 수정한다는 뜻. 소심하게 보인다. 하지만 터프해. git 히스토리(history)를 조작한다. git은 히스토리 조작이 범죄가 아니다. 염려하지 않아도 된다. 다만 다른 버전 컨트롤 시스템에서는 금지하는 영역에 손을 담근 것이기에 아주 조심해야 한다.
A Tale of Three Trees는 index를 비롯해 HEAD, wd(working directory)를 쉽게 설명한다. 여기서 index에 대한 이해가 부족했는데, index를 더 자세히 설명한 자료가 있어서 정리.
이런 persistent vector가 있다. 왜 persistent인가 하면 vector가 생성된 후, 변경할 수 없기 때문이다. 즉, 4를 5로 바꾸고 싶다면 5를 생성해 간선(edge)으로 연결하고 4를 연결하는 간선을 제거한 새로운 vector를 생성해야 한다.
dotfiles란?
repository templates?
GenStage - elixir로 비트코인 시세 스크랩 (feat. 업비트) 1/3 JWT - elixir로 비트코인 시세 스크랩 (feat. 업비트) 2/3 prometheus, grafana - elixir로 비트코인 시세 스크랩 (feat. 업비트) 3/3
GenStage - elixir로 비트코인 시세 스크랩 (feat. 업비트) 1/3 JWT - elixir로 비트코인 시세 스크랩 (feat. 업비트) 2/3 prometheus, grafana - elixir로 비트코인 시세 스크랩 (feat. 업비트) 3/3
최근 elixir 프로젝트를 몇 개 진행하며 프로젝트 템플릿을 모아두는 github 저장소를 만들어야겠다고 생각했다. 매번 필요한 스크립트를 이전 프로젝트 디렉터리를 뒤져서 복사해서 사용했기 때문이다. 그냥 가져다 쓰는 경우도 있지만 수정하거나 추가하는 경우도 있다. 갱신한 스크립...
입사하면 할 일이 있다. 바로 작업 환경 구축. 하루는 이걸로 날린다고 보면 된다. 가끔 컴퓨터를 포맷하면 또 하루를 세팅으로 날린다.
dotfiles를 버전 컨트롤 한다. 리파지토리는 github 서비스를 사용. 덕분에 회사와 집에서 같은 세팅을 쉽게 적용하고 있다.
github에서 만든 채팅 봇. 단순한 채팅 봇이다. 그렇다고 무시해서는 곤란하다. github 문화를 지탱하는 큰 기둥 중 하나걸랑.
빌드 시간이 더 길어진 것 같지 않아요?
Building an army of robots by Kyle Neath. github 내부 툴을 소개한 발표자료. github 아저씨들은 발표자료 참 잘 만든다.
github 개발 프로세스를 소개하는 발표자료. http://zachholman.com/talk/how-github-uses-github-to-build-github에서 발표자료와 발표를 볼 수 있다.
낯선 예제는 저리가라. 게임 프로그래머 입장에서 모든 예제가 다 친숙하다. observer 패턴을 설명하면서 어떤 걸 예시로 설명할까? 이 책에서는 업적 시스템을 설명한다.
재현이 안 된 버그는 고칠 수 없다. 재현을 바탕으로 버그를 고쳤는지 확인할 수 있기 때문에. 진짜 못 찾는 건 의심 코드를 저격하고 동향을 살펴 볼 뿐이다. 발견 안 된다고 해도 찝찝해.
클로즈 베타 하기 전에 챙겨야 할 리스트다. 왜 클로즈 베타인가? 클라이언트 바이너리가 가장 취약한 시기이기 때문이다.
게임 디자인에 대한 고민. 영감을 어디에서 얻었는가? 수많은 장애물이 있었을 텐데, 그걸 어떻게 해결했나? 이런 걸 기대했다.
에디터에서 커브(curve)로 색 보정(color correction)을 할 수 있다. R, G, B, 휘도(luminance) 커브를 지원한다. 결과를 실시간으로 확인할 수 있다. 이게 가장 큰 장점. 인터페이스도 아티스트에게 친숙한 커브다.
The elements of this language are entities called patterns. Each pattern describes a problem that occurs over and over again in our environment, and then ...
밸브 신입사원 안내서가 번역됐다. @SunBKim님 덕에 편하게 읽었다.
게임 엔진에 관한 모든 부분을 다룬다. foundation layer부터 rendering, animation, physics, … 보면서 Real-time Rendering과 Code Complete가 생각났다. 주제는 다르지만, 책 성격이 비슷하기 때문이다. 타겟팅 공격보다는 ...
살아 있는 교훈이 담긴 게임 개발 포스트모템 모음집. 포스트모템이라도 잘 모르는 게임이면 재미가 덜하다. 구현한 콘텐츠를 예로 들어도 무슨 얘기인지 알아먹기도 어렵고. 하지만 이 책은 그런 걱정 없다. 진짜 유명하고 성공한 게임 이야기가 담겨 있으니. WoW, HL2, Unchar...
Prince of Persia Animation Reference 1985 from jordan mechner on Vimeo.
이런 persistent vector가 있다. 왜 persistent인가 하면 vector가 생성된 후, 변경할 수 없기 때문이다. 즉, 4를 5로 바꾸고 싶다면 5를 생성해 간선(edge)으로 연결하고 4를 연결하는 간선을 제거한 새로운 vector를 생성해야 한다.
컴퓨터 프로그램의 구조와 해석(SICP), 해커와 화가 책을 통해 Lisp에 대한 빠심을 계속 충전해왔다. 이제 그 막연한 빠심을 실체화해야 할 시기.
엔진 툴 UX 이야기. 코드보다는 photoshop으로 빠른 디자인 iteration을 한다고 하는데, XAML 또한 좋은 선택이 될 것 같다. 명심해야 할 것들이 많다. 용어 통일은 선택이 아니라 당연한 것.
처음 봤을 때, 그냥 괜찮은 디자인처럼 보였다. 나는 Ctrl+L 로 주소창을 열고 URL 주소를 타이핑해서 사이트를 찾아가기 때문에, 저런 인터페이스는 그냥 예쁜 인터페이스에 불과했다. 키보드에 얹은 손을 마우스로 다시 옮기기도 귀찮아서 키보드로 할 수 있는 건 웬만하면 다 키보...
ACM문제 코드를 제출하기 전 예제를 몇 개 만들어서 돌리고 눈으로 검증하곤 했는데, 그렇게 하지 말고 유닛 테스트(unit test) 프레임 워크를 사용해서 알고리즘을 검증하면 되겠다 싶어서 google test를 붙였다. 이렇게 세팅하고 나니 google test 라이브러리에 ...
미루어 왔던 <응용 프로그램을 위한 최상의 사용자 환경을 만드는 방법 - MSDN>을 드디어 읽었다.
에디터에서 커브(curve)로 색 보정(color correction)을 할 수 있다. R, G, B, 휘도(luminance) 커브를 지원한다. 결과를 실시간으로 확인할 수 있다. 이게 가장 큰 장점. 인터페이스도 아티스트에게 친숙한 커브다.
이 책은 사이트맵과 같다. 실시간 렌더링에 관한 지식을 참 꼼꼼하게도 군데군데 구석구석 잘 퍼트려 놨는데, 그걸 잘 정리해주기 때문이다. 물론 하나하나 자세하게 설명하진 않는다. 그래 맞아. 사이트맵이 그러면 안 돼. 대신 핵심을 이해할 수 있게 설명한다. 그래서 그런지 설명을 좀...
픽사에서 카(car)와 인크레더블(Incredible) 제작에 참여한 테크니컬 디렉터인 제레미 번(Jeremy Birn)이 3D 라이팅과 렌더링을 위해 알아야 할 기본 원리를 풀어놓은 책이다.
간략한 shadow volume 소개와 여러 shadow mapping 알고리즘을 소개한 아티클이다. 프로그래머뿐만 아니라 게임에 관심이 있는 사람들도 읽을 수 있도록 쉽게 써서 그림자를 구현하기 전에 살짝 읽기에 좋은 글이다.
GPU Gems3 Ch28. Practical Post Process Depth Of Field 아티클의 결론이다. 결론이 참 인상적이다. 내가 읽은 아티클은 보통 뭐보다 몇 배 빠르고 킹왕짱이다라고 말하거나 PC 사양을 적어놓고 FPS(Frame Per Second)를 비교했었다...
사용하고 있는 멀티플레이어 매치 분석 시스템을 소개. 분석에 대한 노하우나 이런 건 없다. UI쪽에 도움이 더 많이 될 듯
얼~ 이 정도까지 하는 거야? 2011년 발표니깐 지금은 더 발전했겠네.
blur를 먼저하고 edge를 찾고 마스킹. 여기서 long, short edge를 구분하고 blur 커널 크기를 다르게 적용해서 original layer에 blend한다. 사진으로 보니 MLAA(morphological anti-aliasing)와 비슷한 품질이 나오고 더 빠르...
UI가 있으니 안 무서워서 게임 플레이 안에 UI 삽입. 그리고 피처를 빨리 쳐내고 더 많이 폴리싱해서 좋은 결과가 나왔다.
NPC 애니메이션 그래프가 메모리를 많이 사용해서 그걸 줄이려고 노력했다.
mega mesh, mega texture, virtual texture, SH lighting 소개. 아티스트 친화적으로 만든 작업 파이프라인.
GPU를 미친 듯이 괴롭힌 이펙트 종결 발표. 거기다 충돌도 구현했다.
DOD로 기존 컬링 코드(Frustum vs sphere)를 3배 더 빠르게 만들었다.
지금은 2012년. 그리고 올해 GDC 행사가 끝난 시점. 작년부터 틈틈이 정리하긴 했지만 질질 끌어오던 GDC2011 정리를 마무리 짓고 싶었다. 그래서 서둘러 마무리. 아직 GDC 2012 볼트가 안 열렸으니. 뭐 오케이.
Frostbite 2 terrain system을 소개. 자극 많이 받는 발표.
havok에서 사용하는 RTTI 코드 생성 자동화, script binding 정책, memory reporting 방법을 소개
구축한 crowd system을 소개. 구축할 때, 참고할 수 있는 자료.
contact solve를 이렇게 설명할 수 있구나. NDC 12에서 발표한 게임 물리 엔진의 내부 동작 원리 이해 발표보다 훨씬 세련되게 설명한다. 한 수 배웠다. 설명 방법이 돋보였던 발표.
엔진 툴 UX 이야기. 코드보다는 photoshop으로 빠른 디자인 iteration을 한다고 하는데, XAML 또한 좋은 선택이 될 것 같다. 명심해야 할 것들이 많다. 용어 통일은 선택이 아니라 당연한 것.
랙돌 구현 노하우가 듬뿍 담긴 발표자료. active, leaf, intermediate로 강체가 본에 미치는 영향을 개념화.
게임 디자인 요소인 Autonomy, Competence, Relatedness를 설명. 그리고 그걸 깼을 때, 어떤 효과를 얻을 수 있는지 예제를 든다. 포탈과 엘더 스크롤 4: 오블리비언에서 Autonomy가 깨졌을 때, 느꼈던 감정이 생각났다.
집중, 주의(attention)에 관한 이야기. 경계 피로(vigilance fatigue)를 줄이는 방법으로 인벤토리 정리가 사용될 수 있다는 건 생각도 못 해봤어.
path 후처리(post-processing)로 step에 맞추는 방법을 소개. Hitman: Absolution에서는 path 변경은 무리여서 speed 조절로 CA(collision avoidance).
GDC2012를 간단히 정리했다. 발표하는 분야가 넓어. 이거 다 이해하기는 무리. 잘 모르는 분야는 맛만 본다는 마음가짐으로 간단히 봤다.
ref graph를 활용한 load list 구축. #gdc12 Data is a Four-Letter Word 참고. 개발할 땐 loose loading, 릴리즈에선 loading list를 만들어서 사용.
NPC 애니메이션 그래프가 메모리를 많이 사용해서 그걸 줄이려고 노력했다.
mega mesh, mega texture, virtual texture, SH lighting 소개. 아티스트 친화적으로 만든 작업 파이프라인.
에셋(asset) 버전 컨트롤에 어떤 포맷을 해야 할까? 게임에서 빠르게 읽을 수 있게 최적화한 game ready data? 만약 이 포맷으로 저장한다면 maya와 같은 저작(authoring) 툴에서 export 하면 이전 변경 내용이 모두 없어진다. 특히 editor에서 ga...
NDC22에서 ’달빛조각사에서 서버 테스트 코드를 작성하는 방법’에 대한 발표했다.
관심사가 한쪽으로 몰려있다. 이번엔 가능하면 관심사에서 벗어나는 주제를 다룬 발표를 선택했다. ndc 아니면 언제 듣겠나 싶어서.
재현이 안 된 버그는 고칠 수 없다. 재현을 바탕으로 버그를 고쳤는지 확인할 수 있기 때문에. 진짜 못 찾는 건 의심 코드를 저격하고 동향을 살펴 볼 뿐이다. 발견 안 된다고 해도 찝찝해.
하츠네 미쿠. 처음 보고 충격받았던 콘서트 영상이 생각난다.
모에. 뭔지 모르지만 익숙하다. 왜냐면 내 첫 게임 프로젝트에서 많이 쓰였기 때문이다. 모델 뷰어는 MoeView였고 월드 에디터는 MoeTanz였다. 뭔지는 모르겠지만 일반적이지 않다는 건 느꼈다. 아. 다행히 클래스 이름 접두어는 Moe가 아니었… 아니, 있었던 거 같기도 하고.
클로즈 베타 하기 전에 챙겨야 할 리스트다. 왜 클로즈 베타인가? 클라이언트 바이너리가 가장 취약한 시기이기 때문이다.
한 스푼이 30g. 코코아 타 먹는 거면 대충 타겠는데, 분유잖아. 10g에 10ml가 가이드라인. 이거 어기면 큰일 날 것 같다. 좀 쫄았어.
when, what 분리. 관리가 쉬워질 것 같다. artifacts 전달로 중복을 제거하자.
본진 programming notes 블로그 툴을 wordpress에서 jekyll로 바꿨다. 덩치가 있어 핫 하다고 무턱대고 바꾸기가 망설여진다. 그래서 개인 프로젝트 개발 일기 블로그 툴로 사용해봤다. 쓸만한가? 만족. 전진기지 안정화에 성공했으니 이제 본진에 신경 쓸 차례다.
재현이 안 된 버그는 고칠 수 없다. 재현을 바탕으로 버그를 고쳤는지 확인할 수 있기 때문에. 진짜 못 찾는 건 의심 코드를 저격하고 동향을 살펴 볼 뿐이다. 발견 안 된다고 해도 찝찝해.
모에. 뭔지 모르지만 익숙하다. 왜냐면 내 첫 게임 프로젝트에서 많이 쓰였기 때문이다. 모델 뷰어는 MoeView였고 월드 에디터는 MoeTanz였다. 뭔지는 모르겠지만 일반적이지 않다는 건 느꼈다. 아. 다행히 클래스 이름 접두어는 Moe가 아니었… 아니, 있었던 거 같기도 하고.
클로즈 베타 하기 전에 챙겨야 할 리스트다. 왜 클로즈 베타인가? 클라이언트 바이너리가 가장 취약한 시기이기 때문이다.
Side Projects by Sacha Greif. 사이드 프로젝트 완성 노하우를 담은 발표자료.
yahoo pipes를 사용하면 된다. 편하네. 예전에 알았던 야후 파이프를 이제야 써먹어 본다. 복잡하지 않으면 그래프 기반 다이어그램처럼 직관적인 게 따로 없다. 내가 만든 파이프.
deadtrickster/prometheus.erl은 모니터링 시스템인 prometheus.io의 erlang 클라이언트다. 각종 메트릭(metric)을 프로메테우스가 파싱할 수 있는 포맷으로 텍스트를 만든다. deadtrickster/prometheus.ex는 prometheus...
defp eventually(func) do if func.() do true else Process.sleep(10) eventually(func) end end
map을 합치고 싶을 때, Map.merge/2 함수 또는 Enum.into/2 함수를 사용할 수 있다. Enum.into/2 함수는 모듈 이름처럼 더 범용적이다. map뿐만 아니라 다른 자료구조에도 사용할 수 있다.
```c++ override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. }
DO name interfaces with adjective phrases, or occasionally with nouns or noun phrases. Nouns and noun phrases should be used rarely and they might...
(column-number-mode 1) (column-number-mode)
#define SUPERSUBCLASS_STRICT(T, U) \ (SUPERSUBCLASS(T, U) && \ !Conversion<const T, const U*>::sameTy...
게임루프에 주요 이슈를 잘 정리. bucket 개념을 추가한 게 좋았고 bucket update 사이에 broadphase AABBs를 업데이트하는 게 신선했다.
게임 디자인 요소인 Autonomy, Competence, Relatedness를 설명. 그리고 그걸 깼을 때, 어떤 효과를 얻을 수 있는지 예제를 든다. 포탈과 엘더 스크롤 4: 오블리비언에서 Autonomy가 깨졌을 때, 느꼈던 감정이 생각났다.
집중, 주의(attention)에 관한 이야기. 경계 피로(vigilance fatigue)를 줄이는 방법으로 인벤토리 정리가 사용될 수 있다는 건 생각도 못 해봤어.
언차티드 1을 만들기 시작했을 때는 스튜디오에 젊은 사람들이 많았습니다. 대다수가 이 업계에서 일을 시작한 것이 20대 초반 무렵이었습니다. 시작 무렵에 주인공과 인물들 모두 20대 초반의 나이였어요. [.] 게임을 비롯해 예술 분야가 반영하는 것은 창작자의 내면이...
NPC 애니메이션 그래프가 메모리를 많이 사용해서 그걸 줄이려고 노력했다.
윤곽을 잡는 방법이 신기했고 overdraw, 자연스러운 길 유도, … “이런 것까지 생각하는구나.” 라며 감탄.
언차티드 2 제작과정을 재미있게 봐서 언차티드 3도 망설임 없이 찾아봤다. 좀 나온 지 됐네. 잊고 있었어.
저희는 관리와 회의, 장문의 전자우편을 별로 좋아하지 않습니다. 게임에서 뭔가 고치고 싶으면 허락을 받는 게 아니라 일단 멋지게 고쳐놓고 보는 거죠.
역할 분담으로 만드는 앙상블을 소개. 오랜 기간 널리 쓰인 조합.
design-based puzzle이라. 이름 참 적절하네. 이 발표 보고 플레이해봤다.
’리그 오브 레전드’는 긴장도가 높은 게임이다. 그래서 욕설이 많이 나오게 된다. 게임 디자인에 수반되는 이런 약점을 알고 연구하는 모습을 보면 배울 게 많다.
#gdc10 One-Page Designs를 발표했던 아저씨. 심시티 사례로 설명. 게임 디자인 문서만 책으로 팔아도 되겠다.
기술(mechanics)은 만족을 만들어야 한다. 카운터 플레이와 팀플레이 만족 요소 설명.
게임 아트를 구조적으로 보는 방법을 제공하는 게 인상적이다. luma, chroma, edge trace, … 도구를 사용
게임 디자인 요소인 Autonomy, Competence, Relatedness를 설명. 그리고 그걸 깼을 때, 어떤 효과를 얻을 수 있는지 예제를 든다. 포탈과 엘더 스크롤 4: 오블리비언에서 Autonomy가 깨졌을 때, 느꼈던 감정이 생각났다.
집중, 주의(attention)에 관한 이야기. 경계 피로(vigilance fatigue)를 줄이는 방법으로 인벤토리 정리가 사용될 수 있다는 건 생각도 못 해봤어.
warning level 4로 만든 프로젝트는 총 3개다. 모두 덩치가 있는 게임 프로젝트였다. 크고 지루한 작업이었다. 하나를 제외하곤. 드물게 엔진이 level 4였다.
```c++ class RVO { public: RVO() { PrintLine(“constructor”); } RVO(const RVO& rhs) { PrintLine(“copy constructor”); } ~RVO() ...
NOOP 혹은 NOP 로 사용하는데, NO OPerator의 줄임말이다. 말 그대로 아무런 연산을 하지 않는 명령어를 뜻한다. 표준이 아니라 VC++ 키워드라는 게 걸리는데, 다른 컴파일러에서 동작하도록 쉽게 수정할 수 있으니 포팅 걱정은 안 하고 VC++에서 편하게 써도 된다. ...
ACM문제 코드를 제출하기 전 예제를 몇 개 만들어서 돌리고 눈으로 검증하곤 했는데, 그렇게 하지 말고 유닛 테스트(unit test) 프레임 워크를 사용해서 알고리즘을 검증하면 되겠다 싶어서 google test를 붙였다. 이렇게 세팅하고 나니 google test 라이브러리에 ...
위 빨간색으로 표시한 버튼을 누르면 찾아보기 타겟 폴더 셋을 추가 할 수 있다.
Shader study에서 공부한 교재. Game Programming Gems와 같이 저자 여러명이 참여한 책이다. rendering 기술에 집중한 글들이 있는 게 특징.
Enum.all?/1 함수를 사용한 함수 테스트할 때였던 걸로 기억한다. 비어 있는 리스트를 넣어서 테스트했을 때, 기대하지 않은 값이 나와서 의아했다. 비어 있는 리스트를 인자로 넘겼을 때, false 값이 나올 것으로 기대했다. 하지만 true 로 나오는 것이었다. Enum.a...
정말 오랜만에 보는 이산수학. 책을 보는 내내 연습문제 숙제로 시달리던 대학교 생각이 났다. 이 책도 더럽게 연습문제 많더라. 처음엔 연습문제와 같이 있는 프로그래밍 문제도 같이 풀려고 했는데, 보는데 조급해서 풀어보진 않았다. 예제를 열심히 보는 것에 만족.
간혹 수학이 발목을 잡을 때가 있어서 수학 책을 한 권 봐야겠다 싶었던 차에 눈에 띈 책이다. 선형 대수부터 셰이딩, 조명, 래스터화, 강체 역학까지 게임에 필요한 기초 수학은 다 다루고 있다. 자세히 설명을 안 하고 넘어가는 게 간혹 있지만 대부분 충실히 설명하고 있다. 다행히 ...
Mathematica, Maple과 같은 Computer Algebra System이다. 그래픽스를 공부하면서 수학 공식만 보면 뒷골이 땡기고 이해 못 하면 안 되는데 하며 똥줄이 타던 차에 발견한 프로그램이다. MIT에서 1960년대에 개발된 Macsyma가 모태가 된 프로그램으...
윤곽을 잡는 방법이 신기했고 overdraw, 자연스러운 길 유도, … “이런 것까지 생각하는구나.” 라며 감탄.
에셋(asset) 버전 컨트롤에 어떤 포맷을 해야 할까? 게임에서 빠르게 읽을 수 있게 최적화한 game ready data? 만약 이 포맷으로 저장한다면 maya와 같은 저작(authoring) 툴에서 export 하면 이전 변경 내용이 모두 없어진다. 특히 editor에서 ga...
프로파일러 구현할 때 많이 참고했다. instrument profiler 종결자.
인상 깊었던 아티클들
| pnotes | exp cabinet | emacsian | ddiary | |--------+-------------+----------+--------| | 424 | 772 | 99 | 161 |
jekyll 블로깅 툴에 메타데이터를 추가하는 플러그인이 있다. jekyll-seo-tag 플러그인이다. Gemfile 파일과 _config.yml 파일에 jekyll-seo-tag gem을 추가한다. </head> 태그 전에 seo 태그를 추가한다. 간단하다.
static 블로깅 툴인 jekyll은 직접 빌드를 해야 한다. 빌드 결과물인 html, css 파일을 웹호스팅 서버로 배포한다. 이걸 수동으로 하고 있었다. script/build 스크립트로 빌드하고 filezilla로 업로드하고 있다. 언젠가는 aws로 옮기고 push hook...
jekyll 플러그인 jemoji를 설치하면 된다.
본진 programming notes 블로그 툴을 wordpress에서 jekyll로 바꿨다. 덩치가 있어 핫 하다고 무턱대고 바꾸기가 망설여진다. 그래서 개인 프로젝트 개발 일기 블로그 툴로 사용해봤다. 쓸만한가? 만족. 전진기지 안정화에 성공했으니 이제 본진에 신경 쓸 차례다.
게임루프에 주요 이슈를 잘 정리. bucket 개념을 추가한 게 좋았고 bucket update 사이에 broadphase AABBs를 업데이트하는 게 신선했다.
집중, 주의(attention)에 관한 이야기. 경계 피로(vigilance fatigue)를 줄이는 방법으로 인벤토리 정리가 사용될 수 있다는 건 생각도 못 해봤어.
언차티드 1을 만들기 시작했을 때는 스튜디오에 젊은 사람들이 많았습니다. 대다수가 이 업계에서 일을 시작한 것이 20대 초반 무렵이었습니다. 시작 무렵에 주인공과 인물들 모두 20대 초반의 나이였어요. [.] 게임을 비롯해 예술 분야가 반영하는 것은 창작자의 내면이...
NPC 애니메이션 그래프가 메모리를 많이 사용해서 그걸 줄이려고 노력했다.
윤곽을 잡는 방법이 신기했고 overdraw, 자연스러운 길 유도, … “이런 것까지 생각하는구나.” 라며 감탄.
언차티드 2 제작과정을 재미있게 봐서 언차티드 3도 망설임 없이 찾아봤다. 좀 나온 지 됐네. 잊고 있었어.
저희는 관리와 회의, 장문의 전자우편을 별로 좋아하지 않습니다. 게임에서 뭔가 고치고 싶으면 허락을 받는 게 아니라 일단 멋지게 고쳐놓고 보는 거죠.
게임 디자인에 대한 고민. 영감을 어디에서 얻었는가? 수많은 장애물이 있었을 텐데, 그걸 어떻게 해결했나? 이런 걸 기대했다.
살아 있는 교훈이 담긴 게임 개발 포스트모템 모음집. 포스트모템이라도 잘 모르는 게임이면 재미가 덜하다. 구현한 콘텐츠를 예로 들어도 무슨 얘기인지 알아먹기도 어렵고. 하지만 이 책은 그런 걱정 없다. 진짜 유명하고 성공한 게임 이야기가 담겨 있으니. WoW, HL2, Unchar...
Prince of Persia Animation Reference 1985 from jordan mechner on Vimeo.
이제는 Clojure를 거의 안 쓴다. 요즘 많이 쓰고 있는 Elixir로 다시 구현해 볼까? 언제 이런 생각이 들었을까? 아마 Heroku에서 무료 인스턴스(dyno)를 중지한단 소식을 들었을 때였던 걸로 기억한다.
BotFather. 크. 네이밍 보소. godfather. 텔레그램 봇을 만드려면 반드시 만나야 하는 봇이다. 처음 텔레그램 봇을 만들 때, BotFather와의 만남은 강렬했다. 만들 봇 이름, 설명 등을 적는 웹페이지를 기대했다. 하지만 텔레그램은 봇을 만들 때, 모범 사례(b...
텔레그램은 훌륭한 메신저이자 클라이언트다. 훌륭한 클라이언트가 된 건 bot api 덕분이다. 간단한 iOS 앱을 만들려고 했는데, 텍스트로 제어가 충분하다고 생각하니 텔레그램 봇으로 만들면 되겠단 생각이 들었다. 혼자 쓸 거라 만들어 본 슬랙(slack) 봇은 과하다.
url을 입력하면 프리뷰를 url 밑에 붙여주는 unfurling links 기능이 필요했다. gitlab을 내부망에 설치해 사용하고 있다. 내부망에 접근할 방법이 없어 slack이 기본으로 제공하는 gitlab 이슈 프리뷰가 안 나온다. slack과 gitlab에 접근할 수 있는...
다음 사이드 프로젝트는 slack 봇(bot)이다. 관리 시간을 줄일 아이디어가 떠올랐다. 언어는 요즘 쓰고 있는 elixir 언어로 결정했다. 처음부터 만들어야 하는 거 아니야? 노노. 이쪽 생태계를 무시하면 안 된다. 1986년에 발표된 32살 erlang 언어가 뒤를 든든하게...
매니저(manager)는 개인 기여자(Individual Contributor, IC, 팀원) 여러 명을 관리해야 한다. 일 대 다 관계이다. 그 말인즉슨 항상 병목이 될 수 있다는 걸 명심하고 있어야 한다. 여유 좀 부려서 팀원이 내 결정을 기다리게 했다가는 삽시간에 내가 병목이...
패턴은 시간이 흐르면서 흡수되고 다듬어져서, 마음 속 깊이 비언어적인 이미지로 저장되었다가, 예감이라는 형태로 표출된다. - p16
마이크로 소프트(MS)가 어떻게 프로젝트, 사람을 관리하는지 살짝 엿볼 수 있는 책이다. 어떤 책인고 하니 MS에서 개발 혁신 부서장을 맡은 에릭 브레히너가 사내 웹진에 올린 글들을 묶어 놓은 책이다. 이 사람도 미지근하게 글을 안 쓴다. 한 마디로 깔건 확실하게 까는 스타일이지.
“강사님은 지금 사람 선별법, 작업 할당, 동기 부여, 팀 구성 같이 관리에서 가장 필수적인 네 가지 기본사항은 전혀 다루지도 않으면서 관리의 자연과학적인 부분을 우리에게 가르치시겠다는 건가요?” “강사님은 그 네 가지를 빠뜨린 과정을 가지고 ‘프로젝트 관리’라고 부르고...
조엘 온 소프트웨어를 보고 느낀 것이 많아서 새로운 책이 나왔다길래 닥치고 구입했다. 조엘 온 소프트웨어를 읽었을 때의 즐거움을 다시 느껴보고 싶었고 글 제목만 얼핏 보면 개발자를 뽑는 사람에게만 도움이 될 것 같지만 개발자로서 어떤 개발자를 모시고 싶어하는지 아는 것도 무척이나 ...
Unicode 문자 개수 구하기.
UTF-8 문자의 크기는 그림과 같이 1-byte에서 4-byte까지 가질 수 있다. 가장 큰 특징인 기존 US-ASCII와 호환성을 위해 이런 가변 길이 인코딩을 선택했는데, 덕분에 영어는 1-byte로 표현할 수 있지만 한글은 3-byte가 필요하다. 양키들이 쓰는 US-ASC...
Windows에서 Unicode 인코딩은 UTF-16을 기본으로 사용하고 Unicode라고 부르기보다는 wide character라고 부른다. 그래서 Windows에서 wide character는 UTF-16 character라고 생각하면 된다. wide character 자료형인...
Win32 console application에서 Unicode 문자를 표준 출력을 통해 출력하려고 한다. 그러나 console window가 Unicode를 지원하지 않는 문제점이 있다. 이런 문제점을 해결하려면 locale 설정을 한 후 출력을 한다.
기본적으로 코드페이지 949(한글)에서는 굴림과 래스터 글꼴이 등록되어 있다. 등록된 글꼴 말고 다른 글꼴을 사용하려면 레지스트리 수정을 해야 한다.
모든 문자에 고윳값을 할당하는 테이블을 만드는 프로젝트가 유니코드 컨소시엄과 ISO 10646에 의해 시작됐다. 문제는 하나의 단체가 아니라 두 단체라는 거. 이거 다 편하자고 하는 일인데, 다른 두 개의 테이블이 만드는 것은 모든 사람이 원하지 않는 일이라는 것을 알고 같은 문자...
모든 이메일에 데스크톱 알림을 띄우고 이메일이 오는 족족 확인해서 답장을 해주면 다른 업무는 안 하고 메일만 기다리는 사람은 바로 일을 시작할 수 있다. 하지만 이렇게 확인해서야 프로그래밍이 불가능하다. 인터럽트가 너무 많다. 프로그래밍에는 그냥 시간이 아닌 연속된 시간이 필요하다...
윈도우 하부구조를 알려주는 책. 프로세스, 스레드, 동기화 오브젝트, 메모리 관리, DLL, IOCP 등을 자세히 다룬다.
PerfHUD나 DirectX Caps Viewer로 볼 수 있지만, 비디오 메모리 사용량을 렌더링하는 게 그리 힘든 일이 아니라 보통 이 정도는 렌더링해준다. 그건 좋은데 문제는 DirectX9 인터페이스로는 사용 가능한 전용 비디오 메모리를 알 수 없는 거다. 그래서 보통 Di...
파티션을 나눠서 응용 프로그램들을 D 드라이브에 설치하는데, 프로그램 파일 패스가 “C:\Program Files”로 세팅되어 있어서 설치할 때마다 Home –> Del -> D 콤보로 드라이브 명을 바꿔서 설치했다. 웹 서핑하던 중에 레지스트리를 수정해 프로그램 파일 ...
Elixir에서 Behaviour란 용어가 나온다. Erlang의 어깨 위에 올라서서 만든 언어라 Erlang에서 사용하는 Bahaviour라는 용어를 그대로 가져온 것 같다. C++의 pure virtual function만 정의한 클래스 혹은 C#의 interface와 비슷한 ...
“이 줄에 버그가 있다” “이 포인터가 이라는 점이 버그이다” “프로그램이 죽었다. 이것은 버그이다” 프로그램은 왜 실패하는가? p26
계산한 값을 메모리에 저장해서 여러 번 같은 값 계산을 피하는 최적화 기법을 메모이제이션(memoization)이라고 한다. 실행 속도와 공간을 바꾸는 가장 기초적인 기법이기도 하다. 실수로 메모리제이션이라고 하기도 하는데 메모이제이션이 정확한 용어이다.
predicate 발음듣기 [미] [prédikət] 【문법】 술부, 술어 (cf. SUBJECT) 【컴퓨터】 술어 구글 사전
이 책을 처음 본 게 언젠지 기억나지 않는다. 책에 줄이 그어진 걸 보니, 그 시점 이전인 것 같다. 언젠가부터 책에 메모를 안 하고 포스트잇을 사용하기 시작했거든. 최근 다시 볼 기회가 생겨서 글을 남긴다.
정석 맞다. 이런 책이 늦게 나온 게 아쉽다. 읽으니깐 신입 프로그래머 시절에 하던 디버깅 방법이 생각났다. 제대로 재현도 하지 않고 코드를 읽다가 의심되는 곳을 발견하면 수정. 실행해서 버그가 발생하지 않으면 ’고쳤구나!’. 제대로 넘어갈 리가 있나. 당장 다른 곳에서 문제가 안...
아꿈사에서 <프로그램은 왜 실패하는가?>라는 디버깅 책을 공부했었다. 이 책이 끝나고 난 뒤, 너무 이론에 치우쳐 있어서 아쉬우니 실전에서 쓸 수 있는 경험들이 담긴 디버깅 서적을 공부하자고 했다. 고르고 고르던 중에 걸린 이 책. 윈도우 시스템에 관한 이야기도 많아서 ...
프로그래머가 만든 결함(defect)에 의해 프로그램 상태가 감염(infection)되고 이 감염된 상태 때문에 실패(failure)하게 된다. 감염을 따로 격리하고 결함을 찾아서 고치는 과정을 디버깅이라 하는데, 이 책은 짜임새 있고 논리적인 접근법을 가르쳐 주는 이론서이다. 딱...
커누스 형님이 지은 책. 감히 art를 붙인 책. 10년 동안 TEX를 만들게 한 책. 빌 게이츠가 다 보면 이력서를 달라는 책. 지금 다 보고 이력서 넣으면 자선 단체에서 일하겠지만. 아 그리고 많이 추천은 하지만 본 소감을 찾아보기 어려운 책이기도 하다. 그리고 또. 다 한번 ...
contact solve를 이렇게 설명할 수 있구나. NDC 12에서 발표한 게임 물리 엔진의 내부 동작 원리 이해 발표보다 훨씬 세련되게 설명한다. 한 수 배웠다. 설명 방법이 돋보였던 발표.
랙돌 구현 노하우가 듬뿍 담긴 발표자료. active, leaf, intermediate로 강체가 본에 미치는 영향을 개념화.
force generator, integrator, collision detection, contact resolution으로 구성되는 큰 그림을 잘 설명해서 도움이 됐다. 물리 엔진에 관심이 있다면 게임 물리 관련 공식들이 가득 담긴 책보다는 큰 그림을 그려주는 이 책이 나은 선...
물리를 좋아하고 싶어요. head first 시리즈로 물리가 나왔길래 냉큼 샀다. 좋아하는 책 브랜드이기 때문에 망설임 따윈 없다.
이제는 Clojure를 거의 안 쓴다. 요즘 많이 쓰고 있는 Elixir로 다시 구현해 볼까? 언제 이런 생각이 들었을까? 아마 Heroku에서 무료 인스턴스(dyno)를 중지한단 소식을 들었을 때였던 걸로 기억한다.
url을 입력하면 프리뷰를 url 밑에 붙여주는 unfurling links 기능이 필요했다. gitlab을 내부망에 설치해 사용하고 있다. 내부망에 접근할 방법이 없어 slack이 기본으로 제공하는 gitlab 이슈 프리뷰가 안 나온다. slack과 gitlab에 접근할 수 있는...
Side Projects by Sacha Greif. 사이드 프로젝트 완성 노하우를 담은 발표자료.
Readable은 가독성 구성요소를 쉽게 변경하면서 확인하고 그 결과를 공유하는 서비스다. ohyecloudy.github.io/readable에서 결과물을 볼 수 있다.
Bash 잘 쓰다가 왜 Zsh 사용을 결심했나
$ pbcopy < ~/.ssh/id_rsa.pub
#!/bin/sh set -e
windows 환경이라서 trailing whitespace 제거를 python으로 짰지만 *nix 환경이라면 shell script로 간단히 할 수 있다.
url을 입력하면 프리뷰를 url 밑에 붙여주는 unfurling links 기능이 필요했다. gitlab을 내부망에 설치해 사용하고 있다. 내부망에 접근할 방법이 없어 slack이 기본으로 제공하는 gitlab 이슈 프리뷰가 안 나온다. slack과 gitlab에 접근할 수 있는...
비동기(asynchronous)로 일을 잘하고 싶다. 그 중심에 이메일이 있다. 이메일만 주고받아도 충분히 일을 진행할 수 있는 동료가 있는 반면 꼭 찾아가서 얼굴을 보고 얘기를 해야 일이 진행되는 동료가 있다. 난 이메일처럼 비동기 도구를 사용해도 충분해서 찾아갈 필요 없는 동료...
작업 환경에 관련된 건 뭐든지 최악을 대비한다. 내가 없어도 원하는 건 할 수 있는 상황으로 만들어야 삶이 편하다. 우선은 돌아가니깐 출근 후에 관련된 일감(task)이나 메일을 보고 개선하거나 좀 더 두고 보는 결정을 하면 된다.
참 애정하는 기능이다. Todo를 모아서 보여준다. 나를 맨션(@mention) 하거나 담당자로 지정하면 자동으로 Todo 항목이 된다. 물론 이슈에 있는 Add Todo 버튼을 눌러 직접 추가할 수도 있다.
입사하면 보게 되는 안내서. 안내서만 보면 어떤 회사인지 알 수 있다. 이렇게 호기롭게 지르고 싶지만 내가 본 안내서가 몇 개 안 될뿐더러 안내서를 공개한 회사 내부 사정을 잘 모른다. 회사 구성원은 어떤 소양을 가진 입사자를 원할까? 자기 동료에게 바라는 건 뭘까? 실상과 다르더...
deadtrickster/prometheus.erl은 모니터링 시스템인 prometheus.io의 erlang 클라이언트다. 각종 메트릭(metric)을 프로메테우스가 파싱할 수 있는 포맷으로 텍스트를 만든다. deadtrickster/prometheus.ex는 prometheus...
telemetry는 erlang과 elixir에서 표준처럼 쓰는 메트릭(metric) 및 계측(instrumentation) 용도로 사용하는 동적 디스패치(dynamic dispatching) 라이브러리다.
phoenix 웹 프레임워크는 지표(metrics) 내보내기를 쉽게 할 수 있는 prometheus_plugs 패키지가 있어서 쉽게 프로메테우스 연동을 했다. slack 봇인 slab은 어떻게 프로메테우