Processing math: 100%

2013년 12월 20일 금요일

gem5 - SPEC CPU2006 profile

I ran SPEC CPU2006 benchmarks on gem5 simulator.
I'd like to share log-by-log profiling results in this article.
For additional information on running SPEC CPU2006 on gem5, please refer to this article of gem5 website.

The computer I used is:

  • Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz
  • 8G Memory

bzip2

  • gem5 command:
    ./build/X86_MESI_CMP_directory/gem5.fast configs/example/se.py --mem-size=4GB --bench=bzip2_program
  • SPEC command:
    bzip2 input.program 1
  • Profile summary:
    Number of instructions simulated: 1,867,596,898
    Real time elapsed on the host (sec): 926.59
  • Log-by-log profile:
    Logs (SPEC logs only) Time stamps (hh:mm:ss)
    spec_init 00:00:00
    Loading Input Data 00:00:00
    Input data 1048576 bytes in length 00:00:00
    Compressing Input Data, level 5 00:00:00
    Compressed data 412589 bytes in length 00:03:52
    Uncompressing Data 00:03:52
    Uncompressed data 1048576 bytes in length 00:05:10
    Uncompressed data compared correctly 00:05:10
    Compressing Input Data, level 7 00:05:10
    Compressed data 410886 bytes in length 00:08:59
    Uncompressing Data 00:09:00
    Uncompressed data 1048576 bytes in length 00:10:17
    Uncompressed data compared correctly 00:10:17
    Compressing Input Data, level 9 00:10:17
    Compressed data 406983 bytes in length 00:14:10
    Uncompressing Data 00:14:10
    Uncompressed data 1048576 bytes in length 00:15:27
    Uncompressed data compared correctly 00:15:27
    Tested 1MB buffer: OK! 00:15:27

2013년 12월 19일 목요일

마이크로소프트 워드 - 졸업 논문 작성 (그림 넣기)

실습 파일들: 시작 파일 완성 파일

그림을 넣은 문서를 편집할 때, 가장 짜증나는 것 중 하나가 다음과 같은 경우일 것이다:

"(왼쪽 그림과 같이) 그림과 그에 해당하는 캡션(그림 설명)을 붙여 놓았는데, 문서를 여기 저기 고쳤더니 (오른쪽 그림과 같이) 그림과 캡션이 따로 놀더라." 하는..

이를 방지하는 방법은, 그림과 캡션을 처음부터 묶어 놓는 것이다.
어떻게 묶느냐..?
해결책 중 하나는 그림과 캡션을, 하나의 글상자에 같이 넣어 관리하는 것이다:

위 그림에서, 그림과 캡션은 하나의 글상자에 들어있다.
(글상자에 들어있다는 것을 강조하기 위해서 글상자의 테두리를 표시해 놓은 상태이다.
실제 문서에는 글상자의 테두리를 안 보이게 만들 것이다.)

자.. 그러면 글상자를 넣는 방법부터 알아보자.
먼저, 그림을 넣고 싶은 페이지의 아무 문단에나 커서를 놓자.
그 다음으로, '삽입' → '텍스트 상자' → '텍스트 상자 - 단순형'을 선택하자:

그러면, 아래 그림과 같이 글상자가 글 가운데에 나타나게 되는데, 당황하지 말자:

이제 글상자의 위치배치 방법을 조정하자.
글상자를 클릭하면, 아래 그림과 같이 '그리기 도구' 탭이 활성화된다.
먼저, '그리기 도구 (서식)' → '위치' → '텍스트 배치' → '(아래 중앙)'을 선택해서 글상자의 위치를 조정하자:

다음으로, 배치 방법.
글상자를 클릭한 상태에서, '그리기 도구 (서식)' → '텍스트 줄 바꿈' → '위/아래'를 선택하자.

이제 글상자의 크기를 변경하자.
글상자를 클릭한 상태에서, '그리기 도구 (서식)' → '크기'의 동그라미 부분(아래 그림 참고)을 클릭하자:

'레이아웃' 창이 뜨는데, '크기' → '너비' → '상대'100%로 고치자.
'확인'을 클릭:

그럼, 다음 그림과 같이 된다:

글상자의 세로 크기가 너무 작아보일 수 있는데, 지금은 신경쓰지 말자.
그림을 글상자에 넣으면, 세로 크기는 자동으로 그림 크기에 맞춰진다.

이제, 글상자 안에 그림과 캡션을 넣을 차례인데..
결론부터 말하면, 여기서부턴 그냥 평소에 그림과 캡션 넣듯이 하면 된다.
물론 내가 다시 설명할 것이지만, 이 글이 너무 길어지니까 다음 글에서 설명하도록 하겠다.

