빈둥's World

bindung.egloos.com

포토로그 마이가든



boost preprocessor code gen Code Snippet

그냥 스크립트 짜는게 훨씬 편하지만 신기하니까.. -_-

@내부 구현은 recursive define 으로 되어있음.
   #define SOME_GEN4(n, GEN_DEF) GEN_DEF(n) SOME_GEN3(n-1, GEN_DEF)
   이런식. 대충 255개까지 predefine되어있음.
   저 위에서 n-1은 유효한 preprocessor token이 아니므로 실은 약간 더 복잡한 define이 있음. BOOST_PP_SUB 뭐 이런거.

@따라서 255개 이상 만들 수 없음. 컴파일 시간 조올라 길어질 수 있음.

---

#define PARAM_DEF(z, n, u) BOOST_PP_COMMA_IF(n) ARG_T##n &arg##n
#define BOOST_PP_LOCAL_MACRO(n) \
template< class T BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class ARG_T) > \
T *newObject( BOOST_PP_REPEAT(n, PARAM_DEF, u) ) \
{ \
    T *obj = new T( BOOST_PP_ENUM_PARAMS(n, arg) ); \
    _items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; \
    return obj; \
}

#define BOOST_PP_LOCAL_LIMITS (0, 4)
#include BOOST_PP_LOCAL_ITERATE()

#undef CTOR_DEF
#undef PARAM_DEF

--- 결과 ---

        template< class T > T *newObject( ) { T *obj = new T( ); _items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; return obj; }


        template< class T , class ARG_T0 > T *newObject( ARG_T0 &arg0 ) { T *obj = new T( arg0 ); _items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; return obj; }


        template< class T , class ARG_T0 , class ARG_T1 > T *newObject( ARG_T0 &arg0 , ARG_T1 &arg1 ) { T *obj = new T( arg0 , arg1 ); _items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; return obj; }


        template< class T , class ARG_T0 , class ARG_T1 , class ARG_T2 > T *newObject( ARG_T0 &arg0 , ARG_T1 &arg1 , ARG_T2 &arg2 ) { T *obj = new T( arg0 , arg1 , arg2 ); _items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; return obj; }


        template< class T , class ARG_T0 , class ARG_T1 , class ARG_T2 , class ARG_T3 > T *newObject( ARG_T0 &arg0 , ARG_T1 &arg1 , ARG_T2 &arg2 , ARG_T3 &arg3 ) { T *obj = new T( arg0 , arg1 , arg2 , arg3 ); _items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; return obj; }


perl webserver Code Snippet


를 기반으로 살짝 수정했음.

iconv -e나 -c 옵션 먹으면 bash로도 가능한데.. 아쉬비..




2040은 세대동맹 아닌 계급동맹



이번 선거 결과를 보고 내가 궁금해 했던 지점을 알려주는 글.

배운 것들.

1. 정초 선거 : 정초(定礎)선거란 한 사회의 정치 지형을 확정짓는 선거를 뜻한다. 정초선거를 XXXX년 체제라고 부른건 미국에서 부터이고 우리나라는 영호남대결 구도(정확히는 호남포위구도)를 만든 87년체제를 기억해야함.

2. “20세기 후반 이후 신자유주의의 묘한 특징은, 노동시장 전체가 아니라 신규 진입자에게 희생을 전담시킨다는 것이다. 그럼으로써 세대를 따라 일종의 ‘계급 전선’이 형성되는 상황이 세계적으로 일어났다. 이런 세대 정치는 정서적·문화적 세대 정치와는 결이 다른, 변형된 계급 정치다.” 


정치철학강의

강신주 아저씨 강의는 골때리는데가 있다.

참 감동적인데 유료강의라 또 보기 힘드니까 여기에 정리해둔다.

