함성에 묻힌 인생. 더 레슬러.

예전부터 보고 싶던 영화를 틀었다.
자세를 바로 하고 경건한 마음으로 영화감상을 시작하려 하는데...
첫씬을 보니, 아뿔싸! 이건 전에 봤던 영화잖아.
요즘 영화 잘 보지도 않는데 봤던 영화를 또 본다니.
TV를 끌까 말까 망설이다가 기억이 영 희미해서 다시 한번 보기로 했다.
영화를 보는 내내 전에는 어떤 느낌으로 이 영화를 봤었는지 떠오른다.
‘맞아. 나도 프로레슬링 좋아했었지. 얼티밋 워리어, 헐크호건, 언더테이커...’
‘아프겠다. 참 안되었군. 저 노인네.’
뭐 이런 생각을 하며 봤었다.
그는 내게 남이었고, 그저 영화 속 캐릭터일 뿐이었다.
그런데 이번엔 좀 다르게 다가왔다.
지금 이웃 중 누군가일 수도 있고, 어쩌면 나. 혹은 지인의 머지않은 미래 생활이 될 수도 있겠다는 생각이다.

지난겨울 지인들과 함께한 술자리에서 이런 이야기를 들었다.
“내가 제일 두려운 건, 나중에 늙어서 폐지 줍는 할머니가 되는 거야.”
다른 지인도 그에 공감하며 자기도 그게 제일 두렵단다.
공부도 많이 했고, 지금은 대기업에서 죽어라 일하는 그녀가 폐지 줍는 할머니가 되리라 생각하기는 어렵다.
하지만 우리는 지금 이런 시대에 살고 있다.
기술은 점점 발전하고, 기계가 대체할 수 있는 일자리는 사라진다.
설령 어떤 뛰어난 기술을 가졌다고 할지라도, 팔아먹지 못할 기술이라면 생존에 큰 도움이 되지 않는다.

이 영상을 보면, 4개국어를 하는 사람이나 로봇을 설계하는 기술자,
대학에서 생물학을 전공한 고학력자가 박스를 줍는 정도가 아니라 노숙자로 생활한다.

지금 어느 자리에 있다는 사실이, 내일도 그 자리에 있으리라는 것을 보장하지는 않는다.
어쩌면 나와 주위 사람들은 운이 좋아서 박스 줍는 일을 면하게 될지도 모른다.
그러나 지금 추세로 볼 때 마땅한 일자리를 찾지 못하는 사람은 더 늘어날 것이다.
누군가는 박스를 주울지도 모르고, 누군가는 박스도 줍지 못할지도 모른다.
일하는 사람은 적어지겠고, 업무 강도는 높아지겠다.
스트레스로 머리가 빠질 지경이어도 생존을 위해 일은 하겠지만, 세금이 점점 높아질 것이다.
그리고 그 세금은 박스도 줍지 못해서 죽어가는 사람들의 생활비를 대 주는데 일조할 것이다.
한쪽에선 일이 넘쳐 죽겠고, 한쪽에선 일이 없어 죽겠는 현실에서 빡빡하게 살아가다가 결국은 모두 죽겠지.
랜디가 단지 프로레슬링이 좋아서 피 흘리며 경기를 뛰었을까?
자의 반 타의 반.
고객 만족이 큰 가치인 사업 분야에선 별로 마음에 내키지 않아도 자기 최면을 걸어야 한다.
‘난 원래 이걸 좋아하는걸. 난 고객님 만족을 위해 태어난 것을...’
그래야 살아남기 때문이다.

프로레슬러의 피는 밖으로 튀고,
사무실에서 조용히 일하는 사람들 피는 안에서 터진다.
더 레슬러.
이 영화는 이 시대를 치열하게 살아가는 현대인을 다룬 영화다.



by


Tags : , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

사업계획서(Business Plan)를 짜임새 있게 작성하는 방법


정지호 강사님의 Business Plan Skill 강의를 듣고 정리한 사업계획서 작성요령이다.

사업 전반

사업을 시작할때 교집합이 필요한 요소 세 가지

  • 내가 좋아하는 것
  • 내가 잘 하는 것
  • 나만 할 수 있는 것

대한민국 창업 성공률 5%이하.
손익분기점(BEP - Break Even Point)을 넘기는 경우가 거의 없다.
앱 100만 다운로드일 때 광고수익 월 180만원 가량.

 

사업화 진행 과정-'사업계획서 작성요령 (Business Plan Skill)'
사업화 진행 과정 예시


사업계획서

사업계획서의 목적은 설득이 아니라 이해다.
15~20장 사이로 이해가 쉽게 쓴다.
제목 예시 : 무엇을 활용한 어떤 플랫폼의 구축(어떤 기술로 뭘 만들지 쓴다.)

사업계획서를 쓰는 이유

  • 자금 확보
  • 자기 사업에 대한 점검

사업계획서 작성에 고려가 필요한 세 가지

  • 비주얼 (보기 좋고, 한눈에 눈에 들어오게 작성)
  • 객관성 (수치나 자료를 잘 이용하며 출처는 반드시 쓴다)
    • 찾은 자료가 3년치 통계만 있는데 5년치 자료가 필요하면, 직접 연구해서 나머지 부분을 추론하여 쓰고, 출처 밑에 00년 자료는 자체연구를 통해 추론한 내용임이라고 덧붙인다.
    • 블로그는 출처가 될 수 없다.
    • 필요한 자료를 찾기 어렵다면 신문 기사 출처를 역추적한다.
  • 밸런스 (기술 / 시장 부분 균형있게 작성)

사업 계획서 보기 좋게 쓰는 법

첫장은 다음 3가지를 간단히 요약해서 설명한다.
1. 현황
2. 적용 기술
3. 기대 효과

이 세 가지를 도표로 만들어 옆에 간략히 한두줄의 설명을 넣고, 아랫쪽에 이를 풀어서 쓴다.

단락사이는 공백을 넣어 가독성을 높인다.
줄간격은 180~185사이가 보기 좋으나 160으로 제한한다면 170정도로 쓴다.
중요한 단어는 진하게 하여 눈에 들어오게 한다.

로드맵

사업 계획서에는 로드맵이 꼭 들어가야 한다.

  • 위험 관리
    • 돈이 떨어지면 어떻게 할 것인가?
    • 사용자 수가 몇 이상 되지 않으면 어떻게 할 것인가?
    • 만약 이 아이템이 잘 되지 않으면, 차선책은 무엇인가?
  • 진입장벽 구축 전략
    • 후발업체 진입을 어떻게 막을 것인가?
  • 시장 진입 방법
  • BEP 손익 예측

사업계획서 스토리보드 작성 요령

스토리 보드를 잘 작성해 두면,
다양한 양식의 사엽 계획서에 필요한 부분을 뽑아쓰기 편하다.

  1. 표지
    제목 (무엇을 하는 사업인지 알린다.)
    부제 (제목에서 명확한 전달이 어렵다면 부제를 단다.)
  2. 목차
  3. 배경/기업가의 역량

    • 배경 (문제제기)
      시장 규모를 보여준다. (시장조사를 통해 정확하게 정량화)
      장황하게 서술하는 것이 아니라 정량적으로 수치만 보여준다.
      현 시장의 문제점을 정확하게 집는다.
    • 해결 방안
      배경에서 제시한 문제를 어떻게 해결할 것인가에 대한 내용을 적는다.
    • 기대 효과
      이 사업이 어떤 결과를 가져올지 적는다.

    • 기업명
      하려는 사업과 이미지가 맞는 기업명을 선택한다.

    • 기업가의 역량
      이 사업을 시행하기에 적합하다는 것을 보여준다.
  4. 요약
  5. 특장점
  6. B.M.설계 or 랜더링
    • 무얼 해서 어떻게 수익을 얻을 것인가?
  7. 파급효과
  8. 전체 시장 규모
  9. 현 관련 시장 매출 추이 (목표시장)
  10. 설문조사
  11. 목표시장 진입의 적정성(타당성, 근거)
  12. 예상 매출(각 수요처별)
    • 예상 수요처 : 각 수요처별 예상 매출
    • 수요처 Contact 현황
    • 수요처 Contact 예정
  13. 로드맵
    • 어떻게 롱런 할건가?
    • Brand 전략은 어떻게 세울 것인가?
    • 고객과의 신뢰는 어떻게 쌓을 것인가?
  14. 손익(BEP)
  15. 위험관리(RM - Risk Management)
    • 자금 한계는 어떻게 넘을 것인가?
    • 고객이 싫증을 느끼면 어떻게 할 것인가?
    • 경쟁사가 출현하면 어떻게 할 것인가?
  16. 소요자금
    • 인건비
    • 영업비
    • 생산비

PT 슬라이드

투자를 받기 위한 자리나 IR용 PT자료는 글씨가 작은 것이 좋다.
보통 작은 공간에서 PT가 이루어지기 때문이다.

  1. team & CEO
    • CEO 따로
    • team에는 CEO를 불포함
    • 아직 없는 팀원도 미리 포함
  2. 배경
  3. 아이템
  4. BEP 그래프 (초반 매출이 저조하다면, 트래픽 등 의미있는 수치를 보여준다.)
  5. 비전 & 목표

제품 생애주기 (PLC - Product Life Cycle)

  • 도입
  • 성장
  • 성숙
  • 쇠퇴

도입기에 성장이 더딘 이유

  • 브랜드가 없다.
  • 신뢰가 없다.
  • 자금 한계가 있다.

성숙기에서 쇠퇴기로 넘어가는 이유

  • 고객이 싫증을 느낀다.
  • 경쟁사가 출현한다.

지출

갈수록 증가한다. 지출 계획을 잘 세워야 한다.

  • 인건비
  • 생산비
  • 영업비

BEP를 앞당기는 방법

  1. 매출 시점을 앞당긴다.
  2. 지출을 줄인다.

마케팅 전략 (Marketing Strategy)

Market + ing + Strategy
시장 + 생존 + 전략
* 어떻게 매출을 올릴 것인가?
* 계약을 체결했는가?
* MOU를 체결했는가?

매출 예측을 하려면 시장분석을 해야 한다.
시제품이 나오기 전에는 고객의 needs를 파악하고,
시제품이 나오고 나면 고객의 wants를 파악한다.

기술 기업임을 증명하는 방법

  • R&D 전문 인력 구성
  • 지식 재산권 보유
  • 연구소
  • 잘 짜여진 R&D 로드맵

 

자금 조달 방법

투자

  • 엔젤투자자
  • 창업투자회사

요즘 엔젤 투자자는 꿈이 아니라 VC처럼 회수시점의 이익을 생각하고 투자하는 경우가 많다.
엔젤에서 투자를 하겠다고 나선다면, VC에도 같이 연락하여 제일 조건이 좋은 곳에 투자를 받는다.

융자

  • 중소기업진흥공단
  • 기술 보증
  • 신용 보증
  • 은행

융자가 필요하다면 중소기업진흥공단 -> 기술 보증 -> 신용보증이나 은행 순서로 자금을 확보한다. 신용 보증에서 융자를 받으면 기술 보증에서 융자 받기가 어렵고, 마찬가지로 기술 보증에서 융자를 받았다면 중소기업진흥공단에서 융자를 받기 어렵기 때문이다.
만약 신보에서 돈을 빌렸다가 상환을 마친다고 해도, 기보에서 융자를 받기 위해서는 3개월의 유예기간이 필요하다.

 

인증

Venture 확인기업

