February 2009 Archives

object님이 적으시며 좌절하신 코드 문제.

int a = strlen("123");
int b = strlen("123\0");
int c = strlen("123\012");
int d = strlen("123\0123");
int e = strlen("123\0123\0ABC");
int f = strlen("123\0ABC");

C/C++ 프로그래밍 언어 표준을 뒤지며 나름대로 language lawyer로서의 자부심을 가지고 있었는데, 한 순간에 그러한 생각을 깨뜨린 문제네요. 물론 농담이고요. 이런 것을 프로그래밍 실력과 직접적으로 연결해서 생각하지는 않지만, 프로그래머 만이 가질 수 있는 일종의 취미 정도로 생각해주시면 좋을 것 같습니다.

NoSyu님이 컴파일 결과에 따른 답과 나름대로의 해석을 하셨기에 정답은 나온 셈이지만, 이런 문제는 역시 컴파일러의 구현 뿐만 아니라, 표준 문서를 뒤져보아야 하는 문제겠죠.

제가 가지고 있는 C 표준 문서는 ISO/IEC 9899:1999, 소위 C99라고 불리는 문서입니다.

Character constants에 관한 항목은 6.4.4.4인데요. backslash를 이용한 escape sequence는 크게 4가지로 나뉘고, 그 중의 하나가 octal escape sequence입니다. 논의의 간소함을 위해 여기서는 octal escape sequence와 hexadecimal escape sequence만 보도록 하죠.

octal-digit:
	0 1 2 3 4 5 6 7

octal-escape-sequence:
	\ octal-digit
	\ octal-digit octal-digit
	\ octal-digit octal-digit octal-digit

hexadecimal-digit:
	0 1 2 3 4 5 6 7 8 9
	a b c d e f
	A B C D E F

hexadecimal-escape-sequence:
	\x hexadecimal-digit
	hexadecimal-escape-sequence hexadecimal-digit

이러한 문법에 따르면 다음과 같은 사실들을 알 수 있습니다.

1. octal escape sequence에는 각각 8진수를 표현하는데 사용할 수 없는 문자는 파싱 단계에서부터 octal escape sequence의 고려에서 제외됩니다. 즉, 위의 문제에서, "\0ABC"의 경우, 'A', 'B', 'C'는 octal-digit가 아니므로, "\0"만이 octal-escape-sequence로 파싱되고 결과적으로 { ‘\0’, ‘A’, ‘B’, ‘C’, ‘\0’ }로 해석되는 것입니다.

이러한 행동은 C89에서 변화된 것으로 보이는데요. 마찬가지 이유로 “\078”의 해석은 { ‘\07’, ‘8’ }로 되지만, 예전에는 0 prefix에 따르는 2개의 digit를 해석하는 구현의 책임 (implementation-defined)이었고, “\078”은 “\100”(078 = 0100)으로 해석되기도 한 모양입니다. C89 이전의 머나먼 옛날의 이야기이니, 현 시대의 컴파일러에서 이러한 동작은 신경 쓰지 않아도 될 것 같습니다.

2. octal-escape-sequence에서는 3개까지의 octal-digit를 허용합니다.

예를 들어, “\0123”는 어떨까요? octal-digit 3개 까지만 허용하므로 일단 ‘3’은 배제하고 “\012” “3”으로 해석되겠네요. 그러면 “\012”는?

다시 C99 문서로 돌아가보면,

Each octal or hexadecimal escape sequence is the longest sequence of characters that can constitute the escape sequence.

라는 얘기가 있습니다.

즉, “\012”는 { ‘\0’, ‘1’, ‘2’, ‘\0’ }나, { ‘\01’, ‘2’, ‘\0’ }로 해석되는 것이 아니라, 가장 긴 매치에 해당하는 { ‘\012’, ‘\0’ }로 해석된다는 것입니다. 사실 octal escape sequence에 대해서 알고 나면, 상식적인 이야기라고 볼 수 있겠습니다.

한편, { ‘\01’, ‘2’, ‘\0’ }을 표현하고 싶다면 어떻게 해야할까요? 이것은 C/C++의 편리한 String Concatenation 문법을 사용하면 됩니다. 즉, “\01” “2”라고 하면 되겠죠.

3. octal-escape-sequence에서 ‘\0’ prefix가 요구되지 않습니다. 이것은 그 동안 제가 몰랐던 중요한 사항 중 하나네요. 즉, ‘\012’나 ‘\12’나 동등한 의미를 가진다는 것입니다. 아마 그 동안 코드를 보면서 그러한 경우를 봐왔을 텐데 조금 더 세심하게 보지 않았던 것 같네요.

재미있는 문제를 제공해주신 object님, 그리고 assembly까지 확인해주신 NoSyu님께 감사드립니다. :)

팀의 프로세스에 딱 들어맞는 작업 관리 도구가 없어서, 팀의 작업 관리 방식을 반영한 도구를 만들고 싶습니다.

사실, 그리 복잡한 요구사항을 가지고 있는 것이 아니기 때문에, Rails Scaffolding을 약간 수정하는 수준으로 생각되어, 일단 Rails로 시도해보려고 계획했습니다. 그러한 계획 하에, 얼마 전, 오랜만에 집에서 Virtual Box에 Linux + Rails 환경을 구축하여 개발을 시작했는데요. Rails 1와 Rails 2 사이의 간극 때문에 포기하고 말았습니다. 의외로 Rails 2.x에 대한 문서도 그리 많지 않은 것 같고, 국내에 나와있는 Rails 2 도서도 없어서 쉽지 않더군요.

