엔터테인먼트 소프트웨어 협회 v. 블라고에비치 사건 판결문 중에서 와이프 쿠사리 들으며 하는 게임

 ( 일리노리 주정부는 2005년 폭력적이거나 성적으로 노골적인 비디오 게임을 미성년자에게 판매하거나 대여하는것을 형사 범죄로 규정하려는 법안을 통과시키려 했다. 이에 엔터테인먼트 소프트웨어 협회, 비디오 게임 소프트웨어 협회, 일리노이 소매상 협회는 일리노이 주지사 상대로 소송을 했다.  다음은 그 판결문중 일부이다. )

이 나라에서 주 정부는 청취자의 혹은 관찰자의 생각과 태도에 영향을 준다는 이유로 헌법상 보장되어 있는 표현의 자유를 금지 할 권한이 없다. 

잭슨 판사가 반세기 전에 언급했던것 처럼, "우리 사회의 값진 유산은 각 구성원이 의지대로 헌법상 제한을 받지 않고 생각할 권리를 누리는 것이다. 사고의 통제는 전제주의의 판권이며, 우리는 절대로 그것을 주장하지 않는다. 시민들이 잘못을 저지르지 않게 하는 것이 정부의 기능이 아니다. 정부가 잘못을 저지르지 않게 하는 것이 바로 시민의 기능이다." 

이른바 위험한 연설에 대한 접근을 통제하는 것이 아이들의 긍정적인 정신적 발달을 진작하는 데 중요하다면, 우리 사회에서는 그 역할은 주정부가 아니라 부모와 가족들이 맡아야 한다.

케넬리 판사는 또한 일리노이 주가 비디오 게임 업계와 소매상 단체에게 법률 소송에 든 비용으로 $510,528.64를 배상하라고 명령했다. 물론 주정부는 자체 변호사 비용과 전문가 증언비용까지 모두 부담해야 했다.  

그런데 이것으로 끝이 아니었다. 일리노이 주의회와 주정부는 법원에 이렇게 된통 당했음에도 불구하고 그리고 일리노이 판정이 다른 법원의 의견과 일관된다는 사실에도 불구하고 2007년 중순 블라고에비치 주지사가 그 판정에 상고하기 위해 거의 일백만 달러의 변호사 비용을 추가로 낭비했음이 드러났다.

- 책 "게임의 귀환" 중에서 인용해 봅니다. page 302 ~303

자세한 재판에 있었던 내용은 아래링크 문서의 97페이지 부터 읽어 보면 나옵니다. 
재판에 인용한 fMRI나 게임과 폭력의 연관성에 대한 내용이 여가부등과 유사합니다. 하지만 모두 재판에서 증거로 채택되기 부족한 수준이라는 판정을 받았습니다.

http://www.kocca.kr/knowledge/report/kocca/__icsFiles/afieldfile/2011/04/21/PxwJbcgATfXC.pdf


공유하기 버튼

 

boost::multi_index 좋네요. 프로그래밍 코드&지식모음

RDB의 index처럼 인덱스의 성질을 정할 수 있고 특정 멤버나 멤버 함수를 인덱스로 지정 가능하며 여러개의 인덱스를 조합한 인덱스를 설정 가능한 컨테이너 네요.

C++식으로 이야기 하자면 key가 여러개인 map이라고 생각하면 되는데 key의 성질을 지정할 수 있고 여러개의 조합된 key로 검색이 가능합니다.

복잡성은 stl 컨테이너들과 큰 차이가 없다고 하네요. 

아래 최흥배님의 boost라이브러리 소개에서 알게 되었는데요

조합된 키로 검색이 가능하면 진짜 좋겠다 라고 했는데 있더군요.

일단 좀 써봐야 겠습니다.

공유하기 버튼

 

여가부, “게임에 대한 성전(聖戰)에서 승리하자!” 개인생각

여가부, “게임에 대한 성전(聖戰)에서 승리하자!”

http://ruliweb.daum.net/news/view/36880.daum  

만년의 톨스토이는 모든 예술은 악을 퍼뜨릴 소지가 농후하므로 극소수의 밋밋하고 소박한 예술을 제외한 거의 모든 예술을 국가 차원에서 폐지해야 한다고 주장한다는 극단적인 입장으로 나아갔다. -뇌를 훔친 소설가 중에서.


__

톨스토이의 예술 혐오가 시작된것은 통속적인 영국소설이 러시아 사람들의 뇌를 감염시켜서 문란하고 저속하게 만든다고 믿었기 때문이죠.

