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


버추얼박스를 사용하다가 가장 황당한 문제는 버추얼박스 프로그램이 제거되지 않는다는 점이었다. 분명히 정상적으로 설치되었음에도 제거할 때에는 오류가 나더니 롤백(되돌리기)을 해 버린다. 아니나 다를까 며칠 전에 설치한 버추얼박스 2.2.0판에서도 제거할 때 롤백해 버리는 문제가 생겼다. 그와 함께 몇 가지 문제를 살펴보기로 하자.

참고로 아래 작업을 하기에 앞서 백업해야 할 데이터가 있다면 반드시 버추얼박스를 제거하기 전에 먼저 백업부터 하기 바란다.

벌레의 유형

이 녀석은 어떻게 정의해야 할는지 의문이다. 아무튼 나를 너무 좋아해서 헤어지기 싫어하는 벌레라고나 할까? ㅡㅡa

아니면 레지스트리를 싫어해서 자주 가출하는 벌레라고 해야 할까? ^^a

벌레의 제거

이 벌레의 제거는 너무나 간단했다. 현재 버전을 한 번 더 설치하면 된다. 앞서 설치본에 아무런 문제가 없었지만, 이상하게도 레지스트리에 정상적으로 등록되지 않아서 생기는 문제이기 때문이다. 현재 설치한 버전인 2.1.4판이면 그것을 받아서 한 번 더 설치하면 되고, 2.2.0판이면 그것을 받아서 한 번 더 설치하면 된다. 그 뒤에 제어판 >> 프로그램 추가/제거를 이용하여 제거하면 된다.

  • 참고 1 : 제거되지 않을 때 다시 설치하면 repair 메뉴나 install 메뉴가 생기는데, repair 메뉴를 선택하거나 install 메뉴를 선택하면 된다. 정상 설치되었더라도 제거가 되지 않는 경우를 확인하였으며, 그때에는 install 메뉴 대신에 repair 메뉴가 생긴다.
  • 참고 2 : KLDP에도 비슷한 글이 있다. http://kldp.org/comment/reply/104538/486110#comment-486110

추가 문제

버추얼박스 2.2.0판을 설치하였다가 제거한 경우에는 약간의 문제가 생겼다. 이전에 만든 디스크이미지를 그대로 이용했으나 새롭게 변경된 사항은 새로운 형식으로 바뀌었고, 또한 환경설정을 저장한 XML 파일의 형식도 바뀌었기 때문이다.

새롭게 변경된 사항은 삭제할 수 없으나, 변경사항이 연결된 스냅샷은 삭제할 수 있었다. 아깝기는 했지만, 어쩔 수 없이 스냅샷을 삭제해야만 했다. 스냅샷은 하드디스크 이미지는 가상 미디어 관리자에서 삭제할 수 있다. 이때 이미지의 원본이 아닌 추가본만 삭제해야 한다. 추가본은 브레이스( { } )로 감싸여 있다.

설정 파일 되돌리기

일단 버추얼박스 2.2.0판에서는 환경설정 XML 파일의 버전이 1.7로 판올림되었다. 그 때문에 버추얼박스 2.1.4판을 설치하면 다음과 같이 오류를 보이면서 하드디스크 이미지 등을 사용할 수 없게 되어 버린다.

오류메시지만 따로 떼어 내면 다음과 같다.

저 위치는 %USERPROFILE%\My Documents\My Virtual Machines\VirtualBox\Machines\WXP Test 폴더이다. 이때 필요한 경로는 %USERPROFILE%\My Documents\My Virtual Machines\VirtualBox 이며, 보통의 경우에는 %USERPROFILE%\.VirtualBox 폴더 아래에 저장되는 정보이니 주의하기 바란다. 다시 말해 자신의 경로에서 찾아야 한다.

  1. 거기에 보면 설정파일이 존재하는데, ###.xml.1.6-windows.bak 파일과 ###.xml 파일처럼(###은 파일명이다. 자신에게 맞는 파일명을 찾기 바란다) 쌍을 이루고 있다. 이때 1.6-windows.bak 라는 꼬리표를 단 파일이 이전 버전의 버추얼박스를 위한 백업파일이다. 내 경우는 버추얼박스 2.1.4판의 설정파일인 셈이다.
  2. 우선 ###.xml을 ###.xml.1.7-windows.000 이라고 이름을 바꾸었다.
  3. 그 뒤 ###.xml.1.6-windows.bak 파일을 ###.xml 이라고 이름을 바꾸었다.
  4. 그렇게 모든 XML 파일을 고친 다음에 버추얼박스를 다시 실행하여 상위 버전의 형식으로 만들어진 스냅샷을 제거하면 된다.

특정 스냅샷 제거

스냅샷의 제거는 버추얼박스 사용자 인터페이스의 메인 화면에 있는 스냅샷을 이용해서 지울 수 있다. 만약 스냅샷 메뉴에 접근하지 못한다면 가상 미디어 관리자를 이용하여 지울 수 있다.

가상 미디어 관리자는 아래와 같이 되어 있다.

가상 미디어 관리자 1

위의 화면은 하드디스크이미지를 선택한 화면이다.

가상 미디어 관리자 2

스냅샷이 존재하는 하드디스크이미지의 경우 삭제와 등록해제 모두 활성화되지 않는다.

가상 미디어 관리자 3

스냅샷 이미지의 경우 브레이스( { } )로 묶여 있으며,

가상 미디어 관리자 4

마지막으로 변경 사항을 저장하는 하드디스크 이미지의 경우

원래는 경고 표시(warn.png)가 붙은 하드디스크 이미지도 존재했으나, 이미 삭제해 버린 뒤였다. 그 경고 표시가 붙은 이미지를 찾아서 삭제하면 데이터를 일부 잃겠지만, 이미 설치한 프로그램을 모두 잃는 것보다는 낫다고 하겠다.

경고 표시가 붙은 이미지를 삭제하면 그 뒤로는 이미 설치된 하드디스크 이미지를 그대로 사용할 수 있다.

참고로 스냅샷 이미지를 삭제하면, 스냅샷 이후의 변경 사항을 저장한 하드디스크 이미지도 함께 삭제된다는 점을 꼭 기억해야 한다.

회사 측 답변

버그 리포팅을 하지 않았다. 설치 파일의 문제인지 아니면 윈도의 문제인지 알 수 없었기 때문이다.

관련 문서

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

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

들어가며

IF EXIST 구문은 단순히 어떤 디렉터리나 파일이 존재하는지를 알려줄 뿐이다. 응용하기에 따라서는 상당히 유용한 기능을 제공한다. 또한 속성의 영향을 받지 않기 때문에 숨김 속성의 파일이나 시스템 속성의 파일도 찾아낼 수 있다. 또한 윈도 탐색기에서 접근하지 못하도록 레지스트리 등을 조작하여 감춰둔 드라이브도 접근할 수 있다.

IF EXIST 구문에는 기본 문법 외에 명령 확장이 존재하지 않는다. 정확히 말해 명령 확장을 이용할 수는 있지만, 그와 같은 명령 확장은 if 명령 전체에 적용되는 명령 확장이고, IF EXIST 구문에만 쓰이는 명령 확장이 아니다. 또다른 명령 확장으로 set 명령 확장이 있으나, 이것 역시 IF EXIST 구문에만 쓰이는 명령 확장이 아니다. 그러므로 여기에서는 설명하지 않겠다.

말뜻

EXIST는 말 그대로 "있다" 또는 "존재한다"라는 뜻을 가지고 있다. 그러므로 IF EXIST 구문은 무엇인가가 존재하는지를 묻는 구문이 된다. 존재하면 참값을, 존재하지 않으면 거짓값을 돌려준다.

예제

실제로 적용하기에는 무리가 있지만, 간단한 배치파일을 작성하였다.

  1. @echo off
  2. rem 파일명 : ExistSys.bat
  3. rem 지은이 : koc2000/SALM
  4. rem 저작권 : GPL v3
  5.  
  6. rem 예제 13.
  7. rem SYSTEM 파일로 운영체제를 가리는 배치파일
  8. rem 사용법 : ExistSys
  9.  
  10. rem c:\ 디렉터리에 존재하는 파일에 따라 시스템을 판별한다.
  11. IF EXIST c:\ntldr GOTO :WinNT
  12. IF EXIST c:\io.sys GOTO :DOS
  13.  
  14. :WinNT
  15. echo The system is Windows NT/2000/XP.
  16. goto :END
  17.  
  18. :DOS
  19. echo The system is DOS or Windows 95/98/ME.
  20. goto :END
  21.  
  22. :END

예제 13은 C 드라이브 루트디렉터리에 있는 파일을 기준으로 운영체제를 판별하는 배치파일이다. 이 배치파일은 정확한 동작을 보장하지 않지만, 대부분의 경우 올바르게 작동한다. 따라서 실제로 이용하기에는 무리가 있으나, 파일 존재 구문(IF EXIST 구문)을 시험하기에는 안성맞춤이다.

위에서 IF EXIST 구문이 두 번 나오는데, 순서를 바꾸면 오류가 난다. 왜냐하면 윈도XP를 비롯한 윈도NT 계열의 운영체제에도 C 드라이브 루트디렉터리에 io.sys와 msdos.sys, config.sys 및 autoexec.bat 파일이 존재하기 때문이다. 이것은 윈도95 계열에서도 마찬가지로 존재한다. 그러므로 윈도NT 계열에서만 존재하는 파일을 찾아야 하는데, 그것이 ntldr(NT Loader) 파일이다. 따라서 위의 배치파일은, 엄밀히 말해, 윈도NT 계열과 비윈도NT 계열을 판별하는 배치파일인 셈이다. 이때 io.sys 파일과 ntldr 파일이 숨김 속성과 시스템 속성을 함께 가지고 있지만, 문제 없이 접근하고 있다.

그러나 PC-DOS의 경우 위의 배치파일은 정상 작동하지 않는다. 왜냐하면 PC-DOS에서는 io.sys 파일 대신에 ibmio.sys 파일이 존재하기 때문이다. 그에 대한 적용은 여러분이 직접 해 보기 바란다.

감춰둔 폴더 접근

폴더 감추기는 윈도 셸인 탐색기에 적용되는 사항으로, cmd.exe 명령에는 적용되지 않는다. 또한 탐색기에서 모습을 찾을 수 없도록 감추었을 뿐 정확한 경로를 알고 있다면 얼마든지 사용할 수 있다.

오른쪽은 원래의 드라이브 구성이고, 왼쪽은 윈도 레지스트리를 조작하여 감춘 구성이다.

이 경우 주소표시줄에 직접 D:\ 와 같이 입력하면 D 드라이브의 루트 폴더에 접근할 수 있다. 앞서 말했듯이 감춰두었을 뿐 막은 게 아니기 때문이다. 그러나 사람들은 눈에 안 보이면 사용하지 못한다고 여기기 때문에 이렇게 드라이브를 감추는 작업은 유용할 때가 많다.

한편 명령 프롬프트에서는 애초에 모든 드라이브가 감춰진 상태이다.

달랑 자신의 홈디렉터리만 보여준다. 홈디렉터리는 유닉스 계열이나 명령 프롬프트에서 쓰는 개념이고, 윈도에서는 프로필폴더이다. 명령 프롬프트에서 다음과 같이 입력하면 된다.

  1. cd %USERPROFILE%

USERPROFILE 환경 변수에 자신의 홈디렉터리(프로필폴더)에 대한 정보를 가지고 있다. 정확히 어디인지를 보려면 다음과 같이 입력하면 된다.

  1. echo %USERPROFILE%

그밖에 HOMEDRIVE, HOMEPATH 등의 환경변수가 지정되어 있다. 위의 경우 홈드라이브(HOMEDRIVE)는 D: 문자열이, 홈패스(HOMEPATH)는 \Usr\LCP 문자열이 지정되어 있으며, 명령 프롬프트에서 set 명령을 입력하면 확인할 수 있다.

보통의 경우 USERPROFILE 환경 변수는 C:\Documents and Settings\USERNAME 문자열을 가지게 된다. 이때 이탤릭체로 표시한 USERNAME은 사용자마다 다르다.

아무튼 위의 두 "내 컴퓨터" 화면처럼 존재하는 폴더를 감추더라도 명령 프롬프트에서는 무리 없이 접근할 수 있다. 이것을 이용하는 것은 여러분의 몫이다.

다음 예고

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

'스크립트 > 배치파일' 카테고리의 다른 글

IF 명령 확장  (1) 2009.04.22
IF 문자열  (4) 2009.04.18
IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
IF 기본 설명  (6) 2009.04.09
배치파일에 매개변수 전달하기 2  (5) 2009.04.04
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

IF ERRORLEVEL문은 방금 실행을 마친 프로그램의 종료코드(마침코드)를 비교하여 프로그램 수행을 결정하는 구문이다. 이를 위해 몇 가지 프로그램의 종료코드를 소개하고자 한다. 또한 이러한 종료코드는 ERRORLEVEL 환경변수(%ERRORLEVEL%)에 저장하여 이용할 수도 있다.

말뜻

종료코드(마침코드)는 프로그램이 수행 과정에서 어떻게 처리하였는지를 알려주는 정수를 가리킨다. 주로 정수 0은 정상 종료되었음을 뜻하면 1보다 크거나 같은 값은 오류가 발생했음을 뜻한다. 프로그램이 종료하면서 운영체제에 넘겨주기 때문에 종료코드라는 이름이 붙었다.

여러 프로그램의 종료코드

윈도XP의 도움말 및 지원 센터의 내용에 따르면 다음과 같은 종료코드를 가지고 있다고 한다.

  • diskcomp : 두 플로피디스크를 비교하는 명령어

    • 0 : 두 플로피디스크가 같다. (정상 종료)
    • 1 : 차이를 발견했다.
    • 2 : 하드웨어 오류 발생.
    • 3 : 초기화 오류 발생.
  • xcopy : 하위 디렉터리와 파일을 복사하는 명령어

    • 0 : 파일이 오류 없이 복사됨. (정상 종료)
    • 1 : 복사할 파일을 찾지 못하다.
    • 2 : 사용자가 Ctrl+C를 눌러 강제 종료.
    • 4 : 초기화 오류가 발생. 메모리나 디스크 공간 부족, 명령줄에 잘못된 드라이브 이름이나 잘못된 구문을 입력했을 때 생긴다.
    • 5 : 디스크 쓰기 오류가 발생했습니다.
  • color : 전경색(글자색)과 배경색을 지정하고 복원하는 명령어

    • 0 : 전경색과 배경색이 다르다.
    • 1 : 전경색과 배경색이 같다.
  • diskcopy : 플로피디스크에서 다른 플로피디스크로 복사하는 명령어

    • 0 : 복사 성공. (정상 종료)
    • 1 : 치명적이지 않은 읽기/쓰기 오류가 발생
    • 3 : 치명적인 하드웨어 오류가 발생
    • 4 : 초기화 오류가 발생
  • format : 디스크를 초기화하는 명령어

    • 0 : 포맷을 성공했습니다.  (정상 종료)
    • 1 : 잘못된 매개 변수를 입력
    • 4 : 치명적인 오류가 발생 (0, 1 또는 5를 제외한 오류).
    • 5 : "포맷을 실행하시겠습니까(Y/N)?" 메시지에서 N 키를 눌러 실행이 중단됨.
  • graftabl : 그래픽 모드에서 확장 문자 집합을 표시하는 기능을 사용 가능하게 설정합니다.

    • 0 : 문자 집합을 기억장치에 읽어들이는 데 성공. 이전 코드 페이지는 로드되지 않는다. (정상 종료)
    • 1 : 잘못된 매개 변수. 작업이 수행되지 않는다.
    • 2 : 파일 오류가 발생
  • replace : 대상 디렉터리의 파일을 이름이 같은 원본 디렉터리의 파일로 바꾼다. replace를 사용하여 대상 디렉터리에 고유 파일 이름을 추가할 수도 있다.

    • 0 : replace 명령이 성공적으로 파일을 바꾸거나 추가했습니다. (정상 종료)
    • 1 : replace 명령이 맞지 않는 MS-DOS 버전을 발견했습니다.
    • 2 : replace 명령이 원본 파일을 찾을 수 없습니다.
    • 3 : replace 명령이 원본이나 대상 경로를 찾을 수 없습니다.
    • 5 : 사용자는 바꾸고자 하는 파일을 액세스할 수 없습니다.
    • 8 : 명령을 실행할 시스템 메모리가 부족합니다.
    • 11 : 명령줄에 잘못된 구문을 사용했습니다.
  • 그밖에 마이크로소프트 제품의 setup.exe 프로그램 : 윈도용 애플리케이션의 설치 프로그램

    • 0 : 프로그램 설치를 성공 또는 사용자가 취소한 경우. (정상 종료)
    • 0 이외의 값 : 프로그램 설치 도중에 프로그램 오류 발생
  • 고스트 등의 시만텍 사의 프로그램

    • 0 : 오류가 발생하지 않고 정상 종료
    • 0 이외의 값 : 오류가 발생

예제 1

IF ERRORLEVEL문과 ELSE를 함께 사용한 예제는 GBackup1H2P.cmd 파일이다. 지난번에 작성한 GBackup1H2P.cmd을

GBackup1H2P-1.cmd로 이름을 바꾸어 저장하고, GBackup1H2P.cmd을 편집해 보자.

  1. GHOST.exe -CLONE,MODE=PDUMP,SRC=1:1,DST=1:2\GHOST.GHO -Z9 -AUTO -SURE -RB
  2.  
  3. REM IF-ELSE 구문 : 오류가 발생하면 오류 발생을 알려준다.
  4. IF ERRORLEVEL 1 (
  5.     ECHO ##############################################
  6.     ECHO ##      백업 도중 오류가 발생했습니다.      ##
  7.     ECHO ##############################################
  8. ) ELSE (
  9.     ECHO ##############################################
  10.     ECHO ##    백업 작업을 정상적으로 마쳤습니다.    ##
  11.     ECHO ##############################################
  12. )

바뀐 부분만 나타내면 위와 같다. 이때 IF는 '('와 같은 명령줄에 있어야 하며, ')'와 ELSE가 같은 명령줄에 있어야 한다. 또한 ELSE는 뒤따르는 '('와 같은 명령줄에 있어야 한다.

  • 참고 : 앞서 말했듯이 위 코드는 정상 작동하지 않는다. 다만 ERRORLEVEL 검사는 잘 된다.

예제 2

XCOPY를 이용한 백업 유틸리티를 제작해 보았다.

  1. @echo off
  2. rem 파일명 : Xback.bat
  3. rem 지은이 : koc2000/SALM
  4. rem 저작권 : GPL v3
  5.  
  6. rem 예제 12.
  7. rem XCOPY를 이용한 백업
  8. rem 사용법 : Xback  원본디렉터리  대상디렉터리
  9.  
  10. rem 작업 1 : 매개변수가 있는가? 없으면 도움말을 보여준다.
  11. IF NOT * == %2* (
  12.     REM 매개변수가 모두 있으면 작업을 시작한다.
  13.     REM XCOPY 명령을 이용해 백업합니다.
  14.     XCOPY %1 %2 /i /S /E /H /M
  15.  
  16.     REM 종료코드가 4 또는 그보다 크면
  17.     IF ERRORLEVEL 4 (
  18.         echo 파일을 백업하기에는 메모리가 부족하거나
  19.         echo 드라이브가 잘못 지정되었거나 명령줄 구문이 틀립니다.
  20.     ) ELSE IF ERRORLEVEL 2 (
  21.         echo 사용자가 CTRL+C를 눌러 백업 작업을 강제 종료했습니다.
  22.     ) ELSE IF ERRORLEVEL 0 (
  23.         echo 백업을 정상적으로 성공했습니다.
  24.     )
  25. ) ELSE (
  26.     REM 매개변수가 없으면 메시지를 보인 뒤 사용법을 보여준다.
  27.  
  28.     ECHO 매개변수가 없거나 모자랍니다.
  29.     ECHO 구문 : Xback  source_dir  backup_dir
  30. )
  31.  
  32. :END

위 구문에서 11행의 " IF NOT * == %2* ( " 부분은 문자열 비교문에서 다시 설명하기로 한다.

또한 위의 코드에서 ERRORLEVEL 값이 큰 값부터 차례대로 낮아지게 만드는 것이 배치파일에서는 묵시적 원칙입니다. 이는 실수로 일어날 수 있는 오류를 막기 위한 방법이지요. 왜냐하면 IF ERRORLEVEL 구문은 "같은 값"을 구하는 구문이 아니기 때문입니다.

  1. IF [NOT] ERRORLEVEL 정수 명령어

위와 같은 경우 정수보다 크거나 같으면 뒤따르는 명령어를 실행하게 되어 있습니다.

  1. IF ERRORLEVEL 1 command01
  2. IF ERRORLEVEL 2 command02
  3. IF ERRORLEVEL 3 command03
  4. IF ERRORLEVEL 4 command04
  5. IF ERRORLEVEL 15 command15

만약에 command01을 실행하고, command02부터는 실행하지 않을 생각이었다면 위와 같은 코드는 작성해서는 안됩니다. 위의 코드는 ERRORLEVEL이 1일 때만 정상 작동하고, 나머지 경우는 항상 사용자가 원하지 않는 작동을 하게 됩니다.

반드시 command01 명령만 실행하겠다면 다음과 같은 두 가지 방법이 있습니다.

  1. rem 방법1
  2. IF ERRORLEVEL 15 command15
  3. IF ERRORLEVEL 4 command04
  4. IF ERRORLEVEL 3 command03
  5. IF ERRORLEVEL 2 command02
  6. IF ERRORLEVEL 1 command05

우선 첫 방법으로는 위와 같이 큰 수부터 비교합니다. 2행에서는 종료코드가 15보다 크거나 같으면 command15 명령을 실행하게 되지요. 그러나 다음 행에 나오는 구문이 실행될 여지는 여전히 남습니다.

그럴 경우 다른 방법으로는 아래와 같이 정확한 수를 비교하게 만듭니다. 2행에서는 종료코드가 15보다 크거나 같고, 16보다 크거나 같지 않으면(작으면), 실행한다는 뜻입니다. 이러한 경우는 종료코드가 정확히 15인 경우뿐입니다.

  1. rem 방법2
  2. IF ERRORLEVEL 15 IF NOT ERRORLEVEL 16 command15
  3. IF ERRORLEVEL 4 IF NOT ERRORLEVEL 5 command04
  4. IF ERRORLEVEL 3 IF NOT ERRORLEVEL 4 command03
  5. IF ERRORLEVEL 2 IF NOT ERRORLEVEL 3 command02
  6. IF ERRORLEVEL 1 IF NOT ERRORLEVEL 2 command05

방법1에서는 goto 명령을 사용할 경우 오류가 생기지 않지만, 일반 명령을 사용할 경우에는 오류가 생길 수 있습니다.

방법2에서는 애초에 정확한 값을 비교하게 되므로 오류가 상당히 줄어들게 됩니다.

이와 비슷한 방법으로는 아래처럼 %ERRORLEVEL%을 쓰는 명령 확장이 있습니다.

  1. if /i %ERRORLEVEL% EQU 15 command15

위 문장은 문자열을 비교해 주는 if 구문입니다. 그런데 /i 선택사항이 들어감으로써 융통성을 지니게 되어 일반적인 비교를 하게 됩니다.

  1. IF ERRORLEVEL 4 (
  2.         echo 파일을 백업하기에는 메모리가 부족하거나
  3.         echo 드라이브가 잘못 지정되었거나 명령줄 구문이 틀립니다.
  4. ) ELSE IF ERRORLEVEL 2 (
  5.         echo 사용자가 CTRL+C를 눌러 백업 작업을 강제 종료했습니다.
  6. )

위의 부분은 if 구문에 뒤따르는 명령이 하나가 아닐 때 쓰는 방법입니다. 명령이 하나가 아니라는 말은 같은 명령을 두 번 이상 쓸 경우에도 해당합니다. 위의 문장은 echo 명령을 두 번 썼기 때문에 ( ) (괄호)로 묶어야 합니다. 이러한 구문은 도스의 if와는 호환성이 없는 명령 확장 가운데 하나입니다.

또한 위에서 나타난 else 명령은 반드시 if 문의 끝에만 쓰일 수 있습니다. 또한 else 앞에는 반드시 ) (닫는 괄호)가 와야 합니다. 이때 else의 뜻은 "~이지 않고"라는 뜻이고, 위의 상황에서는 "종료코드가 4보다 크거나 같지 않고"라는 뜻이 됩니다. 뒤따르는 if 구문까지 합해서 해석하면 "종료코드가 4보다 작고, 2보다 크거나 같으면"이라는 뜻이 되지요. 종료코드가 3일 수도 있지만, XCOPY 명령은 종료코드 3을 가지지 않으므로 위의 구문은 정확히 실행됩니다.

또한 위의 방식은 구조적 프로그래밍 또는 절차적 프로그래밍에 근접한 방식입니다. GOTO 명령은 최대한 억제하여 꼭 필요한 경우에만 써야 읽기 좋고, 알아보기 좋고, 고치기 쉬운 코드가 됩니다.

관련 문서

다음 예고

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

'스크립트 > 배치파일' 카테고리의 다른 글

IF 문자열  (4) 2009.04.18
IF EXIST  (0) 2009.04.15
IF 기본 설명  (6) 2009.04.09
배치파일에 매개변수 전달하기 2  (5) 2009.04.04
배치파일에 매개변수 전달하기  (0) 2009.04.01
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

팁텍

암호 걸린 압축 파일을 엽기적으로 보관하는 방법이다. 이 방법은 1998년에 OLE에 대해서 배울 때 알게 되었다. 당시에는 MS Word97로 시험하였으나, 여기에는 한/글/2005를 사용했다.

팁의 발견

