Confluence에서 Notion으로 이사

현충일 연휴를 이용하여 Confluence에 정리한 개인 자료를 모두 Notion으로 옮겼다.

단돈 $10를 내고 Confluence를 개인 서버에 설치하여 사용해왔는데, 처음의 계획만큼 잘 활용하지 못했다. 이유는 크게 2가지:

  • 어쩌다 한 번 쓰려고 하면 길고 긴 콜드 부트 시간을 기다려야한다.
  • 모바일에서 읽기, 쓰기 불편하다.

Notion이 좋았던 이유 5가지:

  • 예쁘다.
  • Block 단위 편집
  • 모바일 접근성이 좋다.
  • 직접 관리 안하고 마음 편하게 쓰고싶다.
  • 마크다운 형식으로 내보내기 가능

Confluence에서 가져오기 도구를 제공하지 않아서 개인 자료를 옮기는데 적잖은 시간을 사용해야했지만, 앞으로 개인자료를 잘 정리하여 활용할 것을 생각하면 좋은 투자였다고 생각한다.

Cloudflare Update DNS Record Python Script

DNSEver를 떠나 Cloudflare에 정착. 서버의 변경 된 IP 주소를 주기적으로 DNS 레코드에 반영하기 위해 간단한 Python 스크립트를 작성해보았다.

API documentation: https://api.cloudflare.com/

import requests
import json

zone_id = '...'
email = '...'
api_key = '...'

ip_addr = requests.get('https://api.ipify.org').text

headers = {
  'X-Auth-Email': email,
  'X-Auth-Key': api_key,
  'Content-Type': 'application/json',
}

list_dns_record_url = 'https://api.cloudflare.com/client/v4/zones/{}/dns_records'
update_dns_record_url = 'https://api.cloudflare.com/client/v4/zones/{}/dns_records/{}'

response = requests.get(list_dns_record_url.format(zone_id), headers=headers)
for record in response.json()['result']:
  if record['type'] == 'A':
    data = {
      'type': 'A',
      'name': record['name'],
      'content': ip_addr,
      'ttl': 1,
      'proxied': True,
    }
    response = requests.put(update_dns_record_url.format(zone_id, record['id']), headers=headers, data=json.dumps(data))
    print(response.json())

콘솔에서 구글드라이브에 업로드하기

2012년 10월에 구축한 홈서버가 언제 사망할지 알 수 없는 일이라, 주기적으로 구글 드라이브에 WordPress 데이터와 Confluence 데이터를 백업하고 있다. 홈서버에서 mac으로 파일을 옮긴 후 다시 mac에서 구글드라이브로 업로드하는 과정이 불편해 개선안을 찾다가 구글드라이브 CLI를 발견해 사용해 보았다.

설치 방법은 gdrive github을 참고.

설치 후 처음 명령어를 실행해 보면 아래와 같이 인증을 위한 웹 주소를 준다. 브라우저에 이 주소를 복사해 인증 성공 후 나오는 verification code를 콘솔에 입력하면 모든 준비 과정은 끝.

# ./gdrive list
Authentication needed
Go to the following url in your browser:
https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=...

Enter verification code: ...

다음으로 할 일은 백업파일을 업로드 할 폴더의 아이디 찾기. 쿼리 문법은 여기를 참고.

# ./gdrive list --query "name contains 'Backups'"
Id                             Name      Type   Size   Created
0B4H4TB17DIyIal9MM0N3MngtMGM   Backups   dir           2016-06-25 04:41:15

업로드는 아래와 같이 간단하다.

# ./gdrive upload --parent 0B4H4TB17DIyIal9MM0N3MngtMGM ./confluence-backup-2017-04-01.zip
Uploading ./confluence-backup-2017-04-01.zip
Uploaded 0B4H4TB17DIyIMTREQUFXZklGU0E at 5.3 MB/s, total 232.9 MB

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

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