[Linux] Device driver 동시성 관련 함수 – Completion

현재 스레드 외부에다 작업을 시작하도록 지시하고 끝나기를 기다릴 때 사용. 세마포어를 LOCKED 상태로 하여 사용할 수도 있지만, 세마포어는 거의 항상 세마포어를 획득할 수 있을 때에 치중하여 최적화되어 왔다. 따라서 이럴 때는 completion 을 사용하는 것이 좋다. 구현은 kernel/sched.c 를 참조.

1. completion 초기화
<linux/completion.h>를 포함하여야 한다. 자료 타입은 struct completion.

1.1. Compile time 초기화

DECLARE_COMPLETION(my_completion);
1.2. Runtime 초기화

struct completion my_completion;
/* … */
init_completion(&my completion);

2. 완료 기다리기
인터럽트가 불가능한 대기(죽일 수 없는 프로세스를 만들 수도 있다)를 수행한다. LONG_MAX 만큼 대기.

void wait_for_completion(struct completion *c);
timeout 이 있는 인터럽트가 불가능한 대기. timeout 값을 리턴한다. 따라서 expire 되면 0을, 완료되면 남은 timeout 값(jiffies 값)을 리턴한다.

unsigned long wait_for_completion_timeout(struct completion *x, unsigned long timeout);
인터럽트가 가능한 대기를 수행한다.(추가필요:인터럽트 받으면 바로 리턴?)

int wait_for_completion_interruptible(struct completion *x);
인터럽트가 가능한 대기의 timeout 버전

unsigned long wait_for_completion_interruptible_timeout(struct completion *x, unsigned long timeout);
죽일 수 있는 대기(TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)를 수행한다.(추가 필요:kill받으면 바로 리턴?)

int wait_for_completion_killable(struct completion *x);
Blocking 없는 wait_for_completion. complete 되지 않았으면 바로 0을 리턴한다.

bool try_wait_for_completion(struct completion *x);

3. 완료 이벤트 알리기
completion을 기다리는 스레드(waiter)가 있는지 확인한다. waiter가 있으면(wait_for_completion()이 진행 중이면) 0을, 없으면 1을 리턴한다.

bool completion_done(completion *x);
대기 중인 스레드 하나만 깨우기
void complete(struct completion *c);
모든 스레드 깨우기

void complete_all(struct completion *c);

4. 재사용을 위해 다시 초기화하기

INIT_COMPLETION(struct completion c);

5. 모듈 종료 함수에서 종료 후 완료를 기다리리고 알릴 때(나중에 추가하기:이 함수 없어졌나?)

void complete_and_exit(struct completion *c, long retval);

[Linux] Device driver 동시성 관련 함수 – Semaphore & Mutex

동시성 관련 함수에 대해서 다시 한번 정리하고 가자. Linux device driver 3판, 5장. “동시성과 경쟁 상태” 를 기준으로 정리한다.

공유 자원 접근을 위한 Lock 을 위해서 다음과 같은 것들을 사용한다.

1. 세마포어와 뮤텍스
Critical Section을 정의하기 위해서 세마포어를 사용한다. 일반적으로 P와 V 함수 쌍을 사용하는데, linux 에서는 P함수는 “down”, V 함수를 “up”이라 부른다. 단일 세마포어(공유 자원 개수를 1개로 정의)로 사용할 때 뮤텍스(Mutual Exclusion)라 부른다.

1.1. 세마포어 초기화
<asm/semaphore.h> 를 포함하여야 한다. 관련 Type은 struct semaphore.
1.1.1. 세마포어로 사용할 때 초기화


void sema_init(struct semaphore *sem, int val);

val 은 세마포어에 할당할 초기값.

1.1.2. Mutex로 사용할 때 초기화
정적 초기화


DECLARE_MUTEX(name); // 1로 초기화.
DECLARE_MUTEX_LOCKED(name); // 0으로 초기화.

실행 중 초기화


void init_MUTEX(struct semaphore *sem); // 1로 초기화.
void init_MUTEX_LOCKED(struct semaphore *sem); // 0으로 초기화


