2011년 12월 8일 목요일

Using Simple Path in unity3d


SimplePath로 Pathfinder를 바꿔보았다.
1. 성능은 그닥 좋지 않다.
2. Rigidbody용 Steering을 갖고 있어서, non-Rigidbody를 위한 Steer는 따로 만들어야 한다.
3. Obstacle Avoidance를 위한 시스템이 존재하긴 하지만, 움직이는 주체 자신을 Obstacle로 정하면, Path를 아예 만들지 못한다. 결국, 움직이는 객체에 Obstacle을 둘 수가 없다.

2번은 해결했지만, 3번의 이유로 결국 예전 Pathfinder로 돌아감.

Unity 3.5를 다시 기대해본다;;

2011년 11월 21일 월요일

a* pathfinding in unity3d

http://arongranberg.com/astar/docs/changelog.php

3.07 버젼이 나왔다.

XPath라는 것이 추가되었는데, 게임로직에 맞게 커스터마이징이 가능할 듯 하다!
기다리던 기능이다!

Local Avoidance만 더 추가되면 좋겠는데...

2011년 11월 17일 목요일

minimalism on game development

기획의도대로 하기 위해서,
다양성을 추구하기 위해서
정말 많은 일들을 해야 한다.
기획이 1이면, 프로그래밍은 100정도의 일을 해야 하기 때문이다.

정말 일이 많다.
새삼 느낀다.
토나오도록 많다.
일정을 지키고 지치지 않으려면,
기획의도를 지키면서 최소한의 연출을 하면서도 원더한 효과를 보여줘야 한다.
미니멀리즘을 하지 않을 수 없다.

animation when being hit

피격모션을 다양하게 넣는 것은 그래픽 디자이너에게 부담스럽다.
다른 구조의 캐릭터에게, 각각 다른 피격 모션을 구현해야 하기 때문이다.

타격감을 살리기 위해서는 필요한데...
RagDoll Physics를 활용하면 쉬워질까?

다양한 피격모션을 프로그램적으로 만들어내고 싶다.

ragdoll generator가 있다. 시도해봐야 할 듯!
http://unity.thearcgames.com/User_manual

100 spells

한달안에 100개의 스펠을 만들생각이다.
게임시스템을 잘 이용하면 가능하다.
3D이기 때문에 만들기가 용이하다.

2011년 11월 16일 수요일

Game Character Animation and Hitting Sense

오랜만에 게임 클라이언트 프로그래밍을 하고 있다.
타격감이 중요한데,
타격감은 공격 모션과 대미지 시뮬레이션의 동기화,
이펙트, 사운드, 피격 모션이 서로 잘 어우러져야만 한다.

게임 로직이 복잡해질수록,
상태변화를 담당하는 모듈과 애니메이션을 담당하는 모듈에서의 상태관리가
서로 엉켜 복잡해진다.

타격감을 위해서는 기준은 애니메이션이다.
공격을 시작하는 충돌을 감지하고, 애니메이션이 시작된다.
그전에 하던 애니메이션이 멈춰야 하고, 해당 공격이 취소될때까지, 상태가 유지되어야 하고,
완료하면, 그전 상태의 애니메이션을 플레이 해야 한다.

복잡하게 생각할 필요 없다.
타격이 일어나면, 타격 애니메이션을 돌려주고, 애니메이터가 애니메이션이 끝남을 알리면,
상태변환 진입을 허용하고, 현재 상태를 분석하여, 다시 애니메이션을 돌려주면 된다.
애니메이션내에서의 타격점에서의 대미지 딜링과 효과음,효과 파티클 플레이는 애니메이션 이벤트를 받아서 처리하면 된다.

2011년 7월 11일 월요일

choosing webframework for iPad/iPhone app in cloud env

배고픈 app개발자는 단독 호스팅보다는 무료 버젼이 있는
클라우드 서비스를 사용해야 한다.

Google App Engine이 대표적인데,
아직 성능은 맛보지 못했다. 소문에 의하면 느리다고 한다.
하지만, 써봐야 알겠지. 왜냐하면, 약간 느리더라도,
Time Critical Task가 아닌 곳에서 잘 활용할 수 있다면,
Deployment의 우월성을 즐길 수 있을테니까...

Google App Engine은 Java와 Python을 지원한다.
Java를 쓴다면, Play!Framework를 쓰는 것이 좋을 듯하고,
Python을 쓴다면, Django를 써야할텐데, 경험상 Play!Framework이 훨씬 좋았다.
Google App Engine을 쓴다면, 그 서버와 Interoperate할 것들도 Google App Engine을
쓰지 않으면 오히려 독이 될 수 있기 때문에,
그 서비스 범위를 엄격히 제한해야 할 것이다.
또한, 서비스가 잘 될 경우에, 독립 서비스로 이사오거나 프리미엄 서비스로
잘 서비스 되는지도 알아봐야 할 것이다.
이런 면에서, Google App Engine은 Amazon의 그것에 비하면 매력이 없다.
하지만, Google App Engine으로 구현 한 것을 Amazon으로 쉽게 이사갈 수 있다면?
초기 스타트로서는 좋은 선택이 될 수 있다.
Amazon이 초기 스타트로서 좋은지는 아직 알아보지 못했다.
알아보니, Amazon은 그냥 Virtual Hosting이구나. 제약없이 쓸 수 있을 듯.
초기 비용 투자가 필요하다.

Google App Engine용 Python framework이 나온 것이 있어서 살펴보고 있다.
https://docs.google.com/document/d/1GSls-lcfmhSeYFhHgmBVnwMQg0QRYWKepfNSt-0zCQY/edit?pli=1
django보다 미성숙되었지만, django보다 light해서 눈길이 간다.
간단한거 하자고 django를 쓰기엔 무겁잖아!
Java는 속도 향상이 되었는지 모르겠다. 로딩 타임이 1초 이내로 걸린다는 둥,
속도 이야기를 많이 한다.

좀 더 Massive한 환경을 지원하기 위해서는 이걸로는 턱도 없이 안된다.
GAE를 이용한다면, 초기 몇개월 버티기용으로 1~2주만의 개발로 끝내야 말이 될 것 같다.

일단 짧은 고민은 여기까지...

2011년 7월 6일 수요일

long time no see

Unity3D로 게임 프로젝트를 하느라, 블로깅에 소홀했습니다.
아직 진행중이고 여유가 많지는 않습니다.

조만간 여유를 만들어서 재개하겠습니다.

Erlang으로 온라인 서비스를 위한 서버들을 구축하기로 결정했습니다.
물론 일부 서버는 C++로 하겠지만,
요즘같은 Cloud 시대에는 Erlang과 같은 확장성 있는 서버가 매력이 넘칩니다.

DB 또한 Cloude시대에 맞게 선택할 것입니다.
CouchDB를 비롯한 분산형 서버를 선택하게 될 것입니다.
KumoFS도 실제로 시험해 볼 생각입니다.
Memory Based Type-Value Store로 Scalaris를  생각을 하고 있습니다.
기본적으로 MySQL기반으로 언제든지 back할 수 있도록, compatibility를 유지할 고려도 하고 있습니다.


앞으로의 선택과 진행을 주목해주세요.

2011년 6월 3일 금요일

playmaker in unity3d

visual programming을 할 수 있도록 해주는데... 꽤 쓸만해 보인다.

visual programming의 뒷 배경에는 잘 정리된 아키텍쳐가 있어야 하기 때문에,
칭찬할 만 하다.

http://hutonggames.com/playmaker.html

terrain in unity3d for iOS

unity3D에서 iOS에서는 terrain엔진을 지원하지 않는다.

terrain4mobile이라는 것을 asset store에서 구매해서 사용하기로 결정;;;
그밖에도 asset store에서 여러가지를 구매했다.

2011년 5월 30일 월요일

unitysteer in iOS

무엇때문인지 몰라도, unitysteer가 iOS에서 전혀 동작하지 않는다.

contact mail을 보낸 결과 다음과 같은 메일을 받았다.


http://www.arges-systems.com/articles/252/unitysteer-experimental-vehicle-and-radar-changes/

Unity has some issues with Linq on iOS."



도움이 되었다면, 광고를 클릭 ㅎㅎ ^^

2011년 5월 26일 목요일

line drawing in unity3d

http://unity3d.com/support/documentation/ScriptReference/LineRenderer.SetVertexCount.html

line renderer를 이용하여 그린다.

도움이 되었다면, 광고를 클릭 ㅎㅎ ^^

distributed key-value store

요즘 distributed DB에 대한 needs가 많다.
저에게도 문의가 가끔씩 옵니다.

제 생각엔, MySQL로 잘 버티다가 옮기는 방법이 현실적이라고 생각합니다.

저도 아직 써보진 않았지만, 제가 기술책임자라면,
scalaris와 kumofs, tokyocabinet를 쓰면 어떨까 합니다.
http://elliotsp.blogspot.com/2011/01/choosing-type-value-store-for-user.html

저도 시간되면, 테스트 프로젝트를 해 볼까 합니다.

추가적으로 couchDB,DEX graph DB도 쓸만 할 것으로 예상합니다.
언어는 Erlang을 추천하지만, 다른 언어를 써도 무방합니다.

도움이 되셨다면, PayPal donate(또는 광고 클릭)를 ㅎㅎ ^^

get ground's position by raycast in unity3d

이동 경로를 만들기 위해,
클릭 위치의 땅 위치를 가져오는 방법
http://forum.unity3d.com/threads/7376-Mouse-Click-RayCast-ground-position-to-Quaternion.

layer mask로 다른 object를 bypass하는 방법
http://unity3d.com/support/documentation/Components/Layers.html

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 5월 24일 화요일

FSM in unity3d

http://www.playmedusa.com/blog/2010/12/10/programming/a-finite-state-machine-in-c-for-unity3d/

좋은 소스 ^^ NPC구현에 적합.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

messaging in unity3d

결론적으로, direct call에 비해서 현저히 느리다. iPhone에서는 특히.
http://forum.unity3d.com/threads/38094-Is-SendMessage-really-that-bad

하지만, general object에 posting을 해야하고, 자주 쓰지 않는 경우는 써도 될 듯 하다.

다음은, listener 기반 event handler이다. 객체간 통신이 아니라, broadcast 용으로 쓸만하다.
http://www.unifycommunity.com/wiki/index.php?title=CSharpMessenger_Extended
http://forum.unity3d.com/threads/37896-Programming-architectures?p=244521#post244521

객체간 통신을 위한 notification을 위해서도 누군가(prime31) 이미 만들어 놓았다.
샘플 소스도 같이 들어 있다.
http://forum.unity3d.com/threads/37896-Programming-architectures?p=244521#post244521

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 5월 23일 월요일

js to c# in unity3d

http://www.m2h.nl/files/js_to_c.php

unity3d의 javascript 파일을 c#으로 바꿔준다.
웹사이트에 들어가서, copy & paste하면 되고,
class이름을 바꿔서 쓰면 된다. ^^

참 고마우신 분 ㅋ

pathfinding and steering in unity3d

http://angryant.com/path.html

http://www.arges-systems.com/articles/274/unitysteer-2-2-released/

이 두 소스가 좋아 보인다.
둘간에 연동도 된다고 한다.

gameprefabs에도 pathfinder가 있다.
http://www.gameprefabs.com/products/show/192


활용하거나 응용하려면 시간이 꽤 들겠지만,
만들어져 있는게 있어서 시간 절약하니 좋다~ ^^

unity3d 커뮤니티가 꽤 있어서 다행이다~

multi touch 용 소스는
http://blogs.unity3d.com/2009/09/05/touch-phases-example-iphone-project/
을 보면 되는데, 소스 공개 여부가 불투명하다.
simple gesture system이 gameprefab 에서 공개중이다.
http://www.gameprefabs.com/products/show/132

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

mysql performance blog

http://www.mysqlperformanceblog.com/

mySQL 최적화에 대해서 여기가 제일 우수한 듯.

