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

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

Android Studio에서 unsigned apk 생성하기

build.gradle에서 다음과 같이 release 빌드용 signing configuration을 정의해 줍니다.

    signingConfigs {
        release {
            storePassword ""
            keyAlias ""
            keyPassword ""
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }

그리고 아래와 같이 console에서 release 빌드하면,

$ gradle assembleRelease

다음 위치에서 unsigned apk를 확인할 수 있습니다.

build/outputs/apk/app-release-unsigned.apk

알리오 올리오

집에서 혼자 식사를 해결해야 할때 “알리오 올리오”는 재료가 많이 필요하지 않고 요리법도 간단해서 좋습니다.

2014-04-09 13.19.10

재료는 단촐합니다. 스파게티면, 소금, 후추, 마늘, 청양고추, 올리브 오일

2014-04-09 13.24.54

시간배분을 잘 해야 전체 요리시간을 단축할 수 있습니다. 먼저 소금을 넣은 물을 끓인 후 면을 넣어 삶습니다.

2014-04-09 13.25.17

타이머를 이용해 정확히 8분을 삶습니다.

2014-04-09 13.25.45

동시에 약불을 이용해 스텐팬을 10분 동안 예열합니다.

2014-04-09 13.23.56

스파게티면을 삶고 스텐팬을 예열하는 사이에 마늘과 청양고추를 손질합니다. 참고로 청양고추의 씨는 꼭지를 따고 양손으로 비비면 떨어집니다.

8분 동안 삶은 면을 꺼내 체를 이용해 물기를 제거합니다.

2014-04-09 13.39.06

스텐팬의 예열이 끝나면 올리브 오일을 충분히 두르고 1분 정도 후에 마늘과 청양고추를 볶아 줍니다. 이때 매운맛이 올리브 오일에 스며듭니다.

2014-04-09 13.41.00

마늘이 노릇노릇해 졌다면 스파게티면을 넣고 올리브 오일이 면에 잘 스며들도록 요리해줍니다. 마무리로 소금이나 후추를 약간 더해주면 요리는 끝납니다.

아이폰5 배터리 충전요령

리퍼 받기 전에 쓰던 아이폰5는 최대충전용량(FullChargeCapacity)이 1000 이하로 떨어졌습니다. 배터리가 빨리 소모되는 것을 쉽게 체감할 수 있는 수준이었죠. 리퍼를 받은 후에는 배터리를 잘 관리하기 위해서 무엇이 문제였는지 돌아보았습니다.

  1. 리튬이온 배터리는 최대한 충전되어 있는 상태를 유지하면 좋다고 들어서 기회가 닿을때마다 자주 충전하고 충전하면서 사용하기도 했습니다.
  2. 회사에서는 비정품 USB 케이블에 다른 스마트폰용 충전기로 충전했습니다.

리퍼를 받은 후에는 충전방식을 바꿔봤습니다.

  1. 열이 발생하면 배터리 수명이 줄어들기 때문에 자주 충전하기 보다는 사용하지 않는 상태에서 한 번에 많이 충전하기
  2. 가급적 정품 충전기에 정품 USB 케이블 사용
  3. 한 달에 한 번 정도는 배터리 잔량이 10~20% 남을때까지 사용하기

스크린샷 2014-02-21 오전 12.14.59

그 결과 Cycle이 126회가 되었지만 최대충전용량이 최초설계용량의 95%를 유지하고 있습니다. 충전 중에 사용하는 일을 자제하고, 충전 횟수를 줄이면 Cycle이 200, 300이 넘어도 배터리는 좋은 상태를 유지할 수 있을 것 같습니다.

Ubuntu에서 MariaDB 설치 및 활용

설치

다음 링크에서 Ubuntu 버전 및 MariaDB 버전을 선택하면 설치 방법을 알려 줍니다.

Ubuntu 12.04, MariaDB 10.0을 선택한 경우 설치 과정은 다음과 같습니다.

sudo apt-get install python-software-properties
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
sudo add-apt-repository 'deb http://ftp.kaist.ac.kr/mariadb/repo/10.0/ubuntu precise main'
sudo apt-get update
sudo apt-get install mariadb-server

설치 과정에서 root 비밀번호를 설정합니다.

테스트

$ mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 55
Server version: 10.0.7-MariaDB-1~precise-log mariadb.org binary distribution

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Node.js Binding

mariasql

var inspect = require('util').inspect;
var Client = require('mariasql');

var c = new Client();
c.connect({
  host: '127.0.0.1',
  user: 'foo',
  password: 'bar',
  db: 'mydb'
});

c.on('connect', function() {
   console.log('Client connected');
 })
 .on('error', function(err) {
   console.log('Client error: ' + err);
 })
 .on('close', function(hadError) {
   console.log('Client closed');
 });

c.query('SELECT * FROM users WHERE id = :id AND name = :name',
        { id: 1337, name: 'Frylock' })
 .on('result', function(res) {
   res.on('row', function(row) {
     console.log('Result row: ' + inspect(row));
   })
   .on('error', function(err) {
     console.log('Result error: ' + inspect(err));
   })
   .on('end', function(info) {
     console.log('Result finished successfully');
   });
 })
 .on('end', function() {
   console.log('Done with all results');
 });

c.query('SELECT * FROM users WHERE id = ? AND name = ?',
        [ 1337, 'Frylock' ])
 .on('result', function(res) {
   res.on('row', function(row) {
     console.log('Result row: ' + inspect(row));
   })
   .on('error', function(err) {
     console.log('Result error: ' + inspect(err));
   })
   .on('end', function(info) {
     console.log('Result finished successfully');
   });
 })
 .on('end', function() {
   console.log('Done with all results');
 });

c.end();