1.2. 세마포어 획득하기
세마포어 값을 감소시키고 필요한 만큼 기다린다.


void down(struct semaphore *sem);


세마포어 값을 감소시키고 필요한 만큼 기다리지만, 인터럽트 가능하다. 인터럽트를 받으면 0이 아닌 값을 반환하고, 세마포어를 쥐고 있지 않는다. 때문에 항상 반환값을 확인하여야 한다.


int down_interuptible(struct semaphore *sem);


세마포어를 획득할 수 없다면 바로 0이 아닌 값을 반환한다.


int down_ttylock(struct semaphore *sem);


1.3. 세마포어 반환


void up(struct semaphore *sem);

2. 읽기/쓰기 세마포어
읽기만 수행하는 스레드라면 여럿이 함께 접근해도 된다. 이럴 때 rwsem 이라는 특수 세마포어를 이용한다.
rwsem 을 사용하면 쓰기 스레드 하나가 잡고 있던가 읽기 스레드 여럿이 잡고 있던가 둘 중에 하나가 되는데 우선순위는 쓰기 스레드에게 있다. 쓰기 스레드가 임계구역에 접근하는 순간, 읽기 스레드는 모든 쓰기 스레드가 작업을 끝낼 때까지 기다려야 한다. 그래서 쓰기 스레드가 많을 경우 읽기 스레드가 오랫동안 접근 권한을 얻지 못할 수 있다. 따라서 쓰기 접근이 매우 드물고, 짧은 시간 동안에만 필요한 경우에 적당하다.

2.1. 읽기/쓰기 세마포어 초기화
<linux/resem.h> 를 포함하여야 한다. 관련 타입은 struct rw_semaphore. 런타임에 명시적으로 초기화되어야 한다.


void init_rwsem(struct rw_semaphore *sem);

2.2. 읽기 전용 세마포어 사용
읽기 전용 접근 권한을 제공한다. 다른 읽기 스레드와 동시 참조가 가능하다. 호출 프로세스를 D 상태(인터럽트가 불가능한 잠자기 상태)로 빠뜨릴 수 있다는 사실에 주의한다.


void_down_read(struct rw_semaphore *sem);

읽기를 수행할 수 없을 경우 기다리지 않는다. 접근이 가능하다면 0 이 아닌 값을, 이외에는 0을 반환한다. 다른 커널 함수는 대부분 성공일 때 0을 반환하지만 down_read_ttylock은 반대다.


int down_read_ttylock(struct rw_semaphore *sem);

읽기 전용 세마포어 해제


void up_read(struct rw_semaphore *sem);


2.2. 쓰기 전용 세마포어 사용
down_read 와 동일


void down_write(struct rw_semaphore *sem);

down_read_ttylock 과 동일


int down_write(struct rw_semaphore *sem);

up_read 와 동일


void up_write(struct rw_semaphore *sem);

잠시만 쓰기 락을 걸어 수정하고 한동안은 읽기 권한만 필요하다면


void downgrade_write(struct rw_semaphore *sem);

 

USB Windows XP 설치

http://www.parkoz.com/zboard/view.php?id=my_tips&page=1&sn1=&divpage=3&sn=off&ss=on&sc=off&keyword=xp&select_arrange=headnum&desc=asc&no=13051
안됨 – /BOOT/BCD 어쩌고

http://blog.naver.com/lvis?Redirect=Log&logNo=10036988219&vid=0
안됨 – Disk error 어쩌고 저쩌고

http://www.usboffice.kr
 – http://www.usboffice.kr/zbxe/275520
  – http://blog.daum.net/idrlee/16100073
 – http://usboffice.kr/zbxe/use_boot/481399/page/3

http://www.msfn.org/board/install-usb-winsetupfromusb-gui-t120444.html

http://nofate.tistory.com/455

NETBOOT로 선회
 http://www.cyworld.com/hyunweb/2811496
성공 – 결국 관건은 C: 에 부팅할 수 있도록 Windows 98 부팅 디스크를 심고, D: 에 I386 폴더를 복사해서 I386 아래의 WINNT 를 실행하는 것이었다. 실행 후 파티션 작업 역시 다시 할 수 있는 듯 하다.