논문 작성에 관한: 이전 글 다음 글 (Coming soon)

2013년 12월 15일 일요일

웹 페이지 꾸미기 - 수식 (멋지게) 넣기

웹 페이지에 수식이 들어가 있는 것을 보신 적이 있으신가?
보시고 어떻게 느끼셨는가?

보통 웹 페이지에 수식을 넣을 땐, (통용되는 형식의) 텍스트로 표시하거나, 수식을 아예 그림으로 저장해서 넣곤 한다.
예로, 근의 공식을 한 번 보자:

  • 텍스트 (형식은 내 마음대로 정했다):
    • (-b +- (b^2 - 4ac)^(1/2)) / (2a)
  • 그림:

뭐.. 각 방법에 장단점이 있겠지만, 일단 텍스트는 읽기 힘들고, 그림은 해상도 문제도 있고..
이 블로그를 처음 만들 때에도 그래서 고민을 좀 했다.

그래서 찾아낸 게 MathJax이다.
(이 블로그에서 MathJax를 이용한 글은 여기를 참고.)

여기선 간단하게, HTML 파일을 만들 때 MathJax를 쓰는 법에 대해 설명하겠다.
(아, 참고로 MathJax의 홈페이지의 documentation에도 나오는 내용이다. (영어다.))

일단 기본적인 HTML file은 이렇게 생겼다:

<html>
  <head>..</head>
  <body>..</body>
</html>
  • 일단 html 태그 사이에 HTML 코드가 들어간다.
  • head 태그 사이에 뭐랄까.. 일종의 설정 같은 것들이 들어간다.
  • body 태그 사이에 실제 웹페이지에 표시될 내용들이 들어간다.

그래서.. 일단 근의 공식(만)을 표시하는 웹페이지의 html 코드는 다음과 같다:

<html>

<head>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
</script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
</head>

<body>
${-b \pm \sqrt{b^2 - 4ac}}\over{2a}$ <br />
</body>

</html>

위의 HTML 코드를 간단하게 설명하자면:

  • head 태그 사이의 내용은 MathJax를 쓰기위한 설정이다. (그러니 만약 MathJax를 쓰려면 그 내용을 그대로 복사-붙여넣기 하자.)
  • body 태그 사이의 내용을 보면 아시겠지만, 수식은 LaTeX의 수식 입력 형식을 그대로 쓰면 된다.

웹 브라우저상에서는 이렇게 나온다:

이 페이지에 다시 (MathJax를 이용해서) 근의 공식을 넣어보면:
b±b24ac2a 위의 식을 마우스로 드래그해 보라.
숫자나 기호들을 따로 선택할 수 있을 것이다.

그리고, 브라우저 설정에서 화면 확대를 해보라.
그림으로 저장된 수식들은 그림이 깨질 텐데, MathJax로 나타낸 수식은 전혀 깨지지 않음을 알 수있다.

2013년 12월 14일 토요일

리눅스 정렬 명령 (sort) - 내림 차순 정렬

리눅스 정렬 명령 (sort) 에 관한 이전 글들은 다음과 같다:

앞서 소개한 사항들 외에도, 리눅스 정렬 명령 (sort) 은 많은 기능들을 가지고 있는데, 이들을 확인하려면:
sort --help
로 확인하라.

이 글에서는 그 중에 하나인 내림 차순 정렬법에 대해 설명하겠다.

지금까지의 정렬은 모두 오름 차순 정렬이었다.
오름 차순이 무슨 말인고 하니, ABC.. 순서로 (혹은 숫자라면 작은 수에서 큰 수의 순서로) 정렬했다는 말이다.
("올라가는 순서"로 정렬했다고 기억하면 쉬울 것이다.)

내림 차순은, 자연스럽게, ZYX.. 순서로 (혹은 숫자라면 큰 수에서 작은 수의 순서로) 정렬하는 것을 가리킨다.
(이건 물론, "내려가는 순서"로 정렬한 것이다.)

입력 파일 (people.txt) 에 대하여:

Rammus 420 255 50 335
Lucian 390 230 46 330
Kennen 403 200 47 335
Darius 426 200 50 340
Anivia 350 257 48 325
Ezreal 350 235 47 325
Aatrox 395   0 55 345
Graves 410 255 51 330
Draven 420 240 47 330
이 때 필요한 명령은:
sort -r people.txt
이고, 실행 결과는:
Rammus 420 255 50 335
Lucian 390 230 46 330
Kennen 403 200 47 335
Graves 410 255 51 330
Ezreal 350 235 47 325
Draven 420 240 47 330
Darius 426 200 50 340
Anivia 350 257 48 325
Aatrox 395   0 55 345
이다.
여기서, -r 플래그를 이용했는데, 이는 "reverse"의 뜻이다.