흔히 압축 파일을 저장할 때 암호를 걸게 된다. 그런데 그렇게 하고도 미덥지 않아서 처음 압축한 형식과 다르게 압축을 한다. 물론 암호도 걸어서.

그렇다고해서 안전할까? 물론 안전하다. 그런데 그런 파일이 있다는 사실 자체만으로 안전하지 못할 때가 있다. 누군가가 그것을 지우려 할 때다.

이럴 경우 압축 파일을 다른 파일 속에 넣어 버리면 좋을 때도 있을 텐데, 아쉽게도 그런 기능을 지원하는 프로그램이 없다.

그런데 알고 보면 그게 또 아니다. 윈도는 기본적으로 특정 파일을 다른 파일에 포함시킬 수 있도록 되어 있기 때문이다. 그것이 OLE 기능이다.

압축 작업

프리웨어인 Zip+ 프로그램을 이용하여 압축을 하였다. 참고로 알집은 애드웨어이다.

압축할 폴더/파일을 선택한다.

압축할 폴더/파일을 선택한다.

마우스 오른쪽 클릭하여

마우스 오른쪽 클릭하여

압축 하기 대화상자가 열린다. 아래쪽 중앙에 암호 입력을 클릭한다.

압축 하기 대화상자가 열린다. 아래쪽 중앙에 암호 입력을 클릭한다.

암호 입력 대화상자에서 암호와 암호 확인을 똑같이 입력한다. 이때 그 둘이 서로 다르면 입력을 다시 요구한다.

암호 입력 대화상자에서 암호와 암호 확인을 똑같이 입력한다. 이때 그 둘이 서로 다르면 입력을 다시 요구한다.

암호 입력을 마치면

암호 입력을 마치면

문서 작업

압축 파일을 문서 파일에 넣을 때 주의할 점은, 한 번 문서 파일에 넣어버리면 그것을 다시 빼낼 수 없다는 점이다. 물론 이렇게 문서 파일에 개체로서 넣더라도 그림 파일 등은 다시 빼낼 수 있다. 하지만 이 압축 파일의 경우는 다시 빼낼 수 없으니 심사숙고해서 문서 파일에 넣도록 하자. 압축 파일 자체는 빼낼 수 없지만, 그 압축 파일에 압축해 넣은 자료는 다시 빼낼 수 있으니 걱정하지 않아도 된다.

드래그&드롭으로 넣기

이렇게 압축파일이 만들어지면 압축 프로그램을 포함시킬 문서 파일을 골라야 한다.

위와 같이 문서 파일을 연 다음에 탐색기 창을 열어 압축 파일을 선택한다.

위와 같이 문서 파일을 연 다음에 탐색기 창을 열어 압축 파일을 선택한다.

압축 파일을 문서 파일 안에 드래그&드롭(끌어서 던져넣기)으로 포함시킨다.

압축 파일을 문서 파일 안에 드래그&드롭(끌어서 던져넣기)으로 포함시킨다.

위와 같이 압축 파일이 문서 파일에 포함된다.

위와 같이 압축 파일이 문서 파일에 포함된다.

메뉴를 이용하여 넣기

메뉴에서 선택하고 싶은 사람은 아래와 같이 입력 >> OLE 개체 넣기를 선택하면 된다.

물론 단축키는 위에 나온 대로 <Ctrl+N,O>이다. 단축키를 이용하든 메뉴를 이용하든 자신이 편한 방법을 사용하면 된다.

이때

이때

새로 만들기는 이미 OLE 개체의 형식이 정해진 자료만 가능하다. 대부분 압축 파일을 문서에 포함시킨다는 생각을 않으므로 이미 만들어져 있을 리는 없다.

불러오기

불러오기


문서 파일을 찾은 뒤

문서 파일을 찾은 뒤

결과 화면은 아래와 같다.

결과

아, 왜 두 개가 생겼느냐고? 앞서 작업한 파일은 오른쪽에 있는 개체(압축 파일)이고, 왼쪽은 방금 작업한 개체(압축 파일)이다. 저 개체(압축 파일)가 들어가는 곳은 아까 메뉴를 호출했을 때 커서가 어디에 있었느냐에 따라 다르다. 다시 말해 커서가 있던 곳에 개체가 들어간다. 물론 마우스로 던져넣은 경우 마우스 포인터가 마지막에 닿았던 곳을 기준으로 개체가 들어간다.

문서에 암호 걸기

마지막으로 한/글/2005 문서에 암호를 걸면 된다. 암호 걸기 기능은 메뉴에서 파일 >> 문서 암호에 있다.

위의 두 암호는 같아야 한다.

위의 두 암호는 같아야 한다.

암호를 건 뒤에는 저장하면 된다.

이 문서를 다시 불러오면 다음과 같이 암호를 물어본다. 아까 지정한 암호를 입력해야 문서를 읽을 수 있다.

문서 파일 사용하기

이 문서 파일을 어떻게 이용할 수 있는지도 알아야 한다. 기껏 이렇게 복잡한 과정을 거쳐서 파일을 2중으로 암호화했는데, 더구나 다시 빼낼 수도 없는데, 그것을 이용할 수 없다면 정말 큰일이기 때문이다.

이것을 압축 파일 관리 프로그램에서 읽어들이는 방법은 간단하다. 그냥 문서 파일 안에 있는 압축 파일 아이콘을 두 번 클릭(더블클릭)하면 된다.

두번 클릭했을 때 Zip+ 프로그램에서는 8.3형식으로 OLE 개체를 열었다.

두번 클릭했을 때 Zip+ 프로그램에서는 8.3형식으로 OLE 개체를 열었다.

이밖에도 다음과 같은 방법이 있다.

내용 활성화를 이용해서 압축 파일의 OLE 개체를 열 수 있다.

내용 활성화를 이용해서 압축 파일의 OLE 개체를 열 수 있다.

이때 OLE 개체는 두번 클릭했을 때와 같이 8.3형식으로 열렸다.

마지막 방법으로 위 그림에서 내용 활성화 대신에 패키지 편집을 클릭해서 열 수도 있다.

개체

패키지 편집을 클릭하면 위와 같이 개체 포장기 프로그램이 실행된다. 이때 오른쪽의 "sample.zip 복사본"을 두번 클릭하면 압축 파일 관리 프로그램에서 OLE 개체를 읽어올 수 있다.

아무튼 압축 파일의 OLE 개체를 연 뒤에는, 거기에 새로운 파일을 추가하거나, 파일 가운데 일부를 삭제할 수도 있다. 물론 원본이 .zip 파일이었기 때문에 가능하며, 일부 압축 형식은 압축 내 파일 삭제, 파일 추가 등의 기능을 지원하지 않기도 한다.

또한 개체 포장기를 종료시킬 때 "을(를) 업데이트하시겠습니까?"라고 묻는데, 파일 추가나 삭제를 했는데 그것을 적용하겠다면 [예]를 클릭하고, 아무런 작업도 하지 않았다면 [아니오]를 클릭하면 된다.

물론 압축 파일 안의 파일을 밖으로 꺼낼 때에는 아까 입력한 암호를 입력해야 한다.

원리 및 특징

위에서 윈도는 기본적으로 특정 파일을 다른 파일에 포함시킬 수 있도록 되어 있으며, 그러한 기능이 OLE라고 했다.

윈도XP의 도움말 및 지원센터에 따르면 OLE는 다음과 같은 뜻을 가진다.

OLE
어떤 응용 프로그램에서 만든 정보를 다른 응용 프로그램에서 만든 스프레드시트나 워드 프로세싱 파일 등의 문서에 붙여넣어 응용 프로그램 간에 정보를 전송하고 공유하는 방법입니다.
관련 항목: 패키지; 포함 개체; 연결된 개체

이때 중요한 점은 응용 프로그램 간에 정보를 공유하는 방법이라는 점이다. 다시 말해 압축 파일은 압축 프로그램에서 다루지만, OLE를 이용하면 워드 프로세싱 파일 안에 압축 파일을 넣어서 필요할 때만 압축 프로그램으로 불러내어 다룰 수 있다는 뜻이다.

이러한 기능은 메모장에서는 동작하지 않는다. 왜냐하면 메모장은 OLE 개체 기능을 지원하지 않기 때문이다. 그러나 워드패드에서는 잘 동작한다. 워드패드에도 OLE를 지원하는 메뉴가 있으며, 마우스로 드래그&드롭으로 삽입할 수 있다. 메뉴는 삽입 >> 개체이며, 한/글/2005의 경우와 비슷하다.

이렇게 문서에 삽입하는 대상을 개체라고 부르는데, 이러한 개체는 특별하게 지정되어 있지 않다. 그럼에도 대부분의 프로그램에서 "정해진 개체"가 따로 존재하는 이유는, 그렇게 정해진 개체가 다른 개체보다 자주 쓰이기 때문이다.

심지어 HTML 등에서도 <OBJECT> 태그와 <EMBED> 태그가 있어서 개체를 삽입할 수 있다. 물론 HTML에 들어가는 개체는 한/글/ 파일이나 워드패드 파일(.rtf 파일)과는 달리 문서와 완전히 융합되는 형태는 아니다. HTML 특유의 링크 형태로 HTML 문서를 보여줄 때 함께 보여주는 형식을 취할 뿐이다.

물론 대부분의 문서에서 OLE 개체는 문서 안에 직접 삽입되어 문서의 일부를 이루게 된다. 이 경우 장점은 운영체제에서 OLE 개체 접근을 허용하면 그 개체를 두번 클릭함으로써 쉽게 접근하고, 열어 볼 수 있고, 심지어 편집까지 바로 할 수 있다.

그런데 이 방법에 결정적인 단점이 있다. 바로 원본을 복원할 수 없다는 점이다. 한 번 다른 문서에 집어 넣은 압축 파일은 다시 압축 파일 형태로 복원되지 않는다. 두 번째로 윈도에서만 사용할 수 있다는 점이다. 리눅스 등에서도 OLE를 지원하기는 하나, 어디까지나 OLE는 윈도 기반에서 작동하도록 만들어져 있다. 결국 윈도가 아니면 쓸 수 없는 방법이라는 말이다. 세 번째 이 작업을 할 때 항상 두 가지 프로그램이 필요하다는 점이다. 바로 문서 편집기와 압축 파일 관리자가 항상 필요하다. 또한 압축 파일이 문서에 포함되면, 그만큼 문서 크기가 늘어난다는 특징이 있다.

장점은 하나뿐이다. 암호를 두 번 지정할 수 있는데, 그 방법을 상대방이 모를 가능성이 높다는 점이다. 물론 아는 사람은 어떻게든 알아낸다는 점을 잊어서는 안 된다.

관련 문서

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

'벌레와 팁 > ' 카테고리의 다른 글

버그리포팅이 무시되는 경우  (0) 2009.04.25
DOS에서 숨김 파일 보기  (0) 2009.04.24
금칙어 피해가기  (0) 2009.04.21
티스토리 인쇄CSS 적용하기  (3) 2009.04.09
중복 파일 제거하여 용량을 줄이자  (0) 2009.04.06
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

며칠 전 버추얼박스 홈페이지에 들렀다가 버추얼박스 2.2.0판이 공개되었음을 알고 업데이트 하였다. 그런데 업데이트를 하기 전까지 잘 되던 게스트OS 안에서의 네트워크 연결이 전혀 되지 않았다. 처음에는 업데이트를 잘못했다고 생각했으나, 업데이트하지 않고 2.2.0판을 설치한 경우에도 네트워크 연결에 문제가 있다는 글이 버추얼박스 포럼에 올라와 있었다.

읽기에 앞서

이 글에 쓰인 방법을 적용해도 얼마 뒤에 다시 네트워크 기능이 동작하지 않는다면, 자신이 고정 아이피를 사용하는지를 살펴보기 바란다. 무슨 까닭에서인지 아이피를 고정 시키면 네트워크가 제한되었다.

참고로, 이 글이 쓰인 브리징을 하면 고정 아이피가 유동 아이피로 바뀌는 현상을 보였다.

2009년 4월 27일자 버추얼박스 2.2.2판을 받아서 설치하면 대부분의 벌레를 잡을 수 있다고 한다. 버추얼박스 2.2.0판 때문에 어려움을 겪는다면 필히 설치하기 바란다.

벌레의 유형

네트워크를 막는 벌레로서 혼자(?) 살고 싶어 하는 나쁜 버릇을 가진 벌레이지 않을까 생각한다. 그렇지 않고서야 왜 네트워크를 막을까? 그래서 이 벌레의 나쁜 버릇을 고치기 위해 함께 살 녀석과 다리(브리지)를 놓아줌으로써 해결하였다.

  • 참고 : 이 현상은 벌레라고 보기가 애매하다. 업데이트 하던 도중에 네트워크와 관련한 경고가 있었기 때문이다. 다시 말해 내가 업데이트 도중에 실수한 바도 있다. 그러나 그 경고가 아예 네트워크 연결을 못하게 하는 경고라고는 생각지 않았다. 버추얼박스 포럼에도 그와 비슷한 문제를 호소하는 사람이 많은 것도 그런 까닭으로 보인다.

벌레의 제거

이와 비슷한 현상을 발견하고 구글링을 하여 오즈맨 님의 블로그에서 글을 발견했다. 하지만 그 글은 이전 버전을 기준으로 작성한 탓인지 2.2판에는 맞지 않은 자료화면이 있었다. 오즈맨 님의 글 <오즈맨의 이야기 :: 버철박스 VirtualBox 에서 인터넷 Internet 이 안되면>에서 7번과 8번 설명대로 하면 된다.

2.2판에 맞추어 다시 구성하면 아래와 같다.

2.2.0판을 설치/업데이트하자 위의 왼쪽 화면처럼 네트워크 설정을 찾기 시작했다. 그러다가 한참이 지난 뒤 위의 오른쪽처럼 네트워크를 사용할 수 없다는 표시를 보여주었다. 버추얼박스를 실행하여 게스트OS(윈도XP SP2)를 실행하니 아니나 다를까 인터넷 익스플로러가 홈페이지를 찾지 못하였다.

구글링을 하여 오즈맨 님의 글을 찾았고, 그 글에 따라 해결하려고 시도를 했다. 그런데...

위와 같이 화면이 바뀌어 있었다. 버전이 바뀌면서 환경 설정이 조금 바뀌었기 때문이다. 이때 "다음에 연결됨"은 현재 상태로 "NAT"로 두어도 되고 "호스트 전용 네트워크"로 바꾸어도 된다. 물론 아무것도 안 건드려도 된다.

내 네트워크 환경에서 오른쪽 클릭하여 속성을 선택한다.

VirtualBox Host-Only Ethernet 아이콘에 노란색 경고 표시가 달려 있다.

마우스로 VirtualBox Host-Only Ethernet 아이콘과 로컬 영역 연결 아이콘을 모두 선택한 뒤 그 위에서 오른쪽 클릭 한 뒤 연결 브리지를 선택한다.

위와 같이 네트워크 브리지를 만드는 알림이 잠시 보인다. 저것이 사라진 뒤에 조금 더 기다리면 아래와 같이 된다.

위와 같이 "네트워크 브리지 (네트워크 브리지)" 아이콘이 작업을 완료하면 생겨난다.

버추얼박스를 실행하여 네트워크에 잘 연결되는지 확인하면 된다.

회사 측 답변

현재 나보다 먼저 발견한 사람이 버그리포팅을 한 상태이다.

관련 문서

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

'벌레와 팁 > 버그' 카테고리의 다른 글

스프링노트의 태그 표기 벌레  (0) 2009.04.26
티스토리 이미지 갤러리 문제  (0) 2009.04.24
네이버 결계 벌레  (3) 2009.04.07
네이버 뻥튀기 벌레  (0) 2009.04.05
구글이 음란 사이트?  (3) 2009.04.05
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

팁텍

티스토리는 인쇄 페이지 기능을 지원하지 않는다. 그러다가 인쇄CSS를 이용하면 어느 정도 자신이 바라는 부분만 인쇄할 수 있지 않을까 생각하여 이 팁을 작성하게 되었다.

팁의 발견

티스토리에서 인쇄 페이지를 지원하지 않는다는 사실은 우연히 알게 되었다. 그러다가 도아의 세상사는 이야기에서 블로그에 PDF 저장 단추를 달자 라는 글을 보게 되었다. 댓글로 의견을 나누는데, CSS 이야기가 나오게 되었고, 그것에서 힌트를 얻어 CSS를 적용해 보게 되었다.

프로그램 설명

CSS에 대한 기본 사용법은 각자 알아서 하기 바란다.

추천 사이트 - Learn CSS (한국어 사이트이지만, 글자가 깨질 수도 있다. 문자셋을 한국어 (UTF-8) 또는 유니코드 (UTF-8)로 맞추어야 한다.)

CSS 만들기

기본적인 부분 인쇄

CSS를 이용하지 않는 방법은 WWW이 생길 무렵부터 쓰던 방법인 드래그&프린트가 있다. 말 그대로 마우스로 화면에서 인쇄하고 싶은 부분을 주~욱 잡아당겨 선택한다. 그리고 메뉴에서 파일-인쇄를 누르면 된다.

마우스로 드래그한 화면

일단은 이렇게 마우스로 좌~악 그어서 선택한다.

파일 메뉴에서 인쇄 선택

파일 메뉴에서 인쇄 선택

페이지 범위-선택 영역, 그 다음에 인쇄를 콕! 눌러주면 된다.

페이지 범위-선택 영역, 그 다음에 인쇄를 콕! 눌러주면 된다.

그러나 이 방법은 웹페이지 방문자가 해야 하는 작업이지, 웹페이지 제작자가 할 수 있는 작업이 아니다. 더구나 마우스 드래그를 막아놓은 웹페이지에서는 통하지 않는다.

인쇄 CSS 이용하기 1

인쇄용 CSS를 이용하면 웹페이지 제작자가 자신이 인쇄로 출력하고 싶은 부분을 정할 수 있다. 인쇄 CSS에서 인쇄하고 싶지 않은 부분에는 display: none 라는 속성을 주면 된다(참조 블로그에 PDF 저장 단추를 달자)

인쇄 CSS 이용하기 2

나는 티스토리에 적용할 때 주로 <div class="_ad"> 또는 <div class="noprint">와 같이 인쇄 금지 항목을 만들었다. 이것을 화면CSS에 응용하면, 화면에만 안 보이는 <div class="noseeing"> 또는 <div class="blind"> 항목을 만들 수도 있다.

참고로 현재 왕미친세상에 적용된 인쇄CSS는 다음과 같다.

  1. /* 이 파일에 적용된 설정은 http://www.w3.org/StyleSheets/home-import.css 파일을 참조하여 만들었습니다. */
  2.  
  3. /* ****************** 프린트 CSS ****************** */
  4. /* 아래에 설정값이 없으면 기본값을 따르게 됩니다. */
  5.  
  6. /* 개요 스타일 설정 */
  7. h1, h2, h3,
  8. h4, h5, h6     { page-break-after: avoid; page-break-inside: avoid }
  9.  
  10. /* 인용 스타일 설정 */
  11. blockquote,
  12. pre     { page-break-inside: avoid }
  13.  
  14. /* 목록 스타일 설정 */
  15. ul, ol, dl     { page-break-before: avoid }
  16.  
  17. /* 링크 스타일 설정 */
  18. a     { font-weight: normal }
  19.  
  20. /* 그림 파일 스타일 설정 */
  21. img     { border: 0; }
  22.  
  23. /* 인쇄에서 제외할 부분 */
  24. script     { display:none } /* 본문 안에 보일 내용을 script 태그 처리했을 경우 주의 요망 */
  25. div script     { display:none } /* IE6 버그가 있음. div.noprint / div._ad 태그 설정이 되어도 인쇄에서 나타남.
  26.                            그러므로 div 태그와 script 태그를 중첩하여 최대한 정돈하게 만듦. */
  27. .noprint     { display:none } /* 말 그대로 인쇄 안함. */
  28. ._ad     { display:none } /* 구글 광고 등은 인쇄 안 함. IE6은 오류가 있어서 그대로 인쇄됨. */
  29. #paging     { display:none } /* 문서 하단의 #paging 아이디는 인쇄 안함 */
  30. #header     { display:none } /* 문서 상단의 #header 아이디는 인쇄 안함 */

일단 저런 식으로 만들 수 있다.

저것을 티스토리에 적용한 다음 출력하고 싶지 않은 부분을 <div class="noprint"></div>로 감싸서 화면에서는 보이지만, 인쇄에서는 보이지 않게 했다.

  • 참고 1 : 모든 경우에 적용할 수 있는 클래스 이름을 만들려고 한다면, <div class="displaynone"> 또는 <div class="nodisplay">를 추천한다. 이것은 화면CSS, 인쇄CSS, 음성CSS 등에서 같은 이름으로 쓸 수 있기 때문이다. 이 display:none와 비슷해서 나중에 적용할 값을 기억하기에도 좋다. 참고로 display:none은 사용자에게 "보여주지 않는다."라는 뜻이 아니다. 이것은 "사용자에게 내보내는 출력이 없다."라는 뜻이다.
  • 참고 2 : div script  { display:none } 설정과 div, script { display:none } 설정은 서로 다르다. 앞엣것은 div 태그와 script 태그가 중첩될 경우에 출력을 없게 하라는 뜻이고, 뒤엣것은 div 태그와 script 태그 각각에게 출력이 없게 하라는 뜻이다.

티스토리에 적용

처음 적용 : 실패 1

처음에는 티스토리 스킨 편집 화면을 열었다.

HTML/CSS 편집은 두 부분으로 나뉘는데, 위가 skin.html 파일이고, 아래가 style.css 파일이다. 여기에서 style.css를 편집하였다. 위의 화면은 화면을 최대한 줄인 화면이다. skin.html과 style.css을 클릭하면 편집 영역이 아래로 길어지게 된다.

style.css 파일 맨 아래에 다음과 같이 끼워넣었다.

  1. @media print {
    h1, h2, h3,
    h4, h5, h6     { page-break-after: avoid; page-break-inside: avoid }

    blockquote,
    pre     { page-break-inside: avoid }

    ul, ol, dl     { page-break-before: avoid }

    a     { font-weight: normal }

    img     { border: 0; }

    /* 인쇄에서 제외할 부분 */
    script     { display:none }
    div script     { display:none }
    .noprint     { display:none }
    ._ad     { display:none }
    #paging     { display:none }
    #header     { display:none }

    }

그러나 작동하지 않았다. 다른 부분은 추가 작업이 필요했지만, 최소한 #paging 아이디 선택자와 #header 아이디 선택자를 사용한 곳에서는 적용이 되어야 했기 때문이다. 다시 말해 화면 인쇄를 하면 화면에 나타나지 않아야 하는 #paging 아이디 선택자와 #header 아이디 선택자를 사용한 곳이 버젓히 드러나 있었다.

나는 내 실수를 알지 못해 한참을 헤매야 했다.

참고로 내가 참조한 http://www.w3.org/StyleSheets/home-import.css 파일은 http://www.w3.org/StyleSheets/home.css 파일에서 @import 를 이용하여 불러왔고, http://www.w3.org/StyleSheets/home.css 파일은 http://www.w3.org/ 페이지 헤더 태그에서 link 태그를 이용하여 불러왔다.

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
  4. <head profile="http://www.w3.org/2000/08/w3c-synd/#"><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5.   ... 생략 ...
  6.   <title>World Wide Web Consortium - Web Standards</title>
  7.   <link rel="meta" href="/Overview-about.rdf" />
  8.   <link rel="stylesheet" type="text/css" href="/StyleSheets/home.css" />
  9.   ... 생략 ...
  10. </head>

그런데 내가 쓰는, 그리고 이전에 썼던 티스토리 스킨의 헤더에서 공통적인 부분만 뽑아내면 다음과 같았다.

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <link rel="alternate" type="application/rss+xml" title="왕미친놈의 왕미친세상" href="https://koc2000.tistory.com/rss" />
  6. <link rel="stylesheet" media="screen" type="text/css" href="./style.css" />
  7. <link rel="shortcut icon" href="https://salm.pe.kr/favicon.ico" />
  8. <title>왕미친놈의 왕미친세상 :: '분류 전체보기' 카테고리의 글 목록 (33 Page)</title>
  9.  
  10. </head>

차이가 나는 부분은 빨간색으로 처리했다. 저 부분을 발견하지 못해서 헤매고 말았다.

다시 말해 내가 style.css 내용에 아무리 인쇄에 대한 내용을 넣어서 반응하지 않을 수밖에 없었다.

  1. @media print {
  2.     ... 인쇄 CSS 내용 ...
  3. }

위와 같은 설정은 처음부터 무시되었다는 뜻이다. 왜? 처음 읽어들일 때부터 화면(screen)에 맞게 읽어들였다는 뜻이고, 인쇄(print)음성(aural)은 무시한다는 뜻이다. 위에 빨간색으로 된 media="screen"은 그런 뜻이다.

실패 2

HTML/CSS 편집이 안 된다면 파일로 처리하자는 생각을 가지게 되었다. 이때 위의 화면에 있는 "파일 업로드" 탭이 눈에 들어왔다.

흠, 파일업로드를 클릭하여 파일을 찾아 올렸다. 여기에서도 또 실수를 하고 만다. 바로 print.css 파일이 올라간 곳을 확인하지 않아 버렸다. 아무튼 다음과 같이 입력했다.

  1. <link rel="alternate" type="application/rss+xml" title="왕미친놈의 왕미친세상" href="https://koc2000.tistory.com/rss" />
  2. <link rel="stylesheet" media="screen" type="text/css" href="./style.css" />
  3. <link rel="stylesheet" media="print" type="text/css" href="./print.css" />
  4. <link rel="shortcut icon" href="https://salm.pe.kr/favicon.ico" />

아무 생각 없이 당연히 style.css와 같은 경로에 있겠거니 생각하고, 써넣어 버린 무지막지한 실수였다.

당연히 실패!

그렇다면 파일은 어디에 있을까?