USB 부트
http://blog.naver.com/baljern/140097762413
성공 – diskpart 에서 “create partition primary size=200000 (200기가)”
cmd 에서 “format c: /fs:ntfs /q/u” 로 NTFS 포멧
cmd 에서 x:\i386> “winnt32.exe /syspart:c /tempdrive:c”

MBR 이상인 경우 MBR write 툴도 함께 있음.

우분투 설치 CD를 USB로 부팅

http://unetbootin.sourceforge.net/ 에서 unetbootin 을 다운받는다.
우분투 설치 ISO 파일을 http://www.ubuntu.com/getubuntu/download 에서 다운로드받는다.
미러를 통해 다운로드받는 것이 빠르다.
USB를 꽂고, unetbootin 을 실행시킨 후 Disk image의 ISO 에 다운로드 받은 ISO를 선택한 후 OK를 누른다.

1~4까지 진행된 후 뽑아서 쓰면 된다.
윈도우즈가 깨진 노트북에서 외장하드로 파일 복사(데이터 백업)가 필요해서 사용했다.

Moniwiki의 초기 설정

1. monisetup.php 에서 한 일.
 1.1. Site 이름 설정

$sitename=’Wiki’;
 1.2. 업로드 가능한 파일 확장자 추가.

$pds_allowed=”png|jpg|jpeg|gif|mp3|zip|tgz|gz|txt|css|exe|hwp|pdf|flv|alz|bmp|doc|xls|ppt|pptx|xlsx|docx|gul|gif|bz2″;
 1.3. 테마 바꾸기

$theme=’azblue’;
 1.4. 편집창 사이즈 좀더 길게..

$edit_rows=26;
 1.5. 위지윅 에디터는 아직 불안정 한 것 같으니 Disable

$use_wikiwyg=0;
 1.6. 부분 편집 가능하도록..

$use_sectionedit=1;
 1.7. 로그인한 후에 글 편집 가능하도록..

$security_class=’needtologin’;
 
2. php 설정(/etc/php.ini)에서 upload를 위한 작업
 2.1. 최대 업로드 파일 사이즈 조정

upload_max_filesize = 2048M
 2.2. POST 방식으로 업로드하므로 POST data size 조정

post_max_size = 1024M
 
3. azblue 테마 수정(theme/azblue/theme.php)
 3.1. 폭이 너무 좁으니 좀 넓게..

$_width=’80%’;
 

[Linux] 디렉토리 안의 모든 파일들을 일일이 링크 걸기 위한 방법

디렉토리 안의 모든 파일들을 일일이 심볼릭 링크를 걸고 싶을 때 Perl을 이용해서 하는 방법이다.(절대 경로를 준다면 cp -sR 옵션으로 줄 수도 있지만..)

다음을 link.pl 등의 이름으로 저장한다.

use File::Find;
$src = shift; # first arg is source
$dst = shift; # second arg is dest
                find(sub {
                                                (my $rel_name = $File::Find::name)
                                                =~ s!.*/\./!!s;
                                                my $src_name = “$src/$rel_name”;
                                                my $dst_name = “$dst/$rel_name”;
                                                if (-d) {
                                                print “mkdir $dst_name\n”;
                                                mkdir $dst_name, 0777
                                                or warn “mkdir $dst_name: $!”;
                                                } else {
                                                print “ln -s $src_name $dst_name\n”;
                                                symlink $src_name, $dst_name
                                                or warn “symlink $src_name $dst_name: $!”;
                                                }
                                                }, “$src/./”);

perl link.pl <SRC PATH> <DST PATH> 로 한다.
<DST PATH> 는 mkdir로 만들어 놓고 해야 한다.

Google의 New Business Manager, 김현유님을 만나다! 를 읽고.

Google의 New Business Manager, 김현유님을 만나다!

