지금 당장 도서관으로 가라

KOR9788976041036

집 근처 흥덕도서관에 갔다가 제목에 끌려 읽게된 책입니다. 독서를 멀리한지 오래 되었지만 다시 시작해야겠다는 마음을 먹고 있어서 그런지 제목을 보고 지나칠 수 없더군요. 2002년부터 독서토론모임 “리더스 클럽”을 이끌고 있는 저자는 이 책을 통해서 왜 우리가 책을 읽어야 하는지에 대해서 끊임없이 설득하고 있습니다. 이 책에 인용된 책들의 수만 세어보아도 저자가 독서를 얼마나 중요하게 생각하는지 알 수 있었습니다. 소개된 책들을 저의 독서 목록에 넣는 재미도 쏠쏠했고요.

저자가 경험한 사람들 그리고 저자가 읽었던 책으로부터, 책이 우리에게 주는 가치를 설명하고 독서를 권유합니다. 그리고 책으로부터 정수를 뽑아내는 방법을 설명하기도 합니다. 인용된 사람들과 이야기들 그리고 책을 대하는 자세와 방법들은 이미 다른책에서도 많이 접했던 내용이었지만, 스스로 경쟁력을 상실해가고 있다는 위기의식을 가지고 살아가고 있고 이를 극복하기 위한 첫 번째 단추로 독서를 생각하고 있는 저에게는 소중하게 다가왔습니다.

엔지니어로서 기술적인 깊이를 더할 수 있는 것도 책이요, 미래의 리더가 되기위해서 필요한 통찰력을 기르기 위해 필요한 것도 책입니다. 그리고 한 가정의 가장으로서 가계를 현명하게 운영하기 위한 경제적 지식을 공부할 수 있는 것도 책입니다. 책을 읽지 않는 사회에 살면서 책을 읽는다는 것은 어쩌면 행운일지 모르겠습니다. 남과 다른 경쟁력을 비교적 쉽게 갖출 수 있다는 이야기가 될테니까요.

인생을 돌아보면 열심히 책을 읽었던 시기가 있었습니다. 유년기에는 부모님이 사주신 위인전 전집을 열심히 읽었고, 고등학생때에는 조정래 작가님의 아리랑, 태백산맥을 읽었습니다. 그리고 대학원 시절에는 1년에 100권 읽기를 목표로 독서에 정진했던 기억이 납니다. 독서를 열심히 하던 시간들이 있었기에 지금에 제가 있었다는 생각을 다시 해보면서, 앞으로 펼처질 시간들을 조금 더 의미있게 살아가기 위해 독서에 정진해야겠다는 다짐을 가져봅니다.

싱가포르에서 말레이시아 조호프리미엄아울렛(JPO)에 다녀오기

싱가포르 여행 마지막 날에는 버스를 타고 국경을 넘어 말레이시아 조호바루 지역에 위치한 Johor Premium Outlets에 다녀왔습니다. 인터넷에 잘 정리된 정보가 없어서 여기에 남깁니다.

출발하기 전에 여권과 싱가포르 입국할때 작성한 입국카드를 준비합니다.

부기스역 근처에 위치한 Queen Street Bus Terminal에서 티켓(현금 2.5 S$)을 구매 하고, CW2 버스에 탑승합니다. 170번 시내버스를 이용할 수도 있지만 좌석버스 CW2가 빠르고 쾌적합니다. 티켓은 나중에 출국 심사 후 다시 탑승할 때 필요하므로 잘 보관해야 합니다.

30~40분 정도 달리면 Woodlands Checkpoint에 도착합니다. 여기서 출국심사를 해야하므로 모든 사람들이 버스에서 내립니다. 출국심사대에서 싱가포르 입국시 작성했던 카드를 제출하게 됩니다. 출국심사를 마치면 다시 CW2 버스에 탑승해야 합니다. 티켓을 보여주면 추가비용없이 다시 버스를 이용할 수 있습니다.

버스에 탑승하여 바다를 건너는 길을 지나면 말레이시아에 도착하게 됩니다. 국경을 넘자마자 도착하는 건물에서 말레이시아 입국심사를 받게 됩니다. 여권만 건네주면 질문도 없이 입국심사는 끝납니다.

IMG_20140923_124216

입국심사를 마친 건물에서 구름다리를 건너면 JB Central로 갈 수 있습니다. 표지판을 보고 잘 따라가시면 됩니다. 1층 버스 터미널에서 JPO로 가는 버스 JPO1을 타면 됩니다. 여기서 레고랜드로 갈 수 있는 버스도 탈 수 있는데 노선 정보는 다음 링크를 참조하세요.

IMG_20140923_130901

IMG_20140923_142751

JPO1의 배차간격은 2시간 30분이니 시간표를 잘 보고 일정을 짜야합니다. JPO1을 타고 가고 오는 길에 정류장이 꽤 많은데, 어린 학생들을 포함해 현지인들도 많이 타고 내려서 짧은 시간이었지만 말레이시아의 분위기를 느껴볼 수 있어 좋았습니다.

IMG_20140923_183903

다시 JB Central에 돌아왔을때는 익숙해져서인지 나름 여유가 생겨서 말레이시아 스타일 봉지커피로 더위를 달랬습니다.

다시 싱가포르로 돌아올때는 얼떨결에 CW5 버스를 탔는데 여행 첫날 칠리크랩을 먹었던 Newton Food Centre에 내려주더군요. CW2, CW5 등 Causeway Link 회사의 버스 노선은 다음 링크를 참조하세요. 북쪽에 숙소를 두고 있는 분들은 CW2를 타고 멀리 부기스까지 갈 필요 없이 Newton까지 운행하는 CW5를 타셔도 괜찮을 것 같습니다.