1강 국가는 올바른 것인가?
    국가는 기본적으로 억압구조이다.
    민주주의의 옹호자들은 내 권리를 권력자에게 양도함으로써 주권을 행사한다고 착각하는데
    내 권리를 양도하는 순간 내 권리는 사라지게 된다. 따라서 권력자의 밑에 서게 된다.
    그보다 내 권리를 양도하는게 가능하기나 한일인가?
    사회계약론자들은 그러한 암묵적인 계약이 행해졌다고 가정하는데 그 누구도 그 계약을 실제로 행했다고 나서는 사람은 없다.
    현대 민주주의 사회에서는 일정주기로 선거라는 형태로 그러한 권리양도계약이 이루어지는 것처럼 눈속임하지만
    권력자가 모아진 권력을 가지고 일방적으로 계약을 파괴하더라도 나는 그것을 저지할 권한이 없다. 
    왜냐? 이미 양도해버렸으므로

    그렇다면 억압구조가 없는 집단이 있었는가? 있었다. 인디언사회, 파리꼬뮌.
    거대한 구조물이 존재한다는 것은 곧 그 사회에 억압구조가 존재했다는 것을 의미한다.

2강 사유재산은 올바른 것인가?
    2강은 다시 들어보자.

3강 역사발전이란 무엇인가?
    헤겔의 역사철학은 요약하자면 다음과 같다.
    우리가 도달해야할 궁극적인 어떤 지점이 존재하고 그 단계까지 나아가기 위해 발전과 비판을 거듭하는 것이 역사의 발전이다.
    여기의 맹점은 어떤 지점에 도달하면 더이상 고칠것이 남아있지 않다는 것이다.
    몇몇 신자유주의 철학자들은 그 궁극적인 지점을 신자유주의적 사회로 바라보고 있다.
    헤겔의 비판 지점이 이 부분이다. 과연 궁극적인 지점이 있는가?
    
    맑스는 이러한 헤겔의 역사철학을 이용하여 자본주의 다음에 공산사회가 온다고 주장했다.
    하지만 그것은 맑스를 오독한 것이다.

    맑스의 코뮤니스트는 파리꼬뮌에서 따왔고 따라서 공산주의라고 번역하면 잘못된 것이다. 
    맑스는 파리꼬뮌에서 억압없는 사회를 보았고 그것을 이상향이라고 생각한 것이다.
    하지만 맑스는 선동가적인 측면이 있어서 노동자들을 선동하기 위해 "역사는 너희편이다."라고 선동질한 것에 불과하다.
    그래서 스스로 맑스는 "나는 코뮤니스트가아니다."라고 선언하기도 했다.

    이후 공산주의는 스탈린이 자신의 입맛에 변형시켰고 그 버젼이 전 세계에 유행하게 되었다.
    당연히 우리나라 운동권에서도 맑스를 오독하게 되었다.

    그 의미에서 한나라당에 간 운동권학생들의 행동도 이해할 수 있다. 역사의 최종적인 지점인 공산주의가 80년대 말 붕괴하고
    난 뒤 그렇다면 자본주의가 궁극적인 지점이라고 생각했을 수도 있다. 