물론, 두 번째 필드의 값으로 정렬할 수도 있다:

sort -r -k2,2 people.txt
실행 결과는, 두 번째 필드의 값으로 내림 차순 정렬이 된 것을 볼 수 있다:
Darius 426 200 50 340
Rammus 420 255 50 335
Draven 420 240 47 330
Graves 410 255 51 330
Kennen 403 200 47 335
Aatrox 395   0 55 345
Lucian 390 230 46 330
Ezreal 350 235 47 325
Anivia 350 257 48 325

리눅스 정렬 명령에 관한: 이전 글 다음 글 없음

2013년 12월 13일 금요일

gnuplot - 기초

gnuplot은 리눅스 프로그램으로, 이를 이용하면 그래프를 간단하게 그릴 수 있다.

예를 들어, 다음과 같은 입력 파일 (count.txt) 이 있다고 하자:

0 5591
1 781 
2 2242
3 2117
4 6255
5 1354
6 1487
7 2122
8 6222
9 279 
10 1103
11 3350
12 1797
13 3399
14 3417
15 2033
16 38
17 3975
18 3898
19 5487
20 1082
21 692 
22 1095
23 381 
24 482 
25 55
첫 번째 열의 0부터 25의 숫자는 알파벳 'a'에서 'z'까지를 나타낸다.
두 번째 열의 숫자들은, 어떤 영어 문서에서 각 알파벳이 등장하는 횟수를 센 것이다.
이를 이용해서 그래프를 그리는 법을 소개하겠다.

먼저, 다음과 같은 리눅스 명령을 실행하자:

gnuplot
그럼, 아래와 같이 gnuplot이 실행되는 것을 볼 수 있다:
(아, 물론 예쁜 창 (GUI) 이 뜨거나 하는 건 아니다. 얜 커맨드라인 프로그램이다.)

 G N U P L O T
 Version 4.4 patchlevel 3
 last modified March 2011
 System: Linux 3.8.0-33-generic

 Copyright (C) 1986-1993, 1998, 2004, 2007-2010
 Thomas Williams, Colin Kelley and many others

 gnuplot home:     http://www.gnuplot.info
 faq, bugs, etc:   type "help seeking-assistance"
 immediate help:   type "help"
 plot window:      hit 'h'

Terminal type set to 'wxt'
gnuplot>
이제, 위에서 소개한 입력 파일 (count.txt) 를 그래프화 하기 위해서 다음을 실행하자:
plot "count.txt"
그럼, 다음과 같은 창이 뜨는 것을 확인 할 수 있다:

마이크로소프트 엑셀에서도 많이 쓰이는 "분산형 차트" 형식으로 데이터들이 표시된 것을 알 수있다.
그런데, 이런 종류의 데이터는 분산형이 아닌 막대 그래프 (엑셀에서는 "세로 막대형 차트") 로 나타내는 것이 보통이지 않나?
그러기 위해서는.. 일단 방금 띄운 그래프 창을 닫자.
(창의 오른쪽 위에 있는 'X'를 마우스로 누르면 되겠지?)
그리고 gnuplot>에 다음과 같이 명령을 넣자:
plot "count.txt" with boxes
막대 그래프로 나타내기 위해, plot 구문 제일 뒤에 with boxes를 추가하였다.
엔터를 누르면 새 창이 뜨면서 다음과 같은 막대 그래프가 나타남을 알 수있다:

이번 글에서는 여기까지 설명하겠다.
아, 마치기 전에 하나 더! ㅋㅋ
gnuplot>에서 나가려면 (gnuplot을 종료하려면) 키보드에서 컨트롤-d를 누르면 된다.

gnuplot에 관한: 이전 글 없음 다음 글

2013년 12월 12일 목요일

마이크로소프트 워드 - 졸업 논문 작성 (떠다니는 그림)

실습 파일들: 글자처럼 취급 떠다니는 그림

지금 이 글을 읽고 계신 독자분들이 문서 작업을 하실 때 가장 애를 먹는 부분 중 하나가 문서 내의 그림을 원하는대로 제어하는 것일 것이다.
흔히 겪는 어려움으로는:

  • 그림을 넣은 후에 문서를 변경하면, 그림이 없어진다거나, 예상치 못하게 이동한다.
  • 그림 1, 그림 2, ... 등을 넣은 후, 1 과 2 사이에 새로운 그림을 넣으면, 그림 번호와 제목 (캡션) 들을 일일이 새로 해로 넣어야 한다.
  • 마찬가지로, 문서에 그림을 추가하면 그림 목차를 새로 해 넣어야 한다.
    • 이 때, 글들도 같이 뒤로 밀리니까 목차도 다시해야 한다. (아, 이것과 관련해선 이 글에서 이미 다루었다. (자동 목차 생성법))