인쇄CSS 적용 성공

인쇄 CSS 파일을 찾아서 다시 파일업로드 탭을 쿡 눌러주었다. 스크롤바를 아래로 주~욱 내리자 보였다.

어라, preview.gif는 다른 파일과 달리 앞에 images/ 가 없었다. 물론 print.css도 다른 파일처럼 images/ 가 붙어 있었다. 결국 preview.gif 파일만 빼면 같은 디렉터리에 있다는 말이었다. 

다시 HTML/CSS 편집 탭으로 넘어가서, 아까 편집했던 부분을 적당히 고쳤다.

  1. <link rel="alternate" type="application/rss+xml" title="왕미친놈의 왕미친세상" href="https://koc2000.tistory.com/rss" />
  2. <link rel="stylesheet" media="screen" type="text/css" href="./style.css" />
  3. <link rel="stylesheet" media="print" type="text/css" href="./images/print.css" />
  4. <link rel="shortcut icon" href="https://salm.pe.kr/favicon.ico" />

위와 같이 고치자 드디어 작동했다.

좀 더 추가

아까 서버에 올린 인쇄CSS 파일에는 .noprint 및 ._ad 클래스에 대한 설정이 있었다. 이것은 곧 인쇄하지 않을 부분과 광고 부분을 <div></div>로 감쌀 수 있다는 뜻이다. 

또한 마지막으로 화면에는 안 보이지만 인쇄에서만 보일 부분도 설정하였다.

최종적으로 인쇄 CSS 적용 전과 적용 후의 화면 인쇄(일부)는 다음과 같다.  

  • 인쇄CSS 적용 전 인쇄 미리보기 화면 (전체 7쪽[각주:1]) : 삭제할 내용을 분홍색으로 표시하였다.[각주:2]

    • 처음 두 쪽은 쓸모 없는 내용이다. 아니 쓸모는 있지만, 인쇄에서는 굳이 필요하지 않다.
    • 3쪽 위의 내용은 "My 블로거 뉴스"이다. 역시 방문자에게는 필요하지 않은 내용이다. 가운데 있는 내용은 구글 광고라서 역시 인쇄에서는 필요하지 않다.
    • 6쪽에서 보이는 것은 위젯이다. 역시 인쇄에서는 필요하지 않다.
    • 7쪽은 티스토리 저작권 정보이다. 화면이 아닌 인쇄 결과는 티스토리 회사에서 만든 페이지 구성대로 되지 않으므로 인쇄할 필요가 없는 부분이다.
      CSS 적용 전 인쇄 미리보기

      CSS 적용 전 인쇄 미리보기

    • 인쇄 CSS 적용 후 화면 (전체 4쪽[각주:3]) : CSS 적용 전 화면과 비교하면, 헤더 부분이 모두 사라져서 앞부분이 아주 깔끔해졌다.[각주:4] 또한 화면에는 나타나지 않지만, 맨 마지막 쪽에 위젯이 사라지지 않고 남아 있다. 이 부분도 script 태그와 embed 태그의 영향으로 보인다.[각주:5]
      CSS 적용 후 인쇄 미리보기 (IE)

      CSS 적용 후 인쇄 미리보기 (IE)

      CSS 적용 후 인쇄 미리보기 1 (FF)

      CSS 적용 후 인쇄 미리보기 1 (FF)

      CSS 적용 후 인쇄 미리보기 2 (FF)

      CSS 적용 후 인쇄 미리보기 2 (FF)

위와 같이, 인터넷 익스플로러 6 환경에서는 구글 광고 및 위젯 사이에는 인쇄CSS 적용에서 약간의 문제가 있다.

적용 및 원리

티스토리에서는 게시글 부분이 따로 분리되어 있다. 그 점을 이용하여 인쇄할 때 나타날 부분만 골라낼 수 있다. 또한 내가 했던 것처럼 자세히 할 필요도 없다. 그저 본문만 남겨도 된다.

이때 몇 가지를 중시해야 한다. 우선 티스토리 HTML 파일은 들여쓰기가 되어 있다. 이때 같은 단계끼리 짝을 짓도록 노력하라. 화면에서 보이지 않게 할 부분을 찾아, 그것이 HTML 코드의 어느 부분인지를 알아내야 한다. 그 뒤에 알맞은 곳에 noprint 클래스를 삽입하여야 한다. 아래 그림에서는 <s_tb> 태그에 noprint 클래스를 삽입하였다.

가장 중요한 것은 본문을 잘 찾아야 한다는 점이다. 왜냐하면 본문은 반드시 인쇄할 때 종이에 출력되어야 하기 때문이다. 자세한 사항은 티스토리 스킨 제작 가이드에 나오는 스킨의 구조를 살펴보시기 바랍니다. 간단히 말한다면, 구글 광고가 없다면, <div class="article"> 태그를 찾아야 합니다. 구글 광고가 있다면 <div class="article">를 찾고, 그 뒤에 <div class="article_post"> 태그를 찾아야 합니다. 특히 <div class="article_post"> 부분은 티스토리 글쓰기에서 입력한 내용이 나타나는 부분입니다. 치환자가 바로 본문을 만들어 주는 부분입니다. 이때 article 클래스 및 article 클래스 모듬[각주:6]이 화면에서 "게시글"을 이루게 됩니다. 앞서 말한 "본문"은 그러한 의미입니다. 따라서 인쇄할 때도 이 article 클래스 모듬 부분이 주를 이루게 해야 합니다.

그 다음으로 중요한 것은 paging 아이디 선택자와 header 아이디 선택자를 찾아야 한다. 이 두 부분은 반드시 인쇄할 때 출력하지 않아야 하기 때문이다. header 부분은 방문객에게는 쓸모가 없는 부분이 많고, paging 부분은 저작권 정보에 해당하는데 화면 구성에서는 옳지만, 인쇄에서는 그 저작권 정보가 그다지 유용하지 않다. 그러므로 인쇄할 때는 나타나지 않게 해야 한다. 하지만 이 부분을 모두 인쇄에서 나타나지 않게 하려면 굳이 HTML에서 찾기보다 인쇄CSS 파일에 아래와 같이 처리하면 된다.

  1. #paging     { display:none }
  2. #header     { display:none }

나머지 부분은 스스로 잘 찾아서 잘 처리하기 바란다.

PDF 저장

원래 인쇄CSS에 관심을 가지게 된 까닭이 바로 웹페이지를 PDF로 저장해 주는 기능 때문이었다. 이것은 도아의 세상사는 이야기의 게시글 블로그에 PDF 저장 단추를 달자를 읽고 나서 생각했다. 자신의 홈페이지나 블로그에 PDF 단추를 다는 기능은 도아의 세상사는 이야기를 참고하기 바란다.

각설하고, 이 PDF 저장 단추도 인쇄CSS를 이용하기 때문에 자신의 홈페이지에 인쇄CSS를 적용해 두면 PDF 저장 기능에서 더 짧은 시간에 그 기능을 이용할 수 있다. PDF 저장 기능은 외국 사이트에 웹페이지 정보를 보내면, 그곳에서 PDF로 저장해서 자신의 컴퓨터로 내려받을 수 있게 해 주는 서비스이기 때문이다.

아래 다운로드는 왕미친세상에 달아둔 PDF 저장 단추를 클릭하여 만든 PDF 파일이다. 참고하기 바란다.

다운로드

다음과 같이 아이디 페이지를 PDF 파일로 변환하였다.

관련 문서

  • 도아 님의 블로그 도아의 세상사는 이야기 : 블로그에 PDF 저장 단추를 달자
  • Learn CSS : CSS 문법을 한국어로 번역해 놓은 사이트. 글자가 깨질 수도 있다. 문자셋을 한국어 (UTF-8) 또는 유니코드 (UTF-8)로 맞추면 해결된다.

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

  1. 참고로 파이어폭스는 전체 5쪽이었다. [본문으로]
  2. 인터넷 익스플로러 6은 CSS를 제대로 지원하지 못하고 있다. 이는 모질라 파이어폭스도 비슷하나, 인터넷 익스플로러에 비하면 매우 양호하다. 또한 인터넷 익스플로러 사용자가 많으므로 자료화면은 인터넷 익스플로러에서 따왔다. [본문으로]
  3. 참고로 파이어폭스는 80% 축소 인쇄로 전체 3쪽, 100% 인쇄로 전체 4쪽이었다. [본문으로]
  4. 파이어폭스에서는 아예 구글 광고가 사라져 있다(두 번째 그림) [본문으로]
  5. 파이어 폭스에서는 위젯 없이 공백으로 남아 있다. 이 부분에 대해 좀 더 연구가 필요하다. [본문으로]
  6. article 및 article_ 로 시작하는 클래스를 편의상 article 클래스 모듬이라고 하겠다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

IF 명령은 FOR 명령과 함께 배치파일에서 지원하는 제어 명령이다. 또한 윈도XP는 도스의 그것보다 훨씬 강력한 기능을 제공하고 있다. 이때 if 명령은 가정문을 만들고, for 명령은 반복문을 만드는 데 쓰인다.

말뜻

IF는 말 그대로 "만약"이라는 뜻을 가지고 있다. 그러므로 이 명령어를 발견하면 영어를 읽듯이 읽어가면 된다.

  • 참고 : 프로그래을 짜다 보면 프로그래밍 언어의 어순은 영어의 그것과 아주 비슷함을 알 수 있다. 또한 수학의 수식이 배열되는 순서도 영어의 어순과 많이 닮아 있다.

if 기본 문법

명령줄에서 if 사용

if를 명령줄에서 쓸 수도 있지만, 주로 배치파일 안에서 쓰인다.

위 그림을 보면 분명히 명령줄에서 if 명령을 사용하고 있다. 처음 명령은 현재 디렉터리 아래에 aa 디렉터리가 존재하지 않는다면 Not found를 출력하는 명령이며, 둘째 명령은 c:\2 디렉터리가 존재하면 Found를 출력하는 명령이다.

기본 문법

명령줄에서 다음과 같이 입력하면 기본 사용법을 알 수 있다.

if /?

일단 if 명령은 조건문에서 나타나는 결과에 따라 명령어를 수행하게 됩니다. 이때 조건문은 다음과 같은 세 가지입니다.

  • 에러레벨문 : IF [NOT] ERRORLEVEL 숫자 명령어
  • 문자열 비교문 : IF [NOT] 문자열1==문자열2 명령어
  • 파일 존재 검사문 : IF [NOT] EXIST 파일이름 명령어

if 문은 위 세 가지 경우에 각 조건문이 참값을 가지면 뒤따르는 명령어를 실행시킵니다. 또한 세 가지 모두 "NOT"을 사용하여 조건문이 거짓인 경우에 명령어를 실행시킬 수도 있습니다. if, not, errorlevel, exist 등은 대/소문자를 가립니다. 대문자와 소문자를 구별하지 않으려면 /i 선택사항을 이용하면 됩니다. 다만 이 /i 선택사항은 명령 확장을 이용해야 한다. 다시 말해 도스의 if 명령과 호환성이 없다.

이 기본 문법에서는 명령 확장을 제외한 사항만 다룹니다.

말뜻

  • NOT은 영어 뜻 그대로 풀이하면 됩니다. 다시 말해 "~이 아니면"이라고 해석하면 됩니다.
  • ERRORLEVEL은 마지막으로 실행된 프로그램이 실행 결과로서 사용자에게 반환하는 마침 코드를 가리킵니다. 흔히 반환값이라고 부르며, 0부터 255 사이의 값을 가집니다. 일반적으로 "error level"이라고 띄어 쓰지만, 배치파일에서는 "errorlevel"이라고 자주 붙여 씁니다. 또한 ERRORLEVEL과 %ERRORLEVEL%은 서로 다르므로 주의해야 합니다. 마침코드가 뒤따르는 수보다 크거나 같으면 조건을 참으로 지정합니다.
  • 문자열은 "문자의 배열"이라는 뜻입니다. 쉽게 말하자면 화면에 보이는 글자의 모임 또는 묶음이거나, 기억장치에 저장된 문자의 모임 또는 묶음입니다. 명령줄에서 문자열은 <Enter>가 입력될 때까지 명령줄에 나타난 문자의 모임입니다. 또한 환경변수에 저장된 값은 기본적으로 문자열입니다. 이렇듯이 가리키는 대상에 따라 문자열은 조금씩 다르지만, 문자의 모임 또는 문자의 묶음이라는 점에서는 항상 같습니다.
  • 문자열의 비교 : 문자열을 비교할 때는 등호를 두 번 써서 비교합니다. 다시 말해 "문자열1==문자열2"와 같은 꼴로 비교하게 됩니다.
  • EXIST는 "존재한다"라는 뜻입니다. 이것은 항상 뒤따르는 파일이나 디렉터리가 존재하는지를 묻고, 존재하면 조건을 참으로 지정합니다.
  • ELSE는 "~이 아니면"이라는 뜻입니다. 이것은 앞서 나온 IF 명령이 조건을 거짓으로 지정할 경우에 실행하게 됩니다. IF 기본 명령에서는 다루지 않습니다.

예제

ERRORLEVEL문

마침 코드를 검사하여 알맞은 문장을 보여줍니다.

  1. @echo off
  2. rem 파일명 : GBackup1H2P.cmd
  3. rem 지은이 : koc2000/SALM
  4. rem 저작권 : GPL v3
  5.  
  6. rem 예제 11-1.
  7. rem 고스트 작업이 정상적으로 끝났는지를 알려준다.
  8.  
  9. rem 첫 번째 하드디스크 첫 번째 파티션에서
  10. rem 첫 번째 하드디스크 두 번째 파티션으로 백업한다.
  11. GHOST.exe -CLONE,MODE=PDUMP,SRC=1:1,DST=1:2\GHOST.GHO -Z9 -AUTO -SURE -RB
  12.  
  13. REM ERRORLEVEL 값이 1보다 작으면 NOERROR로 이동한다.
  14. IF NOT ERRORLEVEL 1 GOTO NOERROR
  15.     ECHO ##############################################
  16.     ECHO ##      백업 도중 오류가 발생했습니다.      ##
  17.     ECHO ##############################################
  18.     GOTO END
  19.  
  20. :NOERROR
  21.     ECHO ##############################################
  22.     ECHO ##    백업 작업을 정상적으로 마쳤습니다.    ##
  23.     ECHO ##############################################
  24.  
  25. :END
  26. REM 배치파일을 종료할 때 마침 코드를 되돌려준다.
  27. REM 이때 %ERRORLEVEL% 환경변수는 일종의 SET 명령 확장에 해당한다.
  28. EXIT /B %ERRORLEVEL%

시만텍 사의 프로그램은 오류가 발생하지 않으면 마침 코드로 0을 돌려주고, 오류가 발생하면 1 또는 1보다 큰 값을 돌려준다. 그것을 이용하여 고스트가 제대로 작업을 마쳤는지를 사용자에게 알려줄 수 있다.

  • 참고 : 위 GBackup1H2P.cmd 배치파일은 실패작이다. 배치파일을 실행할 환경을 고려하지 않고 작성한 탓에 도스에서도 윈도에서도 디스크를 백업한다는 본래 목적대로 실행이 되지 않는다. 물론 ERRORLEVEL문을 시험하는 예제라는 의미에서는 잘 작동한다.

문자열 비교문

if 명령을 이용하여 문자열을 비교할 수 있다. 도스에서는 문자열에 공백이 들어가는 경우가 없으나, 윈도에서는 공백이 들어갈 수도 있다.

앞서 만든 HelloWho2.cmd 파일을 참조하여 매개변수를 출력하는 배치파일을 만들었다.

  1. @ECHO OFF
  2. REM 파일명 : ViewPara.bat
  3. REM 지은이 : koc2000/SALM
  4. REM 저작권 : GPL v3
  5.  
  6. REM 예제 11-2.
  7. REM 매개변수를 한 줄에 하나씩 보여준다.
  8.  
  9. REM 가장 먼저 %0을 보여준다.
  10. ECHO %0
  11.  
  12. REM for 명령을 쓰지 않고 순환문을 만든다.
  13. :LOOP_START
  14.     REM %1 매개변수가 없으면 순환문을 끝낸다.
  15.     IF * == %1* GOTO :LOOP_END
  16.  
  17.     REM %1 매개변수를 출력한다.
  18.     ECHO %1
  19.  
  20.     REM %(N) 매개변수를 %(N-1) 매개변수로 자리 이동한다.
  21.     SHIFT
  22.  
  23.     GOTO :LOOP_START
  24. :LOOP_END
  25.  
  26. :END

GOTO 명령은 배치파일 내부에서 레이블이 있는 곳으로 CMD.EXE 명령줄을 옮기는 역할을 한다. 레이블은 앞에 콜론( : )을 붙여 구분하고 있다.

또한 SHIFT 명령은 %0부터 %9까지의 매개변수의 순서를 바꾸어 주는 역할을 한다. 다시 말해 %9는 %8이 되고, %8은 %7이 된다. 그렇게 하나씩 이동하며 %1은 %0이 된다. 또한 %9 바깥에 있던, 지금까지 표현하지 못했던, %10의 위치에 있던 값을 %9로 옮겨 준다.

ViewPara.bat 배치 파일은 윈도와 도스에서 모두 실행할 수 있으나, 실행 결과는 항상 같지 않다.


위는 윈도XP의 명령 프롬프트이며, 아래는 버추얼박스에서 도스 v6.22를 실행한 화면이다. 다른 경우는 모두 같지만, 따옴표로 묶인 부분을 처리하는 방법이 다르다. 다시 말해 윈도XP에서는 따옴표로 묶인 부분은 하나의 문자열로 보았지만, 도스에서는 따옴표는 무시하고 화이트스페이스(공백문자)로 나뉜 부분을 문자열로 보았다.

또한 이 문자열 비교문은 운영체제의 환경변수를 비교할 때도 쓸 수 있다.

파일 존재 검사문

배치파일은 작업에 앞서 파일이나 디렉터리가 존재하는지를 알아볼 수 있는 방법을 제공한다. 바로 "if exist"라는 구문이다.

  1. @ECHO OFF
  2. REM 파일명 : FindFile.cmd
  3. REM 지은이 : koc2000/SALM
  4. REM 저작권 : GPL v3
  5.  
  6. REM 예제 11-3.
  7. REM 명령줄에서 지정한 파일이 현재 경로에 있는지를 알려준다.
  8.  
  9. REM 판별 : %1이 없으면 도움말을 보여준다.
  10. IF * == %1* GOTO :ViewHelp
  11.  
  12. REM 판별 : %1이 있으면 그 파일이 있는지를 보여준다.
  13. IF EXIST %1 GOTO :Found
  14. ECHO File %1 was Not Found.
  15. ECHO.
  16. GOTO :END
  17.  
  18. :Found
  19. ECHO File %1 was Found.
  20. ECHO.
  21. GOTO :END
  22.  
  23. REM 도움말
  24. :ViewHelp
  25. ECHO FindFile v0.0.1
  26. ECHO Syntax : FindFile FileName
  27. ECHO.
  28.  
  29. :END

명령줄에서 매개변수로 파일명을 입력받아, 그 파일명에 해당하는 파일이 존재하는지를 알려준다.

 

다음 예고

IF 명령을 하나씩 짚어보자. (1)

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

'스크립트 > 배치파일' 카테고리의 다른 글

IF EXIST  (0) 2009.04.15
IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
배치파일에 매개변수 전달하기 2  (5) 2009.04.04
배치파일에 매개변수 전달하기  (0) 2009.04.01
배치파일 멈추기  (1) 2009.03.29
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

읽기에 앞서

네이버 블로그에 질문을 올렸더니 아주 황당한 답변이 왔다. 바로 "삭제한 파일이기 때문에 접근할 수 없다."라고 했다. ㅡㅡ; 도대체 지금도 멀쩡히 있는 테스트 페이지테스트 파일을 무슨 근거로 삭제되었다고 하는지 모르겠다.

그리고 네이버의 외부링크는 IMG 태그나 OBJECT, EMBED 태그 등으로 연결된 자료뿐만 아니라 A 태그로 연결된 자료도 제한하고 있다.

벌레의 유형

네이버 블로그에 그림 파일이나 그밖에 파일을 올리면 그 저작권 설정(또는 공개 설정)에 상관 없이 네이버 안에서만 이용할 수 있다.
  • 이 벌레는 유난히 거짓말이 심하다. 2003년 무렵 웹상에 있으면 당연히 접근할 수 있다는 요지의 답변을 받은 적이 있기 때문이다.
  • 이 벌레는 네이버 외부에서 들어오는 접근을, 웹파일(HTML 등)으로 들어오는 접근이 아니라면, 우선 막고 보는 강력한 결계를 작동시킨다. ㅡㅡ;
  • 블로그도 웹(WWW)이기 때문에 게시자는 누구나 자신의 게시물을 자신이 설정한 저작권 규칙에 따라 이용할 수 있으리라 생각하고 게시하게 된다. 내 경우는 특별한 의미나 가치가 없다면 대부분 [저작자표시-사용제한금지-동일조건변경허락]이라는 지극히 자유로운 조건을 내걸고 있다. 그런데 이 경우 네이버처럼 접근 제한을 걸게 되면, 오히려 저작권 위반이 된다고 여겨진다. 결국 네이버 블로그에서는 CC-BY-SA 자료는 서버에 올릴 수 없다는 결론에 도달한다. 설령 서버에 올리더라도 실제로 이용할 수 있는 것은 네이버 사용자뿐일는지도 모른다.

벌레의 발견

이 벌레는 네이버에 대해 검색하면서 우연히 알게 되었다. 그러나 그에 대해 그다지 깊이 생각하지 않았다. 그러다가 유난히 네이버를 싫어하는[각주:1] 도아 님의 블로그에서도 확인하게 되자 조금은 의심하게 되었다.

쇠뿔도 단 김에 빼자고, 네이버 아이디를 가지고 있는 김에 블로그도 만들었다. 그리고 파일을 올렸다. 올리는 도중에 이상한 벌레도 만났다. 아무튼 파일을 서버에 올린 뒤 외부에서 접근했다.

일단 위의 그림이 어떻게 보이는지부터 알아보자. 아래에는 <img src="http://blogfiles13.naver.net/data41/2009/4/5/156/test-naver_superior2000.png" width="493" height="299"> 라는 태그가 있으나 빈줄로 나타난다.

 

아울러 위의 두 파일 모두 HTTP404 오류를 보이면서 정상적인 접근을 할 수 없었다. 다시 말해 A 태그로 연결된 경우도 제한하고 있다는 뜻이다.

정상 상태라면 아래처럼 보여야 했다.

이때 특이한 현상을 발견했는데, 바로 주소 표시줄에 주소를 입력하고 엔터를 치면 위와 같은 정상적인 화면을 보여준다는 점이다. 이 말은 그림 파일을 A 태그나 IMG 태그를 써서 화면에서 볼 수는 없지만, 다운로드는 가능하다는 말이다. 그런데 그림 파일을 직접 화면에서 보지 않고 다운로드 하는 사람이 얼마나 될까? 더구나 내가 올리는 파일은 "예술적"인 이미지도 아니라서 그림 하나를 받느니, 차라리 페이지 전체를 받는 쪽이 훨씬 이익이다.

그때는 무슨 일이?

한편 2003년 11월에 내가 만든 홈페이지가 네이버에 엉뚱하게 등록되어 있는 문제로 약간의 다툼이 생겼다. 그때 아래와 같은 답변을 받았다.

재미 있는 점은 세 가지이다. (1) 하나는 네이버봇의 업데이트 시기에 웹상에 웹문서가 떠있다면 웹문서 검색결과로 나오는 것은 당연한 일이라고 말한다는 점과, (2) 다른 하나는 내가 홈페이지 등록을 요청했다고 하는 점이며, (3) 마지막으로 고객이 등록 요청한 이상 검색에 나와서 문제가 되는 개인정보라고 볼 수 없다고 "생각한다"는 답변이었다.
이 세 가지 모두 당시도 지금도 말이 안 되는 사항이다. (1)번에 대해서는 robots.txt로 설정되어서 구글조차 접근하지 못하던 때였다. 오직 네이버만 접근해서 데이터를 긁어갔다는 뜻이 된다(현재는 구글만 접근 가능하다). (2)번에 대해서는 내가 등록을 요청한 적이 없다. 내가 요청한 바는 네이버 등록 갱신 거부였다. (3)번에 대해서는 웹에 공개된 정보라도 문제가 되는 개인정보일 수 있다는 점이다. 이 점은 좀 더 뒤(2004년 무렵)에 구글에서 개인 주민등록번호가 검색되어서 물의를 빚었다. 다시 말해 네이버의 말은 이치에 맞지 않는다.[각주:2]

다음 그림은 2003년에 보냈던 개별 페이지가 검색되지 않도록 조치해 달라고 했다. 이 내용은 내가 등록 갱신 거부를 하자, 그게 불가능하다고 해서 네이버에서 답변이 오자 요청 내용을 바꾸게 되었다.

위의 요청을 하기 전에는 어떤 것이었냐고? 내용까지는 필요없고, 제목만 보여 주겠다.

내용을 몰라서 서운한 점은 없으리라 생각한다. 네이버 고객센터에서는 친절하게 메일 제목을 그대로 되돌려주었기 때문이다. 2002년 12월 19일에 받은 답변이다. 분명히 "홈페이지 등록 갱신을 거부합니다."라고 했다. 내가 홈페이지 등록을 요청한 적이 한 번도 없다는 점은 두말하면 입 아프다.

네이버봇은 되고, 사람은 안 된다?

내 홈페이지 등록이야 이미 오래전에 지나간 일이니 넘어가기로 하고, 지금 중요한 점은 다른 데 있다.

바로 위의 내용대로라면 네이버봇은 접근 금지한 웹페이지 접근해도 되며, 사람은 접근 허용된 웹페이지조차 접근할 수 없다는 점이다.