Google이나 실리콘밸리 기업들에 대한 여러 단면들을 보여준다. 또한 개인 커리어 관리에 대한 생각 역시 하게 한다. 국내(내가 다니고 있는 회사를 포함하여)와 실리콘밸리의 기업문화 비교 역시 흥미롭다.

특히 인상적이었던 것들은,

1. 멀리 내다보고 기회 포착을 위해 준비하는 자세
2. 그를 위해 조직을 만들고 이끄는 능력
3. 자신의 경험들에 대한 긍정적인 자세
4. 어려운 설명을 예를 들거나, 쉬운 용어로 쉽게 설명하는 능력
5. 기술적 트렌드에 대한 전망과 그 변화를 읽는 눈
6. 자신이 하고 싶은 일을 차후에 언제, 어떻게 할 수 있을 것 같다는 생각
7. 기업 문화의 장/단점을 포착하는 통찰력, 이를 사회 혹은 조직 전체적인 시각에서 바라보는 눈
8. 자신이 사업 체질인지 커리어 체질인지를 파악하고 인지하고 있다는 점

등이다. 이외에도 블로그를 보면 댓글들에서 상대의 좋은 부분을 꼭 칭찬하는 습관이 있음을 볼 수 있었다.

장점들은 배운다. 그리고 꼭 행동하고 실천하자.

p.s 글에 링크되어 있는 다른 글들 역시 읽어볼만한하다.

마지막 강의 중 되새길 만한 문구들..

각각의 줄마다 내 생각들을 달고 싶지만 그러기엔 너무 길어지겠다.
————————————————————————
“무엇이 날 유일무이한 사람으로 만들까?”

그날 나는 양복을 입지 않았다. … 대신에 나는 옷장에서 찾을 수 있는 것으로 최대한 적절하게 조합한 ‘유년스러운 꿈꾸는 복장’차림을 선택했다.

제 아버지는 항상 이렇게 말씀하셨어요. 방안에 코끼리가 있으면 그 코끼리(Elephant in the room)부터 소개하라고.

모든 이야기에는 타당한 동기가 있어야 한다

최후의 순간까지 결정을 늦추어라

일에서나 사람관계에서나 설령 내 쪽에 힘이 있다 해도 언제나 공평해야 한다고 주의를 주었다. “운전석에 앉았다고 해서, 사람들을 치고 다닐 필요는 없는 거니까.”

구체적인 꿈을 갖는다는 건 중요한 일이다.

상대방에게 득이 될 만한 것을 제시하라. 그래야 환영 받을 수 있다.

때로 나는 그 꿈을 성취하려고 노력하는 단계에서 보다 더 많은 것을 배웠다고 생각한다.

당신은 반드시 기초부터 제대로 익혀야 한다. 그렇지 않으면 그 어떤 화려한 것도 해낼 수가 없다.

“네가 잘못하고 있는데도 더 이상 너에게 아무 말도 하지 않는다면, 그건 널 포기했다는 뜻이야.”

자신감을 발달시키는 데는 오직 한 가지 방법만이 존재한다는 것을 알고 있었다. 아이들에게 도저히 가능해 보이지 않는 과제를 내주고, 할 수 있다는 것을 스스로 알게 될 때까지 열심히 노력하게 이끈다. 그리고 계속 그 과정을 반복하라.

우리가 아이들에게 미식축구나, 축구, 수영 등의 조직적인 스포츠를 가르칠 때 아이들이 경기의 룰만 배우기를 원하는 것은 아니다. 아이들이 배웠으면 하는 것은 훨씬 더 중요한 것들이다. … 이러한 종류의 우회적인 가르침을 ‘헤드 페이크’라고 명명할 수 있을 것이다. … 그것은 바로 과정에 푹 빠져들 때까지 배우는 사람으로 하여금 자신이 진정 배우고 있는 것이 무엇인지 모르게 하는 속임수다.

자신이 어느 부분을 이해하지 못하는가 알고 있었으며 그 점을 기꺼이 시인하고, 이해가 될 때까지 물고 늘어질 줄 아는 훌륭한 사람이었다.

끈기는 미덕이다. 그렇지만 당신이 얼마나 노력하는지 모든 이들이 언제나 지켜보고 있어야 할 이유는 없다.