4강. 정치철학
    칸트는 어떤 현상을 세가지 범주로 나눴다.
    진리의 범주:참,거짓, 예술의 범주:미.추, 윤리의 범주:선.악. 이 세가지의 범주를 잘 나눠서 생각해야한다.
    어떤 하나의 사건을 각각의 범주로 바라볼수 있다. 칸트이전에는 진.선.미가 같은 것이었다. 이 점이 칸트의 위대한 점이다.

    하지만 이 세가지 범주 이외의 것들도 있다. 경제는 이.해이고 종교는 성.속이다.
    그렇다면 정치의 범주는 무엇인가? 적과 동지의 구분이다. ( 이게 슈미트의 위대한 점. )

    권력자의 무서운 점은 적과 동지를 구분을 한다는 점이다.(전쟁등) 나치가 행한 것은 독일인을 뭉치게하기 위한 용도로 
    유대인들을 적으로 설정했고 이가 매우 강력하게 작용했다. 

    슈미트의 입장에서는 세계는 통일될 수 없다. 통일된다면 적이 존재할 수 없기 때문이다. 
    거꾸로 이야기하자면 외부의 적이 나타나면 통일될 수 있다.

    아감벤은 이 분류를 벌거벗은 생명/정치적 존재로 나눠야 한다고 한다. 벌거벗은 생명이란 언제든지 죽여도 되는 존재다.
    나치독일에서 일반인들은 유대인들을 옹호할 수 있었지만 옹호하는 순간 자신이 벌거벗은 생명의 범주에 들어가게
    될지도 모른다는 두려움에 거기에 동조했다. 왕따의 매카니즘도 같다. 왕따가 존재하는 동안. 그리고 내가 그 왕따에게
    같이 돌맹이를 던지는 동안에는 나는 정치적인 존재로 남아있게 된다.
    왜 우리는 적과 동지를 구분하는가? 내면적으로 벌거벗은 존재(호모 사케르)가 될지도 모른다는 두려움이 있기 때문이다.
    따라서 정치적인 범주의 갈림길은 외부에서 주어지는 것이 아니라 자신의 내부에 있다. (두려움)
    (사견 : 김어준의 눈길로 보자면 진보인사의 결벽증은 이런 매카니즘이 아닐까? )
    포함/배제의 분류가 더 직관적인 듯하다. 하지만 포함되는 존재에는 억압당하는 뉘앙스가 들어있다.
    포함적 배제관계란 "나는 아직 문둥병자가 아니다. 하지만 언제든지 문둥병자가 될 수 있다."란 관계이다.
    그 공포때문에 돌맹이를 던지는 것이다.

    권력자의 비판지점은 여기에 있다. 권력자가 나타나서 호모 사케르가 될 수 있다는 가능성을 열어두는 순간
    사람들은 두려움에 휩싸여 자기 검열에 나서게 된다. ( 우리들의 일그러진 영웅 참고. )
    
    질의 응답시간에 나온 책임에 관한 이야기 : 나치치하 국민들은 그에 대한 책임을 져야하나?
    책임이란 실제 잘잘못이 중요한 것은 아니다.  우리가 독립했을때 32살 먹은 사람은 과연 일제부역에 대해 책임을 져야하나?
    독립선언문을 작성한 33인 대부분은 친일로 돌아섰다. 일제치하가 오래되면서 절망했기 때문이다.
    그렇다면 그 죄는 절망한 죄를 물어야 마땅하다. 과연 그것을 책임진다고 할 수 있는 것인가?
    하지만 책임을 진다는 것은 내가 그 시대의 지도층임을 인정하고 어른임을 인정하는 행위이다.
    우리는 그런 과정이 없었다. 친일인사중 친일의 책임을 지고 은퇴한 이는 없었다. 이게 문제이다.
    -- 이게 솔깃한 이유는 정의란 무엇인가에서 '우리'의 잘못은 어디까지 책임져야하는가 하는 화두가 있었는데
        마이클샌델은 사회계약론적 접근을 취했다. 우리가 '우리'에 속하기 위해 계약을 했으므로 각각은 그만큼
        '집단'에 책임이 있다는 것이다.
        강신주 박사님의 언급또한 이런 맥락으로 해석이 가능할 것도 같다. 우리가 이 시대에 태어났기때문에 
        내 잘못이 아닐지라도(잘잘못이 중요한 것은 아니므로) 책임을 인정하는 것이 성숙한 태도라고 한다.
        하지만 강신주 박사님의 관점은 사회의 일원으로써 계약을 했기때문이 아니라 그 사회에 저항못한
        자신의 허약함에 대한 책임짐을 말한다고 이해해야 옳을 것 같다. 왜냐면 그는 사회계약론을 싫어하니까.
        일본의 현재를 이야기하면서 "그들이 어떻게 책임지느냐? 다 자기 할아버지, 아버지가 한일인데.
        하지만 그렇기 때문에 짜증난다."라고 말함으로써 그들이 정말 책임이 있다고 말하지 않았다.
        "하지만 아쉬운 것은 일본의 지식인 중에 누군가가 우리책임이라고 나섰다면 우리는 화해할 수 있었을 것이다."