신혼여행에서 즐긴 음식들

스페인 바르셀로나

카푸치노

IMG_1491

핀초스

IMG_0238

샹그리아

IMG_0452

빠에야

IMG_0455

보케리아시장 해산물구이

IMG_1623

보케리아시장 컵과일

IMG_0489

El Rey De La Gamba

IMG_0649

English Breakfast

IMG_1664

프랑스 카르카손

IMG_0722

IMG_0720

IMG_0817

IMG_0818

IMG_0852

IMG_0855

IMG_0856

프랑스 아를

IMG_0894

IMG_0896

IMG_0897

IMG_1047

IMG_1056

IMG_1057

IMG_1058

IMG_1063

프랑스 고흐드

IMG_1135

IMG_1136

IMG_1923

프랑스 후쓸리옹

IMG_1194

IMG_1195

프랑스 엑상프로방스

IMG_1268

IMG_1269

프랑스 니스

IMG_1310

IMG_1309

IMG_1330

IMG_1331

IMG_2071

IMG_2072

Android Studio 프로젝트 릴리즈 빌드할때 Proguard를 이용해 로그제거하기

마켓에 애플리케이션을 릴리즈하기 전에 해야할 일 중 하나는 로그를 제거하는 작업입니다.

소스코드를 수정하지 않고 릴리즈 빌드할때 Proguard를 이용해 로그(android.util.Log) 메서드 호출을 간단하게 제거할 수 있습니다.

build.gradle에서 다음과 같이 릴리즈 빌드할때 Proguard를 적용하도록 정의해 줍니다.

    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'
        }
    }

그리고 proguard-rules.txt를 아래와 같이 수정해 줍니다.

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

이렇게 설정하고 gradle assembleRelease로 빌드하면, Log.d(), Log.v() 호출은 제거됩니다. (리턴값을 참조하지 않는다면)

중요한 포인트는 -assumenosideeffects 옵션은 optimize 단계를 거쳐야만 적용이 된다는 점입니다. 때문에 proguard-android.txt가 아닌 proguard-android-optimize.txt를 사용하도록 설정해야 합니다.

이 파일들은 안드로이드 SDK의 tools/proguard 디렉토리에 위치하고 있습니다.

Console에서 Android SDK 업데이트하기

Jenkins로 안드로이드 프로젝트를 자동으로 빌드하는 시스템을 구축하다보면 UI 없이 Console에서 Android SDK를 업데이트해야 하는 상황이 발생합니다.

먼저 SDK 루트 디렉토리에서 tools 디렉토리로 이동합니다.

cd tools

설치할 수 있는 SDK 목록을 확인합니다.

$ ./android list sdk
Refresh Sources:
  Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml
  Validate XML
  Parse XML
  Fetched Add-ons List successfully
  Refresh Sources
  Fetching URL: https://dl-ssl.google.com/android/repository/repository-10.xml
  Validate XML: https://dl-ssl.google.com/android/repository/repository-10.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/repository-10.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/addon.xml
  Validate XML: https://dl-ssl.google.com/android/repository/addon.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/addon.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/addon-6.xml
  Validate XML: https://dl-ssl.google.com/android/repository/addon-6.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/addon-6.xml
  Fetching URL: https://dl-ssl.google.com/glass/gdk/addon.xml
  Validate XML: https://dl-ssl.google.com/glass/gdk/addon.xml
  Parse XML:    https://dl-ssl.google.com/glass/gdk/addon.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/extras/intel/addon.xml
  Validate XML: https://dl-ssl.google.com/android/repository/extras/intel/addon.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/extras/intel/addon.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/sys-img/android/sys-img.xml
  Validate XML: https://dl-ssl.google.com/android/repository/sys-img/android/sys-img.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/sys-img/android/sys-img.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/sys-img/android-wear/sys-img.xml
  Validate XML: https://dl-ssl.google.com/android/repository/sys-img/android-wear/sys-img.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/sys-img/android-wear/sys-img.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/sys-img/android-tv/sys-img.xml
  Validate XML: https://dl-ssl.google.com/android/repository/sys-img/android-tv/sys-img.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/sys-img/android-tv/sys-img.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/sys-img/x86/addon-x86.xml
  Validate XML: https://dl-ssl.google.com/android/repository/sys-img/x86/addon-x86.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/sys-img/x86/addon-x86.xml
Packages available for installation or update: 15
   1- Android SDK Tools, revision 23.0.2
   2- Documentation for Android 'L' Preview SDK, revision 1
   3- SDK Platform Android 4.4W, API 20, revision 1
   4- SDK Platform Android L Preview, revision 1
   5- Samples for SDK API 20, revision 1
   6- Samples for SDK API L Preview, revision 1
   7- Google APIs (x86 System Image), Android API 19, revision 6
   8- Google APIs (ARM System Image), Android API 19, revision 6
   9- Glass Development Kit Preview, Android API 19, revision 8
  10- Android Support Repository, revision 6
  11- Android Support Library, revision 20
  12- Google Play services, revision 18
  13- Google Repository, revision 9
  14- Google Play Billing Library, revision 5
  15- Google Play Licensing Library, revision 2

아래와 같은 커맨드로 원하는 항목만 선택적으로 업데이트 할 수 있습니다.

$ ./android update sdk --no-ui --filter 1,10,11,12

의존성 문제 때문인지 원하는 항목이 한 번에 나타나지 않을 수도 있습니다. 보통은 리스트를 확인하고 업데이트를 요청하는 과정을 반복하게 되더군요.