서버리스 머신러닝 모델 돌리기
GitHub Python trending을 보다보면 재미있는게 참 많이 올라온다. Python이어서 더욱이 다른 언어보다 Machine Learning 관련된 것들이 많이 올라오는데, 관련 지식도, GPU도 없는 나로써는 대부분 그림의 떡에 불과하다. 그러다가 가끔 ArtLine처럼 친절한 예제와 바로 실행해볼 수 있는 CoLab까지 제공해주는 것들이 올라오는데, 결과물도 썩 괜찮고 CPU…
2019년 정리
December 31, 20192018년에 대한 정리를 한 지 시간이 오래 지나지 않은 것 같은데 벌써 201…
Serverless + React로 알아보는 Lambda의 수행 시간 개선
예전 글에서 Serverless Web API와 함께 CRA로 만든 html bundle 파일을 serve하는 API를 만드는 법을 정리했다. 이번 글에서는 그 구조에서 발생할 수 있는 성능 문제와 해결법에 대해서 정리해보려 한다. Lambda의 수행 시간 API Gateway나 WebSocket API에 의해 Lambda가 실행되어 요청의 처리가 완료되기까지 다음과 같은 세 구간의 소요 시간이 존재한다. Lambda…
Serverless로 React 서비스하기
서버리스로 이런저런 서비스들을 계속 개발하다보면 닥치는 가장 큰 문제가, RestApi나 WebSocketApi는 쉽게 만들었는데 그에 대한 frontend를 제공해야 하는 경우에는 굉장히 귀찮은 과정을 겪어야 한다는 것이다. 보통 알려진 정상적인 방법은 다음과 같다. API를 API Gateway와 Lambda의 조합으로 배포하고, frontend 결과물을 S3에 업로드한 후 CloudFront에 연결해서 HTTPS…
Serverless + X-Ray + TypeScript
AWS X-Ray는 AWS가 제공하는 tracing solution이다. AWS X-Ray는 개발자가 마이크로 서비스 아키텍처를 사용해 구축된 애플리케이션과 같은 프로덕션 분산 애플리케이션을 분석하고 디버그하는 데 도움이 됩니다. X-Ray를 사용해 자신이 개발한 애플리케이션과 기본 서비스가 성능 문제와 오류의 근본 원인 식별과 문제 해결을 올바로 수행하는지 파악할 수 있습니다. X-Ray…
AWS Lambda와 Actor model
천성이 백엔드 개발자라서 그런지 개인적으로 토이 프로젝트를 해도 꼭 서버가 들어가는 경우가 더 많다. 이런 시스템들을 단순히 코드 형태로 GitHub에만 보관하는 것은 아무래도 좀 아쉬워서 혹시 생각날 때 바로 접속해볼 수 있게 늘 띄워놓고 싶은데 아무래도 비용이 만만치 않다. Docker로 구워두고 필요할 때마다 compose up…
AWS Lambda에서의 setTimeout
AWS Lambda에서 실행하기 위한 분산 ActorSystem을 개발하고 있다. 처음에는 단순히 actor의 state를 Redis나 S3에 기록하고 Redis를 기반으로 작성된 Queue와 Lock으로 메시지를 교환하면 될 것이라고 생각하고 열심히 만들고 있었다. 하지만 이 모든 것은 actor간 Delayed Message를 교환해야 할 필요가 있는 시점에서 문제가 발생했다. actor…
AWS Lambda로 cpp 파일 컴파일
…
API Gateway의 인증을 위한 Custom Authorizer 사용하기
API Gateway와 Lambda Proxy를 사용하여 간단한 HTTP/s API나 WebSocket API를 구축할 수 있다. AWS CloudFormation을 직접 사용하여 서비스를 구성할 수도 있고, 최근에 나온 aws-cdk을 사용하여 구성할 수도 있다. 물론 Serverless framework과 같이 vendor 종속적이지 않은 framework…
iPad의 Working Copy
July 30, 2019원래 말이 많은 편이라 가급적이면 그 에너지를 아껴서 글로 정리해두려고 하는 편인데 생각보다 게을러서 잘 하지는 않고 있다. 때문에 가끔은 직접 글을 쓰는 것보다는 작성한 글을 어떻게 게시할 것인지에 더 많은 관심을 가지기도 한다. 현재 이 블로그에 작성되는 글은, 예전에는 GitHub 내장 Jekyll을 사용하여 GitHub Repository에 게시하는 구조로 만들어져있었지만 최근에는 이 방법을 까먹기도 하고 React…
AWS WebSocket API 써보기
웹 채팅 서비스를 만들어본다고 생각해보자. 물론 저기에는 수많은 기능이 있겠지만 다 떼어내고 가장 기본적인 기능인, Web interface를 통해서 사용자와 운영자가 실시간으로 채팅을 할 수 있는 부분을 만든다고 생각을 해보자. 일단 클라이언트의 HTTP 요청에 대해 서버에서 응답하는 구조인 HTTP…
잉여톤 4회 후기
October 29, 2017과거 동아리 내 게임잼과 그 이후 AWS Serverless 대회들, 그리고 지난 번 대리님 집에서의 코딩잼으로 자리잡게 된 잉여톤의 4회차를 이번 개롱 집들이를 겸해서 진행하게 되었다. 앞으로 얼마나 흥할지는 모르겠지만 간단히 정리해 github에 올려놨고, 여러 피드백을 받으며 간단히 언제 어디서 뭘 하고 싶은 지를 정리한 후 google forms로 신청을 받았더니 놀랍게도 나를 포함 총…
아내 블로그 구축기
March 29, 2017아내 블로그를 만들어 주고 있는데 이왕이면 네이버 블로그나 티스토리 말고 github pages로 만들어주고 싶었다. 템플릿은 추후에 걱정하고 일단 내 블로그를 그대로 복사해서 아내의 github 계정에 넣고 travis-ci를 연동하는 것까지는 해봤던 일이라 금방 할 줄 알았는데, travis-ci에 넣어줄 secret token을 만들어야 하는데 travis를 실행할 shell이 없어서 결국 aws linux vm…
aws serverless hackathon 2016
작년에 참가하지 못했던 serverless gaming on aws을 올해는 드디어 참가할 수가 있었다. 개인적으로 행사에 대한 참가 소회를 생생하게 밝힐 자신은 없으므로 같이 참가했던 분의 글을 소개하는 것으로 넘어가려고 한다. 2015년: Serverless 실시간 대전게임 2016년: Gaming on AWS Hackathon 참가 후기 game-server-less 나는 game programming에 있어서 unity…
kroot ctf 2015
연세대학교 보안 동아리 Kroot에서 주최하는 CTF 2015에 참가했다. 보안이란 주제랑은 별로 관련이 없는 삶을 살아온지라 … 난이도 낮은 문제 + 힌트가 공개된 문제를 중점으로 풀었다. 웹은 아는게 없는지라 바로 스킵했다(…) challensges에서 문제 내역을 확인할 수 있다…근데 지금 다 undefined…
c# 데이터 서버 라이브러리 구현
지난 글에서는 csv 데이터를 binary 파일로 serialize하여 데이터의 loading 속도를 올리는 방법에 대해 알아보았다. 해당 방법은 용량이 큰 csv 파일에 대해서도 효과가 크지만, 작게 분할된 많은 csv 파일을 다시 적절한 크기의 binary 파일로 재구성하여 작업할 때 더욱 효과를 크게 느낄 수 있다. 하지만 csv 파일의 용량이 너무 크거나, 아니면 csv…
c# binary 파일을 사용해 csv 파일 빨리 읽기
csv data 데이터 분석을 위해 데이터를 열심히 수집해서 몇 개의 csv 파일을 얻었고, 이 csv 파일들은 각각 약 1GB…
왜 c#으로 서버를 작성하려 하나?
본 글은 동아리 친구의 질문인 ‘왜 게임 서버를 c++이 아닌 c#으로 작성하려 하냐?’에 대한 답변이다. 간단히 c++과 c#의 차이를 통해 답변하면 이렇다. c++은 속도가 빠르다. c#은 기본 라이브러리가 풍부하다. c#은 표현력이 좋다. linq나 reflection의 도움을 받을 수도 있다. c#은 native에서 벌어지는 access violation 등으로부터 다소 안전하다. 즉, c#으로 프로그래밍할 경우 c…
dumpable 고찰
하재승님께서 던전 앤 파이터 클라이언트 로딩 속도 최적화에서 언급하신 dumpable 라이브러리에 대한 이야기를 해보자. 이 라이브러리는 serializable memory가 가능한 dynamic container와 operator =를 사용하여 dumpable한 struct를 만들어준다. 다만 몇 가지 아쉬운 점이 있었다. dptr::alloc() 함수가 thread safe하지 않다는 점 dstring, dvector…
variadic template을 사용한 typelist 구현
Modern C++ Design 책에서 소개한 typelist를 c++11 문법인 variadic template으로 구현해보자. typelist는 type들의 list형태로 compile time에 여러 type에 대한 동일한 작업을 할 때 사용된다. 예를 들면, conversion table을 만들어서 부담이 적은 dynamic_cast를 구현한다던가, hierarchical inheritance를 통한 tuple…
github pages와 jekyll을 사용한 blog 만들기
June 23, 2014본 글에서는 jekyll과 travis-ci를 사용하여 github pages에 publish하고, 이를 custom domain에 연결하여 blog를 구축하는 방법에 대해 서술한다. github pages는 github에서 제공하는 cdn으로 static page를 서비스해주는 공간이다. github pages에 자세한 설명이 나와있지만 간단히 요약하면, {본인 id 혹은 그룹 id}.github.io…
IT 아키텍트가 하지 말아야 할 128가지
IT 아키텍트가 하지 말아야 할 128가지 누구도 알려주지 않았던 시스템 개발 현장의 128가지 해결책 … 위 링크 들어가서 목차를 보면 알겠지만 정말 자극적이고 재밌는 내용으로 가득차있다. 내 관심 분야에는 설계, 구축, 방법론이 포함되어 있다. 열심히는 아니지만 나름 지식을 쌓았다고 생각했…으나 이 책을 보니 아는게 하나도 없다는 것을 배웠다. 그러한 점에서는 강력 추천. 요새 PaaS/IaaS…
던전 앤 파이터 클라이언트 로딩 속도 최적화 - 우리 아이가 세배 빨라졌어요!
https://www.slideshare.net/JaeseungHa/ndc-2014-35508014 하재승 요약 최적화 아이디어 공유 (분할 압축, dumpable, resource dependency) 하지만 정작 효과가 큰 방법은 버그 수정이었다. (잘못 들어간 logging 삭제) 문제 분석 유저가 만족하는 편안한 게임을 만들어 보자. 하지만…
신입 프로그래머들의 고민을 통해 생각해보는 누구나 쉽게 적응할 수 있는 프로젝트 만들기
최진욱 장승호 요약 Effective (Live) Old Project 적절한 과제를 통해 신입 프로그래머의 실력 향상을 돕자. 추후 라이브 상황을 고려하여 신규 때 기반을 잘 닦도록 하자. 목표 오래 라이브 서비스가 가능하면서 신입이 쉽게 적응할 수 있는 project…
모바일 데이터 분석
https://www.slideshare.net/5rocks_io/ndc-20140529 서하연 요약 시계열 분석 대신 시간대별 분석을 사용한다. 유저의 특성에 따라 분석 결과를 개별적으로 적용한다. 모바일 특성 이해하기 모바일 특성을 이해해야 어떻게 분석할 지 알 수가 있다. 유저의 쏠림 현상 LifeStyle이 반영된다. mobile 기기의 특성 상 특정 시간대에 집중. eg) 출퇴근 시간 Marketing…
THE NPCM@STER - 라이브 게임에 어울리는 스토리 텔링의 접근법
https://www.slideshare.net/khalbora/the-npcmsterpublicfinal-35354617 강근영 요약 게임 기획자는 게임 플레이의 수단으로 스토리텔링을 사용하자. 저비용 고퀄리티를 위해 캐릭터에 집중, 게임 플레이와 밀착된 캐릭터를 만들자. 도입 스토리텔링은 하나의 세계를 구축/구현하는 작업이다. M…
팀을 구하는 툴 개발
박경재 요약 적절한 툴을 만들어 작업의 비효율을 줄이고 고통받는 동료를 구원하자. 그러기 위해서 높으신 분들은 이에 대한 필요성을 인지하고 자원 분배를 잘 하자. 도입 게임 개발 시 동료가 겪는 불필요한 괴로움을 극복하기 위한 툴과 마음가짐 라이브 서비스를 하면서 고객의 불편/불만 사항은 개선하지만, 개발자 우리들의 불편/불만 사항은 개선하지 않는다. eg) 퀘스트 입력 기획자가 excel…
분산서버 구축의 ABC - 대규모 분산 시스템을 구축하기 위한 실용적 예와 그 원칙들
이호규 / 발표자료 왜 기획 요구가 높아짐에 따라 성능 문제가 야기됨 단일 머신으로 처리가 어려우니 분산으로 간다! network traffic, cpu, memory 등 어떻게 scale out 기능 분리 서버 상점 서버, 퀘스트 서버, … 이런 식으로 분리 예외 처리도 어렵고 transaction 구성도 어렵다. 그냥 이렇게 안 하는게 좋겠다. 통합 독립 서버 role…
모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
https://www.slideshare.net/reinkim/ndc14 김진욱 요약 직접 머신 infra 구축 + os/vm/open source (수정/튜닝)해서 private cloud 구축 문제, 대응, 문제, 대응, 문제, 대응, … 근데 windows로 넘어가니 또 신세계: 문제, 대응, 문제, 대응, 문제, 대응, … 내용 Build Private Cloud for Mobile Game x86 + switch…
나이키 런더시티로 본 클라우드 서비스의 장애 복구 프로세스
요약 장애를 예측/계획하고 준비/복구하는 시스템을 구축한다. terminolgy DR Disaster Recovery BCP Business continuity planning RTO Recovery time objective 사례 대한항공 아프리카 이벤트 cloud에 대한 고민할 시간이 없어서 기존 개발자가 구축해놓은 것을 그대로 사용 cloud 가용성 테스트(SLA…
범용 게임 서버 프레임워크 디자인 및 테크닉
https://www.slideshare.net/iFunFactory/20140524-ndc-sharing 문대경 요약 가정/목표를 정하고 할 수 있는 것/없는 것을 구분하여 시스템을 설계한다. Comm=JSON, Mgmt=RestAPI, Obj=Json CodeGen/STM, Dist=RPC인 GameServer를 설계한다. System Design System = interface + Architecture…
프로젝트K 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
https://www.slideshare.net/sublee/spof-mmorpg 이흥섭 요약 gevent를 믿고 ØMQ를 통해 객체/서버 시야 개념을 바탕으로 서버간 정보 동기화를 한다. 정보가 동기화되었으니 서버가 다중화되었다고 치고, 서버 말고는 다 튼튼하니 SPOF가 없다. (ELB 튼튼, couchbase 튼튼) 하지만 무중단 패치나 서버 다운으로 인한 client의 server connection…
라이브 상황에서 윈도우 서버 개발자가 겪은 좌충우돌 Redis 적용 경험담
요약 linux 모르는 windows 개발자가 linux에 redis깔고 lua script 돌렸습니다. 내용 CSO에 실시간 랭킹 구현 요청에 따라 redis를 도입 db는 어렵고 sql 못하니 유지보수 못하고 신규 서버 만드려니 구현 부담이 너무 큼 근데 windows redis는 unofficial임 따라서 ubuntu 깔고 redis 설치 sentinel 써서 master/slave 구축을 해 failover…
Rx와 Functional Reactive Programming으로 고성능 서버 어플리케이션 만들기
https://www.slideshare.net/jongwookkim/ndc14-rx-functional-reactive-programming 김종욱 요약 대세는 병렬처리, 이를 Reactive functional programming으로 풀어보자. 근데 functional 이야기 안 함 Reactive가 왜 나왔는지 알아보자, 그러면서 MONAD 잠깐 이야기 그러면서 Rx.NET…
파이썬과 친구들 - 체계적이고 빠른 모바일 게임 서버 개발을 위한 최적의 도구
모바일은 connectivity가 불안정하다. 고로 WebServer 형태로 감 microframework: bottle, Flask IO event-driven io, callback chaining gevent coroutine, nonblocking io로 monkey patch 근데 mysql python은 monkey patch가 안된다 scaling single thread multiple process…
WCF를 이용하여 쉽게 만드는 모바일 게임서버
WebServiceHost를 사용한 모바일 rest web api 서버를 만들어보자. msdn에 있을 법한 wcf 설명을 한참 함. msdn 참고 본인이 구현한 코드를 설명해주는 방식. 추후 발표자료와 함께 올린다고 함 Contract OperationContract로 web method를 노출 DataContract로 serialize/deserialize할 class를 정의 OnSerializing/ed…
네트워크 offload 장애
February 16, 2014최근 네트워크 장비 이상 현상으로 고생을 한 적이 있다. 패킷량이 특정 이상일 때 주기적으로 throughput이 감소하는 현상을 보였던 것이다. 플랫폼팀 팀장님께서 각고의 노력 끝에 원인을 찾아내셨다. Large Send offload V2 TCP checksum offload 이 옵션이 왜 문제를 일으킬 수 있을까? 이에 대해 자세히 알아보자. Windows Forum: 랜카드 옵션 Large Send Offload…
mswsock.dll의 비밀
최근 회사에서 c#으로 네트워크 프로그래밍을 하고 있다. 일은 아니고 그냥 개인의 취향 나름 c#도 속도가 괜찮다는 것을 보여주려고 시작을 했는데, 진행하면서 점점 보이는 결과는 영 좋지 않다. 서버 과부하 테스트 프로그램을 c#으로 porting했다. 정말 과부하 테스트를 하려면 c++로 작성해야 맞지만 테스트 로직까지 c++로 작성하면 골치가 아프니 core는 c++, logic은 c…
빠른 메시지 만들기
Cap’n Proto와 같은 무한대(?)로 빠른 메시지를 설계한다고 생각해보자. 그렇다면 우리는 어떤 점을 고민해야 할까? 이를 위해 잠깐 네트워크로 정보를 전달하는 과정을 생각해보자. end-point #1은 정보를 패킷에 담아 네트워크로 전송한다. (serialize) end-point #2는 네트워크에서 바이트를 읽어 메시지를 구성하고, 그 메시지로부터 정보를 읽는다. (deserialize…
서버 프로그래밍
설계 동기화 수준과 성능(규모) 수준을 고려해서 작성한다. 완전 비동기나 느슨한 비동기 수준으로 괜찮다면 웹 서버를 사용해도 좋다. 실시간 비동기가 필요하면서 성능이 중요할 경우 직접 서버를 구현하는 편이 좋다. morpg나 fps 정도의 서버라면 stmp(single thread multiple process) 구조로 가도 좋다. mmorpg나 그 이상의 성능을 요구하는 서버라면 task parallelism…
메시지 enum에 따른 message 콜백 함수 자동생성
일단 message에 대한 기본 type과 각 message을 구분하기 위한 enum이 있다. message과 enum 값을 쉽게 연결하기 위해 중간 층을 도입한다. 이제 message을 만든다. 기본적인 handler는 다음과 같이 단순하게 정의할 수 있다. dispatch를 위해 handler에 대한 table을 하나 만들어둔다. 일단 등록된 handler가 없어도 서버 동작에 문제가 없도록 하기 위해 빈 handler…
비동기 프로그래밍 패턴 2
위 이야기에 이어, async 작업과 then 작업 간의 상태 공유에 대해서 알아보자. async에서 then으로 상태를 전달하는 가장 기본적인 방법은 반환값을 사용하는 방법이다. 다른 방법으로는 lambda function에 의한 variable capture가 있겠다. 반환 값으로 모든 context를 전달하는 것에는 한계가 있기 때문에 capture를 통한 방법이 더 편할 수 있다. 하지만 capture…
c++ message dispatcher
간단한 message dispatch 코드를 c++로 구현해보자. 일단 std::function을 안 쓰고 구현해보고, 그 다음에 std::function을 써서 구현해보자. 지난 번 글에서 functor_ii로 handler_t의 근간을 이미 설명했다. interface인 wrapper_t, 실 구현체인 impl_t, 그리고 그것을 멤버로 갖는 type erasure가 적용된 대표 type인 handler_t이다.…
function adapter와 type inference
과제는 다음의 Adapter를 만들어보자는 것이다. 많은 친구들이 이미 문제를 잘 풀었기 때문에 자세한 설명은 생략한다. 이름 잘 지어주는 것도 물론 중요하지만 이정도 코드에서는 저정도 글자만 써줘도 이해할 것 같으니 과감히 생략. 개인적으로 풀이 중 가장 마음에 드는 것은 Omniavinco가 if1live 글에 댓글로 단 binder1st 상속을 통한 구현. (있는 것 가져다가 쓰는게 제일) type infererence…
template 프로그래밍과 type erasure
첫 번째 코드(for_each)는 _Iter, _FuncTy에 들어가는 각 type에 맞게 compile time에 모든 code가 생성(template instantiation)되어 어떤 함수가 호출될지 compile time에 결정되는 구조이고, 두 번째 코드(ForEach)는 Iterator와 Functor interface를 구현한 객체가 runtime에 ForEach() 함수로 넘어간 다음 virtual…
template을 사용한 generic 프로그래밍
(한 번에 1~2시간 정도로 짧게(?) 하고 있다. 대충 accelerated c++ 책이랑 EC++ 책을 보고 있다.) C++ 언어를 가지고 C++스럽게 프로그래밍을 해보자! 는 어떤 의미일까? 다양한 의견이 있겠지만, 프로그래밍 언어는 표현력이 증가하는 쪽으로 발전한다는 관점에서 프로그래머가 C에 비해서 보다 자신의 의도를 C…
비동기 프로그래밍 패턴 1
일련의 순서로 호출되어야 하는 비동기 함수들이 있다. 이 때 사용되는 method chaining을 사용한 async/then 패턴과 수행할 비동기 context를 갖고 직접 비동기 수행을 연쇄적으로 진행하는 async_worker 패턴을 알아보자. 연속적인 비동기 작업을 처리할 때에는 동기적 프로그래밍과는 다르게 코드를 순차적으로 서술할 수 없다. 만약 아래와 같이 작성된다면, async_work2나 async_work…
ZhConverter (Simplified, Traditional)
September 08, 2013대만에 Localization(이라고 쓰고 번역이라고 읽는다)을 담당하시는 분이 있었는데 사람이 부족하다고 중국 번역도 시키고 있다. ~~대만은 번체, 중국은 간체를 사용하는데 이론상으로는 어느 정도 수준에서 글자의 1:…
websocket, webRTC
September 07, 2013websocket.org Wiki: WebSocket RFC6455: The WebSocket Protocol W3C TR: The WebSocket API WebSocket 표준이 확정되지 않은 줄 알았는데 2011년 10월에 확정되었다. 그리고 W3C API는 2012년 9월에 CR단계가 되었나보다. 그럼 이제 써도 되나? IE는 10부터 지원한다-_- MSDN: The WebSocket API 약간 다르지만 WebRTC…
분산 시스템 구현 과제 정리
뭐라도 좋으니 간단한 분산 시스템을 구현해보자! 단일 시스템과 비교하여 성능 혹은 가용성을 높이기 위해 분산 시스템을 설계해야 하는 것이니 일단 네트워크 프로그래밍은 필수이다. 효율을 높이기 위해 얼마나 작업을 잘 쪼개고 합치는가도 고민해야 하고, 장애가 발생했을 때 얼마나 복구될 수 있는지도 고민해야 한다. angdev님의 시스템 풀씨 프로그래밍 대회 채점 서버를 nodejs/c++로 구현했다. aws…
concurrency pattern과 분산 시스템 스터디
Concurrency Pattern부터 Distributed System까지! 근데 대충함 … Concurrency pattern 대충 정리해보자. Wiki: Active Object Active Object는 Actor Model 구현하면서 써봤다. asynchronous method invocation과 request scheduling이 관건이다. 지난 글에서는 함수 요청을 functor로 만들어서 요청을 queueing…
preprocessor programming
http://www.slideshare.net/lactrious/preprocessor-programming github: MacRec 오늘 발표 자료인 preprocessor programming. x-macro pattern부터 시작해서 repetition까지 간단히 설명을 했다. if1live님에게 배운 mpinc(multi-pass include) 단어를 어떻게든 써먹어보려고 했는데 이미 x macro라는 이름으로 6…
generic한 c++ rpc 구현
generic한 rpc를 간단히 구현해보자. 원래 의도는 asio를 사용하여 가벼운 덧셈 rpc 정도를 구현해보자는 것이었는데 왠지 모르게 스터디 친구들이 spec을 안드로메다로 보내버려서 DSEL을 통한 rpc stub, skeleton 생성 코드를 구현해보도록 하겠다. 양이 좀 많기 때문에 개요부터 설명하겠다. rpc 메시지을 주고 받기 위한 buffer를 먼저 설계하고, 메시지을 처리할 handler…
c++11 async, corotuine, io 스터디
오늘 스터디에서 공부한 내용을 간단히 정리해보자. async, future future, promise는 비동기로 실행되는 수행 결과를 받아오기 위한 개념이다. async는 내부적으로 promise를 사용하여 결과를 set()할 비동기 작업을 수행시키고, future를 반환한다. packaged_task는 비동기 작업을 수행할 수 있는 task 객체를 만들어준다. task 객체로부터 future를 가져올 수 있다. vs201…
producer/consumer model 구현
먹깨비 과제를 풀어보자. 여러 가지 구현법이 있을 것인데, 나는 간단하게 바구니는 공유 자원이니 lock으로 보호하고, 제빵사와 먹깨비는 actor로 만들어서 매 tick마다 상황 판단 후 작업을 처리하도록 했다. 따라서 공유 자원을 보호하기 위한 spin_lock과 actor 기반 코드를 만들었고 그 기반으로 바구니, 제빵사, 먹깨비를 만들었다. 먼저 spin_lock…
concurrency 알고리즘과 memory model
오늘 스터디에서 공부한 내용을 간략히 정리해보자. 원래 의도는, peterson’s algorithm을 보고 여기서 비순차 실행이 일어날 때 발생하는 문제를 보고, memory consistency model의 memory order를 통해 문제를 어떻게 해결할 수 있는지 본 후에, lock free stack, lock free queue algorithm을 보고 문제를 파악한 후에 이를 해결하기 위해 hazard…
thread-safe한 counter 구현
먼저 간단한 counter example을 만들어보자. 문제를 확인하기 위해서 다음과 같은 코드를 작성해본다. c++ code 한 줄이 원자적(atomic)으로 실행된다는 보장은 없다. assembly의 한 줄도 원자적으로 실행된다는 보장은 없다(smp, micro-operation) 위 코드를 release로 빌드해보면 ++counter 부분에 대한 코드가 assembly로 한 줄이 나오는데, 어쨌든 expect…
concurrency 스터디
오늘 스터디에서 공부한 내용을 간략히 정리해보자. Wiki: ABA problem Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms context switching과 simultaneously 실행 환형큐의 thread unsafety 문제 volatile/interlocked operation/memory barrier…
게임 데이터 작성하기 1
…
AWS를 이용한 서버 운영
https://www.slideshare.net/lactrious/aws-gameserver-management github: source code 지난 번에 작성한 c# 게임 서버 만들기 게임 서버를 aws로 서비스하는 것에 대한 발표를 진행했다. 대부분은 직접 시연했기 때문에 발표 내용이 다소 부실하다 … 본 발표 자료 작성은 doodoori2님께서 많이 도와주셨다. 발표 자료는 다음의 내용을 포함하고 있다. AWS…
xml 기반의 데이터시트 빨리 읽기
지금 일하고 있는 회사에서는 모든 게임 데이터를 xml로 기술하고 있다. 서버가 시작할 때 읽게 되는 xml의 양만 본다면 대략 800~900MB로 엄청난 양을 읽어야 한다. 덕분에 서버가 저 모든 데이터시트를 읽어서 메모리에 올리는 시간만 약 4~…
분산 처리 환경 구현 3
Github: DistWork - simpler 지난 글에서 예고한 RpcWork와 Dll 전달 방법에 대해 알아보자. (원래는 WorkGroup까지 보려고 했는데 자세한 구현은 귀찮으니 나중에 기회가 되면 쓰도록 하겠다) RPC 구현 RpcWork는 다음의 방법으로 쉽게 구현할 수 있다. 원격지에서 수행할 함수를 담는 RpcWork class와 그 수행 결과를 담아 다시 돌려줄 ReturnWork class…
c# 게임 서버 만들기
http://www.slideshare.net/lactrious/c-game-server github: source code c#의 기능들을 사용하여 게임 서버를 만드는 방법에 대해 간단히 서술해 보았다. c…
How much faster is C++ than C#?
May 19, 2013마음에 드는 답변 C# may not be faster, but it makes YOU/ME faster. That’s the most important measure for what I do. :) 근데 질문에 답을하셔야지-_- 왜 자기가 하고 싶은 이야기를 하고 있어 Stackoverflow: How much faster is C++ than C#?
분산 처리 환경 구현 2
Github: DistWork - simplest 지난 번 글에서는 분산 처리 환경에 대한 구조를 대충 알아봤다. 이번 글에서는 대충 알아본 것 중 하나를 선택해서 C#으로 구현을 해볼 것이다. 가장 간단해보이는 M-S 모델 (master-slave)을 C#으로 구현해보자. 일단 구현하기에 앞서 간단히 설계도를 살펴보자. master에는 여러 slave가 연결한다. 각 연결된 slave는 master…
분산 처리 환경 구현 1
잉여 컴퓨팅 자원을 십분 활용하여 처리량을 늘리기 위한 분산 처리 환경을 구축해보자. (hadoop, incredibuild 같은 프로그램을 만드려면 어떤 고민이 필요한지 생각해볼 수 있겠다.) 자세하게 파고들면 밑도 끝도 없을테니 간단하게 살펴보자. 분산 처리 환경을 구축할 때 적어도 다음의 항목에 대한 고민이 필요하다. 플랫폼은 무엇을 사용할 것인가? 언어는 무엇을 사용할 것인가? p2p로 만들 것인가, master…
ctags, cscope 설정 등 vim을 잘 써보자
November 30, 2012시스템 프로그래밍 수업 듣는 친구들이 vim을 써서 보다 빠르게 커널 탐색을 하는데 도움이 되었으면 해서 쓰는 글이지만 본인이 직접 정리하기는 귀찮으니 다음의 링크를 참조 바람 … so_sal: 커널 분석기 Vi + ctags + cscope search script 추가로, 여러 파일에서 특정 내용을 찾는 좋은 shell script 확장자가 c, h, S, inc 이거나 Make…
Index Analysis
http://www.slideshare.net/lactrious/index-analysis 제목은 거창하지만, SQL Server Query Performance Tuning Distilled의 Chapter 4 이름이다. 고작 저런 발표 자료 만드는데 6시간이나 걸렸다 … MSSQL에서 Index 관련된 내용을 정리했는데, 너무 대충 정리했다. 2시간 자고 발표하러 가야한다니 …
Fiddler Web Debugger
November 18, 2012써보니까 꽤 괜찮아서 잊기 전에 링크함 Fiddler: The free web debugging proxy for any browser, system or platform http message 보려고 wireshark 쓰는 것보다는 훨씬 편함
멤버 데이터 포인터의 casting과 안정성 1
October 31, 2012어제 동아리 친구와 이야기를 나누다 run-time에서는 float array를 float pointer로 casting하여 사용할 수 있는데 compile time에서는 왜 그럴 수 없냐는 이야기가 나왔다. 질문이 좀 미묘한데, 좀 더 정확히 정의하자면 float array type의 member data pointer를 float pointer type의 member data pointer로 casting…
member-data-pointer와 pointer의 차이
October 13, 2012pointer는 메모리의 특정 공간의 주소를 지칭하기 위해 사용된다. member data pointer는 구조체나 클래스의 특정 멤버 변수의 위치를 상대적으로 지칭하기 위해 쓰인다. 따라서 메모리 주소 값을 가지는 것이 아니라, 구조체나 클래스 객체에서 어디에 접근을 해야하는지의 정보를 담고 있다고 생각하면 된다. 때문에 실제 메모리에 접근하기 위해서는 구조체나 클래스 객체가 있어야 하고, 접근할 때에도 dereference…
멤버 데이터 포인터를 사용하여 연산식 묶어내기 3
지난 두 글에서 사용한 전략은, 멤버에 접근하기 위한 방법을 동일한 인터페이스로 맞춰서 (첫 번째 글에서는 멤버 데이터 포인터, 두 번째 글에서는 멤버 함수 포인터) BuffType과 그 인터페이스를 대응시키는 방법을 사용하였다. 동일한 인터페이스를 사용하기 위해서 그들을 하나의 동일한 타입으로 지칭하는 방법을 사용하였고, 그렇기 때문에 서로 다른 type, int 변수와 float…
멤버 데이터 포인터를 사용하여 연산식 묶어내기 2
이번 글에서는 Stat 자료구조 내에 배열이 있을 때 이를 어떻게 처리할지에 대해서 알아보도록 하자. Stat 코드를 작성하다보니, 이동 속도에 관해서는 각각의 변수를 따로 두는 것 보다, 배열 하나로 처리하는 것이 더 낫다는 것을 깨닫게 되었다. 배열로 묶어서 movingSpeed 관련 코드가 개선된 것까지는 좋았는데 hp와 movingSpeed는 type…
멤버 데이터 포인터를 사용하여 연산식 묶어내기 1
게임 내 스탯 시스템을 구현한다고 해보자. 그 스탯들은 여러 상황에서 버프에 의해 값이 변경될 수 있기 때문에 스탯을 저장하는 자료구조와 그 스탯을 변경하기 위한 버프 종류 enum과, 각 버프 종류 enum에 따라 스탯을 어떻게 변경할지에 대한 연산식에 대해서 코딩을 해주어야 한다. 일단 각 스탯에 어떤 값을 어떻게 계산하면 되는지에 대해서는 다음의 3가지로 추상화를 했다고 치자. SET, ADD, RATE…
go interface 구현하기
June 21, 2012사실 go interface가 어떤 스펙을 가졌는지는 모르겠고 그냥 summerlight님께서 그걸 c++로 구현하면 재미있겠다고 해서 시작을 한건데 대충 내용은 다음과 같다. A라는 class는 a, b, c라는 함수를 가지고 있지만, 명시적으로 X, Y, Z interface를 구현하고 있지 않기 때문에 X, Y, Z pointer로 A 객체를 지칭할 수 없다. 하지만 암시적으로라도, 동일한 함수 signature…
ClassLoader를 사용하여 Resource Stream 얻기
June 10, 2012class 파일이 있는 위치와 resource가 같다면 위처럼 간단히 getClass().getResourceAsStream()으로 읽어올 수 있고, 그렇지 않다면 URL을 적절히 활용해서 읽어올 수 있다.
c++에서 reflection 사용하기 3
지난 #2에서는 class_t, field_t 자체가 가상 함수를 갖고, class_impl_t와 field_impl_t가 이 class를 상속 받아서 구현하는 방식을 사용하였다. 사실 굳이 이 impl_t class 들은 노출될 필요가 없으므로 이를 감추도록 해보자. 그리고 다 완성된 type을 register함에 있어, 따로 register_class, register_field…
c++에서 reflection 사용하기 4
이전 글에서는 자료구조가 선언된 header파일을 여러 번 include하면 문제가 발생했었다. 하지만 이리저리 참조가 되다보면 각 번역 단위에서 include가 한 번만 되는 것은 굉장히 힘든 일일 것이다. 따라서 본 글에서는 매크로를 잘 정의해서 선언 header파일이 구조체 선언, reflection 등록 딱 2번만 include가 될 수 있도록 만들어볼 것이다. 이전 글(#…
c++에서 reflection 사용하기 2
지난 번 글의 문제점은 다음과 같다. class 정보가 없다. 따라서 이름으로부터 class에 대한 객체를 생성할 수가 없다. field에 대한 정보가 구체 class에 묶여있다. 따라서 그 class를 모르면 field 정보를 얻어올 수 없다. 그래서 이번에는 다음의 기능을 중점으로 구현하였다. 이름(문자열)로 class 정보 찾기 class 정보는 class 객체를 생성할 수 있어야 함 class 정보는 field…
c++에서 reflection 사용하기 1
mmo-server에서 attribute를 json serialize하기 위해 attribute가 가지고 있는 field의 정보를 enumerate 해야할 일이 생겼다. 그런데 c++은 reflection이 없잖아? 그렇게 고민하다가 예전에 쓴 글을 발견했다. c++에서 구조체 RTTI 정보 남기기 기본 아이디어는 다음과 같다. 각 class마다 자신의 field…
java annotation과 reflection을 사용한 xml mapping
마침 요즘 spring을 쓰면서 자바를 공부한다는 친구를 채팅방에서 만나게 되어 reflection과 annotation을 사용한 xml mapping에 대한 코드를 작성해보라고 이야기하였다. 그 친구가 언급한 DI와는 좀 다른 방향이지만, annotation을 사용한 metadata 사용과 reflection을 통한 설계적 유연성을 공부해보면 spring framework…
java의 FutureTask를 사용한 간단한 수행 대기
May 28, 2012어떤 작업에 timeout을 주고 실행하고 싶은 경우가 있다. 예를 들어 web crawler를 만들 때에는 해당 페이지에 대한 응답이 10초정도 없을 경우에 그냥 그 페이지를 읽지 않도록 예외처리 하는 것이다. 이 글에서는 ExecutorService와 FutureTask를 사용하여 timeout 처리를 하는 간단한 예제를 소개한다. ExecutorService는 java 1.5 때 Doug Lea…
lambda와 RAII 2
May 12, 2012C++11은 lambda expression을 지원해주니 좀 다르게 생각해볼 수 있다. lock_t class 자체에 위와 같이 functor를 받아 실행할 수 있는 함수를 만든다. 그리고 그 앞 뒤로 lock-unlock을 불러준다. 이렇게 하면 lambda를 사용하여 lock 사용 코드를 보다 깔끔하게 정리해볼 수 있다. lambda를 통해 lock…
lambda와 RAII 1
April 01, 2012C++11 에서 도입된 lambda expression을 통한 RAII 구현 방식의 한 예와, 단위 전략을 통한 RAII 구현을 통해 장단점을 비교해보자. Wiki: Resource Acquisition Is Initialization(RAII)는 scope 내의 정적으로 할당되는 객체의 생존 주기로 생성자와 소멸자가 쌍으로 호출되는 것을 사용하는 자원 관리 기법이다. 보통 IO…
asynchronous programming과 async, await
March 18, 2012함수를 호출하는 코드를 작성한다고 해보자. synchronous하게 호출하는 방법이 있고, asynchronous하게 호출하는 방법이 있다. (보통 후자는 호출이라고 하기보다는 요청을 한다고 할 것이다) 코드를 작성하는 프로그래머 입장에서는 당연히 synchronous…
C# UI Cross thread problem 해결
March 01, 2012다른 Thread에서 UI component에 접근하려면 문제가 발생한다. (cross thread) 동기화 이슈에서보면 당연한 이야기니 바로 해결책을 보자. System.Windows.Forms.Control에는 Invoke라는 UI thread로 작업을 delegate하는 method가 있다.이 녀석은 Delegate 를 받아서 그걸 내부에서 수행해주는데, C#에서는 어차피 외부 변수 capture…
환형큐의 thread unsafety 문제
어떤 자원에 대한 환형큐가 있다고 해보자. size는 2의 자승이다. 위 코드는 당연히 thread safety 하지 않다. 하지만 문제가 발생하지 않도록 나름 머리를 써서 다음과 같이 위 코드를 사용한다고 해보자. 예전 자원을 반환하고, 새로운 자원을 할당받아 그것으로 무슨 작업을 하는 것이다. 이렇게 되면 pop 을 부르는 시점의 thread 는 적어도 자신이 push 한 자원…
template의 암시적 interface 요구
상속을 통한 동적 다형성을 이용하려면, 명시적인 interface가 형성되어야 한다. 와 같이 interface와 이를 구현(implements)하는 구체 class를 작성하고 이처럼 동일한 interface로 취급할 수 있도록 하나의 container에 각 구체 class들의 객체를 담고 iterating하면서 update 함수를 불러준다. 이 때 type은 game_object *이므로 update…
template 인자를 상속 받기
위와 같은 형태가 어떤 의미를 지니고, 어느 곳에서 사용될 수 있는지 살펴보자 일단 자신의 부모 class를 generic하게 취할 수 있다는 것은 부모의 class 와 자식의 class 간의 결합성을 어느 정도 느슨하게 준다는 의미가 있다. (인자로 무엇을 주냐에 따라 상속 구조가 바뀌니까.) 또한 부모 class의 종류에 상관없이 동일한 기능을 추가해줄 수 있다거나, 아니면 부모 class들이 동일한 interface…
EventHandler와 Message Passing
객체(object)는 상태(state)를 갖고 외부의 조작(mutator)에 의해서 변경될 수 있다. 이러한 객체를 다루는 프로그래밍을 할 때는, 관찰자(observer)가 객체의 상태 변화(property change)를 감지하여 어떠한 동작(action)을 수행하는 경우가 많이 있다. 이러한 코드를 작성할 경우, 관찰 당하는 객체(subject)와 관찰자(observer…
간단한 Message 체계 구현 (Java)
본 글을 객체 간의 메시지 통신이 아니라 모듈 간의 메시지 통신에 대해 다룬다. 즉, 특정 대상 객체를 지정하여 메시지를 보내는 내용이 아니라 전역 MessageQueue에 대해 어떤 Message를 수신할지를 등록하는 Handler 객체에 대한 내용이다. MessageQueue는 전역 객체이다. Message를 받아서 이를 수신 Handler 객체에게 전달한다. 여러 Thread에서 접근할 수 있으므로 Concurrent…
type_t class 도입을 통한 임시 객체 없는 type 분기
어떤 class 2개가 있다. 이 class들은 기본 생성자에서 굉장히 복잡한 작업을 하는 객체들 혹은 생성 자체가 복잡한 class들이다. 이러한 class에 대해 어떠한 작업을 수행하는 generic한 함수가 있다. 이 함수는 객체의 type을 받아서 내부에서 모종의 작업을 수행하게 된다. 따라서 메인 함수에서는 다음과 같이 각 class에 대해 operation…
자바로 만드는 비행기 게임 4
이번과 다음은 코드 정리를 해보자. 이전까지의 비행기 게임 코드는 너무 하나의 class 에서 다 처리하는 방식으로, 뭐 하나 수정하기도 좋지 못한 구조였다 (물론 코드 전체가 별로 안 기니까 크게 상관없겠지만) 예를 들어 적기의 종류를 새로 추가한다던가, 총알의 종류를 새로 추가한다던가 하는 것이 쉽지 않은 코드였다. 따라서 이번에는 간단하게 코드를 묶으면서 정리를 해보자. resource…
자바로 만드는 비행기 게임 3
이번에는 적기의 등장과 충돌검사를 해보자. 적기는, y=0에서 등장해서 y=height까지 진행한다. 즉, 화면 위쪽에서 아래쪽으로 일직선으로 진행하도록 하자. 그러면 진행하는 y 값은 항상 동일할테니까(0 -> height) 시작과 끝 x 값을 random으로 뽑으면 된다. 적기의 속도를 다양하게 한다고 한다면 원래 속도를 랜덤하게 구해서 그만큼씩 이동하게 하겠지만, 그렇게 계산해주기 귀찮으니까 등장 시간을 랜덤하게 뽑고(…
데이터베이스 설계
데이터베이스는 데이터가 모여있는 것이다. 그 데이터를 보다 효율적으로 관리하기 위해 나온게 관리 시스템이고, 덕분에 데이터베이스라고 하면 데이터베이스 관리 시스템(Database Management System)으로 MSSQL이나 MySQL…
Java와 Getter/Setter
October 03, 2011…
c++ 에서 구조체 RTTI 정보 남기기
September 30, 2011RTTI는 Run-time Type Information의 약자로, 실행 중에 어떤 type에 대한 정보를 알 수 있다는 것이다. 보통 type 에 대한 정보는 컴파일 타임에 다 사용되고, 실행 중에는 없어지는데, 실행 중에 이 정보를 얻을 수 있으면 재밌는 일을 많이 할 수 있다. Java나 C#, 아니면 여타 동적 언어들은 당연히 이 기능을 지원하고 (보통 reflection 이라고 한다) C, C…
자바로 만드는 비행기 게임 2
노란색 타원 대신 비행기 이미지를 제대로 띄워보자. 자바에서 이미지를 읽는 것은 간단하다. AWT에서 제공해주는 Toolkit의 helper function인 getImage 함수를 통해 이미지 객체를 얻을 수 있다. (물론 player.gif 는 프로젝트 안에 들어있어야 한다.) 그럼 이제 그리는 방법을 알아보자. 그림을 그리는 것도 당연하지만, Graphics 객체가 존재하는 paintComponent…
자바로 만드는 비행기 게임 1
본 글타래에서는 자바를 사용하여 간단한 비행기 게임을 만드는 과정을 서술해볼까 한다. 원활한 자바 프로그래밍을 위해서, JDK와 Eclipse가 설치되어있어야 한다. 이에 대한 자세한 설명은 생략하고, 멋들어진 이름으로 프로젝트를 하나 만들어보자. 예전에 제출했던 이름을 따와서 타티을(Tatieul)이라는 이름으로 class를 하나 만들었다. 간단한 슈팅 게임을 만들어보자. 비행기 같은게 나와서, (Graphics…
탈무드 이야기
September 20, 2011…
Concurrent Pool (Static Size)
정적인 크기의 Thread-safe한 (Concurrent) Object Pool을 만들어보자. 핵심은 배열을 사용한다는 것. 왜냐하면 여러 thread가 접근해도 자신만의 index 지점을 접근하면 한 지점에 동시에 thread가 접근하면서 발생하는 문제가 없기 때문. 이게 동적으로 크기가 확장되면 배열의 포인터가 무효화되면서 여러 문제가 생길 수 있어 복잡하다. 따라서 정적인 크기라고 고정짓고 이야기를 해보자. Object…
IO와 메모리 복사
동기와 비동기 IO 에 대해 지난번에 이야기했었다. 비동기 IO 함수 간단히 요약하면, 함수는 완료 알림 시점 때문에 동기와 비동기로 구분된다는 것이다. 동기는 함수의 완료를 반환을 통해 알린다. 따라서 요청한 작업이 끝나기 전까지는 함수가 반환되지 않는다는 것. 덕분에 작업이 다른 작업에 의존적일 경우 흐름이 멈추는(Blocking) 경우가 많다. 비동기는 함수의 완료를 반환을 통해 알리지 않는다. Callback…
웹 기반 채팅방
August 14, 2011동아리에는 현재 대충 그지같이 만들어놓은 채팅방이 있다. 내가 만들었다 orz 코드 라인별 분석은 당연히 의미가 없을 것 같고, 핵심적인 부분에 대해 간략히 이야기해보려고 한다. 채팅방을 만들기 위해서 고민해야할 것은 다음과 같다. 메세지 구조 동기화 방법 동기 or…
객체별 함수 수행 동기화
(주의, 아래 글은 Visual Studio 2010 을 쓴다는 가정하에 작성하였다. 아무튼 C++11 이 지원되어야 한다) 여러 Thread가 동시에 접근을 수행하는 객체를 보호하기 위해서는 어떤 방법이 있을까? lock을 건다 각 Thread들은 하나의 queue에 요청할 작업을 쌓아두고, 그 객체 전담 Thread가 그 작업들을 처리한다. Read / Write Phase를 나누어서 Read는 다같이, Write…
비동기 IO 함수
IO 함수라고 하면 생소하게 느끼는 경우가 많다. IO 함수는 input / output 함수의 줄임말인데 우리가 흔히 봐왔던 함수로는 scanf와 printf가 있겠다. scanf는 keyboard에서 글자를 읽어(input) 오는 것이고, printf는 문자열을 화면으로 출력(print)하는 함수다. 이 뿐만 아니라 fprintf, fscanf 등의 파일 입출력 관련의 함수 역시 io 함수들이고, 파일 관련 Windows…
다중 입출력에 대한 효율적 처리
다중 입출력 함수는 POSIX의 select 함수를 공부하면서 가장 많이 보게 되는 함수이다. 다중 입출력 함수라는 것은 영어로 바꿔보면 multiplex io function인데 말 그대로 여러 개의 io 를 하나의 함수로 처리한다는 것이다. 지난 글의 동기와 비동기에 이어서 여러 개의 io를 어떻게 처리하는 것이 효율적인지 알아보자. 비동기 IO 함수 지난 번에 봤던 함수들은 하나의 IO…
Interlocked Singly Linked Lists
August 03, 2011Concurrent Data Structure는 Lock을 최소화하여 동작해야 multi thread에서 해당 자료구조에 접근할 때 발생하는 부담이 최소화되어 효율적인 프로그래밍이 가능하다. 여러가지 방법이 있겠지만, 가장 간단한(?) Windows API로 제공되는 Interlocked Singly Linked Lists에 대해 보자. (이후 SLIST 라고 이야기하겠다) SLIST는 단방향(singly) Linked…
context switching과 simultaneously 실행
August 02, 2011multi thread (or process) programming에서 가장 기초적인 개념으로 ABA Problem과 연결(되나?) 되는 기본적인 개념을 설명하고자 한다. 한 개의 코어는 한 시점에 한 개의 명령을 수행한다! 라는 기본 전제를 깔고 이야기를 시작해보려 한다. context switching 태초 단일 코어(core) 시대에는 한 개의 프로그램만 실행하면 됬다. 그게 OS…
volatile과 interlocked operation
volatile 다음과 같은 코드가 있다. 세 번의 ++ 연산을 모두 a 라는 변수에 수행하므로, 컴파일러는 최적화를 통해 다음과 같은 코드를 만들어낼 수 있다. 만약 multi-thread 환경에서 저 코드가 여러 thread에 의해 수행된다고 하면, add eax를 수행하고 mov dword ptr [count], eax를 수행하기 전에 switching이 되면, 다른 코드에서는 아직 count…
MSVC call stacktrace 구현
July 20, 2011이전에 Macro와 inline을 사용하여 log를 찍는 이야기를 했었다. 좀 더 나아가면 여러가지 재밌는 일을 할 수 있어 소개해보고자 한다. 다룰 내용은 __FUNCSIG__와 __if_exists이다. Visual Studio 전용일거다. gcc 유저는 저리가라 지인의 이야기를 들어보니 x64에서 디버깅을 할 경우 Call Stack이 알 수 없게 쌓인다고 한다. 따라서 x64 용 디버깅을 위해 Call Stack…
객체의 생성, 소멸과 goto 이야기
July 20, 2011생성자 소멸자 이야기 어떤 class의 생성자와 소멸자를 구현했다. 거기에서는 엄청나게 복잡한 작업을 수행한다. 예를 들면, 그리고 저 객체를 다음과 같이 사용한다고 해보자. 무엇이 문제일까? 복사 생성자와 대입 연산자가 적절하게 잘 구현되어있다고 하자. 그러면 sallow copy 문제는 당연히 아니다. 문제는 vector 자체가 Object로 구현되어 있기 때문에 내부에 Object…
class의 public과 private
July 20, 2011예전에 동아리 선배님께서 어떤 코드를 수정하시면서 하셨던 말이 있다. “왜 멤버가 다 public 으로 되어있는거야!” 요즘 읽고 있는 코드에서 몇 개의 class 들이 저런 문제점을 지니고 있다. 다음 예제를 보자. (volatile keyword를 사용한 이유는 다음에 설명하겠다) 저런 class가 있다고 할 때 저 interface만 보고 class가 무슨 일을 하는지 알 수 있을까? 이름도 적절히 Worker…
template을 사용한 type간 동등성, 대입가능성
runtime에 typeid를 써서 객체 type의 동등성(Same)을 확인하고, dynamic_cast를 써서 객체간의 대입가능성(Assignable)을 확인할 수 있다. 하지만 이런 것을 확인하기 위해 runtime을 소모하는 것은 너무 아까운 일이다. 고로 template을 써보자. 아래의 예제는 두 class, C1과 C2를 통해 진행된다. 동등성 확인 type…
template에 의한 generic interface 정의
알고리즘 등의 일반화나 의존성 제거를 위해서 class 사이를 interface 로 쪼개는 경우가 있다. 나는 C++ 보다는 Java가 더 익숙해서 template보다는 interface나 generics를 사용하는게 더 익숙한 편이다. 그래서 저번 자료구조 숙제를 할 때도 당황했던 것이, Iterator나 List 에 대해 Vector나 LinkedList를 구현할 때, 먼저 Interface…
thread local storage 초기화
July 13, 2011Tls는 Thread Local Storage로 Thread 내 전역변수라고 생각하면 간단하다(Local 인데 왠 전역!) 즉, 그냥 global 영역에 선언하는 변수는 프로그램 내에 여러 Thread 가 공유하는 자원이 되지만, Tls 로 선언한 자원들은 해당 Thread 별로 따로 갖는다고 보면 된다. (이 때문에 strtok 같은 함수도 내부에서 static 변수를 써도 Tls 로 선언하면 Multithread…
반복자 i++과 ++i에 대한 헛소리
July 01, 2011반복문에서 반복자를 증가시킬 때, for ( ; ; i++)과 for ( ; ; ++i)를 이야기할 때, 뭐가 빠르네 느리네 이야기가 왜 나왔을까? 간단히 생각해보면, i++과 ++i는 동작이 약간 다르다. 연산자 우선순위는 i++이 좀 더 빠르지만, 실행 측면에서 본다면 i++은 자신의 상태를 저장한다 자신의 상태를 변화한다 저장한 예전 상태를 반환한다 ++i는 자신의 상태를 변화한다 자신 자체를 반환한다. i++의…
프로그램 세그먼트
(리눅스 커널의 이해 개정 3판 810쪽) 유닉스 프로그램의 선형 주소 공간은 논리적인 관점으로 볼 때 몇 개의 선형 주소 구간으로 나뉘어있다 텍스트 세그먼트는 실행 코드를 포함하고, 초기화된 데이터 세그먼트는 초기화된 데이터, 즉 정적 변수(static variable)와 전역 변수(global variable…
Http Message header
May 19, 2011요번에 간단한 WebRequest / Response library를 작성하면서 HTTP 메시지 구조를 파악해야할 일이 있었는데 잘 정리해 놓은 사이트가 있었다. HTTP Message Header - Nick Lib 다른 재밌는 내용도 많다.
Java에서 LayoutManager로 인해 width가 뜻대로 안될 때
May 15, 2011Java의 LayoutManager는 유연한 component 배치를 위해 parent component의 width에 딱 맞춰서 자식 control을 배치해주는 작업을 수행한다. 그러다보니 자식의 가로 길이를 고정으로 하고 싶은 경우에도 그 크기가 변경되어서 문제가 생기는 경우가 있다. 여러 개의 출력 Pane이 하나의 Container Pane 안에 들어갈 때, Container Pane은 ScrollPane…
MySQL INSERT
May 01, 2011요번에 만든 동아리 홈페이지의 채팅방은 MySQL Memory Table과 Prototypejs의 polling 기반이다. 따라서 사용자가 꽤 접속하면 apache가 좀 힘들어할 수는 있지만, 그 양을 정량적으로 계산해봤을 때 크게 무리가 없다고 판단, 과도한 용도가 아닌 경우에서는 써도 괜찮겠다 싶어서 구현해놨다. 어차피 나중에 부분 update와 websocket으로만 치환해놓으면 되겠지. 그건 그렇고 MySQL…
Classical Inheritance in JavaScript
March 20, 2011Classical Inheritance in JavaScript JavaScript: The World’s Most Misunderstood Programming Language을 쓴 Douglas Crockford란 분이 쓴 글인데 지난 번에 귀찮아서 안 읽었다가 요번에 읽어보니까 꽤 좋은 내용이다. javascript…
java annotation을 사용한 InstanceId 구현
March 02, 2011Java에서 생성하는 Object마다 InstanceId를 부여하는 방법에 대해 고민해보고 코드를 작성해보자. Index 발급 Group 관련해서 파일을 하나 작성하여 IndexGeneratingManager를 구성해서 발급해도 되고, 아니면 발급 받는 시점을 적절히 조절하거나 발급 함수의 인자로 Group할 Class 정보를 넣어줘도 되겠다. 하지만 본 글에서는 Java 1.5부터 추가된 Annotation…
Object Database와 Value Object
프로그램이 Client, Server의 2-tier 모델에서 Server가 Data의 persistence를 위해 database를 사용한다. 이 때 client가 요청한 정보를 server가 database로부터 반환받아 client에게 넘겨주는 framework를 작성해보자. 설계 일단 Client와 Server가 주고 받을 데이터를 담는 객체를 설계한다. 기본(primitive) type과 String, Date…
JPanel 상속
February 15, 2011Java에서 UI 코드를 작성할 때, 가장 많이 하는 코딩 방식이 UI Pane class를 만들고 이 class가 JPanel을 상속받는 것이다. 하지만 생각해보면 그 class는 전혀 JPanel을 상속받을 필요가 없고 그냥 JPanel 객체를 멤버 변수로 하나 만들어서 contain pane으로 사용해도 된다. 그러면 그 class는 정확히 controller 역할을 수행할 것이고(event handling…
bash 참조 사이트
https://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html https://tldp.org/LDP/abs/html/index.html 개발자라면 자기에게 어울리는 스크립트 언어 하나 쯤은 있어야 하는 것 아닌가요? 그렇다면 난 bash를 하겠다! bash bæʃ v. ―vt. (구어) 후려갈기다, 쳐부수다; 〖야구〗 (볼을) 치다, 강타하다. ―vi…
typeof, container_of
January 09, 2011gcc의 additional standard?라고 하는데 generics를 지원하기 위한 도구가 만능 void * 이외에 이런 것도 있었다. typeof 어떤 struct 내부 변수의 주소와 그 struct의 typename을 알 때, struct 변수의 시작 주소를 알아내는 container_of라는 매크로에 대해 동아리 친구와 잠깐 이야기했던 적이 있다. 간단히 설명하면 ((type *) NULL)->var…
닫힌 descriptor와 write, SIGPIPE
예전에도 엄청 고생했던 것인데, socket이나 pipe 등에서 read와 write로 IO를 수행할 때 상대쪽(opposite endpoint)이 닫혔다면 어떤 현상이 벌어질까? read는 -1을 반환한다 write는 SIGPIPE를 받는다. 하지만 프로그램이 signal handler를 만들지 않았다면 그 프로그램은 죽는다. SIGTERM이나 SIGQUIT를 받은게 아니기 때문에 조용히 죽는다. send/recv…
당연하지만 간과하는 size_t ssize_t
January 08, 2011IO 함수를 사용함에 있어서 그 근간이 되는 것은 read와 write 함수이다. 이 함수는 모두 ssize_t를 반환하는데, 보통은 너무나 축복받은 환경에 있기 때문에 저게 왜 ssize_t 인지 모르는 경우가 많다. size_t는 size를 나타내기 위한 type으로 보통의 32bit machine에서는 32bit, 즉 unsigned int로 되어있다. 가장 유명한 sizeof…
class와 memset
December 24, 2010c++의 class보다 java의 class를 훨씬 많이 쓰는 나는 사실 c의 struct라면 모를까 c++의 class는 아직도 생소하다. struct를 쓸 때, 가장 좋은 점 중 하나는 초기화라고 생각하는데, 와 같이 선언과 동시에 초기화를 할 수가 있어 만약 모든 값을 NULL(or 0)으로 채우려면 class…
stl operator 실수
December 24, 2010어제 나를 1시간동안 고민하게 한 코드는 다음과 같다. 어제 정신이 없었다고 변명을 해도 너무 어이없는 실수를 저질렀는데 더 큰 문제는 컴파일에서 뱉어주는 에러를 보고도 해당 문제를 파악하지 못했다는 것이다. 위 코드의 문제는 나는 OOP 수업의 영향으로 class declaration에서 public - protected - private 순으로 선언을 하고, public method…
debian 계열 db 덮어쓸 때 주의점
December 21, 2010debian-sys-maint 계정 암호가 바뀌면 안된다 이 암호는 /etc/mysql/debian.cnf에서 볼 수 있으니 여기서 암호를 찾아서, 한번 해줘서 계정 암호 갱신하면 된다.
LockWindowUpdate
December 18, 2010Win32 혹은 MFC를 하다보면 어떤 창 내에 여러 Child Window가 존재하고, 또, 해당 DC를 얻어서 그림을 그려야하는 경우가 생긴다. 이들이 모두 변경되는 경우, 즉 그림도 변경되고 Child Window도 SetWindowPos 등의 함수를 통해 변경될 경우에 그림은 InvalidateRect() 등의 함수에 의해 다시 그려질 것이나 Child Window는 SetWindowPos나 ShowWindow…
as you know, utf8_unicode_ci
December 03, 2010https://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=01&m_no=21616&cat1=10&cat2=311&cat3=329&lang=k https://forums.mysql.com/read.php?103,187048,188748#msg-188748 mysql에는 collation 중 utf8_unicode_ci와 utf8_general_ci…
Synchronize object via HTTP
October 31, 2010http 기반으로 object를 server와 주고 받아 database와 연동, persistence를 구현한 대충만든 라이브러리이다. 소스 코드는 https://github.com/lacti/hso에 올려두었다. db.php는 코드 파일을 잃어버렸다(…) 아마 mysql 접속 함수와 id/pw 정도가 들어있던 같다. 귀찮아서 정리는 안했음 … serialize / deserialize 되는 debugging message…
자바 네트워크 프로그래밍 1 - 기초
May 01, 2010네트워크라는 것에 대해 깊게 설명할 생각은 없다. 단지 자바 언어에서 어떻게 네트워크 프로그래밍을 할 수 있을까 정도에 대해 간략하게 소개할 생각이다. 이 글을 보고 관심을 조금만 갖고 구글링해보시면 당연한 이야기이지만 훨씬 잘 설명된 좋은 글이 많을테니, 이 글에서 단순히 흥미유도 차원 글을 쓴다. 기초 네트워크 프로그래밍은 두 원격지(HOST…
자바 네트워크 프로그래밍 2 - Socket
May 01, 2010자바 네트워크 프로그래밍을 설명하려면 당연히 IO부터 이야기해야하는 것이 맞겠지만 이왕 저지른거 막장으로 달려보자. Socket 전 글에서 네트워크 통신을 사람 간의 전화로 비유했었다. 네트워크 통신을 한다는 것은 NIC(Network Interface Controller…
Java ObjectStream의 Input/Ouput Blocking이야기
April 29, 2010Java의 ObjectInputStream / ObjectOutputStream을 사용하여 데이터 통신을 할 때 Client와 Server 양측에서 ObjectInputStream을 먼저 생성하면 프로그램이 더이상 진행되지 않는 경우가 있는데, 그 이유는 다음과 같다. ObjectInputStream의 ctor 코드를 보면 아래와 같이 readStreamHeader(); 함수를 호출한다. readStreamHeader…
HashSet과 ArrayList
March 20, 2010시간이 없으니 일단 짧게. 어떤 equals, hashCode가 구현된 Entity object를 HashSet에 추가한 뒤, 그 object에 대한 reference 변수를 사용하여 저 두 함수의 결과에 영향을 주는 field 값을 변경할 경우, HashSet은 contains가 false를 반환하는 반면, ArrayList는 contains에서 true를 반환함. ArrayList는 전체 대상에 대해 equals…
java remotelib 개발
심심한 상황에서 뭘 코딩할까 고민중에 java rmi app를 만들다가 고생한 기억이 있어서 이걸 좀 쉽게 사용할 수 있는 remote lib를 만들어보자는 생각에 시작하였다. 개발 목표 기존의 java rmi와 유사한 code로 remote method interface call을 구현할 수 있어야하고, 쌍방통신이 쉽게 가능했으면 한다. ※ rmi…
꽤 쓸만한 Java Decompiler
February 07, 2010JD 역시 구글 검색순위 1순위는 다르다!
개발중인 Remote Library 중간보고
PHP의 __call method는 해당 object의 member를 호출했을 때, 그 member가 not implement 상태이면 __call method로 method name과 arguments를 넘겨주는 그런 신비한 method이다. 예외처리도 아니고 없는 method에 대해 해당 method 호출 정보를 넘겨받을 수 있는 함수라니! 이건 진정한 proxy class를 제작하기 위한 필수 method…
함수 값 반환 방법[어셈블리]
October 18, 2009함수에서의 값 반환이 실제로 기계어 수준에서는 어떻게 이루어지는지 알아보자. 참고 assembly 정도는 알고 있어야 무얼 이야기하고자 하는지 알 수 있다. 아래의 코드들은 gcc((Debian 4.3.4-5) 4.3.4) + gdb(6.8.50.20090628-cvs-debian)인 curs-server에서 실험한 것이다. vs환경에서 해보면 좀 다를 것 같다. 본문 함수는 1-2 공전계 시간에 배우고, 함수 호출 원리는…
Java Graphics와 AffineTransform, 그리고 JScrollPane
January 04, 2009예전에 디비랩 알바를 할 때, 어떤 이미지에 대해 확대, 축소, 이동을 해야할 일이 생겼다. MouseEvent 처리 시 좌표 계산 등, 몇 가지 계산을 해서 Image를 확대, 축소, 이동해서 볼 수 있도록 하였다. Applepie(YPE…
Java Swing을 한다면 1
January 03, 2009Java Swing에 대해 어떻게 GUI를 배워나가는 지에 대한 이야기를 해보고 싶었다. 물론 어느 순서가 바른 순서인지는 나도 모르고, 단지 내가 해온 순서는 이렇다는 이야기를 해보고 싶어서 글을 쓴다. Basic GUI Java Basic GUI는 창을 띄우고 Button을 띄우고, Text를 입력받는 등의 간단한 UI 코딩이다. Model, Editor, Renderer의 개념을 몰라도 괜찮고, NetBeans…
eclipse + subversive
December 25, 2008eclipse는 우연히 만나서 같이 지내오는 녀석이고, subversive는 알게 된지는 얼마 안됬는데 굉장히 많이 쓰게 된 녀석이다. eclipse 1학년 2학기 상상설계공학 수업에서 모바일 프로그래밍을 하였다. 이 때 J2ME로 진행하면서 eclipse를 처음 써보았다. 정확히 말하면 eclipse 3.2에 SK-VM 플러그인을 설치해서 작업했던 것이다. 아무튼 Java 언어나 문법보다 eclipse…
django와 encoding
October 18, 2008mysql의 encoding은 참 여러 곳에 존재하기 때문에 종종 까먹곤 한다. table 자체의 collation과 field의 collation은 늘 인식하고 있는 존재이기는 한데, database 자체도 collation이 있다는 것을 깜빡한다. 이게 무슨 영향을 끼칠 수 있냐하면 구조적으로 database와 table, 그리고 field는 collation을 상속받는 구조이기 때문에 table…
const overloading
October 12, 2008c++의 overloading은 c에서 어떤 함수를 단순히 함수의 이름으로만 식별했던 것에 비해 함수의 인자의 type, 개수, 혹은 const/volatile 여부까지 고려해서 식별한다는 것이다. 즉 linking 시점에서 호출하는 지점과 호출 당하는 지점을 연결해줄 때 호출하는 지점에서 요구하는 함수의 정보(함수 이름, 인자 type, 개수, const/volatile 여부)를 기반으로 함수 table…
Java의 equals의 세계
August 31, 2008boxing/unboxing이 지원되는 Java 5 이후부터 숫자형 Wrapper Class 객체에 대해 equals와 == 연산자는 과연 어떻게 동작할 것인가 class 주제에 primitives라고 이야기하는 String class의 equals와 == 연산자는 과연 어떻게 동작할 것인가 그리고, 만약 위의 객체들이 Vector<Object>에 들어가서 Object로 pointing될 때, equals…
ConsoleHandler와 System.in/out/error의 closing
July 28, 2008java.util.logging의 Logger 쓰는 맛을 들이고 있는데 어느 순간부터 Exception이 나오지를 않는 것이다. 찾아보니까 알게 된 사실 Exception이 빨간 글씨로 나오는게 싫어서 ConsoleHandler의 OutputStream을 System.out으로 설정하려고 했다. 근데 이상하게도 setOutputStream이 protected이더라. 그래서 당당히 ConsoleHandler…
gdb 간단 사용법 정리
April 01, 2008GDB는 GNU Debugger의 약자로 console 디버거이다. console 디버거이므로 gdb는 gdb shell을 제공하고, 사용자는 그 shell에 명령을 입력함으로써 디버깅을 수행할 수 있다. 먼저 디버깅을 수행하기 위해서는 소스 코드를 컴파일할 때 디버깅 정보를 포함하도록 해야한다. gcc에서 이에 해당하는 옵션은 -g이다. 예를 들어 test.c라는 파일이 있다면 다음과 같이 수행하면 된다. gdb…
pintos 환경 구축
April 01, 2008Pintos를 구동시키기 위해서는 먼저 가상 에뮬레이터가 필요하다. Open source 중에 대표적으로 Bochs와 QEMU가 있는데, 설치법이 과제 문서에 기술되어있는 Bochs를 선택하여 설치하였다. Bochs는 Open Source 프로젝트로 Sourceforge에서 그 소스를 다운받아 컴파일하여 설치할 수 있다. 파일을 받기 위해서 Sourceforge에 lynx로 접속하여 bochs-2.3.tar.gz…
pintos 기본 구조와 동작 원리
April 01, 2008Pintos의 기본 구조 Pintos는 가장 기본 기능인 threads를 중심으로 user program, virtual memory, 그리고 file system을 추가하는 구조를 갖는다. 그래서 소스 코드의 분포 역시 기본적인 것들은 threads 디렉토리에 다 있고, 그 밖의 것들은 각각의 디렉토리에 존재하면서 threads에 있는 소스 코드를 참조하는 식으로 되어있다. 그리고 Pintos…
pintos 부팅 과정
April 01, 2008우리가 일반적으로 사용하는 컴퓨터 내에 존재하는 시스템은 하드 디스크 등의 보조 기억 공간을 갖고 그 기억 공간에 접근하여 동작을 수행하는데, Pintos를 수행하는 bochs는 Pintos를 빌드하여 얻어진 이미지 파일을 하드 디스크 등과 같은 storage로 인식하여 emulating을 수행한다. 하지만 Pintos는 단순히 커널만 존재하기 때문에 우리가 일반적으로 사용하는 storage…