세제 혜택이 있으며 기술평가기업인 기보와 중소기업진흥공단, 벤처기업 협회(VCA)에서 확인을 해준다.
(창업한 지 1년 이내에 받는게 좋으며 주로 기보에서 확인을 받는데,
다음의 자격이 필요하다.

  • 대표이사의 동종업계 근무 경력 (1년 이상의 경력이 필요하다.)
  • R&D기업임 증명하거나 기업 부설 연구소가 있거나 구성인력이 적정해야 한다.
  • 지식 재산권을 가지고 있어야 한다.
  • 회사 설립 1년 이전엔 재무재표가 필요 없으나 1년 이후엔 필요하다.

Inobiz 기술 혁신 기업 인증

설립한지 3년이 넘은 기업으로 다음 조건이 필요하다.
* 매년 매출이 증가할 것
* 고용이 늘어날 것
* 지적 재산권이 있을 것

ISO 인증

9001은 품질 경영 관리 인증이고,
14001은 환경 인증이다.
9001을 받고 14001을 받는다.
하나 받는데 150만원 정도이고, 두 개를 한번에 받으면 할인해 준다.

 

국가 지원 사업

앞으로 진행되는 국내 지원 사업은 모두 사관학교 식으로 진행된다.

사관학교식 지원의 특징

  • 입주실
  • 멘토 상주
  • 사업비 지원

중복 수행 가능 여부

주무부처가 다르거나 먼저 진행 중인 사업의 종료 시점 이후로 새로운 사업 협약을 하면 된다. 그러나 특정 사업에 대해 중복 수행 불가 언급이 없는지 먼저 확인해야 한다.

심사위원 전문가 구성

  • 경영
  • 기술
  • 시장
  • 기타

심사기준

  • 기업가의 역량 (10~30)
    • 경력
    • 준비 상태
    • ✫ 기업가 정신
  • 기술성 / 독창성 (30~50)
    • 진입장벽
    • 독창성
    • 경쟁사와 차별성
  • 시장성 / 사업성 (30~50)
    • 시장 규모
    • 시장 진입 타당성


링크

연구소 설립 (http://www.rnd.or.kr/newly/requirementshuman01.jsp)
한국 표준 협회 (http://www.ksa.or.kr/)
벤처확인 (https://www.venturein.or.kr/venturein/petition/C11100.jsp)



by


Tags : , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

글에 등장하는 모든 것은 이유가 있어야 한다.


시나리오

옴니버스 영화는 철저히 기획해서 제작한다.
감독을 먼저 컨텍하고 그에 맞는 작가를 모집한다.

어떤 지역을 배경으로 선택할 때는 그 지역의 특징을 잡아서 작품에 녹여내야 한다.

만약 주인공을 소심한 인물로 설정했다면,
그걸 빨리 깨는 모습을 보여줘야 한다.



소설


무엇을 쓸까?

1차적 발상 : 내가 하지 못하는 것을 등장인물을 통해서 보여준다.
2차적 발상 : 나와 시대와의 접점을 찾아낸다.


2차적 발상 소설을 쓰려면?

  1. 신문‧시사고발을 보고 인물 하나를 뽑는다.
  2. 그 인물을 객관화 한다.
    (과도한 감정몰입은 피한다.)
  3. 결론이 사회 비판으로 가면 안되고, 인간에 대한 이해로 가야 한다.

인간을 바라보는 관점

나는 인간을 어떻게 바라보는가?
내가 바라보는 인간은 어떤 것인가?


시대를 바라보는 관점

내가 남들과 다른 시선으로 바라보는 것은 무엇인가?



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

개발의 통찰. 글로벌 소프트웨어를 말하다, 지혜.

기술 서적을 거의 읽지 않는다. 개발에 필요한 대부분 자료는 웹에서 찾아보면 되기 때문이다. 기술 관련 책은 두껍고 시간이 얼마 지나면 전혀 쓸모가 없어져 버린다. 이런 책들은 쓸데없이 책꽂이 공간만 차지하고 있다가 색이 바래고 다시는 펼쳐져 보지 않은 채 버려지기 마련이다. 그중에는 가끔 다른 용도로 활용되는 책이 있기도 한데, <비주얼 C++ 6> 과 <자바 2 프로그래밍 바이블>. <실무에 강해지는 JSP 프로그래밍>은 책이 튼튼해서 이 세 권을 잘 쌓아 그 위에 모니터를 올려놓고 쓴다.
자료를 찾아보는 면에서 더 편한 걸 쓰면 되므로 책이 편한 사람은 책을 보면 되고 인터넷이 편한 사람은 인터넷을 보면 된다. 이건 개인의 취향이니까.

<글로벌 소프트웨어를 말하다, 지혜.>는 고수의 비급을 풀어놓은 책으로 개발자로서 자신을 한번 돌아볼 기회를 준다. 분명 IT에 대해 말하지만, 글쓴이의 삶의 방향과 의지를 느끼게 하는 수필과 같은 느낌이 들기도 한다. 때로는 당연한 이야기가 나오기도 하고, ‘맞네, 맞아!’하고 손뼉을 치게 하는 글귀도 나온다. 그동안 개발을 업으로 하며 느꼈던 좌절감을 다시 느끼기도 하고, 그래도 이 정도면 썩 괜찮은 개발자가 아닌가 하는 생각도 든다. 내가 백발이 성성할 때까지 개발자로 살아갈지 어떨지는 모르겠다. 그러나 확실한 건 내 개발 인생의 끝을 마주하고 싶다는 것이다. 설령 언젠가 개발을 그만두게 되더라도, ‘아 개발자로 계속 살아갈 것을...’ 이런 미련이 남지 않도록.



글로벌 소프트웨어를 말하다, 지혜. 책갈피.

미국의 직업선호도 조사에 의하면 수만 개의 직업 중에서 소프트웨어 개발자는 과거 수년 동안 직업선호도 1위를 차지해 왔다. 노동집약 산업이라면 가장 선호하는 직업이 될 수는 없었을 것이다. 눈이 충혈되고 피골이 상접한 모습으로 일하는 모습으로는 직업선호도 1위가 될 수 없다.

비용평가와 가치평가는 노동집약 산업과 지식 산업의 대표적인 차이이다. 어떤 제품의 가치를 판단할 때 ‘누가 얼마나 걸려 만들었는가?’라는 원가산출 방식으로 제품의 가치를 산정하는 것이 노동집약 산업의 특징이다. 반면에 ‘고객이 느끼는 가치가 제품의 가치’인 것이 지식 산업이다. 즉, 모차르트가 하나의 곡을 하루 동안에 작곡을 하든 한 달에 걸쳐 작곡을 하든 곡의 가치와는 상관이 없다는 것이다.

“잘못된 길을 멀리 가느니 안 가는 게 낫다”라는 격언이 있다. 모험과는 다르다. 모험은 잘 될 수 있는 확률이라도 있지만 원칙이 잘못된 경우는 모험이 아니라 그냥 100% 오류인 것이다. 잘못된 길을 모험이나 열정적인 노력으로 미화하지 않기를 바란다.

음악을 작곡하는 사람과 연주를 하는 사람이 다르듯이 ‘한 사람이 분석(작곡)도 하고 설계와 구현(연주)을 해야 한다’는 생각은 버려야 한다. 소프트웨어에서는 연주할 곡은 ‘소프트웨어 요구사항 분석서(Software Requirements Specification, SRS)’라는 문서로 작성된다. SRS라는 곡을 가지고 연주하는 것이 설계와 구현이다. 먼저 SRS가 아름다워야 한다. 그리고 아름다운 연주를 해야 한다.

음악에서는 연주할 곡이 완성되지도 않은 상태에서 연주할 수 있는 방법이 없다. 그런데 국내 소프트웨어에서는 무엇을 만드는지도 잘 모르는 상태에서 만들기 시작하는 경우가 허다하다. 반쯤 작곡된 곡을 미리 연주하겠다는 것이다.

대개 아름다움은 좋은 결과를 가져오지만 항상 좋은 결과를 가져오는 충분조건은 아니다. 하지만 아름답지 않으면 절대 좋은 결과는 나오지 않는다. 즉, 충분조건은 아니지만 필요조건인 것이다.

“개는 그들이 던지는 돌을 쫓아다니지만, 사자는 더 이상 돌은 거들떠보지 않고 돌을 던진 자를 문다”고 했다. 우리는 적어도 인간으로서 개가 아닌 사자만큼은 인과관계를 구별할 줄 알아야 한다.

감동은 근본적으로 자기가 할 수 없을 때 느끼는 감정이다. 자기가 스스로 실행하고 있는 사람은 감동받을 일이 없다. 기부를 늘 해 온 사람들은 아름다운 기부 얘기를 들어도 별 감동이 없는 법이다. 그냥 동질감을 느낄 뿐이다.

리눅스의 창시자인 리누스 토발즈가 다음과 같이 말했다.
“지혜는 일을 하는 것을 피하면서 일을 완수하는 역량이다.”
(Intelligence is the ability to avoid doing work, yet getting the work done.)

가장 상위 개념으로 올라가서 “당신이 추구하는 인생의 목표가 무엇입니까?”라고 물으면 거의 모든 사람이 “행복하기 위해서”라고 답한다. 그럼 궁극적인 목표를 알기 위해서는 “왜 행복하기를 원합니까?”라는 질문도 답을 해야 하는데 대부분 여기서 답이 막힌다. 답을 한다고 해도 다음 질문이 또 나온다. 여기서부터는 형이상학의 영역이기 때문에 보통 사람들에게는 짜증나는 대화일 뿐이고 극히 소수의 사람만이 대화가 가능하다. 결국은 거의 모든 인간은 동물과 같이 오욕에 집착하며 목표도 모른 채 만물의 영장이라고 자아도취하면서 살아가는 것이다.

소프트웨어 공학에서의 정의는 ‘가장 빠른 시간에 가장 적은 비용으로 좋은 품질의 제품을 개발하는 것’이다. 소프트웨어 공학에서도 지적하는, 개발자가 믿는 대표적인 미신이 ‘분석할 시간이 없어서 바로 코딩에 들어가겠다’이다. 이 한마디가 회사 전체의 역량이 초급 수준이라는 것을 말해 준다.

우리 몸에는 방위체력과 운동체력 두 가지가 있고 총합이 일정하다. 그러니 운동체력이 올라가면 방위체력은 떨어진다. 어느 순간 운동을 열심히 하면 병에 걸리기 쉽다는 얘기이다. 총합을 올리려면 운동을 장기간 꾸준히 해야 서서히 올라간다.

깨달음은 스스로 얻어야 하는 것이다. 소크라테스처럼 제자들이 깨달을 때까지 계속 질문을 던지는 것이 스승이 할 수 있는 최선이다. 깨달음의 세계는 다 그런 식으로 진행된다. 그냥 일방적으로 가르쳐서 배울 수 있다면 그건 지혜가 아닌 지식의 세계이다.

국내 팬들이 실리콘밸리의 어느 누구보다 훨씬 더 존경하는 스티브 잡스는 사용자 대표들의 모임인 Focus Group 미팅 따위에는 관심이 없었다. 만일 이에 의존했다면 애플의 혁신적인 제품은 하나도 나오지 않았을 것이다. 그는 고객에 대해 너무도 잘 알고 있었다. 고객 자신보다도 고객을 더 잘 알고 있었다. 고객선호도를 알아내겠다고 설문조사의 결과를 맹신하는 것이 창조와 혁신의 세계에서는 얼마나 위험한 것인지 알 수 있다. 수많은 사람의 의견보다 전문가 한명의 통찰력이 중요하다.

혁신적인 이슈로 강연을 했을 때 50%이상이 공감하면 잘못된 것이다. 그것은 혁신적인 이슈가 아니라는 것을 의미한다. 많은 사람이 공감대를 가질 수 있다면 대부분 선동가나 사기꾼이다. 선각자와 공감대는 본질적으로 서로 모순된 용어이다.

감정적인 이슈를 논리적으로 해결하려 들고, 논리적인 이슈를 감정적으로 해결하려 들고, 공감대가 필요한 이슈를 독단으로 하고, 독단으로 결정할 이슈에서 공감대를 찾는 일은 이제 그만두어야 한다.

개발자는 하루종일 혼자서 일할 수 있어야 한다. 공유해야 할 이슈가 있다면 자기가 집중력을 회복하기 위해 쉬는 시간에 이슈관리시스템을 보면서 처리하면 된다. 하지만 자신이 집중하고 있는 중에 누가 불러댄다면 처음부터 다시 시작해야 한다. 이를 ‘일체성’이라고 한다. 한 번에 완성되지 않으면 처음부터 다시 만들어야 한다. 바둑도 마찬가지고 당구도 마찬가지다. 조엘 스폴스키는 그의 책에서 “개발자가 한 번 전화를 잠깐 받으면 원상복구하는 데 평균 30분이 걸린다”고 했다. 하루에 전화 다섯 번을 받고, 회의에 몇 차례 다녀 오면 개발 일은 할 수가 없다는 것이다.

열정이 없는 것이 아니라 자신의 능력과 현실을 정확히 인식하는 것이 중요하다. ‘아키텍트의 삶을 살 것인가, 고참 개발자의 삶을 살 것인가’를 선택할 수 있는 소수의 경우에는 어떤 삶이 좋을지는 가치관에 따라 다르기 때문에 옳다, 그르다의 문제는 아니다.

글로벌 회사가 될 수 있는가 아닌가를 평가할 때 고객이 직접 방문을 하는 모델로 만들었다면 일단 아니다.

예외처리나 디버그 문장이 습관상 게을리 하기 가장 쉬운 것들이다. 귀찮은 코드이기도 하고 일단 구동이 되는 것이 목표이기 때문에 나중에 한다고 하지만 결국은 못 한다.

좋은 프로그래밍의 필요 조건은 손가락이 아닌 머리를 사용하는 것이다. 그 훈련도 많이 해야 하고 빨리 타이핑의 유혹에서 벗어나야 한다.

진정으로 해야 하는 중요한 것은 다 장기적이고 일만 시간의 법칙이 필요한 것이다. 힘든 노력은 하지 않고 돈으로 재미있고 쉬운 것에 유혹될 때 못하게 하는 것이 회사의 비용을 절약하고 주화입마에 빠질 위험성을 줄이는 것이다.

‘과거에 내가 한 일이 나만의 가치가 되는 일’은 없애야 한다. 그런 가치를 인정해주는 회사라면 희망이 없는 회사니 빨리 이직을 하기 바란다. 과거의 정보는 모든 사람이 나누어 가지고 미래의 가치를 키우는 회사가 바로 개발자가 열정을 가지고 일할 가치가 있는 회사다.

이해할 수도 없이 복잡하게 만들어 놓은 설계는 100% 나쁜 설계이다. 왜 이 설계가 좋은 설계냐고 물어볼 필요가 없다. 인간이라면 아름다움은 스스로 판단할 줄 안다. 결국 아름다운 설계가 좋은 설계이다.

Top-down을 하기 위해서는 다음 네 가지 역량이 필요하다.

  • 자연스러운 습관의 거부
  • 외로움을 이기는 강력한 의지
  • 예술적인 창조성
  • 방법적인 역량

이 중에 하나라도 해당되면 글로벌 회사의 역량은 없다고 보면 된다.

  • 개발자가 재택근무를 할 수 없다.
  • 회의한다고 개발자를 계속 불러 댄다.
  • 멘토가 가르쳐주지 않고는 신입사원이 일을 시작할 수 없다.
  • 제품 릴리즈를 일 년에 세 번 이상 한다.
  • 백발이 성성한 개발자가 한 명도 없다.
  • 지금 없어지면 제품 유지보수에 큰일 나는 개발자가 있다.
  • 시장에 나온 새로운 개발도구는 다 가지고 있다.
  • 코드를 많이 복사해서 사용한다.
  • 코딩하면서 예외처리를 하지 않는다.
  • 코딩을 각자 다 자기 스타일로 한다.
  • 어느 개발자가 마지막 일주일에 소스코드를 왜 몇 줄을 고쳤는지 모른다.
  • 착한 개발자가 피해를 입는다.
  • 보고하느라 시간을 많이 보낸다.
  • 개발자가 2주 휴가를 갔다 올 시간이 없다.
  • 모든 결정에 ROI(투자대비효과)를 달라고 한다.
  • 다음에 개발할 제품이 무엇인지 모른다.
  • 문서를 만들기는 하나 보지는 않는다.
  • 물려줄 자산이 없다.


링크

저자 블로그 (http://ikwisdom.com)
SWEBOK (http://www.computer.org/portal/web/swebok)
The evolution of a softwareengineer (https://medium.com/@webseanhickey/the-evolution-of-a-software-engineer-db854689243)



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

시나리오와 소설은 어떻게 쓰는가?

시나리오

사건을 먼저 잡는다.
그리고 주인공의 행동이 사건에 따라 일어난다.
요즘엔 복합물이 많지만, 원형을 먼저 파야 한다.
산만하지 않게 주제에 집중한다.

캐릭터를 살리는 방법

  • 사건이 생겼을때 그 사건에 대응하는 모습
  • 대사 (쓰는데 시간을 많이 잡아먹는다.)

스릴러

긴장감, 관객과의 머리싸움(속임수)
참고할만한 작품 : ⌜히치콕⌟

멜로‧로멘스

원형을 파되, 최근의 추세 트렌드하고 결합한다.
드라마를 보는 것이 도움이 된다.
참고할만한 작품 : ⌜귀여운 여인⌟ ⌜러브어페어⌟

코미디

미국식 코미디는 우리나라 정서에 맞지 않으니 조심해야 한다.
참고할만한 작품 : 채플린의 작품

시나리오 공부에 좋은 영국 드라마

  • 셜록
  • 루터
  • 삼총사
  • 화이트 채플
  • 브로드 첮치
  • 마이 매드팻 다이어리


소설

나의 또다른 자아를 만들어 내는 것이다.
내가 하고 싶지만 못하는 행동을 주인공이 해낸다.
과정 중에 어려움을 겪으며 해결하는 카타르시스를 그려낸다.
나와 또 다른 자아 사이에는 판타지가 있어야 한다.
직업이 다르거나 처한 상황이 다르거나 나와 다른 요소를 가미한다.
자기를 투영하는 등장인물이라고 해도 자기연민은 버려야 하고,
나의 어려움이 아닌 다른 사람의 어려움이 무엇인지 공감하는 것이 중요하다.
자기 연민을 걷어내라!
어떤 소재만으로는 소설이 되지 못하므로,
그 소재에서 반짝이는 순간을 포착하여 소설로 쓴다.
독자가 소설을 읽는 이유는 ‘무엇을’ ‘왜’에 대한 해답을 찾기 위해서니,
그 답을 먼저 주고 그 다음에 ‘어떻게’에 대한 해답을 주는 것도 괜찮다.
유럽에서는 기본적으로 철학 교육이 되어있기 때문에
‘무엇을’과 ‘왜’를 생략하고 ‘어떻게’로 바로 들어가는 소설도 많다.
묘사를 너무 살리기 보다는 중요한 정보를 알려주는 것이 좋다.
글로 일일히 장황하게 설명하기 보다는 영향력 있는 상황으로 보여준다.
장면의 전환에는 새로운 소재를 가미하면 신선하다.
등장인물이 일상에서 벗어난 모습을 보여준다.
아무런 계기가 없는 갑작스러운 결말은 혼란스러우니 조심한다.



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

류시화 시인이 엮은 시 모음집. 사랑하라 한번도 상처받지 않은 것처럼.

시.
어릴 적 내겐 너무도 먼 존재였다.
컴퓨터 자판을 익히기 위한 한메 타자 교실에서 아무런 감정도 운율도 없이 투다닥 투다닥 쳐나가던 글씨였을 뿐.
프랑시스 잠, 라이너 마리아 릴케 이런 시인의 이름은 생소하기만 했고,
이를 언급한 별 헤는 밤의 윤동주 시인 역시 너무나 멀리 있었다.

그러다가 문득 이런 생각이 들었다.
‘시를 하나쯤 외운다는 건 멋진 일일 거 같아.’
뜬금없이 이런 생각이 왜 들었는지는 모르겠다.
그때 외우기 쉬워 보이는 시는 구르몽의 낙엽이었는데,

시몬, 나무 잎새 져버린 숲으로 가자.
낙엽은 이끼와 돌과 오솔길을 덮고 있다.

시몬, 너는 좋으냐? 낙엽 밟는 소리가.

이 이후로는 도통 외워지지가 않았고,
그렇게 시간이 지나니 시몬한테 낙엽이 좋으냐고 물었는지,
혹은 낙엽 밟는 소리를 알았느냐고 물었는지조차 헛갈리게 되었다.
그러던 어느 날 친구가 내게 한편의 시를 소개했는데,
류시화 시인의 ‘새와 나무’라는 시였다.

여기 바람 한 점 없는 산속에 서면
나무들은 움직임 없이 고요한데
어떤 나뭇가지 하나만 흔들린다

그것은 새가
그 위에 날아와 앉았기 때문이다

별일 없이

살아가는 뭇사람들 속에서
오직 나만 홀로 흔들리는 것은
당신이
내 안에 날아와 앉았기 때문이다

새는 그 나뭇가지에 집을 짓고
나무는 더 이상 흔들리지 않지만
나만 홀로 끝없이 흔들리는 것은
당신이 내 안에 집을 짓지 않은 까닭이다

이때 처음으로 시인이란 위대한 존재라고 느꼈다.
그 이후로 류시화 시집을 몇 권 읽었던 것 같긴 한데 오래 된 일이고 기억이 희미하다.

한해 한해 살아가며 의도하든 그렇지 않든 매년 읽게 되는 글자의 양이 어마어마하다.
눈을 피로하게 하고 머리를 아프게 하거나 의미가 없는 글자들. 먹고 살기 위한 문서나,
남들은 어떻게 사나 기웃거리며 읽게 되는 문장들.
그렇게 눈으로 들어오는 수많은 글 중에 과연 머리가 아닌 가슴으로 흘러가는 것이 얼마나 될까?
좋은 시는 몇 자 되지도 않으면서 곧장 심장을 향해 흘러 온다. 아름답다.

글을 잘 쓰는 수필가를 보면 멋있어 보이고,
소설을 잘 쓰는 사람은 존경스러우며,
시인은 위대하다.
그 위대한 시인 중 한 명인 류시화 시인의 가슴으로 흘러들어 간 시 모음집.
사랑하라 한번도 상처받지 않은 것처럼.
심장에 시가 돌지 않아 손발이 저리고 차가운 사람에게 좋은 시집이다.

코타키나발루-'사랑하라 한번도 상처받지 않은 것처럼 Love, like you’ve never been hurt.'

이 시집에서 고른 아홉 편의 시


사랑하라, 한번도 상처받지 않은 것처럼

춤추라, 아무도 바라보고 있지 않은 것처럼.
사랑하라, 한번도 상처받지 않은 것처럼.
노래하라, 아무도 듣고 있지 않은 것처럼.
일하라, 돈이 필요하지 않은 것처럼.
살라, 오늘이 마지막 날인 것처럼.


- 알프레드 디 수자


삶을 위한 지침

다른 사람들이 기대하는 것보다 더 많이, 그리고
진심으로 기뻐하며 주라.
자신이 가장 좋아하는 시를 외우라.
들리는 모든 것을 믿지는 말라.
때로 자신이 갖고 있는 모든 것을 써버려라, 아니면
실컷 잠을 자라.

첫눈에 반하는 사랑을 믿으라.
다른 사람의 꿈을 절대로 비웃지 말라.
꿈이 없는 사람은 가난한 사람이니까.
사랑은 깊고 열정적으로 하라. 상처받을 수도 있지만,
그것만이 완전한 삶을 사는 유일한 길이다.

위대한 사랑과 위대한 성취는
엄청난 위험을 동반한다는 사실을 기억하라.
실패하더라도, 그것을 통해 배움을 얻는 일에까지
실패하지는 말라.

때로는 침묵이 가장 좋은 해답이 될 수 있음을 기억하라.
변화하는 데 인색하지 말라. 그러나
자신의 가치관을 지키라.
무엇보다 바람직하고 존경할 만한 삶을 살라.
늙어서 자신의 생을 돌아볼 때
또다시 그것을 살게 될 테니까.

신을 믿으라, 하지만 차는 잠그고 다니라.
숨은 뜻을 알아차리라.
당신의 지식을 남과 나누라.
그것이 영원한 삶을 얻는 길이므로.
기도하라, 헤아릴 수 없이 많은 힘이 거기에 있다.

자신이 실수한 것을 깨닫는 순간, 즉시 바로잡으라.
즐겁게 대화를 나눌 수 있는 사람과 결혼하라.
늙으면 그것이 아주 중요해질 테니까.
하지만 가끔 혼자 있는 시간을 가지라.

일 년에 한 번은, 전에 전혀 가보지 않았던 곳을 찾아가라.
돈을 많이 벌었다면
살아 있을 때 다른 사람을 돕는 데 쓰라.
그것이 부가 가져다주는 가장 큰 만족이다.

자신이 원하는 걸 얻지 못하는 것이 때로는
큰 행운일 수 있다는 점을 기억하라.

규칙을 배우고 나서, 그중 몇 가지를 위반하라.
무엇을 얻기 위해서 무엇을 포기했는가를
자신의 성공을 평가하는 기준으로 삼으라.
자신의 성격이 곧 자신의 운명임을 기억하라.


- 작자 미상. 처음에는 <행운을 가져다주는 네팔 탄트라 토템> 또는 <달라이 라마의 만트라>라는 제목으로 알려진 시


이것 또한 지나가리라

어느 날 페르시아의 왕이 신하들에게
마음이 슬플 때는 기쁘게
기쁠 때는 슬프게 만드는 물건을 가져올 것을 명령했다.

신하들은 밤새 모여 앉아 토론한 끝에
마침내 반지 하나를 왕에게 바쳤다.
왕은 반지에 적힌 글귀를 읽고는
크게 웃음을 터뜨리며 만족해 했다.
반지에는 이런 글귀가 새겨져 있었다.
‘이것 또한 지나가리라.’

슬픔이 그대의 삶으로 밀려와 마음을 흔들고
소중한 것들을 쓸어가 버릴 때면
그대 가슴에 대고 다만 말하라.
‘이것 또한 지나가리라.’

행운이 그대에게 미소 짓고 기쁨과 환희로 가득할 때
근심 없는 날들이 스쳐갈 때면
세속적인 것들에만 의존하지 않도록
이 진실을 조용히 가슴에 새기라.
‘이것 또한 지나가리라.’


- 랜터 윌슨 스미스


봄의 정원으로 오라

봄의 정원으로 오라.
이곳에 꽃과 술과 촛불이 있으니
만일 당신이 오지 않는다면
이것들이 무슨 의미가 있는가.

그리고 만일 당신이 온다면
이것들이 또한 무슨 의미가 있는가.


- 잘랄루딘 루미


무사의 노래

나에겐 부모가 없다
하늘과 땅이 나의 부모
나에겐 집이 없다
깨어 있음이 나의 집
나에겐 삶과 죽음이 없다
숨이 들고 나는 것이 나의 삶과 죽음
나에겐 특별한 수단이 없다
이해가 나의 수단
나에겐 힘이 없다
정직이 나의 힘
나에겐 비밀이 없다
인격이 나의 비밀
나에겐 몸이 없다
인내가 곧 나의 몸
나에겐 눈이 없다
번개의 번쩍임이 나의 눈
나에겐 귀가 없다
예민함이 나의 귀
나에겐 팔다리가 없다
신속함이 나의 팔다리
나에겐 기적이 없다
바른 행동이 나의 기적
나에겐 고정된 환칙이 없다
모든 상황에 적응하는 것이 나의 원칙
나에겐 전략이 없다
비움과 채움이 나의 전략
나에겐 벗이 없다
내 외로운 마음이 곧 나의 벗
나에겐 적이 없다
부주이가 곧 나의 적
나에겐 갑옷이 없다
관대함과 의로움이 나의 갑옷
나에겐 굳건한 성이 없다
흔들림 없는 마음이 나의 성
나에겐 검이 없다
나를 버림이 곧 나의 검


- 15세기 일본 무사들의 노래


뒤에야

고요히 앉아 본 뒤에야
평상시의 마음이 경박했음을 알았네.
침묵을 지킨 뒤에야
지난날의 언어가 소란스러웠음을 알았네.
일을 돌아본 뒤에야
시간을 무의미하게 보냈음을 알았네.
문을 닫아건 뒤에야
앞서의 사귐이 지나쳤음을 알았네.
욕심을 줄인 뒤에야
이전의 잘못이 많았음을 알았네.
마음을 쏟은 뒤에야
평소에 마음씀이 각박했음을 알았네.


- 중국 명나라 문인 진계유


진정한 여행

가장 훌륭한 시는 아직 씌여지지 않았다.
가장 아름다운 노래는 아직 불려지지 않았다.
최고의 날들은 아직 살지 않은 날들
가장 넓은 바다는 아직 항해되지 않았고
가장 먼 여행은 아직 끝나지 않았다.
불멸의 춤은 아직 추어지지 않았으며
가장 빛나는 별은 아직 발견되지 않은 별
무엇을 해야 할지 더 이상 알 수 없을 때
그때 비로소 진정한 무엇인가를 할 수 있다.
어느 길로 가야 할지 더 이상 알 수 없을 때
그때가 비로소 진정한 여행의 시작이다.


- 나짐 히크메트


힘과 용기의 차이

강해지기 위해서는 힘이 필요하고
부드러워지기 위해서는 용기가 필요하다.

자신을 방어하기 위해서는 힘이
방어 자세를 버리기 위해서는 용기가

이기기 위해서는 힘이
져주기 위해서는 용기가

확신을 갖기 위해서는 힘이 필요하고
의문을 갖기 위해서는 용기가 필요하다.

조화를 이루기 위해서는 힘이
전체의 뜻에 따르지 않기 위해서는 용기가

다른 사람의 고통을 느끼기 위해서는 힘이
자신의 고통과 마주하기 위해서는 용기가 필요하다.

자신의 감정을 숨기기 위해서는 힘이 필요하고
그것을 표현하기 위해서는 용기가 필요하다.

학대를 견디기 위해서는 힘이 필요하고
그것을 중단시키기 위해서는 용기가 필요하다.

홀로 서기 위해서는 힘이 필요하고
누군가에게 기대기 위해서는 용기가 필요하다.

사랑하기 위해서는 힘이
사랑받기 위해서는 용기가

생존하기 위해서는 힘이
삶을 살기 위해서는 용기가 필요하다.


- 데이비드 그리피스


하지 않은 죄

당신이 하는 것이 문제가 아니다
당신이 하지 않고 남겨 두는 것이 문제다
해질 무렵 당신의 마음을 아프게 하는 것이 그것이다

잊어버린 부드러운 말
쓰지 않은 편지
보내지 않은 꽃
밤에 당신을 따라다니는 환영들이 그것이다

당신이 치워 줄 수도 있었던
형제의 길에 놓인 돌
너무 바빠서 해 주지 못한
힘을 북돋아 주는 몇 마디 조언
당신 자신의 문제를 걱정하느라
시간이 없었거나 미처 생각할 겨를이 없었던
사랑이 담긴 손길
마음을 끄는 다정한 말투

인생은 너무 짧고
슬픔은 모두 너무 크다
너무 늦게까지 미루는
우리의 느린 연민을 눈감아 주기에는

당신이 하는 것이 문제가 아니다
당신이 하지 않고 남겨 두는 것이 문제다
해질 무렵 당신의 마음을 아프게 하는 것이 그것이다


- 마가렛 생스터



by


Tags : , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

세계문학상 수상작가 정재민의 글쓰기 특강.

보헤미안 랩소디라는 소설로 제10회 세계문학상을 받은 정재민 작가의 특강이 열렸다.
어떤 계기로 글을 쓰게 되었고, 판사라는 생업에 종사하며 계속 소설을 써서 등단 작가가 되기까지 과정을 들려주는 재미난 강의였다.
기억에 남는 몇 가지를 정리한다.

정재민 작가의 창작 이야기

작가에게 가장 중요한 것은 ‘고유성’이라고 생각합니다. 자신만의 색깔이 있다면 비록 최고의 인기를 누리지 못한다 해도 특색 때문에 가치가 있거든요. 자기 색깔을 잃으면 끝이에요.

문학은 결국 독창성이라고 생각합니다. 해보지 않은 새로운 시도를 한다면 그게 결국 작품이 되는 것 같아요. 이번에 쓴 작품도 개인적인 이야기를 정신분석학적인 시각으로 바라보는 시도를 했기 때문에 좋은 결과를 얻었다고 봅니다.

글을 쓰는 사람은 소통이 부족하여 세상과의 소통을 갈구하는 것 같아요. 내면이 평화로운 사람은 아무것도 하지 않아도 그대로 좋거든요.

사람의 identity가 다른 사람과의 관계 사이에 있는 것 같아요. 내가 이 사람하고 행동할 때 이렇다고 해서 다른 사람하고 있을 때도 같은 행동을 하는 건 아니거든요.

처음엔 쓰고 싶은 부분을 먼저 쓰고 연결하는 방법으로 글을 썼어요. 그래서 쓰고 싶던 부분은 짜임새가 있었는데, 연결부는 마음에 들지 않는 경우가 많았죠. 그런데 4개월 만에 소설 한 편을 써야 하는 일이 생겨서 집중해서 한 문장 쓸 때마다 한번 쓰면 끝이라는 생각으로 긴장을 늦추지 않고 썼더니 훨씬 효율적이었습니다.

제가 처음에 계획했던 대로 글이 써지면 실패하는 것 같아요. 내용이 뻔하거든요. 그래서 저는 감당할 수 없는 어떤 사건을 일으켜 버리고, 그걸 수습하는 걸 좋아해요.



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

SF 고전. 은하수를 여행하는 히치하이커를 위한 안내서.


작년에 친구네 막걸리 한 사발 하러 갔다가 취기에 소설책 한 권을 빌렸다. 사고 싶던 책인데 다섯 권을 묶어서 아주 저렴하게 팔아서 냉큼 샀다는 거다. 3분의 1쯤 읽고 쉬고 있다는 말에 금방 읽고 준다며 빌려와서 거의 일 년 만에 돌려줬다. 이 책을 읽으며 정말 큰 교훈을 얻었는데, 만화책이 아니라면 합본은 절대 사지 말아야 한다는 것이다. 너무 두꺼워서 들고 다니기가 어려우니 집에서만 읽어야 한다. 팔이 아파서 들고 보기가 어렵다. 아마도 지금껏 소설을 읽다가 팔이 아프긴 처음이었지 싶다.
어찌 보면 팔운동과 독서를 함 하는 최고의 방법일지도 모르겠다는 위안으로 책을 읽었다. 은하수를 여행하는 히치하이커를 다 읽었어도 팔 근육은 전혀 발달하진 않았지만, 안면 근육은 확실히 발달했다.
웃을 일이 많기 때문이다.:D
이런 이야기를 만들어낸 더글라스 애덤스가 존경스럽다. 6권은 이오인 콜퍼라는 아일랜드 작가가 썼는데, 이름만 같은 다른 소설이라고 보는 게 맞을 것 같다. 꽤 재미있는 편이지만, 웃기는 방법이 다른 시리즈와 전혀 다르다. 더글라스 애덤스와 이오인콜퍼가 닮은 점이라면 둘 다 말장난의 대가라는 것이다. 그들은 진지하게 웃기기도 하고 무작정 웃기기도 하고 생각지도 못하게 웃기기도 한다. 아무튼, 웃기다. 풍자와 재치 넘치는 이야기로 책 읽는 내내 지루할 틈이 없다.

은하수를 여행하는 히치하이커를 위한 안내서(The Hitchhiker’s Guide to the Galaxy)는 총 여섯 권으로 대체로 재미있다.
  • 은하수를 여행하는 히치하이커를 위한 안내서(The Hitchhiker’s Guide to the Galaxy)
  • 우주 끝에 있는 레스토랑 (The Restaurant at the End of the Universe)
  • 삶, 우주 그리고 모든 것 (Life, the Universe and Everything)
  • 안녕히, 그리고 물고기는 고마웠어요 (So Long, and Thanks for All the Fish)
  • 대체로 무해함 (Mostly Harmless)
  • 그런데 한 가지 더 (And Another Thing...) - 이오인 콜퍼

재미도 재미지만 인생의 답이 무엇일까 궁금하다면 꼭 한번 읽어볼 만한 소설이다.
그 이유는 은하수를 여행하는 히치하이커를 위한 안내서엔 삶, 우주 그리고 모든 것에 대한 그 엄청난 해답이 나와 있기 때문이다.
‘삶은 무엇인가?’
‘우주는 왜 생겨났는가?’
이런 궁금증을 가져봤던 사람이라면 이 내용이 궁금하지 않을 수 없을 것이다.
이건 깊은 생각이라는 엄청난 슈퍼컴퓨터가 몇 세대에 거쳐 계산해야 나오는 답인데,
요즘엔 세상이 좋아져서 그런지 구글도 답을 알고 있다.
구글 검색창에 ‘the answer to life the universe and everything’ 이라고 치면 이 엄청난 질문에 대한 해답이 튀어나오는데,
혹시 심장이 약하다면 검색 전에 우황청심환을 한 알 먹어두는 편이 좋다.

시리즈-'은하수를 여행하는 히치하이커를 위한 안내서'

은하수를 여행하는 히치하이커를 위한 안내서 - 책갈피


인간은 계속해서 입을 움직이지 않으면 머리가 작동하기 시작한다는 이론이었다. 하지만 얼마 지나지 않아 그는 이 이론 역시 단념했고, 거추장스럽기만 한 냉소주의도 포기했다. 그는 결국 자신이 인간들을 꽤 좋아한다고 결론지었지만, 이들이 모르고 있는 그 수많은 것들을 생각하면 언제나 지독하게 걱정스러웠다.

뿌연 안개에 싸인 저 과거의 옛 시절, 전대(前代) 은하 제국의 위대하고 영광스러운 시절에는 인생은 멋지고 풍요로웠으며 대략 면세였다.

아서는 눈을 껌뻑이며 스크린을 바라보다가 자신이 뭔가 중요한 것을 잊고 있는 듯한 기분을 느꼈다. 그게 무엇인지 그는 문득 깨달았다.
"이 우주선에는 홍차가 없나?"그가 물었다.

그는 열까지 세기 시작했다. 언젠가는 지각 있는 생명체들이 이것마저 영영 잊어버리지 않을까 진심으로 걱정됐다. 숫자를 세는 것만이 인간이 컴퓨터로부터 독립해 있다는 사실을 증명할 수 있는 유일한 길이었다.

"난 제멋대로야. 뭔가를 해야겠다는 생각이 떠오르면, 여어, 못할 거 뭐 있어, 하고는 해버리지. 은하계의 대통령이 되어야지 생각하면 그대로 돼버리는 거야. 쉽다고. 이 배를 훔치자, 마그라테아를 구경하자, 하고 결심하면, 모두 그대로 되는 거야. 물론 어떻게 하면 가장 잘할 수 있을까 하고 계획을 꾸미는 것은 사실이애. 그래, 하지만 언제나 쉽게 잘 된다고. 마치 은하 신용 카드를 가지고 있는데, 내가 한 번도 지불 수표를 보내지 않았는데도 계속 사용이 가능한 거나 마찬가지야. 그러고는 '내가 왜 이 일을 하고 싶어 했지?', ' 그 방법을 어떻게 생각해냈지?' 이런 질문들에 대해 곰곰히 생각해보려 할 때마다 그 생각을 더 이상 하고 싶지 않은 강한 충동을 느끼게 되지. 지금처럼 말이야. 이런 이야기를 하는 것만 해도 너무 힘이 들어."

마치 불륜을 저지르고 있다가 여자의 남편이 방에 들어오는 바람에 혼비백산했는데 그 남편이라는 자가 바지를 갈아입더니 날씨가 어쩌고 하는 대수롭지 않은 말만 몇 마디 건네고 그냥 다시 방에서 나가버리는 일을 당한 것 같은 기이한 느낌이 들었다.

친구. 법률에 의하면, 궁극적인 진리 탐구는 사상가들의 양도할 수 없는 특권이라고 분명히 명시되어 있소. 어떤 빌어먹을 기계가 정말 진리를 찾아내 버리면, 우리는 당장 실직자가 된단 말이오. 안 그렇소?

그는 아서에게 마치 스테고사우루스 공룡의 갈비뼈로 만들어진 것처럼 보이는 의자 쪽으로 오라고 손짓해 보였다.
"그 의자는 스테고사우루스의 갈비뼈를 뽑아 만든 거라오."

"정말 한 가지 해답이 있나?" 푸흐그가 헐떡였다.
"정말 한 가지 해답이 있습니다." 깊은 생각이 확인해주었다.
"그 모든 것들에 대해서? 삶, 우주 그리고 모든 것에 대한 그 엄청난 질문에 대해서?"
"그렇습니다."

"말해줘!"
"그러죠." 깊은 생각이 말했다. "위대한 질문에 대한 해답은……."
"해답은……!"
"삶, 우주, 그리고 모든 것에 대한 해답은……." 깊은 생각이 말했다.
"해답은……!"
"그 해답은……." 깊은 생각이 말을 멈췄다.
"해답은……!!!"
"42입니다." 무지무지하게 엄숙하고 침착하게 깊은 생각이 말했다.

왜냐하면, 굉장히 지성적이고 꽤 재미있고 또 인간적인 이야기를 할 거니까! 자, 너희가 항복하고 나와서 우리한테 때릴 기회를 주든지…… 물론 우리는 쓸데없는 폭력에는 반대하기 때문에 너무 많이 때리지는 않을 거지만……아니면, 우리가 이 행성 전체를 날려버리고 가는 길에 눈에 띄는 한두 개를 더 날려버리게 하든지 선택해라!

은하계의 모든 주요 문명은 다음과 같이 뚜렷하고 확연한 세 단계를 거친다. 즉 생존, 의문, 그리고 세련의 단계다. 다른 말로 하면 어떻게 왜, 그리고 어디의 단계라고 할 수 있다.
예를 들어, 첫 번째 단계를 특징짓는 질문은 '어떻게 먹을까'이고, 두 번째 단계는 '우리는 왜 먹는가'이고, 마지막 단계는 '어디서 점심을 먹을까'이다.

나는 죽었기 때문에 알지. 죽음이라는 건 사물을 꿰뚫어 볼 수 있는 놀라운 혜안을 주거든. 여기 명부에는 이런 속담이 있다. 생명은 산 자들에게 쓸데없이 낭비되고 있다.

오래전, 이곳은 대단히 번창했고, 행복한 행성이었습니다. 사람들, 도시들, 가게들이 가득한 정상적인 세상이었죠. 이 도시들의 번화가에 좀 필요 이상으로 구두 가게가 많았다는 것만 제외하면요. 그런데 이 구두 가게들의 수가 서서히, 아무도 알아차리지 못하게 늘어난 겁니다. 그건 아주 널리 알려진 경제 현상이지만, 실제로 그런 일이 벌어지는 걸 보는 건 참 비극적이었죠. 즉, 구두 가게들이 늘어나면 늘어날수록 더 많은 구두를 만들어내야 했고, 그러면 그럴수록 구두들은 점점 더 질이 나빠지고 신을 수 없는 구두가 되었고, 구두의 질이 안 좋아질수록 신발을 신고 다니기 위해선 점점 더 많은 구두를 사야만 했죠. 그래서 신발 가게는 더 늘어만 갔고, 결국 전 경제는 신발 파동 수평선이라 불리는 선을 넘어버린 겁니다. 그 시점이 되면 신발 가게 외에 다른 것을 만드는 것이 경제학적으로 불가능해져버리죠. 그 결과는 파국과 폐허, 기근이었습니다.

당신은 그저 자기 시대에 예금 통장에 일 페니만 저금하면 된다. 시간이 끝나는 날에 당신이 도착하면, 복리(複利) 작용에 의해 엄청난 식사 비용은 이미 지불이 되어 있을 것이다.

포드는 팬 갈랙틱 가글 블래스터를 한 잔 더 마셨다. 이 술은 강도(强盜)의 술 버전에 해당되는 술이라고 회자되는 술이다. 즉, 대가가 값비싸고 머리가 빠개진다.

"난 자기를 먹어달라고 청하는 짐승을 먹고 싶진 않다고. 냉혹한 짓이야." 아서가 말했다.
"먹히고 싶어 하지 않는 짐승을 먹는 것보단 낫지." 자포드가 말했다.

예술의 기능은 자연에 거울을 들이대는 것이다. 하지만 그 정도로 큰 거울은 없다.

고(故) 핫블랙 데지아토 씨가 그의 보디가드의 도움을 받아 움직이는 통로를 타고 주차장으로 내려왔다.

이쯤에서 포드가 지구인을 처음 만났을 때 그들의 특이한 버릇에 대해 정립했던 이론을 다시 한번 되짚어보는 게 좋겠다. 그가 보기에 지구인들은 너무너무 명백한 사실들을 계속해서 말하고 또 말하는 괴상한 버릇이 있었다. '아, 좋은 날씨로군'이라든지 '키가 상당히 크시군요'라든지 '그래서 이걸로 끝이군, 우리는 죽는 거야'같은 소리들 말이다.
그의 첫 번째 이론은, 만일 지구인들이 계속해서 입술을 사용하지 않는다면 그들의 입은 시들어빠질 것이라는 것이었다.
몇 달간 관찰한 뒤 그는 두 번째 이론을 내놓았다. '만일 지구인들이 계속 입술을 움직이지 않는다면 그들의 머리가 작동하기 시작할 것이다.'

계획은 이런 거였어요. 첫 번째 우주선인 A 방주에는 뛰어난 지도자들, 과학자들, 위대한 예술가들, 뭐 그런 성공한 사람들 있잖아요, 그런 사람들이 타고, 세 번째 우주선인 C 방주에는 진짜 일을 하는 사람들, 그러니까 물건을 만들고 일을 하는 사람들이 탔죠. 그리고 B 방주에는---그게 우리 우주선이죠---그 밖의 사람들이 탔어요. 중간치들 말이에요.

내가 어찌 알겠어요? 과거란 현재의 나의 육체적 감각과 마음 상태 사이의 괴리를 설명하기 위해 만들어낸 허구일지도 모르는데.

"좋아요. 그게 존재한다는 건 어떻게 알죠? 당신이 잘해준다는 걸 그 녀석이 아는지 당신이 어떻게 알아요? 당신이 친절이라 생각하는 그걸 저 녀석이 좋아하는지 어떻게 알아요?" 자니우프가 자기의 주장을 밀어붙이며 말했다.
"물론 모르죠."그 사람이 미소를 띠며 대답했다. "전혀 몰라요. 고양이처럼 보이는 대상에게 어떤 특정한 방식으로 행동했을 때 내 기분이 좋을 뿐이죠. 당신은 다르게 행동하나요? 하여간, 이제 난 피곤한 것 같아요."

"우선 먹고 나서 나중에 생각해 보면 어떨까?" 아서가 말했다.
"아마 그게 바로 그 사람들이 원하는 것일 거야."
"좋아, 그럼 이렇게 생각해봐……."
"아직까지는 괜찮게 들리는데."
"저 과일은 우리가 먹으라고 저기 있어. 좋을 수도 있고 나쁠 수도 있지. 우리 배를 불려줄 수도 있고, 독으로 우리를 죽일 수도 있어. 만일 저게 독이 든 건데 우리가 안 먹는다면, 그들은 다른 방법으로 우리를 공격 할 거야. 우리가 먹지 않더라도 우리는 어쨌든 지는 거라고."
"네가 생각하는 방식이 맘에 들어. 그럼 하나 먹어봐."

다른 사람의 문제(Somebody Else’s Problem)
SEP라는 건, 우리가 볼 수 없는, 아니 보지 않는, 우리 뇌가 못 보게 하는 광경이야. 왜냐하면 다른 사람 문제라고 생각하기 때문이지. SEP의 뜻이 그거야. '다른 사람의 문제.' 뇌가 그 부분을 편집해 잘라내기 때문에 눈에 안 보이는, 맹점 같은 거라고. 그게 정확히 뭔지 모르는 경우에는 똑바로 쳐다보면 보이지 않아. 유일한 희망은 곁눈질로 어쩌다 재수 좋게 힐끗 보게 되는 거지.

식당의 구역 내에서 식당 청구서에 적히는 숫자들은 식당을 제외한 우주의 다른 구역에서 다른 종이 위에 적히는 숫자들이 따르는 수학적 법칙들을 전혀 따르지 않는다는 것이었다. 이 단 한 가지 사실이 전체 과학계를 폭풍처럼 초토화했으며, 과학 전체에 완벽한 혁명을 몰고 왔다. 헤아릴 수 없는 많은 수학 학회들이 훌륭한 식당에서 열리는 바람에, 당대 최고의 지성들 중 많은 이가 비만과 심장마비로 죽어나갔고 수학이라는 과학의 발전이 몇년씩 뒷걸음질을 쳤다.

이 쓰레기 같은 건 안 봐도 돼요. 그저 고개만 끄덕이지 마시오. 그러면 괜찮아.

이 치들은 뭘 믿냐 하면…… '평화, 정의, 윤리, 문화, 스포츠, 가족 생활, 그리고 다른 생명체의 말살'을 믿는다고 하는군요.

그는 검은 바지에, 배꼽 비슷한 데까지 단추를 풀어 젖힌 검은 실크 셔츠를 입고 있었다.

싸움은 ‘스트리테락스 행성의 사일라스틱 갑옷 악마’ 종족이 몹시 잘하는 일이었다. 그리고 워낙 잘하는 일이다 보니 싸움을 아주 많이 했다. 적들(즉, 다른 사람들 모두)과 싸웠고, 자기네끼리 서로 싸웠다. 그들의 행성은 철저히 폐허가 되었다. 행성 표면은 버려진 도시들로 가득 찼고, 주위는 버려진 무기들이 가득했으며, 그 주위에는 또 사일라스틱 갑옷 악마 종족이 살면서 시시한 일들로 서로 싸워대는 깊디깊은 벙커들이 있었다.
이 종족과 싸우려면, 제일 좋은 방법은 그냥 세상에 태어나는 것이었다. 그들은 누가 태어나는 걸 좋아하지 않았고, 심지어 몹시 비위 상하는 일이라고 여겼다. 그리고 이 종족이 성이 나면 꼭 다치는 사람이 생겼다. ‘인생을 뭐 그렇게 피곤하게 산담’ 하고 생각할지 모르지만, 그 종족은 정력이 어마어마하게 샘솟았던 모양이다.

“핑!” 자포드가 말했다. “피유우우우우우! 빵빵빵!”
“이봐요.” 컴퓨터가 일 분 후 명랑하게 말했다. “당신은 삼 점을 받았어요. 이제까지의 최고 점수는 칠백오십구만 칠백오십구만 칠천이백…….”

그는 새들과 의사소통하는 법을 배웠지만, 그들의 대화가 기가 막히게 지루하다는 사실을 깨달았다. 대개가 바람의 속도, 날개 길이, 체력과 무게의 비율에 대한 것이었고, 나아가 상당 부분이 딸기에 대한 것이었다. 불행하게도, 일단 새의 말을 배우게 되면 머지않아 허공에서 새의 말소리밖에 들리지 않는다는 걸 깨닫게 된다. 그저 무의미한 새들의 수다밖에 들리지 않는 것이다. 그것을 피해 도망갈 데가 없었다.

그날 저녁에는 해가 일찍 저물었다. 그맘때는 그게 정상이었다. 춥고 바람도 많이 불었다. 그맘때는 그게 정상이었다. 비가 오기 시작했다. 이건 더더구나 특히 정상적인 일이었다. 우주선 한 대가 착륙했다. 이건 정상이 아니었다.

청구서는 상당히 길었다.
맨 아래에는 오디오 세트 밑바닥에 새겨진 제품 번호와 비슷한 숫자가 쓰여 있었다. 등록을 하려고 베껴 쓰는 데 몹시 오래 걸리는 그 일련 번호들 말이다.

“구즈나…….” 포드 프리펙트가 말했다. 이건 뭔가 말은 하고 싶은데 특별히 할 말이 없을 때 그가 잘 쓰는 베텔게우스 행성어였다.

“이봐요, 당신도 그때 그 사건은 다 기억할 거 아뇨. 환각 말이에요. 사람들은 다 CIA가 전쟁에 마약을 사용하려고 실험을 했다든가 뭐 그랬다고 합디다. 다른 나라를 진짜로 침략하는 대신, 사람들이 침략당했다고 믿게 만드는 게 훨씬 비용이 저렴하다든가 뭐 그런 미친 이론이었지요.”

사브는 분노로 이글거리며 어둠 속으로 사라져 갔다. 아서는 떠나는 자동차 뒤를 하염없이 바라보고 있었는데, 그 꼬락서니는 마치 오 년 동안 자신이 장님이 된 줄 알고 지내던 사람이 어느 날 너무 큰 모자를 쓰고 있었을 뿐이라는 사실을 깨달은 것 같았다.

달은 물기를 촉촉이 머금은 채 하늘에 떠 있었다. 방금 세탁기에서 꺼낸 청바지 뒷주머니에서 나온 종이 한 뭉치 같았다. 시간이 지나고 다림질을 해야, 간신히 그것이 쇼핑 목록인지 오 파운드 지폐인지를 분간할수 있는 그런 꼬깃꼬깃한 종이들 말이다.

그는 BBC에 전화를 걸어서 팀장에게 연결해달라고 부탁했다.
“아, 안녕하세요, 아서 덴트입니다. 저, 육 개월 동안 결근을 해서 죄송한데요. 그동안 제가 좀 돌았었어요.”
“오, 걱정할 것 없네. 아마 그런 일일 거라고 생각했었지. 여기서는 늘 있는 일이니까. 그럼 언제부터 다시 출근할 수 있나?”
“고슴도치들이 동면을 시작하는 게 언제죠?”
“아마 봄쯤일걸.”
“그때쯤 뵙죠.”
“좋았어.”

“캘리포니아 사람들은 과잉 체지방을 황금으로 바꾸는 법을 발견했어.”

“그대의 땋아 내린 머리카락들이 모조리 풀려 / 한 올 한 올이 빳빳이 서리라 / 불안한 고슴도치의 가시들처럼”

“아주 굉장히 특별한 이유로 당신이 내게 아주 중요한 사람이라고 생각해보세요. 그리고 당신은 모르지만, 나도 그쪽한테 아주 중요한 사람이고 말이죠. 하지만 갈 길이 겨우 오 마일밖에 남지 않은 데다, 내가 멍청한 바보 천치라서 화물 트럭에 치이지 않고는 방금 처음 만난 사람한테 아주 중요한 말을 할 줄 모르는 인간이라서 그 모든 게 다 아무 의미가 없어진다면 어떻게 되겠어요……그러면 내가…….” 그는 어쩔 줄 몰라 하며 말을 멈추고는, 그녀를 바라보았다.
“……어떻게 하면 좋겠어요?”
“앞을 봐요!” 그녀가 비명을 질렀다.
“이런 망할!”
그는 수백 대의 이탈리아 세탁기들을 싣고 있는 독일 화물 트럭 측면에 충돌하는 사태를 간신히 면했다.
“내 생각에는…….” 그녀는 잠시 안도의 한숨을 쉰 후 이렇게 말했다.
“제 기차가 출발하기 전에 저한테 뭐 마실 거라도 한 잔 사셔야 할 거 같네요.”

영국에는 끈질기게 사라지지 않는 특유의 정서가 있다. 바로 샌드위치를 어떤 식으로든 흥미진진하고 매혹적이고 먹을 때 기분좋게 만드는 것은 죄악이며, 그건 오로지 외국인들이나 하는 짓이라는 생각이다.
‘되도록 말라빠지게 만들라’는 게 집단적인 국민 의식에 깊이 박혀 있는 요리 수칙이었다. “되도록 고무처럼 만들어라. 햄버거를 굳이 신선하게 보관해야 한다면, 일주일에 한 번씩 물로 씻도록 하라.”

햇살이 옥상의 정원들에 내리쬐었다. 건축가들과 배관공들의 머리 위에도 내리쬐었다. 변호사들과 강도들 머리 위에도 내리쬐었다. 피자 위에도 내리쬐었다. 부동산 중개업자의 명세서 위에도 내리쬐었다.

그도 태평양을 바라보았다. 해변을 따라 달리는 도요새가 몇 마리 있었는데, 그들에게는 이런 문제가 있었다. 모래 속에 묻어둔 먹이가 방금 파도에 쓸려갔는데, 발이 물에 젖는 건 참을 수가 없었던 것이다. 이 문제를 해결하기 위해서 도요새들은 굉장히 똑똑한 스위스 사람들이 만든 기계처럼 괴상하게 팔짝팔짝 뛰어다니고 있었다.

“이쑤시개의 중간 부분을 손으로 잡는다. 뾰족한 부분을 입 속에서 촉촉하게 적시도록 한다. 이빨 사이의 공간에 삽입하고, 뭉툭한 부분을 잇몸에 대도록 한다. 부드럽게 넣었다 뺐다 하는 동작을 반복한다.”
“그러니까.” 정신 멀쩡한 윙코가 말했다. “이쑤시개 상자에다가 사용설명서를 붙일 만큼 제정신을 잃어버린 문명이라면, 그런 문명 속에서 더 이상 우리가 맑은 정신을 유지할 수 없다는 생각이 들더군요.”

“그러니까 투표를 해서 도마뱀을 뽑았단 말이야?”
“오, 그럼.” 포드는 어깨를 으쓱하며 말했다. “당연하지.”
“하지만.” 아서는, 다시 큰 걸 하나 터뜨리기로 작정했다. “왜?”
“왜냐하면 도마뱀들한테 표를 던지지 않으면, 잘못된 도마뱀이 정권을 잡을까 봐 그렇지.” 포드가 말했다.

그들은 경이에 차서 하나님이 피조물에게 보내는 마지막 메시지를 바라보았고, 천천히 이루 말할 수 없는 평온한 느낌에 사로잡혔다. 궁극적으고 완전한 깨달음을 얻었던 것이다.
펜처치가 한숨을 쉬었다. “맞아요.” 그녀가 말했다. “저거였어요.”
그들은 족히 십 분 동안 글자를 물끄러미 바라보고 있다가, 그제야 두 사람의 어깨 사이에 대롱대롱 매달려 있는 마빈이 곤란을 겪고 있다는 사실을 깨달았다. 로봇은 이제 더 이상 고개를 들 수도 없었고, 아직 메시지를 읽지도 못했다. 그들은 마빈의 고개를 들어 올려주었지만, 그는 자신의 사각 회로가 거의 다 망가졌다도 투덜거렸다.
그들은 동전을 찾아서 그를 부축해 유료 망원경 앞으로 데리고 갔다. 마빈은 투덜거리면서 그들을 욕했지만, 그래도 그들은 마빈이 글자 하나 하나를 차례대로 볼 수 있도록 도와주었다. 첫 번째 글자는 ‘불’이었고, 두 번째 글자는 ‘편’이었고, ‘을’이 그 뒤를 이었다. 그리고는 한 칸이 떨어져 있었다. ‘끼’다음에는 ‘쳐’. 마빈은 잠시 쉬고 휴식을 취했다.
몇 분 후 그들은 다시 글자를 읽기 시작했고, 마빈이 ‘드’, ‘려’까지 볼 수 있게 해주었다. 다음 글자는 ‘서’였다. 마지막 단어가 길어서, 마빈은 그 단어에 도전하기까지 한 번은 더 쉬어야 했다.
그 단어는 ‘죄’로 시작했고 다음에는 ‘송’이었다. 그리고 ‘합’.
마지막으로 숨을 돌린 후, 마빈은 힘을 내어 마무리에 도전했다.
그는 ‘니’라는 글자와 마침내 ‘다’를 읽었고, 휘청거리며 아서와 펜처치의 품에 쓰러졌다.

“이 바다 밑바닥에 침몰한 배가 당신이 백 퍼센트 침몰 안 한다고 백 퍼센트 장담한다고 말했던 그 배가 맞다고 백 퍼센트 장담한단 말이죠?”

현재가 정말로 궁핍해지고 있다는 사실을 깨닫고 나서야, 그리고 그 이유가 저 이기적인 미래의 약탈꾼 녀석들이 똑같은 짓을 하고 있기 때문이라는 걸 깨닫고 나서야, 모든 사람들은 모든 아오리스트 막대 하나하나와 그걸 만드는 끔찍한 비법이 완전히, 영구히 폐기되어야 한다는 사실을 깨달았다. 그들은 이는 자신들의 할아버지와 손자들을 위한 것이라고 주장했지만, 이는 물론 자신의 할아버지의 손자들, 자기 손자들의 할아버지를 위한 것이었다.

사실 빛의 속도를 넘어설 수는 없다. 빛의 속도보다 더 빨리 여행하는 것은 없다. 나쁜 소식 정도라면 예외가 될 수 있을까. 나쁜 소식은 자신만의 특별한 법칙을 따르는 법이다.

“인생을 살면서 제가 한 가지 배운 게 있다면.” 트리시아가 말했다. “절대로 가방을 가지러 되돌아가지 말라는 거예요.”

조그마한 플라스틱 렌즈를 눈에 살살 집어넣으면서 그녀는 생각했다.
살아가면서 한 가지 배운 게 있다면, 가방을 가지러 되돌아가서는 안 되는 때가 있고 그래야 하는 때가 있다는 것이었다. 그 두 가지 경우를 구분하는 법은 아직 배우지 못했다.

그는 알지 못하는 사람들의 얼굴들을 지나쳐갔다. 그들은 자신과 같은 부류의 사람들이 아닌 것 같았다. 그들은 너무 말쑥하게 단장하고 있었다. 그들의 눈은 너무나 죽어 있었다. 저 멀리 자기가 아는 사람을 본 겉 같아서 인사를 하려고 달려가 보면, 항상 뭔가 다른 사람이었다. 자신이 아는 그 누구보다도 훨씬 더 단정한 헤어스타일에 위압적이고 결단력 있는 모습의 사람이었다.

“그건 하나의 미래죠.” 할이 말했다. “당신이 그걸 받아들이면, 그건 당신의 미래에요. 당신은 다차원적으로 사고하는 법을 배워야 해요. 이 순간으로부터 모든 방향으로 헤어릴 수 없이 많은 미래들이 뻗어나가고 있다고요. 또 지금 이 순간에서부터, 그리고 또 지금 이 순간에서부터. 수십억 개의 미래들이, 매 순간마다 두 갈래로 갈라지는 겁니다! 가능한 모든 전자들의 가능한 모든 위치가 급속히 증대하면서 수십억 개의 가능성으로 변하는 거죠! 수십억 개, 그리고 또 수십억 개의 반짝거리며 빛나는 미래들! 그게 무슨 뜻인지 아십니까?”

방의 왼쪽 편에서는 은하계 전역에서 현장 연구자들이 보내는 보고서들이 서브-에서-넷에 모아져서 곧바로 부편집자들의 사무실 네트워크로 입력되었고, 거기에서 괜찮은 부분은 몽땅 비서들에 의해 잘리게 된다. 왜냐하면 부편집자들은 점심식사를 하러 나가고 없기 때문이다. 그러고 나서 나머지 원고는 법무 팀이 있는 건물의 나머지 반쪽――에이치 모양 건물의 다른 한쪽 다리 말이다――으로 쏘아 보내진다. 법무 팀은 남은 원고 중에서 아직 조금이라도 괜찮은 부분을 잘라낸 뒤, 중역 편집자들의 사무실로 다시 날려 보내는데, 그들 역시 점심 먹으러 나가고 없다. 그래서 편집자들의 비서들이 그걸 읽어보고는 시시하다고 말한 뒤 대부분의 남은 원고를 잘라내 버린다.
편집자들 중 누군가는 마침내 점심식사를 마치고 비틀거리며 들어오면, 그들은 이렇게 소리 지른다. “X――X는 문제의 현장 연구자의 이름이다――가 젠장맞을 은하계 반대편에서 보내온 이 시시껄렁한 잡소리가 다 뭐하자는 거야? 이 매가리 없는 설사 같은 게 녀석이 보낼 수 있는 최고의 원고라면, 그 젠장맞을 가그라카카 마인드 존에서 공전 주기를 세 번이나 꽉 채워 보낼 필요가 뭐가 있어? 그렇게 사건들이 수도 없이 벌어지고 있는데도 말이야. 활동 경비를 없애버려”
“원고는 어떻게 할까요?” 비서가 묻는다.
“아, 네트워크 상에 발표해. 거기도 뭔가 있기는 해야 할 테니까. 난 머리가 아파서 집에 가야겠어.”
그래서 편집된 원고는 법무 팀을 돌며 마지막으로 난도질과 화형을 거치고 나서 다시 이곳으로 내려 보내지며, 여기서 원고는 은하게 어디에서건 즉시 검색할 수 있도록 서브-에서-넷을 통해 방송된다. 그 과정은 방의 오른쪽에 있는 터미널들에 의해 모니터되고 통제되는 장비에 의해 이루어진다.

그건 다른면에선 멀쩡하던 사람이 정치 고관만 되면 늘 생기는 일종의 정신 이상적 심리 차폐를 역으로 뒤집어 처리한 프로그래밍 기술이었다.

그는 은하계의 동쪽 경계로 향했다. 들리는 말에 의하면, 거기에서는 지혜와 진실을 찾을 수 있다고 했다. 특히 사제들과 선지자들과 점쟁이들, 그리고 배달 전문 피자집――신비주의자들은 거의 대부분 요리를 전혀 못하니까――의 행성인 하와리우스 행성이 바로 그런 곳이었다.

그녀는 아서에게 복사물을 건넸다.
“이게, 어, 이게 그러니까 당신의 충고입니까?” 아서가 자신 없이 복사물들을 뒤적이며 말했다.
“아냐.” 노파가 말했다. “이건 내가 살아온 이야기야. 알겠지만, 어떤 사람이 충고를 하던 간에, 그 충고의 질은 그 사람이 실제로 살아온 삶의 질에 견주어 판단해야 하는 거야. 이제 이 문서를 죽 훑어보면, 내가 중요한 결정들은 모두 잘 보이라고 밑줄을 쳐놓은 게 보일거야. 그것들은 다 색인이 되어 있고 앞뒤로 참조가 가능해. 알겠지? 내가 제안할 수 있는 건 다만, 내가 내린 결정과 정 반대의 결정을 내린다면, 아마도 인생의 말년을…….” 그녀는 잠시 말을 멈추더니 허파 가득 숨을 들이켜고는 냅다 소리를 질렀다. “이런 냄새 나는 낡은 동굴에서 보내진 않을 거야!”

거기서는 또한 굉장히 달고 끈적끈적한 다양한 초콜릿 케이크를 사서 수도자들 앞에서 먹을 수도 있다. 하지만 대체로 그것 때문에 대부분의 수도자들은 이제 사라져버리고 없다.

“내가 마흔 번의 봄, 여름, 가을을 장대 위에 앉아서 알아낸 것을 그런식으로 말해줄 거라고 생각하나?”
“겨울에는요?”
“겨울?”
“겨울에는 장대 위에 앉아 있지 않나요?”
“내 인생 대부분의 시간을 장대에 앉아 보낸다고 해서 내가 바보인 건 아니지. 겨울에는 남쪽으로 간다네. 바닷가에 별장을 가지고 있거든. 굴뚝에 앉아 있지.”
“여행자들에게 해줄 충고라도 있나요?”
“응, 바닷가에 별장을 가지게.”
“알겠어요.”

“바닷가 별정이라고 해서 꼭 바닷가에 있어야 할 필요도 없어. 물론 최고로 좋은 것들은 그렇지만. 우리는 모두 모이고 싶어 하거든.” 그가 말을 이었다. “경계 상황에 말이야.”
“그래요?” 아서가 말했다.
“땅과 물이 만나는 곳. 흙과 공기가 만나는 곳. 육체와 정신이 만나는 곳. 공간과 시간이 만나는 곳. 우린 한 쪽에서 다른 한쪽을 보는 걸 좋아하지.”

“자넨 자네가 보는 걸 보기 때문에 내가 보는 것을 볼 수 없어. 자넨 자네가 아는 것을 알기 때문에 내가 아는 것을 알 수 없어. 내가 보고 내가 아는 것은 자네가 보고 자네가 아는 것에 보태질 수가 없어. 왜냐하면 같은 게 아니니까. 그건 자네가 보고 자네가 아는 것을 대신할 수도 없어. 왜냐하면 그건 자네 자신을 대신하는 게 될 테니까.”

“아, 맞아.” 노인이 말했다. “여기 자네를 위한 기도가 있네. 연필 있나?”
“네.” 아서가 말했다.
“이런 거야. 이제 보자고. ‘제가 알 필요가 없는 것들로부터 저를 보호하소서. 제가 알아야 할 모르는 일들이 있다는 사실조차 알지 못하도록 저를 보호하소서. 제가 알지 않기로 결심한 것들에 대해 알지 않기로 결심했다는 것을 모르도록 저를 보호하소서. 아멘.’ 이거야. 어쨌거나 이건 자네가 속으로 조용히 기도하는 바 아닌가. 그러니 내놓고 기도하는 게 더 좋을 거야.”
“음, 저, 고맙습니다.” 아서가 말했다.
“그것과 짝을 이루는 굉장히 중요한 기도가 하나 더 있어. 그러니까 이것도 적는 게 좋을 거야.” 노인이 계속해서 말했다.
“좋아요.”
“이거야. ‘주여, 주여, 주여…….’ 만약의 경우를 대비해 이 부분을 넣는 게 좋아. 이왕이면 확실하게 하는 게 좋잖아. ‘주여, 주여, 주여. 위의 기도의 결과로부터 저를 보호하소서. 아멘.’ 이거야. 사람들이 살면서 겪는 대부분의 문제는 이 마지막 부분을 빼먹어서 생기지.”

자연스러움. 그건 교묘한 말이었다.
그가 자연스럽다고 생각했던 많은 것들, 예컨대 크리스마스에 선물을 산다거나 빨간 불에 멈춰 선다거나 초당 삼십이 피트의 속도로 떨어진다거나 하는 일들이 그저 자기 세계의 습관에 불과했으며 다른 곳에서도 반드시 같은 방식으로 작동하지는 않는다는 것을 그는 오래 전에 깨달았다. 하지만 바라지 않는다는 것――그건 정말로 자연스러울 수가 없었다. 그렇지 않은가? 그건 숨을 안 쉬는 것과 마찬가지였다.

그 모든 것은 창립 멤버 중 몇 명이 정착을 하고 욕심을 내기 시작하면서 생겼다. 그러는 동안 그와 다른 사람들은 계속 현장에 있으면서 조사를 하고 히치하이크를 하면서 악몽의 법인으로 냉혹하게 변해버린 <안내서>와 그것이 차지하게 된 괴물 같은 건축물에게서 점점 더 소외돼갔다. 그 안 어디에 꿈들이 있었나? 그는 건물의 반을 차지하고 있는 회사 변호사들, 지하층을 차지하고 있는 ‘직공들’, 모든 부편집자들과 그들의 비서들, 그 비서들의 변호사들과 그 비서들의 비서들, 변호사들의 비서들, 그 중 최악으로, 회계사들과 마케팅 부서들을 생각했다.

한 행성에서만 십오 년씩이나 조사를 해서 기사를 보냈는데, 녀석들은 단 두 마디로 줄여버렸지. “대체로 무해함.”

다른 히치하이커들은 타월을 색다른 방식으로 변형시키는 게 적당하다고 생각해서, 온갖 종류의 비밀 도구들과 설비들, 심지어 컴퓨터 장치들까지 직물 안에 짜 넣었다.

그 빌딩은 프로그스타 공격 이후 완전히 새로 지어지면서 단단하게 강화되었고, 아마도 그 업계에서 가장 중무장한 출판사였을 것이다. 하지만 그가 생각하기에 법인 위원회에서 디자인한 모든 시스템에는 항상 뭔가 약점이 있었다. 창문을 디자인한 기술자들은 그 창문들이 건물 안에서 짧은 사정거리에서 날아오는 로켓에 맞는다는 것은 예상하지 않았고, 그래서 창문이 깨졌던 것이다.

“전화 끊어, 새끼야! 네가 무슨 번호를 원하든, 어느 내선에서 전화를 걸든 내 알 바 아니야. 가서 불꽃놀이나 네 엉덩이에 쑤셔 박으라고! 이이이야아아! 우 우 우! 꽥꽥!”

물론, 칼들 중에서도 지존은 고기를 써는 칼이었다. 이는 빵 써는 칼처럼 칼질을 하는 대상을 뚫고 지나가면서 의지를 행사할 뿐만 아니라, 나아가 대상과 협력해야만 했다. 힘을 합쳐 고기의 결을 따라가며, 고깃덩어리에서 얄팍하게 접히며 썰려나가는, 최고로 훌륭한 질감과 투명감을 지닌 고기 조각을 만들어내야만 하는 것이었다.

트릴리언은 아서를 한참 동안 바라보더니, 어조를 싹 바꾸어 이렇게 말했다. “너도 이젠 책임을 좀 져야 할 때가 됐어, 아서.”

그는 여자아이에게로 걸어가서 안아주었다.
“나는 너를 사랑하지 않는단다.” 그가 말했다. “미안하구나. 아직 널 알지도 못하는걸. 하지만 몇 분만 시간을 주겠니.”

그는 하늘을 바라보았다. 찌무룩하고 불안한 납빛 하늘은 묵시록에 나오는 4인의 기사들이 말을 타고 달려 나와도 정신 나간 멍청이들처럼 보이지 않을 만한, 그런 하늘이었다.

“비입니다.” 새가 말했다. “아시겠어요? 그냥 비지요.”
“비가 뭔지는 나도 알아요.”
비가 겹겹이 겹쳐진 장막처럼 밤공기를 가르며 세차게 떨어지고 있었고, 그 사이로 달빛이 비쳐 들어오고 있었다.
“그럼 비가 뭡니까?”

“어떻게, 어, 어떻게 이 훌륭한 물건들의 값을 치르시는지요?”
지도자가 다시 킬킬거리고 웃었다.
“아메리칸 익스프레스를 씁니다.” 그는 아무렇지도 않은 일이라는 듯 어깨를 으쓱해 보였다.
트리시아는 다시 느릿느릿 고개를 끄덕였다. 그 회사는 특히 ‘아무나’한테 카드를 발급한다는 사실을 잘 알고 있었다.

“가끔 이럴 때는, 사실 공간-시간의 결이라든가 다차원적 개연성의 도상의 심상한 완전성이라든가 온갖 종류의 총체적 혼란에 발발한 파동 형태의 잠재적인 붕괴 가능성이라든가 내 머릿속을 괴롭히던 온갖 문제들이 그렇게 걱정할 가치가 있는 건가 하는 생각이 든단 말이야. 아마 저 덩치 큰 남자가 한 말이 옳다는 기분이 들어서 그런가봐. 그냥 될 대로 되라 마음을 놓으라고 하더군. 뭐가 그렇게 중요하겠느냐고? 될 대로 되라 하는 거지.”


<그리고 한가지 더> - 책갈피


“감정이라고? 너는 어떻게 머리도 하나밖에 없는 주제에 그렇게 멍청할 수가 있냐?”
“나는 멍청한 게 좋아. 너는 상황을 명료하게 보잖아. 멍청하다는 건 햇살을 통해서 곁눈질로 흘겨보는 거랑 비슷하니까.”
포드의 말 한마디 한마디가, 젖은 수건으로 때리는 것처럼 왼쪽 두뇌의 구체를 흔들어 놓았다. “햇살? 대체 무슨 헛소리야? 멍청하다는 건 무지와 암흑이야.”

“한동안 소아시아를 돌아다니면서 약간의 공포를 불어넣으려고 해봤는데, 이제 사람들은 페니실린을 갖고 있고, 심지어 가난한 사람들도 읽을거리를 가지고 있더란 말이요. 그러니 신들을 어디다 쓰겠소?”

홍차 생각만 해도 기분이 좀 좋아졌다. 홍차가 없으면 아일랜드 사람은 사족을 못 쓰는 법이다.

“사전적 의미로 사랑이 무슨 뜻인지는 말해줄 수 있지요. 동의어도 다 말해줄 수 있고요. 그리고 엔도르핀과 시냅스와 근육의 기억 같은 얘기도 해 드릴 수 있어요. 하지만 심장에서 울리는 열정의 메아리는 내게도 미스터리랍니다. 나는 컴퓨터에요, 아서.”

과거에 대한 그 문장 기억나? 그건 벌써 과거에 있잖아. 그 문장이 ‘과거’라는 단어를 포함하고 있었다는 거 말고는, 거의 기억도 안 나네. 과거는 기억들로 이루어지고, 기억은 이미 죽은 것들이라 상처를 줄 수가 없다고. 뭐랄까 뾰족한 막대기 구름 같은 것처럼 말이야.

“사람들은 편안함을 돈 주고 산단다.” 그녀는 옥수수 베는 낫으로 돼지 멱을 따면서 이렇게 말했다. “ 사람들을 편안하게 해주면, 네가 파는 건 뭐든지 살 거야.”
지혜와 동맥에서 뿜는 피의 조합은 불가항력적이었고, 힐먼은 할머니의 가르침을 절대 잊지 않았다.

옛날 것보다 훨씬 낫고 고장 나면 알아서 제조사에 연락을 취하는 인공 바이오 하이브리드 골반의 도움을 받아 넓은 영지를 걸어 다니곤 했다.
힐먼이 너무 흥분하는 바람에 왼쪽 골반이 일본에 전화를 넣을 지경이었다.

“여기 속아 넘어가는 사람은 아무도 없을걸요”라고 관광위원회에서 코웃음을 쳤다. “몹시 개연성이 없어요.” 이 말은 당연히 전체 사업이 엄청난 성공을 거둘 것임을 보장한 거나 마찬가지였다.

“창문도 필요하다고요?” 눈썹이 올라가다 못해 아예 날아갈 정도로 놀라더니, 십장이 물었다. “그런 건 육 개월 전에 미리 말씀해 주셨어야죠. 미리 알기만 했으면 우리 애들이 설치했을 거 아닙니까. 지금 창문을 설치하려고 하면, 벌써 현장에 와 있는 배관공들 일을 좀 보류해야 해요. 그러면 배관공들 다음에 일하는 도색업자들이 싫어할 거고요. 게다가 도색업자 중에는 배관공하고 결혼한 친구들이 있어서, 가정불화가 일어날 겁니다. 그리고 일하는 동안 현장에서 마사지해주는 인력이 부족해서, 현재 우리 애들 어깨에 극심한 젖산 축적이 일어나고 있단 말이에요. 어쨌든, 뭐 선생님이 물주니까 돈은 마음대로 쓰세요. 제 말은 아무렇게나 이것저것 요구해서 프로젝트 전체를 경제적 자유낙하 상태로 만들 게 아니라, 좀 편할 때 미리미리 말했으면 좋았지 않았겠느냐 이거죠.”

“하지만 이건 빵이잖아.”
“그래서?”
“오후 세 시 이후에 탄수화물? 너 미쳤냐?”
“그냥 빵 껍데이 하나만 먹을게. 그게 다야.”
티드필은 개인 트레이너와 미용 관리사들이 다 볼 수 있게 빵을 높이 치켜들었다. “빵 껍데기 하나래. 그게 다란다. 이 빵 껍데기 하나에 설탕 몇 숟가랑이 들었는지 알아? 누구 아느냐고?”
“두 숟가락.” 펙스가 용기를 내어 보았다.
“일곱이야!” 티드필이 빽 소리를 질렀다. “일곱. 세 시 이후에 이걸 먹느니 엉덩이에 차라리 설탕 펌프를 꽂아 넣는 게 낫다고.”

우리는 단 하루를 함께 보냈는데, 그 하루가 내 인생에서 가장 중요한 날이었어.

“당신도 썩 괜찮은 친구요, 비블브락스 씨. 우리가 원하는 건 뭐든, 그 멋진 우주선으로 가져다주니까. 가끔은 당신이 아예 안 오면, 우리도 필요한 게 아예 없을 거 같기도 하다니까.”

“당신이 해피엔딩이라고 생각하는 것은 죽었다고 생각했던 연쇄살인범이 되돌아와 가슴이 제일 큰 여자애만 빼고 다 죽이기 전에 잠시 갖는 짧은 휴지기에 불과하다. 게다가 그 여자애는 다음 해에 나오는 속편에서 제일 먼저 죽는다.”

“엔딩이라는 건 없다. 그렇게 따지면 시작도 없다. 모든 건 중간이다.”

교과서적인 인간 > 지독한 개자식


은하수를 여행하는 히치하이커를 위한 안내서에 나온 영어 속어와 농담

Closed book : 닫힌 책 (알 수 없는 일)
bee’s knees : 대단히 훌륭하다는 뜻의 속어
now what : 자, 이제 뭘 하지?
oh, well : ‘오, 이거 원’정도의 의미로 실망 낭패의 감정을 전달한다.
out of thin air : 희박한 대기 속에서 ‘느닷 없이’를 뜻하는 관용어.
lose one’s mind : 정신을 잃다. ‘미치다, 돌아버리다.’를 뜻하는 관용표현.
Silver-Tongued : 입담이 매끄러워 설득력이 있다.
STD(Sexually Transmitted Disease) : 성행위로 감염되는 질병
crap out :똥을 싸다. 혼비백산하다.
stiff upper lip : 사립학교 출신의 영국 지식인층은 발음할 때 윗입술을 잘 움직이지 않는다고 해서 그들을 ‘빳빳한 윗입술’이라고 부르기도 한다.
je ne sais quoi : 쥐느세쿠아. 프랑스어로 ‘나도 뭔지 몰라’라는 뜻. 표현할 수 없는 무엇인가를 뜻한다.
paddy : 패디. 패트릭의 애칭으로 영국 영어에서 아일랜드인을 폄하해 부르는 말이다.
begorrah : 베고라! 아일랜드 특유의 감탄사 신으로 부터(by God)의 완곡한 표현. 예) 날씨 참 좋네, 베고라!
보드라운 날씨를 하나님께 감사. 아일랜드식 표현
froody : 프루디는 grand; wonderful; cool과 동의어이다. 멋지다. 히치하이커 위키피디아(http://hitchhikers.wikia.com/wiki/Froody) 에는 The quality of being a frood.라고 나와있다.
Oh really, O’Reilly? : 오리얼리, 오라일리? ‘오, 그러셔, 이 친구야?’ 정도의 뜻으로 비꼬는 의미가 담겨 있는 말.
jumentous : ‘말 오줌 냄새가 나는’이라는 뜻의 형용사. 사전을 찾아보니 jument는 불어이고, 영어로는 mare(암말)을 뜻한다.
Go screw yourself : ‘엿 먹어’ 정도에 상응하는 욕. go f*ck yourself을 완화한 표현. f*ck you!의 다른 표현이다.
fruity pants: 영국 영어에서 여자 같은 동성애자를 폄하하는 말이다.



by


Tags : , , , , , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

아마존 AWS Elastic Beanstalk에 Python Flask 배포환경 구축을 위한 설정

아마존 Elastic Beanstalk은 애플리케이션을 올리기만 하면 Elastic Beanstalk이 용량 프로비저닝, 로드 밸런싱, 자동 조정,
애플리케이션 상태 모니터링에 대한 배포 정보를 자동으로 처리한다.
개발자는 개발에만 신경 쓰면 인프라는 아마존에서 다 해주겠다는 말이다.
이 얼마나 반가운 소리인가?
그러나 막상 Elastic Beanstalk를 쓰려면 손수 설정해야 하는 부분이 많다.
이 글에서는 static 파일을 아마존 CDN인 CloudFront를 통해 제공한다는 가정하에 크게 세 부분으로 나누어 설명하겠다.
첫째는 아마존 콘솔 단에서 IAM,S3,CloudFront설정이고,
둘째는 Elastic Beanstalk .ebextensions 설정.
마지막은 Python boto를 이용한 배포 스크립트다.
게으른 개발자로서 좀 편해 보고자 아마존 AWS Elastic Beanstalk을 쓰면서 환경 설정 때문에 애를 많이 먹었다.
AWS Elastic Beanstalk을 고려 중인 또 다른 개발자가 이 글을 읽고 같은 삽질을 않으면 좋겠다.

AWS 콘솔 설정

IAM 설정

배포 권한을 가진 Group를 만든다.
예제에서 그룹명은 Dorajistyle-deploy로 하겠다.
User인 dorajistyle은 Dorajistyle-deploy 그룹에 소속되어, 배포시에 dorajistyle유저 정보로 배포하게 된다.
Dorajistyle-deploy그룹은 아래의 policy를 가진다.
{
  "Version": "2012-10-17",
  "Statement": [
     {
      "Effect": "Allow",
      "Action": [
        "elasticbeanstalk:*",
        "ec2:*",
        "elasticloadbalancing:*",
        "autoscaling:*",
        "cloudwatch:*",
        "s3:*",
        "sns:*",
        "cloudformation:*",
        "rds:*",
        "iam:AddRoleToInstanceProfile",
        "iam:CreateInstanceProfile",
        "iam:CreateRole",
        "iam:PassRole",
        "iam:ListInstanceProfiles"
      ],
      "Resource": "*"
    },
    {
      "Sid": "QueueAccess",
      "Action": [
        "sqs:ChangeMessageVisibility",
        "sqs:DeleteMessage",
        "sqs:ReceiveMessage"
      ],
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Sid": "MetricsAccess",
      "Action": [
        "cloudwatch:PutMetricData"
      ],
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Sid": "Stmt110100200000",
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::dorajistyle/*",
        "arn:aws:s3:::dorajistyle",
        "arn:aws:s3:::dorajistyle-static/*",
        "arn:aws:s3:::dorajistyle-static",
        "arn:aws:s3:::dorajistyle-deploy/*",
        "arn:aws:s3:::dorajistyle-deploy",
        "arn:aws:s3:::elasticbeanstalk-ap-northeast-1-000000000000",
        "arn:aws:s3:::elasticbeanstalk-ap-northeast-1-000000000000/*"
      ]
    },
    {
      "Sid": "Stmt130000013000",
      "Effect": "Allow",
      "Action": [
        "rds:*"
      ],
      "Resource": [
        "arn:aws:rds:ap-northeast-1:000000000000:db:dorajistyle"
      ]
    },
{
      "Sid": "Stmt1399636332000",
      "Effect": "Allow",
      "Action": [
        "elasticbeanstalk:*"
      ],
      "Resource": ["*","arn:aws:elasticbeanstalk:ap-northeast-1:000000000000:application/dorajistyle",
"arn:aws:elasticbeanstalk:ap-northeast-1:000000000000:environment/dorajistyle/dorajistyle"
,"arn:aws:elasticbeanstalk:ap-northeast-1:000000000000:applicationversion/dorajistyle/*"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "cloudformation:DescribeStacks",
        "cloudformation:DescribeStackEvents",
        "cloudformation:DescribeStackResources",
        "cloudformation:GetTemplate",
        "cloudformation:List*"
      ],
      "Resource": "*"
    }


S3 설정

S3버켓은 총 3개가 필요하다.

dorajistyle-deploy
배포용 zip파일을 업로드할 버켓이다. 사용자 dorajistyle만 접근 가능하며, 버켓 설정은 기본 그대로 사용하면 된다.

CORS Configuration
<CORSConfiguration>
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>


dorajistyle-static
static 파일을 저장할 버켓이다. 누구나 읽을 수 있는 버켓이다.

Bucket policy
{
 "Version": "2008-10-17",
 "Id": "Policy1394587645145",
 "Statement": [
  {
   "Sid": "Stmt1394587643817",
   "Effect": "Allow",
   "Principal": {
    "AWS": "*"
   },
   "Action": "s3:GetObject",
   "Resource": "arn:aws:s3:::dorajistyle-static/*"
  }
 ]
}


CORS Configuration
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://*.dorajistyle.pe.kr</AllowedOrigin>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    <CORSRule>
        <AllowedOrigin>http://*.www.dorajistyle.pe.kr</AllowedOrigin>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    <CORSRule>
        <AllowedOrigin>http://dorajistyle.elasticbeanstalk.com</AllowedOrigin>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedHeader>Authorization</AllowedHeader>
        <AllowedHeader>x-requested-with</AllowedHeader>
        <AllowedHeader>origin</AllowedHeader>
    </CORSRule>
</CORSConfiguration>


dorajistyle
이미지등의 유저 컨텐츠를 저장할 버켓이다.
예제에서는 모든 유저가 읽을 수 있도록 설정되었는데, 이는 사용 용도에 따라 변경이 가능하다.

Bucket Policy
{
 "Version": "2008-10-17",
 "Id": "Policy1394587559249",
 "Statement": [
  {
   "Sid": "Stmt1394587510887",
   "Effect": "Allow",
   "Principal": {
    "AWS": "*"
   },
   "Action": "s3:GetObject",
   "Resource": "arn:aws:s3:::dorajistyle/*"
  }
 ]
}


CORS Configuration
<CORSConfiguration>
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>


CloudFront 설정

dorajsityle-static S3에 CloudFront를 연결한다.
Origin Domain Name에 S3 버켓 주소를 적으면 된다.
만약 CloudFront에 연결이 잘 되었는데도 리소스를 찾지 못한다면 Invalidations에서 해당 리소스를 무효화한다.

.ebextensions 설정

Elastic Beanstalk에 어플리케이션을 올리면 마법처럼 돌아간다고는 하지만,
각 어플리케이션마다 필요한 라이브러리를 모두 설치해 둘 순 없다.
그래서 .ebextensions 설정을 통해 각 어플리케이션에 맞는 라이브러리 설치와, 서버 설정 변경등이 가능하다.
.ebextensions에 대한 설명은 아마존의 컨테이너 맞춤 설정 안내(http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html)를 참조하면 된다.
이 글에서는 yum 패키지 업데이트와 라이브러리 설치, 배포 hook 설정 변경과 아파치 서버 변경을 다룬다.

01_yum_update.config

yum 패키지를 업데이트 한다.
commands:
  yum_updates: 
    command: "yum --security update -y"


02_package_update.config

필요한 yum 패키지를 설치한다.
packages키를 이용해도 되지만, 충돌이 일어날 경우 command키를 이용한 설치도 한 방법이다.
commands:
  yum_package_updates: 
    command: "yum install python-devel python-pip libtiff-devel libjpeg-turbo-devel libzip-devel freetype-devel lcms2-devel tcl-devel php -y --skip-broken"


03_pre_requirements.config

Elastic Beanstalk에 파이썬 어플리케이션을 업로드 하면,
requirements.txt파일을 찾아 필요한 파이썬 라이브러리를 자동으로 설치해 준다.
그런데 간혹 한번에 설치가 안되어 나누어 설치해야 하는 라이브러리가 있다.
몇몇 라이브러리를 설치할때 pip에서 발생하는 문제로 미리 설치할 라이브러리를 pre_requirements.txt에 넣어두고 먼저 설치하면 문제없이 설치된다.
다만 pre_requirements.txt 파일을 먼저 설치하려면 배포 hook코드를 변경해야 한다.
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/03deploy.py":
    mode: "000755"
    owner: root
    group: users
    content: |
      #!/usr/bin/env python
      import os
      from subprocess import call, check_call
      import sys
      sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
      import config


      def install_virtualenv():
          # If python 2.7 is installed, make the virtualenv use it. Else use the default system 2.6
          if config.get_python_version() == '2.7':
              cmd = 'virtualenv -p /usr/bin/python27 {0}'
          else:
              cmd = 'virtualenv {0}'

          return_code = call(cmd.format(config.APP_VIRTUAL_ENV), shell=True)

          if return_code != 0:
              print "WARN: error running '%s'" % cmd


      def install_dependencies():
          pre_requirements_file = os.path.join(config.ON_DECK_DIR, 'app', 'pre_requirements.txt')
          requirements_file = os.path.join(config.ON_DECK_DIR, 'app', 'requirements.txt')
          if os.path.exists(pre_requirements_file):
              check_call('%s install --use-mirrors -r %s' % (os.path.join(config.APP_VIRTUAL_ENV, 'bin', 'pip'), pre_requirements_file), shell=True)
          if os.path.exists(requirements_file):
              # Note, we're sharing the virtualenv across multiple deploys, which implies
              # this is an additive operation. This is normally not a problem and is done
              # to minimize deployment time (the requirements are not likely to drastically
              # change between deploys).
              check_call('%s install --use-mirrors -r %s' % (os.path.join(config.APP_VIRTUAL_ENV, 'bin', 'pip'), requirements_file), shell=True)


      def main():
          try:
              install_virtualenv()
              install_dependencies()
          except Exception, e:
              config.emit_error_event(config.USER_ERROR_MESSAGES['badrequirements'])
              config.diagnostic("Error installing dependencies: %s" % str(e))
              sys.exit(1)

      if __name__ == '__main__':
          config.configure_stdout_logger()
          main()


04_wsgi.config

아파치 서버 설정 파일을 입맛에 맞게 변경한다. wsgi.conf 파일을 .ebextensions 폴더에 넣어두고,
wsgi.config 훅에 아래 코드를 넣으면 서버로 설정을 복사한다.
container_commands:
  replace_wsgi_config:
    command: "cp .ebextensions/wsgi.conf /opt/python/ondeck/wsgi.conf"


wsgi.conf

캐쉬와 gzip압축등 설정을 담았다.
# LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonHome /opt/python/run/baselinenv
WSGISocketPrefix run/wsgi
WSGIRestrictEmbedded On

<VirtualHost *:80>
###############
# TYPES FIX #
###############
AddType text/css .css
AddType text/javascript .js

############################
# IE 11 Prevent Cache      #
############################
BrowserMatch "MSIE 11.0;" IE11FOUND
BrowserMatch "Trident/7.0;" IE11FOUND
# FileETag None
Header unset ETag env=IE11FOUND
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"  env=IE11FOUND
Header set Pragma "no-cache" env=IE11FOUND
Header set Expires "Thu, 24 Feb 1983 02:50:00 GMT" env=IE11FOUND

####################################
# Serve Pre-Compressed statics #
####################################
RewriteEngine On
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.(html|css|js|json|woff) $1\.$2\.gz [QSA]

# Prevent double gzip and give the correct mime-type
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1,E=FORCE_GZIP]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1,E=FORCE_GZIP]
RewriteRule \.html\.gz$ - [T=text/html,E=no-gzip:1,E=FORCE_GZIP]
RewriteRule \.json\.gz$ - [T=application/json,E=no-gzip:1,E=FORCE_GZIP]
RewriteRule \.woff\.gz$ - [T=application/x-font-woff,E=no-gzip:1,E=FORCE_GZIP]

Header set Content-Encoding gzip env=FORCE_GZIP

#######################
# GZIP COMPRESSION #
######################
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml text/javascript application/x-javascript application/x-httpd-php
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
Header append Vary User-Agent env=!dont-vary

################################
# Leverage browser caching #
###############################
<FilesMatch ".(ico|pdf|jpg|jpeg|png|gif|html|htm|xml|txt|xsl)$">
Header set Cache-Control "max-age=31536050"
</FilesMatch>

############################
# CDN Rewrite Setting   #
############################
# Header set Access-Control-Allow-Origin: "*"
# UseCanonicalName On
# Don't redirect if the static hostname(s) loops back.
# RewriteCond %{HTTP_HOST} !^static\.
# Include only those static file extensions that we want to off-load.
# RewriteCond %{REQUEST_FILENAME} ^/.*\.(html|xml|txt|zip|gz|tgz|swf|mov|wmv|wav|mp3|pdf|svg|otf|eot|ttf|woff|jpg|jpeg|png|gif|ico|css|js|json)$
# RewriteRule /static/(.*)? http://static.dorajistyle.pe.kr/$1 [redirect=permanent,last]

#########################
# WSGI configuration #
#########################

WSGIScriptAlias / /opt/python/current/app/application.py

<Directory /opt/python/current/app/>
# Order allow,deny
# Allow from all
Require all granted
</Directory>

WSGIDaemonProcess wsgi processes=1 threads=15 display-name=%{GROUP} \
python-path=/opt/python/current/app:/opt/python/run/venv/lib/python2.7/site-packages user=wsgi group=wsgi \
home=/opt/python/current/app
WSGIProcessGroup wsgi
# WSGIScriptReloading On
</VirtualHost>


배포 스크립트.


deploy.sh

static폴더를 최적화하고, DB스키마가 변경되었을 경우 업데이트 하며, 필요한 파일만 압축하여 aws에 올린다.
optimize_static.sh와 upload_to_aws.py이 중요하다.
#!/bin/bash
STARTTIME=$(date +%s)
./optimize_static.sh
rm *.zip
prefix=$(sed -n '/^PREFIX/ s/.*\= *//p' ./application/config/guid.py | tr -d \')
guid=$(sed -n '/^GUID/ s/.*\= *//p' ./application/config/guid.py | tr -d \')
name="$prefix-$guid"
zip -r $name * ./.ebextensions/* -x ./.git\* ./.idea\* ./docs\* ./node_modules\* ./alembic\* ./tests\* ./images\* *.zip  *.DS_Store  ./application/frontend/static/\*
zip_file=$name'.zip'
echo "$zip_file"
echo -e "Do you want to upgrade alembic schema? (Yes/No) : \c"
read ANSWER
if [ "$ANSWER" == "Yes" ]
then
    alembic revision --autogenerate -m "Alembic initilized boilerplate tables."
fi
echo -e "Do you want to update schema? (Yes/No) : \c"
read ANSWER
if [ "$ANSWER" == "Yes" ]
then
    alembic upgrade head
fi
echo -e "Did you reviewed source and confirmed running status? (Yes/No) : \c"
read ANSWER
if [ "$ANSWER" == "Yes" ]
then
    python2 upload_to_aws.py $name
else
    echo "Checking status and trying to deploy again."
fi
ENDTIME=$(date +%s)
echo "$name"
echo "It takes $(($ENDTIME - $STARTTIME)) seconds to complete this task..."


optimize_static.sh

guid를 생성하고 총 4개까지 히스토리를 남긴다. 혹시 배포가 잘못되어 롤백을 하게될 경우 이전 4버전까지 롤백이 가능하도록 한다.
테스트 서버에 먼저 배포하여 테스트 하고 문제가 없으면 실 서버에 배포를 하기 때문에 실 서버에서 4버전이나 롤백할 가능성은 상당히 희박하다.
static 파일은 require optimizer를 사용해 하나의 js와 하나의 css파일로 합치고, sed를 이용해 디버깅을 위해 사용하던 로그 코드와 공백을 날려 용량을 줄인다.
그리고 각 파일을 gzip으로 압축하여 용량을 다시 한번 줄인다.
#!/bin/bash
guid=$(uuidgen | tr -d '\n-' | tr '[:upper:]' '[:lower:]')
guid=${guid:0:8}
today=$(date '+%Y%m%d')
guid=$today'-'$guid
echo "$guid"
extremely_very_old_guid=$(sed -n '/^VERY_OLD_GUID/ s/.*\= *//p' ./application/config/guid.py)
sed -i "s/^EXTREMELY_VERY_OLD_GUID = .*/EXTREMELY_VERY_OLD_GUID = $extremely_very_old_guid/" ./application/config/guid.py
very_old_guid=$(sed -n '/^OLD_GUID/ s/.*\= *//p' ./application/config/guid.py)
sed -i "s/^VERY_OLD_GUID = .*/VERY_OLD_GUID = $very_old_guid/" ./application/config/guid.py
old_guid=$(sed -n '/^GUID/ s/.*\= *//p' ./application/config/guid.py)
sed -i "s/^OLD_GUID = .*/OLD_GUID = $old_guid/" ./application/config/guid.py
sed -i "s/^GUID = .*/GUID = '$guid'/" ./application/config/guid.py
cd './application/frontend/compiler/'
grunt static
grunt --gruntfile Gruntfile_uncss.js
cd '../../..'
cd './optimizer'
node ./r.js -o build.js
cd "../"
sed -i -r "s/(\ ?|\ +),(\ ?|\ +)[a-zA-Z]\.log(Error|Json|Object|Trace|Debug|Info|Warn)(\ ?|\ +)\([^)]*\)(\ ?|\ +),(\ ?|\ +)/,/g" ./application/frontend/static-build/js/app.js
sed -i -r "s/(\ ?|\ +),(\ ?|\ +)[a-zA-Z]\.log(Error|Json|Object|Trace|Debug|Info|Warn)(\ ?|\ +)\([^)]*\)(\ ?|\ +),?(\ ?|\ +);/;/g" ./application/frontend/static-build/js/app.js
sed -i -r "s/(\ ?|\ +),?(\ ?|\ +)[a-zA-Z]\.log(Error|Json|Object|race|Debug|Info|Warn)(\ ?|\ +)\([^)]*\)(\ ?|\ +),?(\ ?|\ +);//g" ./application/frontend/static-build/js/app.js
sed -i -r "s/(\ ?|\ +),?(\ ?|\ +)[a-zA-Z]\.log(Error|Json|Object|race|Debug|Info|Warn)(\ ?|\ +)\([^)]*\)(\ ?|\ +),?(\ ?|\ +);?/\n/g" ./application/frontend/static-build/js/app.js

cd './application/frontend/static-build/locales'
find . -name '*.json' -exec sed -i '/^\s∗\/\//d' {} \;
find . -name '*.json' -exec sed -i 's/^[ \t]*//g; s/[ \t]*$//g;' {} \;
find . -name '*.json' -exec sed -i ':a;N;$!ba;s/\n/ /g' {} \;
find . -name '*.json' -exec sed -i 's/\"\s*:\s*\"/\":\"/g' {} \;
find . -name '*.json' -exec sed -i 's/\"\s*,\s*\"/\",\"/g' {} \;
find . -name '*.json' -exec sed -i 's/\s*{\s*/{/g' {} \;
find . -name '*.json' -exec sed -i 's/\s*}\s*/}/g' {} \;
cd '../..'
gzip -r --best ./static-build
rename .gz '' `find static-build -name '*.gz'`


upload_to_aws.py

보토를 이용해 Elastic Beanstalk을 업데이트 한다. 배포가 끝나면 guid를 검사하여 오래된 버전 소스를 삭제한다.
static파일 업로드에서 눈여겨 볼 점은 key에 Content_Encoding 메타 데이터를 gzip으로 해 주어야 하는 것이다.
이는 위의 optimize static에서 이미 gzip으로 압축했기 때문이다.

# coding=UTF-8
"""
    application.util.__init__
    ~~~~~~~~~~~~~~~~~~~~~~~~~~
    by dorajistyle

    __init__ module

"""
from Queue import Queue
import logging
import os
import string
import boto
from boto.beanstalk import connect_to_region
import sys
# import time
from application.config.aws import AWS_STATIC_S3_BUCKET_NAME, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
    AWS_ELASTIC_BEANSTALK_REGION, AWS_ELASTIC_BEANSTALK_APP_NAME, AWS_ELASTIC_BEANSTALK_ENVIRONMENT_ID, \
    AWS_ELASTIC_BEANSTALK_ENVIRONMENT_NAME, AWS_ELASTIC_BEANSTALK_S3_BUCKET_NAME
from application.config.guid import OLD_GUID, VERY_OLD_GUID, PREFIX_GUID, EXTREMELY_VERY_OLD_GUID
from application.properties import STATIC_GUID
from threading import Thread
logging.basicConfig()
logger = logging.getLogger()


def log_exception(text):
    logger.error(msg=text)

q = Queue()
# source directory
sourceDir = 'application/frontend/static-build/'
# destination directory name (on s3)
destDir = STATIC_GUID+'/'

conn = boto.connect_s3(AWS_ACCESS_KEY_ID,
                       AWS_SECRET_ACCESS_KEY)
bucket = conn.get_bucket(AWS_STATIC_S3_BUCKET_NAME)
eb_bucket = conn.get_bucket(AWS_ELASTIC_BEANSTALK_S3_BUCKET_NAME)
keys = list()
old_keys = list()
eb_keys = list()
for key in bucket.list():
    keys.append(key.name)
for key in eb_bucket.list():
    eb_keys.append(key.name)
eb = connect_to_region(AWS_ELASTIC_BEANSTALK_REGION,
                       aws_access_key_id=AWS_ACCESS_KEY_ID,
                       aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
uploadDirNames = []
uploadFileNames = []
for path in os.listdir( sourceDir ):
    if not os.path.isfile(os.path.join( sourceDir, path)):
        uploadDirNames.append(path+'/')


for (sourceDir, dirnames, filenames) in os.walk(sourceDir):
    for subDir in dirnames:
        # print('dirname:'+ subDir)
        for (subDir, sub_dirnames, subfilenames) in os.walk(sourceDir+subDir):
            for subfilename in subfilenames:
                sub_path = string.replace(subDir, sourceDir, '')
                uploadFileNames.append(os.path.join(sub_path, subfilename))
    uploadFileNames.extend(filenames)
    break


def percent_cb(complete, total):
    sys.stdout.write('.')
    sys.stdout.flush()


def upload_deploy(source_path, dest_path):
    """
    Upload static files to S3 bucket.
    :return:
    """

    try:
        dest_path = dest_path.encode('utf-8')
        key = eb_bucket.new_key(dest_path)
        key.set_contents_from_filename(source_path,
                                       cb=percent_cb, num_cb=10)
    except BaseException as be:
        log_exception(be)
        return False
    return True


def upload_static(source_path, dest_path):
    """
    Upload static files to S3 bucket.
    :return:
    """

    try:
        dest_path = dest_path.encode('utf-8')
        key = bucket.new_key(dest_path)
        # if key.name.endswith(('.gz', '.gzip')):
        key.set_metadata('Content-Encoding', 'gzip')
        key.set_contents_from_filename(source_path,
                                       cb=percent_cb, num_cb=10)
    except BaseException as be:
        log_exception(be)
        return False
    return True


def worker():
    while True:
        item = q.get()
        if item['source_path'] == item['dest_path']:
            upload_deploy(item['source_path'], item['dest_path'])
        else:
            upload_static(item['source_path'], item['dest_path'])
        q.task_done()
        print 'Uploading %s to Amazon S3 bucket %s' % \
              (item['source_path'], item['dest_path'])

# threads = []
if len(sys.argv) == 2:
    eb_app = eb.describe_applications(application_names=AWS_ELASTIC_BEANSTALK_APP_NAME)
    versions = eb_app['DescribeApplicationsResponse']['DescribeApplicationsResult']['Applications'][0]['Versions']
    # if len(versions) > 2:
    #     versions = versions[:2]
    latest_version = PREFIX_GUID.replace('\'', '')+'-'+OLD_GUID.replace('\'', '')
    very_old_version = PREFIX_GUID.replace('\'', '')+'-'+VERY_OLD_GUID.replace('\'', '')
    extremely_very_old_version = PREFIX_GUID.replace('\'', '')+'-'+EXTREMELY_VERY_OLD_GUID.replace('\'', '')
    try:
        if latest_version in versions:
            versions.remove(latest_version)
        if very_old_version in versions:
            versions.remove(very_old_version)
        if extremely_very_old_version in versions:
            versions.remove(extremely_very_old_version)

        for key in bucket.list(prefix=OLD_GUID.replace('\'', '')):
            keys.remove(key.name)
        for key in bucket.list(prefix=VERY_OLD_GUID.replace('\'', '')):
            keys.remove(key.name)
        for key in bucket.list(prefix=EXTREMELY_VERY_OLD_GUID.replace('\'', '')):
            keys.remove(key.name)

        for eb_key in eb_bucket.list(prefix=latest_version):
            eb_keys.remove(eb_key.name)
        for eb_key in eb_bucket.list(prefix=very_old_version):
            eb_keys.remove(eb_key.name)
        for eb_key in eb_bucket.list(prefix=extremely_very_old_version):
            eb_keys.remove(eb_key.name)

        file_name = sys.argv[1]
        zip_file = file_name + '.zip'
        for i in range(8):
            t = Thread(target=worker)
            t.daemon = True
            t.start()
        item = {}
        item['source_path'] = zip_file
        item['dest_path'] = zip_file
        q.put(item)
        for filename in uploadFileNames:
            source_path = os.path.join(sourceDir + filename)
            dest_path = os.path.join(destDir, filename)
            item = {}
            item['source_path'] = source_path
            item['dest_path'] = dest_path
            q.put(item)
        q.join()
        eb.create_application_version(AWS_ELASTIC_BEANSTALK_APP_NAME, version_label=file_name,
                                      description=None, s3_bucket=AWS_ELASTIC_BEANSTALK_S3_BUCKET_NAME, s3_key=zip_file)
        eb.update_environment(environment_id=AWS_ELASTIC_BEANSTALK_ENVIRONMENT_ID,
                              environment_name=AWS_ELASTIC_BEANSTALK_ENVIRONMENT_NAME,
                              version_label=file_name)
        bucket.delete_keys(keys)
        eb_bucket.delete_keys(eb_keys)
        for version in versions:
            eb.delete_application_version(application_name=AWS_ELASTIC_BEANSTALK_APP_NAME, version_label=version, delete_source_bundle=False)
    except BaseException as be:
        print(str(be))
        if latest_version is not None:
            eb.update_environment(environment_id=AWS_ELASTIC_BEANSTALK_ENVIRONMENT_ID,
                                  environment_name=AWS_ELASTIC_BEANSTALK_ENVIRONMENT_NAME,
                                  version_label=latest_version)
    # print('eb application' + str(eb.retrieve_environment_info(environment_id=AWS_ELASTIC_BEANSTALK_ENVIRONMENT_ID,
    #                       environment_name=AWS_ELASTIC_BEANSTALK_ENVIRONMENT_NAME)))
    print('AWS Elastic Beanstalk updated.')
print('Bye Bye!')



by


Tags : , , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

소설가와 드라마 작가. 영화 시나리오 작가는 어떻게 다른가?

어떻게 하면 더 좋은 콘텐츠를 만들어 낼까 고민하던 중 도서관에서 진행하는 12주짜리 창작 프로그램을 발견했다.
고수 작가의 창작 비법과 더불어 작가로 살아가는 인생 경험담도 얻어들으면 하는 바람으로 수강을 시작했다.

오늘 첫 강의에선 소설, 드라마, 영화 창작의 차이점에 대한 내용을 들었다.
소설(순수문학)은 내면에서 나오는 이야기를 쓰지만, 드라마와 영화는 시청자와 관객 호응을 생각해야 한다.
영화는 일단 돈을 내고 극장에 들어온 이상 영화가 끝날 때까지는 관객이 앉아있지만,
드라마는 재미가 없으면 바로 채널을 바꾼다.
영화는 관객이 영화를 다 보고 나갈 때 재미있는 영화였다는 최면을 걸어주면 성공하고,
드라마는 한 회가 끝나기 전에 시청자의 호기심을 자극하면 성공한다.

소설

자신의 내면을 풀어내는 것이다.
그것이 시대 흐름과 맞았을 때 그에 공감하는 많은 독자가 생긴다.
모든 것은 나(소설가)로부터 시작되어 이에 공감하는 독자, 평론가, 출판사와 함께 작가의 삶을 영위한다.

1990년대에는 여성소설이 인기가 좋았고,
2000년대에는 서사 소설이 인기 좋았다.
2014년 현재는 위안과 희망을 담은 소설이 인기를 누린다.

소설가 자신의 내면을 풀어내는 것이지만, 시대에 그를 잘 녹여내지 못하면 대중에게 외면받는다.

영화

내용도 중요하지만, 예고와 홍보, 입소문이 중요해서 대중에게 어떻게 알릴 것인가가 중요하게 작용한다.
예를 들면 요즘 흥행하는 ‘명량’은 믿을만한 영웅이 없는 현대인들에게 이순신이라는 ‘영웅’의 이미지를 줌으로써 흥행에 성공하였다.
영화에서 중요한 것은 관객이 영화를 다 보고 나왔을 때 ‘재미있게 봤다.’라는 최면을 걸어주면 성공이다.

영화 시나리오 작가가 되려면 시나리오 마켓(http://www.scenariomarket.or.kr/)에 시나리오를 올리거나
영화학과를 졸업하고 같은 학교 인맥의 도움을 얻는 방법.
그리고 심산스쿨(http://www.simsanschool.com/)등에서 교육을 듣고 작가가 되는 방법이 있다.


영화 시나리오 작성에 도움이 되는 책

  • Story 시나리오 어떻게 쓸 것인가, 로버트 맥기
  • 시나리오 성공의 법칙, 알렉스 엡스타인
  • Save the cat 흥행하는 영화 시나리오의 8가지 법칙, 블레이크 스나이더

영화 흥행 5분의 법칙

  1. 초반 5분에 승부수를 던진다. (굉장한 웃음, 공포, 사건의 시작 등 깊은 인상을 주는 영화의 주된 사건과, 주인공에 대한 정보를 알려준다.)
  2. 15분까지는 초반 사건에 대한 수습, 파장등으로 흘러가면서 주인공의 조력자, 적 등에 대한 어느 정도의 정보가 자연스럽게 제공한다.
  3. 15분이 지나면 관객은 지루함을 느끼니 15분~20분 사이에 초반보다는 약한, 이벤트 정도의 사건 하나가 터져서 다시 흥미진진하게 만든다.
  4. 그 이후에는 롤러코스터를 타 듯, 10~15분 간격으로 작은 사건이 연속적으로 발생하고 이를 해결한다.
  5. 전체의 약 2/3 지점 쯤에 이르러서는 메인 사건이 크게 터져주거나,가장 최종적인 적 vs 주인공의 싸움이 드러난다.
로맨틱 코미디나 멜로물은 법칙과 다르게 흘러가기도 하고,
스릴러의 경우, 차근차근 쌓아가다가 마지막에 터뜨리는 식으로 가기도 한다.

드라마

드라마 작가가 되기 위해서는 방송 3사에서 진행하는 드라마 공모전에 참여하여 입상하는 방법(장편에서 신인이 입상하는 경우는 드물어서 단막극에 신인이 몰린다.).
그리고 드라마 제작사에 들어가서 작가가 되는 방법이 있다.
드라마 제작사에서 신인 작가에게 장난을 치는 경우가 종종 있으므로 드라마 제작사와 일을 할 땐 숙고해야 한다.
드라마는 연속성이 강하기 때문에 후반 10분에서 15분사이에 다음회를 궁금하게 만들면 성공한다.

극 창작의 4대 요소

  • 소재 - 독특한 소재일수록 좋지만, 소재는 재료에 불과하다.
  • 캐릭터 - 얼마나 매력적인 캐릭터를 만들어 내느냐가 관건이다. 한국에서는 사랑스럽고 믿을만한 캐릭터가 인기가 좋다.
  • 대사 - 전문 용어등에는 문어체를 쓰기도 하지만 되도록 구어체를 쓴다. 캐릭터를 잘 이해해야 그에 맞는 대사가 나온다. 잘 쓰여진 대본은 대사만 보아도 말하는 캐릭터가 떠오른다. 소재는 좋은데 재미없는 컨텐츠는 모든 캐릭터의 말투가 비슷해서 캐릭터의 특색이 없기 때문인 경우가 많다.
  • 구성 - 잘 짜여진 구성은 매력적이다. 전체적인 스토리에서 시간의 흐름이나 일어나는 사건에 따라 캐릭터가 어떤 변화를 겪을 것인가를 잘 연구해야 한다.



by


Tags : , , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!