재미있는 Makefile Code Snippet

디렉토리에서 특정 이름을 가진 소스파일을 찾아 so를 만들고
make test하면 각각 so를 정해진 방법으로 테스트하는 Makefile

재미있는점 1. SRCS=$(shell ls TC_*.c)
재미있는점 2. TEST_SUITE=$(TARGETS:.so=.test)
실제로 .test라는 파일은 만들어지지 않는다. 오로지 .so.test rule을 실행하기위해 만든 가상의 suffix

@이 메이크파일과 적적한 codegen만 만들면 junit 1.4 비스무리한것도 만들수 있을듯.
@@CUnit은 안써봤지만 junit 예전버젼처럼 add_suite 이런짓하는게 짜증;;

-------
.SUFFIXES : .c .so .test
CFLAGS=-I.. -g -fPIC
LDFLAGS=-shared

SRCS=$(shell ls TC_*.c)
TARGETS=$(SRCS:.c=.so)
TEST_SUITE=$(TARGETS:.so=.test)

all: $(TARGETS)

test: $(TEST_SUITE)

.c.so:
gcc -shared $(CFLAGS) $(LDFLAGS) -o $@ $<

.so.test:
../cth_verbose ./$<

clean:
rm -rf $(TARGETS) *.o

User간 상관계수를 Incremental하게 계산 하는 법.

1. 다음과 같은 데이터가 미리 계산 되어 저장되어 있다.
   (1) 임의의 유저가 내린 평점의 갯수 =

   (2) 임의의 유저 u의 평점의 평균 =

   (3) 임의의 유저 u의 평점의 제곱의 평균 =

   (4) 임의의 유저 u와 w사이의 상관 계수 =



2. 1에 의해 임의의 유저 u의 평점의 표준편차는 다음과 같다.
    (5)



3. 유저 u가 새로운 영화 k에 대해 평점 를 내린다면 1의 (1),(2),(3)은 다음 처럼 다시 계산 될 수 있다.
   (6)

   (7)

   (8)



4. 3에 의해 유저 u의 평점의 표준편차 또한 다시 계산 될 수 있다.
    (9)



5. 먼저 유저 u의 평균의 변량라 하고 다음과 같이 정의하자.
    (10)


6. 영화 k를 본 다른 유저 w와 상관계수가 계산 되어있으므로 새로운 상관 계수는 다음과 같이 계산 될 수 있다.
    (11)

   

   

   




7. 식 (11)은 전체 데이터를 모두 계산할 필요없이 (1),(2),(3),(4)가 주어졌을때 새로운 평점을 알면 다른 유저와의 상관계수를 O(1)으로 구할 수 있음을 보여준다.

@http://www.codecogs.com/latex/eqneditor.php 이 사이트 좋긴한데 수식중간에 내려쓰기 안되는데 살짝 아쉽네;;;

컨베이어벨트 위의 비행기는 뜰 것인가. About My Interest

컨베이어벨트 위의 비행기는 뜰 것인가.

오.. 재미있네..

처음에 당연히 안뜨는거 아냐? 라고 생각했다가 설명보고.

아.. 당연히 뜨는거구나..

@댓글을 읽다가 생각난 가장 이상적인 가정.
 
1. 바퀴와 지면(컨베이어밸트)의 마찰은 존재한다.
 
2. 1의 마찰력은 바퀴의 회전속도에 무관하다 

3. 바퀴축(비행기에 달려있는)의 마찰은 0이다.

-- 1,2,3 모두 현실적인 근사치 

그렇다면

(1) 컨베이어가 일정한 속도로 움직이는 경우
     2와 3에 의해 정지한 경우와 완벽히 같음. 고로 뜸.