장벽이 거기 서 있는 것은 가로막기 위해서가 아니며, 그것은 우리가 얼마나 간절히 원하는지 보여줄 기회를 주기 위해 거기에 서 있는 것이었다.

유식한 사람들의 말을 따라 하면 유식해 보이는 것은 식은 죽 먹기다.

바로 여기에 모든 책임자 혹은 관리자에 대한 교훈이 있다. … 둘다 나의 안식년 계획이 좋은 아이디어 인지는 확신하지 못했지만 그것을 표현하는 방식은 얼마나 달랐는지 생각해보라!(p.83)

“랜디, 사람들이 너를 거만하다고 생각하는 것은 정말 안된 일이야. 그렇게 되면 네 인생에서 이룰 수 있는 것들이 한정되니까.”

“…장벽은 절실하게 원하지 않는 사람들을 걸러내려고 존재합니다. 장벽은, 당신이 아니라 ‘다른’ 사람들을 멈추게 하려고 거기 있는 것이지요.”

“그 애 마음이 정말 그런 것일까? 나는 아니라고 본다. 여태 그 애가 보여준 행동과 일치하지가 않잖니.”

자동차는 실용적인 도구이지 사회적 지위를 나타내는 수단은 아니다. 모든 걸 다 고칠 필요는 없다.

시간은 명쾌하게 관리되어야 한다. 마치 돈처럼. “난간의 밑면을 얼마나 광나게 닦는지는 아무 상관도 없는 일이다.”

가장 실용적인 목록은 과제를 잘게 쪼개 놓은 것이다.

스스로에게 물어라. 옳은 일에 시간을 쓰고 있는가?

전화를 사용하기 전 다시 생각해봐라. … 더 좋은 방법으로는 일어나서 전화하는 것이다. 그래야 빨리 끝낼 수 있다. … 누군가와 짧게 전화하고 싶은가? 그러면 점심시간 직전인 오전 11시 55분에 전화해라.

위임해라.

제대로 쉬어라. … “전화 안내원에게 물으면 그들의 전화번호를 알 수 있을 겁니다. 그런 다음 당신이 저의 장인 장모님에게 아주 급한 일로 따님의 신혼여행을 좀 방해하겠다고 설득할 수 있다면, 그들이 연락할 번호를 줄 것입니다.”

교육을 담당한 교사들의 최고 목표는 학생들에게 공부하는 법을 가르치는 것이다. … 그러나… 나는 학생들에게 스스로를 판단하는 법을 가르쳐주고 싶었다. … 자기 자신을 평가하는 능력을 개발하는 것이다.

“나는 자네 머리가 좋다는 것을 알지. 하지만 여기 있는 모두가 다 똑똑한 사람들이야. 머리 좋은 것이 다가 아니야. 내가 우리 팀에 원하는 사람은 다른 이들을 도와가며 행복하게 일하는 사람이야.”

“앤디 교수님, 제가 이번에 학생들에게 두 주짜리 과제를 내주었는데 모두 A를 줄 만큼 놀라운 작품을 제출했어요. 이제 어떻게 하죠?” “자, 이렇게 하자고. 내일 강의 시간에 학생들 눈을 똑바로 쳐다보면서 이런 식으로 말해. 너희들 말이야, 꽤 괜찮긴 했어. 하지만 더 잘할 수도 있었잖아.” … 기준을 대충 아무 높이에나 맞추는 것은 학생들에게 폐를 끼치는 일이라고 지적해주었다.

나는 어떤 팀의 과제물이 가장 좋을지 미리 예상할 수 있었다. 보디랭귀지가 다 알려주었다. 만약 어느 한 팀의 학생들이 몸이 닳을 듯 밀착해 있다면 그들이 서로 가까워졌다는 것을 알 수 있었고…

멋은 짧고 성실함은 길다.

웬일인지, 시간이 지나고 인생의 마지막이 다가오니까 항복하는 것이 옳은 일이 되어버렸다.