unity3d child animation

child에 warrior라는 객체가 있고 그 안에 "dodge"라는 animation이 있다고 하면,
다음과 같이 하면 된다.
GameObject.Find("")가 아니라 transform.Find("")이다.

public class SomeObject : MonoBehavior
{

private Transform Warrior;

void Update()
{
  Warrior = transform.Find("Warrior");

  if ( !Warrior.animation.isPlaying )
 {
Warrior.animation.Play("dodge");
 }

}
}

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 5월 16일 월요일

unity plugins

http://prime31.com/

Unity Asset Store로만으로 먹고 사는 회사?(사람?)인 듯 하다.

Unity로 만든 게임을 퍼블리싱하기 위한 필요한 플러그인들을 제공하고 있다.

In App Purchasing을 위한 Storekit,AdMob Plugin,iAd Plugin등을 제공한다.
Native Toolkit으로 Native App과 연동도 쉽게 할 수 있도록 제공한다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 5월 15일 일요일

some resources in unity3D

C#으로 된 예제(javascript로 된 예제만 많다. http://www.m2h.nl/unity/ 여기에 다른 소스들도 참고할 만하다! )
http://u3d.as/content/m2h/c-game-examples/1sG

c# 코딩할때 주의할 점 ( 공식 아티클, 꼭 읽어야 함 )
http://unity3d.com/support/documentation/ScriptReference/index.Writing_Scripts_in_Csharp.html

unity3d game development by example의 소스( 책 pdf파일 불법이지만 돌아다닌다. 따라서 어둠의 경로를 좋아하시는 분은 책 안 사도 됨;; 전 샀어요~ ^^ )
http://www.packtpub.com/support?nid=6081

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 5월 2일 월요일

using c# and javascript simultaneously in unity3d

unity3d에서 지원하는 C#과 javascript를 모두 쓸 수는 없을까?

여기에 답이 있다.
http://www.41post.com/1935/programming/unity3d-js-cs-or-cs-js-access

즉, 폴더만 다르게 하고, 서로 reference가 가능하다!

이것을 응용한다면, javascript에 익숙한 개발자와 c#에 익숙한 개발자가 함께 작업이 가능하다. 또는, 프로그래밍의 특성에 따라서 언어를 나눌수도 있으리라.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

prefab in unity3d

http://unity3d.com/support/documentation/video/6.html

prefab이라는 구조가 있는데, 비슷한 인스턴스를 만들때 쓰인다.
나의 용어로는 schema로 썼었는데, 그 개념과 유사하다.
prefab의 원뜻은, "공장에서 부품의 가공과 조립을 하여 놓고 현장에서 설치만 하는 건축"이다.
즉, instance의 값들을 inherit(상속)해서, modify가 필요한 것만 고쳐서 사용하여, 재활용성을 높인다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 4월 29일 금요일

unity3d shiva3d airplay SDK comparison for online game



Issues
Unity3D
Shiva3D
AirPlay SDK
Platforms
+PC,Mac
+Palm
+bada,Symbian
Community
More
Less
Few
Native
Limited
Better
C++ only
Tool
Good
Fair
No
Rendering
Good

Fair

Limited

Socket
C# socket
only for Shiva Server
BSD socket
I18N
Unicode
Support
Not Sure
Total Score
90
70
51

현재까지 제가 알아본 바대로 적었습니다.
Unity3d가 인기가 많은 이유가 있네요.
C#을 싫어하지 않는다면, Unity3D를 선택해야 할 듯 합니다.
Unity3D를 쓰고, 서버를 구현한다면, C#으로 하는게 코드 공유가 되서
생산성에 좋을 듯 합니다. Photon Server 를 쓰면 될 듯.
Low Latency를 요하는 게임을 구현한다면, C++로 만들어야 할텐데, 코드 공유가 안되니,
서버 프로그래머가 따로 필요하겠네요.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 4월 7일 목요일

first milestone of tinyNetwork completed

tinyNetwork library의 milestone1이 끝났다.
거의 모든 코드가 template으로 되어 있다.

이제, 테스트 코드와 쓰레딩 모델들을 구현하는 concrete(구체적인)한 일들만 남았다.
같이 할 사람 있으면 좋겠다;;

이번달 말까지 마무리가 목표이다.
마무리 하면서, 새로운 프로그래밍 언어를 구상해야겠다.

2011년 4월 4일 월요일

strict keyword in C99

C99 표준부터 쓸 수 있는 keyword인 'restrict'는 나도 몰랐었다.
결론적으로 instruction 한두개를 절약하는데 매우 유용하다.

void updatePtrs(size_t *restrict ptrA, size_t *restrict ptrB, size_t *restrict val)
{
*ptrA += *val;
    *ptrB += *val; 
} 
 
이렇게 pointer앞에 restrict를 넣어주면, 
함수내에서 포인터 aliasing이 일어나지 않는다는 것을
compiler에게 알려준다. 또한, 서로 같은 포인터를 가리키지 않는다는 것을 알려준다.
그럼으로 compiler가 불필요한 instruction을 생성하지 않아도 되게 한다.
 
A. 다음은 restrict를 하지 않았을때의 instruction들이다.
---------------------------------------------- 
load R1 ← *val  ; Load the value of val pointer
load R2 ← *ptrA ; Load the value of ptrA pointer
add  R2 += R1   ; Perform Addition
set  R2 → *ptrA ; Update the value of ptrA pointer
; Similarly for ptrB, note that val is loaded twice, 
; because ptrA may be equal to val.
load R1 ← *val  
load R2 ← *ptrB
add  R2 += R1
set  R2 → *ptrB
---------------------------------------------- 
 
B. 다음은 restrict를 넣었을때의 instruction들이다.
----------------------------------------------  
load R1 ← *val 
load R2 ← *ptrA
add  R2 += R1
set  R2 → *ptrA
; Note that val is not reloaded,
; because the compiler knows it is unchanged
load R2 ← *ptrB
add  R2 += R1
set  R2 → *ptrB 
----------------------------------------------

