매크로에서 do { … } while(0) 을 사용하는 이유

리눅스 커널 소스를 살펴보다가 헤더쪽의 매크로에서 “do { … } while(0)” 와 같은 것이 많이 쓰인 것을 보았다.
당연히 { … } 이 한번만 실행되고 끝나는 건데, 왜 이렇게 했을까 궁금해서 찾아보았다.

정리하자면,

1. 빈 문장(“;”)은 컴파일러에서 Warning 을 발생시키므로 이를 방지!
2. 지역변수를 할당할 수 있는 Basic block 을 쓸 수 있다.
3. 조건문에서 복잡한 문장을 사용할 수 있다. 예를 들면 다음과 같은 코드가 있다고 했을 때,

#define FOO(x) \
        printf(“arg is %s\n”, x); \
        do_something_useful(x);

다음과 같이 이 매크로를 사용한다면,

if (blah == 2)
        FOO(blah);

이렇게 해석되어서 쓰여진다.

if (blah == 2)
        printf(“arg is %s\n”, blah);
        do_something_useful(blah);;

뭐가 문제냐고? do_something_useful(blah); 는 조건에 관계없이 수행된다. 이는 원하는 결과가 아니다. 하지만 do { … } while(0) 를 쓴다면 다음과 같이 해석될 것이다.

if (blah == 2)
        do {
                printf(“arg is %s\n”, blah);
                do_something_useful(blah);
        } while (0);

정확히 원하는 결과를 얻을 수 있다.

4. 3번과 같은 경우에 다음과 같이 사용할 수도 있지 않냐고 생각할 수 있다.

#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

그러나 다음과 같은 경우에는 원하는데로 동작하지 않는다.

if (x > y)
        exch(x,y);          // Branch 1
else 
        do_something();     // Branch 2

왜냐하면 다음과 같이 해석되기 때문이다.

if (x > y) {                // Single-branch if-statement!!!
        int tmp;            // The one and only branch consists
        tmp = x;            // of the block.
        x = y;
        y = tmp;
}
;                           // empty statement
else                        // ERROR!!! “parse error before else”
        do_something();

do { … } while(0) 를 사용하면 다음과 같이 해석되어 원하는 의도대로 정확히 쓸 수 있다.

if (x > y)
        do {
                int tmp;
                tmp = x;
                x = y;
                y = tmp;
        } while(0);
else
        do_something();

5. gcc에서는 Statements and Declarations in Expressions 확장을 사용할 수 있다. 이는 위에서 본 do-while-0 Block 대신 쓸 수 있다.

참고 :    KLDP의 “의미없는 do while 문

kernelnewbies.org의 “FAQ/DoWhile0

ARM CPU Now & Future(2008.11.25) 정리

ARM CPU Now & Future 라는 제목의 무료 동영상이 있길래 한번 보았는데 여러가지 주목할만한-내 주관적으로- 이야기가 있길래 정리한다. 자료 자체는 2008년 11월 25일 자료이므로 현재(2009.9.24) 상황과 비교해서 보는 것도 좋을 듯 하다.
강연 때 사용한 PPT 역시 구글에서 찾을 수 있길래 첨부(링크)한다.
cfile3.uf.1371A41C4ABAD361094B2C.pdf


1. 멀티 코어 관련 개발 기술 필수

일단 ARM 을 버전별로 나누어 정리한 표는 다음과 같다.

출처 : ARM CPU – Now and Future, Sanghi(Sky) Lim ARM Korea


ARMv4, v5, v6, v7 별로 어떤 코어가 사용되고 있는지 눈여겨 봐두자. ARM11-MPCore와 Cortex-A9 위에 화살표에 적힌 x1~4는 멀티코어 개수를 나타내는데, 반도체 회사에서 마음대로 최대 4개까지 코어 개수를 조정할 수 있다고 한다. 앞으로 나올 프로세서들에는 기본적으로 MPCore 기술이 들어간다고 하니 멀티코어 관련 개발 기술은 임베디드 개발하에서도 필수적인 기술이 될 듯 하니, 꼭 익혀둘 필요가 있다.
저가형을 대체하고자 하는 Cortex-M3와 Cortex-M1은 안의 FPGA 에 자체 개발한 IP를 탑재하여 시스템에 적용할 수 있다고 한다.

2. 파트너십에 의한 웹 접근성 강화

출처 : ARM CPU – Now and Future, Sanghi(Sky) Lim ARM Korea


웹 접근성 향상을 위해서 다양한 소프트웨어 회사들과의 작업중이라고 한다.