불평하지 마라, 그저 노력해라. 불평하는 것은 전략이 될 수 없다. 우리 모두 한정된 시간과 에너지를 가지고 있다. 우리가 불평하는 데 쓰는 아주 약간의 시간도 목표를 달성하는 데 아무런 득이 되지 않는다. 그러면 좋을 게 없지 않은가.

병을 고쳐라, 증상이 아니라.

다른 사람의 생각에 집착하지 마라.

옆에 앉는 것에서부터 시작하라.

정중하게 사람들을 대해라. 모든 일의 시작은 자기소개부터다. 연락처를 주고받아라. 사람들의 이름을 정확히 발음할 수 있게 해라.

공통점을 찾아라. 상대한테서 공통점을 찾는 일은 대부분 어렵지 않다. 그러면 거기서부터는, 당신이 꺼내놓아야 하는 다른 의견을 말하기가 훨씬 수월해진다. 스포츠는 인종과 빈부 차이의 경계를 넘나든다. 그마저도 없다면 우리 모두에게는 날씨라는 공통 화제가 있다.

최적의 만남 조건을 만들어라. 혹시 배가 고프거나 춥거나 피곤한 사람이 있는지 확인하라. 가능하면 식사시간에 만나라. 음식은 회의의 분위기를 부드럽게 한다.

모두가 이야기하게 해라. 남의 말을 자르지 마라. 그리고 큰소리로 말하거나 빠르게 말한다고 당신의 아이디어가 더 나아지는 것은 아니다.

문 앞에서 나를 버려라. 아이디어를 나눌 때, 의견 하나하나에 제목을 붙이면서 받아 적어라. 제목은 아이디어를 설명하는 것이어야 하며 발표자를 기록하는 것이 아니다. ‘제인의 이야기’가 아니라 ‘브리지 스토리’로 가야 한다는 말이다.

서로를 칭찬해라. 약간은 무리해서라도 좋은 말을 해주어라. 아무리 나쁜 아이디어라 해도 자세히 들여다보면 좋은 점이 있을 것이다.

대안을 내놓으려면 질문 형식으로 해라. “나는 B가 아닌 A로 가야한다고 생각해.”가 아닌 “만약 우리가 B가 아니고 A를 한다면 어떨까?”로 제안하라. 그래야 자신의 선택만을 고집하지 않으면서 자유롭게 토론하도록 할 수 있다.

모두에게서 장점을 찾아라. “만약 당신이 충분히 기다려 준다면, 사람들은 당신을 놀라게 하고 감동을 안겨줄 거예요.” … 당신이 사람들에게 실망하고, 그들이 당신을 화나게 했다면, 그건 아마도 당신이 그들에게 충분한 시간을 주지 않았기 때문일 것이다.

말이 아닌 행동을 보아라. “시간이 오래 걸리긴 했지만 결국 깨달은 사실인데요. 여자에게 접근하는 남자들을 판단하는 방법은 아주 간단하답니다. 그들이 무슨 말을 하는지는 완전히 무시해버리고 오직 그들이 하는 행동만 집중해서 보면 되지요.”

만약 첫 번에 성공하지 못했다면 다시 시도해라. 진부한 말이지만.

클리셰들이 그토록 자주 반복되는 이유는 많은 경우 그 말들이 정곡을 찌르기 때문이라고 여겨진다.

너를 데리고 간 사람과 춤추어라. 비즈니스 세계에서나 학교에서나, 그리고 가정에서도 명심해야 할 진언이다. 이 말은 충성심과 감사하는 마음을 상기시킨다.

행운이란 준비가 기회를 만날 때 생기는 것이다. 앞으로 적어도 2000년은 더 반복할 만한 가치가 있다.

당신이 할 수 있다고 생각하든, 할 수 없다고 생각하든, 당신이 옳다.

그것 말고는, 링컨 부인, 연극은 어떠셨습니까? 내가 학생들에게 큰 문제를 제쳐두고 작은 문제들에 연연하지 말라는 뜻으로 자주 하는 말이다.