웹문서 검색결과는 웹상에 존재하는 문서에 대해서 네이버의 웹문서 검색 로봇이 주기적으로 색인 하여 웹문서 검색에 반영 하는 것으로, 방대한 분량의 웹문서를 색인 하는데에는 오랜 시간이 소요되므로 실제 웹상에 존재하는 데이터와의 시간차가 생길 수 있습니다.
웹문서의 변경된 내용은 3~4주의 간격으로 자동으로 업데이트가 됩니다.
그 업데이트시기에 웹상에 고객님의 웹문서가 떠있다면 웹문서 검색결과로 나오는 것은 당연한 일입니다. 웹문서 검색로봇은 등록된 홈페이지와 등록요청한 홈페이지, 다른 사이트에 등록된 홈페이지까지 포함해서 검색되는 기능입니다.

아무것도 아니라고 여길 수도 있는 위의 내용은 분명히 네이버봇(네이버의 웹문서 검색 로봇)이 웹상에 존재하는 문서에 접근하고 있음을 뜻하고 있으며, 그에 대해 웹상에 있다면 당연히 검색결과로 나온다고 하였다. 이것은 곧 웹상에 있으면 접근을 막을 수 없다는 결론에 도달한다. 나아가 앞서 말한 robots.txt로 막았더라도 접근할 수 있다고 주장하고 있다.

그런데 이번 네이버 블로그 데이터를 외부에서 접근하기 힘든 사건은 그러한 네이버의 답변을 정면으로 부정하고 있다. 다시 말해 네이버 블로그에 대해서는 내가 네이버로부터 2003년에 받은 답변은 사실이 아니다.

도아 님이 말씀한 "세상에서 가장 심한 욕"이 절실히 느껴진다.

회사 측 답변

2009년 4월 8일 현재 답변을 받았다. 그런데 아주 어이없는 답변이다.

어이가 없을 지경이다. 지금도 웹에 있는 그림이거늘, 삭제되었다니?

아래의 길쭉한 파일은 메일 원본을 잡은 화면이다.

관련 문서

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

  1. 아니다. 유난히 몹쓸짓을 네이버가 많이 했기 때문이다. [본문으로]
  2. 그게 이치에 맞는다면, 네이버는 주민등록번호를 검색해서 모아도 된다는 네이버스러운 사고방식이다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

아이디

2009. 4. 6. 17:29

내 아이디는 남들이 유체스럽게 여긴다. 별명 또는 ID 등을 남들과는 다르게 지어왔기 때문에 그런 듯싶다.

nite2000

nite2000은 내가 PC통신을 처음 쓸 때 지은 아이디이다. 당시 별명은 짓지 않은 것으로 기억한다.

이 아이디는 knight2000과 발음("나이트이천" 또는 "나이트 투 사운전드")이 같았기 때문에 지은 것으로 당시(1996년) 아이디가 8자까지 지원했기 때문에 그렇게 지었었다.

이것을 보고 있으면 내 이름의 두 자를 알 수 있다.[각주:1]

나중에 내가 nite2000@hotmail.com을 최초의 이메일 아이디로 삼은 것도 절대 우연이 아니었다. 이 이메일 주소는 현재 접속하고 있지 않다. 삭제되었을 수도 있다.

당시에는 뒤에 숫자를 붙인 아이디는 그 앞에 있는 로마자에 해당하는 아이디를 다른 사람이 선점하고 있기 때문으로 여기는 사람이 많았다. 그 탓에 nite와 관련한 아이디가 적어도 수십명은 되느냐는 질문을 자주 받았다. 아무튼 나는 당시에 그다지 중요하게 여기지 않던 꼬리표에 불과한 숫자에도 의미를 부여한 셈이었다.

여기에는 한 가지 이유가 더 있다.

knight2000

knight2000은 내가 가진 두 번째 아이디이다.

당시 한메일에 가입하면서 아이디를 여덟 자보다 길게 지어도 된다고 해서 내가 짓고 싶었던 이름을 지었다. 그것이 바로 이것, knight2000 !

이 knight2000은 짧게 줄여 K2000으로 불리기도 한다. 얼마 전에 이것과 관련한 미국 드라마 후속편이 방영되었다. 아, 내가 그것을 보았냐고? 그 후속편은 보지 못했지만, 어릴 적에는 자주 보던 미국 드라마이다. 바로 knight2000은 키트(KITT)의 코드네임이다. 당시에는 전격Z작전으로 불렸다.

이 이름 때문에 nite2000과 같은 아이디도 태어날 수 있었다.

knight2k 및 night2k

night2k은 실수로 만들어진 아이디이다. knight2k를 만들려다 처음 k를 빼먹어서 만들어진 아이디이니 말이다. 현재 이 두 아이디가 모두 쓰이고 있다. 물론 서로 다른 사이트에서!

또한 여기에서 처음으로 2k라는 꼬리표가 붙었다. 이 2k 꼬리표가 나온 배경은 "2000"이 인기를 끌었기 때문이다. 1998년 말부터 갑자기 아이디에 "2000"을 붙이는 것이 유행이 되었다. 그러다 보니 knight2000과 같은 아이디를 선점하지 못한 나는 궁여지책으로 knight2k라고 지어야 했다.

당시에 가장 듣기 싫은 말이 이런 거였다.

야, 너도 유행 따라하냐?

내가 워낙 유행과는 동떨어져 있었는데, 내 아이디에는 "2000"이 꼬박꼬박 붙어 있으니 저런 소리를 내게 했는데, 그때는 참 기분이 좋지 않았다.

이래 봬도 난 원조란 말이다.

아무튼 이때 만들어진 아이디로는 skeleton2k(포트리스), nite2k(기억 안 남) 등이 있다.

salm2000 및 koc2000

salm2000을 만든 이유는 그냥 재귀약자를 만들어보고 싶어서이다. 반면에 koc2000은 내 별명과 음란물에 자주 나오던 coke를 흉내낸 아이디이다.

koc2000은 딱 한 번 쓰였다(어느 사이트인지는 기억 안 남). 현재는 아이디가 아닌 별명으로 쓰이고 있다.[각주:2]

SALM stood for SALM Ain't a Life Model.

SALM is not the life model, but SALM is just the life.

굳이 해석하자면 다음과 같다.

삶(SALM)은 'SALM은 생활양식이 아니다.'를 나타낸다.

삶은 어느 한 생활양식이 아니라, 생활 그 자체이기 때문이다.

이것은 LAME에서 따온 말이다.

LAME originally stood for LAME Ain't an Mp3 Encoder.

보면 알겠지만, 문장 형식은 완전히 같다.

salm2000을 아주 심사숙고해서 만들었다면, koc2000은 반쯤 장난으로 만들었다. 그도 그럴 것이 coke는 남성의 성기를 가리키는 속어이기 때문이다. koc은 그것과 발음이 같다. 원리만 따지자면 nite가 knight의 발음을 따서 만든 것과 같은 맥락이다.

흠, 그런데 당시 내 별명이 무엇이었냐고?

kingofcrazy

kingofcrazy 아이디는 한 곳에 쓰였고, 지금도 쓰고 있다.

알기 쉽게 풀어 쓰면 "the king of the crazy"이다. 이때 the를 떼면 뜻이 달라질 수도 있지만, 아이디에 쓸 때는 떼어버렸다. 왠지 이상해 보였기 때문이다.

"the king of the crazy"은 어떤 뜻이 있냐고? "미친 사람들의 왕"이다. 굳이 바꾼다면 "왕미친놈"이다. crazy가 형용사이기 때문에 앞에 the를 붙이면 "~한 사람들"이 된다. 그런 까닭에 "the king of the crazy"이 왕미친놈을 뜻하게 된다.

앞서 말한 koc2000도 "the king of the crazy"에서 나온 아이디이자 별명이다.

내가 언제부터 미친놈이라 불렸는지 내 기억에도 없다. 아주 오래되었음은 틀림없다. 어느 때부터 나는 미친놈, 또라이(돌아이) 등으로 불리고 있었다. 순화해서 "기인"으로 불리기도 했다. 그렇게 불린 까닭은 확실히 알고 있다. 내가 다른 사람과 달랐기 때문이다. 물론 이 미친놈, 또라이 등의 말은 따돌림의 상징이었다. 나를 따돌릴 목적으로, 그들과 다른 나를 그런 이름으로 불렀기 때문이다.

아무튼 가장 오래된 기억으로는 중학교 2학년 때였다. 그 뒤 고등학교 2학년 때에는 약간 특이하게 미스테리우스(Mysterious)라고 불리기도 했다. 도대체 종잡을 수 없었기 때문에 그렇게 불렀다. 

참고로 나는 고등학교 1학년 때 반에서 꼴찌를 하였다. 내신으로 따지자면 15등급이나 14등급 쯤이다. 그래도 4년제 대학을 입학하고 졸업했다. 물론 대학생활이라고 정상적이지는 않았다. 어찌보면 어릴 적부터 왕따 당하기 전부터 내 행동은 남들과 달랐다. 내 스스로 그것을 알고 있었지만, 남들과 같아지려는 생각이 없었고, 노력은 더욱 하지 않았다. 오히려 반대로 달라지려는 노력이 더 많았다고 생각한다.

온라인에 아이디를 만들 무렵부터 아이디는 knight을 뜻하는 낱말로 만들었고, 별명을 만들기 시작할 무렵부터 줄곧 "왕미"를 별명으로 삼았다. "미친"이라는 말은 금칙어였기 때문에 "왕미할배" 등으로 바꾸었다. 왕미할배는 내가 속한 동아리에서 가장 나이가 많았기 때문에 붙인 별명이었다.

salm

최근에 만든 아이디는 그냥 salm이다. 종전과는 달리 2000을 붙이지 않았다. 내 아이디를 보는 사람마다 "너무 길다."라는 평을 했기 때문이다.

그래서 짧은 것이 좋다는 생각에 salm이라는 아주 짧은 아이디를 만들게 되었다.

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

  1. 왕미친세상에서 자료를 받은 사람은 내 실명을 알 가능성이 높다. 여기에는 굳이 내 실명을 밝히지 않겠다. [본문으로]
  2. 물론 블로그 왕미친세상의 로마자 이름이기도 하다. [본문으로]

'일기' 카테고리의 다른 글

그가 죽었습니다.  (1) 2009.05.23
블로그 둘째 달  (0) 2009.05.01
블로그, 첫 한 달  (0) 2009.03.28
나는 백수인가?  (0) 2009.03.24
"사랑했던"일까?  (0) 2009.03.21
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

팁텍

처음 올리는 팁이다. 그런데 처음부터 황당한 팁이다. 또한 전혀 효과가 없을 수도 있다. 왜? 압축이지만 압축이 아니기 때문이다. 다만 이 팁을 잘 쓰면 확실히 용량을 줄일 수 있다.

  • 참고 : 이 글에서 다루는 비주얼 스튜디오 익스프레스(Visual Studio Express)의 최신 버전은 Visual Studio 2008 Express 이며, 마이크로소프트 MSDN 홈페이지에서 무료로 구할 수 있다. 이 비주얼 스튜디오 익스프레스는 비주얼 스튜디오의 축약 버전이라서 기능에 제한이 있고, 상업용 프로그램 제작에도 제약을 가지고 있다. 하지만 당장 쓸 만한 프로그래밍 툴 및 프로그래밍 통합 환경(IDE)을 구할 수 없다면, 이것도 좋은 대안이 될 수 있다.

팁의 발견

오랜만에 비주얼 스튜디오 2005 익스프레스(Visual Studio 2005 Express)를 설치하려고 하드디스크에 잠들어 있던 iso 파일을 뒤졌다. 그런데 막상 이미지를 살펴보니 너무 중복 파일이 많았다. 일단 하위 폴더인 WCU를 옮겨 보니~ 아뿔싸! 먼저 설치하지 않는 한 옮기게 되면 설치 도중 오류가 발생한다. ㅡㅡ; 쳇!

이 경우 이미지 안에 있는 WCU 폴더에서 먼저 설치한 뒤에 본 프로그램을 설치하면 되지만, 폴더를 옮긴 뒤에 항상 기억할 수 있다는 보장이 없었다.

또한 비슷비슷한 이미지가 모두 다섯 개였다. VB.iso, VC.iso, VCS.iso, VJS.iso, VWD.iso. 참고로 비주얼 스튜디오 익스프레스는 무료이며. ^^a 이미지 파일 내부 경로의 구조는 위와 같다(이때 VB 폴더는 없지만, 압축을 풀었을 때는 저와 같이 된다.). 이때 WCU 폴더가 다른 이미지 파일에도 거의 똑같이 존재한다.

이때 생각난 것이 바로 마이크로소프트에서 배포하는 oscdimg 프로그램이다. 이 프로그램은 마이크로소프트에서 CD 이미지를 만들 수 있게 제공하는 프로그램이다. 최신 버전은 2.54로 알려져 있다. 주로 쓰이는 버전은 oscdimg의 바로 앞 버전인 CDIMAGE v2.47이다. CDIMAGE v2.47 다음 버전이 oscdimg인데, 기능이 많이 줄어들었다. 그러다가 2.54 버전에서는 CDIMAGE에서 지원하던 기능을 모두 지원하도록 바뀌었다.