당분간의 글들은 이런 것들을 극복하기위한 방법들을 설명하도록 하겠다.

먼저, 우리가 추구할 그림 삽입 형식에 대해 살펴보자:

왼쪽은 보통 많은 분들이 사용하시는 형식으로써, "글자처럼 취급"이라 부르겠다.
오른쪽은 우리가 지금부터 추구할 형식으로써, "떠다니는 그림"이라 부르겠다.
이 둘의 차이는 다음과 같다:

  • "글자처럼 취급"의 경우, 말 그대로 그림을 글자처럼 취급하는 것으로써, 이 경우, 그림을 문서에 자연스럽게 넣으려면 위의 왼쪽 그림처럼 한 문단이 끝나고 다음 문단이 시작되는 그 사이에 그림을 넣어야 한다.
    • 그런데 이러면 그림의 위치가 상당히 애매해진다. 그림을 넣으려면 항상 문단이 끝나야하기 때문인데, 원하는 곳에 문단이 끝나지 않을 경우가 많고, 문단이 제 때 끝난다 하더라도 위의 왼쪽 그림처럼 페이지의 중간에 그림이 들어가는 경우가 많아서, 뭔가 어설퍼 보인다.
  • "떠다니는 그림"의 경우, 오른쪽 그림처럼, 글과 상관없이 그림이 페이지의 위나 아래에 위치하는 것을 가리킨다.
    • 오른쪽 그림에서 문서 내에 삽입된 그림 바로 위의 문장이 끝나지 않았음에 주목하라. 이건 그림이, 마치 문서 내에서 둥둥 떠다니는 것처럼 행동하기 때문이다. (그래서 이름을 "떠다니는 그림"으로 정한 것이다.) 전공 서적같은 책을 돌이켜 보면, 출판된 책들은 대부분 이런 형식을 따르고 있음을 떠올릴 수 있을 것이다.
    • 얼핏보면 이 쪽이 더 다루기 어려워 보이지만, 그렇지 않다. 한 번 익혀두면, 문서 내 어디든 (꼭 문단의 끝과 시작이 아니더라도) 자유롭게 그림을 넣을 수있기 때문에 훨씬(!) 편한 것을 알게 될 것이다.

자.. 그럼, 이번 글은 여기서 마치고, 다음 글에서 본격적으로 "떠다니는 그림"을 어떻게 다뤄야 하는지 설명하도록 하겠다.

논문 작성에 관한: 이전 글 다음 글

2013년 12월 11일 수요일

마이크로소프트 워드 - 졸업 논문 작성 (페이지 번호)

실습 파일들: 시작 파일 완성 파일

이전 글까지, 목차 만드는 법을 설명했다.
아직 목차가 완벽해 진 건 아니다.

일단 현재 상태는:

아직 여기서 완벽하지 않다는 건, (위 그림의 빨간 동그라미 부분에서) 페이지 번호가 논문 서식과 달라서 그렇다.
어디가 다르냐면:

  • 위의 그림을 보면, 페이지 번호가 목차 제목 ('목차') 부터 본문까지 ('제 1 장 고대 올림픽', '제 2 장 근대 올림픽', ...) 주~욱 연결되어 있는 것을 볼 수있다.
  • 근데, 아래의 논문 형식을 보면, 목차 부분의 페이지 번호는 "i, ii, iii, ..." 이렇게 소문자 로마 표기법으로 하고, 본문은 "1, 2, 3, ..." 이렇게 아라비아 숫자 표기법으로 돼야 한다.
  • 그리고, 본문의 페이지 번호는 초록, 목차, 표 목차, 그림 목차와 별개로 다시 1부터 시작해야 한다.

위에서 지적한 사항은 이 글이 아닌, 앞으로의 글에서 설명하도록 하고, 이 글에선 일단, 각 페이지에 페이지 번호를 넣는 법을 설명하겠다.
아! 목차에는 페이지 번호가 나와있지만, 다음 그림과 같이, 아직 실제 페이지의 하단에는 페이지 번호가 없다:

논문 규정에 따르면, 페이지 번호는 하단 중앙에 넣는다.

다음 그림과 같이 '삽입' → '페이지 번호' → '아래쪽' → '일반 번호 2'를 선택하자.

그럼 다음 그림과 같이 하단 중앙에 페이지 번호가 들어간 것을 알 수있다:

그런데 이 때, 워드의 상태가 평소와 다른 것을 알 수있다.
본문이 흐려졌고, '머리글', '바닥글'이 표시되었다.
이는 페이지 번호가 '바닥글' 부분에 들어가면서, 워드가, 이 부분을 편집하는 상태가 되었기 때문이다.
이 때는 당황하지 말고, 본문을 (아무 부분이나) 더블 클릭하자.
그러면 워드가 (평소처럼) 다시 본문 편집 상태로 돌아올 것이다:

위 그림에서 빨간 동그라미부분의 페이지 번호가 흐려진 것을 알 수있는데, 걱정하지 말자.
이건, 본문 편집 상태에서 바닥글 부분이 흐리게 보이도록 되어 있어서 그렇지, 실제 페이지 번호가 회색으로 처리된 것은 아니다.

논문 작성에 관한: 이전 글 다음 글

2013년 12월 9일 월요일

마이크로소프트 워드 - 졸업 논문 작성 (목차 변형)

실습 파일들: 시작 파일 완성 파일

여기서 잠깐!
만약 목차를 생성해 놓은 상태에서 목차의 모양을 변경하고 싶다면 어떻게 해야하는지를 설명하겠다.
예를 들어, 이전 글들과 같이 (예를 들어 이 글과 같이) 장 제목과 페이지 번호 사이에 점이 없는 목차를 만들어 놓은 상태에서, 다음 그림과 같이 장 제목과 페이지 번호 사이에 점을 넣고 싶은 경우를 생각해 보자:

보통은, 목차를 다 지우고 이 글에서 설명한 방법으로 새로 만드는 것을 생각하기 쉽다.
그러나 그렇게 할 필요 없다.

기존의 목차를 지우지 않은 상태에서 그 글처럼, 마치 목차가 없는 상태에서 목차를 생성하는 것처럼 하면 된다.
복습 겸, 다시 한 번 해보자.
아래 그림과 같이, 기존의 목차를 지우지 않은 상태에서 '참조' → '목차' → '사용자 지정 목차'를 선택하자.

여기서 뜨는 '목차' 창에서 본인이 만들고 싶은 목차의 모양을 설정하자.
예를 들어, 이 글에서는 장 제목과 페이지 번호 사이에 점을 넣고 싶기 때문에 다음과 같이 설정하면 된다:
('탭 채움선' 부분을 아래 그림과 같이 설정하자.)

여기까진 앞 글과 그 과정이 같다.
이제 다른 점이 나오는데, 다음과 같이 기존의 목차를 바꾸겠는지를 물어본다:

뭐.. 당연히 '예'를 선택하자.

그럼, 이 글 제일 앞의 그림과 같은 결과를 얻을 수 있다.

논문 작성에 관한: 이전 글 다음 글

마이크로소프트 워드 - 졸업 논문 작성 (목차 4)

실습 파일들: 시작 파일 완성 파일

일단, 현재 상태는 이렇다:

여기서 수정할 부분은, 목차에 '목차'가 없는 것이다.
(위 그림의 빨간 동그라미 부분.)
쓰고 보니 표현이 좀 어색하네.. ㅋㅋ
일단 결과부터 보자:

이번 글에서 할 일을 단순하게 이야기하면, 그냥 목차를 업데이트하면 된다.

자세하게 보자.
일단, 목차 아무 부분에나 커서를 놓고, 마우스 우클릭을 하자.
마우스 부분에 뜨는 메뉴 중에서 '필드 업데이트'를 선택하자 (클릭):

다음과 같이 '목차 업데이트' 창이 뜨는데, '목차 전체 업데이트'를 선택하고 '확인'을 클릭하자:

이러면 완성이다.
이 글의 두 번째 그림처럼, 목차에 '목차'라는 목차 제목이 들어가 있음을 확인할 수 있을 것이다.

논문 작성에 관한: 이전 글 다음 글

2013년 12월 7일 토요일

마이크로소프트 워드 - 졸업 논문 작성 (목차 3)

실습 파일들: 시작 파일 완성 파일

일단, 현재 상태는 이렇다:

이제 할 건, "목차"라는 목차 제목을 넣을 것이다.

일단, 아래 그림과 같이 목차 제일 앞에 커서를 놓고 엔터를 쳐서 목차 제목을 넣자:

'목차'에 커서를 놓은 후에 '스타일' 창'제목 1'을 클릭하자:

위의 오른쪽 그림에 보면, '목차' 앞에 '제 1 장'이 붙어있어서 보기 싫다.
그것을 없애기 위해서는, (Back Space 키로 지우지 마시고) 다음과 같이 하시라. '목차'에 커서를 놓으신 후에, '홈' → '번호 매기기의 작은 화살표' → '없음'을 클릭하자:

결과는 다음과 같다:

논문 작성에 관한 이전 글 다음 글

2013년 12월 6일 금요일

마이크로소프트 워드 - 졸업 논문 작성 (목차 2)

실습 파일들: 시작 파일 완성 파일

