Log Stash

as an Industrial Personnel

프로그래밍 24

Roslyn으로 C# 코드 정적 분석하기

1. 상황 현재 나는 유니티 엔진으로 개발하는 게임 프로젝트팀에서 일하고 있고, 요즘 게임들이 그렇듯 이 게임도 서버와 HTTP위에서 json텍스트를 주고 받으며 통신한다. 서버로부터 json텍스트를 받으면, 텍스트안에 명시된 데이터 타입의 이름으로 그에 맞는 deserializer 메소드를 찾아 해당 데이터 타입 오브젝트로 변환해주는 방법을 사용하고 있다. (몇몇 데이터의 구조가 약간 복잡해서 바로 리플렉션 시켜줄 수는 없음)현재 쓰고 있는 json 라이브러리는, 파싱할 때 json 오브젝트는 Hashtable로, json 배열은 ArrayList로, 문자열은 string으로, 그리고 숫자 타입은 무조건 float 으로 만들어서 반환해주고 있었고, 이렇게 파싱된 자료구조를 다시 데이터 오브젝트 객체의 ..

프로그래밍 2018.03.05

라인하르트 방어막 셰이더 흉내내기

Three.js로 만들어봄. 깊이맵으로 가까이 있으면 glow 효과 나오게 함. (gl_FragCoord의 z값 처리는 아직 안 함) Code Vertex shader void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); } Fragment Shader // Screen size uniform sampler2D depthMap; uniform vec2 screenSize; void main() { float depth = texture2D(depthMap, gl_FragCoord.xy / screenSize).r; float logDiff = log(1000.0 * abs(gl_FragCoord.z - d..

프로그래밍 2017.11.27

C#: object => IEnumerable<object>

1. Enumerable.Repeat() C#으로 코드를 짜다보면 종종 어떤 하나의 객체를, 그 객체를 담고 있는 IEnumerable로 변환해야 하는일이 종종 생긴다. 그땐 Enumerable.Repeat()을 사용하면 편하다.예를들어, 어떤 메소드 중간에 객체 obj가 있고, 이것을 IEnumerable 타입으로 만들어서 반환해야 한다고 생각해보자. GameObject obj; 가장 단순하게 생각해보자면, List 컨테이너를 하나 할당해서 그 리스트에 값을 집어넣을 수 있다. List list = new List(1); list.Add(obj); return list; 유니티3d 엔진의 코루틴 기능을 알고 있다면, C#의 발생자 문법을 사용하는 방식도 생각해 볼 수 있겠다. IEnumerable To..

프로그래밍 2017.11.21

Using Linq in Unity3d

애플의 64비트 정책으로 ios에선 il2cpp를 필수로 사용해야 한다는 점 덕분에 유니티 엔진에서 Linq를 사용할 수 있게 되었다. (Thanks apple) 예전에 안드로이드 앱 개발을 할 때 '비동기 로직을 동기처럼 사용할 수 있다'는 말에 홀려 RxJava를 접했던 적이 있었다. 그 당시엔 내가 Promise, Future나 함수형 프로그래밍에 대한 필요성이나 개념이 없어서도 그랬지만, 당시엔 Rx에 대한 튜토리얼이나, Best practice 관련된 문서가 거의 없었기 때문에 (물론 내가 못 찾았을 수도 있지만) 지금 보면 아주 괴상망측한 코드를 만들어 냈었다. 이후에 'Funtional thinking' 책을 읽고, 자바스크립트에서 Promise 패턴을 써보면서 내가 이전에 어떤식으로 코드를..

프로그래밍 2017.10.29

쿼터니온(Quaternion) 정리

EDIT 2023-02-16: 개요에서 불필요한 부분 삭제 및 정리. 아래 오일러 각, 짐벌락 내용 추가. 0. 개요 3D 공간에서 회전, 방향을 표현하는 방식에는 여러가지가 있다. 많이 쓰이던 방식으로 오일러(Euler) 각을 통한 표현법이 있고, 오일러각에서 발생할 수 밖에 없는 짐벌락(Gimbal Lock) 문제를 해결하기 위해 요즘은 쿼터니온을 많이 사용한다. 이것들에 대해서 정리 해보도록 한다. 1. 정의 복소수처럼 실수부와 허수부의 조합으로 이루어짐. 대신 사원수는 허수 \(i,j,k\)의 3개를 사용한다. 이 허수들 사이에는 다음과 같은 관계가 성립한다. $$i^2 = j^2 = k^2 = ijk = -1$$ 여기서 중요한 점은 곱셈의 교환법칙이 성립하지 않는다는점. 위의 식을 정리해보면 \..

프로그래밍 2017.08.28

렌더링 파이프라인에서 왜 동차 좌표계를 쓸까