설명서는 마이크로소프트 테크넷에서 구할 수 있으며,( http://technet.microsoft.com/ko-kr/library/cc749036.aspx ) oscdimg v2.54용이다.

프로그램 설명

oscdimg의 기본 사용법은 다음과 같다.

OSCDIMG [선택사항] 작업대상(원본) 만들파일

실제로 적용하면 다음과 같다.

OSCDIMG -L볼륨명 -H -M -X -O -N "작업대상(원본)" "만들파일.ISO"

사용자가 지정해야 하는 부분은 굵은 글씨로 하겠다.

처음부터 차례대로 설명하자면 다음과 같다. 선택사항 -L과 -X를 제외한 나머지는 반드시 지정해야 한다. -X는 반드시는 아니지만 대부분의 압축파일이 지원하고 있으므로 지정하는 편이 낫다.

  • -L : 볼륨 레이블을 지정합니다. l과 labelname 사이에 공백을 넣지 않습니다. 예: -lMYLABEL

  • -H : 숨김 속성을 가진 디렉터리와 파일을 포함합니다.

  • -M : 이미지의 최대 크기 제한을 무시합니다. 곧 이미지의 크기가 681,984,000바이트보다 크더라도 무시하고 진행합니다.

  • -X : 이미지의 AutoCRC 값을 계산하고 인코딩합니다.

  • -O : MD5 해시 알고리즘으로 파일을 비교해 중복 파일을 한 번만 인코딩하여 저장소를 최적화합니다.

  • -N : (도스의 8.3 이름보다) 긴 파일 이름을 사용합니다.

매개변수 가운데 원본폴더와 만들파일 이름은 만약에 대비하여 위와 같이 따옴표로 묶는 편이 낫다.

적용

이 팁을 생각하게 된 원인은 의외로 단순했다. 이 기술은 수많은 WOW CD에 담긴 파일을 처리하는 방법이다. 그것을 자주 보았지만, 전혀 느끼지 못했다.

그러다가 Visual.Studio.2005.Express.Edition.en.iso (651,726,848 바이트)라는 파일을 보게 되었다. 분명 한국어판에는 저런 CD를 지원하지 않는데, 영어판에는 지원이 되고 있었고, 어떤 이유에서인지 인터넷에 풀려 있었다. 물론 저기에 담긴 파일은 모두 무료 버전으로 비주얼 스튜디오 2005보다 기능의 제약이 많다. 내가 앞서 예를 든 .ISO 파일은 대부분 한글판으로 저렇게 전체를 묶은 CD 이미지를 구할 수 없었다.

아무튼 저런 CD가 나에게 있었으면 좋겠다고 생각하고, 압축을 풀었는데 용량이 2,369,667,072 바이트로 처음보다 3.5배로 늘어나 버렸다. 그것을 본 그때 "이 방법"도 저장 용량을 줄이는 좋은 방법이라는 생각이 머릿속을 스치고 지나갔다.

이 방법은 중복 파일이 많으면 많을수록 효과가 좋다. oscdimg 프로그램은 압축을 해 주는 프로그램이 아니라, 단순히 파일을 묶어서 CD 마스터링 이미지를 만들어주는 프로그램일 뿐이기 때문이다.

  • 참고 : 이때 이런 유틸을 패키징 유틸리티라고 부르는데, 도스와 윈도에서는 대부분의 압축 프로그램이 패키징 기능을 제공하고 있다. 그러나 유닉스 계열에서는 압축 프로그램과 패키징 프로그램이 따로 나뉜 경우가 많다. 대표적인 경우가 바로 tar, deb, rpm 등이다. 특히 tar는 압축 없이 파일을 그냥 묶어만 주는 특이한 프로그램으로, 초기 유닉스에서부터 현존하는 여러 유닉스와 리눅스 등에서도 널리 쓰이는 유틸리티이기도 하다. 유닉스에서는 강력한 파이프라인 기능을 바탕으로 패키징 기능과 압축 기능을 나누어서 사용할 수 있다. 그러나 도스에서는 파이프라인이 64킬로바이트 한계를 지녔기 때문에 파이프라인을 이용하여 크기가 큰 파일이나 파일 수가 많은 디렉터리를 다룰 수 없었다. 결국 압축 파일이 패키징 기능도 갖추어야만 했다. 이런 이유로 이 글에서는 패키징 기능도 압축이라고 설명하겠다.

압축 풀기

우선 Visual.Studio.2005.Express.Edition.en.iso 파일과 VB.iso, VC.iso, VCS.iso, VJS.iso, VWD.iso 파일들을 자신이 만든 임시 폴더에 압축을 풀어 놓자. 편의상 Visual.Studio.2005.Express.Edition.en.iso 파일의 압축을 풀어 VSEN 폴더에 집어넣고, VB.iso, VC.iso, VCS.iso, VJS.iso, VWD.iso 한글판 비주얼 스튜디오 익스프레스 파일들은 각각 파일 이름대로 VB, VC, VCS, VJS, VWD라고 폴더를 만들었다.

참고로 압축을 풀기 전의 용량은 다음과 같다.

  • VB.iso : 555,814,912 바이트
    VC.iso : 587,999,232 바이트
    VCS.iso : 552,095,744 바이트
    VJS.iso : 459,505,664 바이트
    VWD.iso : 562,378,752 바이트
  • 소계 : 2,717,794,304 바이트
  • Visual.Studio.2005.Express.Edition.en.iso : 651,726,848 바이트 (2,369,667,072 바이트 내장)

그렇게 압축을 풀었더니 다음과 같은 폴더 구성을 지니게 되었다.

 

위의 두 그림은 VSKO의 하위 폴더의 수가 2개 모자라서 아래로 내려오게 수정한 것을 제외하면 동일하다. 아, 대/소문자가 다르다고? 윈도에서는 파일 이름과 폴더 이름에서 대/소문자를 쓸 수 있지만, 겉보기로만 다를 뿐 윈도에서 다룰 때는 같다고 인식하므로 문제 없다. 위에는 나타나지 않았지만, VSEN 폴더에는 SQL2005EE.EXE (56,105,688바이트) 파일이 존재했다. 이것은 SQL2005 Express Edition 파일이다. 아무튼 SQL2005 익스프레스 에디션은 내가 가지고 있지 않았기 때문에 이것을 그대로 남기기로 했다. 그밖에 VSEN 폴더에는 익스프레스 에디션 전체 설치를 위한 설치 프로그램이 있었는데, 그것도 그대로 이용하기로 했다.

복사 작업

복사 작업 1

그 뒤 한글판 비주얼스튜디오의 파일을 VSEN 폴더에서 찾아 이름이 같은 폴더끼리 복사해 넣는다. 이때 같은 이름을 가진 파일은 무조건 덮어쓰기를 하였다. 이는 파일 날짜가 한글판이 좀 더 늦었고, 날짜가 늦다는 말은 무언가 기능 추가가 있었을 수도 있기 때문이다. 거기다가 한글판이나 영문판에만 있는 파일도 있는 등의 이유로 전체 용량이 늘어나서 2,786,927,907 바이트가 되었다.

복사 작업 2

그 뒤 WCU 및 그 하위 폴더의 용량과 파일을 비교해야 한다. 폴더 비교에는 WinMerge v2.10.4.0 Unicode 버전을 이용했다. 다만 이 파일 비교 작업은 수작업으로 할 필요 없이 oscdimg 프로그램에 -O 옵션을 주어 처리하면 된다. 이 작업을 굳이 하는 이유는 가끔 하위 버전이 섞이는 때가 있기 때문이다.

각 폴더의 용량은 다음과 같다.

  • VSKO\VB\wcu - 504,992,856 바이트
  • VSKO\VC\wcu - 504,992,856 바이트
  • VSKO\VCS\wcu - 504,992,856 바이트
  • VSKO\VJS\wcu - 410,896,792 바이트 (jsharpredistcore 폴더를 제외하면, 407,100,120 바이트)
  • VSKO\VWD\wcu - 504,992,856 바이트

위에서 VJS\wcu 폴더의 크기는 폴더의 수가 하나 더 많음에도 지나치게 작았다. 이는 dotNetFramework 폴더에 언어팩 파일이 없었고, 그밖에 몇몇 파일에서 차이가 났다. 더구나 MSDN의 축약 버전인 MSDNExpress 파일에서 차이가 심하게 났다.

  • VSKO\VB\wcu\MSDNExpress - 319,828,160 바이트
  • VSKO\VJS\wcu\MSDNExpress - 234,788,544 바이트

나머지 폴더도 확인해 보니 일부 파일 날짜가 다르기는 했다. 결국 VJS 폴더를 제외하면 모두 같은 파일이었다. 또한 VJS 폴더의 MSDNExpress 폴더는 영문판의 것과 같았다는 데에도 덮어쓰는 이유가 있었다.

이와 같은 결과를 바탕으로 VSKO\VB\wcu 폴더의 파일을 VSKO\VJS\wcu 폴더에 복사하여 덮어쓰기로 했다. 복사 전 용량은 2.59GB (2,786,927,907 바이트 )로 표시되었고, 복사 후 용량은 2.68GB (2,884,820,643 바이트)로 표시되었다.

주의 : 이 수작업 복사는 매우 위험하다. 이번 작업에서는 확실히 영문판과 한국어판의 차이를 알고 있었기 때문에 복사해 넣어도 무리가 없었다. 그러나 일반적으로 이렇게 작업하면 나중에 설치 작업이 제대로 이루어지지 않을 수도 있다. 그러므로 확실히 알지 못한다면 이 "복사 작업 2"는 하지 않기를 바란다.

압축 작업

그 뒤 명령줄에서 다음과 같이 입력하여 폴더를 ISO 파일로 바꾸었다. 이때 작업할 대상은 F:\Temp\VSKO 폴더이고, 만들 파일은 F:\Temp\VS2005EK.ISO 파일이다.

OSCDIMG -LVS2005KO -H -M -X -O -N "F:\Temp\VSKO" "F:\Temp\VS2005EK.ISO"

참고로 복사 작업 2를 하지 않고 작업하면 1.02GB (1,096,298,496 바이트)로 표시되며, 복사 작업 2를 하고 작업하면 783MB (821,385,216 바이트)로 표시되었다. 압축 전에는 복사 작업 2를 거쳤을 때 용량이 더 컸지만, 압축한 뒤에는 오히려 복사 작업 2를 거치면 더 용량이 적어진다. 이 압축이 동일한 파일만을 대상으로 삼아 처리하기 때문이다.

이 파일을 다시 압축하면 좀 더 용량을 줄일 수 있다. 그것은 여러분의 선택의 몫이다. 또한 UltraISO 프로그램 등을 이용하면 ISO 파일 자체를 압축한 형태로 지원해 준다(그때 확장자는 .isz로 바뀐다.).

원리

이러한 파일 처리 방식도 압축 기법일까? 당연히 압축 기법이다.

압축에 대한 컴퓨터 알고리듬을 배울 때 맨 처음에 등장하는 알고리듬이 바로 반복 길이 부호화(RLE, Run-length encoding) 알고리듬이다. 예를 들면 다음과 같다.

원문 : FFFFFFFFAAACCCCCCCUUBBBBKXXXXXXXXXDDDDD (39바이트)
압축문 : F8A3C7U2B4K1X9D5 (16바이트)

위와 같이 반복되는 문자의 길이를 수치화하여 전체 코드를 줄이는 방법이다. 곧 반복 되는 문자를 [문자 + 갯수]의 형태로 치환하여 전체 길이를 줄이려는 압축 방법이 반복 길이 부호화 방법의 핵심이다. 다만 간혹 오히려 길이가 늘기도 하는데, 위에서는 K의 경우가 그것에 해당한다.

그런데 oscdimg 파일이 시도하는 방법은 반복 길이 부호화 방법과 원리상 동일하나 그 구현이 조금 다르다. 반복 길이 부호화에서는 파일 내부를 대상으로 삼지만, oscdimg는 디렉터리(폴더) 내부를 내상으로 삼는다. 반복 길이 부호화에서는 파일 내부에서 같은 문자 또는 문자열을 발견하여 치환하지만, oscdimg는 디렉터리 내부에서 MD5 값이 같은 파일을 대상으로 삼는다. 이때 MD5 값은 파일이 같은지를 검증하는 방식 가운데 하나로서 그 값이 같으면 설령 파일 이름이나 만든 날짜가 다르더라도 그 내용이 같게 된다. 반대로 MD5 값이 다른 파일은 설령 파일 이름과 만든 날짜가 모두 같더라도 서로 다른 파일이다. (물론 그에 앞서 파일 크기가 같아야 한다.)

이러한 과정을 거치는 이유는 파일 내부에서는 같은 문자는 같은 비트의 배열로 나타나지만, 디렉터리에서는 파일 이름이나 파일 크기가 같음이 곧 파일 내용이 같다는 뜻은 아니라는 데에서 파일의 실제 내용이 같은지를 알아낼 방법으로써 MD5라는 방법을 사용하고 있다고 보면 된다.

아무튼 mscdimg의 방식은 파일은 그대로 두고 그 갯수를 세는 방식이 아니라, 나올 때마다 그 파일이 위치한 색인 위치를 기억시켜 처음 발견된 곳(또는 저장소에서 따로 지정된 곳)을 참조하게 만들고 있다. 반복 길이 부호화 방식이 중복되는 문자(또는 비트 배열)가 많을수록 압축률이 높아지듯이, 이 방식은 중복되는 파일이 많아지면 전체 용량이 줄어들게 된다.

이번 경우에는 VB, VC, VCS, VJS, VWD 폴더에 WCU 라는 하위 폴더가 거의 동일하게 존재했기 때문에 상당한 용량을 줄일 수 있었다. 또한 앞서 복사 작업 2를 거친 쪽이 압축 전 용량은 더 많았지만, 압축 후 용량은 저 적어진 까닭도 중복 파일이 더 많아졌기 때문이다.

다운로드

  • oscdimg 다운로드 : readme.txt 파일을 읽어보고 자신에게 맞는 프로그램을 쓰면 된다.
  • MD5 값 : 6a27dd39c64f8a8035d4d164c2f439a5
  • CRC32 값 : D57A0CE3

관련 문서

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

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

벌레의 유형

티스토리에 이어 네이버에서도 몸집을 키우는 뻥튀기 벌레가 있었다.

  • 알려주지 않고 파일 용량을 늘리는 벌레 : 몸속에 뻥튀기 기계를 갖추고 있지 않을까?

벌레의 발견

티스토리의 뻥튀기 벌레와 비슷하면서도 조금 다른 벌레이다.

이 벌레도 티스토리에서처럼 업로드 된 뒤에 파일 용량이 커질 수 있다는 경고를 한마디도 하지 않고 있다. 티스토리에서는 파일 형식이 바뀐 반면 네이버 뻥튀기 벌레는 파일 형식은 그대로 유지하면서 파일 크기를 늘이는 벌레이다.

http://blogfiles13.naver.net/data41/2009/4/5/156/test-naver_superior2000.png 파일인데, 자료 화면은 아래와 같다. 분명히 10.12 킬로바이트이고,10364 바이트이다.

그런데 네이버 블로그에 올리기 전의 파일 등록 정보는 아래와 같다.

이 파일은 내가 새벽에 잠이 깨어 멍한 상태에서 작업한 파일이다. 네이버에 올린 파일은 모든 설정을 공개 상태로 놓아도 외부에서 접근할 수 없다는 심증을 가지고, 그에 대한 증거를 얻기 위해 작업한 파일이다. (2009년 4월 5일 오전 11시 12분 52초 현재 그 심증은 확증을 얻은 상태이다.)

또한 네이버 블로그에 글을 올릴 때 설정한 화면은 다음과 같다.

위에서 보면 내가 올린 그림의 섬네일 이미지가 보이면서 "10.1 KB"라고 표기하고 있다. 이미 이미지 파일을 올리는 순간 내 파일을 나에게 알려주지도 않고 마음대로 변형해 버렸다는 증거이다.

그런데 좀 더 아래에 "설정정보"를 보면 전체 공개, 덧글 허용, 본문 스크립 허용(링크도 허용), 검색 허용, 블로그 정보 수집 허용, CCL 표시(위에는 나타나 있지 않지만, "저작자표시-동일조건변경허락"이다.) 등의 설정이 나타나 있다.

여기에서 네이버 뻥튀기 벌레도 티스토리 뻥튀기 벌레처럼 파일 업로드에서 이미 활동하고 있다는 심증을 굳힐 수 있었다.

기타

부수적으로 네이버는 저작권자의 저작권 설정과는 무관하게 외부 링크가 불가능하다는 점도 알게 되었다.

http://blogfiles13.naver.net/data41/2009/4/5/156/test-naver_superior2000.png

위 파일을 클릭하면 새 창(또는 새 탭)이 열리면서 그림 파일을 보여 주어야 하지만, 그림 대신 "The page cannot be found"라는 메시지를 보여주게 된다. 이와 관련하여 다른 게시 글을 올릴 계획이다.

회사 측 답변

2009년 4월 7일 현재 앞으로 수정할 예정이라는 답변을 받았다.

관련 문서

 

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

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

읽기에 앞서

  • 2009년 4월 5일 현재 이 벌레가 KT의 버그 또는 실수 및 고의가 아닐 수도 있습니다. 이 글을 읽을 때 주의해 주시기 바랍니다.
  • 팥빙산 님의 블로그에서 구글 애드센스도 불법정보 사이트였구나... 라는 글을 보면 자료 화면을 볼 수 있다.

벌레의 유형

  • 2009년 4월 4일자 도아 님의 블로그에 게시된 글에서 소개한 벌레이다. 자세한 사항은 http://offree.net/entry/KT-and-Google-AdSensse 에서 볼 수 있다.
  • 벌레 유형 :

    • 불법정보(사이트)가 아님에도 불법정보(사이트)로 보여주는 변태 벌레이다. 이때 변태는 '본래의 형태가 변하여 달라짐'이란 뜻이다.
    • 아울러 구글링 등을 통해 구글 사이트를 IP 주소로써 접근하려는 사람을 변태로 오인케 하는 벌레이다.
    • 사용자가 명백히 불법정보(사이트)가 아님에도 불법정보(사이트)로 오인케 하여, 자신이 취득한 정보에 대해 불신케 하는 불신 조장 벌레이다.
    • 또한 명백하게 불법정보(사이트)를 유통하지 않는 구글의 정상적인 영업을 방해하는 영업 방해 벌레이다.
    • 명백하게 불법정보(사이트)를 유통하지 않는 구글에 개인이 접근할 수 있는 권리를 방해/침해하는 정보 접근권 침해 벌레이다.

벌레의 발견

이 벌레는 도아 님이 발견한 뒤 그 정보를 블로그 도아의 세상사는 이야기에 게시하였다.

평가

이 벌레에 대해서는 다음과 같이 평가할 수 있다.

만약 개인이 특정 사이트를 지목하여 "불법 사이트" 또는 "음란 사이트"라고 공공연히 적시하였다면 어떻게 되었을까? 아마도 증거를 대라느니 하면서 인터넷에서 뜨거운 논쟁을 벌였으리라 생각한다. 심하면 명예훼손 소송 등이 벌어졌을 수도 있다. 그런데 개인도 아니고, 개인의 일탈 행위를 단속해야 할 사이버경찰청에서 그런 "불법 행위"를 자행했다는 사실에서 한국 경찰의 사고방식을 의심해 보지 않을 수 없었다.

그런데 도아 님은 이 벌레에 대해서 사이버경찰청이 아닌 KT에서 저지른 일로 파악하였다. 나도 게시 글을 마지막까지 읽기 전에는 사이버경찰청을 의심했지만, 도아 님이 사무실에서만 위와 같은 현상이 일어나고, 집에서는 일어나지 않는 현상이라고 글을 남기셔서 내가 틀렸다고 결론을 내렸다. (뒤에 댓글을 달아 KT도 아닌 것 같다고 밝혀 주셨다. 이에 대해 4월 5일 현재 원인 불명인 상태가 되었다.)

만약 이것이 KT에서 저지른 필터링 때문에 일어난 일이라고 가정하면 다음과 같은 문제가 발생한다.

KT 측에서는 십중팔구는 그 IP 주소가 구글로 통하거나 그와 관련이 있는 주소임을 알고 있었다고 여겨진다. 그렇다면 그것이 불법정보(사이트)가 아니라는 사실도 알고 있었다는 추론이 가능하고, 그와 함께 실수로 필터링을 하지는 않았다는 추론도 가능하다. 이 경우 KT는 구글에 대한 영업 방해를 저지른 셈이 된다.

한편 구글 애드센스에 가맹하려던 사람은 난데없이 불법정보(사이트) 차단이 나타나자 당황하거나 심히 놀랐을 가능성이 높다. 특히 컴맹인 경우에는 더욱 그러하다. 이것은 "개인 생활에서의 평온"을 깨뜨린 행위로서 "사생활 침해"에 해당한다. 또한 명백히 불법정보(사이트)가 아님에도 오인하게 하는 행위는 개인이 가진 정보 접근권침해하는 행위이기도 하다.

게다가 애드센스 가맹에서 법인에 소속되어 그 업무로서 애드센스에 가맹하려던 사람이 저와 같은 사실이 아닌 정보에 놀라게 되었다면, KT의 필터링 행위(그 필터링이 존재한다고 가정하고)는 또한 법인의 이익 취득을 방해한 혐의를 가지게 된다. 이것은 또한 법인의 영업을 방해한 혐의로도 추론될 수 있다.

제작자/제공자의 답변

이 사건/벌레에 대한 발생 원인 제공자가 누구인지 알지 못하는 상태이다.

관련 문서

 

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

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

들어가기에 앞서 자꾸 예고에 없는 내용이 끼어들어 죄송하다는 말을 먼저 하겠다.

들어가며

매개변수가 배치파일에 전달되는 모습을 그림으로 알아보는 자리를 마련했습니다. 뭐든 그림이 더 알기 쉽다고 생각하기 때문입니다.

말뜻

매개변수(parameter)는 도스와 윈도의 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다고 했습니다. 그런데 좀 더 보편적으로 설명한다면 운영체제와 명령어가 관ㄹ계를 가지고 있는데, 이때 명령어에 어떤 작용을 지시하는 변수를 매개변수라고 부릅니다.

매개변수와 응용프로그램

매개변수는 명령줄에서 입력받는 값이 된다. 이때 도스와 윈도에서 첫번째 매개변수를 %0이라 부르며, 이것은 운영체제에서 처리하게 된다. 다시 말해 %0을 처리하여 이것을 실행할 수 있는지, 실행할 수 없으면 그 파일과 연결된 프로그램을 호출하여 처리합니다. 다시 말해 명령 프롬프트에서 문서 파일 이름을 입력하고 <Enter>를 입력하면 바로 그 문서와 연결된 문서 편집기를 호출하여 실행시켜 준다.

우선 목록은 다음과 같다.

이때 명령줄에서 exam.txt 라고 입력하면 저 파일에 맞는 프로그램을 호출하면서 %0 매개변수로 입력 받은 exam.txt 파일을 읽어온다.

위와 같이 파일이 연결된 프로그램을 가지고 있다면 바로 읽어올 수 있다. 이것은 .txt 파일에 대한 정보를 윈도XP가 레지스트리에 가지고 있기 때문에 가능한 일이다.

이것은 다음과 같이 나타낼 수 있다.

명령줄에 입력된 매개변수는 %0과 %*로 나뉜다. 이때 매개변수 %1부터는 윈도에서 직접 구분하여 매개변수 %0으로 넘겨주는 때도 있고, 그게 아니면 %*과 같은 문자열의 형태로 넘겨줄 수도 있다.

위와 같이 윈도에서 %0 매개변수에 해당하는 ExecFile.exe를 불러들여 실행하면서 %1 매개변수부터는 문자열의 형태 또는 이미 분류된 형태로 %0 매개변수로 넘겨줘서 처리하라고 시키게 된다.

배치파일의 경우는 배치파일 안에 명령어가 하나일 때와 여럿일 때로 구분하여 생각할 수 있다.

위와 같이 배치파일 내부에서 입력 받은 매개변수를 모두 이용할 수도 있고, 그게 아니라 매개 변수 가운데 일부만을 이용할 수도 있다. 그것은 배치파일 제작자가 하기 나름이다. 일부러 더미 변수(쓰레기값)를 입력 받게 할 수도 있다.

배치파일 내부에서 사용한 명령어가 여럿이라면 위와 같이 복잡한 구성을 지닐 수도 있다. 그러나 대개는 %1, %2, %3, %4, %5, %6, %7, %8, %9, %*과 같은 매개변수는 배치파일 첫머리에서 해석하여 프로그래머가 지정한 환경변수로 치환하여 저장하는 것이 일반적이며, 위와 같은 형태는 예시를 들기 위해 나타낸 상황일 뿐임에 유의하자.

실제로 위와 같이 프로그램을 작성했다면, 그다지 좋은 프로그래밍 습관이 아니라고 해야겠다.

과제

지난 시간에 냈던 과제의 결과는 다음과 같다.

  • ECHO 명령을 이용하여 화면에 OFF라는 세 글자를 출력하시오. 
  1. @ECHO.OFF

위의 코드는 아래와 같은 결과를 보인다. 위의 코드에서 ECHO와 OFF 사이에 빨간 점(.)을 잘 보자.

OFF

다음 코드는 OFF 앞에 공백을 한 칸 추가할 수 있다. 공백에는 색깔을 넣었다.

  1. @ECHO. OFF

다음 코드는 OFF 앞에 공백을 두 칸 추가할 수 있다. 공백에는 서로 다른 색깔을 넣었다.

  1. @ECHO.  OFF

다음 코드는 OFF 앞에 공백을 두 칸 추가한 것과 같은 효과를 줄 수 있다. <Alt+255>는 아스키문자 255번을 가리킨다. 위의 코드들과는 달리 빨간 점(.)이 없다.

  1. @ECHO <Alt+255>OFF
 
  • DIR 명령을 이용하여 원하는 폴더(디렉터리)의 내용을 폴더(디렉터리)만 보여주도록 한다. /A /P 선택사항을 반드시 사용할 것.


  1. DIR /A:D /P %1
  2. DIR /AD /P %1

위의 두 코드 가운데 하나가 자신의 배치 파일에 있고, 그것이 실제로 작동하면 정답이다.

다음 예고

if 명령 이해하기.

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

'스크립트 > 배치파일' 카테고리의 다른 글

IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
IF 기본 설명  (6) 2009.04.09
배치파일에 매개변수 전달하기  (0) 2009.04.01
배치파일 멈추기  (1) 2009.03.29
그밖에 출력  (2) 2009.03.26
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

토탈커맨더(Total Commander)를 사용하면서 절대 빼놓을 수 없는 플러그인이 바로 멀티아크(MultiArc)이다.

토탈커맨더로 압축 파일을 다룰 때 기본적으로 다룰 수 있는 몇몇 압축 파일을 제외하고는 압축 플러그인[각주:1]이 필요하다. 이 압축 플러그인은 확장자가 .WCX이므로 몇몇 사이트에서는 "WCX 플러그인"으로도 불린다.

그런데 압축 플러그인이 없다면? 대신 압축을 풀거나 압축할 수 있는 프로그램이 있다면 압축 플러그인처럼 등록이 가능하다. 물론 이때 몇 가지 제약이 있지만, 없는 것보다 나으리라 생각한다. 이때 그러한 압축 프로그램과 토탈 커맨더 사이에서 중계소 역할을 하는 플러그인이 바로 멀티아크이다.

사실 이 멀티아크 플러그인은 그 자체로는 아무런 쓸모도 없다. 그냥 껍데기만 제공해 주는 플러그인이기 때문이다. 반대로 껍데기뿐이기 때문에 그 속알맹이를 사용자가 직접 채울 수 있다는 점에서 대단히 유용한 플러그인이기도 하다. 이는 또한 플러그인을 만들 줄 모르는 사람에게도 역시 유용하기 그지 없다.

프로그램 정보

  • 저작권자/제작자 : 멀티아크 팀(Multiarc Team) / 블라디미르 세르듀크(Vladimir Serdyuk) & 시아르쥬크 자르스키(Siarzhuk Zharski)[각주:2]
  • 운영체제 : 윈도
  • 버전 :  v1.4.1.7 (2007년 7월 30일자[각주:3])
  • 홈페이지 : http://wcx.sourceforge.net/
  • 다운로드 페이지 : http://sourceforge.net/project/showfiles.php?group_id=42163
  • 저작권/라이선스 : 프리웨어. 자세한 사항은 멀티아크 압축 파일 안에 들어 있는 LICENSE 파일 참조.
  • 평가 : @@@@@@@@@@ ( 8 / 10 )
  • 설명 :
    • 이 프로그램은 FAR의 제작자인 유겐 로샬(Eugene Roshal)의 생각을 바탕으로 만들어졌으며, 크리스천 기슬러(Christian Ghisler)와 마테우츠 브로스테크(Mateusz Brsostek)가 작성한 코드도 포함되어 있다. 그밖에 많은 사람이 테스팅과 기능 향상에 힘쓰고 있다.
    • 애드온 페이지에 프로그램을 등록하여 토탈 커맨더의 플러그인처럼 사용할 수 있다.
    • 몇몇 애드온 파일(.addon)을 멀티아크 팀에서 제공하고 있다. 또한 멀티아크에서 쓸 수 있는 헬퍼 유틸리티(helper utilities)도 제공하고 있다.
  • 기타 :
    • 한국어 언어 파일은 현재 버전에는 포함되어 있지 않다. 이 블로그에서 다운로드 받을 수 있다.
    • 7-Zip을 이용한 애드온 파일을 이 블로그에서 받을 수 있다. 7-Zip에서 지원하는 파일은 7-Zip 홈페이지를 참조하라.

실행 화면

  • 영문 Addon
  • About
  • 애드온
  • 설정
  • 언어

다운로드

  • 한국어 언어 파일 + 7-Zip을 이용한 애드온 파일
  • CRC32 :  3F9E0119
  • MD5 : 3809aac52da5525d2b02328b1b0ca51b

관련글

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

  1. 엄밀히 말해 패키징 플러그인이지만, 대부분 압축 플러그인이라고 부른다. 실제로 토탈 커맨더에서는 압축 프로그램(Archiver)라는 표현보다 패키징 프로그램(Packer)이라는 표현을 사용한다. [본문으로]
  2. 블라디미르를 제외한 나머지 발음은 정확하지 않다. [본문으로]
  3. Totalcmd.net 게시 글에서는 2006년 3월 24일자로 되어 있으나, 다운로드 페이지에서는 2007년으로 기록되어 있다. [본문으로]

'소프트웨어 > 소개' 카테고리의 다른 글

Windows Automated Installation Kit for Windows 7  (2) 2009.05.09
HxD  (2) 2009.04.23
Total Commander  (0) 2009.03.28
AcroEdit  (0) 2009.03.23
OpenCapture  (0) 2009.03.21
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

앞서 매개변수의 의미와 자기자신(?)을 출력하는 배치파일을 소개했다.

이 글에서는 매개변수를 활용하여 프로그램을 작성해 보자.

말뜻

매개변수, 곧 파라미터(parameter)는 도스와 윈도의 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다. 자주 언급되었던 ECHO OFF 명령에서 실제 명령어는 ECHO뿐이고, OFF는 매개 변수이다. 명령줄에서 명령어 뒤에 죽 나열하는 문자열은 대개 매개변수이다.

또한 매개변수 전달이란 명령줄에 입력한 명령과 매개변수를 프로그램에서 사용할 수 있는 형태로 알려주는 일을 가리킨다. 이를 위해 배치파일은 %n의 꼴을 사용한다.

  1. @echo Hello %0!

앞서 사용했던 저 한 줄짜리 코드 마지막에 붙은 %0와 같은 꼴로 쓰인다는 뜻이다.

매개변수를 정확히 알기

매개변수 %0과 %*

지금까지 말한 매개변수는 정확하지 않다. 물론 그와 같은 설명이 틀렸다는 말이 아니다. 그러나 엄밀히 말하면 옳지는 않다.

  1. @rem HelloWho.cmd
  2. @echo Hello %0, %*!

첫줄은 주석이므로 적든지 말든지 알아서 하기 바란다. 둘째 줄이 실제 실행 코드이다.

아무튼 아래 그림을 보고 여러 가지로 적용해 보기 바란다.

위의 그림을 보면 매개변수 %0은 배치파일 자신이 아님을 알 수 있다. 만약 매개변수 %0으로 자신을 가리키게 했다면 매번 다른 결과가 나오지 않아야 하기 때문이다. 다른 의미로 매개변수 %0은 명령줄에 입력된 첫번째 인자를 가리킨다는 뜻이다. 컴퓨터에서 첫번째 인자를 0번으로 표기하는 일이 잦으므로 그다지 놀라운 일은 아니다.

또한 위의 코드에서 %0과 %*를 나누어 썼다는 점에서 한 가지를 알 수 있다. %0은 일반적인 매개변수와는 다르게 취급된다는 점이다. %*는 "명령줄에 입력된 모든 매개변수"라는 뜻임에도 불구하고 %0을 제외하고 있음에서 그것을 알 수 있다.

다른 매개변수

매개변수는 앞서 말했듯이 %n의 꼴로 나타낸다. 이때 n은 일반적으로 숫자이고, 특별한 경우에 *(별표)가 올 수 있다. 이 말은 곧 %10과 같은 매개변수는 존재하지 않는다는 뜻이다. 숫자와 수를 구별하자. 10은 수이지만, 숫자는 아니다. 그에 따라 %n의 꼴로 나타낼 수 있는 매개변수는 %0, %1, %2, %3, %4, %5, %6, %7, %8, %9, %*, 이렇게 열한 개이다.

하지만 위에서는 분명히 "%10"에 해당하는 매개변수를 전달 받았다. 물론 그것은 사실이다. 다만 %10과 같은 매개변수가 존재하지 않을 뿐이고, 명령줄에서 입력받는 매개변수는 컴퓨터의 기억장치 어딘가에 저장되어 있다는 뜻이다. %*는 자신이 가진 특별한 기능, 곧 %0을 제외한 모든 매개변수를 불러오는 기능을 사용해서 처리했을 뿐이다.

  1. @rem HelloWho2.cmd
  2. @echo Hello %0, %*!
    @echo Hello %0, %1 %2 %3 %4 %5 %6 %7 %8 %9!

두 코드의 차이를 보이기 위해 한꺼번에 작성했다.

다른 매개변수를 넣어서 시험해 보기 바란다.

%* 정확히 알기

아까 알려주고는 뭘 또 정확히 알자고 그러냐고? 아까 그것은 %0과 함께 알려준 내용이고, %*은 다른 매개변수와는 조금 다른 점이 있다는 말씀!

%*을 편의상 별 매개변수라고 부르자.

이 별 매개변수는 매개변수 자체를 다루지 않는다. 헉! 무슨 헛소리를 하느냐고? 정말이다. 이 별 매개변수 녀석이 다루는 것은 명령줄 자체이다.

윗줄은 분명히 별 매개변수를 이용하여 출력하였고, 아랫줄은 %n의 꼴로 출력하였다. 별 매개변수가 명령줄을 다룬다는 뜻은 위와 같이 매개변수 사이에 있는 공백까지 문자(공백문자)로 인식하여 전달 받았음을 뜻한다. 반면에 %1, %2 등은 공백문자로 나뉜 각각의 매개변수를 전달 받아 이용하고 있다.

매개변수 활용

예제 5에서 윈도 폴더를 보여주는 배치파일을 만들었다. 그것을 고쳐서 사용자가 지정하는 폴더(엄밀히 말하면 디렉터리)를 보여주는 배치파일을 만들자.

D:\Usr\LCP\바탕 화면\배치파일>dir /?
디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.

DIR [드라이브:][경로][파일 이름] [/A[[:]특성]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]정렬 순서]] [/P] [/Q] [/S] [/T[[:]시간 필드]] [/W] [/X] [/4]

  [드라이브:][경로][파일 이름]
              나타낼 드라이브, 디렉터리 및/또는 파일을 지정합니다.

  /A          지정된 특성을 가진 파일을 보여줍니다.
  특성        D  디렉터리                   R  읽기 전용 파일
              H  숨김 파일                  A  기록 파일
              S  시스템 파일                -  부정을 뜻하는 접두사
  /B          최소 형식을 사용합니다 (머리말 정보나 요약 없음).
  /C          파일 크기에 1000단위로 분리 기호를 보여줍니다. 이것은 기본값
              입니다. 분리 기호를 표시하지 않으려면 /-C를 사용하십시오.
  /D          /W와 같으나 세로로 배열하여 보여줍니다.
  /L          소문자를 사용합니다.
  /N          파일 이름이 제일 오른쪽에 오도록 새로운 긴 목록 형식을
              사용합니다.
  /O          파일을 정렬된 순서로 보여줍니다.
  정렬순서    N  이름순(문자 순서)    S  크기순(작은 것 먼저)
              E  확장명순(문자 순서)  D  날짜/시간순(가장 이전 것 먼저)
              G  그룹 디렉터리 먼저         -  순서를 반대로 하는 접두 기호
  /P          정보가 한 화면에 꽉 차면 잠깐 멈춥니다.
  /Q          파일 소유자를 보여 줍니다.
  /S          지정한 디렉터리와 하위 디렉터리를 포함하여 보여줍니다.
  /T          정렬에 사용할 시간 필드를 지정합니다.
  시간필드   C  작성한 시간
              A  마지막 액세스한 시간
              W  마지막 기록한 시간
  /W          이름만 가로로 배열하여 보여줍니다.
  /X          8.3 파일 이름이 아닌 파일에 대한 짧은 이름을 보여줍니다.
              이 형식은 긴 이름 앞에 짧은 이름이 추가된 것으로 /N 형식과
              같습니다. 짧은 이름이 없으면 공백을 보여줍니다.
  /4          4자리수 연도를 표시합니다.

스위치를 DIRCMD 환경 변수로 미리 설정할 수 있습니다. 하이픈(-)을
스위치 앞에 접두 기호로 주면 미리 설정된 스위치에 우선합니다. (예, /-W)


D:\Usr\LCP\바탕 화면\배치파일>

우선 명령줄에서 dir /? 라고 명령을 주면 위와 같은 내용을 보여준다. "/문자"의 꼴로 나타나는 것이 매개변수 가운데 선택사항(옵션)이다.

