노무현 대통령 배너
BLOG main image
왕미친놈의 왕미친세상입니다. 미친 소리는 써도 되지만, 근거 없는 소리는 쓰면 안 됩니다.


텍스트큐브 알림판박쥐의 변신이라는 글이 나타났기에 단지 제목이 재미있어서 클릭했습니다.

왕미친놈이 본 추천 포스트

왕미친놈이 본 추천 포스트

그런데 주석(각주)을 달 수 없다는 푸념(?)이 있습니다.

얼마나 답답하셨을까?

얼마나 답답하셨을까?

태터툴즈 주석 달기

제 기억이 맞다면 태터툴즈의 형제들은 주석 다는 방법이 모두 같습니다. 바로 [footnote]내용[/footnote]과 같은 꼴로 나타내면 주석으로 바꾸어 줍니다.

텍스트큐브 편집 화면 1 - 주석이 달려 있습니다.

텍스트큐브 편집 화면 1 - 주석이 달려 있습니다.

참고로 예제로 보인 문서는 제 블로그의 GotD - Wondershare Photo Collage Studio 4.2.12 문서입니다.

텍스트큐브 편집 화면 2 - 위지위그 편집 모드

텍스트큐브 편집 화면 2 - 위지위그 편집 모드

역시 주석을 달린 부분만 잘라내어 빨간색으로 표시했습니다.

텍스트큐브 편집 화면 3 - HTML 편집 모드

텍스트큐브 편집 화면 3 - HTML 편집 모드

앞의 텍스트큐브 편집 화면 2 그림과 마찬가지로 주석이 달린 부분만 잘라내어 자주색으로 표시했습니다. 굳이 설명이 필요 없어 보입니다.

실제 적용

위와 같이 작업을 한 뒤에 저장을 하고 블로그 문서를 웹브라우저로 열면 됩니다.

웹브라우저에서 본 본문의 주석 위치

웹브라우저에서 본 본문의 주석 위치

위첨자로 처리된 숫자 2(2)에 주석이 링크되어 있다. 그 숫자를 클릭하면 주석 위치로 이동한다.

웹브라우저에서 본 문서 끝의 주석 내용

웹브라우저에서 본 문서 끝의 주석 내용

원래는 위의 그림과는 조금 다릅니다. 스크롤 바를 움직여서 위치를 약간 조절하였습니다.

좀 더 세련되게

BLUEnLIVE님이 블로그에 아주 좋은 방법을 제시해 놓으셨습니다. 각주(footnote) 풍선말 도우미라는 글입니다. 직접 가서 보시기 바랍니다. 참고로 보이는 모습은 아래와 같습니다.

풍선 도움말 예시

풍선 도움말 예시

관련 문서

내부 문서

외부 문서

이 글은 스프링노트에서 작성되었습니다.

글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

초보 운전자가 가장 자주 하는 실수는 브레이크 페달을 밟아야 할 때 가속 페달을 밟는 것이라는 기사를 읽은 적이 있습니다. 저 역시 그와 비슷한 실수를 한 적이 있습니다. 운전 학원 안에서 일어난 일이라서 별다른 사고 없이 끝났습니다만, 순간 당황했던 기억이 나네요.

그렇다면 블로그를 편집할 때 (X)HTML 등에 익숙하지 않은 초보자가 자주 하는 실수는? 바로 남겨야 할 것을 지워 버린다는 것입니다. 물론 백업본이 있지만, 백업본보다는 수정본에도 무언가 남기는 편이 더 나음에도 그러지를 않는다는 점이 최대의 실수입니다.

원본을 남기라. 주석을 넣으라.

가장 좋지 않은 습관은 남기기보다 지우기를 생각한다는 점입니다. 운전에서 가장 중요한 것은 가속이 아니 정지라는 점을 자주 잊듯이[각주:1] 초보 때는 흔적을 말끔히 지우려 드는 때가 많습니다. 하지만 고수가 될수록 뭔가 흔적을 더 남기려 합니다. 그 흔적은 언젠가 그 고수를 돕는 때가 생기기 때문이지요.

따라서 블로그를 편집할 때 가장 기본은 지우지 말라입니다. 절대 지워서는 안 됩니다. 어떻게든 원본을 남겨야 합니다. 원본을 남기는 방법에는 원본 내용을 복사하여 백업 파일로 만들어 두는 것이 가장 기본입니다. 그 다음으로 (X)HTML에서는 주석(comment)을 남기는 것이 중요합니다. 주석은 아무리 많아도 HTML 등에서는 처리가 되지 않고 무시합니다. 그저 아무것도 없는 무(無; blank)로 처리합니다. 이때 무(無)공백(space)과는 다릅니다. 공백의 경우 화면에서 띄어쓰기 1칸이라도 차지하지만, 무(無)는 아예 아무것도 보이지 않습니다. 따라서 주석으로 처리하면, 지우지 않고도 지운 것과 동일한 효과를 가집니다.

주석 예시 1