(2) 긁적아저씨가 가정한데로 컨베이어밸트의 속도는 바퀴속도에 맞춰서 바퀴 중심축의 변위를 0으로 맞추도록 움직이는 경우.
     현재 추력 F가 작용하고 이 상태로 평형이라고 가정해보자. (1에 의해 현재 추력과 마찰력은 완전히 상쇄된 상태 )
     이때 약간의 추력을 더해주면 2에 의해 비행기는 반드시 가속운동을 해야함.
     
     따라서 (2)의 움직임은 있을 수 없음. ( 2의 가정이 실제와 무관할지라도 지금은 사고 실험. )
    
     좀더 자세히 살펴보면

     약간의 추력에 의해 가속운동 시작 -> 바퀴의 각속도 증가 -> 컨베이어 회전속도 증가

     하지만 컨베이어의 회전속도가 증가한다고 해도 2에 의해 반대방향 힘은 추가되지 않음.

     그러면 1에 의해 바퀴는 더 빨리돈다. 
  
     즉 바퀴와 지면이 미끄러지면서 변위가 증가하는게 아니라 바퀴와 컨베이어의 상대속도가 증가하면서 ( 바퀴가 더 빨리 돌면서 ) 변위가 증가하게 되는 것. 만약 (2)가정을 계속 고집한다면 컨베이어는 무한대의 속도로 돌게 되지만 결국 마찰력은 변함없으므로 무관함. 
    
 
(3) 이제 좀더 현실적으로 2,3번 가정 파기해 보자.

     바퀴의 각속도에 따른 마찰력함수 u(r)은 연속이고 단조 증가하고 lim r->inf 이면 u(r) -> inf라 하자.

     추력 F일때 ( 마찰력과 추력이 완전히 상쇄되었을때) 바퀴의 각속도를 r이라하면
   
     dF만큼 추력이 증가했을때 (2)와 똑같은 사고 과정을 거쳐 바퀴의 각속도는 2dr만큼 증가해야함. 

     (설사 여전히 마찰력이 커서 변위가 변하지 않는다고 하더라도!)
 
     결국 실제 알짜힘이 +가 되려면

     dF > 2u(r)dr   이 되면 됨.

     문제는 다음순간에 컨베이어의 속도가 계속증가되어 결국 마찰력을 상쇄 시킬만큼 되서야 컨베이어의 가속이 멈춘다는 것.

     (2)때의 가정에 의해 미끄러짐없이 변위가 증가하기위해서는 바퀴의 각속도가 증가하는 수밖에 없는데 
    
     컨베이어는 이상적인 컨베이어여서 바퀴의 각속도 증가에 따라 즉각즉각 반응한다고 가정. 

     실제 실험에 적용하자면 추력증가가 상대적으로 엄청 느리면 됨.

     u(r)의 성질과 중간값정리에 의해 r이 충분히 커지면 반드시 dF보다 같거나 커지는 지점이 만나게됨.

     결국 이 경우엔 뜰 수 없음.

 
결론 :

   컨베이어가 한계 각속도(r_lim)를 가지고 있고 비행기의 추력이 u(r_lim)보다 크다면 뜬다.

   혹은 u(r)의 upper bound가 존재하고 비행기의 추력이 그 값보다 크다면 뜬다.


     

          

     

     

    
   

lua c sendbox Code Snippet

lua_sendbox.tar.gz

lua engine 자체가 thread-safe하지 않음.

따라서 sendbox역시 thread-safe하지 않음. multi-thread에서는 sendbox pool을 이용하는게 좋을듯.

sendbox에서 가려야하는 위험한 함수들은 아직 다 가려지지 않았음.




Red-Black Tree Code Snippet

insert는 wiki 페이지 보면 쉽게 이해가고 delete는 잘 이해가 안가는데

핵심은 이것.

1. delete node가 red이면 문제 없음.