1. Adobe Flash player : 자료상으로 2009년 상반기 내에 Adobe Flash player 10가 ARM 기반(ARM v6, ARM v7)으로 출시 될 것이라고 이야기하고 있다.
2. Google Chrome : Google의 웹브라우저인 Chrome 은 PC와 ARM 을 동시에 지원하고 있다고 한다.
3. MS Silverlight & Media codecs : MS 윈도우즈 모바일의 실버라이트 역시 ARM 을 지원하도록 작업중이라고 한다. MS에서 미디어 코덱 역시 ARM을 위해 내어놓고 있다고 하니 멀티미디어 지원에 있어서도 강점을 갖게 될 것이다.
4. Firefox : Firefox 를 ARM CPU에 대해 최적화 작업을 해서 6배 빨라졌다고 한다. 또한, 이에 관현한 작업물들을 오픈소스로 공개하여 ARM 사이트에 가면 공개된 자료를 받아볼 수 있다고 한다. x86 기반의 소스와 비교하면 어떤 최적화 기법을 썼는지 볼 수 있으므로 도움이 되지 않을까?
5. Ubuntu : Canonical 에서 우분투 데스크탑을 ARM v7에서 사용하도록 지원한다고 한다. 단순히 커널 뿐 아니라 오픈 오피스 등의 프로그램 등도 지원한다고 한다. 우분투 기반의 많은 디바이스들이 나올 듯 하다.

위에서 보는 바와 같이 ARM은 임베디드 기기의 Major OS인 윈도우즈, 리눅스를 모두 효과적으로 운영할 수 있도록 지원하고, 플랫폼에 독립적인 웹 환경과 멀티미디어 분야 역시 지원하고 있다. 이를 보면 이미 예측된 바와 같이 무선 환경하의 ARM 기반 디바이스들에 사용될 소프트웨어 및 서비스 시장이 매우 커질 것을 예상할 수 있겠다.

저작권과 번역물에 관련된 권리

영문 자료 중에 공부하고 싶거나 정리를 하고 싶을 때 나는 문장을 번역하면서 어디에 올려둔다. 시간이 오래 걸리기는 하지만 문장을 곱씹어 볼 수 있고 나중에 찾아볼 때도 번역된 내용물을 보는게 편하기 때문-역시 아직은 영문보다 국문이 편하다-이다. 올릴 때도 내가 어디에 있든 볼 수 있도록 대개 인터넷 어딘가-예를 들면 블로그-에 올려두는데 블로그에 올릴 때 항상 신경이 쓰이는 것이 저작권에 관련된 문제이다. 블로그 상에 어떤 정보를 올리는 것은 공공에 대한 배포 행위로 간주되기 때문이다. 내 블로그의 Reading 카테고리가 그냥 보면 모두 글 수가 0인 이유가 바로 여기에 있다. ㅋㅋ

오늘도 구글 안드로이드 관련 문서를 보다가 이 걸 번역해서 어디다 올려? 라는 생각으로 접근하다가 라이센스에 대한 내용을 한번쯤은 알고 넘어가야겠다는 생각에 여기저기 뒤적거리던 것들을 정리해두고자 한다.

먼저 번역물을 작성하는 것은 원저작물에 대한 저작권 침해의 여부가 있는지에 대해 알아야 하는데 간단하게 대답은 “예”이다. 원저자와 협의되지 않은 번역물은 원저작물에 대한 2차적 저작물의 작성권을 침해할 우려가 다분히 있다. 다만 이에 대해서도 예외가 존재하는데 이는 저작권법(일부개정 2009.4.22 법률 제9625호)의 “제2관 저작재산권의 제한”의 “제36조(번역 등에 의한 이용)”에서 기술된 바와 같다. 풀어서 쓰면 다음과 같다.

1. “학교교육 목적 등에의 이용(제25조)”, “영리를 목적으로 하지 아니하는 공연,방송(제29조)”, “사적이용을 위한 복제(제30조)” 의 경우에는 각 조항의 규정에 따라 번역, 편곡, 개작하여 이용할 수 있다.
2. “재판절차 등에서의 복제(제23조)”, “정치적 연설 등의 이용(제24조)”, “시사보도를 위한 이용(제26조)”, “시사적인 기사 및 논설의 복제 등(제27조)”, “공표된 저작물의 인용(제28조)”, “시험문제로서의 복제(제32조)”, “시각장애인 등을 위한 복제 등(제33조)” 의 경우에는 각 조항의 규정에 따라 번역하여 이용할 수 있다.

내가 이용하는 목적은 “사적이용을 위한 복제”에 해당하므로, 나는 번역해서 혼자만 보면 된다. ㅋㅋ
그렇지 않은 경우에는 번역권이라는 권리를 받아야 하는데 원저자의 일종의 허락과 같은 것으로 보면 될 듯 하다.