[code html; highlight: (5)] <div class="TD_album">     <div class="TD_thumbing">[#\#_item_thumbnail_##]</div>     <div class="TD_headline">         <a href="[#\#_item_link_##]">[#\#_item_title_##]</a>         <div class="TD_date">[#\#_item_date_##]</div>     </div> </div> [/code]

위의 코드는 되돌릴 수 없는 html 수공법- 블로그이력서8 문서에 나타난 그림의 코드를 나름대로 복원해 본 것입니다. 이때 날짜에 해당하는 부분은 아마도 date(날짜)라는 낱말이 있는 <div class="TD_date">[##_item_date_##]</div> 부분으로 여겨집니다. 대부분 날짜 부분을 삭제한다고 했을 때 아래와 같이 바꿉니다.

[code html] <div class="TD_album">     <div class="TD_thumbing">[#\#_item_thumbnail_##]</div>     <div class="TD_headline">         <a href="[#\#_item_link_##]">[#\#_item_title_##]</a>     </div> </div> [/code]

물론 이 방법이 가장 간단합니다. 하지만 장기적으로 볼 때는 좋지 않습니다. 무슨 소리인지 이해할 수 없다고요? 예, 저도 처음에는 이해할 수 없습니다.

아무튼 백문이 불여일견!! 주석으로 처리해 보겠습니다.

[code html; highlight: (5, 6)] <div class="TD_album">     <div class="TD_thumbing">[#\#_item_thumbnail_##]</div>     <div class="TD_headline">         <a href="[#\#_item_link_##]">[#\#_item_title_##]</a> <!-- 아이템 날짜 제거 : 2010년 2월 7일 --> <!--        <div class="TD_date">[#\#_item_date_##]</div> -->     </div> </div> [/code]

앞의 코드와 위의 코드는 화면에 같은 결과를 보여줍니다. 그러나 나중에 고쳐야 하거나 다시 되살려야 한다면 앞의 코드보다 위의 코드가 훨씬 낫습니다. 다만 보통 때는 <!-- 아이템 날짜 제거 : 2010년 2월 7일 -->라는 주석은 달지 않습니다. 그러나 달아 두면 편합니다.

주석 예시 2

꼭 화면에 나타내지 않을 내용만 주석으로 처리하는 것이 아닙니다. 무엇인가를 설명할 때도 사용합니다. 자세한 사항은 IE6 No More 수정 문서에서 처음 두 코드와 뒤의 두 코드를 비교해 보기 바랍니다.

그 코드에서 보면 새로 추가한 부분의 시작과 끝을 주석으로 나타내고 있습니다.

[code html; highlight: (1, 9)] <!-- IE6 No More 배너 시작 --> <!--[if lt IE 7]> <div style='border: 1px solid #F7941D; background: #FEEFDA; text-align: center; clear: both; height: 75px; position: relative;'>     <div style='position: absolute; right: 3px; top: 3px; font-family: courier new; font-weight: bold;'><a href='#' onclick='javascript:this.parentNode.parentNode.style.display="none"; return false;'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-cornerx.jpg' style='border: none;' alt='Close this notice'/></a></div> ... 내용 ...     </div> </div> <![endif]--> <!-- IE6 No More 배너 끝 --> [/code]

위와 같이 해 두면 나중에 코드를 고쳐야 할 때 코드 폴딩(코드 접기)를 지원하지 않는 편집기에서 그 시작과 끝을 찾기가 쉽습니다. 또한 기왕 주석을 다는 김에 그 코드의 쓰임새나 수정한 날짜 등을 함께 넣으면 좋습니다.

관련 문서

내부 문서

외부 문서

이 글은 스프링노트에서 작성되었습니다.


  1. 오토매틱 시스템의 자동차를 운전할 때 자동차는 브레이크 페달에서 발 떼면 움직입니다. 다시 말해 기어가 중립 상태만 아니라면 어떻게든 움직이게 된다는 뜻이지요. 그러나 정지는 항상 사용자가 브레이크를 밟거나 기어를 중립 상태로 놓아야만 가능합니다. 또한 가속은 운전자의 생명을 위협하는 요소가 커지지만, 정지는 운전자의 생명을 위협하는 요소가 줄어듭니다. 이런 점에서 가속보다 정지가 더 중요하다고 생각합니다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

한컴오피스2010 베타버전 버그 31 - ᄒᆞᆫ에서 다른 이름으로 저장하기와 주석 표기 문제

ᄒᆞᆫ글2010 베타버전에서 다른 이름으로 저장하기를 통해 HTML 문서를 만들거나 블로그로 올리기를 통해 블로그에 올린 게시물에 나타나는 주석과 관련한 HTML 태그 표기 때문에 약간의 오류가 생기고 있음을 발견했습니다.

  • 참고 : 본문에서는 블로그로 올리기 문제만 다루었으나, 다른 이름으로 저장 - 인터넷 문서도 같은 벌레가 나타나고 있습니다.

벌레의 유형

ᄒᆞᆫ글 씨! 이 버그는 반드시 고쳐 주셔야겠습니다. 이 버그가 고쳐지지 않으면 ᄒᆞᆫ글에서 작성한 주석은 HTML로 고쳤을 때 대부분 자리 표시에 불과하게 됩니다.

개발자의 답변

2010년 2월 5일 버그 리포팅을 한 상태입니다.

벌레의 발견

이 벌레는 우연히 블로그 - (X)HTML 태그 표기 문제 문서를 다시 살피다가 발견했습니다. 그 문서에서 주석의 링크를 클릭했음에도 이동하지 않아서 문제가 있음을 알게 되었습니다.

티스토리 및 텍스트큐브의 주석

티스토리와 텍스트큐브는 태터툴즈를 사용하는 블로그이므로 주석의 동작도 거의 비슷합니다.

일단 제 블로그의 7-Zip 소개 글을 살펴보겠습니다.

블로그에 나타난 주석 (빨간 동그라미 안쪽)

블로그에 나타난 주석 (빨간 동그라미 안쪽)

위 그림에서 빨간 동그라미 안쪽에 주석이 있습니다. 이 주석을 클릭하면 주석을 나타내는 부분으로 이동합니다.

주석 부분으로 이동한 뒤의 화면

주석 부분으로 이동한 뒤의 화면

주석 부분으로 이동하면 위와 같은 화면이 됩니다. 이때 [본문으로](파란 네모 부분)를 클릭하면 이 주석을 호출한 곳으로 이동합니다.

[본문으로]를 클릭했을 때의 화면

[본문으로]를 클릭했을 때의 화면

앞서 [본문으로]를 클릭하면 위와 같이 이동을 해 줍니다.

ᄒᆞᆫ글 2010 베타에서 출력한 주석의 동작

테스트 블로그의 예제 문서를 이용하여 테스트하겠습니다. 참고로 이 예제 문서는 IE6와 파이어폭스에서 서로 다른 결과를 보여줍니다. 여기에서는 파이어폭스 3.5 버전을 이용하겠습니다. 첨언하자면, 여기에 사용한 HTML 코드가 올바르지 않기 때문에 동작하지 않아야 정상입니다. 다시 말해 동작하는 IE6의 경우가 틀린 경우이지 파이어폭스가 틀린 것은 아닙니다.

ᄒᆞᆫ글에서 블로그로 올린 주석이 있는 문서

ᄒᆞᆫ글에서 블로그로 올린 주석이 있는 문서

위의 ᄒᆞᆫ글에서 블로그로 올린 주석이 있는 문서에서 주석을 클릭하면? 아래 그림처럼 됩니다.

이동은 않고 주소 표시줄만 바뀐 화면

이동은 않고 주소 표시줄만 바뀐 화면

위 그림처럼 이동은 하지 않았습니다. 그저 주소 표시줄만 바뀌었죠.

벌레 분석

코드 보기

앞서 발견한 두 경우의 HTML 코드를 분석해 보겠습니다.

티스토리 주석의 HTML 코드

티스토리 주석은 아래와 같습니다.

티스토리의 주석 표시 부분의 HTML 코드

티스토리의 주석 표시 부분의 HTML 코드


티스토리의 주석 내용 부분의 HTML 코드

티스토리의 주석 내용 부분의 HTML 코드

ᄒᆞᆫ글에서 블로그로 올린 문서의 HTML 코드

예제 문서의 HTML 코드는 다음과 같습니다.

블로그로 올린 문서의 주석 표시 부분의 HTML 코드

블로그로 올린 문서의 주석 표시 부분의 HTML 코드

앞서의 실험에서는 주석 내용 부분은 나타나지 않았지만, 여기에서는 주석 내용 부분도 HTML 코드를 나타내 보겠습니다.

블로그로 올린 문서의 주석 내용 부분의 HTML 코드

블로그로 올린 문서의 주석 내용 부분의 HTML 코드

코드 간략화 및 구조 분석

코드가 복잡하므로 간략하게 구조만 나타내 보겠습니다. 아울러 생략된 부분도 함께 나타내겠습니다.

먼저 티스토리 주석의 HTML 구조입니다.

[code html] <p>본문 내용 1<sup class="footnote"><a id="footnote_link_208_1" href="#footnote_208_1"><span style="display: none;">[각주:</span>1<span style="display: none;">]</span></a></sup>)</p> <p>본문 내용 2</p> <p>본문 내용 3</p> <div class="footnotes">     <ol class="footnotes">         <li id="footnote_208_1">주석 내용 1<a href="#footnote_link_208_1">[본문으로]</a></li>     </ol> </div> [/code]

다음은 블로그로 올린 문서의 HTML 구조입니다.

[code html] <p class="HStyle0">본문 내용 1<a href="#FOOTNOTE1"><sup>1)</sup></a></p> <p class="HStyle0">본문 내용 2</p> <p class="HStyle0">본문 내용 3</p> <hr align="left" width="300px"> <p class="HStyle11"><a name="#FOOTNOTE1">1)&nbsp;주석 내용 1</a></p> [/code]

위 두 코드에서 차이점은 (1) id와 name의 차이, (2) 링크를 이용한 왕복과 편도, (3) 링크 대상을 가리키는 이름의 차이(# 표시가 있느냐 없느냐)입니다. 일단 id와 name의 차이는 여러 문서를 함께 볼 경우에는 문제가 생기지만, 예제 문서는 오직 1개의 문서만을 화면에 표시하고 있으므로 이게 문제는 아닙니다. 그 다음으로 링크를 이용한 왕복이나 편도 이동이냐는 전혀 문젯거리가 아닙니다. 넘어가죠. 마지막으로 링크 대상을 가리킬 때 # 표시를 붙이느냐 마느냐는 상당히 차이가 큽니다.

일단 # 표시는 문서 내부의 이동 표시임을 나타내고 있습니다. 보통 # 표시 다음에는 id나 name로 표시하는 객체 이름(Object name)이 오게 됩니다. 그렇다면 # 자체가 객체 이름이냐? 그렇지는 않습니다. #은 문서와 문서 내부의 객체 이름과의 구분을 해 주는 표시일 뿐입니다. 다시 말해 #을 붙여서 id나 name을 표시하지는 않는다는 뜻입니다. 과거에는 #을 붙여서 표시하여도 호환성에 문제가 없었으나, 지금은 이 부분에 대해 엄격히 검사하고 있습니다. 현재 # 표시가 붙어 있어도 이동이 가능한 웹브라우저는 IE 계열뿐이며, 파이어폭스 등의 모질라/게코 계열이나 오페라 계열의 웹브라우저는 # 표시가 붙은 객체로의 이동을 지원하지 않습니다.

그러므로 위의 코드는 다음과 같이 고쳐야 합니다.

[code html] <p class="HStyle0">본문 내용 1<a href="#FOOTNOTE1"><sup>1)</sup></a></p> <p class="HStyle0">본문 내용 2</p> <p class="HStyle0">본문 내용 3</p> <hr align="left" width="300px"> <p class="HStyle11"><a name="FOOTNOTE1">1)&nbsp;주석 내용 1</a></p> [/code]