용책을 비롯한 각종 DirectX책, 3D 수학책들을 보면 대부분 렌더링 파이프라인 내부에서의 좌표계 변환을 필수적으로 설명하고 있다. 아마 이런 책들을 봤으면 이동변환이나 투형변환을 설명 할 때, 벡터의 마지막 성분(w)을 1로 하나 추가한다, 이것 때문에 3차원 벡터지만 변환행렬은 4x4 크기를 가진다, 0이면 벡터고 1이면 점이다, 등의 설명과 '이게 동차 좌표계와 관련이 있다' 라는 말도 들어봤을 것이다. 나는 이게 이해하기가 어려웠어서 처음 책을 봤을땐 하나도 알아듣지 못하고 그냥 대충 '아.. 그냥 선 위의 점들을 한 평면으로 몰아넣는구나' 정도로만 이해하고 넘겼었다. 그러다 갑자기 이유없이 그냥 대체 왜 동차좌표계라는걸 쓰는지 궁금해져서 찾아보게 되었다. 사실 나름 찾아본다고 찾아보긴 했는데..

프로그래밍 2017.07.09

SAT(Separating Axis Theorem) 충돌처리 구현

모바일에선 마우스 down이벤트가 불리지 않아서 안됨 작년에 잠깐 시간났을때, 놀다가 여태껏 OBB 충돌판정 (정확히는 SAT)을 구현해 본적이 없다는걸 깨닫곤, 카페에서 좋은 자료 하나 찾아 pixi.js를 써서 거의 베끼듯 구현해봤다. 쉽게 설명하자면.. 충돌 판정: 도형을 구성하는 선분과 직교하는 축들을 기준으로 점들을 투영시킨 좌표의 최대 최소값을 구하고, 모든 축에 대해서 겹쳐지는지 판별. 충돌 처리: 가장 얕게 겹쳐진 축의 방향대로 겹쳐진 만큼 MTV(Minimum Translation Vector) 를 구해서 밀어냄.이라고 할 수 있을듯. ReferencesSAT설명: http://www.dyn4j.org/2010/01/sat/pixi.js: http://www.pixijs.com/ pixi..

프로그래밍 2017.06.21

C#의 람다 변수 캡쳐

보통 UI뷰 클래스를 만들때 최대한 데이터 클래스와의 연관성을 줄이려고 한다. 그 노력의 일환으로 요즘 회사 게임 프로젝트에서 버튼 이벤트 리스너를 구현해야할 때, 가능하면 뷰 클래스 자체는 그냥 리스너 대리자만 가지고 있게 작성하고, 리스너의 본체는 뷰를 생성하는 시점에서 만들어서 전파하는 식으로 구현하고 있다. class PseudoButton { public delegate void VoidDelegate(); private VoidDelegate onClick; // 뷰 만들때 여기로 리스너를 넘겨준다. public void SetOnClick(VoidDelegate onClick) { this.onClick = onClick; } // UI 게임 오브젝트에서 이 함수로 이벤트를 넘겨주면, 그냥 ..

프로그래밍 2017.05.29

라즈베리파이에 git 호스팅 서비스 Gogs 간단 설치기

원래 평소에는 비공개 저장소 생성에 개수 제한이 없는 bitbucket을 내 ‘습작코드 저장소’로 자주 사용하고 있었다. 그렇게 계속 사용하다 보니 내 bitbucket 대쉬보드는 몇몇 진짜 협업용 저장소들과 한번 쓰고 커밋 한 두번 하다 버린, 그렇다고 지우긴 아쉬운 저장소들이 섞여보여 꽤나 대단한 카오스 상태가 되어버렸다. 그러던 와중에 ‘어차피 이 습작 저장소들은 나만 종종 들여다보고, 용량도 별로 안되니 그냥 내가 지금 아이패드 스트리밍 서버로만 쓰고 있는 라즈베리파이에 통짜로 백업해놔야겠다.’ 라고 생각이 들었고, 프로젝트 하나를 다운받아 폴더 그대로 복사 & 붙여넣기를 하던 도중에 갑자기 수십개의 저장소를 이렇게 옮겨야 한다는 사실이 귀찮아지면서 ‘그냥 이렇게 짱박아놓으면 어차피 접근성도 어렵..

급여명세서 복호화하기

1. 발단 급여명세서를 복호화한다니 조금 이상하게 들릴 수 있겠지만, 사연은 이렇다. 2016년까진 급여명세서가 각자 회사 메일로 발송되어서 별다른 절차 없이 링크 하나만 누르면 볼 수 있었다. 그러다 2017년에 ERP 시스템이 바뀌었는지 1월달 급여명세서 메일을 받아보니 마치 통신사 요금명세서처럼 첨부된 html 파일을 다운받아 ‘인터넷 익스플로러’에서 열어서 ‘액티브 엑스’컨트롤을 설치하고, 설정된 비밀번호를 입력하면 급여 명세서를 보여주는 방식으로 바뀌게 되었다. 물론 내가 주로 사용하는 회사 컴퓨터나 집에 있는 데스크톱에는 전부 윈도우가 설치되어 있기 때문에 급여명세서를 보자면 볼 수는 있겠지만, 굳이 익스플로러를 찾아서 열고 거기에 엑티브 엑스 컨트롤을 설치해서 보는 것은 사실 나게엔 매우 귀..