B에서는 *val의 포인터 값이 바뀌지 않는 다는 것을 알기 때문에, 
val을 R1레지스터에 reload하지 않았다.
(위의 설명은 위키에서 가져왔다. http://en.wikipedia.org/wiki/Restrict )
 
이런 케이스가 얼마나 될꺼냐고?
nedtrie의 소스를 보다가 쓰고 있는 현장을 목격했다. ㅎ
 http://www.nedprod.com/programs/portable/nedtries/
여기를 보면 더 자세한 설명이 되어 있다.
GCC의 strict_aliasing flag을 켜는 것에 대해 써 있는데,
모두 켜도 되는지 확실해야 한다. 아마도 확신하기 쉽지 않기 때문에, 
개별적으로 써야 할 듯 하다.
http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html
도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^


2011년 4월 3일 일요일

non-block lock free circular queue

non-block circular queue에 대한 내용이다.
one producer,one consumer환경에서 lock을 쓰지 않는 방법을 제시한다.
dream.eng.uci.edu/eecs123/15_NBB.pdf

다음은 저자 홈페이지
http://dream.eng.uci.edu/kim-kane.htm
저자가 한국인 교수님이다. ^^

TMO를 다운로드하면, NBB소스를 볼 수 있는데,
자세히 살펴보면 버그가 숨겨져 있다;;;;
공부겸 스스로 찾아보길 바란다. ^^

이 circular queue로 thread간 통신에 쓰면 lock을 쓰지 않아도 된다. ^^
다만, multiple producer/multiple consumer 상에서는 통하지 않는다.
multiple producer/multiple consumer에서는 producer lock/consumer lock을 사용하여 제어하면 될 것이다.

linux에서 memory barrier를 이용한 방법도 함께 소개한다.
다음 링크를 참조.
http://lxr.linux.no/#linux+v2.6.38/Documentation/circular-buffers.txt

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 4월 2일 토요일

100k problem? 1024cores?

이전에는 10k 즉, 동시접속 1만명이 문제였다면, 이제는 동시접속 10만명을 받으면서,
최적화하느냐가 문제인 것 같다.
앞으로 core수는 계속 늘어날테니까...
아주 많은 부분에서 최적화가 이루어져야 할 것이다.

일단 네트워킹 부분에서 시작하고자 한다.

2011년 3월 29일 화요일

overlapped IO

http://linkmemo.tistory.com/entry/Overlapped-IO-Note-1

overlapped io에 대한 설명이 잘 되어 있어서 링크한다.
이러한 특성 때문에, IOCP와 overlapped io를 이용한 Win32서버가 더 빠른 것이다.
하지만, 잘 다뤄야 한다. ^^
부디, 잘 다룰 자신 없다만, 쓰지 않길 바란다.;; 일반적인 경우, 쓰지 않아도 성능 차이를 못 느끼는 경우가 많다.

IOCP library로 좋은 오픈소스를 찾았다. 다음을 참조. ^^
http://www.45mercystreet.com/computing/libiocp/index.html

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

listening thread in tinyNetworkLib

accept operation은 cost가 큰 operation이다.
그래서 accept만 따로 하는 listening thread를 만들곤 한다.
(Win32에서는 AcceptEx를 사용하여 더욱 더 성능 향상을 한다.)

더우기 accept에 이어서, 새로운 유저에 대한 메모리 생성 및 DB query(login관련)가 이루어지므로, 그 이후에는 더 비싼 operation들이 기다린다.
그래서,  다른 싼 operation과 합쳐서 thread pooling을 하면, 대기하는 operation들이 많아질 수 있게 된다.
그래서, listening thread를 만든다.
그러나, 그 차이가 크지 않다면, 안 만들어도 될 것 같다. 쓰레드 생성은 신중히 선택해야 할 문제이다.

"빨리 받아주고, 빨리 처리 하자"는 맞다.
하지만, "빨리 받지만, 빨리 처리 못하면?" 서비스는 악순환 일로로 가게 된다.
DDoS공격에 매우 취약한 서비스가 될 것이다.
따라서, 빨리 처리할 수 없으면 빨리 받지 않도록 설계에 고려가 되어야 한다.
처리 속도와 accept속도(?)를 측정하여 dynamic하게 조절되어야 할 것이다.
사실 그렇게까지 하는 경우는 별로 없다.

이왕 listening thread를 만들었다고 하면, 다음과 같이 하면 좋겠다.
accpeted user와 관련된 메모리들의 생성과 소멸을 모두 listening thread 한개에서 처리한다면? 다른 thread들에서는 소멸전까지 안전하게 쓸 수 있게 보장만 된다면? lock을 쓰지 않아도 thread safe하게 될 수 있다. ( 쓰더라도, 제한적일 것이고, contention이 적게 일어날 것이다. )또한, 특정 부분에서 multi thread를 위한 memory manager를 따로 만들지 않아도 될 것이다.
생성은 그렇다치고, 소멸까지 처리하려면, destroy stack(소멸처리용 데이터구조)과 같은 것을 통해서 listening thread에서 처리하는 것이 맞을 것 같다. 소멸을 위해서 destroy stack으로 post하고, listening thread에서 delete를 하게 되면, thread safe가 보장된다.

God bless me and you. ^^

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 3월 28일 월요일

using skip list, mulithreaded heap , event polling in tinyNetworkLib

tinyNetworkLib를 코딩중입니다.

몇가지 중요한 결정을 하였습니다.

skip list를 사용하여, dispatched packet에 대한 circular buffer의 index를 보관하고, socket으로부터 recv시 overwrite하지 않도록 보호하는데 쓰기로 했습니다.
(좀 어려운 말인데요;;)
recv시, circular buffer에서 안전한 영역, 즉, 아직 처리 되지 않은 packet이 있지 않은 영역을 확보하기 위해서, circular buffer의 next buffer pointer보다 크고, dispatched packet index중에서 가장 작은 수를 알아내기 위해서 skip list를 사용합니다. logN time이죠.

이의 용도에 맞게 최적화 된 Skip List 를 구현할 수도 있지만,
잘 구현된 것을 일단 사용하기로 했습니다. ( http://bit.ly/gGtzuO )

또한, multi thread 환경에서는, 여러개의 thread가 heap을 경쟁합니다. 하나의 thread에서 alloc한 것을 다른 thread에서 free해야 하는 상황이 자주 생깁니다. 그럴 경우, 어쩔 수 없이 lock을 써야 하는데, thread가 많아질 수록 scalability 가 떨어지는 문제가 생깁니다.
이 문제를 해결하기 위해서, 역시 직접 구현하는 것이 맞겠지만...;; Intel TBB의 scalable allocator를 사용하기로 결정하였습니다.

또한, epoll이나 kqueue의 경우, IOCP의 그 역할(? ^^)이 없습니다만,
network thread에서 poll을 해오고, 처리는 event마다 thread pool로 던지는 역할을 위해서, 역시 intel TBB의 task를 쓰기로 했습니다. ^^

God bless me and you. ^^

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 3월 23일 수요일

tinyNetworkLib

0. basic system API, templates
1. socket 과 관련된 cross-platform wrapper API ( listen, accept, send, recv, set_opt 등 )
2. thread,mutex,semaphore 와 관련된 것들( 또는 Intel TBB 사용)
3. socket event handler ( poll,epoll,kqueue,IOCP )
4. circular buffer for zero-copy
5. packet slicer
6. some example packet designs and parsers
7. some network threads
8. packet dispatcher
9. packet serializer/handler
10. packet serialize using google protobuf
11. some example encryper/decryptor
12. some memory managers
13. some send threads
14. some DB threads
15. some log threads
16. some system admin threads
17. some logic worker threads
18. user manager
19. service(daemon) controller/configurator
20. some actor-based logic worker threads
21. ipc using thrift
22. some interfaces to Erlang or Haskell module and script languages(lua,python,ruby)
23. client examples ( c, c++ , lua, objective-c(iphone,MacOSX) , java, java(android), python )
24. benchmark tests

이것들을 포함하는 최소화되어 간단한 network library를 만들고, 이름을 tinyNetworkLib로 짓기로 했다.
목표는 가장 일반화된 서버 머쉰 사양에서 가장 최적화되어 잘 돌아가는 것이다.
업무 외 시간에 함께 하실 분은 연락주세요. ^^
온라인 서비스 개발에 사용하실 분도 연락주세요. ^^

2011년 3월 21일 월요일

zero-copy between network recv threads, dispatcher threads, logic threads

IOCP의 경우에는 여러개의 thread가 경쟁적으로 queue에서 io을 순서대로 가져와서 처리하는 것이 lock없이 처리 가능하다.(kernel level에서 serialized된 대로 user level로 post 되기 때문이다.)
하지만, epoll,kqueue의 경우에는 그러한 역할이 내부적으로 존재하지 않는다.
io event 발생을 polling하고, event들을 iteration하는 loop에서 처리한다.
좀 더 성능 향상을 위해서 iteration을 쪼개서 pararell하게 가능하긴 할 것이다.

어쨌든, 위의 일들은 몇개의 network io thread에서 일어나는 일들이다.
network io thread context에서, recv(socket,buffer,MAX_SIZE)를 통해 buffer에 copy된 것을 packet으로 쪼개고, dispatcher를 통해서 해당 logic thread에 전달하고, 처리되는 과정에서, 그 buffer를 한 번도 copy하지 않으려면 어떻게 해야 하는가?
이 문제가 zero-copy문제이다.

dispatch된 packet이 parse되어, logic function의 input parameter로 변환된 후에는 비로소, 생명을 다해도 된다.
그때까지는 recv를 통해 얻어진 packet에 overwrite되지 않고 보호 되어야 한다. 이 메커니즘을 어떻게 구현할까?
다시 말하면, packet이 circular buffer에서 잘라지고(slice), 전달되고(dispatch), 처리되는(handle) 동안에 어떻게 보호할 수 있을까? 그 동안 circular buffer에는 socket으로부터 새롭게 받아진 stream이 쯔나미처럼 무서운 속도로 다가올 것이다.

slice,dispatch 전까지는 일단 circular buffer를 통해서 zero-copy 구현이 가능하다.

보호하려면, socket에서 buffer로 copy하기 전에 copy해도 되는지 여부를 확인이 가능해야 한다. copy해도 되는지 여부는, slice->dispatch->handle의 과정을 거치고 있는 packet의 memory를 overwrite하는지 여부를 알아내야 하는 것이다.
dispatch까지는, 순서대로 처리가 될 것이기 때문에, 마지막 packet의 index를 검사함으로써 간단히 해결된다.
문제는, dispatch된 후에는 여러개의 thread들이 경쟁적으로 처리할 것이고, 어떤 것이 먼저 처리 될지 알 수 없기 때문에, 마지막이라는 것을 알 수가 없다.

이에 맞는 데이터 구조를 만들어야 한다.
dispatch된 packet의 index를 sorted list로 갖고 있고, dispatch될 때, insert 해주고,
handled되고 나면, list에서 index를 remove한다. 그리고, recv 시 overwrite check여부는 recv index보다 큰 최소값을 체크하면 되므로 가능하다.

이 오퍼레이션들은 network thread,dispatch thread,logic thread가 건들기 때문에, atomic하도록 구현해야 한다.
 lock없이 구현하는 방법은 dispatch에서 logic thread로 전달시 zero-copy를 포기하고 packet을 copy하는 방법일 것이다. 두가지 경우에 대해서 성능 테스트를 해보지 않고서는 섣불리 판단하기 힘들 것 같다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 3월 18일 금요일

permit overflow in receiving buffer of socket stream

보통 socket connection당 공평하게 동등한
recv buffer size(socet에서 memory로 읽어들이는 버퍼)를 유지한다.
socket buffer size도 마찬가지이다.

socket buffer는 full이 나거나 ready가 안될때 would block이 발생하는데,
would block이 발생하는 경우는 send측에서 알아서 처리하게 된다.
(기다렸다가 재시도 한다.)
그러므로, socket buffer에 대해서는 size와 option(nagle 과 같은) 대해서만 신경쓰면 될 것 같다.

recv의 경우는 socket buffer에 읽을꺼리가 있는데, 프로그래머가 정한 recv buffer가 full이 될 경우에 어떻게 처리할까?
buffer를 늘려서 읽어 놓거나, 읽는 것을 나중에 하는 일이다.
선택에 달린 문제일 것이다.

1) buffer를 늘리고 읽는 정책으로 한다면,
특정 connection에만 읽게 해주게 되서, 사소한 특혜같은 것이 생긴다.
logic에서 제때 처리를 못해주면, 다시 또 buffer overflow가 생길 수 있다.
메모리를 재할당해야하는 부담감도 생길 수 있다.
잦은 재할당은 메모리 fragmentation으로 이어져 성능에 결국 악영향을 줄 것이다.
재할당을 해야 하면 사용하던 pointer도 invalidate되어서, zero copy가 힘들어진다.
또한, 멀티쓰레드 환경에서는 lock을 해야 할 것들이 한두개라도 더 많아진다.
다만, IO에서는 delay가 생기지 않는다.

2) buffer size를 절대적으로 고정한다면,
recv event에도 무시하고, recv buffer가 비워지고 읽을 수 있을때까지 기다려야 한다.

메모리 재할당은 없다.  따라서, zero copy가 가능해진다.
읽지 않더라도 socket buffer 에 쌓이게 되므로, 잃어버릴 염려는 없다.
다만, recv buffer가 비워질때까지의 시간만큼 io에서 delay가 생기는 것이다.
최소한 recv event round(event round time)까지 기다려야 하고, 그때도 비워지지 않는다면, 다시 기다려야 할 것이다.
그러나, 리얼타임서버의 임무는 요청을 일정시간 내에 응답해야하고, 더우기 모든 유저들에게 동등하게 처리해줄 의무가 있는 서버라면, logic round time도 존재한다.
logic round time이란, 요청된 request를 모두 소화하는 시간으로 정의할 수 있을 것이다.

클라이언트 입장에서 허용되는 maximum latency(client permit latency?)를 50ms라고 한다면,
network latency(C->S + S->C) + logic round time + event round time < 50ms 이어야 할 것이다.

* 나는 buffer size 를 고정하기로 했다. ( file transfer용 서버가 아니라면 말이다. )

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 3월 17일 목요일

count of send threads in MMOG

MMOG에서는 하나의 플레이어가 한 행동을 그 플레이어를 관심 영역에 둔 플레이들에게
보여줘야한다.

즉, 1:N으로 비례해서 늘어난다.
recv되는 양에 비해서 N배로 send해야 된다는 뜻이다.
단순히 생각하면 recv thread갯수가 r개라면,
send thread갯수는 N*r개로 늘어나야 원활히 돌아가게 될 것이다.

적절한 N은 몇일까?
그것을 변화시킬 factor들은 무엇들일까?

만약, recv량이 send를 digestion(소화)하기 전에 쌓인다면,
send해야 할 량은 계속 쌓이게 될 것이고, 적체되어 latency는 점점 늘어나게 될 것이다.
적체되지 않고 적절한 latency를 유지하는 것. 그것이 디자인 목표가 되어야 한다.

그에 맞게 갯수를 조절해주면 된다.

한 플레이어의 평균 관심(Area of Interest) 플레이어수는 몇일까?
수백 수천명이 함께 전투하는 공성전과 같은 상황에서는 그 평균은 엄청나게 많아진다.
그렇다고 무작정 thread 갯수를 늘리면, context switch가 많아져서 오히려 resource contention시간과 context switch time 자체의 허비만 하게 될 것이다.


또한 다른 쓰레드의 수를 생각하지 않을 수 없다.
멀티쓰레드를 통해서 어플리케이션이 빨라지는 이유는 IO가 blocking되는
시간 동안 CPU를 놀리지 않고 쓰기 때문이다.
IO blocking이 일어날 수 있는 thread는 모두 multi threading의 대상이 될 수 있다.
그렇다고 CPU가 무한하지 않다.
쓰레드만 늘린다고 모두 원활하게 돌아가지 않는다는 뜻이다.

전체적으로 봤을때,
recv thread가 r개, send thread s개, logic thread가 l개, 기타 async call을 하는 thread가 t개 라면,
(r+s*s'+l+t)*CPU 갯수 정도가 아닐까? ( s'는 평균 group broad casting 량)

이 갯수는 실전에서 테스트 해보지 않으면 알 수 없고,
어플리케이션에 따라서 매우 다를 수 있다.
단순한 채팅 서버에서는 특히 다를 것이기 때문이다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

Return Error Code or Throw Exception

예외처리는 빠짐없이 하는 것이 안정적인 프로그래밍을 위해서 가장!! 중요하다.
그 다음에는  예외처리의 강도를 잘 구분하는 것 또한 중요하다.

보통의 함수처리에서의 에러처리는 return code로 하던가, exception을 throw하게 된다.
return code로 error처리를 할 경우에는
caller에게 successful scenario대로 이뤄지지 않았음을 알려주고, error code를 리턴한다.
( error_code를 리턴하는 것은 exception catch보다 코딩이 편리하기 때문에 애용된다.)
그렇지 않고 return value가 필요한 경우가 많기 때문에,
error code를 받아야 할 경우에는, Exception으로 처리하기도 한다.
이에 대한 일관성이 필요하다.

또는, exception은 caller에게 '너 미쳤니?' 또는 '나 미쳤어!'라는 메시지를 알려주기 위해서 쓰인다. ( 미쳤다는 뜻은, assumption(가정)에 어긋나는 것에 대해서 메시지를 전달하는 비유적 표현이다. )
즉, caller는 callee와는 약속에 의해서 진행되는데,
약속에 없는 값을 주게되면, '너 미쳤니?'라고 말할 수 있다.
또는 caller의 책임이 없지만, callee가 해당 약속을 못 지키게 되면 '나 미쳤어!'라고 전달하는 것이다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 3월 16일 수요일

a pitfall using Mutex