Learning Rails그러다 우연히 Safari Books Online에서 Learning Rails를 발견하고는 주말에 심심해서 읽어보게 되었는데요. 기존 버전의 Rails를 사용해 본 경험이 약간 있어, 예제 실행과 Rails 2에서 달라진 점에 주력해서 읽었고, Learning Rails를 읽는 데에는 이틀 정도 밖에 걸리지 않았습니다.

Learning Rails는 Learning 시리즈에 속한 다른 책들처럼 초심자용으로 Agile Web Development with Rails (이하 AWDR)의 도입부의 내용 정도로 생각하시면 될 것 같습니다.

특히, 다양한 예제를 통해 Rails의 다양한 기능들을 훑어볼 수 있도록 해주는 점이 마음에 듭니다. AWDR은 뒤쪽으로 가면서 예제도 없고 지루한 설명으로 바뀌어 버리는데, Learning Rails가 물론 분량상 AWDR의 내용을 모두 커버하지는 않지만, 그러한 면에서 초심자가 읽기에는 훨씬 좋은 것 같습니다.

책 자체가 작을 테니 들고 다니기에도 좋을 것 같고요.

Learning Rails가 좋았던 또 다른 하나는 바로 Heroku 환경에 대해서 각 예제를 실행하는데 필요한 설명들이 포함되어 있다는 것입니다. 덕분에 Heroku라는 편리한 환경을 통해 쉽게 공부할 수 있었습니다.

Heroku란 한마디로 말하자면 Rails 개발 환경을 포함한 Rails 프로젝트 호스팅이라고 말할 수 있습니다. (Heroku Feature)

herokugarden

별도로 Rails 개발 환경을 셋업 할 필요 없이 바로 프로젝트를 시작하고, 어디서든 접근해 개발과 테스팅을 할 수 있다는 것은 대단히 편리합니다. 웹 상의 IDE도 큰 불편함이 없을 정도로 훌륭할 뿐만 아니라, Rails 콘솔이나 Generate 스크립트 실행, 플러그인이나 gem 설치까지도 지원하기 때문에, 웬만한 Rails 개발은 거의 다 해볼 수 있습니다. (HerokuGarden에서는 현재 플러그인 설치에 약간 문제가 있는 상태라 git을 사용해서 올려야 하긴 합니다.)

지금 Heroku를 사용하려고 시도해보시는 분들은 HerokuGarden으로 가게 될 텐데, 원래의 Heroku가 HerokuGarden으로 이전하면서 Heroku/HerokuGarden 두 사이트 체제로 되어있고, 신규 가입은 HerokuGarden에서만 받고, Heroku는 초대 기반의 Private Beta 상태입니다.

어제 Heroku Invitation을 받았는데, 현재의 Heroku에서는 IDE 기능을 빼고 원래 지원하던 git 기능을 통해서 클라이언트에서 작업하는 것을 기본으로 하고 있는 것 같습니다. 그 때문인지, ‘git을 사용하고 있기 때문에’라는 이유가 들어가는 것 같고요. 그래도 HerokuGarden은 계속 지원할 예정이라고 하니 안심하셔도 될 것 같습니다.

Since you're currently using git to update your Heroku app testflakes, you should switch from HerokuGarden to Heroku.com. The version of our platform that's running on Heroku.com will be the basis of our upcoming launch, and it'll be a much better home for your app. It works almost exactly like Heroku Garden with the following enhancements:
* Improved reliability
* Better performance
* A vastly improved API and gem for managing your apps
* Automated nightly backups of data and code that can be downloaded via the gem
* Support for cron jobs
Unlike HerokuGarden, Heroku.com does not offer the web based code editor. However, since you're already using git, this shouldn't affect you at all. In fact, we think you'll love the simplicity and reliability of working with our new heroku gem.

Rails나 Rails 2를 처음 배워보시려는 분들은 Learning Rails와 Heroku로 한번 시작해보세요. 배움의 문턱을 한층 낮추어줄 수 있는 도구들이 될 수 있지 않을까 싶습니다.

Author

Linko Apple Booth in the Coex Seoul Email address

Recent Comments

  • trustin.myid.net: 독일어의 압박이 흐흐.. 헤르만 헤세의 데미안!? read more
  • lastmind.net: 오! 반가워요~ read more
  • coolluck: 안녕하셔요. 저는 최민수라고 하는데 네오위즈 있을 때 잠시 인연이... 저도 read more
  • lastmind.net: 와, 정말이네요. 거기까지는 생각이 미치지 못했습니다. ^^ read more
  • 홍민희: 굳이 string concatenation 쓸 필요 없이 "\0012\0"이라고 써도 됩니다. 최대 read more
  • waitfor: mod_php 로 구글링중 우연히 방문했습니다. 좋은글이 많아 자주 들르게 될것같습니다. read more
  • 죠커: 스몰 릴리즈 오랜만에 듣는 단어이네요. 한동안 스몰 릴리즈를 잊고 있었던 read more
  • Joseph Jang: 확실히 그 점이 가장 큰 장점인 것 같네요. read more
  • Joseph Jang: 아, 퍼키 님에게 언뜻 들었는데, 그런 게 있었네요. ^^ read more
  • lastmind.net: 감사합니다. 솔직히 말하자면, 이런 글 나부랭이 하나가 칭찬 받을 정도로 read more

About this Archive

This page is an archive of entries from February 2009 listed from newest to oldest.

January 2009 is the previous archive.

April 2009 is the next archive.

Find recent content on the main index or look in the archives to find all content.