결국 종교적기준의 예술을 제외한 모든 예술 행위에 대해 국가적으로 금지시켜야 한다고 주장하게 됩니다.

지금의 여가부는 톨스토이와 다르지 않습니다. 

청교도적인 기준으로 세상을 바라봐선 밋밋한 예술밖엔 살아남을 수 없습니다.

지금의 여가부는 너무 특정 종교 편향적입니다. 

젊은 베르테르의 슬픔이 대유행했던 시대에는 베르테르 효과로 수많은 사람이 자살했습니다. 

심지어 여자친구가 버젓이 있거나 아애 있었던적이 없던 사람들도 자살했습니다.  2000명이상이 자살했다고 합니다.

그때도 소설을 쓰는 행위 자체를 금지하려는 시도가 있었다고 합니다. 하지만 실패했죠.

지금 여가부가 하려는건 궁극적으로 모든 예술행위에 대한 자신들의 특정 종교 편향적인 기준을 맞추려는 행위입니다. 

온라인 게임이나 음악은 그 시작일 뿐입니다. 

이게 성공하면 모든 영화,예술 분야에 대해 자신들의 잣대에 맞춰서 세우려고 할 것입니다.

선의라고 보기에는 일반적인 대중들의 상식에 너무 어긋나 있습니다.

음악도 실패할 것이고 온라인 게임도 실패할 겁니다.

.

공유하기 버튼

 

Task는 Thread를 대체하지 못한다. 프로그래밍 코드&지식모음


질문: 

queue와 concurrent_queue에 각각 자료를 담고나서 그걸 꺼내는 테스트를 해봤습니다.

 

CreateThread로 생성한 곳에서는 queue에서 값을 꺼내고.

task_group 으로 만든곳에서는 concurrent_quque에서 값을 꺼내서

시간을 채크해봤는데.

concurrent_queue쪽이 훨씬 느리게 나오는데.. 이게 정상적인건가요...?

task의 갯수를 늘려줄수록 더욱더 느려지네요 ;;;


저의 답변 :

queue의 비교가 아니라 thread와 task의 비교군요 ^^;

코드를 봐야 원인을 알수 있겠지만 대충 예상해보면


task는 thread pool로 관리되는 객체라고 생각하시면 됩니다.

thread와는 성격이 다르고 사용용도도 다릅니다.


자주 오해하는 부분인데 Task를 생성/삭제의 비용이 Thread보다 작다고 해서 없다는게 아니죠. 생각보다 큽니다.

즉 롱텀잡은 그냥 Thread로 처리하는게 좋습니다. (위에서 처럼 쓰레드 하나 빼서 Queue의 내용을 처리하는 부분을 Task로 처리하는 부분은 매번 Thread를 생성/삭제하는 코드를 짠거나 마찬가지라고 보시면 됩니다.)


Task는 숏텀으로 쓰레드를 자주 생성하고 삭제하는 부분이 있다면 (예를들어서 핫스팟 최적화를 위해 특정 알고리즘을 병렬로 순간적으로 쓰레드를 많이 만들어서 처리하고 결과 얻고 바로 종료하는 경우 ) 


그부분을 Task로 나누는것이 쓰레드를 생성하고 삭제하는 것보다 빠르다는겁니다.


문제는 이런 부분이 일반적인 코드상에 거의 없다는게 문제죠. 

(물론 물리나 수학쪽에는 프로그래밍에는 적용부분이 많을 수 있겠죠.)



이부분이 task기반 코딩이 많이 활성화 안되는 이유이기도 합니다.

Task는 tbb의 핵심이 아닙니다.


오히려 concurrent로 시작하는 컨테이너가 지금의 컴퓨팅 환경에서는 더 활용도가 높습니다.

Thread + TBB의 컨테이너는 상당히 강력합니다.

TBB는 Thread를 대체하는게 아니라 보완하는 라이브러리 입니다.

(TBB는 Threading Building block의 약자 입니다. ^^; task building block이 아니죠. 

thread라이브러지 task라이브러리가 아닙니다.)


실제 사용해 보면 thread대신 task를 적용할데가 아직은 많지 않더군요. 

대부분의 Thread가 프로그램의 시작에 생성되고 끝날때 종료하는 롱텀잡을 수행하고 있어서 인거 같습니다. 


하지만 앞으로 코어수가 많아지고 CPU가 진화한다면 task라던지 여러 부분의 활용도가 높아질것으로 예상됩니다. 