맨 마지막 줄에서 # 표시를 떼었습니다.

참고로 테스트 블로그에 이 부분에 대해 시험할 예제 문서(예제 - 주석과 위치 이동)를 올려 두었습니다. 직접 보시고 시험해 보시기 바랍니다. 참고로 주석 1은 정상적으로 이동이 가능하고, 주석 2는 IE 계열에서면 이동이 가능합니다.

결론

링크를 표시하면서 앵커(A 태그)에 name 속성에 # 문자가 들어간 이름을 넣었기 때문에 발생한 문제입니다. 그 문자를 떼면 정상적으로 이동이 가능합니다. 추가로 본문으로의 이동을 지원하도록 바꾸고, 아울러 앵커(A 태그) 때문에 밑줄이 생기는 현상도 제거하려면 다음과 같이 고치면 됩니다.

[code html] <p class="HStyle0">본문 내용 1<a id="FOOTNOTE_HWP_ARTICLE_[문서번호]_1" href="#FOOTNOTE_HWP_1"><sup>1)</sup></a></p> <p class="HStyle0">본문 내용 2</p> <p class="HStyle0">본문 내용 3</p> <div class="HStyle11">     <hr align="left" width="300px">     <ol start="1">         <li id="FOOTNOTE_HWP_1">주석 내용 1<a href="#FOOTNOTE_HWP_ARTICLE_[문서번호]_1">[본문으로]</a></li>     </ol> </div> [/code]

위와 같이 바꾸면 좀 더 구조적이고 효율적인 코드가 됩니다. 참고로 [문서번호]에 해당하는 값으로 치환해야 합니다. 그밖에 <ol start="1">의 경우는 시작하는 주석 번호1이라는 뜻입니다. 주석 번호를 하나하나 지정할 필요가 없다는 뜻입니다. 아무튼 이것을 적용하는 문제는 ᄒᆞᆫ글 개발자가 해결할 일이겠지요.

관련 벌레

이 벌레와 관련이 있는 벌레는 다음과 같습니다.

관련 문서

내부 문서

외부 문서

이 글은 스프링노트에서 작성되었습니다.


글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

한컴오피스 베타버전 버그 18 - ᄒᆞᆫ글과 블로그 8 - 주석 2 - (X)HTML 태그 표기 문제

주석에 대한 사항을 점검하면서 한 가지 더 이상한 점을 발견하였습니다. 바로 (X)HTML 태그 표기 문제였습니다.

1. 벌레의 유형

ᄒᆞᆫ글 씨! (X)HTML 태그에서 a 태그 안에는 p 태그가 오지 않습니다.

2. 개발자의 답변

2010년 1월 11일 버그 리포팅을 한 상태입니다.

3. 벌레의 발견

3.1. 우연히 발견한 버그

테스트 블로그에 올린 주석이 있는 문서의 소스를 살피다가 발견하였습니다.

그림 1 각주를 블로그에 나타나게 만든 화면

그림 2 소스 보기 화면

저 소스는 누구나 확인할 수 있습니다. 위 코드를 분석하면 다음과 같은 구조를 보여줍니다.

<hr>
<a name="name1">
        <p>Text1</p>
</a>
<br>
<a name="name2">
        <p>Text2</p>
</a>

앞서 제기한 주석의 br 태그 문제뿐만 아니라 다른 문제가 들어 있었습니다. 바로 a 태그와 p 태그의 중첩 문제였습니다. 얼핏 보면 아무 문제도 없습니다. 대부분의 웹브라우저도 a 태그 안에 p 태그가 중첩되어도 제대로 보여줍니다. 하지만 엄밀히 말해 위와 같은 구조는 아래처럼 바뀌어야 합니다.

<hr>
<p>

        <a name="name1">Text1</a>

</p>
<br>
<p>
        <a name="name2">Text2</a>
</p>

3.2. Markup 검사 서비스

테스트 블로그 문서에 대해 Markup 검사 서비스를 해 보았습니다. 바로 저 부분을 체크하는지를 알기 위해서입니다. (검사 결과 보기)

그림 3 에러 부분만 잘라낸 화면

<a>와 같은 인라인 요소 안에는 <p>와 같은 블록 단위 요소를 넣을 수 없음을 알려주고 있습니다.

4. 벌레의 원인

HTML 데이터를 만들 때 HTML 문법에 어긋나게 구성하였기 때문에 발생한 벌레입니다. 이는 ᄒᆞᆫ글 측에서 좀 더 주의를 기울였다면 사전에 막을 수 있는 벌레라는 점에서 아쉬움이 남습니다.

5. 비슷한 벌레

[벌레와 팁/버그] - HTML 태그 해석 오류 문제

[벌레와 팁/버그] - 블로그 - 주석 사이의 간격

6. 관련 문서

6.1. 내부 문서

6.2. 외부 문서 - 테스트 블로그

예제 3

예제 5


이 글은 ᄒᆞᆫ글 2010 베타버전에서 작성하였습니다.

글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

2009년 한 해 동안 소개한 버그 가운데 실제로는 버그(또는 오류)가 아니었거나, 이미 수정된 버그 등이 있는지를 살펴보았다. 기간은 2009년 3월부터 11월 30일까지입니다. 12월은 내년으로 넘겨야 할 듯합니다.,

  1. 2009/11/29 스프링노트 : 문자 인코딩 관련 사항 : 관점에 따라 버그일 수도 있고 아닐 수도 있다.
  2. 2009/11/27 티스토리 BBCode 오류 : 제작자가 수정하는 중이라는 답변을 받았다. 아직 고쳐지지 않았다.
  3. 2009/11/03 스프링노트 : 첨부파일 대화상자의 옵션 가리기 벌레 : 개발자에게 전달하겠다는 답변을 받았다. 아직 고쳐지지 않았다.
  4. 2009/11/02 한/글/ 2007에서 나타난 구결 표기 오류 2 : 이 사항은 버그가 아니다. 내가 잘못 알았다.
  5. 2009/10/30 한/글/ 2007에서 나타난 구결 표기 오류 1 : 이 사항은 버그가 아니다. 내가 잘못 알았다.
  6. 2009/06/18 광고인가? 사기인가? : 광고 문구를 교묘히 조작하여 클릭을 유도한다. 구글 광고와는 다른 사기성 광고
  7. 2009/05/30 티스토리 주석에서 \ 문자 표기 문제 : 출력 과정에서 정확히 나타나지 않는 버그이다. 아직 고쳐지지 않았다.
  8. 2009/05/28 티스토리에서 주석이 제대로 인식되지 않는 현상 : 출력 과정에서 정확히 나타나지 않는 버그이다. 아직 고쳐지지 않았다.
  9. 2009/05/16 아크로에디트 : 배치파일 주석 문법 강조 기능 : 잘 고쳐져 있다.
  10. 2009/05/15 스프링노트 : 공개 및 비공개 설정에서 이상한 점 : 잘 고쳐져 있다.
  11. 2009/05/14 스프링노트 : 일부 글자 속성이 제대로 지정되지 않는 벌레 : 일부는 고쳐졌으나, 일부는 고쳐지지 않았다.
  12. 2009/05/10 버추얼박스 v2.2.2 설치 오류 : 한글 경로명 문제 : 최신 버전인 VirtualBox v3.1.0 빌드55467 (윈도 버전)에서도 고쳐지지 않았다. 이는 단순히 설치 프로그램의 문제이며, 프로그램 실행에는 아무런 영향도 없습니다.
  13. 2009/04/28 V3 계열 백신의 폴더 경로명 표기 벌레 : 고쳐지지 않았다.
  14. 2009/04/27 스프링노트의 링크 편집 벌레 : 잘 고쳐져 있다.
  15. 2009/04/26 스프링노트의 태그 표기 벌레 : 잘 고쳐져 있다.
  16. 2009/04/11 버추얼박스 2.2.0 네트워크 접속 문제 : 후속 버전에서 잘 고쳐져 있다.
  17. 2009/04/07 네이버 결계 벌레 : 현재 전혀 나아지지 않았다. 여전히 내 네이버 블로그에서 그림 파일을 불러올 수 없다.
  18. 2009/04/05 네이버 뻥튀기 벌레 : 현재 전혀 나아지지 않았다. 여전히 내 네이버 블로그에서 그림 파일을 불러올 수 없다.
  19. 2009/03/31 벌레 잡는 알약, 벌레에 먹히다 2 : 확인하지 않음.
  20. 2009/03/30 티스토리 파일 첨부 창 잘라먹기 : 잘 고쳐져 있다.
  21. 2009/03/27 벌레 잡는 알약, 벌레에 먹히다 : 확인하지 않음.
  22. 2009/03/27 네이버의 나눔고딕코딩 선문자 오류 : 선문자를 정확히 표시해 준다.
  23. 2009/03/26 아크로에디트 구문 강조 오류 : 일부는 고쳐졌지만, 일부(예컨대 @의 처리)는 고쳐지지 않았다.
  24. 2009/03/26 Offree.net에서 발견한 이상한 점 : 사이트의 문제가 아니라 IE와 파이어폭스의 문제였다.
  25. 2009/03/21 한/글/ 2005에 나타난 구결 표기 오류 : 이 사항은 버그가 아니다. 내가 잘못 알았다.
  26. 2009/03/21 티스토리 그림 파일 업로드 벌레 : 티스토리에서 수정해 주었다.

