Quick Iteration in Elixir (Jason Axelson, ElixirConf 2022) 발표 리뷰 - 도구 벼리기 자극
’ElixirConf 2022 - Jason Axelson - Quick Iteration in Elixir - Tips from 6 Yrs of Elixir Development’ 발표를 재미있게 봤다. 팁을 가볍게 정리하고 넘기려다가 발표자의 매일 자신의 도구를 익히는 자세를 ...
’ElixirConf 2022 - Jason Axelson - Quick Iteration in Elixir - Tips from 6 Yrs of Elixir Development’ 발표를 재미있게 봤다. 팁을 가볍게 정리하고 넘기려다가 발표자의 매일 자신의 도구를 익히는 자세를 ...
잘 쓰고 있던 Heroku 무료 dyno가 중지됐다. 그동안 무료로 잘 쓴 의리로 Heroku를 좀 쓰다가 클라우드 무료 VM으로 옮겼다. 주기적으로 트윗하는 게 전부인 트위터 인용봇은 클라우드 무료 인스턴스에서 돌려도 충분하다.
Elixir에서는 두 종류의 설정 파일이 있다. 빌드 타임 설정에 사용하는 config.exs 파일과 런타임 설정에 사용하는 runtime.exs 파일이다. 두 파일 모두 사용할 수밖에 없다. 빌드 타임에 모든 걸 결정할 수 없기 때문이다. DB 접속 정보가 대표적인 예다.
Elixir 표준 라이브러리 중 key-value 자료구조에 규칙을 가진 것처럼 보이는 함수가 있다. get, fetch, fetch! 와 같은 값을 가져오는 함수이다. 자료 구조에서 값을 가져오는 함수로 fetch 를 사용하는 게 낯설었다. 어떤 규칙으로 설계했는지 궁금해졌다.
GitHub Actions로 ARM64 플랫폼 빌드 및 배포 용도의 Linux 유저를 만들자. GitHub Actions로 빌드한 결과물을 Linux 인스턴스로 복사한다. 빌드 결과물 저장할 디렉터리의 쓰기 권한이 필요하다. 딱 필요한 권한만 세팅한 Linux 유저를 만들자. 비밀...
유지보수 비용이 낮은 간단한 기술을 사용해서 훌륭한 결과물을 만들어냈다. 로컬에서 변경한 걸 같이 테스트하고 싶다면 클릭 몇 번으로 판이 깔린다. 빠른 플레이테스트 환경을 만든 기술이 Guild Wars 2의 Streaming Client처럼 서비스로 이어질 수 있다. 게임 실행에...
Scott Wlaschin이 NDC Oslo 2018에 발표한 ’The Power of Composition’은 FP(Functional Programming)의 핵심 개념인 합성(composition)을 설명한다. 합성하면 함수만 떠올릴 수 있다. 타입도 합성의 대상이다.
무료 ARM architecture 인스턴스를 사용하려고 Oracle Cloud 회원가입을 했다. ’Arm 기반 Ampere A1 코어 및 24GB 메모리’라니 후발주자라지만 너무 퍼주는 거 아냐? 남 걱정해 주긴 이르다. 여분 인스턴스가 없다고 안 만들어진다. 유료 서비스를 사용...
“변수 이름을 어떻게 지어야 하지?” ChatGPT와 Copilot이 도와주고 있지만 여전히 어려운 문제다. 규모가 어느 정도 되는 Codebase에서 작업을 한다면 이름 짓기 이전에 넘어야 할 산이 하나 더 있다. “어디에 코드를 넣어야 할까?”
내 블로그에 HTTPS 프로토콜 지원이 필요할까? 개인 정보를 취급하지 않는다. 쿨한 척 댓글도 없애서 말 그대로 정적 사이트가 됐다. 블로깅 도구도 정적 사이트 생성기인 Jekyll을 사용하고 있다.
Elixir가 아닌 다른 프로그래밍 언어를 사용해 협업하다 보면 그리운 라이브러리 중 하나가 Credo이다. code review에서 정적 분석기가 거를 수 있는 것들을 수정 요청할 때 그립다. 잔소리는 기계가 해야 한다. 개인 프로젝트를 할 때는 코드 일관성이 제대로 안 지켜지고...
Elixir에서 Behaviour란 용어가 나온다. Erlang의 어깨 위에 올라서서 만든 언어라 Erlang에서 사용하는 Bahaviour라는 용어를 그대로 가져온 것 같다. C++의 pure virtual function만 정의한 클래스 혹은 C#의 interface와 비슷한 ...
속성 기반 테스트 프레임워크인 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)를 처음 접했...
데이터베이스에 값을 저장하고 로드하는 건 스텁(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장 가치 있는 단위 테스트를 위한 리팩터링’을 보고 정리한 내용이다. 모든 코드를 테스트할 수는 없다. 그래서 중요하고 의미 있는 영역부터 테스트를 짜야 한다. 중요한 영역부터 시작해 덜 중요한 영역까지 테스트 커버리지를 ...
Enum.all?/1 함수를 사용한 함수 테스트할 때였던 걸로 기억한다. 비어 있는 리스트를 넣어서 테스트했을 때, 기대하지 않은 값이 나와서 의아했다. 비어 있는 리스트를 인자로 넘겼을 때, false 값이 나올 것으로 기대했다. 하지만 true 로 나오는 것이었다. Enum.a...
dotfiles란?
Bash 잘 쓰다가 왜 Zsh 사용을 결심했나
이제는 Clojure를 거의 안 쓴다. 요즘 많이 쓰고 있는 Elixir로 다시 구현해 볼까? 언제 이런 생각이 들었을까? 아마 Heroku에서 무료 인스턴스(dyno)를 중지한단 소식을 들었을 때였던 걸로 기억한다.
repository templates?
Heroku란?
프로그램에 실행 옵션을 넘기는 방법
어떤 상황에서 이런 걸 고민하게 됐는가?
맥 미니(Mac mini M2, 2023)를 꺼본 적이 없다. 매직 트랙패드(Magic Trackpad) 2를 손가락으로 간지럽히면 언제든 깨어난다. 팬이 있는지도 모르겠다. 이게 다 조용해서 그렇다.
회사에서는 아웃룩을 쓰고 개인적으론 구글 캘린더를 사용하고 있다. 일정을 분리해서 관리하지만 같이 보고 싶을 때도 있어서 구글 캘린더에서 아웃룩 일정도 같이 보고 있다. 한 달 정도 사용하니 일정이 제대로 동기화되지 않는 문제를 발견했다 그걸 해결하는 Google Apps Scri...
NDC22에서 ’달빛조각사에서 서버 테스트 코드를 작성하는 방법’에 대한 발표했다.
찔끔찔끔 하나씩 준비했다. 코로나19가 이렇게 길어질 줄 알았다면 투자 좀 할걸. 2021년 5월 정도에 재택근무 환경을 쾌적하게 만들었다. 늦었지만 퇴근 후 개인 작업을 할 환경을 만든다고 생각하자면서 투자를 했는데, 웬걸 코로나19로 재택근무가 더 길어졌다. 되돌아보니 그리 늦...
피닉스(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
에셋 속성(property)을 조회할 수 있는 프로그램이다. 해상도가 2048 이상인 텍스쳐, 2000 폴리곤 이상을 쓰지만 LOD가 없는 에셋 등을 조회할 수 있다.
업무에서 사용하는 google 스프레드시트 때문에 회사에서도 google 계정을 사용하게 됐다. 구글 계정은 무조건 gmail.com 도메인을 사용해야 하는 줄 알았다. 초반에 개인 이메일을 써버려서 바꾸려니 귀찮다. 이런 이유로 개인 google 계정과 회사 google 계정을 ...
deadtrickster/prometheus.erl은 모니터링 시스템인 prometheus.io의 erlang 클라이언트다. 각종 메트릭(metric)을 프로메테우스가 파싱할 수 있는 포맷으로 텍스트를 만든다. deadtrickster/prometheus.ex는 prometheus...
telemetry는 erlang과 elixir에서 표준처럼 쓰는 메트릭(metric) 및 계측(instrumentation) 용도로 사용하는 동적 디스패치(dynamic dispatching) 라이브러리다.
| pnotes | exp cabinet | emacsian | ddiary | |--------+-------------+----------+--------| | 424 | 772 | 99 | 161 |
jekyll 블로깅 툴에 메타데이터를 추가하는 플러그인이 있다. jekyll-seo-tag 플러그인이다. Gemfile 파일과 _config.yml 파일에 jekyll-seo-tag gem을 추가한다. </head> 태그 전에 seo 태그를 추가한다. 간단하다.
우와~ elixir를 지원하네. 바로 도입해서 사용했다. elixir를 지원하는 서비스가 없어서 비교도 필요 없었다. 써보니 웬걸. 좋구나.
phoenix 웹 프레임워크는 지표(metrics) 내보내기를 쉽게 할 수 있는 prometheus_plugs 패키지가 있어서 쉽게 프로메테우스 연동을 했다. slack 봇인 slab은 어떻게 프로메테우스를 연동할 수 있을까? phoenix 웹 프레임워크를 쓰지 않은 애플리케이션이...
수집하고 분석할 지표(metric)를 phoenix 웹 프레임워크로 만든 프로젝트에서 노출한다. 프로메테우스(prometheus)는 주기적으로 노출한 지표 정보를 긁어서 저장한다. 이 데이터를 그라파나(grafana)가 보기 좋게 가공해서 보여준다.
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. }
최근 elixir 프로젝트를 몇 개 진행하며 프로젝트 템플릿을 모아두는 github 저장소를 만들어야겠다고 생각했다. 매번 필요한 스크립트를 이전 프로젝트 디렉터리를 뒤져서 복사해서 사용했기 때문이다. 그냥 가져다 쓰는 경우도 있지만 수정하거나 추가하는 경우도 있다. 갱신한 스크립...
BotFather. 크. 네이밍 보소. godfather. 텔레그램 봇을 만드려면 반드시 만나야 하는 봇이다. 처음 텔레그램 봇을 만들 때, BotFather와의 만남은 강렬했다. 만들 봇 이름, 설명 등을 적는 웹페이지를 기대했다. 하지만 텔레그램은 봇을 만들 때, 모범 사례(b...
본격적인 사이드 프로젝트 시작에 앞서 몸풀기로 만들었다. 재미있는 주제가 안 떠올랐다. 조금 시간을 들여 뭘 만들지 고민하다가 만만한 검색 랭킹을 골랐다. 동작은 간단하다. 텔레그램 봇에 /start 명령을 입력하면 1분마다 네이버 검색 랭킹 알림이 온다. 그만 받아보려면 /end...
텔레그램은 훌륭한 메신저이자 클라이언트다. 훌륭한 클라이언트가 된 건 bot api 덕분이다. 간단한 iOS 앱을 만들려고 했는데, 텍스트로 제어가 충분하다고 생각하니 텔레그램 봇으로 만들면 되겠단 생각이 들었다. 혼자 쓸 거라 만들어 본 슬랙(slack) 봇은 과하다.
Enum 모듈과 다르게 Stream 모듈은 지연 열거를 지원한다. Stream 모듈 설명 페이지에 있는 비교 예제를 보면 차이가 명확하다.
url을 입력하면 프리뷰를 url 밑에 붙여주는 unfurling links 기능이 필요했다. gitlab을 내부망에 설치해 사용하고 있다. 내부망에 접근할 방법이 없어 slack이 기본으로 제공하는 gitlab 이슈 프리뷰가 안 나온다. slack과 gitlab에 접근할 수 있는...
팀 패스워드 관리 프로그램 tpass 개발하면서 간단하게 만들어서 썼다. 독립된 환경을 가진 유저 2 명으로 테스트를 해야 했기 때문에 테스트 환경에 공을 들였다. 독립된 환경을 구축하는 데 docker를 사용했다. 스크립트 언어로 bash를 사용했다.
merge 한 커밋(commit)이 잘못됐다. push 해버려서 amend는 불가능. amend 가능해도 못하겠네. 꽤 복잡한 문제라서 revert를 하고 찬찬히 봐야겠다.
다음 사이드 프로젝트는 slack 봇(bot)이다. 관리 시간을 줄일 아이디어가 떠올랐다. 언어는 요즘 쓰고 있는 elixir 언어로 결정했다. 처음부터 만들어야 하는 거 아니야? 노노. 이쪽 생태계를 무시하면 안 된다. 1986년에 발표된 32살 erlang 언어가 뒤를 든든하게...
“커밋이 사라졌어요”
{:poison, "~> 3.1"}
작업 환경에 관련된 건 뭐든지 최악을 대비한다. 내가 없어도 원하는 건 할 수 있는 상황으로 만들어야 삶이 편하다. 우선은 돌아가니깐 출근 후에 관련된 일감(task)이나 메일을 보고 개선하거나 좀 더 두고 보는 결정을 하면 된다.
참 애정하는 기능이다. Todo를 모아서 보여준다. 나를 맨션(@mention) 하거나 담당자로 지정하면 자동으로 Todo 항목이 된다. 물론 이슈에 있는 Add Todo 버튼을 눌러 직접 추가할 수도 있다.
We wanted to remind you that we are retiring Picasa Web Albums in the near future on August 1st 2016. An update on Picasa and the archive for Picasa We...
forwarding reference(universal reference)가 있게 한 제안서(proposal)다. std::forward() 함수를 보면 생각날 문서다.
관심사가 한쪽으로 몰려있다. 이번엔 가능하면 관심사에서 벗어나는 주제를 다룬 발표를 선택했다. ndc 아니면 언제 듣겠나 싶어서.
느슨한 규칙을 사용해도 충분히 도움이 된 코드 리뷰
발표자는 Stephan T. Lavavej. 줄이면 STL. 운명을 받아들여 MS에서 STL을 구현 중이다. tuple에 관한 건 다 훑어본다. C++11, C++14, C++17. 처음 보는 함수도 있었음.
게임루프에 주요 이슈를 잘 정리. bucket 개념을 추가한 게 좋았고 bucket update 사이에 broadphase AABBs를 업데이트하는 게 신선했다.
:: rdempty.cmd for /f "usebackq" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"
the lack of robustness is inherent in the interface and not something that can be changed by altering the implementation
DO name interfaces with adjective phrases, or occasionally with nouns or noun phrases. Nouns and noun phrases should be used rarely and they might...
클라이언트 로그 수집할 때, 참고로 쓸 수 있는 좋은 발표. 로그 사이즈 때문에 클라이언트 로그를 수집하는 게 상당히 부담스러운 일인데, AWS를 사용하면 할 만하다. 하루에 5억건. 500GB 정도가 로그로 쌓인다.
일인칭 게임 애니메이션에서는 스테이징이 중요
역할 분담으로 만드는 앙상블을 소개. 오랜 기간 널리 쓰인 조합.
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 종결자.
warning level 4로 만든 프로젝트는 총 3개다. 모두 덩치가 있는 게임 프로젝트였다. 크고 지루한 작업이었다. 하나를 제외하곤. 드물게 엔진이 level 4였다.
입사하면 보게 되는 안내서. 안내서만 보면 어떤 회사인지 알 수 있다. 이렇게 호기롭게 지르고 싶지만 내가 본 안내서가 몇 개 안 될뿐더러 안내서를 공개한 회사 내부 사정을 잘 모른다. 회사 구성원은 어떤 소양을 가진 입사자를 원할까? 자기 동료에게 바라는 건 뭘까? 실상과 다르더...
코드 리뷰 툴로 gerrit을 쓰고 있다. 자연스럽게 작업자들이 pull, push하는 중앙 저장소가 gerrit이 된다. 잘 쓰고 있는데, 업그레이드하려니 걱정이 된다. 한 번에 문제없이 업그레이드되면 좋은데, 이걸 보장할 수가 없다. 만약 업그레이드가 실패해서 엉망이 되면 고통...
gerrit plugin을 설치하려고 찾아보니 jar는 없다. 소스만 있다. 직접 빌드해야지 뭐. GerritForge jenkins에서 다운로드 받을 수 있긴 한데, 깨져 있는 것들도 보이고 해서 직접 빌드하기로 결정.
사진은 눈탱이 맞은 iPhone 5 카메라, iPhone 6s, 교체 후 순으로 잘라붙였다.
나는 뭔가 업그레이드가 있던가 알림이 있던가 그럴 줄 알았는데, 어느새 3이 내려가 버리고 4가 올라왔다. 출시 기념 50% 할인과 함께.
패스워드에 대한 스트레스를 줄이고 싶어서 샀다. 진작에 살걸. 엄청 편하네.
(column-number-mode 1) (column-number-mode)
#define SUPERSUBCLASS_STRICT(T, U) \ (SUPERSUBCLASS(T, U) && \ !Conversion<const T, const U*>::sameTy...
재현이 안 된 버그는 고칠 수 없다. 재현을 바탕으로 버그를 고쳤는지 확인할 수 있기 때문에. 진짜 못 찾는 건 의심 코드를 저격하고 동향을 살펴 볼 뿐이다. 발견 안 된다고 해도 찝찝해.
하츠네 미쿠. 처음 보고 충격받았던 콘서트 영상이 생각난다.
모에. 뭔지 모르지만 익숙하다. 왜냐면 내 첫 게임 프로젝트에서 많이 쓰였기 때문이다. 모델 뷰어는 MoeView였고 월드 에디터는 MoeTanz였다. 뭔지는 모르겠지만 일반적이지 않다는 건 느꼈다. 아. 다행히 클래스 이름 접두어는 Moe가 아니었… 아니, 있었던 거 같기도 하고.
클로즈 베타 하기 전에 챙겨야 할 리스트다. 왜 클로즈 베타인가? 클라이언트 바이너리가 가장 취약한 시기이기 때문이다.
Side Projects by Sacha Greif. 사이드 프로젝트 완성 노하우를 담은 발표자료.
하루만 참석. 둘째 날에도 재미있는 발표가 많았는데, 아쉽다.
Advanced Git 발표 영상을 봤다. 무엇보다 눈에 띄는 건 세련된 데모. 이얼~ 정말 많이 해본 것 같다.
C++ incomplete type is not allowed class inner use?
yahoo pipes를 사용하면 된다. 편하네. 예전에 알았던 야후 파이프를 이제야 써먹어 본다. 복잡하지 않으면 그래프 기반 다이어그램처럼 직관적인 게 따로 없다. 내가 만든 파이프.
사용자 정의 링크를 지원한다. 써보니 편하다. 규칙에 맞게 타이핑하면 자동으로 링크를 만들어 준다. C.[카드번호]로 trello 카드에 연결했다.
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를 생성해야 한다.
github에서 만든 채팅 봇. 단순한 채팅 봇이다. 그렇다고 무시해서는 곤란하다. github 문화를 지탱하는 큰 기둥 중 하나걸랑.
에디터에서 커브(curve)로 색 보정(color correction)을 할 수 있다. R, G, B, 휘도(luminance) 커브를 지원한다. 결과를 실시간으로 확인할 수 있다. 이게 가장 큰 장점. 인터페이스도 아티스트에게 친숙한 커브다.
Readable은 가독성 구성요소를 쉽게 변경하면서 확인하고 그 결과를 공유하는 서비스다. ohyecloudy.github.io/readable에서 결과물을 볼 수 있다.
GDC2010부터 시작해 4번째다. 이제는 안 하면 뭔가 찝찝하다. 공개된 발표자료만 보고 정리.
Building an army of robots by Kyle Neath. github 내부 툴을 소개한 발표자료. github 아저씨들은 발표자료 참 잘 만든다.
Now, some people will claim that having 8-character indentations makes the code move too far to the right, and makes it hard to read on a 80-character ter...
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/
실용주의 프로그래머는 무엇이 다른가? 우리는 태도와 스타일 그리고 문제와 해법에 접근하는 철학에 차이가 있다고 생각한다. 그들은 직면한 문제 너머를 생각하며, 문제를 항상 더 큰 맥락에 놓으려 노력하고, 항상 더 큰 그림을 보려 한다. 어쨌건 이런 더 큰 맥락 없이 도대체 어...
Object* object = NULL; if (object && object->IsValid()) { // ... }
STL에는 auto_ptr라는 스마트 포인터가 있지만 할당하면 소멸식 복사(destructive copy)로 자원에 대한 소유권을 넘겨주는 동작을 한다. STL 알고리즘은 값에 의한 복사가 기본 동작이라서 컨테이너에 못 넣는 스마트 포인터가 되겠다. 이게 이슈가 많이 돼서 이름도 ...
처음 봤을 때, 그냥 괜찮은 디자인처럼 보였다. 나는 Ctrl+L 로 주소창을 열고 URL 주소를 타이핑해서 사이트를 찾아가기 때문에, 저런 인터페이스는 그냥 예쁜 인터페이스에 불과했다. 키보드에 얹은 손을 마우스로 다시 옮기기도 귀찮아서 키보드로 할 수 있는 건 웬만하면 다 키보...
```c++ class RVO { public: RVO() { PrintLine(“constructor”); } RVO(const RVO& rhs) { PrintLine(“copy constructor”); } ~RVO() ...
Prince of Persia Animation Reference 1985 from jordan mechner on Vimeo.
```c++ class Base { public: Base() { WriteLine(“Base::Base()”, typeid(this).name()); f(); } void f() { WriteLine(...
간략한 shadow volume 소개와 여러 shadow mapping 알고리즘을 소개한 아티클이다. 프로그래머뿐만 아니라 게임에 관심이 있는 사람들도 읽을 수 있도록 쉽게 써서 그림자를 구현하기 전에 살짝 읽기에 좋은 글이다.
사실 style guide가 나와서 말인데, 나는 조엘이 엄선한 소프트웨어 블로그 베스트 29선에서 본 ’스타일은 언어 요소다 - 켄 아놀드’글을 완전 지지한다. 많은 언어가 무시하는 공백 문자를 언어 요소로 넣자고 주장하는데, 지겨운 스타일 논쟁을 완전 없앨 수 있고 파싱이 쉬워...
목적은 Construct On First Use와 같다. 즉, global static object, global object 초기화 순서가 명확하지 않아서 발생하는 static initialization order fiasco를 막기 위한 idiom이다.
GPU Gems3 Ch28. Practical Post Process Depth Of Field 아티클의 결론이다. 결론이 참 인상적이다. 내가 읽은 아티클은 보통 뭐보다 몇 배 빠르고 킹왕짱이다라고 말하거나 PC 사양을 적어놓고 FPS(Frame Per Second)를 비교했었다...
종종 어떤 XPers들은 많은 디자인 활동과 디자인 패턴을 쓸모없다고 한다. 또 어떤 XP 비방자들은 XP를 디자인도 없는 짜보고 고치는(code and fix) 개발방식으로 회귀라고 말한다. 마틴 파울러(Martin Fowler)가 “어휴 둘 다 오해하고 자빠졌네.”라며 교통정리...
global static object, global object 가 사용되기 전에 초기화되는 걸 보장하는 idiom이다.
“이 줄에 버그가 있다” “이 포인터가 이라는 점이 버그이다” “프로그램이 죽었다. 이것은 버그이다” 프로그램은 왜 실패하는가? p26
포팅을 위해 64bit로 빌드를 하면 갑자기 담배가 급하게 땡기게 된다. 수백 개의 에러를 보면 “어휴~ 이걸 언제 다 잡지?”라는 생각이 절로 든다. 하지만 다 저마다 독특한 상황에서 발생하는 에러가 아니라 에러는 수백 개라도 공통된 패턴이 있기 마련이다. viva64.com에 ...
계산한 값을 메모리에 저장해서 여러 번 같은 값 계산을 피하는 최적화 기법을 메모이제이션(memoization)이라고 한다. 실행 속도와 공간을 바꾸는 가장 기초적인 기법이기도 하다. 실수로 메모리제이션이라고 하기도 하는데 메모이제이션이 정확한 용어이다.
사실 이제까지 아무런 불평불만 없이 잘 써왔다. Lisp를 틈틈이 배우고 있는데, 가장 잘 어울리는 환경이 Emacs라서 설치하고 도움말을 찾아봤다. 그런데 얼씨구! 키 입력에 왜 이리 컨트롤 키(Ctrl)가 많은지 모르겠다. 같이 누르기가 너무 불편하다. 단축키를 배정한 사람이 ...
네에, 사람은 슬퍼서 우는게 아니라 울기 때문에 슬퍼지는 거라고 합니다. 등을 곧게 펴고 억지로 웃음을 띄우고 있다 보면 동요했던 마음이 차분히 가라앉을 때가 있습니다. 술을 넣는 순서, 보틀 쥐는 방법, 코스터 위치… 나도 처음엔 다 쓸데 없는 짓이라고 생각했어요. 하지만 ...
PerfHUD나 DirectX Caps Viewer로 볼 수 있지만, 비디오 메모리 사용량을 렌더링하는 게 그리 힘든 일이 아니라 보통 이 정도는 렌더링해준다. 그건 좋은데 문제는 DirectX9 인터페이스로는 사용 가능한 전용 비디오 메모리를 알 수 없는 거다. 그래서 보통 Di...
Mathematica, Maple과 같은 Computer Algebra System이다. 그래픽스를 공부하면서 수학 공식만 보면 뒷골이 땡기고 이해 못 하면 안 되는데 하며 똥줄이 타던 차에 발견한 프로그램이다. MIT에서 1960년대에 개발된 Macsyma가 모태가 된 프로그램으...
최근에 SICP 스터디가 끝났는데 , SICP에서 배우는 리스프(Lisp)의 방언(dialect)인 스킴(Scheme)의 역사와 중요 개념의 소개를 다룬 글이라서 너무 재미있게 읽었다. 관심 없는 역사는 연도와 사건들의 map으로 밖에 안 느껴져서 너무 지겨운데, 관심이 있거나 지...
컴파일할때 파일 간의 디펜던시를 줄이려고 사용하는 관용구(idiom)이다. public 접근 권한으로 정의된 함수가 변경될 때, 이 파일을 include 하는 녀석들이 다시 컴파일되는 건 당연한데, 다른 녀석들이 못 보는 private 접근 권한의 멤버 함수나 변수가 변경될 때도 ...
사용자 입력은 서식화된 입력(공백 문자 무시 등)이 필요하지만 파일 입출력에서는 서식화된(formatted) 입력이 필요 없는 경우가 대부분이다. 서식화된 입출력은 쌩 입출력보다 처리를 하는 게 많아서 속도가 느린 게 당연하다. 공백 문자 무시 옵션을 켜도 되지만 이런 서식화 입출...
두 값이 같은가를 판단하는 두 가지 방법이 존재한다. 첫 번째 방법은 두 값이 같은지를 바로 판단하는 것이고 두 번째 방법은 작지도 않고 크지도 않다는 것을 확인해서 두 값이 같은지를 판단한다. 이 첫 번째 방법은 operator== 로 판단하는데, A == B 이면 두 값이 같다...
머리로 하는 직업인데, 머리가 안 돌아가면 정말 막막하다. XP의 아버지 켄트 벡(Kent Beck)은 머리가 안 돌아갈 때 밖에 나가서 톱질한다고 한다. 육체적인 움직임이 머리를 돌리는데 도움을 준다는 얘기인데, 여기저기 찾아볼 필요없이 내 경험만 들추어봐도 이런 경험을 한 경우...
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알고리즘에 대한 언급이 나오는데, 으.. 읽고 보니 좋은 걸 안 쓰고 있었구나.
맨티스, 버그 질라, 트랙 등 유명한 이슈 트래커가 팀 요구 사항에 맞지 않아 ECUS라는 사내 이슈 트래커를 개발하면서 겪은 경험담을 적어 놓았다. 많이 쓰이는 오픈 소스 기반의 이슈 트래커들의 장단점과 ECUS에서 어떤 걸 버리고 개선했는지에 대한 얘기를 1부에서 다뤘고 이슈 ...
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++에서 편하게 써도 된다. ...
ACM문제 코드를 제출하기 전 예제를 몇 개 만들어서 돌리고 눈으로 검증하곤 했는데, 그렇게 하지 말고 유닛 테스트(unit test) 프레임 워크를 사용해서 알고리즘을 검증하면 되겠다 싶어서 google test를 붙였다. 이렇게 세팅하고 나니 google test 라이브러리에 ...
EASTL - Electronic Arts Standard Template Library은 거대 게임 개발사인 EA가 C++ 표준 라이브러리인 STL을 게임 개발에 맞게 수정한 라이브러리이다.
웹 서핑 중에 간단히 잘 정리된 사이트를 찾아서 가물가물 하던 터에 한번 정리해봤다.
```c++ #include #include #include
미루어 왔던 <응용 프로그램을 위한 최상의 사용자 환경을 만드는 방법 - MSDN>을 드디어 읽었다.
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에 의해 시작됐다. 문제는 하나의 단체가 아니라 두 단체라는 거. 이거 다 편하자고 하는 일인데, 다른 두 개의 테이블이 만드는 것은 모든 사람이 원하지 않는 일이라는 것을 알고 같은 문자...
역경을 딛고 집에 PerfHUD 6 - NVIDIA를 설치하고 새로 추가된 피쳐들을 살펴봤다. 앞자리 숫자가 바뀐 버전인 만큼 정말 멋진 기능들이 많이 추가됐다. 더 쾌적하게 게임을 하려고 ATI 비디오 카드를 꼽을 수는 있겠는데, 개발용으론 이제 NVIDIA 비디오 카드밖에 못 ...
집에서 NVIDIA PerfHUD 6의 여러 가지 기능들을 테스트하려고 다운받았다.
위 빨간색으로 표시한 버튼을 누르면 찾아보기 타겟 폴더 셋을 추가 할 수 있다.
Debugging시 Watch창으로 내부 변수들을 볼 수 있다. 위의 그림은 IDirect3DDevice9를 Watch창으로 본 화면. 어휴! 역시 DirectX 새로운 SDK 나오면 무조건 Document부터 다 훑어봐야 한다. 발견한 지 일주일이 안 됐지만 그전부터 사용 가능한...
개인 프로젝트를 하던 중 Direct3D 9의 Debug Output Level을 최대로 올리고 실행했다. 보이는 건 토할 정도로 많은 워닝 메시지들뿐.
The conversion truncates; that is, the fractional part is discarded. 4.9 Floating-integral conversions, ISO/IEC 14882
업무를 하다가 보면 이런 메시지로 커밋된 것을 발견할 수 있다. 이런 메시지를 보는 즉시 한숨이 나오는건 당연. 가끔 너무 짜증나서 책상을 내려칠때도 있다. 도대체 어떤 버그가 고쳐졌다는 얘긴지 알 수가 없다. 이런 메시지를 적어서 커밋을 한 당사자에게 1달 정도 뒤에 어떤 버그를...
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...