multi-threaded application에서 mutex(lock)을 많이 쓴다.

프로그래머들이 흔히 저지르는 실수가 있다.
바로, lock이 풀리는 순서는 정해져있지 않다는 것이다.

예를 들면, A,B,C의 Thread에서 순서대로(시간 순) 공유 리소스에 lock을 걸었고, 모두 wait상태였다고 치자.
lock이 풀리는 순간, A,B,C의 순서로 권한을 주는 것이 아니다. 예측할 수 없는 순서대로 기회가 주어진다. 즉, Thread Scheduling 알고리즘에 따라서 바뀐다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 3월 14일 월요일

Memory Allocator for Multithreaded Applications

tcMalloc : google에서 만듬. 작은 사이즈의 allocation에 최적화 된 것으로 보임.linux에서만 테스트.
Intel TBB scalable_allocator : Intel TBB에 포함. new/malloc도 대체함.
 scalable_allocator를 통해서 thread specific heap을 제공함.
libHoard : Emery Berge 박사가 만듬. 꽤 오래된 라이브러리. thread증가에 따라서 선형적으로 speed up이 나타나는 그래프가 인상적. GPL license.
nedMalloc : 오픈소스. 간단함. 다른 것들보다 다 빠르다고 주장함. Windows에 최적화.dlmalloc이 근간.bitwise tries 인상적.
MTS : memory tuning system ( evaluation을 신청해야 구할 수 있음. ) whitepaper내용이 부실한 것으로 봐서 신뢰가 잘 안 감.
jemalloc : linux,macosx에 최적화.firefox에서 쓰임.



어떤 것을 선택하느냐는, 어플리케이션에 따라 달라져야 한다고 본다.
그런데, 기본적으로 선택해야 할 기준은 있다. 바로 안정성이다.
* 안정성 : 속도가 빠르다고 해서 안정성을 해쳐서는 안된다. 더구나 근간이 되는 메모리 할당에 관해서는 절대적으로 필요한 요소이다.

시간이 되면, 테스트 프로그램을 만들어, 결과를 올려봐야겠다.
현재로서는 nedMalloc과 Intel TBB을 함께 쓰면 어떨까한다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 3월 13일 일요일

circular queue buffer

나는 client socket으로부터 recv를 한 후에, packet parsing을 위해 저장을 해 둘 buffer로 circular queue 형식의 buffer를 사용한다.
그것은 고정 사이즈이다.
그 이유는 다음과 같다.

예를 들어, user(connection)당 100KB의 buffer를 정해 놓았다면, 최대 6만명(60k)이 동시에 접속한다면, 6000MB=6GB의 메모리를 사용하게 된다.
그런데, user당 할당되는 100KB의 사이즈는 서비스의 성격에 따라 달라져야 한다.
왜냐하면, 100KB의 의미는, pending packet들의 크기의 합의 최대치이다.
파일 전송과 같은 전송을 위해서는, 100KB는 모자랄 것이다. 요즘 인터넷 속도는 평균적으로 10~100Mbps(bits per sec)정도로 봐야 하기 때문이다.
속도가 1~10MBPS(bytes per sec)에서 100KB의 버퍼로 원활히 서비스 하려면,
100KB의 버퍼의 처리 속도로는 초당 100~1000번 버퍼를 비울 수 있어야 한다.

즉, 버퍼를 비우는 속도가 인터넷으로 들어오는 upload 속도보다 느리다면, buffer는 full이 날 것이다. 이런 경우는 서비스를 유지할 수 없다.

매우 빠른 액션 게임과 같은 경우에는 버퍼를 빠르게 비울 수 있어야 할 것이다.
그보다 느린 MMORPG의 경우는 그 보단 버퍼의 크기가 크지만, 버퍼를 비우는 속도는 그 보단 느려도 될 것이다.
이러한 인터넷속도,버퍼크기,버퍼 비우는 속도(througput)를 고려하여 버퍼의 크기를 정하여야 하고, 적당한 circular buffer size를 정하여야 할 것이다.
또한, socket내의 buffer size option과 nagle option등도 정하여야 할 것이다.

만약 계산적으로 적절한 socket buffer size,option, 그리고 buffer size까지 정하였다면, 비정상적인 최대치도 계산이 될 것이다. 그에 맞게 circular queue buffer size를 정하고, 비정상인 경우는, abrnomal state로 생각하여, 오류 처리를 해주면 된다. 즉, buffer size를 동적으로 늘리면 안된다는 뜻이다. 만약, DDoS공격이라도 온다면, 비정상 커넥션은 빨리 끊어주는 것이 필요한 것이다.

반면에, 웹서버는 close될때까지 한번의 리퀘스트만 하는 것이므로, 버퍼는 필요없고, 모두 저장해 놓으면 된다. 그리고 핸들러에게 넘겨주면 되는 간단한 작업이다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

Mutex

Critical Section , Shared Resource의 동기화를 위한 것이다.
Mutex는 프로그래머들이 잘 이해하고 있는 것 같다.
하지만, 사용 방법에 대해서 좀 더 넓은 시각이 필요하다.

이젠, 바야흐로 멀티 프로세서시대이다.
2개가 아니라. 4개. 4개가 아니라 8개이상이 쓰인다.
젓가락이 두개가 아니라, 8개 이상 쓰일 경우가 많아진다는 뜻이다.
그런데, 제공되는 음식은 1개씩 먹으라고 한다면, 젓가락을 들고 있는 시간이
많아질 수 밖에 없다.

이제, 동시에 제공되는 음식 접시 수를 늘려야한다!

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 3월 11일 금요일

on Hot Code Upgrade in Erlang



1) 재컴파일 %erl -make

2) 업그레이드 >stdlib:upgrade(XXX).

용도는 다음과 같다.

1) 잘못된 패치 수정

서비스중에 업그레이드하는 것은 물론 위험하다.
하지만, 잘못된 패치를 고치기 위해, 전체를 셧다운 시키고, 업그레이드하는 것은 정말 원하는 것이다. 하루에 매출에 24억이라면, 2시간 셧다운은 2억. 심정적인 매출 피해는 그보다 더 할 것이다. 특히, 이벤트로 프로모션중에 전체를 셧다운 시키다면, 프로그래머들은 신뢰를 잃기 쉽다. 신뢰를 잃지 않더라도, 좋은 신뢰를 주긴 어렵지 않겠는가? 책임자 입장에서 할 말이 없고, 핑계만 댈 뿐이다. 
24시간 서비스를 해야하는 커뮤니케이션 시스템을 위해서라면, 특히 필요한 기능이라고 본다.

2) 클라이언트 디펜던시가 없는 서버 업데이트를 런타임에

클라이언트 수정이 필요하다면, 클라이언트까지 업그레이드까지 필요하기 때문에, 추가적인 업그레이드 시스템이 필요할 것이다. 그 문제는 따로 다뤄야 할 것이다.


클라이언트 수정이 필요없는 업데이트라면, 새로운 서비스를 런타임에 추가할 것이다.
물론 위험한 일이다. 왜냐하면, 업그레이드간의 디펜던시가 복잡할 경우에는 기존 서비스가 작동하지 않을 것이기 때문이다.

LPMUD와 같은 시스템은 이런 식으로 업그레이드를 했었던 사례가 있다. LPMUD와 같은 시스템에서는 개발자가 모든 것을 결정했었다. 자신이 결정하고, 자신이 프로그램했다. 그러기에 가능했다.또한, 클라인트는 단순한 tty터미널이었다. LPMUD를 운영해본 사람이라면, 그 매력을 잊을 수 없으리라. 그래서, 이 시스템을 현재의 3D MMOG에도 적용하고 싶을 것이다.

하지만, 요즘과 같이 복잡한 시스템을 런타임에 수정한다는 것은 미친짓 일 것이다. 따라서, 서비스 중에 업그레이드는 하는 것은 꼼꼼히 따져보고 봐야 할 일이고, 생각해 볼 문제이다. 아직 그런 체계를 어떻게 해야 할지는 아직 모르겠다. 프로젝트를 진행해보면서 풀어야 할 문제로 보인다.

다만,최소한 개발팀내에서 개발중의 업데이트는 가능할 것 같다. 크게 메리트는 아닐지 몰라도...

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 3월 9일 수요일

개발환경 구축과 이미지 출력

corona sdk로 SmartPhone App을 만들기로 결정했다.



아무리 앱 개발이 시시해보이지만, 차근차근 해보자.



개발환경부터 해보자.

http://www.anscamobile.com/corona/

여기서 corona SDK를 다운로드 하고 설치한다.

그리고, 프로젝트 관리툴인 CPM을 설치한다. 유료이다. 선택이긴 하지만, 본인은 쓰기로 했다.

http://coronaprojectmanager.com/



일단, 이미지 출력부터 해보자. 다음 동영상을 보면 이해가 쉽게 될 것이다. 한글 자막도 제공된다.









1) 프로젝트를 수행할 폴더(e.g. /home/users/workspace_corona/project1) 를 선택한다.

2) CPM(Corona Project Manager)에서 New Project를 선택한다.

3) 프로젝트 옵션들을 선택한다. 나중에 에디트가 가능하므로, 대충해도 된다.

4) image file을 project1폴더 밑에 images 폴더를 만들어 copy한다.

5) CPM에서 New Asset을 하여 4번의 image를 선택한다.

6) main.lua에서 다음과 같이 입력한다.(images/apple.jpg가 아니다.)

     local apple=display.newImage("apple.jpg");

   다음과 같이 출력된다. 

2011년 3월 7일 월요일

on History of Erlang

http://www.erlang.org/course/history.html

Erlang에 대해서, 확신을 못 갖은 사람들에게 다음을 소개합니다.

1982-1985
The language must be a very high level symbolic language in order to achive productivity gains.
생산성을 높이려면, 매우 높은 수준의 심볼릭 언어가 되어야 한다.
-> Lisp,Prolog,Parlog만 남음.

1985-1986
The language must contain primitives for concurrency and error recovery, and the execution model must not have back-tracking.
언어자체에서 concurrency,error recovery가 있어야 하고, back-tracking이 없는 실행모델이 필요하다.
-> Lisp,Prolog가 제외.

It must also have a granularity of concurrency such that one asyncronous telephony process is represented by one process in the language.
-> 하나의 언어로 구현된 하나의 프로세스에서 async 프로세스도 구현되는 수준의 concurrency가 필요하다.
-> Parlog도 제외.

그래서 Erlang을 만들기로 결정했다고 합니다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 3월 3일 목요일

Implementing SSO using Scalaris in Erlang?



SSO(Single Sign On) Service는 다음과 같은 역할을 가진 서비스이다.
1. 인증 - 한번 로그인(인증)을 함으로써, 해당 서비스사의 다른 서비스를 위해 다시 인증을 하지 않아도 되게 한다. Kerberos 구조로 구현한다. 보안이 잘 되어야 한다.
2. 이중 접속 방지 - 어떤 서비스는 동시에 단 한 사람만이 이용할 수 있도록 해야 한다. 온라인 게임들이 주로 그렇다. 이중 접속을 체크하려면, 현재 사용 하는 사람들의 ID와 접속 상황을 실시간으로 업데이트하고 있어야 한다.
3. 1번에 붙여서, 서비스 사용에 대한 권한조회까지 할 수 있어야 한다.

이것을 구현하기 위해서, 예전에는 동시접속자 20만 정도의 수준 이하에서는 C++로 구현한 단일 서버에 사용하였다. 그런데, 결국 200만명 이상이 되자, 단일 서버로 구현하기 힘들게 되고, 인증구조와 이중 접속 방지를 위해 다시 구조를 만들어야 했다.

따라서, 새로 만드는 SSO는 scalable, distributed 특징이 가장 필요하다.

Erlang으로 구현한 Scalaris가 이 용도에 딱 적합하다.
처리 용량과 속도는 구현후에 공유하도록 해야겠다.

Scalaris is a scalable, transactional, distributed key-value store. It can be used for building scalable Web 2.0 services.



