Log for everything - Day

안드로이드 라이센스 라이브러리 사용하기

|

앱을 유료로 마켓에 업로드하려 할때, apk 파일을 통해 앱을 설치하는게 우려된다면,
Google의 라이센싱 라이브러리를 사용하면 apk파일이 구매한 것인지 검증해 준다.

설치

Android SDK Tools에서 라이센싱 라이브러리를 설치한다. 라이브러리 설치

라이브러리 추가

안드로이드 스튜디오에서 File -> New -> Import Module을 선택한 후,
설치한 라이센스 소스 디렉토리의 AndroidManifest.xml을 선택한다. 라이브러리 추가

계정 설정

Google Play console에서 라이센스 테스트를 수행할 계정을 선택한다.
이 계정으로 기기에 로그인 해야 한다. 계정설정

라이센스 키 설정

Google Play console에서 개별 앱 페이지로 들어가서 라이센스 키를 복사한다.
라이센스 키 설정

라이브러리 포함하여 빌드하도록 설정

app의 build.gradle에 다음 구문을 추가한다 compile project(path: ':library')

라이브러리 사용

사용법은 딱히 까다롭지 않아 Android docs의 링크로 대체하고, 일부 부분만 설명한다.

고유 디바이스 아이디 처리

new AESObfuscator(SALT, getPackageName(), deviceId)

부분에서 고유한 deviceId를 처리해줘야 한다.

Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID))),

장치 고유값을 가져오는 것이 생각보다 쉽지않은데, 그냥 단순하게 처리하려면 위와같이 하면 된다.

에러처리

에러 처리 라이브러리의 intent 사용 방법 떄문에 에러가 발생한다.

if (mService == null) {
    Log.i(TAG, "Binding to licensing service.");
    try {
        boolean bindResult = mContext
            .bindService(
            new Intent(
            new String(
            Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))),
            this, // ServiceConnection.
            Context.BIND_AUTO_CREATE);

        if (bindResult) {
            mPendingChecks.offer(validator);
        } else {
            Log.e(TAG, "Could not bind to service.");
            handleServiceConnectionError(validator);
        }
    } catch (SecurityException e) {
        callback.applicationError(LicenseCheckerCallback.ERROR_MISSING_PERMISSION);
    } catch (Base64DecoderException e) {
        e.printStackTrace();
    }
}

라이브러리의 위 코드를 아래와 같이 수정한다.

if (mService == null) {
    Log.i(TAG, "Binding to licensing service.");
    try {
        Intent serviceIntent = new Intent(
        new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")));
        serviceIntent.setPackage("com.android.vending");
        boolean bindResult = mContext.bindService(serviceIntent,
            this, // ServiceConnection.
            Context.BIND_AUTO_CREATE);

        if (bindResult) {
            mPendingChecks.offer(validator);
        } else {
            Log.e(TAG, "Could not bind to service.");
            handleServiceConnectionError(validator);
        }
    } catch (SecurityException e) {
        callback.applicationError(LicenseCheckerCallback.ERROR_MISSING_PERMISSION);
    } catch (Base64DecoderException e) {
        e.printStackTrace();
    }
} 

또 다른 에러

LicenseCheckerCallback에서 applicationError가 호출되며 에러코드 3이 찍히는 경우가 있다.
이는 ERROR_NOT_MARKET_MANAGED로 마켓에 앱을 올리지 않았을때 반환되는 코드인데, 처리할 필요 없다.
정상적인 시나리오에서는 allow나 dontallow가 호출되기 때문인데, 자세한 이유를 알고 싶다면 여기서 확인할 것

안드로이드 런처 아이콘 해상도별로 생성하기

|

안드로이드 런처 아이콘 생성하기

안드로이드 런처 아이콘을 해상도별로 작업하는 것은 귀찮은 일이지만,
내가 귀찮은 것은 남에게도 귀찮은 법.

AndroidAssetStudio를 통해 여러가지 해상도별로 쉽게 뽑아낼 수 있다.

HTML 컬러코드 기본 조합

|

Color Picker를 위한 기본 색상 조합

색상 선택기를 만드는데 기본 조합이 필요하다면 다음의 색상 조합을 이용한다

색상 이름 HEX
Red #FF0000
Maroon #800000
Yellow #FFFF00
Olive #808000
Lime #00FF00
Green #008000
Aqua #00FFFF
Teal #008080
Blue #0000FF
Navy #000080
Fuchsia #FF00FF
Purple #800080
White #FFFFFF
Silver #C0C0C0
Gray #808080
Black #000000

Mac Finder에서 파일 이름으로 검색하기

|

상황

다음 그림과 같이 한 폴더에 많은 파일이 있다.
서치 리스트

이 중 heroku라는 글자를 포함한 파일을 찾으려 한다.

오른쪽 위의 검색 창 사용

파인더 검색 실패

파인더 이름검색 여전히 검색 실패

Spotlight를 통한 검색에서도 해당 파일을 찾지 못했다.

검색 방법

Finder에서 (커맨드)+F를 입력한다.
새롭게 뜨는 검색창에서 이름, 다음을 포함을 선택하고 검색한다.

파인더 해결방법 이번에는 잘 검색되었다.

Django 프로젝트 Heroku 릴리즈 - (최종 수정)

|

할때마다 고생이라 한번 더 정리한다.
보안키 같은것 숨기지 않고, 그냥 가장 빠르게 설정하는 방법이다.
CLI 등 툴 인스톨은 기존 포스팅을 참고하자.

gunicorn 추가 (장고 기본 폴더 구성 시)

pip3 install gunicorn

Procfile 추가

프로젝트 루트에 Procfile을 추가하고 다음 내용을 추가
web: gunicorn myproject.wsgi --log-file -

runtime.txt 추가

프로젝트 루트에 runtime.txt을 추가하고 다음 내용 추가 python-3.6.1

dj-database-url 추가

pip3 install dj-database-url

settings.py파일에 다음 내용 추가

import dj_database_url
db_from_env = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(db_from_env)

whitenoise 추가

pip install whitenoise

settings.py에 다음 내용을 추가한다.

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'

wsgi.py에 다음 내용을 추가

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

application = get_wsgi_application()
application = DjangoWhiteNoise(application)

psycopg2 추가

pip install psycopg2

requirements.txt 생성

pip freeze > requirements.txt 입력

ALLOWED Host 추가

settings.pyALLOWED_HOSTS = ['*']를 추가

DEBUG 끄기

settings.py에서 DEBUG = False 설정

Heroku 앱 생성

heroku create

Git commit 하고 heroku로 push

git add .
git commit -m "heroku settings update"
git push heroku master

db가 생성

heroku run python manage.py migrate

슈퍼유저 생성

heroku run python manage.py createsuperuser

중요

SECRET_KEY를 숨기려면 기존에 작성한 포스팅을 참고할 것.
위의 방법은 가장 빠르게 릴리즈만을 위한 방법임