따라서 인터넷 상에 번역된 정보를 올리기 위해서는 원저작권자로부터 번역권과 배포권을 얻어야 하는 것으로 정리하면 될 듯 하다.

그리고, 번역권을 얻어 번역한 저작물에 대해서는 2차적 저작물로 취급되므로 독자적인 저작물로서 보호된다. 이에 대해서는 저작권법 “5조(2차적 저작물)”을 참고하면 된다.

처음엔 쉽게쉽게 쓰려고 했는데, 법률 등을 참고하다보니 글이 어려워보인다;;

구글 안드로이드 문서의 Content License

구글 안드로이드 관련 문서들을 살펴보다가 괜찮은 문서가 있으면 공부 및 정리 겸 해서 번역하면서 보려고 생각하다가 그냥 번역하고 인터넷 상에 올리면 안될 것 같아서 문서들 아래에 적혀있는 다음과 같은 문구의 링크된 Content License 부분을 눌러서 보게 되었다.


Android 1.5 r3 – 21 Jul 2009 11:19



일단 Content에 대해서 두가지로 나누고 있는데, 먼저, “Documentation content” 라 하여 “Dev Guide” 와 “Reference” 탭에 있는 샘플 코드나 소스코드로 부터 생성된 내용이나 그 외 내용들로 하나를 구분하고, 기타 다른 사이트 상의 모든 내용들, 이렇게 해서 두가지로 구분한다.

Content License 에 따르면, 일단 “Documentaion content”는 Android Open Source Project의 일부로 사용 가능하고, 어떤 코드가 포함된 문서들은 Apache 2.0 라이센스를 따른다고 한다. 물론 그에 앞서 GPLv2나 그 외의 라이센스에 해당하는 소스코드를 포함하는 경우에는 해당 라이센스가 우선된다. Apache 2.0 License에 관해서는 KLDPWiki: 오픈소스 소프트웨어 라이센스 가이드Apache 2.0 라이센스 원문, 그리고 Apache 2.0 라이센스의 번역본(김윤수님의 Apache License Version 2.0 번역 완료) 글을 참조해보기 바란다.

그리고 나머지 사이트 상의 다른 모든 자료들은 Creative Commons Attribution 2.5[우리말] 라이센스를 따른다.

[PPT] 파워포인트 동영상 삽입 시 동영상이 안나올 경우

파워포인트 문서를 작성할 시에 동영상을 삽입해서 나오게 하는 경우가 많다.

그런데 이럴 때 동영상 재생이 제대로 되지 않는다면 큰 문제!

문제의 원인은 소리만 나거나 영상만 나온다면 코덱 문제일 수도 있고, 하드웨어 가속이 문제인 경우도 있다.

하드웨어 가속인 경우에는 당연히 하드웨어 가속을 없애주면 된다.

바탕화면에서 우클릭 / “속성(P)” / “설정” 탭 선택 / “고급” 버튼 클릭 / “문제 해결” 탭 선택 후 다음과 같이 “최대”로 되어있는 하드웨어 가속을 없애준다.


그리고 재생해보자! 잘 나오나? ㅎㅎ

참고 : ppt에서 동영상 재생안되는 경우

온다 리쿠

http://news.khan.co.kr/section/khan_art_view.html?mode=view&artid=200908041801291&code=900315

생각없이 네이버에 들어갔다가 메인에 떠있던 온다 리쿠 라는 글자를 보고 눌렀던 글.
이 작가의 이야기를 풀어나가는 솜씨는 대단하다. 일본 작가이니 역자 역시 대단하다. 글의 중반부까지 이끌어 나가는 솜씨는 정말 혀를 내두를 정도.. 읽다보면 나도 모르는 기대감이 무럭무럭 자라난다. 그 기대감에 걸맞는 마무리까지는 무리일지는 몰라도.. ㅎㅎ

꽤 좋아하는 작가로 저 글에 나온 “밤의 피크닉”, “호텔 정원에서 생긴 일”, “삼월은 붉은 구렁을” 등을 읽었다. “삼월은 붉은 구렁을”은 정말 책을 좋아하는 사람이라면 꽤나 흥미로워할만한 하다. 저 책을 읽다가 “흑과 다의 환상”을 집어 읽다 만게 생각난다. 나중에 찾아 읽어야지..

굳이 저 글의 링크를 남겨두는 이유? 본문에 못 읽어본 책들 제목이 나와서.. ㅎㅎㅎ

“지식의 단련법” 이라는 책을 보면 저자는 자신의 독서에는 두가지 목적이 있다고 하던데, 하나는 입력(독서)을 출력(글쓰기)을 위해 읽는 것이고, 다른 하나는 입력 자체가 즐거워서 하는 경우라고 하더라.
요즘 내 독서의 많은 부분은 후자의 경우가 많다. ㅎㅎㅎ!