이 글은 스프링노트에서 작성되었습니다.


글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

나는 스프링노트에서 글을 작성하여 티스토리에 글을 올리고 있다. 그런데 가끔 엉뚱한 현상을 보이는 일이 생기곤 한다. 바로 주석[각주:1]의 화면 표시에 대한 문제이다.

벌레의 유형

자기 본모습을 헷갈려하는 벌레이다.

벌레의 발견

[벌레와 팁] - ISO/UDF 이미지 파일 보기 및 풀기 1 문서에서 이상한 현상을 발견하였다. 백 번 듣기보다 한 번 보는 것이 낫다.

주석(각주) 표지가 그대로 드러나는 화면

주석(각주) 표지가 그대로 드러나는 화면

위 그림에서 없어서Tistory-X-Footnote-0.png 라는 부분이 그것이다. 주석 표시인 Tistory-X-Footnote-0.png은 원래 편집 화면에서만 보이고, 웹에 게시한 뒤에는 주석의 실제 내용으로 치환되어야 한다. 또한 Tistory-X-Footnote-0.png 표시 대신에 주석을 나타내는 수가 나타나야 한다.

그러나 주석(각주)은 어디에도 보이지 않는다.

그러나 주석(각주)은 어디에도 보이지 않는다.

위와 같이 보이며 애써 작성한 각주는 나타나지 않는다. 정상 작동할 때는 아래와 같다.

정상 표시되는 주석(각주)

정상 표시되는 주석(각주)

위 그림에서 Tistory-X-Footnote-1.png 부분이 정상적으로 나타난 주석이며, 그 아래에 주석의 실제 내용이 나타나 있다.

벌레 분석

이것은 스프링노트에서 티스토리의 주석을 나타내 주지 못해서 아래 그림처럼 입력하는 일과 관련이 있어 보인다.

스프링노트에서 티스토리의 주석을 표시하는 방법

스프링노트에서 티스토리의 주석을 표시하는 방법

다시 말해 위 그림처럼 [footnote] 치환자를 직접 입력하고 있어서 당장은 문제가 없어도 나중에 문제가 생긴다고 볼 수 있다. 이것을 따로 떼면 아래와 같다.

빨강 네모로 표시한 부분이 주석을 입력한 부분이다.

빨강 네모로 표시한 부분이 주석을 입력한 부분이다.

그러나 티스토리에 게시/출판하였을 때 편집창에서 나타나는 HTML 코드는 스프링노드에서 [footnote]를 수동으로 입력했을 때나, 티스토리에서 주석(각주) 기능을 이용해서 달았을 때나 같다.

주석 표시에서 오류가 났을 때의 편집화면의 HTML 모드

주석 표시에서 오류가 났을 때의 편집화면의 HTML 모드

문제가 생긴 주석 표시 부분 (파란색 네모 부분)

문제가 생긴 주석 표시 부분 (파란색 네모 부분)

위 그림에 보면 footnote 부분에 조금 특별함이 있기는 하다. 그렇다고 이것이 주석을 잘못 나타내는 이유로 보기는 힘들다.

주석 표시를 정상적으로 했을 때의 편집화면의 HTML 모드

주석 표시를 정상적으로 했을 때의 편집화면의 HTML 모드

비교하기 위해 잘라낸 주석 표시 부분 (파란색 네모 부분)

비교하기 위해 잘라낸 주석 표시 부분 (파란색 네모 부분)

정상적으로 보일 때도 오류가 났을 때와 같은 방식으로 편집창에는 나타난다.

벌레 잡기

이 벌레를 잡기 위해서는 특별한 방법이 없다. 그저 주석이 정상적으로 표시될 때까지 해당 문서를 편집 창에 보였다가 저장하기를 반복하는 수밖에 없다.

제작자/제공자의 답변

2009년 5월 29일 아침에 오류를 보고한 상태이다.

관련 문서

내부 문서

외부 문서

이 글은 스프링노트에서 작성되었습니다.


  1. Footnote라는 영어를 "각주"로 번역하고 있다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

아크로에디트snoopy 님윈도우 7 언어팩 통합/삭제 가이드에 나타난 사항을 배치파일로 만들다가 벌레를 하나 발견하였다.

벌레의 유형

단순히 화면 출력을 잘못하는 벌레로 여겨졌다.

하지만 문법 강조에 관한 기능을 살펴본 끝에 대부분 아크로 에디트에 사는 벌레가 아니라, 처음에 문법 강조를 만들 때 해당 문법 강조 설정에 숨어 있던 벌레로 판명났다. 이 설정 파일은 내가 만든 것이 아니라 마소리스 님이 만든 것을 수정해서 쓰고 있었고, 거기에 숨어 있던 벌레였다. 물론 마지막에 가서 아크로에디트에 사는 벌레 하나를 찾을 수 있었다.

벌레 정보

  • 아크로에디트 버전 0.9 / 빌드 0.9.19.84 (2008년 12월 17일자)에서 발견하였고, 이전 버전 확인하지 못하였다.
  • 배치파일 구문 강조에서 나타났다.

벌레의 발견

배치 파일에서 "ECHO Do you want to remove other language package ? [Y/n]"라는 명령문을 입력했다가 다음과 같이 나타나서 벌레가 있음을 알게 되었다.

배치파일 문법 강조 오류

배치파일 문법 강조에서 rem이 나온 행에서 그 뒤로는 모두 주석으로 인식되는 벌레가 있다.

이때 배치파일 문법 강조 설정은 다음과 같다.

배치파일 문법 강조 설정

배치파일 문법 강조 설정.

위에서 보다시피 배치파일 문법 강조에서 행 주석으로 "rem"과 "REM"은 인식하도록 했다(파란색 네모 부분). 그런데 이 부분에서 무언가 잘못된 처리를 하고 있기 때문에 벌레가 나타난다고 여겨진다.

정말로 벌레인가? 1

아무튼 첫 번째 그림에서 129행 부분만을 떼어 내어 여러 가지 측면에서 살펴보았다.

예제 1-1. 맨 처음 발견한 벌레

예제 1-1. 맨 처음 발견한 벌레

예제 1-2. 대문자로 바꾸어도 마찬가지

예제 1-2. 대문자로 바꾸어도 마찬가지