2011년 3월 1일 화요일

JVM and jMonkey

Python -> Jython
Ruby -> jRuby
Haskell -> lambdavm
Erlang -> Erjang

모두 JVM Implementation이 나와 있다.
jRuby가 그 중 가장 안정적인 것으로 알고 있다.

JVM기반인 언어들...
clojure
scala

즉,java가 싫은 사람들도 여러가지 선택이 있다.

오픈소스 자바3D엔진인 jMonkeyEngine을 사용하면, 그 중 익숙한 언어로 구현할 수 있다.
jMonkeyEngine은 Sun에서 Java3D를 포기하고 지원할 정도라고 한다.

아직 시험은 못 해봤지만, jRuby로 테스트해 본 사람은 있다.
http://localbiz404.blogspot.com/2008/08/jruby-jmonkeyengine-hello-3d-world.html

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

Boolean Algebra and Comparison Operators

erl>true and false.

hs>True && False

erl>false or true

hs>False || True

erl>not false.

hs>not False



erl> 5 =:= 5.

hs> 5 == 5

erl> 1 =:= 0.

hs> 1 == 0

erl> 1 =/= 0.

hs> 1 /= 0



erl> 5.0 =:= 5.

hs> 5.0 == 5



erl> 1<2.

hs> 1<2

erl> 1>=1.

hs> 1>=1

erl> 1=<1.

hs> 1<=1



erl> 5=:=true.

false

hs> 5 == True