2. delete node가 black이면 자신과 parent sibling을 가지고 rebalancing해야함. 
   - 1에의해 자기는 black
   - 따라서 parent가 보기에 양쪽의 black-height는 delete node 쪽이 1 작음.

3. 2까지 확실히 이해했으면 다 왔음. 이제 종이와 팬을 들고 각종 case에 맞게 작업하면 됨.
   - parent가 red, black, sibling이 red, black 해서 총 4가지 경우중 red-red는 있을 수 없으므로 3가지만 해석하면 됨.
   - delete node를 leaf라고 가정해도 됨. ( 아래 딸린 node는 모두 black-height가 같고 다행스럽게도 delete node 쪽으로 rotate 연산은 존재하지 않음. )
   - rebalancing과정중에 black-height가 증가하면 절대로 안됨.

4. 3까지 이해했으면 이제 딱 두가지 경우밖에 없는 recursive과정을 이해하면 됨.
   - p와 s, s의 자식들이 모두 black인 경우.
      p에서 보면 s쪽 black-height가 1 큼.
      따라서 s를 red로 바꾸면 p 입장에서는 양쪽 black-height가 맞음.
      그런데 gp입장에서 보면 p쪽은 어젼히 black-height가 1 적으므로 한단계 위로 올라가서 rebalancing.

   -  p는 black, s는 red
       s를 black으로 p를 red로 바꾸고 rotate시키면 s 입장에서는 양쪽 모두 black-height가 1씩 줄어든 결과.
       gp입장에서보면 gp의 자식 s의 black-height는 원래 값을 가지고 있으므로 만족.
       다만 s의 자식이된 p입장에서 보면 여전히 p의 자식인 n(delete node)과 s의 자식은 black-height가 1 차이남.
       ( 원래 p의 black-height를 a라 한다면 n은 a-2이고 s는 a-1, s가 red이므로 s의 자식의 black-height도 a-1)
       따라서 이번엔 한단계 내려가서 reblancing

5. 4의 recursive과정이 종료가능한가?
    - p,s,s의 자식들이 모두 black인 경우를 c1이라하고 다른 경우를 c2라 하자.
    - c2과정은 두번째 recurcive를 일으키지 않음. - 종료 후 p는 red가 됨.
    - c1이 종료된후 한단계 위에서 보면 p의 색은 ?, n의 색은 black, s의 색은 ?
    - c1에서 올라가는건 유한한 단계에서 끝남. 내려가는 경우는 c2과정을 거치는 경우인데 이 경우는 다음단계에서 종료.

@나 빠가가 되었나봐 ㅠ.ㅠ 이거 이해하고 구현하는데 온갖 참고 자료 보고도 며칠이나 걸렸어... ㅠ.ㅠ
   
      rb.c

vimrc Code Snippet

set ts=4
set sw=4
set ai

" execute result page
function! MyExecute(cmd)
    let tmpnam=tempname()
    let tmpnam=tempname()
    let cmdstr=expand(a:cmd)
    exec "!".a:cmd." 2>&1| tee ".tmpnam
    if bufexists("ResultWindow") && bufwinnr("ResultWindow") > 0
        exe bufwinnr("ResultWindow")."wincmd w"
        set ma noro
    else
        bo 6split
        enew
        setlocal bt=nofile
        file ResultWindow
    endif
    exec "0"
    exec "normal dG"
    exec "r ".tmpnam
    exec "silent !rm ".tmpnam
    redraw!
endfunction

map <F5> :call MyExecute(g:myexec)<CR>
let g:myexec="make"

" folding rule
set foldmethod=indent
map <tab> zA
map <space> za

" window moving
map <Up> <C-w>k
map <Down> <C-w>j
map <Left> <C-w>h
map <Right> <C-w>l

" browsing
map <C-t><C-t> :tabnew<CR>
map <C-t><C-p> :tabp<CR>
map <C-t><C-n> :tabn<CR>


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