즉 프로그램을 전체적으로 task로 쪼개고 core 갯수 만큼의 thread pool로 관리하면 이상적으로는 core 갯수가 늘어나면 늘어날 수록 성능이 좋아지는 효과가 나옵니다. 그런 효과가 나올만큼 코어가 많아지는 시대가 오면 task기반 코딩이 대세가 될 수도 있습니다.


__


답변 후기 : 물론 core가 많아진다고 task 프로그래밍의 여러가지 난점들이 모두 해결되는건 아니라고 생각 함.

task 프로그래밍의 단점은 task로 나눌 job의 단위가 좀 애매하다는게 있습니다.

task생성/소멸 비용이 thread보다 작지만 신경을 쓰지 않아도 될 수준이 절대 아니라 너무 작은 단위로 나누게 되면

프로그램은 실행시간의 대부분을 task의 생성/소멸만 하게 됩니다. 

또 그렇다고 너무 큰 단위로 나누게 되면 single thread 프로그램과 비슷해지는 결과가 나오게 되어 있는데 

프로그램의 단위 job이 이렇게 task에 적합한 수준으로 자를 수 있는 경우가 물리나 수학쪽의 시뮬레이션 프로그래밍을 빼면 거의 없어서 

이 부분의 불편함을 감수 하고 사용 할 수 있을 정도로 task의 생성/소멸 비용이 줄어들지 않으면 앞으로도 대중화는 힘들것으로 보임. 

물론 통계, 소팅이나 검색같은 순간적으로 cpu 사용량이 커지는 부분 즉 hot spot의 최적화에는 지금도 유용함.


제가 생각하는 TBB의 현재의 유용함은 lock free 컨테이너, lock이 최소한으로 노출된 컨테이너  , Thread에 최적화된 메모리 관리자 , 편리한 lock 들 모두 기존 쓰레드 프로그래밍을 더 쉽고 빠르게 해주는 도구로서 충분한 가치를 합니다. 


인터넷의 자료를 보면 parallel_for나 task등에 너무 치우쳐져 있어서 -_-;......... STL에서 알고리즘 보다 컨테이너가 더 대중적이듯이 TBB에서도 컨테이너가 더 쓸일이 많음.

공유하기 버튼

 

Lambda Timer Event 프로그래밍 코드&지식모음

기본 취지는 기존의 Template기반의 Closure를 Lambda를 이용해서 바꾸는 것. 

기존에 작성한게 특정 Type에 대해서만 작동하는 타이머였는데 람다의 capture를 이용해서 

인자의 타입과 갯수에 관계없이 작동하도록 바뀌었다.

Closure는 rein님의 클로져를 기반으로 했습니다. 
http://rein.kr/blog/archives/2279 )


타이머는 3가지 부분으로 나뉘는데.

매니져 , 이벤트 , 프로세서.

프로세서 부분을 Lambda로 바꾼 것이다.

CTimerEventManager manager;

메인 루프에 
  manager.ProcessEvent();

이렇게만 해주고

int a = 100;
Closure * pclosure = MakeLambdaClosure([a]()
{
time_t now = time(NULL);
printf("now time is %d , a= %d \n", now , a);
});

CTimerEvent event1( 1 ,pclosure );
manager.AddEvent(event1);

이런식으로 이벤트를 생성해주면 1초 후에 pclosure의 람다함수가 실행된다.
캡쳐 [ ] 를 통해서 실행에 필요한 인자들을 복사로 넘기면 된다. 
물론 계속 존재하는 값들이라면 레퍼런스로 넘겨도 된다.

이로서 개인적인 숙원산업이었던 Type별로 따로 만들 필요도 없고 void*로 캐스팅 할 필요도 없는 Timer 완성. 

이어지는 내용

공유하기 버튼

 

C++ 함수 종료이벤트 처리자. 프로그래밍 코드&지식모음



#define __on_function_exit_ std::shared_ptr<void> __on_exit___(nullptr, [&](void*) {
#define __exit_end });

int main()
{
    scriptVM::init();
    foo * p = new foo();

    __on_function_exit_ 
    scriptVM::ShutDown();
    delete (p);
    __exit_end 

    //.......................
}

좀 더 이쁘게 할 수 없을까?

또 함수뿐아니라 스코프를 빠져나가는 순간에 실행이 되버리니. 사용시 주의가 필요하다는게 문제.
그건 모든 클래스 디스트럭터 기반 로직의 문제겠지만.


공유하기 버튼

 

1 2 3 4 5 6 7 8 9 10 다음