<interactive>:1:0:

    No instance for (Num Bool)

      arising from the literal `5' at <interactive>:1:0

    Possible fix: add an instance declaration for (Num Bool)

    In the first argument of `(==)', namely `5'

    In the expression: 5 == True

    In the definition of `it': it = 5 == True





erl> 0==false.

false

Invariable Variables

http://learnyousomeerlang.com/starting-out-for-real#invariable-variables





erl> One=1.

hs> let one=1



haskell에서는 대문자로 시작하면 안된다.

(In Haskell, variables cannot start in capital letters.)

erlang에서는 대문자로 시작해야 한다.

(In Erlang, variables needs to start in capital letters.)

erl>One=2.



** exception error: no match of right hand side value 2



hs>let one=2



erlang에서는 invariable variable이 되지만,

(Erlang permits only invariable variables.)

haskell에서는 let으로 하면 허용된다.

(Haskell permits variables by let.)

haskell에서는 invariable variable을 지원하지 않는다.

(Haskell doesn't support invariable variables.)



erl> Two=One+One.

hs> let two=one+one







erl> Two=Two+1.
erl>** exception error: no match of right hand side value 3
erl> two=2.

** exception error: no match of right hand side value 2



erl> 47=45+2.
47
erl> 48=45+2.
** exception error: no match of right hand side value 48






Numbers

erl> 2+5.

hs> 2+5



erl> 49*100.

hs> 49*100



erl>1892-1472.

hs> 1892-1472



erl> 5/2.

hs> 5/2



erl> 5 div 2.



erl> 2#101011.

erl> 8#6077.

erl>16#AE.

2011년 2월 27일 일요일

easing animation in Corona SDK

easing library를 통해서 함수형 언어의 특징을 잘 흉내내었다.

http://developer.anscamobile.com/content/animation


Manual animation Using transition
local rect = display.newRect(
  0, 0, 100, 100 )
rect:setFillColor(255,255,255)
 
local tMax =1000+system.getTimer()
local function fadeOut(event)
  local t = event.time
  local rect = event.target
  if t < tMax then
    rect.alpha = 1 - t/tMax
  else
    rect.alpha = 0
    -- done, so remove listener
    Runtime:removeEventListener(
         "enterFrame", fadeOut )
  end
end
 
-- Add listener to begin animation
Runtime:addEventListener(
   "enterFrame", fadeOut )
local rect = display.newRect(
  0, 0, 100, 100 )
rect:setFillColor(255,255,255)
 
transition.to(
  rect, {time=1000, alpha=0})


현재의 상태과 이전될 상태간의 interpolation을 easy library가 알아서 해주는 것이다. interrupt가 낄 수 있을 경우에는 cancel을 할 수 있다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

Responsibility #2 : Estimation of Schedules

CTO가 할일 이전에 TD가 할일을 더 이야기 하고자 한다.



TD가 할 일중에 하나는, 기획의 요구사항을 듣고,그것을 'make it done'하기 위해서,

계획을 잡는 일일 것이다.



우선순위는 기획의 요구사항을 따르되,

개발의 우선순위는 다를 수 있다.

왜냐하면, 업무를 분해(decomposition)하다보면, dependent task들을 미리 해 놓아야 하기 때문이다.

그런 일들에는 library 구축, tool 구축, framework 구축등이 포함될 수 있다.

아무리 TDD에 Agile한 환경이 효율적이라고 하지만, 먼저 해야 할일은 먼저 해야 할 일인 것이다.

이렇게 일을 늘여놓다보면, 목표 시간에 일정을 소화할 수 없게 된다.

여기서, 그러한 dependent task를 살펴보면, 그 TD의 성향을 파악할 수 있다.

1) 고집스럽게 선수 과제를 먼저 하는 사람

2) 선수 과제를 무시하고, 스케쥴을 밀어부치는 사람

3) 기획을 수정하여 일을 줄이는 사람

4) 기획의 의도를 파악하고 일을 줄이는 사람 

5) 필수 선수 과제를 최소화하여, 스케쥴을 다시 잡는 사람



6) 선수 과제를 부분적으로 외부에 의존하거나, 도입하는 사람

7) 100중에 70~80 정도를 소화하는 프레임워크 전체를 도입하는 사람





어떤 TD가 가장 유능한 사람일까?



1번의 경우, 매우 위험하다. 미션이 실패하면, 책임을 피할 수 없다. 하지만 성공할 경우에, 이후 달콤한 개발 속도가 약속될 수 있다. 그러나, 개발팀이 할 수 있는 능력이 될 경우에 할 수 있는 방법이라고 생각한다. 그렇지 않으면, 개발팀은 잦은 야근으로 조기에 지쳐버릴 수 있다. 오만과 교만의 댓가를 받게 될 수 있다.

2번의 경우, 어떻게든 되겠지 하는 경우이다.

하나님이 편들어지시지 않는한 매우 피곤한 여정이 기다리고 있을 것이다. 결과물이 잘 나오긴 하지만, 역시 개발팀의 수많은 삽질의 결과였을 가능성이 매우 높다. 이렇게 할 것이라면, TD가 왜 필요할까?

3번의 경우, 기획에 리스크를 떠 넘기는 경우이다.

기획자는 선택의 폭이 좁아진다. "해보고 안되면 내리지." 하는 방법을 쓸 수 없다. 유능한 기획자가 없는 한 매우 위험한 방법이다.

4번의 경우, 기획자와 긴밀한 유대관계가 필수이다.

게다가 기획 내용에 대한 파악 능력이 필요하다. 기획 의도를 지키면서, 개발 시간을 단축할 수만 있다면, 얼마나 좋겠는가? 하지만, 기획자는 다시 기획을 해야 할 것이다. 또한, 자칫 밋밋한 개발이 되어 소비자에게 어필할 수 없게 될 수 있다.

5,6,7번의 경우 어떻게 하느냐에 따라서 다르겠지만,

그 방향은 현재의 개발팀의 역량과 자신의 역량에 비추어 잘 선택하여야 할 것이다.

나는 5,6,7번을 모두 선택하는 편이다. 7번을 선택할 수 있는 상황은 게임개발에서는 많지 않다. 그리고 있다해도 50~60% 정도 커버하는 수준일 것이다. 그래도, 웹 개발에서는 많은 편이다. 다른 프레임워크를 선택하게 되면, 교육 기간과 적응기간이 꼭 필요할 것이다.



5,6,7번을 할 경우, 리스케쥴링은 다음과 같은 방법으로 해야 할 것이다.

처음에는 Goal Driven으로 Top-Down식으로 일을 분해하면서 일정을 만들었을 것이다.

이제는 Objective Due Day 를 기준으로 Task의 일정을 봐야 한다.

그렇게 되면, 첫 일정이 아마도 과거로 되어 있을 것이다.;;;;

과거에 했어야 할 일들을 어떻게 테스트가 된 상태로 프로젝트에 도입할까?

부분 부분 오픈소소를 이용하고, 과거에 했던 일들에서 가져오고, 어떤 것들을 나중에 하기로 하고 포기하고....

그래도 안되면 그때서야 기획자와 협의를 해야 할 것이다.

그래도 안되면, 야근을 할 수 밖에 없을 것이다. 외주를 줘서라도 일정을 소화시켜야 할 것이다.

이러한 상황이 팀내외에서 공유되는 것이 바람직하다. 리스크에 대해서 모두 알고 있는 편이 문제 해결에 도움이 된다.

2011년 2월 26일 토요일

Corona as 2D mobile engine

cocos2D로 개발을 하려다가 보니, class들이 낯익지 않고, tutorial도 쉽지 않았다.(난 마음이 급한데!)
게다가, multi-platform 으로 deployment를 하려면, cocos2Dx로 개발해야 하는 등, 까다로왔다.
이럴바엔, 간단한 2D엔진을 만들어서, script로 로직(haskell로 할까? 응?)을 만들고, VM만 달리도는 엔진이 있으면 좋겠다 생각했다.
그런데, 검색해보니, corona가 내 생각과 맞아 떨어졌다.




http://www.anscamobile.com/corona/

http://www.burtonsmediagroup.com/blog/2010/06/game-engines-for-iphone-ipad-android-cocos2d-corona-torque-unity-3d/

그리고, 이 링크의 의견에 완전히 공감했다.


1) Easy Deployment/Development : cross-platform에서 가장 중요한 것은 이식성이라고 생각한다. lua로 코딩을 한 후, 다른 플랫폼으로 바로 거의 수정없이 이식이 가능하므로, 가장 편한 엔진으로 생각된다.tutorial도 친절하고, 예제도 풍부하다.
2) API : 지원하는 API들도 다양하다!
3) 툴: texture packer,sprite editor(spritedeck)등 3rd party 툴도 다양하게 지원되고,
4) 안정성:16만개 이상 팔린 게임에서도 쓰였다.

다만, 유료라는 것.(Free Trial이 있다.)
소스를 제공하지 않는 듯 보이니, 만들 게임내에서 지원하는 API 로 가능할지 잘 봐야 함. 다행히, 안정성은 확보된 것으로 보인다. (소스 판매는 contact 를 통해서 가능하다.)
소스가 제공되는 엔진을 고른다면, cocos2D(x)정도인데, corona에 비해서 기능이 미약하고, 구조가 특이한 편이라서 추천하지 않는다. 앞으로 경쟁할 듯 보인다. cocos2d가 경쟁해서 이기려면,built-in 기능뿐 아니라, lua지원과, tool 지원이 필요해 보인다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 2월 21일 월요일

OCaml,SML

OCaml이 다른 함수형 언어에 비해서 빠른 것으로 알려져 있다.
Language Shootout 결과들을 보면...
하지만, OCaml은 functional way로 코드하는 것이 강제가 아니기 때문에 그렇다.
functional way로 코드하면 결과가 많이 다르게 나온다고 한다.
(직접 확인은 못했지만...;;)

SML은 비록 아직 멀티코어로 구현이 안된 상태이지만, 함수형 언어중에서 가장 빠른 성능을 자랑한다고 한다.(역시 직접 확인을 못했다.;;;)
그리고, SML은 Parallel과 Concurrency에 대해서 아직 진행형인 상태이다.


결론적으로, 함수형 언어를 선택한다면, Haskell과 Erlang 중에 선택하는 수 밖에 없다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

Photon Socket Server

http://photon.exitgames.com/Photon

iphone뿐만 아니라 다양한 클라이언트에서 돌릴 수 있도록 network library를 제공한다.
특히, unity3d에서도 된다.
게다가, cloud 환경까지 제공하여, deploy를 쉽게 하였다. 이것이 수익모델인 듯!
일본회사들에서 많이 쓰고 있다.

이 정도의 솔루션으로 돈 벌 수 있는게 놀랍다.
한달 정도 시간만 들이면 만들 수 있을텐데... ㅎㅎ

Yesod Web Framework in Haskell

http://docs.yesodweb.com/

Rails와 같은 식으로 프로그래밍하는 것이 요즘 대세이다.
그래서 그런지, 프레임웍들도 Rails식으로 따라 하고 있다.

Haskell문법 역시 간결하다!  semi-colon(;) 없는 코드를 보니 마음이 시원할 정도;;;


소개 비디오를 보면 정말 놀랍다.


Yesod Screencast: Yammer from Michael Snoyman on Vimeo.

core팀 3명으로 짧은 기간에 해낸 것도 놀랍다.

하루 빨리, Haskell이 hot-code swap이랑, process간 통신, distributed 환경을 위한 feature들이 추가되면 좋겠다.
당장은, Haskell도 단일한 독립 사이트 만들기에는 부족함이 없어보인다.
Ruby on Rails보다 성능은 물론이고, 생산성에서 앞지르는 것은 시간 문제로 보인다.

Erlang은 대규모 서비스용이다보니,
Agile Development에 맞는 framework가 나오지 않는 것이 안타깝다.
(내가 할까? ㅎ)
그것만 맞춰준다면, 인기를 얻었을때, 다시 아키텍쳐를 잡지 않아도 될텐데 말이다.
mochi-web등이 잘 해주길 응원한다.


도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

3D objects

I think game programming needs to deal with only game objects.



In order to do that, the preparing step is needed.

Prior to code, there should be prepared game objects composed of 3D meshes,3D animations,3D geometry,material settings,and blabla... There are many things to do.



Conceptually, what are the essential components of game objects?

The components should be Mutually Exclusive and Collectively Exhaustive.



This discriminations should take some time.

If you have 10 years, what shall you do?

쓸만한 프로젝트들은 적어도 10년이상 성숙과정을 거쳐서
대중들에게 인정/인기를 얻는 것 같다.

이 기간을 짧게 만드는 방법을 연구해야한다.
시간은 짧고 예술은 길다.
많은 예술 작품을 만들고 싶으니까...

새로 시작한 프로젝트가
3년내에 대중에게 인정받고,
오픈소스 또는 커머셜로 될 수 있는 방법을 연구해보자.

2011년 2월 20일 일요일

rotation in jMonkey

http://jmonkeyengine.org/wiki/doku.php/rotate

어떤 그래픽스책보다 아주 쉽게 설명되어 있다.

Rotation around Axis? Use this Axis Vector! Examples for this kind of rotation
X axis (1,0,0) A plane pitches. Nodding your head.
Y axis (0,1,0) A plane yaws. A vehicle turns. Shaking your head.
Z axis (0,0,1) A plane rolls or banks. Cocking your head.




Nodding,Shaking,Cocking ^^
“pitch”, “yaw”, and “roll”

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

Erlang use of the Year 2010

http://www.javalimit.com/

자바 숙련자인데, Erlang을 배우기 시작했다고 한다.
배우면서 Erjang(Erlang on JVM)을 만들었다.

2010년도 Erlang User로 뽑히신 분.
대단하신 분!


http://www.slideshare.net/drkrab/erjang-a-journey-into-erlangland


도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

OpenCL binding for Erlang and Haskell

cuda와 Erlang binding은 아직 나오지 않은 듯 하다.

대신 OpenCL과 Erlang binding은 나와있다.
https://github.com/tonyrog/cl


다음은 OpenCL Haskell binding이다.

http://hackage.haskell.org/package/OpenCLRaw



OpenCL에 대한 tutorial도 몇개 있다.
http://www.multicoreinfo.com/2009/08/parprog-part-9/

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

DSLs required for every type of workers - Part 1

I think haskell or erlang is one of the best programming languages for productivity and concurrency, and blabla.

However, in the real game developerment, there are various worker types such as art deirector, 3d modeller, 3D animator, 2D graphic designer, game director, game designer , game logic scripter, game logic script programmer, GUI programmer, animation programmer, special effect programmer, GPU programmer , DBA, system engineer and so on.



I want to focus on some parts.

 

First, lua-like language for game logic scripter.



Lua gained popularity for it simple syntax.

However, it is not easy for game designer or game logic scripter without preliminary programming knowledge or skills.

I want to add or focus on some design goals.



1. easier than Lua, as easy as HTML

2. edit and run in run-time.

3. syntax check or some tests in editing.

4. need not to be sick in object synchronization with peers or servers.



Second, jQuery(javascript)-like language for GUI programmer



GUI is important part in UX(user experience).

However, in many cases,GUI programming are in charge for novice programmers.

So, GUI programming needs to be more productive for novice programmers, or needs to be changed to charge GUI designer without programming skills.



1. GUI WYSWYG editor(probably visual programming?) in run-time2. rich built-in examples

3. extensible for advanced GUIs.



4. easier than javascript



5. edit and run in run-time



Third, declarative language NPC(non-playable-character) AI programmer



AI programming is also an important part.



1. Goal Oriented Design

2. as easy as HTML

3. rich built-in examples

4. edit and run in run-time

5. built-in AI technologies.



Fourth, intuitive and visual language for Special Effects, Animations.



1. Visual and Intuitive

2. rich examples

3. edit and run in run-time

4. supports GPU acceleration



Futhermore, all of these languages must be built in one VM.

Erlang in action

Erlang을 입문하기 위한 방법!

개발환경 셋업
1. erlware.org의 방법대로 셋업한다. erlang, faxien(erlang package manager),sinan(erlang build system)
2. emacs를 erlang-mode로 셋업한다.


다음 세가지를 읽는다.
1. Programming Erlang
2. Erlang in Action
3. Learn You Some Erlang for Great Good  http://learnyousomeerlang.com/

그리고, http://www.erlang.org/course/course.html 요 링크에서 간단한 설명들이 쉽게 이해가 가면 일단 Erlang에 대해서 이해가 된 것으로 봐야 할 듯 하다.

그리고, google에서 Erlang, Erlang Examples, Erlang Tutorials 들을 찾아보면서 익힌다.
C/C++,Java등으로 구현했던 자신의 프로그램들을 Erlang으로 차근차근 구현해 나간다.
Erlang 으로 구현한 대표적인 오픈소스들을 익힌다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

erlang with higher order function

http://learnyousomeerlang.com/higher-order-functions#get-functional


-module(hhfuns).
-compile(export_all).
one() -> 1.
two() -> 2.
add(X,Y) -> X() + Y()

> hhfuns:add(fun hhfuns:one/0, fun hhfuns:two/0).


fun function_name/arity를 붙여줘야만 one,two가 atom으로 해석되지 않고, 함수를 넘겨준 것으로 이해된다.

다른 방법은 없을까? 즉, one(),two()가 함수였다는 것을 알 수 있는 방법이 있어야 한다.

* type system이 있었다면? compile type때 미리 오류를 알 수 있었을 것이다.
 Erlang의 아쉬운 장면이다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 2월 19일 토요일

Two Sides

There are two sides in Online Game Engine Architecture.

: a Server Side, and a Client Side.



The server side must fully make use of its determined service machine.

For example, you can serve your service via Intel Xeon Quad-core 2.33Ghz, 4GB RAM , 100GB HDD, high speed GPU and so on. you must fully make use of that machine thoroughly.



The client side must fully support various customer machines such as various version Windows , Macs, Linux , iPhones, androids, and so on.



Before you architect your engine, You must decide what platforms you target for.



In the server side,I decided to use Erlang VM for various platforms, and to use cuda for making use of GPU power.

Erlang has many fascinating features including hotcode swap, easy inter-process communication, and stable VM.



In the client side, I want to support an many platforms as I can do.

But, I don't or can't know all.

Therefore, I decided to study jMonkey Engine that is implemented in Java for desktop cross platforms , to study unity3D that is popular for smartphones, and to study Ogre3D(or promising 3D engines whatever it is commercial or opensource) that is implemented in C++ with many open source supports.

Then, I will implement a 3D engine and client-side game logic engine in Haskell.

Haskell is to easily make use of multi-cores, to produce codes rapidly and to focus on logics.

Furthermore, I must study Cuda or OpenCL to make use of enormous GPU power.

I wish Haskell could be sit in various desktop OSes, and smart phone OSes in the future.

2011년 2월 18일 금요일

mmo engines in Erlang


http://sunweaver.blogspot.com/

어떤 사람이 Erlang으로 MMO엔진을 만들고 있다.KVS(key-value store),KVS2 로 메모리 캐쉬를 쓴 것과 Simulation,Logic,Physics 를 분리한 면에 눈여겨 봐야 한다.
아쉽게도 오픈소스가 아니라서, 소스를 볼 수는 없다. 블로그를 보면, AI NPC를 만드는데, 많은 노력을 한 것처럼 보인다.
Goal에서 Erlang을 활용한 이유가 보인다.
"Once SMASH is finished you will be able to create a Massive Multiplayer Online Game (MMO), a messenger-, a dynamic webpage-, an IRC- or SMS-network or anything that requires sending messages across groups of users on different servers, while being completely independent of the platform, as long as Erlang compiles on the OS. SMASH can be upgraded in run-time without missing a beat"

즉,서버를 다운시키지 않고, 업그레이드가 가능하게 한다는 이야기이다.
그러나, 이것은 클라이언트에서도 dependency분리를 잘 해야지만, 동적으로 다운로드와 업그레이드가 가능할 것이다. 이러한 구조를 구현한 솔루션도 없지 않다. Hero Engine이 그 예이다.

그런데, Erlang을 선택한 이유가 그것만 되서는 안된다고 생각한다.
이른바 '서버군'으로 나누어지는 이유는 DB의 용량때문이다. 그 한계를 넘어야 한다.

또한, 만약 서비스가 인기를 얻어, 200만명이 한꺼번에 하나의 월드에서 한다면?
(200만명은 중국에서 인기를 얻으면 가능한 숫자이고, 기록된바 있다.)
200만명이 하는데, 코드 에러 때문에, 200만명이 한꺼번에 튕긴다면?



아래 그림은 여러 노드들을 합친 형태이다.


그림에서는 정확한 아키텍쳐를 알 수는 없지만, 하나로 합치려는 시도로 보여진다.

다음은, 참고할 만한 다른 소스들이다.

: 또 다른 Erlang으로 만든 MMO Engine

:Online Poker를 Erlang으로 구현했다.

: ragnarok online을  Erlang으로 구현했다. 소스를 보면, packet parsing을 어떻게 하는지 볼 수 있다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

explaining time server in Erlang

http://www.erlang.org/examples/klacke_examples/time_server.erl
%%%----------------------------------------------------------------------
%%% File    : time_server.erl
%%% Author  : Claes Wikstrom <klacke@erix.ericsson.se>
%%% Purpose : 
%%% Created :  3 Nov 1998 by Claes Wikstrom <klacke@erix.ericsson.se>
%%%----------------------------------------------------------------------
%%% 이 예제는 다른 예제보다, 매우 practical하기 때문에 
%%% 초보자는 반드시 이해하면 좋겠다.
-module(time_server).
-author('klacke@erix.ericsson.se').
%%% module 이름과 저자에 대한 명시이다. module은 반드시 명시해야 한다.
-export([start/0, loop0/1]).
%%% 외부에 공개할 인터페이스이다. start와 loop0가 공개가 되고, 
%%% loop0의 arity(인수의 수)는 1이다.
-define(PORTNO, 2345).

start() ->
    start(?PORTNO).
start(Pno) ->
    spawn(?MODULE, loop0, [Pno]).
%%% 시작시 loop0를 실행하는 process를 생성한다.
loop0(Port) ->
    case gen_tcp:listen(Port, [binary, {packet, 0}, {active, false}]) of
 {ok, LSock} ->
     loop(LSock);
 _ ->
     stop
    end.
%%% gen_tcp의 모듈에 있는 listen을 호출하고, 그 결과가 ok이면 LSock을 
%%% 받아서 loop를 호출한다.
%%% 그렇지 않으면 stop한다.
loop(Listen) ->
    case gen_tcp:accept(Listen) of
 {ok, S} ->
     gen_tcp:send(S, io_lib:format("~p~n", [{date(), time()}])),
     gen_tcp:close(S),
     loop(Listen);
 _ ->
     loop(Listen)
    end.

%%% accept가 성공하면, Socket(S)를 받아서 date(),time()을 찍어서 send하고, 
%%% close한다. 그리고 다시 loop를 돈다. 

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

using make,rake,emake for building Erlang Project

http://medevyoujane.com/blog/2008/8/21/erlang-make-rake-and-emake.html

emake는 파일 이름들을 나열하면 된다.
make는 emake를 활용하면서, clean,run기능과 같은 것을 넣을 수 있다.
이 필자는 더 많은 일을 위해서 rake를 추천한다.

아쉽게도,cmake를 활용한 예제는 찾지 못했다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

.emacs for erlang in MacOSX

emacs는 macosx용 GNU emacs를 설치하면 된다.
(emacs를 처음 쓰더라도 당황하지 말자. 메뉴들에 hot key들이 다 명시되어 있다.
한글로 된 간단한 emacs소개 )

mac에서 erlang emacs를 쓰기 위한 설정 방법
.emacs파일을 홈디렉토리에 다음과 같이 설정한다.



(setq load-path (cons  "/usr/local/lib/erlang/lib/tools-2.6.6.2/emacs" load-path))
(setq erlang-root-dir "/usr/local/lib/erlang")
(setq exec-path (cons "/usr/local/lib/erlang/bin" exec-path))
(require 'erlang-start)

참고로 각 editor의 learning curve이다. emacs는 무한루프를 돈다. ㅎㅎ



http://www.erlang.org/doc/apps/tools/erlang_mode_chapter.html

이 링크의 내용은, editing,compile을 포함하여, tags,etags등에 대해서도 설명한다.

http://alexott.net/en/writings/emacs-devenv/EmacsErlang.html

이 링크의 내용은 좀 더 실전적인 방법을 다룬다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

Erlang IDE

netbeans의 erlybird
eclipse의 erlide
모두 아직 초기 단계이고, 쓸만하지 않다. 왜냐하면, run이 잘 작동하지 않는다.

emacs를 쓰는 편이 낫겠다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 2월 17일 목요일

video streaming server in open source

http://www.kaltura.org/

오픈소스로 된 비디오 스트리밍 솔루션이다.

클라이언트쪽 위젯등도 풍부하다.
사용자도 많아 보인다.

다른 것 별로 찾아 볼 필요 없을 듯 하다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 2월 16일 수요일

tinch++ ,interface c++ with erlang

There's no erlang support in Swig,for now.

I found an alternative to interface with c++;

That's tinch++.



In c++, I plan to make some high performance modules that has to be thoroughly tested and to be unchanged.

Because, c++ module cannot be changed or swapped at runtime.



Thanks, God.

2011년 2월 15일 화요일

Elliot Game Engine Blog

My Name is Elliot Shin.

I am from South Korea.

I've been working primarilly as a programmer in Game Industry for about 16 years.



Thanks to my boss, I come to have a chance to make use of my full time for myself,at last.



I decided to start to make a new MMO game engine.



I chose Erlang for server-side,and Haskell for client-side.

I will use jMonkeyEngine or somethine else temporarilly.



This challenge will be a long and lonely journey.



I am just learning the two languages.



And, I decided to blog in English to become better at.

I want to make good foriegn friends,too.



I will post my decisions,references I search, and on-going results.

Any help would be greatly appreciated.

Erlang vs Haskell in Server Side Programming

Erlang은 산업에서도 증명되었고, 특히 concurrent oriented programming과 Hotcode swap이 매우 매력적이다.
Haskell이 문법적인 면에서 우수하나(staticcaly typed), 아직 증명해야 할 것들이 많다.

Erlang은  soft real-time application에 적합하다. 즉, 아직 single-core에서 C++만큼의 성능이 나오지 않는다. 따라서, frontend보다는 middle-tier에 적합하다. hard real-time이 요구되는 상황에 적합하지 않다. Haskell도 아직 증명하지 못했다.

Hard Real-time이 요구되는 상황에 대해서 C++프레임워크와 비교해가면서 테스트를 해야되겠다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

Re-enginnering

Reengineering?

다시 만들기, 속된말로 '다시 짜기'
무엇을 위해서 할까?
더 빠르게? 더 안정적으로? 더 많이 받게? 더 생산성을 높이기 위해?

어떤 기술과 레퍼런스를 가져야 할까?
1. 역공학 능력
2. 요구사항을 충족하는 숙련된 기술
3. 외부 성공 레퍼런스, 성공 경험들 축적

가치와 지속성은?
1. 안정적인 서비스 제공
2. 성공적인 회사와 파트너쉽 관계 유지
3. 고급 프로그래머 유지
4. 고급 솔루션 구축과 이전

쉽지 않구나;;;

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 2월 14일 월요일

Qt for cross-plaform Desktop applications

cross-platform GUI library로서 대표적인 것이 두개 있다.

Qt와 wxWidget

여러 논쟁들이 있지만,
결론적으로 Qt가 우월하다.

cloud computing에
desktop application을 만들고자 한다면, Qt를 쓰는 것이 좋을 듯 하다.
실제로 많은 어플리케이션들이 쓰여지고 있다.

다만, mobile platform이 문제인데,
mobile platform인 iphone,android에서 지원하도록 프로젝트가 진행중이다.
하지만, OS특유의 look&feel을 구현해내기엔 어려울지 모른다.
결국, 현재는 cocoa-touch,android sdk에 익숙해지지 않으면 안 될 것 같다.
(android는 qt를 이용한 프로젝트가 잘 되는 것 같다.
http://gitorious.org/~taipan/qt/android-lighthouse )

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 2월 11일 금요일

learning objective-c

Objective-C를 써보지 않았던 개발자들이 Obj-C소스들을 보면, 머리가 아프다.
"이렇게 난잡하다니! 우욱!"
도대체 머리에 안 들어온다!
긴 설명서를 읽기엔 부담스럽다!
그런 분들은, 아래 링크들만 읽어보면 입문 할 수 있을 것이라 확신한다.
다 읽는데 한시간도 안 걸린다.


http://theeye.pe.kr/entry/introduction_to_object_c_with_class_object_message?category=26

http://theeye.pe.kr/entry/compare_object_c_with_java_and_c?category=26

http://theeye.pe.kr/entry/iPhone-Object-C-Class-Method-VS-Instance-Method?category=26

http://theeye.pe.kr/entry/object_c_allocating_and_initializing_objects?category=26

http://theeye.pe.kr/entry/iPhone-Object-C-Declared-Properties?category=26

http://theeye.pe.kr/entry/Object-C-Fast-Enumeration?category=26


이제 좀 익숙해지셨으니, iPhone 개발서들을 읽을 자신이 생기는가?

http://cocoadevcentral.com/d/learn_objectivec/
이 링크의 설명도 좋다.

그러나, 저의 Obj-C에 대한 평가는,
나름대로 생산성 추구를 한 흔적이 보이지만,
표준화와 거리가 먼,
홀로 개발하는 슈퍼개발자가 자신을 위해 만든 언어처럼 보인다.
아이폰을 개발하려면, 아 이런 언어를 배워야 하다니~ 안습~

잡스 아저씨가 VM을 막은 전략적인 이유는 알겠는데,
개발자들을 강제 노동시키는 기분이 들잖아~

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 2월 9일 수요일

Erlang , Haskell hybrid?

http://haskell.org/haskellwiki/Applications_and_libraries/Interfacing_other_languages/Erlang

Erlang Application과 Haskell Application간의 IPC를 위해서 준비하고 있는 모습.

Erlang은 Fault-tolerant, Scability, Stability가 인정되었기 때문에,
Frontend Server로 사용하고,
Haskell은 Logic Solver로 쓰려고 하려는 시도인 듯 하다.

하지만, Erlang을 쓸바에야, 차라리 C++ Frontend를 쓰는 편이 낫다.
왜냐하면, Erlang의 강력한 기능인 Hot code swap을 쓰지 못하고,
Logic Programming의 안정성을 Haskell에서 확보한다는 뜻인데,
결국, Logic Programming의 안정성(특히, 위기상황 대처능력)은 Haskell의 수준에 맞춰지고,
Latency만 올라가는 꼴이 된다. C++이 안정성은 확보 못할지라도, latency를 줄여줄 것이다.

Erlang은 VM의 garbage collection을 per-process단위로 heap을 만들었다.
그것은, 작은 프로세스 단위로, 분산 컴퓨팅이 되길 바라는 의미이다.
그런데, Erlang을 frontend로 쓰는 것은 어불성설인 것 같다.
( http://yarivsblog.blogspot.com/2008/05/erlang-vs-scala.html )

다른 구조로, Erlang의 작은 process들을 여러개 쓰고, 반대로 haskell process가 main controller역할을 한다고 해도, Erlang의 hotspot swap기능을 살릴 수 없다.

기본적으로 hybrid형태는 복잡도를 증가시키기 때문에 바람직한 architecture가 아니라고 생각한다.

하루 빨리 Haskell에 Distributed Computing(Actor Style System), Frontend Server로서의 안정성이 확보되길 바라고, Erlang의 hot code swap/remote shell기능마저 자체적으로 들어가길 바란다.
( http://stackoverflow.com/questions/394645/haskell-for-a-server )
( http://www.haskell.org/pipermail/haskell-cafe/2010-July/080427.html: hot-swap 빨리 구현 되길 ^^
 http://www.flickr.com/photos/48809572@N02/5304662424/lightbox/
http://www.0x61.com/forum/programming-haskell-cafe-f245/hot-swap-with-haskell-t1289472-10.html )


아직까지는 Erlang이 대규모 서비스에는 적합한 듯 하다. 다만, dynamic typing 만 보완되면 좋겠고, syntax도 보완되면 좋겠다;;
( http://jjinux.blogspot.com/2009/02/haskell-or-erlang.html )
( http://stackoverflow.com/questions/532176/erlang-type-system )

현재는, Erlang on server-side, Haskell on client-side가 답이다.
( http://learnyousomeerlang.com/content )
( http://learnyouahaskell.com/chapters )

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

complains about some programming languages

C++은 생산성이 떨어지고,
Haskell은 concurrent programming 이 아직 부족하고,
ErLang은 dynamically-typed라서 생산성이 조금 부족하고,
OCaml은 pure-functional이 아니고, 세미콜론이 거슬린다!;;; 게다가, community가 활성화 안되고 있다.
Scala는 JVM에 종속되어 있고,
Python은 성능이 떨어지고,
Ruby도 성능이...,

Java은 C++과 생산성이 비슷하고,
Lua는 Garbage Collection이 안 좋고,함수형 언어들은 처음에 배우기 어렵고...

그래도 haskell에서 희망을 찾아본다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 2월 8일 화요일

akka

Akka( http://doc.akka.io/ ) 의 Design Goal은 Simple ( Scalability , Fault-tolerant , Concurrency )이다.
 아주 잘 구현한 듯 하다.

개념적으로 잘 정리되어 있고, 성능도 scala의 actor보다 latency가 낮다.
(
기대가 되는 프로젝트이다.
공부 해 볼만한 프로젝트로 추천한다.

play framework에서 scala와 함께 써볼만하다!
( http://implicit.ly/akka-module-for-the-play-framework )

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

Django runs on pypy?

PyPy는 Python의 JIT이다. Python의 성능 문제를 해결해줄꺼라 기대하고...

Python의 가장 Popular한 Webframework인 Django에서 실행되는지를 확인해 보고 싶었다.
최신 버젼인 1.2에서는 확인되지 않고, 1.0에서는 실행된다고 한다.

PyPy위에서 안정적으로 잘 돌아가면서 생산성 높은 Python Webframework이 나오길 기대한다.

아쉽지만, 시간 될 때, 더 알아봐야겠다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 2월 7일 월요일

short comments on bazaar

bazaar는 peer-to-peer version control system이다.
mercurial이나, git가 비슷한 종류이다.(subversion은 client-server구조이다.)

bazaar의 특징은,처음부터 서버가 필요없다.
.bzr folder에 저장하고 있다가, 나중에 merge하거나, 옮기면 된다.
서버가 필요없으므로, SE에게 서버를 설치해달라고 불평할 필요 없다.;;;


백업이 필요하거나,다른 사람과 협업을 해야 할 때 그 때 비로소 서버가 필요하게 된다.
서버는 물론, 자신의 컴퓨터에도 설치 가능하다.

설치 방법도 간단하다.

백업을 위해서, 또는 호스팅을 위해서 bazaar private hosting 업체를 찾아서 설치하면 된다.

개인 작업을 위해서 안성맞춤으로 보인다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 2월 6일 일요일

comments on play framework tutorial

java용 framework인 play framework의 tutorial을 따라서 해보고 있는데,
따라하기 너무 쉽고, 필요한 설명이 빠짐없이 설명되고, 필요한 최소한의 기능을 구현해 볼 수 있다.
MVC기반의 다른 언어의 프레임워크를 써본 사람은 금새 적응되는 수준이다.

바야흐로, 플랫폼 전쟁인 요즘, 상세히 설명된 tutorial은 필수라고 생각한다.
1. 인기를 얻기 쉽다.
2. 다른 프레임워크를 만들더라도 이런 식으로 구현해야 할 듯 하다.
( ruby on rails가 이런 식의 tutorial의 시초였나? ruby on rails의 tutorial은 빨리 만들 수 있는 것에 너무 집중해서, 필요한 기능에 대한 설명이 부족했던 것으로 기억한다. )
3.특히,여러 IDE(eclipse,netbean등)를 위한 project workspace 파일 생성기가 매우 좋았다.
4. Popular한 Domain Specific Task에 대해서 정확히 파악하고 있다.
5. Step-By-Step으로 잘 나누어져 있는 것도 물론이지만, Step마다 결과물을 줘서,성취감을 주었다.

Scala/Lift , OCaml/Ocsigen , ErLang/OTP , SmallTalk/Seaside , Haskell/Snap 등의 tutorial도 이런 식으로 나왔으면 좋겠다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

phonegap as cross platform for mobile apps

비록, HTML5기반이라서, device dependent API 를 쓸 수는 없지만...(HTML5에서 가능했으면 좋으련만.... )
현재는, open source 기반에서 cross platform mobile app개발을 위해서 유일한 대안이네요. device dependent와 그래픽스까지 지원하는 airplay sdk도 있는데, 지금은 iphone을 제외하고 commercial이 되었습니다. airplay sdk는 게임까지 지원하므로, 비교적 무겁습니다.

다음은 phonegap,titanium,rhodes를 비교한 글입니다.
http://surgeworksmobile.com/iphone/mobile-apps-cross-platform-development-challenge-phonegap-vs-titanium-vs-rhodes

node.js 와 함께 쓰면 왠만한 것은 만들 수 있을 것 같습니다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

using playframework,siena,gae

java기반인 play framework을 사용하여, 웹 어플리케이션을 만들어보기로 했는데,
문제가 있었다. play framework내의 jpa를 그대로 사용하면 google app engine에 deploy시 문제가 있다.
대신에, siena를 사용해야 한다.
google app engine을 쓰지 않는 것은, google 보다 덜 믿을만한 호스팅 업체를 쓴다는 뜻이므로, 매우 중요한 요소이다. 본격적으로 상용 서비스를 하지 않고, 시범 삼아 웹 어플리케이션을 만든다면, 더욱 더 중요하다.

여기 입문자를 위한 설명이 잘 되어 있다.

http://viralpatel.net/blogs/2011/01/first-play-framework-gae-siena-application-tutorial-example.html

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

why does Domain Specific Language(DSL) gain popularity?

DSL이 인기를 끄는 이유는?

도메인 문제 해결을 빠르게 하기 위해서다.
arithmetic operation은 언어마다 차이가 조금씩 있지만, 차이는 so-so하다.
그래서 매우 빠르게 적응한다.
인기를 얻는 프로그래밍 패러다임들도 그 직관성에서 기인한다고 생각한다.

도메인 프로그래밍이 인기 있는 이유는, 쉬운 문제를 쉽게 풀기 위해서다.
도메인 오브젝트들만으로 오퍼레이션 함으로써(하위 프로그래밍을 안하고)만 프로그래밍하는 즐거움을 모두 원하고, 그러기 위해서 많은 프레임워크가 탄생하는 것 아닌가?

문제는 정말 생산성 있는 프레임워크는 매우 많은 경험과 통찰에 의해서만 생긴다는 것이다.

이제는 DSL을 만들 수 있는 프로그래머냐 아니냐가 프로그래머의 실력을 가늠하는 척도 중의 하나가 아닐까 생각한다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

seaside in smalltalk

smalltalk란 언어는 대학교때 프로그래밍언어 시간에 잠깐 다룰 뿐, 대부분 실전에서 잘 쓰이지 않는 언어였다. ( 정말? )
아뭏든, 주류 언어는 분명히 아니다.
ADA와 함께 OOP를 설명할 때 자주 등장하는 언어이다.

seaside란 프레임워크를 최근에 알게 되었는데,
웹 프로그래밍에 입문하면서 답답했던 것을 이 프레임워크가 풀어내고 있었다.
바로, 유저 컨텍스트에 기반한 플로우 콘트롤이다.
( http://seaside.st/about/examples/task?_k=8o4aoROk )
처음 웹 프로그래밍에 접했을때, 프로세스를 모델링하면서, 있어야 한다고 생각했던 것이 없어서 당황했는데, 바로 이 플로우 콘트롤 매니져 개념이었다.

Essential complexity 와 Accidental complexity란 말이 있다.
전자는, "복잡하고 지저분한 어려운 문제를 풀려고 할 때"
후자는,"왜 이렇게 간단한 문제를 어렵게 풀고있는 거지?"의 상황이다.

그런데, 전자는 결국 해결될 문제가 아닌데, 후자는 풀릴 수 있을 것 같다. 그런데, 이런 것이 반복되면 개발 속도에 큰 지장을 주는 문제라고 생각한다. 아마도 최근 ruby on rails가 각광받는 이유가 바로 후자의 문제를 잘 풀어주고 있기 때문이리라.
seaside의 플로우 콘트롤이 해결하고 있는 듯 해서 매우 큰 관심이 간다.

비록 smalltalk/seaside는 커뮤니티에서도 큰 인기를 못하지만,

다른 프레임워크에서도 이러한 플로우 콘트롤이 지원되지 않는 한, 존재가치가 분명히 있다고 생각했다.  다른 프레임워크에서 이러한 구조를 지원하는지는 아직 확인 못했다.

그렇다면, smalltalk/seaside를 메인 언어 및 프레임워크로 쓸 수 있느냐?
그 문제에 대한 해답을 아직 못 찾은 듯 하다.
현실적으로 인기를 못 얻는 탓이 그 때문인 것 같다.
다음 링크에, 경험자의 이야기가 있다. 그 사람 이야기는 모든 프로젝트에 사용 가능하고, 크고, 복잡한 어플리케이션에 오히려 적합하다고 말한다.
( http://unhandledexpression.com/2011/02/04/smalltalk-for-engineers/ )

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^

2011년 2월 4일 금요일

haskell for an alternative programming languages

주류(main-stream)가 아닌 프로그래밍 언어를 대안 프로그래밍 언어라고 부른다.

나는 C++프로그래머이다.
최근 3년 동안, 여러 언어들을 알아보았다.
Erlang,OCaml,Scala,Python,Java,Ruby,SmallTalk,Ada,Lua
ErLang은 가장 reliable,fault-tolerant한 것으로 잘 알려져 있다. CouchDB등에서 쓰여지고 있다.
OCaml은 Imperative,OOP에 익숙했던 사람도 쉽게 함수형 언어로 넘어갈 수 있게 되어있다.MS도 OCaml을 차용하여, F#을 만들었다. 즉, MS도 인정한 언어이다.
Scala는 JVM내에서의 OCaml과 같은 식이다. 다양한 패러다임들을 수용하고 있다. 프로그래머에게 많은 편안함을 제공한다. Scala는 이름처럼 Scalability를 위해서 많이 수용되고 있다.
Python은 극한의 생산성을 제공하는 듯 하다. 대규모 서비스의 front-end언어로는 적합하지 않아 보인다. 중급 이하에서는 문제가 되지 않아 보인다. 툴 제작에는 아주 훌륭한 언어라고 생각한다.
Java는 대안언어라기 보다는 주류언어지만, 비판을 많이 받아왔다. 하지만 요즘은 나쁘지 않다. 왜냐하면, Java기반의 좋은 framework들이 많이 나왔다. spring,playframework등... 게다가 성능이 이들 중에서는 가장 최적화가 많이 된 상태이다.
Ruby는 Ruby on Rails를 통해 인기를 얻기 시작하여, 커뮤니티가 매우 크다. 천재적인 패러다임들이 가장 먼저 적용되고 있는 언어이다.
smalltalk,ada도 관심을 두고 알아보았고, 나름 매력이 있다. ADA는 literate programming에 가장 가까운 언어인 듯 하다. 구문이 영어와 많이 닮아 있다.
lua는 큰 규모에는 쓰기 어렵다.

불행히도, 이들 언어에 모두 제대로 입문하진 못했다.
모든 언어를 경험해보고 몸소 그 장단점을 깨달아보고 싶다.
모든 언어로 하나 이상의 프로젝트를 해 볼 계획이다.
하지만 간접적으로나마 깨달은 것 중에 가장 중요한 깨달음은 다음과 같았다.
1. 커뮤니티의 크기 : 커뮤니티가 크다는 것은 도메인 문제들을 잘 해결해주고 있다는 증거이고, 헌신하는 팬들과 투자가 많다는 것이다.
2. 프레임워크가 언어를 압도한다. : 루비의 예에서 보듯이, 언어 자체의 한계성보다는 마찬가지로 도메인 문제를 잘 해결해주기 때문에 인기를 얻을 수 있는 것이다.

앞으로 10년을 개발할 프로젝트에 쓰일 언어의 기준은 뭐가 되어야 할까?
패러랠,멀티코어,CPU/GPU 컨버젼스의 시대이다.
아키텍쳐의 변화를 수용하지 못하면, 결국 성능 결쟁에서 밀려날 것이다.
그러려면, 가장 자연적스러운 병렬 프로그래밍이 가능해야 한다!

아직 어느 언어도 그 기준에 맞지 않다.
그래서 새로운 언어를 만들어 보고 싶다.
그러기전에 '최선'의 선택, 또는 '차선'의 선택이 될 수 있는 언어에 익숙해지는 순서가 필요하다고 생각한다.
그 생각에서 가장 적합안 언어로 꽂힌 언어는 haskell이다.
haskell : 순수 함수형 언어이다. 배우기 어려울 뿐, 함수형 언어에 익숙해지면, 생산성이 매우 높아진다고 한다.(나도 아직 경험해 보지 못했고, 그렇게 되길 바란다. ) 최근 커뮤니티가 급성장하고 있다.

programming language shoot-out 을 보면, 성능 비교가 잘 되어 있다.
http://shootout.alioth.debian.org/
아마도 특정 분야에서는 C/C++을 버리지 못할 것 같다.
haskell에 기대를 걸어본다. 커지고 있는 커뮤니티가 더 최적화된 컴파일러를 만들어주리라 기대해 본다.

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^