이 글에선, 목차를 업데이트해야할 때 어떻게 하는 지를 설명하겠다.
(뭐.. 본문을 수정했다거나 해서 목차를 업데이트해야하게 되는 경우는, 논문을 쓰다보면 비일비재할 것이다.)

현재 상태는 이렇다:
('제 3 장' 까지 편집이 끝난 상태이다.)

그런데, 여기에 추가로, 다음과 같이 4 장 ('상업화' 부터) 까지 편집을 마쳤다고 하자:

아, 여기서! 목차를 자동 생성하기 위해서는 각 장, 절 등의 제목에 스타일을 적용해야 하니까, 여기서 "스타일 적용"을 복습해 보도록 하겠다.
(참고로, 스타일 적용에 관한 (내) 글은 여기에 있다.)

먼저, 장 제목인 '상업화'에 '제목 1' 스타일을 적용해 보자.
'상업화'에 커서를 놓은 후, '스타일' 창에서 '제목 1'을 클릭하면 된다:
(만약, 아래 그림과 같은 '스타일' 창이 떠있지 않다면, 이 글을 참고.)

이제, 절 제목인 '예산'에 커서를 놓고, '제목 2' 스타일을 적용해 보자.
뭐, 따로 설명 안 해도 되리라 본다. ㅋ
쭈~욱 스타일을 적용한 결과는 다음과 같다:

이제, 목차를 업데이트 해보자.
현재 목차의 모양은, 추가된 '제 4 장'이 반영돼있지 않은 상태이다 (이 글의 맨 첫 그림과 같은 상태):

목차 업데이트는, 간단한데, 목차 위에서 '우클릭' 한 다음에, 뜬 메뉴 창에서 '필드 업데이트'를 선택하자:

그 다음에 뜨는 '목차 업데이트' 창에서, '목차 전체 업데이트'를 클릭하자:

그럼, 다음 그림과 같이 목차가 제대로 업데이트 된 것을 알 수있다.

논문 작성에 관한: 이전 글 다음 글

마이크로소프트 워드 - 졸업 논문 작성 (목차 1)

실습 파일들: 시작 파일 완성 파일

일단, 지금 문서의 상태는, 스타일이 적용된 본문이 다음과 같이 있는 상태이다.
만약 이전 (나의) 글들을 읽지 않으셨다면, 위의 '카테고리별 글 묶음'에서 '마이크로소프트 워드 - 졸업 논문 작성'의 글들을 순서대로 읽어보시라.
현재 상태:

이번 글에선, 자동으로 목차를 만드는 법을 설명할 것이다.
자동으로라는 말이 중요한데, 이런 뜻이다:

  • 목차를 처음 만들 때, 이를 자동으로 해준다.
    • 요건 당연하다.. ㅋ
  • 목차를 만든 후에, 본문을 수정해서 페이지 번호가 변경됐다거나, 장/절이 추가됐다거나 해서, 목차를 업데이트해야할 경우가 생기면, 그걸 자동으로 해 준다.

그럼, 이제 본격적으로 자동 목차 만들기를 설명하겠다.

먼저, 아래 그림과 같이, 문서의 가장 앞에 커서를 놓자 (아래 그림의 경우엔 '제 1 장'과 '고대 올림픽' 사이. 커서가 있는 자리에 목차가 생성될 것이다):

아래 그림과 같이, '참조' → '목차' → '사용자 지정 목차'를 선택하자:

이제, '목차' 창이 뜬다.
여기서 잠깐! 논문 규정에서 목차에 관련된 부분들 먼저 보자 (다음 그림과 같다):

여기서, 조금 이상한 부분이 있다.
맨 위의 '목차'라는 목차 제목의 글자 크기가 22pt 로 지정돼 있는데, 바로 아래 '초록', '목차', '표 목차'의 글자 크기도 22pt 이다.
그런데 실제 보기에는 목차 제목과 '초록', '목차', '표 목차'의 크기가 확연히 다르다.
그래서 그냥 '초록', '목차', '표 목차' 부분의 글자 크기를 16pt 로 하기로 하겠다.
(16pt 는, 논문 규정 그림 아래 쪽에 있는 장 제목의 글자 크기에서 따왔다.)

그럼, 이제 다시 '목차' 창을 보자.
일단, '탭 채움선'에서 '(없음)'을 선택하자.
'인쇄 미리 보기'를 보면, '제목'들과 페이지 번호 사이의 점들이 없어졌음을 알 수있다:

이제, 목차의 글꼴, 줄 간격들을 조절하자:
위 그림의 주황색 동그라미 ('수정' 버튼) 부분을 클릭하면 목차의 글꼴과 줄 간격들을 수정할 수 있다.
아래 그림과 같이 '스타일' 창이 뜨는 데, '목차 1' → '수정' 해서 글꼴을 논문 규정에 맞게 바꾸자:

이제, '스타일 수정' 창이 뜨는데, 여기서 글꼴과 줄 간격들을 수정하는 건 이 글에 나오는 것과 동일하니깐, 읽어보시라.

  • 목차 1의 '글꼴'은 '굵게', 크기 '16' 으로 하자.
  • 목차 1의 '단락'에서 '줄 간격'은 '2줄' 로 하자.
'확인' → '확인' → ... 하면, 다음 그림과 같이 목차가 자동 생성된 것을 알 수있다:
(회색으로 음영이 들어간 건, 문서 상에 실제로 그렇게 된 건 아니고, 자동 생성된 문서 요소 (여기선 '목차') 에 커서를 놓으면 그렇게 보이게 되어있는 것이다.)

여기서 주목할 것들은 다음과 같다:

  • 목차 뒤에 페이지 나눔이 들어가 있다. (본문이 새 페이지에서 시작된다.)
    • 이건, 뭐.. 이 글에서, 장 제목이 새 페이지에서 시작되도록 설정했기 때문이다.
  • "목차"라는 목차 제목이 없다.
    • 요건 (앞으로 쓸) 다른 글에서 다루도록 하겠다.

논문 작성에 관한: 이전 글 다음 글

2013년 12월 5일 목요일

C++ 정렬 - 정렬 기준

먼저, 기본적인 C++ 표준 라이브러리 sort 함수의 동작에 관해서는 이 글을 참고.

이번 글은 (앞 글과 비슷한) sort 함수를 이용하는 간단한 예제로 시작하려 한다:

#include <algorithm>
#include <iostream>

using namespace std;

int main() {
  const unsigned size = 9;
  string a[size] = {"Rammus", "Lucian", "Kennen", "Darius", "Anivia",
                    "Ezreal", "Aatrox", "Graves", "Draven"};

  sort(a, a + size);

  for (unsigned i = 0; i < size; ++i)
    cout << a[i] << '\n';

  return 0;
}

이전 예제와 다른 점은 array (a[]) 가, int가 아닌, string을 저장한다는 점이다.
(sort 함수를 처음 이용하시는 분들은 #include <algorithm>sort()부분들에 주목!)

여기에서 궁금한 점이 생길 것이다. (아니, 생겨야 한다. ㅎㅎ)
intstring 같은 건 정렬 방법이 자명하니까 sort 함수가 처리할 수있다고 하자.
그런데, 정렬 방법이 불투명한 자료형을 저장하는 array는, sort 함수가 어떻게 처리할까?

다음 예시를 보자:

#include <algorithm>
#include <iostream>

using namespace std;

class champion {
  public:
   champion(const char *_name, unsigned _hp) {
     name = string(_name);
     hp = _hp;
   }   

   string name;
   unsigned hp; 
};

int main() {
  const unsigned size = 9;
  champion a[size] = {champion("Rammus", 420), champion("Lucian", 390),
                      champion("Kennen", 403), champion("Darius", 426),
                      champion("Anivia", 350), champion("Ezreal", 350),
                      champion("Aatrox", 395), champion("Graves", 410),
                      champion("Draven", 420)};

  sort(a, a + size);

  for (unsigned i = 0; i < size; ++i)
    cout << a[i].name << ' ' << a[i].hp << '\n';

  return 0;
}
위의 코드에서 특이 사항은, champion이라는 자료형을 정의하고, array가 그 자료형의 자료들을 저장하게 했다는 점이다.
sort함수가 어떻게 동작할까?
답은, "동작 안 한다." 이다.
아니, 더 정확하게 이야기하면, 컴파일 자체가 안 된다.
(다음과 같은 쳐다보기도 싫은 에러 메시지가 뜬다.):
In file included from /usr/include/c++/4.6/algorithm:63:0,
                 from main.cpp:1:
/usr/include/c++/4.6/bits/stl_algo.h: In function ??void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = champion*]??:
/usr/include/c++/4.6/bits/stl_algo.h:2181:4:   instantiated from ??void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = champion*]??
/usr/include/c++/4.6/bits/stl_algo.h:5409:4:   instantiated from ??void std::sort(_RAIter, _RAIter) [with _RAIter = champion*]??
...

즉, sort 함수는, 어떻게 정렬할 지 모르겠으면, 걍 안 한다.
그럼 어떻게 해야 sort 함수가 동작 할까?

일단은 sort 함수에, "어떻게 정렬해야 한다" 라는 방법을 (즉, 정렬 기준을) 넘겨줘야겠지?
아래 코드의 ... 부분에 그 정렬 기준을 넘겨줄 것이다:

sort(a, a + size, ...)

이를 위해, 정렬 기준은 함수로 나타낼 것이고, 그 함수를 (더 정확히는 그 함수를 가리키는 포인터를) 위에 보인 자리에 (... 부분에) 넘겨줄 것이다.
예를 들어, hp 순서대로 정렬하려 한다면, 일단 다음과 같이 정렬 방법을 함수로 나타내야 한다. (main 함수 앞에 넣자.):

bool compare_hp(champion e1, champion e2) {
  return e1.hp < e2.hp;
}
이 함수는 다음과 같이 동작한다:
  • 일단, 두 개의 champion 형의 자료를 받는다. (e1e2)
  • 구현할 정렬 기준 (이 예제에서는 hp의 크기) 에 대해서, e1e2 보다 작으면 truereturn하도록 한다.

그리고, sort 함수를 부르는 부분을 다음과 같이 고친다:

sort(a, a + size, compare_hp);
이게 바로 sort 함수에, 정렬 기준을 정의하는 함수의 포인터를 넘기는 방법이다.

이제, 프로그램을 컴파일해서 실행시키면 다음과 같이, hp로 정렬된 결과를 얻을 수있다:

Anivia 350
Ezreal 350
Lucian 390
Aatrox 395
Kennen 403
Graves 410
Rammus 420
Draven 420
Darius 426

참고로.. 전체 code는 다음과 같다:

#include <algorithm>
#include <iostream>

using namespace std;

class champion {
  public:
   champion(const char *_name, unsigned _hp) {
     name = string(_name);
     hp = _hp;
   }   

   string name;
   unsigned hp; 
};

bool compare_hp(champion e1, champion e2) {
  return e1.hp < e2.hp;
}

int main() {
  const unsigned size = 9;
  champion a[size] = {champion("Rammus", 420), champion("Lucian", 390),
                      champion("Kennen", 403), champion("Darius", 426),
                      champion("Anivia", 350), champion("Ezreal", 350),
                      champion("Aatrox", 395), champion("Graves", 410),
                      champion("Draven", 420)};

  sort(a, a + size, compare_hp);

  for (unsigned i = 0; i < size; ++i)
    cout << a[i].name << ' ' << a[i].hp << '\n';

  return 0;
}

C++ 정렬에 관한: 이전 글 다음 글 (Coming soon)

마이크로소프트 워드 - 졸업 논문 작성 (스타일 적용)

실습 파일들: 시작 파일 완성 파일

아.. 일단 스타일 적용법을 설명하기 전에, 복습 겸, ('장'의 하위 단위인) '절'의 스타일을 정의하는 법을 한 번 보자.
복습 대상은 이 글 이다.

일단, 커서를, 절 부분이 아닌, 앞에서 '다단계 목록'을 정의했던 장 부분에 놓자.
(이건, 장 부분에서 정의했던 '다단계 목록'에 절의 설정을 추가하기 위함이다.)
이전처럼 '홈' → '다단계 목록' → '새 다단계 목록 정의'를 선택하자:

'새 다단계 목록 정의' 창의 뜨면, 다음 그림과 같이 설정한다:

  • '수정할 단계를 클릭하세요' → '2'
  • '단계에 연결할 스타일' → '제목 2'
  • '번호의 서식을 입력하세요' → '1.1' (이건 기본 값이 이거다.)
  • '번호 다음에 올 문자' → '공백'
'확인'을 눌러서 '새 단계 목록 정의' 창을 닫자.

이제 커서를 절 부분에 놓고, '제목 2' 스타일을 수정해서 글자 크기, 줄 간격 등을 조절하자.

아휴.. 캡쳐가 너무 힘들다..
'제목 2' 스타일의 '글꼴'과 '단락' 설정은 이 글을 참고하시라.
글로 할 일을 설명을 하면:
  • '글꼴'에서 '크기'를 14로 설정한다.
  • '단락'에서 '단락 앞'과 '단락 뒤'를 모두 1cm으로 설정한다.

'스타일' 창의 '제목 2'를 클릭하면, 결과는 다음과 같다:

이제 적용법으로 가자.
바로 위의 그림에서, 사실, '1.1 올림픽의 부활과 선구자' 바로 윗 줄의 '근대 올림픽' 은 장 제목이기 때문에 '제목 1' 스타일을 적용해야 한다.
그렇게 하기 위해서, 일단 '근대 올림픽'에 커서를 놓자.
그리고, 아래 그림에서 동그라미한 '스타일' 창의 '제목 1'을 클릭하면 된다.
결과는:

장 제목 앞에 자동으로 쪽 구분이 들어간 것을 알 수있다.

논문 작성에 관한 이전 글 다음 글