이 가운데 우리가 사용할 선택사항은 /a /p /4 이다. 더 추가하고 싶으면 스스로 선택하기 바란다. 셸 내장 명령어는 선택사항을 줄 때 대부분 대문자/소문자를 가리지 않는다. 그래서 앞의 세 선택사항은 /A /P /4 와 같은 의미이다.

  1. @echo off
  2. rem 예제 10 : 사용자가 지정하는 폴더를 보여주는 배치파일
  3. rem 파일명 : exam10.cmd
  4. rem 지은이 : koc2000/SALM
  5. rem 저작권 : GPL v3
  6. echo 예제 10.
  7. echo 사용자가 지정하는 폴더를 보여준다.
  8. echo 보다가 종료하려면 Ctrl+Pause 키나 Ctrl+C를 누르시오.
  9. PAUSE
  10. echo.
  11. DIR /A /P /4 %1

맨 마지막 줄이 이 배치파일의 핵심이다. 사실 저 한 줄만 있어도 실행에는 전혀 지장이 없다. 저대로 실행해 보고 나서 의문이 생긴다면 글 남기세요.

과제

다들 싫겠지만, 약간의 과제를 내겠다.

  • ECHO 명령을 이용하여 화면에 OFF라는 세 글자를 출력하시오. 예시 화면은 다음과 같다.

OFF의 위치나 대/소문자 등은 자신이 좋아하는 위치와 형태를 따르면 된다. 위와 같이 세 번 나타낼 필요는 없다. 1회만 출력하면 된다. 저것을 입력하기 위해 배치파일에 Echo off 라고 하면 아무것도 출력되지 않는다. 어떻게 해야 출력할 수 있는지는 스스로 탐구해야 한다. 이 문제도 알고 나면 너무 쉽다. 다만 O F F 처럼 띄어쓰기를 하면 안 된다.

  • DIR 명령을 이용하여 원하는 폴더(디렉터리)의 내용을 폴더(디렉터리)만 보여주도록 한다. /A /P 선택사항을 반드시 사용할 것. 예시 화면은 다음과 같다.

다음 예고

IF 이용하기

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

'스크립트 > 배치파일' 카테고리의 다른 글

IF 기본 설명  (6) 2009.04.09
배치파일에 매개변수 전달하기 2  (5) 2009.04.04
배치파일 멈추기  (1) 2009.03.29
그밖에 출력  (2) 2009.03.26
주석 및 화면 출력  (3) 2009.03.23
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

읽기에 앞서

네트워크와 관련한 부분은 알약의 벌레가 아니었음을 밝힙니다. 시스템의 내장 랜 모듈에 과부하가 걸려 일시적으로 정지되는 현상이었음을 확인하였습니다.

벌레의 유형

  • 벌레를 발견한 프로그램 및 버전 : 알약 1.32 버전(2009년 3월 12일자)에서 나타난 벌레이다. 그 이전 버전에서는 확인하지 못하였다.
  • 사용한 선택사항 : 검사하기 >> 정밀 검색
  • 벌레의 위험도/중요도 : 2단계 (중요) / 기초적인 벌레
  • 벌레의 특징 : 이 벌레는 기본기가 허술한 알약의 약점을 찌르고 있다.

벌레의 발견

알약이 가진 벌레는 크게 두 가지이다.

  • 특정 경로에서 알약이 압축파일을 열려고 하면, 알약을 얼려 버리는 벌레.

    • 그와 함께 알약이 얼면 네트워크를 죽여 버리는 벌레.
    • 또한 얼어버린 알약을 종료하면 화면에서만 사라지고, 실제로는 백그라운드에서 동작하고 있다.
  • 바이러스 검사가 끝난 뒤 결과 화면에서 다른 메뉴를 선택하면, 바이러스 검사 결과를 먹어치워서 없애 버리는 벌레

앞서 알약 웹페이지에 3월 27일 글을 올려서 그날 바로 답장을 받았다. 그러나 좀 더 정확한 사항을 알기 위해 다시 질문을 올렸으나 아직 답변을 받지 못했다. 아마도 주말이라서 해당 업무를 보지 않았기 때문으로 여겨진다. 아무튼 그날의 답변만을 올리겠다.

이것을 하나하나 분석하면 다음과 같다.

  • 압축 파일 자체는 이상이 없었다. : 이것은 나도 같은 의견이다.
  • 검사 중 이상 현상은 발견하지 못했다. : 그런데 내 컴퓨터에서는 발생했다. 알약의 프로그램 오류 여부는 답변 없음.
  • 검사 완료 후 다른 메뉴로 이동하는 경우 검사가 초기화 되니 다시 하라. : 설마 4시간 동안 검사했던 것을 다시? 조금 어이없는 답변이다.
  • 광고창은 일시적인 전송 실패이다. : 그런데 왜 네트워크 기능 전체를 죽이는지? 답변이 없었다.
  • 쿠키 삭제 등을 했으나 그대로였다. : 삭제 전 1메가에서 삭제 후 900킬로바이트였다. 다시 말해 쿠키 등을 삭제해도 결과는 같았다.
  • 지속적으로 발생하여 추가 문의하였다. : 이것에 대해서는 3월 31일 현재 답변이 없다.

과정 재현

우선 검사 과정을 재현해 보자.

분명히 정밀검사를 선택했다.

검사 시작 3분 만에 잡은 화면이다.