예제 1-3. 큰따옴표(

예제 1-3. 큰따옴표(

예제 1-4. 작은따옴표(' ')로 묶어도 마찬가지

예제 1-4. 작은따옴표(' ')로 묶어도 마찬가지

예제 1-3과 1-4에서는 조금 뜻밖이었다. 보통 큰따옴표나 작은따옴표로 묶이면 문자열로 인식하고, 그럼으로써 행 주석 기호가 인식되지 않아야 하기 때문이다. 그래서 현재의 배치파일 문법 강조 설정에서 문자열 시작 문자(빨간색 네모 부분)에 "' (큰따옴표와 작은따옴표를 연속으로 입력)라고 지정함으로써 예제 1-3과 1-4를 해결하였다. 그 그림은 다음과 같다.

예제 2-1. 작은따옴표로 문자열 처리

예제 2-1. 작은따옴표로 문자열 처리

예제 2-1. 큰따옴표로 문자열 처리

예제 2-1. 큰따옴표로 문자열 처리

결국 예제 1-1과 1-2는 벌레로 여겨지지만, 예제 1-3과 1-4는 벌레가 아니었다.

정말로 벌레인가? 2

앞서 벌레로 여겨진 예제 1-1과 1-2를 다시 살펴보자.

예제 1-1. 맨 처음 발견한 벌레

예제 1-1. 맨 처음 발견한 벌레

여기에서 하나 짚고 넘어가야 할 문제가 있었다. 바로 배치파일에서 행 주석을 나타내는 지시어인 REM명령어라는 사실이다. 이게 왜 중요하냐고? 명령어 다음에 한 칸 이상의 공백이 있어야 하기 때문에 중요하다.

수정한 배치파일 문법 강조 설정

수정한 배치파일 문법 강조 설정.

위의 그림처럼 행 주석을 "rem"과 "REM"에서 "rem "과 "REM "(뒤에 공백 한 칸 있음)로 바꾸었다.

예제 3-1.

예제 3-1.

예제 3-2.

예제 3-2.

에제 3-2에서는 왜 주석으로 인식될까? 이는 당연하다. 명령어처럼 인식하도록 뒤에 공백을 넣었지만, 실제로 명령어 인식되지는 않았기 때문이다. 아크로에디트를 수정하지 않고 문법 강조 설정을 수정해서는 여기가 한계인 셈이다.

아무튼 예제 3-2에서 아크로에디트가 가진 벌레 하나를 찾을 수 있었다.

또 다른 상황

아크로에디트 구문 강조 오류 문서에서 살펴본 벌레를 상기하자. 그 글에서는 아크로에디트에서 rEm 등이 주석으로 처리되지 않는 벌레가 있음을 보였다. 여기에서도 그 벌레가 적용되는지를 살펴보았다.

예제 4-1.

예제 4-1.

예제 4-2.

예제 4-2.

벌레와 벌레가 만나자 한쪽은 작동하지 못하게 되었다.

파일

마소리스 님이 만든 배치파일 문법 강조 파일은 더 이상 유효하지 않다고 생각하여 이번에 수정한 파일을 첨부한다.

  • batch.stx (5174 바이트)
  • CRC32 : 857C74D9
  • MD5 : ac9cc62baa2f4d56330eef3449b45101
  • SHA : ab6d03405ff9c649f15ec5bb65745ad2006ff66b

제작자/제공자의 답변

2009년 5월 16일 현재 AcroEdit - 질문 및 답변에 글을 올린 상태이다.

관련 문서

내부 문서

외부 문서

이 글은 스프링노트에서 작성되었습니다.


글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

배치파일에서 좀 더 자세한 화면 출력과 배치파일의 가독성에 대해 알아보자.

화면 출력에서는 빈 줄과 ECHO와는 관계를 알게 되며, 배치파일의 가독성에서는 프로그래밍 일반에서 다루는 보기 좋은 코딩에 대해서 알게 됨을 목표로 하고 있다.

빈 줄 출력

배치파일에서 빈줄을 출력하는 일은 상당히 쉬우면서도 상당히 어렵다. 알기만 하면 아주 간단하지만, 모를 때는 갑갑하게 만드는 것이 "빈 줄 출력"이다.

첫 번째 시도

실험적인 코드를 만들어 보자.

  • 소스 코드 : 예제 4
    @echo off
    rem 예제 4 : 빈 줄 출력 예제
    rem 파일명 : exam04.bat
    rem 지은이 : koc2000/SALM
    rem 저작권 : GPL v3

    echo 예제 4.

    echo 이것은 빈 줄 출력 예제 4입니다.

    echo 끝.

메모장을 열어서 위와 같은 코드를 입력하고 실행시켜 보기 바란다. 엔터를 쳐서 빈줄을 만든 만큼 빈 줄이 화면에 출력되는가?

20090326ex4.png
<예제4 출력화면>

사실 이것은 그리 놀라운 일이 아니다.

지난 글에서 말한 ECHO 명령의 역할이 무엇인지를 생각하면 당연한 결과이다. ECHO OFF 는 "사용자에게 보이는 명령어 반향을 끈다"라는 뜻이었다. <Enter>를 쳐서 빈 줄을 만든 경우 사용자에게 보이는 명령어 반향이 공백 1줄(빈 줄)이었는데, 그 명령어 반향을 감추게 되면, <Enter>로써 만든 빈 줄이 사라지는 효과가 생긴다. 그렇다고 ECHO ON 을 하여 명령어 반향을 켜서 지난번의 그 지저분한 화면을 보기도 조금 그렇다. 빈대 잡으려고 초가 삼간을 태우는 격이다.

앞서 말했듯이 배치파일에서 빈 줄을 출력하는 일은 상당히 쉬우면서도 상당히 어렵다.

또 다른 시도

방금 만든 exam04.bat 파일을 다음과 같이 편집하고 exam04-1.bat라는 이름으로 저장하자.

  • 소스 코드 : 예제 4
    rem 예제 4-1 : 화면에 간단한 말을 출력한다.
    rem 파일명 : exam04-1.bat
    rem 지은이 : koc2000/SALM
    rem 저작권 : GPL v3
    echo 예제 4-1.
    echo _
    echo 이 프로그램은 화면 출력 예제 4-1입니다.
    echo _
    echo 끝.

실행해 보면, 아까와는 다른 결과가 나왔음을 알 수 있다. 위에서 주황색 바탕의 밑줄은 밑줄을 입력하라는 말이 아니라 스페이스 바를 한 번 눌러 빈칸을 만들라는 뜻이다. 빈칸은 하나가 아니라 훨씬 많아도 상관없다.

20090326ex4-1.png
<예제4-1 출력화면>

이때 알 수 있는 것은 빈칸의 수가 아무리 많아도 같은 결과가 나온다는 점이다.

그렇다면 빈칸이라도 출력이 되어야 옳지 않을까?

이렇게 묻는 사람이 있다면 이렇게 답해 주겠다.

방금 말했다. 빈칸의 수가 아무리 많아도 같은 결과가 나온다.

이 말은 명령어 다음에 빈칸이 하나이든 백이든, 아니면 빈칸이 없든 같은 결과가 나온다는 뜻이다. 즉 ECHO 다음에, 다른 옵션이 없다면, 빈칸이 있든 없든 같은 의미를 가지게 된다는 말이다.

ECHO 명령의 기능은 (1) 메시지를 보여주거나 (2) 명령어 반향을 켜거나 끄고(기본값은 켠다), (3) ECHO 명령만 입력했을 때 반향 설정값을 보여준다. 이렇게 세 가지였다. 이 가운데 (3)번에 해당한다.

결국 ECHO 뒤에 빈칸을 넣어서 빈 줄을 입력하게 하는 방법도 실패다.

고전적인 방법

1980년대나 1990년대 초에 나온 컴퓨터 서적에서는 대개 아스키문자 255번을 이용하라고 하고 있다. 물론 나는 이 방법을 배우지는 않았다. 내가 컴퓨터 학원에 다닐 때는 좀 더 간단한 방법을 배웠기 때문이다.

고작 1백 년도 되지 않은 컴퓨터 역사에서 "고전"이 있을까마는 따지지 말자. "좀 더 오래된"이라는 의미를 부여하기 위해 쓴 말일 뿐이다.

우선 이 작업을 위해서는 exam04-1.bat 파일을 복사하여 exam04-2.bat 파일을 만든다. (복사 방법과 이름 바꾸는 방법은 모두 알고 있으리라 생각하고 생략하겠다. 모르면 댓글 남기기 바란다.)

명령 프롬프트에서 다음과 같이 입력한다.

edit exam04-2.bat

음, 뭔가 달라져 보이지 않는가?

<도스 에디터 화면>

<도스 에디터 화면>

빈 줄을 출력하려고 만든 줄로 이동하여 ECHO 뒤에 커서를 위치시키자. (위의 화면은 이미 이동한 화면이다.)

그 자리에서 <Alt>를 누른 상태에서 오른쪽 숫자판에서 2, 5, 5를 차례대로 누른 다음 키보드에서 손을 떼며 화면을 잘 살피기 바란다. (방금 했던 작업은 키보드를 이용하여 아스키문자 255번을 입력하는 작업이다.)

<도스 에디터 화면 : 255번 문자 입력 화면>

<도스 에디터 화면 : 255번 문자 입력 화면>

화면에는 아무것도 나타나지 않고, 그저 한 칸 오른쪽으로 옮겼다고 여겨질 뿐이다. 그러나 자신이 했던 일을 믿어라. 분명히 저기에는 아스키문자 255번이 입력되어 있다.

아래쪽으로 옮겨서 방금 그 작업을 다시 하자. 이때 주의할 점은 반드시 ECHO 뒤에 한 칸 공백을 둔 뒤에 아스키문자 255번을 입력해야 한다.

작업을 마쳤으면 저장하자. <Alt>를 한 번 누르면 왼쪽 상단의 [F/파일] 부분이 검게 바뀐다. 그 화면에서 F, S를 누른다. 다시 말해, <Alt>를 눌렀다 손을 떼고, F를 눌렀다가 손을 떼고, S를 눌렀다가 손을 떼면 저장이 된다.

저장도 마쳤으니 종료하자. 종료는 <Alt>, F, X 이다.

도스 상태에서 실행시켜 보자. 기대해도 좋다.

20090326ex4-2.png
<예제4-2 출력화면>

드디어 성공했다.

그러나 아스키문자 255번을 누르기 위해서 해야 할 일이 너무 많고 번거롭다. 물론 아크로에디트를 비롯한 많은 문서 편집기가 "아스키코드"(아스키문자) 값을 지원해 주지만, 모르는 사람도 많다. 특히 윈도의 기본 문서 편집기인 메모장에서는 아스키문자 255번을 입력할 수 없다.

좀 더 새로운 방법

아스키문자 255번을 입력하여 빈줄을 나타내는 방법은 너무 번거로웠다. 그렇게 해서 알려진 방법이 바로 문서화되지 않은 방법이다. (MS 제품과 관련한 팁에는 많은 "문서화되지 않은" 방법이 존재한다. 심지어 일부 팁은 마이크로소프트 홈페이지에서도 활용하고 있다. 그러나 어디까지나 "문서화되지 않은" 방법은 해당 버전에서만 유효하며, 다음 버전에서는 언제라도 사라질 수 있음을 기억하자.)

exam04-1.bat 파일을 복사하여 exam04-3.bat 파일을 만든다.

  1. @echo off
    rem 예제 4-3 : 화면에 간단한 말을 출력한다.
    rem 파일명 : exam04-3.bat
    rem 지은이 : koc2000/SALM
    rem 저작권 : GPL v3
    echo 예제 4-3.
    echo.
    echo 이 프로그램은 화면 출력 예제 4-3입니다.
    echo.
    echo 끝.

빨간 색으로 표시된 점( . )이 추가된 부분이다. 그 부분을 잘 보기 바란다.

실행하면 다음과 같다.

20090326ex4-3.png
<예제4-3 출력화면>

  1. echo.

저 코드가 "빈 줄"을 출력하는 코드인 셈이다. 특이하게 ECHO 명령에 붙여서 써야 한다. 띄어쓰기를 하면? 직접 해보기를 바란다.

아주 간단하면서 쉬운 방법이다. 모를 때는 갑갑하게 만든 빈 줄 출력이지만, 알게 되면 어이 없을 정도로 쉽다. (물론 세상사가 대부분 그렇다. 오죽하면 "콜롬버스의 달걀"이라는 말이 생겼을까? 당시 "그냥 서쪽으로 가기만 하면 되는 쉬운 일이다."라고 주장하면서 콜럼버스의 업적을 폄하하는 사람들이 생겨나자, 콜럼버스가 자신이 신대륙을 발견한 일을 비유하기 위해 연회 자리에서 달걀 한쪽을 깨뜨려 식탁에 세운 일은 있지만, 콜럼버스가 최초로 한 일은 아니다. 그것은 당시 민간에서도 행해지던 놀이 가운데 하나였다고 한다.)

배치파일의 가독성

가독성이 왜 좋아야 할까? 그건 배치파일을 사람이 직접 눈으로 보고 해석할 수 있기 때문이다. 그래서 일부에서는 다른 사람이 내가 짠 배치파일을 고치면 엉뚱하게 동작하게 만들기도 하지만, 그것은 그다지 좋은 습관이 아니다. 그럴 경우 자신도 알아보기 힘들기 때문이다. (이럴 경우 실제 소스는 자신이 가지고, 남에게 보여도 되는 복잡한 소스를 컴퓨터에 설치해 두기도 하지만, 번거로운 방법이다.)

비단 배치파일뿐만 아니라 모든 프로그램 소스파일은 사람이 읽기 좋아야 고치기도 편하다. 물론 기계, 곧 컴퓨터에 맞추어 최적화를 시도해도 되지만, 그럴 경우 해당 부분을 모듈(흔히 함수 또는 서브함수)로 만들어 떼어낸 뒤 따로 설명을 붙이는 쪽이 낫다. 그래야 그 모듈은 신경쓰지 않고 전체 맥락에 집중할 수 있기 때문이다.

주석을 달고 가독성을 좋게 해야 하는 또 다른 이유로 배치파일은 한 번 만들어 두면 자주 고치지 않는다는 데 있다. 지금 만든 배치파일을 몇 달 뒤에 또는 몇 년 뒤에 알아볼 수 있을까? 장담할 수 없다. 나중에 고치려고 보면, 처음부터 다시 짜는 만큼 시간이 걸리기 마련이다. 주석을 달아두는 등 가독성을 좋게 해 두었다면 쉽고 빠르게 해결할 일인데 말이다.

가독성 높이기의 기본 : 주석 달기

잘 만들어졌지만, 배치파일 초보에게는 조금 파악하기 힘든 코드를 소개하겠다. 윈도98의 부팅 이미지에 있는 AutoExec.bat 파일의 일부이다.

  1. @ECHO OFF
    mshbios
    set EXPAND=YES
    SET DIRCMD=/O:N
    set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
    set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C
    cls
    call setramd.bat %LglDrv%
    set temp=c:\
    set tmp=c:\
    path=%RAMD%:\;a:\;%CDROM%:\
    copy command.com %RAMD%:\ > NUL
    set comspec=%RAMD%:\command.com
    copy extract.exe %RAMD%:\ > NUL
    copy readme.txt %RAMD%:\ > NUL

AutoExec.bat 파일의 첫 부분인 위 내용을 보고, 그것이 뜻하는 바를 곧바로 알 수 있다면 어느 정도 경지에 다다른 사람임에 틀림없다. 물론 저 뒷부분은 저렇게 붙어 있지 않다.

그런데 배치파일 초보가 위의 내용을 보고 각 행마다, 또는 여러 행이 어떤 의미를 가지는지 알 수 있을까? 그렇지 않으리라 생각한다. 

그러면 알기 힘든 이유는 무엇일까?

  • 우선 주석이 없다.

도스의 명령어를 알더라도 주석이 없어서 알기 힘들다. 전체적으로 쉬운 명령어를 쓰고 있지만, SET 환경 변수를 이용하는 부분에서, 그것이 무슨 역할을 하는지 알기 힘들다. 이는 CALL 명령어에서도 마찬가지이다.

  • 각 행간이 너무 촘촘히 붙어 있다.

사람의 눈과 두뇌는 서로 떨어져 있으면 관련이 적다고 여기게 된다. 반대로 서로 붙어 있으면 관련이 좀 더 많다고 여기게 된다. 이런 원리를 생각한다면, 위의 코드는 서로 연관이 적은 코드까지 한데 뭉쳐 있는 셈이다. 앞서 말했듯이 저 부분까지만 저렇게 다닥다닥 붙어 있어서 읽기 힘들게 되어 있고, 뒷부분은 연관이 있는 줄끼리는 붙고, 서로 연관이 적은 곳은 빈 줄을 두어 나누고 있다. 빈 줄을 두면 화면에는 출력되지 않아도 사람이 보기에는 좋다.

조금 수정해 보았다.

  1. @ECHO OFF
    rem ====================================
    rem  윈도98 설치 디스크
    rem ====================================
    rem 한글 바이오스 읽어오기
    mshbios
    rem 기본 환경 변수 설정
    set EXPAND=YES
    SET DIRCMD=/O:N
    rem LglDrv 환경 변수 설정
    rem 2행으로 설정한 이유는 한 줄에 적기보다 두 줄로 적어야 보기 좋고,
    rem 명령행의 길이 제한 때문
    set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
    set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C
    rem 화면을 지우고, 램드라이브 설정 작업
    cls
    call setramd.bat %LglDrv%
    rem 임시 디렉터리 변수 설정
    set temp=c:\
    set tmp=c:\
    rem 실행경로 변수 설정
    path=%RAMD%:\;a:\;%CDROM%:\
    rem COMSPEC 환경 변수 설정 : 파일 복사 후 설정.
    copy command.com %RAMD%:\ > NUL
    set comspec=%RAMD%:\command.com
    rem 작업을 위한 기본 파일 복사
    copy extract.exe %RAMD%:\ > NUL
    copy readme.txt %RAMD%:\ > NUL

아까보다야 낫지만 그래도 여전하다. 오히려 내용이 늘어서 보기 싫은 점도 있다.

왜? 앞서 말했듯이 코드가 너무 따닥따닥 붙어 있다. 그게 반드시 나쁘다는 말은 아니지만, 너무 붙어 있으면 배치파일 내용을 알기 힘들게 된다.

좀 더 보기 좋게 : 빈 줄 넣기

위의 경우에, 주석이 눈에 잘 들어오지 않는 이유가 코딩 속에 주석이 파묻혀 눈에 잘 띄지 않기 때문이다. 그럴 경우 몇 줄씩 관련 있는 부분을 묶고, 관련이 없는 부분과는 구별할 수 있게 줄 띄기를 하면 된다.

  1. @ECHO OFF
    rem ====================================
    rem  윈도98 설치 디스크
    rem ====================================
  2.  
  3. rem 한글 바이오스 읽어오기
    mshbios
  4.  
  5. rem 기본 환경 변수 설정
    set EXPAND=YES
    SET DIRCMD=/O:N
  6.  
  7. rem LglDrv 환경 변수 설정 : 램드라이브를 위한 환경 변수이다.
    rem 2행으로 설정한 이유
  8. rem    한 줄에 적기보다 두 줄로 적어야 보기 좋고,
    rem    명령행의 길이 제한 때문 (128 글자)
    set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
    set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C
  9.  
  10. rem 화면을 지운다.
    cls
  11.  
  12. rem 램드라이브 설정 작업
  13. rem setramd.bat : 실제로 램드라이브를 설정해 주는 배치파일
    call setramd.bat %LglDrv%
  14.  
  15. rem 임시 디렉터리 환경 변수 설정
    set temp=c:\
    set tmp=c:\
    rem 실행경로 환경 변수 설정
    path=%RAMD%:\;a:\;%CDROM%:\
  16.  
  17. rem COMSPEC 환경 변수 설정 : Command.com 파일 복사 후 설정.
    copy command.com %RAMD%:\ > NUL
    set comspec=%RAMD%:\command.com
    rem 작업을 위한 기본 파일 복사
    copy extract.exe %RAMD%:\ > NUL
    copy readme.txt %RAMD%:\ > NUL

위와 같이 바꾸는 방법은 번거롭다고 여겨질 수도 있다. 하지만 배치파일의 특성상 그 자신이 어떤 일을 할 수도 있지만, 대부분 다른 프로그램에게 일을 시키는 "통로" 역할을 하게 된다. 다시 말해 배치파일 자체에서 일을 하기보다 다른 프로그램에게 일을 시키는 프로그램이다. 그것을 위해 환경을 설정하는 것이야말로 배치파일의 역할이다. 이게 스크립트 언어의 특징이다. (물론 자신이 직접 어떤 역할을 수행하는 스크립트 언어도 존재하지만, 거기에는 대부분 전제 조건이 붙어 있다.)

코드에도 격이 있다. : 들여쓰기

배치파일을 짜다 보면 중요한 코드와 덜 중요한 코드가 있을 수 있다. 또한 한데 묶어서 관리할 부분과 따로 떼어서 관리할 부분이 생기게 된다. 위의 코드도 마찬가지이다.

  1. rem 임시 디렉터리 환경 변수 설정

특히 위의 "rem 임시 디렉터리 환경 변수 설정"에서는 더욱 그러하다. 따로 떼어 생각할 부분이 아니기 때문이다. 이럴 경우 해결할 방법은 바로 들여쓰기이다.

앞서 ECHO 명령에서 했던 설명을 또 되살리자.

명령어 다음에, 다른 옵션이 없다면, 빈칸이 있든 없든 같은 의미를 가지게 된다.

여기에 추가하자.

명령어 앞에 다른 명령이 없다면, 빈칸이 있든 없든 같은 의미를 가지게 된다.

이 말은 곧 들여쓰기를 해도 실행 결과는 같다는 뜻이다.

이 말에 맞추어 위의 배치 파일을 고쳐 보자.

 

  1. @ECHO OFF
    rem ====================================
    rem  윈도98 설치 디스크
    rem ====================================

    rem 환경 설정

    rem 한글 환경 설정
        rem 한글 바이오스 읽어오기
        mshbios

    rem 기본 환경 변수 설정 1
        set EXPAND=YES
        SET DIRCMD=/O:N

    rem 램드라이브를 위한 환경 설정

        rem LglDrv 환경 변수 설정 : 램드라이브를 위한 환경 변수이다.
            rem 2행으로 설정한 이유
                rem    한 줄에 적기보다 두 줄로 적어야 보기 좋고,
                rem    명령행의 길이 제한 때문 (128 글자)
            set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
            set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C

        rem 화면을 지운다.
            cls

        rem 램드라이브 설정 작업
        rem 이 부분은 복잡하므로 다른 배치파일을 불러서 처리.
            rem setramd.bat : 실제로 램드라이브를 설정해 주는 배치파일
            rem 넘겨주는 명령행 인자 %LglDrv%
                call setramd.bat %LglDrv%

    rem 기본 환경 변수 설정 2

        rem 임시 디렉터리 환경 변수 설정
            set temp=c:\
            set tmp=c:\
        rem 실행경로 환경 변수 설정
            path=%RAMD%:\;a:\;%CDROM%:\

        rem COMSPEC 환경 변수 설정
        rem COMSPEC 환경 변수는 명령어 해석기를 지정하는 역할을 한다.
        rem Command.com 파일 복사 후 설정.
            copy command.com %RAMD%:\ > NUL
            set comspec=%RAMD%:\command.com

    rem 작업을 위한 파일 복사

        rem 압축 파일 작업용 extract.exe : CAB 파일의 압축을 푸는 프로그램
            copy extract.exe %RAMD%:\ > NUL

        rem 안내 문서 readme.txt : 안내문이 수록되어 있다.
        copy readme.txt %RAMD%:\ > NUL

실제 실행에서는 처음에 만든 배치파일과 같게 동작한다.

요약

  • ECHO를 이용해 화면에 빈 줄을 출력하는 방법과 배치파일을 사람이 읽기 좋게 만드는 법을 설명하였다.
  • 기타

    • 명령프롬프트에서 명령어 앞의 공백과 마지막 명령행 인자 및 옵션 뒤의 공백은 무시된다.
    • 문서화되지 않은 방법은 불가피할 때만 써라.

다음 예고

배치파일을 잠시 멈추는 방법과 파라미터를 배치파일에 전달하는 방법에 대해 알아보자.

이 글은 스프링노트에서 작성되었습니다.

글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

배치파일에 주석을 다는 법과 화면에 글을 출력하는 법에 대해서 알아보기로 하자. 이때 이때 그래픽 화면 출력은 셸에 포함된 명령어로는 불가능하며, 외부에서 프로그램의 도움을 받아야 한다. 그러므로 배치파일에서 화면 출력이라고 하면, 일반적으로 텍스트 출력만을 가리킨다.

주석 및 기본 출력

배치파일에서는 화면에 출력할 때 ECHO 명령을 사용한다.
앞서 2009/03/02 - [배치파일&스크립트] - 스크립트란 무엇인가? 배치파일이란 무엇인가? 문서에서 만든 배치파일이 바탕화면에 있는 배치파일 폴더에 있다고 가정하고 설명하겠다.

우선 메모장을 연다. 시작 단추 >> 프로그램 >> 보조프로그램 >> 메모장

메모장에 다음과 같이 입력한다.

rem 예제 1 : 화면에 간단한 말을 출력한다.
rem 파일명 : exam01.bat
echo 예제 1.
echo 이 프로그램은 화면 출력 예제 1입니다.
echo 끝.

저장이 끝났으면 메뉴에서 [파일] >> [저장]을 선택하면 아직 이름을 주지 않았으므로 [다른 이름으로 저장]이라는 창이 뜨게 된다. 이때 파일명은 exam01.bat 이라고 하자.
명령 프롬프트를 열어서 결과를 확인하자. 어라! 실행이 되지 않는다. 이것은 명령 프롬프트가 위치한 폴더에 배치파일이 없기 때문이다. 그때는 CD 를 입력한 뒤에 한 칸 띄고 나서 <Tab>을 눌러준다. 그러면 화면에 무언가 변화가 오게 된다. 계속 [Tab]을 눌러 알맞은 폴더( "바탕 화면" )가 나오면 <Enter>를 치기 바란다.

그 뒤에 다시 CD를 누르고 한 칸 띄고 <Tab>을 눌러서 반복한다. 앞서 "배치파일" 폴더에 파일을 넣는다고 했으므로 거기까지 들어가 보자. (여기까지 한/영 변환 키를 한 번도 누르지 않고 왔다. 잘 기억해 두었다가 써먹기 바란다.)

CLS 명령을 입력하고 <Enter>를 눌러 화면을 지우자.

이제 방금 만든 배치파일을 실행해 보자. 이때도 e 또는 ex를 입력하고 <Tab>을 누르면 명령어가 바뀌게 된다. 지난번에 만든 exp.cmd 파일과 이번에 만든 exam01.bat 파일이 존재하고 있으니 그 둘만 자꾸 보여주게 된다. exam01.bat 파일을 실행하면 된다.

exam01.bat 실행 화면

exam01.bat 실행 화면

보기가 좋지 않지만 어쨌든 화면 출력을 성공하였다.
하나씩 살펴보자.
첫 줄과 둘째 줄은 REM으로 시작하므로 주석이다. 셋째 줄부터 다섯째 줄까지는 echo를 이용한 화면 출력이다. 그런데 이상한 점은 주석은 자기 자신을 보여주고는 아무런 일도 하지 않았으나, echo는 자신을 보여주고, 해당 출력을 1회씩 하였다. echo는 결국 2번씩 보여준 셈이 된다.

이때 명령 프롬프트에서는 Rem 명령은 Remark (설명하다)에 온 말이며, 아무런 역할도 하지 않는다. 그렇기 때문에 배치파일 안에 주석을 넣는 명령어로 쓰이게 된다.

명령어 반향 감추기 1

앞서 만든 exam01.bat를 고쳐보자. 메모장에서 exam01.bat를 열어서 다음과 같이 고쳐보자.

echo off
rem 예제 2 : 화면에 간단한 말을 출력한다.
rem 파일명 : exam02.bat
echo 예제 2.
echo 이 프로그램은 화면 출력 예제 2입니다.
echo 끝.

[파일] >> [다른 이름으로 저장...]을 눌러 exam02.bat 라는 이름을 주어 저장하자. 명령 프롬프트에서 exam02.bat를 실행하면 아까보다는 깨끗한 결과를 볼 수 있다.

exam02.bat 실행 화면

exam02.bat 실행 화면

이때 첫 줄이 중요하다. 아까와는 달리 echo off 라고 명령을 내렸다. echo는 화면에 글자를 출력하는 명령이 아니었나? 얼른 다음과 같이 입력하자.

echo /? <Enter>

친절한 설명이 나와 있다. echo의 기능은 (1) 메시지를 보여주거나 (2) 명령어 반향을 켜거나 끄고(기본값은 켠다), (3) echo만 일력했을 때 반향 설정값을 보여준다.

ECHO 명령어 도움말

ECHO 명령어 도움말

예제 1에서 화면이 깨끗하지 못한 이유는 바로 "명령어 반향"이라는 기능이 켜져 있었기 때문이다. 이 기능은 사용자에게 명령어가 입력되었음을 알려주는 기능이다. 이는 사용자에게 작업 내용을 알린다는 측면에서는 매우 유용하다. 그러나 반대로 배치파일에서처럼 출력 결과를 원할 때에는 지저분하게 되어 좋지 않다. 이럴 경우 명령어 반향을 끄면 좋다. 그럴 때 쓰는 명령어가 ECHO OFF 이다. 반대로 ECHO ON 이라고 하면 다시 명령어 반향이 켜지게 된다.

그러나 여전히 echo off 명령 자체는 감추지 못해서 찝찝함이 남는다.

명령어 반향 감추기 2

앞서 만든 exam02.bat를 고쳐보자. 메모장에서 exam02.bat를 열어서 다음과 같이 고쳐보자.

@echo off
rem 예제 3 : 화면에 간단한 말을 출력한다.
rem 파일명 : exam03.bat
echo 예제 3.
echo 이 프로그램은 화면 출력 예제 3입니다.
echo 끝.

[파일] >> [다른 이름으로 저장...]을 눌러 exam03.bat 라는 이름을 주어 저장하자. 명령 프롬프트에서 exam03.bat를 실행하면 아까보다 조금 더 깨끗한 결과를 볼 수 있다.

exam03.bat 실행 화면

exam03.bat 실행 화면

이번에도 첫 줄이 중요하다. 아까와는 달리 @echo off 라고 명령을 내렸다. 흠 @ (commat) 표시[각주:1]에 무언가 있다는 말인데... 이것은 해당 명령어 1개만 반향을 끄라는 말이다. 다시 말해 "echo off 자체의 명령어 반향을 꺼라"라는 의미가 된다.

요약

오늘은 ECHO를 이용해 화면에 글자를 출력하는 법과 REM으로 주석을 붙이는 법에 대해 알아 보았다. REM에 대한 설명은 없지만, "나는 모르겠다."라는 사람은 글을 남기기 바란다.

  • 오늘 배운 명령어 : ECHO , REM
  • 오늘 배운 용어 : 명령어 반향
  • 기타 :
    • CD 명령어와 [Tab]을 조합하여 폴더를 이동하는 방법
    • @을 이용하여 명령어 끄는 방법

다음 예고

화면 출력에 대해 좀 더 자세히 알아보기로 하자.

  1. @은 원래 at (앳)이라는 미국의 상업부호였다. 오늘날 콤마트(commat)라는 이름이 부여되어 있고, 한국에서는 골뱅이 또는 동그람 에이 등으로 불린다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

카테고리

분류 전체보기 (1005)
스크립트 (22)
벌레와 팁 (126)
소프트웨어 (240)
하드웨어 (6)
이야기 (24)
말의 나무 (506)
미쳐보자 (22)
일기 (48)
아이폰 (10)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

글 보관함