Windows 탐색기에서 원하는 폴더에서 시작하는 명령 프롬프트 열기

  1. 레지스트리 편집기 열기(“프로그램” / “실행” / regedit)
  2. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell 에서 “shell” 에 대고 마우스 우클릭 후 “새로 만들기(N)” / “키(K)”
  3. “CmdHere” 같은 식으로 넣기
  4. 만들어진 “CmdHere” 을 누르고 오른쪽 창 기본값에 “명령 프롬프트(&Y)” 를 입력
  5. 만들어진 “CmdHere”에서 마우스 우클릭 후 “새로 만들기(N)” / “키(K)”
  6. “command” 입력
  7. 만들어진 “command” 를 누르고 오른쪽 창 기본값에 다음 입력
cmd.exe /d cd \”%1″


8. 탐색기에서 폴더에 대고 우클릭하면 “명령 프롬프트(Y)” 가 나타남.

HKEY_CLASSES_ROOT/Directory/Background/shell 아래도 동일하게 넣는다.

Windows XP 디스크 정리 해제

램디스크 쓰는데 자꾸 디스크 정리 하란다.. 디스크 정리 옵션을 아예 꺼버리자.

1. regedit
2. HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Windows / CurrentVersion / policies / Explorer
3. 우클릭 / 새로 만들기 / DWORD 값
4. “NoLowDiskSpaceChecks” 입력
5. 만들어진 항목에 더블클릭 후 “값 데이터”에 “1”

참고 : “디스크 공간 부족 메세지”를 끄는 방법 (win XP)

안철수. 황금어장 무릎팍도사를 보고..

처음, 그의 순수한 웃음에 놀랐다. 적지않은 나이에도 그런 순수한 웃음을 지을 줄 아는 사람이라니..

둘, 계속 보다가 나온 그의 말.

“어떤 사람이 성공했다는 건 분명히 그 사람이 재능도 있고, 열심히 했고, 운이 좋아서 성공했겠죠.
 근데 그 것 말고도 사회가 그사람에게 준 기회는 인정을 해야 되거든요. 그 기회 때문에 또 다른 사람들은 그 기회를 못 가졌을 수도 있으니까요. 100% 성공을 개인화하는 건 문제가 있다. 그런 생각을 개인적으로 하고 있습니다.”

나는 저런 생각은 해보지도 못했다. 와.. 순간 소름이 돋으면서 온 몸에 전류가 흐르는 듯한 기분.. 그래. 맞다. 재능, 실력, 운 모두 갖춘 사람이 성공한다는 말까지는 이해했지만 그 사람에게 주어지는 기회, 그 것이 사회가 준 것이었음을 왜 나는 알지 못했을까. 다른 사람의 내가 알지 못하던 새로운 생각에 전율한 것은 이번이 처음이다. 짜릿하고, 감동적이다.

셋, 다시금 보다가 다시한번 감동하고 공감했던 그의 말.

“어떤 회사를 만들고 싶습니까?”
“…제가 해야 될 일은 영혼을 불어넣는 일이라고 생각했어요. 만약에 서로 다 다른 사람들이 모여서 있지만, 이 사람들이 공통적으로 믿는 가치관이 있으면, 그래서 만약에 조직의 영혼을 만들 수 있으면, 그건 제가 죽고 없어도, 또는 구성원들이 바뀌더라도 그건 변하지 않고 계속 갈 수 있거든요. 그런 회사를 만들고 싶었죠.”

팀이라던가 회사라던가 그 공통된 가치관을 만드는 일. 가슴으로 우러나는 조직을 만드는 일. 나 역시 해보고 싶다. 그의 바람이 이루어졌는지 혹은 이루어질런지는 차치하고라도 이런 바람을 갖는다는 일에 정말 동경하고, 존경한다.
안철수, 그의 이름에 참된 경의를 표하고 싶다. 존경이란 말은 이럴 때 쓰는 것이 아닐까 한다.

포인터 이해에 대한 글

RSS 리더로 나는 KLDP Geek forum 을 보곤 한다.
보다보면 재밌는 것들이 많단 말이지.. 글들에 글들을 따라가다보면 몰랐던 혹은 어렴풋이 알았던, 애매한 것들에 대해서 다시한번 생각해보게 되고 알게 된다. 언젠가 적었듯이 이게 KLDP의 묘미가 아닌가 한다.
그 중 하나로 오늘은 cinsk님의 “포인터 이해란 글에 대해.“란 글을 보게 되었다. 글들에 링크되어 있는 글들의 덧글들을 보라.

세상은 넓고, 난 너무 미약하다.