6분 만에 잡은 화면 일부. 오른쪽 아래에 보이는 시간과 요일을 잘 기억해야 한다. (전체화면은 http://salm.springnote.com/pages/3015544/attachments/1352626 또는 오른쪽 작은 그림 클릭) 

55분을 앞두고 드디어 문제의 파일 등장! 벌써 새벽 2시잖아. 난 언제 자냐? 그냥 자자. (전체 화면은 http://salm.springnote.com/pages/3015544/attachments/1352628 또는 오른쪽 작은 그림 클릭)

잠 자고 일어나도 똑같은 그 파일! 문제의 네트워크 죽이기 현상도 발생했다. (전체화면은 http://salm.springnote.com/pages/3015544/attachments/1352630 또는 오른쪽 작은 그림 클릭)

여기까지 보고는 그냥 종료했다. 오른쪽 위의 X 표시를 클릭하여 종료하는 방법을 택했다. (밥 먹고 왔다.)

이때 돌발 상황이 발생했다. 아무리 봐도 CPU 사용량이 너무 많았다. 거의 50%에 육박하고 있지 않은가?

위의 그림에서 오른쪽 아래에 보면 아이콘이 5개 보인다. 그 가운데 윗줄 가운데가 작업 관리자로서 CPU 사용률을 보여주고 있다. 현재 연두색 막대가 절반쯤 보이므로 약 50%임을 짐작할 수 있다. 그런데 실행된 프로그래은 오픈캡처 하나뿐? 못 믿겠다는 사람은 전체화면을 보라. (전체화면은 http://salm.springnote.com/pages/3015544/attachments/1352642 또는 오른쪽 작은 그림 클릭)

이미 종료되었어야 할 알약이 살아남아서 CPU 점유율 50%를 꿋꿋히 지키고 있었다. 알약은 불사신이라 말인가?

알약을 얼리는 벌레→파일 열기 벌레

이 알약의 벌레가 치명적이라 여겼는데, 그보다 한 단계 낮추어 2단계(중요)로 보았다. 왜냐하면 네트워크 기능을 죽이지 않는 한 정상 작동한다고 여겼기 때문이다. 그런데 이때 기본적인 벌레를 발견할 수 있었다.

일단 지난 번에 awardeco.arj 파일에서 수십 분에서 몇 시간에 걸쳐 검사가 중지된 벌레를 소개했다. 그것을 유심히 살펴보다가 아주 황당한 사실을 하나 발견했다. 설마 이런 벌레가 아직까지 멸종하지 않고 살아남았다는 사실에 경의를 표하고 싶어질 정도로 황당한 벌레였다. 위에서 유심히 살펴보면 유독 awardeco.arj 파일에서 문제가 발생하고 있다. 그런데 이 파일은 아무런 문제가 없는 파일이었다. 이것은 이스트소프트에서도 인정했다.

그럼 도대체 무엇이 문제였을까?

우선 지난번에 보았던 화면을 다시 게시하겠다.

20090327-filelist.png

위에서 보면 경로명이 유난히 길고, 폴더의 중첩이 심함을 알 수 있다. 아래 그림을 보자.

위에서 보면 무려 9단계에 이르고 있다. 이때 awardeco 폴더를 C:\ 로 옮기면 아무런 문제가 생기지 않고, 바이러스 검사도 무사히 마쳤다.

조금 오래전부터 준비하던 기사 내용이 머릿속을 번개처럼 스치고 지나갔다. 2009/03/30 - [배치파일&스크립트] - 이런저런 이야기 참조.

  • 도스에서는 디렉터리를 7단계까지 만들 수 있다. 윈도에서는 255자 한계 안에서 얼마든지 만들 수 있다. 예컨대 C:\A11\B22\C33\D44\E55\F66\G77\H88\FILE.EXT 파일은 도스에서는 읽지 못할 수도 있다. 그러나 윈도에서는 문제 없이 읽을 수 있다.
  • 도스에서는 파일이름을 포함한 경로가 66자이거나 그보다 짧아야 한다.

그렇다. 도스에서는 디렉터리를 7단계까지 만들 수 있다. 그런데 이 황당한 벌레는 도스와 윈도를 착각하고, 윈도에서도 버젓히 살아남아 버렸다.

어이, 이스트소프트! 도대체 왜 이 벌레를 키웠단 말이더냐?! 윈도95가 나온 지 벌써 14년인데, 아직까지 이게 멸종을 안 했다니 놀라울 따름이다.

벌레의 원인 및 퇴치

벌레가 생긴 원인은 알 수 없었다. 다만 위에서 말한 지나치게 긴 경로명이 문제가 되었고, 다른 하나는 이스트소프트에서 배포하는 프로그램 폴더에 있었다.

알툴즈 설치 폴더는 보통 %ProgramFiles%\ESTsoft 이다. 내 경우에는 D:\Bin\ESTsoft 폴더이며, 보통은 C:\Program Files\ESTsoft 폴더이다. 이때 알약 프로그램 폴더는 %ProgramFiles%\ESTsoft\ALYac 이다.

이 벌레를 퇴치하고자 이것저것 만지다가 레지스트리를 날려보기도 했다. 물론 실행될 턱이 없으니 백업본을 이용해서 바로 복구시켰다. 폴더를 다른 곳에 복사해놓은 뒤에 하나씩 지워보기도 했다. 그러다가 알게 된 사실은 전혀 엉뚱하게도 알약 프로그램이 아닌 알툴즈 전체의 업데이트 프로그램 또는 폴더에서 발생했거나, 적어도 이 벌레와 관련이 있다는 사실을 알게 되었다.

이것을 쉽게 발견하지 못한 데에는 이유가 있었다. 바로 그 폴더 또는 파일에 손상을 입었음에도 알약 프로그램의 업데이트를 정상적으로 수행했다. 다시 말해 3월 12일에 엔진 업데이트도 정상적으로 수행했고, 그 뒤에 여러 차례 수행한 DB 업데이트도 정상적으로 수행했기 때문에 그 폴더가 원인이라는 사실을 알 수 없었다. 하지만 그것이 직접적인 원인인지는 여전히 알 수 없다. 다만 어떤 이유에서인지 업데이트 프로그램이 있는 %ProgramFiles%\ESTsoft\ALUpdate 폴더가 손상되었고, 그에 따라 알약도 이상 증상을 보였음을 알게 되었을 뿐이다.

아무튼 그 폴더를 아예 지워버린 뒤 알약을 실행시키면 알아서 복구를 해준다. 그 뒤로는 이 벌레를 만날 수 없었다.

또한 업데이트 프로그램 폴더를 삭제한 뒤 복구되면, 업데이트를 수동으로 해 두었더라도 자동으로 바뀌는 경우가 있었다. 수동으로 해놓았던 사람은 반드시 확인하기 바란다.

또한 업데이트 프로그램 또는 폴더에 이상이 생겨서 발생했으리라는 유추가 가능하므로, 아예 알약 프로그램을 제거했다가 다시 설치해도 정상 작동하리라는 추측이 가능하다. 그러나 그냥 업데이트 폴더만 지우기를 권장한다. 간혹 업데이트 받는 데 시간이 오래 걸릴 수도 있기 때문이다.

너무 황당하게 벌레가 잡히는 바람에 재현조차 못하였다. 그래서 업데이트 폴더를 지운 뒤의 자료 화면만 첨부한다.

결과적 이 벌레는 두 가지가 복합적으로 작용하여 발생했다.

  1. 업데이트 프로그램 또는 폴더(%ProgramFiles%\ESTsoft\ALUpdate)가 손상될 경우
  2. 경로의 단계가 7단계를 넘어서는 경우
  3. 그리고 위의 두 상황이 동시에 발생해야 한다.

검사 결과를 먹어치우는 벌레

이 벌레에 대해서는 이스트소프트 측에서는 다음과 같이 답변했다.

검사 결과에 등록되는 내역은 검사 후 치료된 결과를 나타냅니다.
사용하시는 검사 과정의 로그를 남기진 않음을 알려 드립니다.

그런데 에브리존의 터보백신이나, 안철수 바이러스연구소의 V3 등에서는 모두 "검사 과정의 로그"를 남겼다. 치료를 하지 않은 경우에는 검사 과정 자체가 정보라는 사실을 깨닫지 못한단 말인가? 아무튼 기본적으로 검사 과정의 로그를 남기는 터보백신이나 V3가 이상한 것일까? 아니면 해달라고 해도 남기지 않는다는 말을 버젓히 하는 알약이 이상한 것일까?

이스트소프트에서 보내온 답변으로는 그것은 벌레가 아니라, 처음부터 그렇게 설계되었기 때문이다. 하지만 그것 때문에 사용자 불편을 겪고 있는 마당에 위와 같은 답변은 조금 문제가 있다고 생각한다.

네트워크를 죽이는 벌레+허깨비 벌레

네트워크 기능을 죽이는 벌레는 이번에도 나타났다. 그와 함께 알약을 종료했음에도 그 프로세스가 남아서 여전히 CPU 점유율을 50% 이상으로 유지시키는 희한한 벌레마저 등장했다. 아마도 지난번에 내가 발견하지 못하고 지나쳤나 보다.

아울러 위와 같은 현상의 원인도 업데이트 폴더(%ProgramFiles%\ESTsoft\ALUpdate)와 관련이 있음을 알게 되었다. 몇 시간 지나면 알아서 꺼져 버리던 네트워크 기능이 잘 살아 있었기 때문이다. (물론 바이러스 검사를 그렇게 오래 할 일이 다시 생기지 않았기 때문일 수도 있다.)

허깨비 현상의 원인은 아주 확실히 알약에 숨어 있는 벌레였다.

위와 같이 기본 실행모드에서는 트레이에 아이콘 표시가 뜨기 때문에 실행 여부를 판단할 수 있었다.

위의 두 그림 가운데 하나처럼 나타난다. 왼쪽의 빨간 알약과 연두색 알약은 동작하고 있다는 표시이고, 오른쪽의 회색 V3는 현재 동작을 하지 않고 있다는 표시이다.

문제는 최소 실행모드에서 발생한다. 저 알약 아이콘이 모두 사라져 버린다. 기본 실행모드에서는 바이러스를 검사하고 있다가 오른쪽 위의 X 표시를 클릭하여 종료해도 트레이에 아이콘이 그대로 남아 있으므로 아직 종료하지 않았다고 알게 되지만, 최소 실행모드에서는 전혀 알 수가 없다. 말그대로 허깨비가 되어 버린다.

결국 허깨비 벌레를 퇴치하려면, 반드시 종료할 때 바이러스 검사를 먼저 종료한 뒤에야 알약 프로그램을 종료해야만 한다. 그렇지 않다면, 나중에 다시 알약을 실행시켰을 때 아까 종료했던 화면으로 시작하게 된다. 이것은 백그라운드에서 계속하여 바이러스를 검사를 하고 있기 때문에 생기는 현상이다. 이것에 대해서는 아무런 도움말을 얻을 수 없었다. 결국 프로그램 종료에 대한 처리 오류 때문에 발생한 벌레인 셈이다.

제작자/제공자의 답변

추가 질문에 대한 답변은 아직 없다.

관련 문서

 

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

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

읽기에 앞서

이 문제는 티스토리 시스템의 문제가 아님을 확인하였다. 이 글에 나타난 현상을 겪는 사람은 자신의 불여우에 확장 기능 MR Tech's Link Wrapper 가 설치되어 있는지를 먼저 살피기 바란다. 혹시 그것을 설치하였다면, 삭제하기 바란다. 그 확장 기능은 한메일 및 티스토리 시스템과 약간의 충돌을 보이고 있다.

벌레의 유형

티스토리 파일 첨부 창이 파이어폭스에서 제대로 표시되지 않는 문제가 있다.

좀 짓궂게 이야기하면 파일 첨부 창을 잘라먹는 벌레로서, 과식을 자주 하는 듯이 보인다.

벌레의 발견

벌레 정보

티스토리에 가입한 뒤 곧바로 발견할 수 있었다. 그때는 티스토리 그림 파일 업로드 벌레 건에 매달려 있던 때라 이것은 그다지 신경을 쓰지 않았다. 그러나 매번 그림을 올릴 때마다 파일 첨부 창을 아래로 늘여야 하기에, 귀찮음이 더해져서 결국 올리게 되었다.

우선 이 벌레가 익스플로러에서 발견된 적은 없다. 한메일 프리징 현상처럼 파이어폭스에 특정 확장 기능을 잘못 설치하여 나타나는 문제도 아니었다. 다시 말해 파이어폭스를 설치한 뒤 3.0.4판부터 3.0.7판까지 나타나는 문제이며, 아무 확장 기능도 설치하지 않았을 때에도 발생했다. 참고로 3.0.8판에서는 확인하지 못하였다.

벌레 찾기

아래는 티스토리 글쓰기 화면이다. 오른쪽 파일첨부를 클릭하여 파일 첨부 창을 보이게 한다.

아래 파일 첨부 창은 아래 부분이 조금 이상하다. 맨 마지막 줄에서 "음원 필터링 시스템은 저작권 침해로 인한 문제로부터 회원 여러분을 보호하"라고 나온 뒤 잘려 있다. 오른쪽 아래 파란 화살표가 가리키는 부분을 클릭한 뒤 아래로 드래그 하면 파일 첨부 창이 늘어남을 알 수 있다.

아래 그림은 파일 첨부 창을 아래로 늘인 모습이다. 결국 아래 그림처럼 되어야 하는데, 위의 그림처럼 아랫부분을 잘라먹고 있었던 셈이다.

제작자/제공자의 답변

4월 7일 현재 회사 측으로부터 답변이 왔다. 회사 측에서는 이 문제를 재현하지 못하였으나, 지속적으로 개선안을 찾고 있다고 하였다. 아울러 이 문제가 발생하는 원인으로는 창의 크기을 변화시키는 스크립트를, 창을 읽어들인 나서 불러오기 때문에 일어난 문제로 보고 있었다.

관련 문서

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

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

들어가며

혼동하기 쉬운 여러 가지를 말하고자 합니다.

명령줄과 명령 프롬프트가 같은 뜻일까요? 아니면 다른 뜻일까요? 배치파일에서는 어떻게 윈도용 프로그램을 실행시킬 수 있을까요? 이와 같은 질문을 생각해 본 적이 있는 사람은 궁금하겠지요.

하나씩 차근차근 알아보기로 하죠.

명령줄? 명령 프롬프트?

명령줄과 명령 프롬프트는 자주 섞어쓰거나 헷갈리지만 분명히 다릅니다.

커맨드 라인(Command Line), 곧 명령줄은 모니터 화면에서 사용자가 명령을 입력하도록 되어 있는 행을 뜻합니다. 덧붙여 그러한 명령이 기억되는 기억장치의 영역도 명령줄이라고 한다네요. 흔히 '명령행'이라고 부릅니다. 한편 CLI(Command Line Interface)를 커맨드 라인이라고 부르기도 합니다.

명령 프롬프트(Command Prompt)는 명령줄에서 명령을 받을 준비가 되었음을 알리는 특별한 문자를 가리킵니다. 이를 확장하여 명령줄에서 명령을 받을 준비를 하고, 명령을 받은 뒤에 결과를 사용자에게 보여주는 일련의 환경을 명령 프롬프트라고 부르지요. 흔히 프롬프트라고 합니다.

이 때문에 컴퓨터를 운영하는 환경을 말할 때에는 한 줄짜리 명령줄은 존재하지만, 한 줄짜리 명령 프롬프트는 존재할 수 없답니다. 명령줄은 명령을 받음으로써 그 역할을 다하지만, 명령 프롬프트는 결과를 사용자에게 보여주어야 하기 때문입니다.

Windows Registry Editor Version 5.00

 

[HKEY_CLASSES_ROOT\Applications\Hwp.exe\shell\open\command]

@="D:\\Bin\\HNC\\Hwp65\\Hwp.exe \"%1\""

위의 파일은 한글과컴퓨터 사의 한/글/2005의 레지스트리 일부입니다. 그 내용은 "명령줄을 레지스트리 안에 어떻게 집어넣을 것인지"를 서술하고 있습니다.

다시 말해 HKEY_CLASSES_ROOT\Applications\Hwp.exe\shell\open\command 라는 키를 찾아서 기본값( @ )으로 문자열(따옴표로 묶인 부분을 문자열로 해석한다) "D:\\Bin\\HNC\\Hwp65\\Hwp.exe \"%1\""을 입력하라는 내용입니다. 이때 문자열의 내용은 지금까지 배치파일에서 다루었던 명령줄 방식을 그대로 따르고 있습니다.

혼동하지 않도록 그림 하나 올립니다.

명령 프롬프트와 명령줄의 차이

명령 프롬프트와 명령줄의 차이

배치파일과 윈도용 프로그램

윈도용 프로그램을 배치파일에서 실행할 수 있게 된 것은 언제인지 모른다. START.EXE 파일을 이용해서 윈도용을 실행한 것은 윈도95가 처음으로 알고 있다. 하지만 명령줄에서 바로 실행하게 된 것은 언제인지 모르고 있다. (아는 사람은 댓글 좀 달아 주세요.)

아무튼 윈도2000과 윈도XP(이하 '윈도')에서는 명령줄에서 바로 윈도용 프로그램을 실행할 수 있다.

왜?

그것은 윈도에 내장된 CMD.EXE 파일이 명령 프롬프트를 구동해 주는 파일인 동시에 윈도의 명령어 셸 가운데 하나이기 때문이다.

명령어 셸은 운영체제에서 지원하는 명령어를 처리하는 프로그램이다. 도스에서는 COMMAND.COM, 윈도 95에서는 도스 모드에서는 COMMAND.COM, 윈도 모드에서는 EXPLORER.EXE였다. 윈도2000 이후로는 주로 EXPLORER.EXE를 쓰며, CMD.EXE도 쓸 수 있다.

아무튼 이 명령어 셸에는 사용자가 쓸 수 있는 명령어가 내장되어 있다. 우리가 마우스를 움직여 파일을 복사하는 등의 명령이 이미 정의되어 있다는 뜻이다. 그런데 특이하게 명령 프롬프트용 명령어 셸인 CMD.EXE가 윈도의 메인 명령어 셸로 쓰일 수 있다. 윈도2000용 PE(사전 설치 환경)가 처음 선보였을 때 명령어 셸로 쓰인 프로그램은 EXPLORER.EXE 프로그램이 아니라 CMD.EXE 프로그램이었다.

또한 윈도의 안전모드에서 명령 프롬프트 사용을 선택하면 CMD.EXE를 셸로 선택하는 환경을 구성한다.

윈도XP 고급 옵션

윈도XP 고급 옵션

그때 윈도의 창모드 명령어를 사용할 수 있다. 그 말은 이미 CMD.EXE 안에 창모드 프로그램을 실행할 수 있게 구성되어 있다는 뜻이다.

그리고 그것을 이용하여 윈도용 프로그램 가운데 창모드 프로그램까지 배치파일에서 불러와서 실행할 수 있게 된다.

쉽게 말해, 윈도에서 CMD.EXE를 통해 모든 프로그램을 실행할 수 있게 만들었다고 생각하면 된다.

도스에서 작성한 배치파일

도스에서 작성한 배치파일을 윈도에서 실행할 수 있을까?

먼저 그것이 윈도에서도 정상 작동하지 않을 수도 있음을 충분히 이해해야 합니다. 아니, 심지어 심각한 문제가 발생할 수도 있다. 각각의 명령어가 가지고 있는 뜻을 잘 이해해야 하며, 또한 각각의 배치파일 팁이 가진 진정한 의미를 숙지하고 있어야 합니다.

다음과 같은 배치파일 팁은 도스 6.2x 이하에서는 정상 작동하지만 윈도95부터는 정상 작동을 보장하지 않습니다.

  1. @ECHO OFF
  2. REM 파일명 : UPPER.BAT
  3. REM 매개 변수를 입력 받아 대문자로 바꾸어 _UPPER 환경 변수에 넣어서 돌려준다.
  4. REM 도스에서는 실행 경로 환경 변수인 PATH는 항상 대문자만을 저장한다는 점을
  5. REM 이용하여 입력 받은 매개 변수를 대문자로 바꾼다.
  6.  
  7. REM 실행 경로를 _TEMP 환경 변수에 저장한다.
  8. SET _TEMP=%PATH%
  9.  
  10. REM 매개 변수를 PATH 환경 변수에 저장한다.
  11. SET PATH=%1 %2 %3 %4 %5 %6 %7 %8 %9
  12.  
  13. REM PATH 환경 변수에 저장된 문자열을 _UPPER 환경 변수에 복사, 저장한다.
  14. SET _UPPER=%PATH%
  15.  
  16. REM PATH 환경 변수를 복원한 뒤 _TEMP 환경 변수를 지운다.
  17. SET PATH=%_TEMP%
  18. SET _TEMP=

위 배치파일 UPPER.BAT는 단순히 환경 변수만을 다루어 피해가 거의 없다. 하지만 최종적으로 윈도 폴더 등을 다루는 배치파일이 있었다면 끔직한 결과가 발생할 수도 있다.

게다가 주요 명령줄 명령어는 윈도에도 존재하기 때문에 그것을 사용할 수 있다. 참고로 윈도에서 사용할 수 있는 명령어 목록은 다음과 같다. (명령줄에서 HELP 명령을 내리면 알 수 있다.)

특정 명령어에 대한 자세한 내용이 필요하면 HELP 명령어 이름을 입력하십시오.
ASSOC    파일 확장명 연결을 보여주거나 수정합니다.
AT       명령어와 프로그램의 실행을 스케줄합니다.
ATTRIB   파일 속성을 표시하거나 바꿉니다.
BREAK    확장된 CTRL+C 검사를 설정하거나 지웁니다.
CACLS    파일의 액세스 컨트롤 목록(ACL)을 표시하거나 수정합니다.
CALL     한 일괄 프로그램에서 다른 일괄 프로그램을 호출합니다.
CD       현재 디렉터리 이름을 보여주거나 바꿉니다.
CHCP     활성화된 코드 페이지의 번호를 표시하거나 설정합니다.
CHDIR    현재 디렉터리 이름을 보여주거나 바꿉니다.
CHKDSK   디스크를 검사하고 상태 보고서를 표시합니다.
CHKNTFS  부팅하는 동안 디스크 확인을 화면에 표시하거나 변경합니다.
CLS      화면을 지웁니다.
CMD      Windows 명령 인터프리터의 새 인스턴스를 시작합니다.
COLOR    콘솔의 기본색과 배경색을 설정합니다.
COMP     두 개 또는 여러 개의 파일을 비교합니다.
COMPACT  NTFS 분할 영역에 있는 파일의 압축을 표시하거나 변경합니다.
CONVERT  FAT 볼륨을 NTFS로 변환합니다. 현재 드라이브는
        변환할 수 없습니다.
COPY     하나 이상의 파일을 다른 위치로 복사합니다.
DATE     날짜를 보여주거나 설정합니다.
DEL      하나 이상의 파일을 지웁니다.
DIR      디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.
DISKCOMP 두 플로피 디스크의 내용을 비교합니다.
DISKCOPY 플로피 디스크의 내용을 다른 플로피 디스크로 복사합니다.
DOSKEY   명령줄을 편집하고, Windows 명령을 다시 호출하고, 매크로를 만듭니다.
ECHO     메시지를 보여주거나, 명령어 반향을 켜거나 끕니다.
ENDLOCAL 일괄 파일에서 환경 변경의 지역화를 끝냅니다.
ERASE    하나 이상의 파일을 지웁니다.
EXIT     CMD.EXE 프로그램(명령 인터프리터)을 마칩니다.
FC       두 파일 또는 파일의 집합을 비교하여 다른 점을
        표시합니다.
FIND     파일에서 텍스트 문자열을 찾습니다.
FINDSTR  파일에서 문자열을 찾습니다.
FOR      파일 집합에서 각 파일에 대해 지정된 명령을 실행합니다.
FORMAT   Windows에서 사용할 디스크를 포맷합니다.
FTYPE    파일 확장 연결에 사용되는 파일 형식을 표시하거나 수정합니다.
GOTO     Windows 명령 인터프리터가 일괄 프로그램에서 이름표가 붙여진
        줄로 가게 합니다.
GRAFTABL Windows가 그래픽 모드에서 확장 문자 세트를 표시할
        수 있게 합니다.
HELP     Windows 명령어에 관한 도움말을 제공합니다.
IF       일괄 프로그램에서 조건 처리를 수행합니다.
LABEL    디스크의 볼륨 이름을 만들거나, 바꾸거나, 지웁니다.
MD       디렉터리를 만듭니다.
MKDIR    디렉터리를 만듭니다.
MODE     시스템 장치를 구성합니다.
MORE     출력을 한번에 한 화면씩 표시합니다.
MOVE     하나 이상의 파일을 한 디렉터리에서 다른 디렉터리로 옮깁니다.
PATH     실행 파일의 찾기 경로를 보여주거나 설정합니다.
PAUSE    일괄 파일의 처리를 보류하고 메시지를 보여줍니다.
POPD     PUSHD 명령으로 저장된 디렉터리로 바꿉니다.
PRINT    텍스트 파일을 인쇄합니다.
PROMPT   Windows 명령 프롬프트를 바꿉니다.
PUSHD    현재 디렉터리를 저장한 후 디렉터리를 바꿉니다.
RD       디렉터리를 지웁니다.
RECOVER  불량이거나 결함이 있는 디스크에서 읽을 수 있는 정보를 복구합니다.
REM      일괄 파일 또는 CONFIG.SYS에서 주석을 기록합니다.
REN      파일 이름을 바꿉니다.
RENAME   파일 이름을 바꿉니다.
REPLACE  파일을 대체합니다.
RMDIR    디렉터리를 지웁니다.
SET      Windows 환경 변수를 보여주거나, 설정하거나, 지웁니다.
SETLOCAL 일괄 파일에서 환경 변경의 지역화를 시작합니다.
SHIFT    일괄 파일에서 바꿀 수 있는 매개 변수의 위치를 바꿉니다.
SORT     입력을 정렬합니다.
START    지정된 프로그램이나 명령을 별도의 창에서 시작합니다.
SUBST    경로를 드라이브 문자로 지정합니다.
TIME     시스템 시간을 보여주거나 설정합니다.
TITLE    CMD.EXE 세션에 대한 창의 창 제목을 설정합니다.
TREE     드라이브 또는 경로의 디렉터리 구조를 그래픽으로 화면에 표시합니다.
TYPE     텍스트 파일의 내용을 보여줍니다.
VER      Windows 버전을 보여줍니다.
VERIFY   파일이 디스크에 올바로 쓰였는지 검증할지
        여부를 지정합니다.
VOL      디스크 볼륨 이름과 일련 번호를 보여줍니다.
XCOPY    파일과 디렉터리 트리를 복사합니다.

저 가운데 파일 형태로 존재하는 명령도 있고, CMD.EXE 셸에 내장된 명령어도 있다. 또한 도스 명령어와 명령어는 같지만, 그 내용에서 현저한 차이를 보이는 SET이나 IF, FOR 등의 명령어는 다시 공부할 필요가 있다.

도스와 윈도의 차이

도스와 윈도2000/XP의 차이는 많지만 몇 가지만 밝히겠다. 내가 아는 것만. ^^a 도스는 명령줄 기반이고, 윈도 그래픽 환경 기반이라는 점과 같은 차이가 아니라 배치파일을 운용할 때 주의해야 할 차이점을 나열하였다.

  1. 도스에서는 파일이름이 파일명.확장자 형태로 8자, 3자였다. 윈도에서는 파일명과 확장자를 합해서 255자까지 만들 수 있다.
  2. 도스, 즉 MS도스에서는 배치 파일 확장자가 .BAT였으나, 윈도에서는 .BAT는 물론이고 .CMD도 있다.
  3. 도스에서는 디렉터리를 7단계까지 만들 수 있다. 윈도에서는 255자 한계 안에서 얼마든지 만들 수 있다.[각주:1] 예컨대 C:\A11\B22\C33\D44\E55\F66\G77\H88\FILE.EXT 파일은 도스에서는 읽지 못할 수도 있다.[각주:2] 그러나 윈도에서는 문제 없이 읽을 수 있다.
  4. 도스에서는 파일이름을 포함한 경로가 66자이거나 그보다 짧아야 한다.
  5. 도스에서는 파일이름에 공백을 포함할 수 없다. 윈도에서는 공백을 포함할 수 있다.
  6. 도스에서는 NUL, PRN 등의 이름을 가진 파일을 만들 수 없다. 윈도에서는 그러한 이름도 허용된다. 다만 약간 다른 방법이 써야 한다. QAOS : LPT1과 같은 다른 예약된 이름을 삭제할 수 없는 경우 참조.
  7. 도스에 환경 변수 이름은 항상 대문자로 나타나지만, 윈도에서 소문자 환경 변수도 있다. 예컨대 윈도에서 windir 환경 변수는 소문자로 이루어져 있다. 이때 소문자 환경변수를 대문자로 입력하더라도 인식한다. 다시 말해 ECHO %WINDIR% 명령은 적법하다.

그밖에 내가 모르는 차이가 있을 수도 있다.

배치파일로 악성 코드를 만들 수 있나?

당연한 말이겠지만, 만들 수 있다고 한다.

이는 배치파일로 배치파일을 만들 수 있고, 그에 따라 복제 가능한 코드도 만들어낼 수 있다. 또한 시스템에 위해를 끼치는 코드를 만들 수 있다. 이와 같은 상황을 종합하면, 자기 자신을 복제할 수 있으며 시스템에 위해를 끼칠 수 있는 배치파일을 만들 수 있다는 뜻이 된다.

이것은 매우 예외적인 경우이다. 하지만 컴퓨터 바이러스 프로그램이 도스 2.0판에서 처음 제공된 PRINT 프로그램을 연구하여 만들었다는 사실에 비추어 보자면, 배치파일로 악성 코드를 만드는 일도 불가능하다고 볼 수는 없다.

다시 예외가 겹쳐서 사소한 실수로 그런 코드를 만들어낼 수도 있으므로 주의를 기울일 필요가 있다. 물론 윈도XP 등에서는 중요한 파일은 시스템 차원에서 보호하고 있기는 하다. 그럼에도 불구하고 boot.ini, ntldr, NTDETECT.COM 등의 파일을 삭제하거나 수정하는 실수를 내포하는 배치파일이 만들어질 수 있으므로 주의해야 한다.

특히 ntldr 파일과 NTDETECT.COM 파일이 손상되면 부팅이 되지 않을 수도 있으므로 다시 한 번 주의하자.

실행 경로란?

실행 경로란 흔히 "패스"라고 부른다. 명령어 PATH로서 알아볼 수 있으며, 정확한 명칭은 실행 파일의 검색 경로이다. PATH 환경 변수에 그 값이 문자열로 저장되어 있다.

PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\Bin\Windows Imaging\;c:\1\TC UP\PLUGINS\Library

위와 같을 때 내가 명령 프롬프트에서 명령어를 입력했을 때 가장 먼저 현재 경로에서 찾게 된다. 현재 경로는 대개 커서가 깜박이는 자리의 왼쪽으로 나타나게 된다. 위에서 말했듯이 실행 경로는 대문자와 소문자가 쓰이며, 실제 윈도에 존재하는 경로명과 문자 크기가 달라도 상관없다. 예컨대 실제 경로명이 C:\WINDOWS라고 할 때 PATH 환경 변수에는 c:\windows라고 소문자로 기록되어도 된다는 뜻이다.

아무튼 위의 예시에 나타난 순서를 보면, C:\WINDOWS\system32 디렉터리(폴더)에서 실행파일을 가장 먼저 찾고, 그 다음이 C:\WINDOWS, C:\WINDOWS\System32\Wbem, D:\Bin\Windows Imaging, c:\1\TC UP\PLUGINS\Library 와 같은 순서로 찾게 된다. 이때 주의할 점은 명령어 셸 내장 명령어를 현재 경로보다 먼저 찾게 된다는 사실이다. 지금까지 자주 사용했던 ECHO 명령도 CMD.EXE 파일에 내장된 명령어이다.

정리하면 명령어 셸 내장 명령어를 가장 먼저 찾고, 그 뒤에 현재 경로에서 실행파일을 찾고, 마지막으로 PATH 환경 변수에 저장된 경로에서 실행파일을 찾게 된다. 그래도 못 찾으면 다음과 같은 메시지를 보여준다.

'XXXXX'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는

배치 파일이 아닙니다.

실행 파일이란?

그렇다면 실행 파일은 무엇일까? 위의 예시에 나타난 "외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일"을 통틀어 실행 파일이라고 부른다. 이것은 PATHEXT 환경 변수에 저장되어 있는 값으로서 배치파일에서 이용할 수 있는 명령어에서 설명한 내용이 그것이다. 그때 좀 부정확하게 설명했었다. 배치파일에서 이용할 수 있는 명령어를 설명하면서 SCF 등의 파일도 설명했으나, 사실 그것을 명령어로 보기에는 무리가 있었다. 아무튼 PATHEXT는 특별한 확장자를 가진 파일을 실행할 수 있다는 의미를 가지고 있다.

PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH

확장자가 .COM, .EXE, .BAT, .CMD, .VBS, .VBE, .JS, .JSE, .WSF 및 .WSH일 때 실행할 수 있다는 뜻이다. 이때 실행하는 순서는 .COM 파일이 가장 먼저이고, 그 다음으로 .EXE 등의 순서를 따른다.

이때 .BAT 파일을 .CMD 파일보다 먼저 찾게 된다. 이 말은 Hello.bat 파일과 Hello.cmd 파일이 존재한다면 Hello 라고 명령을 주었다면 Hello.bat 파일이 실행된다는 뜻이다. Hello.cmd를 실행하고 싶다면 반드시 명령행에서 Hello.cmd를 입력하기 바란다.

프로그래밍에서는 왜 Hello World를 가르칠까?

대부분 처음 배우는 프로그램이 Hello World 문자열 출력이다. 왜 그것을 가르칠까? 설마 아무 생각 없이 가르치고, 또한 아무 생각 없이 배웠다면 지금 생각해 보기 바란다.

왜 그것을 가르칠까?

아주 당연한 말이지만, 컴퓨터 프로그램은 일반적으로 사용자에게 결과를 보여주어야 하기 때문이다.

Hello World 화면 출력을 가르침으로써 프로그래밍의 근본 목적(사용자에게 결과 보여주기)을 가르칠 수 있다는 뜻이다. 아울러 잊지 말아야 할 점, 곧 사용자는 항상 자신이 프로그램을 통해서 한 일을 알고 싶어한다는 점을 기억하게 만들 목적에서 그것을 가르치게 된다.

혹시 자신이 만든 프로그램이 사용자에게 아무런 정보도 주지 않는다면, 지금이라고 고치기 바란다. 정보를 주지 않는 프로그램은 외면받기 쉽상이기 때문이다.

다음 예고

매개 변수를 배치파일에 전달하는 방법에 대해서 알아보겠다.

위에서 다루지 못한 사항은 질문을 하기 바란다. 나중에 다시 이런저런 이야기2를 만들어 이야기하겠다.

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

  1. 다만 이것이 디렉터리 경로 전체 길이에 대한 제한인지는 모르겠다. 너무 오래 되어 기억이 가물가물하다. [본문으로]
  2. 읽지 못하면 정상이고, 읽을 수 있다면 편법을 동원해서라도 읽을 수 있게 해 놓은 것이다. [본문으로]

'스크립트' 카테고리의 다른 글

환경 변수 2  (9) 2009.05.03
환경 변수 1  (0) 2009.05.02
스크립트란 무엇인가? 배치파일이란 무엇인가?  (8) 2009.03.21
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

배치파일에서 프로그램을 실행할 때 경우에 따라서는 잠시 멈추거나, 때에 따라서 완전히 종료해야 할 수도 있다.

그러한 경우는 주로 배치파일의 일부에서 오동작이 생겨서 배치파일 전체에 영향을 주는 때나 진행 화면을 잠시 멈춘 뒤 보고 싶을 경우 등이 이에 해당한다.

잠시 멈추기

키를 눌러 잠시 멈추기

윈도 폴더를 보여주는 배치파일을 만들어 보자.

  1. @echo off
  2. rem 예제 5 : 윈도 폴더를 보여주는 배치파일
  3. rem 파일명 : exam05.bat
  4. rem 지은이 : koc2000/SALM
  5. rem 저작권 : GPL v3
  6.  
  7. echo 예제 5.
  8. echo 윈도 폴더를 보여준다.
  9. echo 보다가 잠시 멈추려면 Pause 키나 Ctrl+S를 누르시오.
  10. echo.
  11. dir C:\WINDOWS /s /a
  12. echo 끝.

배치파일을 만들 때에는 안내문을 보여줄 수 있게 하려고 했는데, 뭔가가 번개같이 지나가 버려 전혀 알아볼 수가 없었다. 본의 아니게 번갯불에 콩 볶는 모습을 보여준 격이 되었다.

 <예제5 결과 화면>

<예제5 결과 화면>

이번에는 명령 프롬프트에서 exam05 라고 명령을 내린 뒤에 얼른 <Pause> 키를 누르도록 하자. <Pause> 키는 키보드의 왼쪽 위, 숫자 패드의 왼쪽 위에 있다.

<예제5 잠시 멈춘 화면>

<예제5 잠시 멈춘 화면>

이때 <Pause> 키는 잠시 멈추라는 기능을 가지고 있다. 물론 윈도에서는 거의 동작하지 않지만, 이렇듯이 명령 프롬프트나 도스 상태에서 잘 작동한다. 도스 상태에서도 게임 등에서는 마찬가지로 거의 동작하지 않는다.

멈춤 명령

물론 도스에서도 명령행에서 멈추게 하는 명령어가 있다.

  1. @echo off
  2. rem 예제 5-1 : 윈도 폴더를 보여주는 배치파일
  3. rem 파일명 : exam05-1.bat
  4. rem 지은이 : koc2000/SALM
  5. rem 저작권 : GPL v3
  6.  
  7. echo 예제 5-1.
  8. echo 윈도 폴더를 보여준다.
  9. echo 보다가 잠시 멈추려면 Pause 키나 Ctrl+S를 누르시오.
  10. echo 다시 재개하려면 아무 키나 누르십시오.
  11. echo.
  12. echo 윈도 폴더를 보여줍니다.
  13. pause
  14. echo.
  15. dir C:\WINDOWS /s /a
  16. echo 끝.

위에 추가된 PAUSE 명령이 그것이다.

위의 명령을 실행시키면 아래처럼 일단 한 번 멈춘다.

<예제5-1 잠시 멈춘 화면>

<예제5-1 잠시 멈춘 화면>

강제 중단

방금 만든 exam06.cmd 파일을 다음과 입력하여 저장하자.

  1. @echo off
  2. rem 예제 6 : 시간과 날짜를 보여주는 도중에 잠시 멈추고
  3. rem          강제 종료에 대해 알려준다.
  4. rem 파일명 : exam06.cmd
  5. rem 지은이 : koc2000/SALM
  6. rem 저작권 : GPL v3
  7.  
  8. echo 예제 6.
  9. echo 날짜를 보여주고 멈춥니다.
  10. echo.
  11. echo 날짜를 바꾸려면 알맞은 날짜를 형식에 맞추어 넣으시오.
  12. echo 날짜를 바꾸지 않으려면 Enter를 누르시오.
  13. echo.
  14. date
  15. echo.
  16. echo 시간을 보여주고 멈춥니다.
  17. echo 종료하려면 Ctrl+C 또는 Ctrl+Break를 누르시오.
  18. pause
  19. echo.
  20. echo 시간을 바꾸려면 알맞은 시간을 형식에 맞추어 넣으시오.
  21. echo 시간을 바꾸지 않으려면 Enter를 누르시오.
  22. echo.
  23. time
  24. echo.
  25. echo 끝.

줄 수는 많지만, 실제 코드는 얼마 되지 않는다. 굳이 실행 화면은 보이지 않겠다. 실제로 실행해 보면 몇 가지 의문이 생길 터이다. 그때 질문을 올리기를 바란다. 위에서 보이고자 하는 바는 명령줄에서 <Ctrl+C> 또는 <Ctrl+Break>를 누르면 강제 중단하는 기능이 있다는 데 있다.

매개 변수

이번에는 지난 번에 예고했던 "파라미터"를 배치파일에 전달하는 방법에 대해서는 다루지 않겠다. 차례로 보면 그것을 알려줘야 하지만, 그것이 무엇인지만 설명하고 넘어가겠다.

파 라미터(parameter)는 도스와 윈도에서 매개 변수로 불린다. 이것은 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다. 자주 언급되었던 ECHO OFF 명령에서 실제 명령어는 ECHO뿐이고, OFF는 매개 변수이다.

  1. cls
  2. echo Hello World!
  3. pause

맨 처음 소개했던 clear.bat 파일의 내용이다.

위에서 CLS, ECHO, PAUSE는 명령어이고, ECHO 다음에 오는 Hello World! 부분은 매개 변수이다. 이때 명령어 자신도 매개 변수에 포함된다. 이것은 아주 특별한 경우이다.

  1. @echo Hello World!

위와 같이 입력하고 Hello.cmd 라고 저장하자. 단 한 줄이지만, 엄연히 배치파일이며, 프로그램이다. (색깔은 구분하기 위해 넣은 것이다. 내용만 제대로 입력하면 된다.)

실행시켜 보면 다음과 같이 나온다.

<Hello.cmd 실행 화면>

이대 내용을 약간 바꾸어 HelloMe.cmd 라고 저장하자. 끝에 %0 은 퍼센트 기호와 숫자 0 (영)이다.

  1. @echo Hello %0!

실행 결과는 직접 보고 느끼기 바란다. 그것까지 알려주면 식상할 듯 여겨져 올리지 않았다.

배치파일 이름을 바꾸어서 실행해 보기 바란다. 뒤에 확장자를 붙여 실행해 보고, 붙이지 않고 실행해 보기 바란다.

이때 명령어 자신도 매개 변수에 포함된다. 이것은 아주 특별한 경우이다.

저 말이 무슨 뜻인지 확실히 알게 되리라 생각한다.

아무튼 매개변수를 배치파일에 전달하라고 지정한 적은 없다. 그러나 명령어 해석기 안에는 이미 명령어 자신을 매개변수로 인식하도록 프로그램되어 있다는 점을 기억하자.

요약

  • 명령줄에서 잠시 멈출 때는 <Ctrl+S> 또는 <Break> 키를 누르면 된다.
  • 명령줄에서 강제 종료할 때는 <Ctrl+C> 또는 <Ctrl+Break> 키를 누르면 된다.
  • 파라미터(parameter)는 도스와 윈도에서 매개 변수로 불린다. 이것은 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다.

    • 명령어 자신도 매개변수이다.

지금까지 만들었던 배치파일을 압축하여 묶었다. 몇몇 파일은 강좌에서는 없었던 것도 있지만 시험 삼아 만든 파일이다.

  • 파일 : batch001.zip (3,877 바이트)
  • CRC32 값 : C1D834F1
  • MD5 값 : 7758c952ca718a16c65bb31793d10841

다음 예고

이번에는 지난 번에 예고했던 매개 변수를 배치파일에 전달하는 방법에 대해서는 좀 더 나중에 다루겠다.

일단 다음 강좌에서는 쉬어가는 시간을 마련했다. 기초가 끝났으므로 이것저것 잡다한 이야기를 하겠다.

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

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

이제 곧 한 달이 된다. 그런데 몇 가지 생각과는 다른 일이 생겼다.

현실과 생각은 다르다.

우선 나는 블로그 왕미친세상을 만들 때 배치파일을 주제로 삼아 만들었다. 그런데 정작 배치파일을 주제로 글을 올린 적은 가장 적다. 물론 아직 글이 하나도 달리지 않은 좋은 사이트도 있지만, 논외로 하자. 그 이유는, 아마도, 나 스스로가 배치파일을 안다고 생각하는 글이 아니라, 함께 배운다거나 복습해 본다는 생각으로 글을 쓰기 때문이라고 생각한다. 그러다 보니 배치파일 소스를 간단하게 열 줄도 안 되게 만들더라도 그것을 고치기만 서너 차례나 더 하게 된다. 최종적으로 채택되는 경우는 그 짓을 한두 차례 더 한 뒤이다. 그러다 보니 순수하게 글을 쓰는 시간은 30분도 채 걸리지 않지만, 소스 파일을 만들어 정리하는 데 들어가는 시간만 하루 꼬박 걸리거나 아니면 이삼일은 걸리게 된다.

화면 구성에서 검은 바탕에 하얀 글씨/회색 글씨가 잘 보이리라 생각했다. 물론 내 모니터에서는 잘 보였으나, PC방 등에서 LCD 모니터에서는 조금 문제가 있었다. 반사광 때문인지 화면 전체가 검게 나오면서 글씨가 보이지 않았다. 결국 하얀 바탕에 검은 글씨를 심각하게 고려하고 있다. 다행이라면, 글씨가 커서 그나마 보인다는 점이다. 작은 글씨였다면 진짜 암울하다. 전혀 보이지 않았을는지도 모른다.

집중!

그 다음 문제는 내가 좀 오지랖이 넓다는 데 있었다. 배치파일 하나만 해도 시간이 모자랄 판에 프로그램 버그도 찾겠다, 유틸리티도 소개하겠다 등등 잡다한 데 손을 뻗고 있었다. 결국 오늘 잡학사전과 개똥철학은 삭제했다. IT 블로그는 IT만! (일기는 논외로 하자.)

좋은 점도 있다.

직업 작가는 아니지만, 소설을 쓰고 있다. 그런데 최근 약간의 난조를 보였는데, 블로그에 글을 쓰면서 조금씩 회복세를 보이고 있다. 아마도 자꾸 글을 쓰다 보니 소설과 관련이 없더라도 무언가 도움이 되나 보다.

 

할일

결국 앞으로 해야 할 일은 스킨을 밝게 바꾸든가, 아니면 나에게 맞게 간소한 스킨을 만들든가 하는 거다. 일단 밝은 스킨으로 바꾸고, 그 다음에 나에게 맞는 스킨을 만들려고 생각하고 있다.

 

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

'일기' 카테고리의 다른 글

블로그 둘째 달  (0) 2009.05.01
아이디  (0) 2009.04.06
나는 백수인가?  (0) 2009.03.24
"사랑했던"일까?  (0) 2009.03.21
왜 능력에 한계를 둘까?  (0) 2009.03.21
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

저작권 GFDL 템플릿 : 최대한 단순하게 만들었다.

 

저작권 GFDL 템플릿 1

CCL 배너를 보고는 만들었다.

* *

GNU 자유 문서 사용 허가 (GFDL / 한국어)

이 저작물은 GFDL #.#판에 따라 이용하실 수 있습니다. 저작자를 표시해야 하며, 변경과 배포가 자유로우며, 변경한 저작물도 GFDL #.#판을 따라야 합니다.

* *

<table style="border: 3px solid blue;" border="0" cellpadding="0" cellspacing="0"> <tbody><tr> <td style="" valign="middle"> <p style="border-left: 10px none; border-right: 10px none;">GNU 자유 문서 사용 허가 (<a href="http://www.gnu.org/licenses/#FDL" target="_blank">GFDL</a>)</p> </td> <td rowspan="2" style="" valign="middle" width="50"> <p style="border-left: 10px none; border-right: 10px none;"><a href="http://www.gnu.org/licenses/#FDL" target="_blank"><img src="http://www.gnu.org/graphics/heckert_gnu.small.png" border="0" height="48" width="48"></a></p> </td> </tr> <tr> <td style="" valign="middle"> <p style="border-left: 10px none; border-right: 10px none;">이 저작물은 <a href="http://www.gnu.org/licenses/#FDL" target="_blank">GFDL</a>에 따라 이용하실 수 있습니다. 저작자를 표시해야 하며, 변경과 배포가 자유로우며, 변경한 저작물도 GFDL을 따릅니다.</p> </td> </tr> </tbody></table>

 

사용방법 : 위 표를 복사해서 붙이면 됩니다.

주의사항 :

  • #.# 부분을 버전 번호로 바꾸어 주십시오.
  • 모르면 "GFDL #.#판을"라는 부분을 "GFDL을"이라고 바꾸면 됩니다.
  • 가장 좋은 방법은 스프링노트에서 지정해 준대로 CCL을 따르는 것입니다. 확실히 아는 사람만 GFDL로 바꾸기를 권합니다.

저작권 GFDL 템플릿 2

아래 표는 극도로 단순하게 만든 저작권 표시이다.

*

GNU 자유 문서 사용 허가 (GFDL / 한국어) : 원저작자표시-사용제한금지-동일조건변경허락

*

<table style="border: 3px solid blue; border-collapse: collapse;"><tbody><tr><td><p><strong>GNU 자유 문서 사용 허가 (<a title="http://www.gnu.org/licenses/fdl.html" class="external" href="http://www.gnu.org/licenses/fdl.html">GFDL</a> / <a title="http://korea.gnu.org/people/chsong/copyleft/fdl-1.2.ko.html" class="external" href="http://korea.gnu.org/people/chsong/copyleft/fdl-1.2.ko.html">한국어</a>) : 원저작자표시-사용제한금지-동일조건변경허락</strong></p></td></tr></tbody></table>

참고사항

  • 이 틀들은 시험판입니다. 언제라도 더 나은 양식이 있다고 여겨지면 예고 없이 변경됩니다.
  • 이 틀들과 틀 문서 또한 GFDL로 배포됩니다.

 

 

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

'미쳐보자' 카테고리의 다른 글

50만 명과 16만 명  (3) 2009.05.30
아까운 사람이 죽었습니다.  (0) 2009.05.24
링크와 권리  (6) 2009.04.16
식품 정보  (0) 2009.03.24
트랙백 연습용 문서  (0) 2009.03.21
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

토탈커맨더(Total Commander)는 윈도용 파일 관리자로서, 최고라고 여겨지고 있습니다. 몇 달 전에 설정을 날려먹어서 지금은 다시 하나하나 만들어 가고 있습니다. 파일 관리자로서 기능도 좋지만, 아이콘이나 메뉴 등을 바꾸어서 아기자기하게 바꾸는 맛도 있는 프로그램입니다.

프로그램 정보

  • 저작권자/제작자 : 크리스천 기슬러(Christian Ghistler)[각주:1]
  • 운영체제 : 윈도
  • 버전 : 7.04a (2008년 8월 8일자)
  • 홈페이지 : http://www.ghisler.com/
  • 다운로드 페이지 : http://www.ghisler.com/download.htm
  • 저작권/라이선스 : 공유소프트웨어 (셰어웨어)[각주:2]
  • 평가 : @@@@@@@@@@ ( 9 / 10 )
  • 실행 화면 :
    • <기본 실행 파일>
    • <확장 언어팩 적용 실행 파일>
    • <토탈커맨더의 사용자 설정 모음집인 TCUP 화면>

  • 설명 :
    • 토탈커맨더는 프로그램 자체의 완성도가 높을 뿐만 아니라 플러그인을 이용하여 여러 기능을 추가할 수 있다.
    • 전형적인 2패널 방식의 파일 관리자이다. 이는 토탈커맨더가 NC(노턴커맨더)를 본따 만들었기 때문으로 여겨진다.
    • 플러그인을 통해 사용자가 직접 기능을 만들어 추가할 수 있다.
  • 기타 :
    • 다국어 지원에서 미흡한 점이 있다. 이는 유니코드가 지원되지 않아서이며, 7.5판에서 해결될 예정이다.
    • 실행 시 등록을 요구하면서 번호를 클릭하게 하는 내그스크린(Nag Screen : 등록 요청 화면)[각주:3]을 내보이지만, 등록하지 않아도 쓰는 데는 지장이 없다.

    관련글

    아직 없음.

     

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


  1. 다만 프로그램 본체와 일부 플러그인에 한정한다. [본문으로]
  2. 다만 프로그램 본체와 일부 플러그인에 한정한다. [본문으로]
  3. nag (내그)는 잔소리라는 뜻이 있다. 셰어웨어에서 등록하라는 말은 돈 내라는 말이므로, 그게 꼴 보기 싫어서 붙인 이름으로 여겨진다. [본문으로]

'소프트웨어 > 소개' 카테고리의 다른 글

Windows Automated Installation Kit for Windows 7  (2) 2009.05.09
HxD  (2) 2009.04.23
MultiArc  (0) 2009.04.02
AcroEdit  (0) 2009.03.23
OpenCapture  (0) 2009.03.21
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

벌레의 유형

  • 벌레를 발견한 프로그램 및 버전 : 알약 1.32 버전(2009년 3월 12일자)에서 나타난 벌레이다. 그 이전 버전에서는 확인하지 못하였다.
  • 사용한 선택사항 : 검사하기 >> 정밀 검색
  • 벌레의 위험도 : 1단계 (매우 위험)
  • 벌레의 특징 : 이 벌레는 매우 독특하다. 벌레 잡는 알약에 숨어서 알약을 잡아먹고 있기 때문이다. 그밖에 자잘한 벌레도 거느리고 있다.

벌레의 발견

알약이 가진 벌레는 크게 두 가지이다.

  • 알약이 압축파일을 열려고 하면, 알약을 얼려 버리는 벌레.

    • 알약이 얼면 네트워크를 죽여 버리는 벌레.
  • 바이러스 검사가 끝난 뒤 결과 화면에서 다른 메뉴를 선택하면, 바이러스 검사 결과를 먹어치워서 없애 버리는 벌레.

알약을 얼리는 벌레

일단 다른 벌레도 있는데, 알약의 벌레를, 특히 이 벌레를 먼저 소개하는 이유는 매우 치명적이라고 여겼기 때문이다.

20090325ALYac_err10.png

5시간 52분 경과! 그런데 화면에서 보이는 저 파일( awardeco.arj )에서만 50분째다. 저 파일이 크냐? 그것도 아니다. 겨우 수십 킬로바이트이다. 1메가도 안 된다는 말이다. 

20090327-filelist.png

44,668 바이트짜리 awardeco.arj 파일을 50분이 넘게 처리하고 있다니.

일단 문제를 알게 되었으니 바이러스 파일만 먼저 치료하기로 하고 정지 뒤 종료했다. 이때 실수로 다른 메뉴(시스템 정리)를 클릭했다가 다시 검사하기를 누르니 검사 결과가 사라져 버렸다. 검사 결과를 먹어치우는 벌레 참조.

 

일단 엔진에도 문제가 있다고 생각하여 업데이트를 하였다. D 드라이브만 검사하기 >> 정밀검사를 시켰다.

그리고 6시간 뒤... 

20090325ALYac_err11.png

아까 압축을 풀어 두었기 때문에 압축파일에서는 안 걸렸지만, 그 압축 파일 안에 있던 저 파일에서 저대로 멈추어 버렸다. 참고로 내가 사용한 컴퓨터 바이러스 백신 프로그램에서는 저 파일을 바이러스로 잡은 백신은 없었다. (하우리, 안철수, 에브리존 모두 바이러스가 아니었다.)

문제는 저 오른쪽이다. 원래는 광고가 떠야 했지만, 어쩐 일인지 저렇게 되어 버렸다. 물론 인터넷이 되지 않았다. 아니 아예 네트워크 기능 전체가 죽어 버렸다.

도대체 바이러스 잡으라니까 파일 열다가 얼어 버린 주제에 왜 네트워크 기능은 죽여 버린단 말인가?

참고로 업데이트를 했지만, 엔진은 그대로였고, DB만 3월 25일자로 바뀌었다.

검사 결과를 먹어치우는 벌레

위의 벌레에 비하면 치료 결과를 먹어치우는 벌레는 애교라고 생각한다. 하지만 이것 역시 위험하기는 마찬가지이다.

C 드라이브만 검사하였다. 드디어 검사가 끝나고, 혹시나 하는 마음에 화면을 잡았다...이면 좋겠다만, 아래 화면은 바이러스 검사를 한 번 더 실행하여 잡은 화면이다. 치료는? 또 4시간을 기다리라고? 그냥 내가 직접 그 폴더에 있는 파일을 지우고, 그 레지스트리를 지웠다.

일단 화면을 보라. 내가 클릭한 메뉴는 결과보기 >> 검사하기 >> 결과보기, 이런 순서이다.

20090325ALYac_err01.png 20090325ALYac_err02.png 20090325ALYac_err03.png 20090325ALYac_err04.png

보면 알겠지만, 일단 검사가 끝난 뒤 검사 결과는 저장하지 않고 있다. 물론 바이러스가 있다면 바로 치료하면 된다고 할 수도 있으나, 클릭 실수가 발생할 수도 있으니, 검사 결과 자체를 저장해 둘 필요도 있다는 점을 간과하지 않았나 생각한다.

그렇다고 검사 결과 저장이 매우 많은 용량을 차지하지도 않는다. 치료 결과에 병합하여 저장하면 되기 때문에 그다지 데이터가 늘지도 않는다. 그저 치료 결과에 저장하되, "발견했지만, 치료하지 않았음"이라고 해도 되기 때문이다.

추가

네트워크 기능을 죽이는 벌레는 나타날 때도 있고 나타나지 않을 때도 있다. 위에서 보듯이 첫째 검사화면과 셋째 검사화면에서는 나타나지 않았지만, 둘째 검사화면에서만 나타났다. 그렇다고 중요도가 낮다고 볼 수도 없는 벌레이다. 왜냐하면 이게 알약의 기능(일정 시간이 지나면 네트워크 자체를 차단하는 기능)인지, 아니면 외부 바이러스가 알약의 보안버그를 틈타 침투한 것인지 알 수 없기 때문이다. 물론 항상 발생하는 현상이 아님을 볼 때 보안버그일 가능성이 더 높다.

제작자/제공자의 답변

알약 웹페이지에 3월 27일 글을 올려서 그날 바로 답장을 받았다. 그러나 좀 더 정확한 사항을 알기 위해 다시 질문을 올렸으나 아직 답변을 받지 못했다. 아마도 주말이라서 해당 업무를 보지 않았기 때문으로 여겨진다. 아무튼 그날의 답변만을 올리겠다.

하나하나 분석하면 다음과 같다.

  • 압축 파일 자체는 이상이 없었다. : 이것은 나도 같은 의견이다.
  • 검사 중 이상 현상은 발견하지 못했다. : 그런데 내 컴퓨터에서는 발생했다.
  • 검사 완료 후 다른 메뉴로 이동하는 경우 검사가 초기화 되니 다시 하라. : 설마 4시간 동안 검사했던 것을 다시?
  • 광고창은 일시적인 전송 실패이다. : 그런데 왜 네트워크 기능 전체를 죽이는지?
  • 쿠키 삭제 등을 했으나 그대로였다. : 삭제 전 1메가에서 삭제 후 900킬로바이트였다.
  • 지속적으로 발생하여 추가 문의하였다.

현재 벌레 잡는 알약, 벌레에 먹히다 2를 준비하고 있는 중이다.

관련 문서

 

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

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

벌레의 유형

고정폭 글꼴의 너비를 잘못 설정하여 발생한 오류로 여겨진다.

벌레의 발견

네이버에서 배포한 나눔고딕코딩 1.650 버전(2009년 2월 3일자)에서 나타나는 벌레이다.

20090323NGCtest.png

위의 그림은 나눔고딕코딩 12포인트일 때의 화면이다. 눈에 확 띄지는 않지만 선문자가 어긋나 있음을 알 수 있다.

또한 나눔고딕코딩은 모든 크기에서 선문자가 어긋나고 있음을 확인하였다.

제작자/제공자의 답변

2009년 3월 26일 현재 오류를 보고한 상태이다.

관련 문서

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

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

벌레의 유형

단순히 화면 출력을 잘못하는 벌레이다.

벌레의 발견

벌레 정보

아크로에디트 버전 0.9 / 빌드 0.9.19.84 (2008년 12월 17일자)에서 발견하였고, 이전 버전 확인하지 못함.

배치파일 구문 강조에서 나타났다.

벌레 찾기

20090321ae01.png
그림1. 주석 명령어 REM을 5번 사용하였으나 2번만 주석이 달렸다. 또한 @도 문법 강조가 되지 않고 있다.

강좌를 올리려고 배치파일을 찾아서 편집하다가 우연히 알게 된 벌레이다.

위에서 보면 배치파일에서 주석을 나타내는 지시자는 REM이다. 엄밀히 말하자면 REM 명령어이다. 이때 배치파일은 대문자와 소문자를 가리지 않으므로 rem, REM, Rem, rEm, reM 등은 모두 주석으로서 작동해야만 한다. 실제로 설정에서도 다음 그림처럼 rem과 REM이 적용되어 있다.

20090321ae03.png
그림2. 행 주석 표시자로 REM을 지정하고 있다.

한편 @ (at)에 대한 문법 강조도 이루어지지 않고 있다.

20090321ae02.png 20090321ae04.png
그림3 / 그림4. 단어 구분 기호에 대한 문법 강조 설정

위 그림에 보면 단어 구분 기호로서 @을 사용하고 있고, 그 색상은 빨간색이다.

그러나 위 그림 1을 보면 문법 강조가 되어 있지를 않다.

제작자/제공자의 답변

AcroEdit - 질문 및 답변에 글을 올린 상태이다. 현재 제작자가 검토를 하고 있는 중이다.

관련 문서

 

 

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

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

벌레의 유형

이것은 벌레가 아니다. 왜냐하면 문법적으로 명확히 옳기 때문이다. 웹의 특성상 웹브라우저에 따라 그 외양이 달라질 수 있기 때문이다. 다만 내가 좋아하여 자주 가는 블로그이기 때문에 이상하게 보이는 것을 참지 못하고 글을 올릴 뿐이다.

벌레의 발견

처음에 집에서 이 현상(?)을 발견했을 때에는 내 컴퓨터 설정의 문제이겠거니 생각했다. 웹페이지의 겉모습은 웹브라우저뿐만 아니라 컴퓨터 설정에도 영향을 받기 때문이다.

그러다가 게임방에서 와이드~~~한 화면을 보니 내 컴퓨터만의 문제가 아님을 깨달았다.

그래서 몇 가지 지적하고자 글을 남긴다.


화면이 크고 넙적해서 어디가 문제인지 잘 보이지 않는다.


오른쪽 상단을 잘라 보았다. 아마도 다음과 같이 보여야 할 것이다.

알림 | 저작권 | 나가기

자칫 아래처럼 오해할 수도 있다.

알림 | 저작권 | 나가

좀 더 아래에 보면 조금 이상한 부분이 한 곳 더 보인다.


컴관련은 괜찮은데, 오늘의 글과 인기글에서는 뒤에 수치가 그 왼쪽의 내용과 어긋난 느낌이다. 실제로 어긋나 있는지는 알 수 없지만, 둘 다 다섯 개씩이므로 아마 어긋났음이 맞으리라 여겨진다.

덧말

어지간하면 홈페이지 관련 문제는 벌레로 올리지 않으려고 했다. 한국에서 Non-IE 유저로 살아가는 삶이란, 웹페이지를 보는 일조차 포기하고 살아야 하며(웹은 분명 "Create once, View Anywhere"가 아니던가?), 사용 포기를 강요당하며 살아야 하며(항의했더니 "IE 쓰세요."라는 말을 억수로 들었다.), 마지막으로 각종 법률에 나타난 정보에의 접근권조차 원천적으로 차단당할 때가 많음을 감수하며 살아야 함을 뜻하기 때문이다.

그럼에도 불구하고 유독 이 사이트만 거론한 까닭은 그저 "좋아하는 블로그"이기 때문이다. 좋아해서 자주 들르다 보니 눈에 거슬리는 일도 자주 겪게 되어서 이렇게나마 글을 올릴 뿐이다.

최근 도아 님의 블로그 "도아의 세상사는 이야기"에서 지식을 얻은 글은 다음과 같다.

  1. 2009/03/25 오픈캐스트의 링크를 거절하는 방법 (현재 블로그에 적용되어 있다.)
  2. 2009/02/15 RSS 구독자를 쉽게 늘릴 수 있을까?
  3. 그밖에 애드센스에 대한 여러 내용이 있지만, 기억이 안 난다. (최근이 아니라서.)

또한 내가 스프링노트에 가입하게 된 까닭도 도아 님에게 있다. 도아 님이 운영하는 QAOS에 가입(유료)했다가 스프링노트에 대해 알게 되었다. 평소에는 잘 느끼지 못했지만, 막상 블로그를 만들게 되니 알맞은 툴이 없었다. 우연히 QAOS의 글에서 봤던 기억이 나서 구글에서 spring으로 검색해서 찾았다. 워드(한글2005)에 익숙해 있다 보니 기능이 적은 감이 있어서 불만이지만, 반면에 역시 워드에 익숙해서인지 단축키 방식이 무척 마음에 든다.

제작자/제공자의 답변

답변을 받았다. 그래서 이것이 벌레가 아님을 명시하였다.

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

글쓴이는 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로 공개한 글입니다.

식품 정보란

식품에 기록된 정보를 말합니다. 예컨대 과자 봉지에 적힌, 과자의 이름, 제조사, 가격, 제조연월일, 유통기간/기한, 과자의 종류(사탕/초콜릿/비스킷 등), 무게 등을 말합니다.

왜 정보를 모으려 하는가?

제가 자주 사 먹는 박하맛 캔디의 경우 10년 전에도 1천 원이고, 20년 전에도 1천 원이었습니다. 그런데 이게 정말로 같은 가격인지 궁금해졌습니다. 그런데 정보가 없었습니다. "정보의 바다"라는 인터넷에 이런 정보는 없더군요. ^^a

문득 "이런 정보를 모아서 데이터베이스로 만들면 어떨까?"라는 생각이 들더군요. 황당하긴 하지만, 그만큼 미쳐보자에 잘 어울리는 내용이었습니다.

장점

  1. 가격을 비교할 수 있습니다.

    1. 과거의 가격과 오늘날의 가격을 단순 비교할 수 있습니다.
    2. 식품에는 무게가 기록되므로, 무게당 가격을 구할 수 있습니다. 이것을 지표로 삼아 실제 가격도 비교할 수 있습니다.
  2. 먹어서는 안 되는 물질을 가릴 수 있습니다.

    1. 인공 착색 감미료 가운데 많이 먹으면 위험한 것도 있습니다. 그런 것이 많이 들어간 식품을 가려낼 수 있습니다.
    2. 사람에 따라 먹어서는 안 되는 식품을 가려낼 수 있습니다. 연령별로, 건강 상태별 등을 기준으로 삼아 가려낼 수 있다는 뜻입니다. 예컨대 저처럼 당료가 조금 있는 사람은 당분 함량도 중요하지만, 반대로 소금(염화나트륨, 나트륨 등으로 표기) 함량도 중요한 요소입니다.

3. 그밖에 장점이 있다면 알려주세요.

단점

  1. 이것을 할 인력이나 기자재를 구하려면 돈이 필요합니다. 현실적으로 백수인 저에게는 상당히 부담이 됩니다.
  2. 사람들의 참여를 유도하려면, 아무쪼록 재미있게 꾸며야겠는데, 제가 그런 쪽으로 영 아닙니다. 이것 역시 돈을 필요로 합니다.
  3. 위의 사항들이 아니더라도, 직접 해야 하는데, 지식이 많이 부족합니다.

양식(틀, 템플릿)은 다음과 같이 구성합니다.

 

  • 식품 정보 템플릿

식품 유형 : 캔디류

회사 이름 : 크라운제과

식료품 이름(상품명) : (원어) 비단박하맛캔디 / (기타 언어) Crown Mint Candy

제조 연월일 : 2009년 1월 21일

 유통 기간 : 2010년 1월 20일까지

 유통 기한 : 1년

가격 : 1000원

무게 : 140그램

원재료 : 백설탕, 물엿, 합성착색료(박하향), 밀크칼슘(우유), 토코페롤

보관 방법 제시 : 예. 직사광선을 피하고 등.

반품 규정 제시 : 예. ~교환해 드립니다.

보상 규정 제시 : 예. ~보상받으실 수~.

홈페이지 정보 : http://www.crown.co.kr

원산지 : 대한민국

공장 및 영업소 주소 : 충청북도 진천군 이월면 노원리 941번지

연락처(소비자상담실) : (서울)02-944-2580 (수신자부담전화)080-709-2580

포장재 재질 : 에틸렌 수지

바코드 번호 : 8 801111 4 10779

열량 : (모두 먹었을 경우) 600킬로칼로리

영양 성분 :

영양 성분 1회 제공량당 함량
(단위 : 그램)
1일 영양소 기준치에 대한 비율
(단위: %)
탄수화물 9 3
▷당류 8 -
단백질 0 0
지방 0 0
▷포화지방 0 0
▷트랜스지방 0 -
콜레스테롤 0 (밀리그램) 0
나트륨 0 (밀리그램) 0

* 1회 제공량은 사탕 3개, 약 9.6그램이다. 위의 경우 9.6그램 가운데 9그램이 탄수화물이며, 그 9그램 가운데 8그램이 당류(설탕 등)라는 뜻이다. 또한 비단박하맛캔디는 1그램당 약 7.14원이고, 1그램당 열량은 약 42.86킬로칼로리이다.

 

  • 식품 정보 템플릿은 위의 내용을 모두 적을 필요는 없다. 자신이 아는 바를 조금씩이라도 적어 준다면 그게 도움이 되리라 생각한다. 직접 적기 싫은 사람은 메일로 보내도 됩니다. salm2000 (at) gmail.com

 

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

'미쳐보자' 카테고리의 다른 글

50만 명과 16만 명  (3) 2009.05.30
아까운 사람이 죽었습니다.  (0) 2009.05.24
링크와 권리  (6) 2009.04.16
저작권 템플릿 (GFDL)  (0) 2009.03.28
트랙백 연습용 문서  (0) 2009.03.21
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

2009년 03월 24일

나는 작가인가?

오늘 순천대학교 도서관에 갔다. 집에서 해도 되지만, 컴퓨터에 몇 가지 작업을 걸어놓았기 때문에 겸사겸사 거기까지 갔다.

하필이면 오늘이 월드 베이스볼 클래식의 결승전이었다. (오늘 아침까지 모르고 있었다.)

도서관 로비의 컴퓨터 자리를 맡아 열심히 글쓰기에 열중하고 있었다. (PC방 요금이 아까워서 자주 애용한다)

그런데 점점 시끄러워지더니 도저히 참을 수가 없게 되었다. 설상가상으로 도서관 로비에 있는 위성방송 수신단말기의 채널이 모두 야구에 맞추어졌다. (어느 채널인지 모르니 그냥 '야구'라고 하겠다.)

오늘 하루만은 도서관에 오는 사람들과 내가 바뀌어 버렸다. 평소에는 2층에서 자료를 찾아 읽거나 아니면 1층 로비에서 위성방송을 시청(?)하던 나는 열심히 컴퓨터 앞에 앉아 글쓰기를 하고 있고, 평소에는 공부(?)하던 그들은 열심히 떠들고(!) 있었다.

아무튼 갈수록 도가 넘더니, 웅성거림이 커져 갔다.

문득 이런 생각이 들었다.

저들은 학생일까?

반대로 이런 생각도 들었다.

나는 백수일까?

 

각설하고, 요즘 하는 일이 하루 종일 글 쓰거나 글 쓸거리를 찾고 있다. 그런 쪽으로 본다면 나는 작가이다.

그런데 내가 버는 돈은 얼마일까?

아예 없다고 해도 과언이 아니다.

아니 까먹지만 않으면 다행이라고 봐야 한다.

흠~! 그럼 난 백수인가?

분명 논다고 볼 수는 없으니 백수도 아닌데….

이런, 소속이 없군. ㅡㅡa

여기까지 생각이 나자 괜스레 슬퍼졌다.

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

'일기' 카테고리의 다른 글

아이디  (0) 2009.04.06
블로그, 첫 한 달  (0) 2009.03.28
"사랑했던"일까?  (0) 2009.03.21
왜 능력에 한계를 둘까?  (0) 2009.03.21
트랙백이 뭐기에  (0) 2009.03.21
글쓴이는 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/05   »
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

글 보관함