얼마나 세게 칠 것인가, 그것이 문제가 아니었다. 얼마나 센 주먹에 얻어터질 것인가 바로 그게 문제라는 것. 아무리 세게 맞았어도, 계속 앞으로 나아가야 한다.

경험이란 당신이 원하는 것을 얻지 못했을 때 얻어지는 것이다. 그리고 경험은 당신이 가진 것 중 가장 가치 있는 것이다.

사람들을 집중시켜라. 나는 그들의 주목을 끌어냈다. 관심을 집중시키는 것이야말로 지나치기 쉬운 문제를 푸는 첫 번째 단계였다.

감사의 마음을 표시하는 것은 인간들이 서로에게 할 수 있는 가장 간단하면서도 강력한 행위 중 하나다.

많은 사람들은 지름길을 원한다. 나는 최고의 지름길은 돌아가는 길이라 생각한다. 간단히 말해 묵묵히 최선을 다하라는 것이다.

“누군가 당신을 위해 했던 일을 당신도 다른 이들을 위해 하세요.”

당신이 준비한 것이 당신이 가진 전부다. 준비를 생활화하는 다른 방법은 모든 상황을 부정적으로 생각해보는 것이다. … 혹시 늑대에게 잡아먹힌다면?

누군가에게 사과를 할 때는 A학점이 아니면 모두 낙제라고. 사과를 받는 사람이 모욕을 느낄 수 있기 때문이다. 두가지의 전형적인 나쁜 사과의 예부터 설명했다. 1.”내가 한 일로 상처받게 해서 미안해.”(감정적인 위안을 주고자 하는 시도지만, 그 상처에 어떤 약도 바르고 싶지 않은 게 분명해 보인다.) 2.”내가 한 일에 대해 사과할게, 그렇지만 너도 네가 한 일에 대해 나에게 사과를 할 필요가 있어.”(이것은 사과를 하는게 아니다. 사과를 하라고 몰아붙이는 것이다.) 적절한 사과는 다음과 같은 세 가지를 포함하고 있다. 1.내가 한 일은 잘못됐어. 2.너에게 상처를 준 점 미안하게 생각해. 3.내가 어떻게 하면 좋을까?

진실만을 말하라. 언제나. 당신은 나중에 그 사람들을 또 마주치게 될 것이고, 그들은 당신이 거짓말한 사실을 기억할 것이다. 그리고 그들은 다른 많은 사람들에게 당신에 대해 이야기할 것이다. 그것이 바로 거짓의 놀라운 점이다.

“이건 나에 비해 너무나 하찮은 일이어서 우편물 분류 따위는 잘하고 싶지 않아.” 그 어떤 직업도 우리보다 하찮은 것은 없다. 그리고 만약 당신이 우편물을 분리할 수 없다면(혹은 하지 않을 것이라면), 당신이 다른 일을 잘할 것이라는 보장은 어디에 있는가?

절대 포기하지 마라.

권리는 어딘가에서 주어지는 것이고, 그 어딘가는 바로 공동체다. 그 대신에 우리 모두는 공동체에 대한 의무가 있다. … 나는 이것을 상식이라 부른다.

가끔씩, 당신은 그저 물어보기만 하면 된다. 그것이 당신이 일생 동안 품어왔던 꿈을 이루는 길로 이끌 수도 있다. 궁금한 것이 있다면 질문하라. 그저 묻기만 하면 된다. 당신이 기대하는 것보다 자주 당신이 듣게 될 대답은, “물론이죠.”가 될 것이다.

결정적으로 중요한 것은 나와 아이들을 연결하는 특별하면서도 구체적인 이야기들이라고 말했다.

첫번째 헤드페이크, 이 강의는 어떻게 당신의 꿈을 달성하느냐에 관한 것이 아닙니다. 이 강의는 어떻게 당신의 인생을 이끌어갈 것이냐에 대한 것입니다. 만약 당신이 인생을 올바른 방식으로 이끌어 간다면, 그 다음은 자연스럽게 운명이 해결해 줄 것이고 꿈이 당신을 찾아갈 것입니다.”
 
두번째 헤드페이크, 이 강의는 내 아이들을 위한 것입니다.