Log for everything - Day

안드로이드에 Facebook 로그인 연동하기

|

Facebook SDK 연동하기

한동안 Facebook SDK를 쓸일이 없다가 다시 기회가 생겨 간단한 샘플을 제작해 보았다.
잊어버리지 않게 정리해두려 한다.

Dependency 추가

compile 'com.facebook.android:facebook-android-sdk:[4,5)'build.gradle에 추가한다.

Manifest 수정

인터넷 엑서스가 필요하므로 권한을 추가해야 한다.

<uses-permission android:name="android.permission.INTERNET"/>

meta Data를 추가해 어플리케이션 ID를 넣고,

<meta-data android:name="com.facebook.sdk.ApplicationId"
    android:value="@string/facebook_app_id"/>

Facebook Activity도 추가해야 한다.

<activity android:name="com.facebook.FacebookActivity"
    android:configChanges=
        "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:label="@string/app_name" />

Layout 수정

페이스북에서 제공하는 기본 로그인 버튼을 이용하려면, 레이아웃에 다음을 추가한다.

<com.facebook.login.widget.LoginButton
    android:id="@+id/login_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="30dp"
    android:layout_marginBottom="30dp" />

Activity 수정

  1. LoginButton의 참조를 얻은 후
    final LoginButton mLoginBtn = (LoginButton) findViewById(R.id.login_button);
  2. 읽기 퍼미션을 준다.
    mLoginBtn.setReadPermissions("public_profile");
  3. 쓰기 퍼미션은 추후 다음과 같이 LoginManager를 통해 준다.
    LoginManager.getInstance().logInWithPublishPermissions(this,
     Arrays.asList("publish_actions")
    );
    
  4. LoginButton에 콜백을 등록하고, 필요한 메소드를 오버라이드 한다.
    mLoginBtn.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
     @Override
         public void onSuccess(LoginResult loginResult) {
    
     }
    
     @Override
         public void onCancel() {
    
     }
    
     @Override
         public void onError(FacebookException error) {
    
     }
    });
    
  5. onActivityResult를 통해 CallbackManager에 결과를 전달한다.
    mCallbackManager.onActivityResult(requestCode, resultCode, data);

텐서플로 라이브러리 안드로이드에 사용하기

|

빌드된 라이브러리 다운로드

상세 설정은 지난 포스팅 참조.

Project nightly-android에서 최신 빌드된 버전 이미지의 libandroid_tensorflow_inference_java.jar
파일 다운로드, native 폴더의 libtensorflow_inference.so도 zip 파일로 압축해서 다운로드

안드로이드 프로젝트 생성

텐서플로를 사용할 안드로이드 프로젝트 생성

라이브러리 추가

app/libs/ 폴더에 zip 파일로 압축한 폴더를 풀어서 복사
동일 폴더안에 libandroid_tensorflow_inference_java.jar 또한 복사
트리 구조는 아래와 같음 폴더구조

build.gradle 수정

build.gradle (Module: app) 파일의 android 항목 안에 native 라이브러리 경로 추가

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

메인 액티비티 수정

라이브러리 로드

static {
    System.loadLibrary("tensorflow_inference");
}

onCreate 수정

Tensor c = Tensor.create(3.0f);

TextView tv = (TextView) findViewById(R.id.textView);
tv.setText(String.valueOf(c.floatValue()));

간단히 Tensor를 하나 생성한 후 값을 빼내서 출력함.

텐서플로 소스로부터 안드로이드 라이브러리 빌드하기

|

텐서플로 repository clone

git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git

Android NDK 설치

텐서플로의 core 모듈이 c++로 이루어져 있고, 이를 이용하기 위해서는 JNI가 필요.
Android Studio의 Preference -> Appearance & Behavior -> System Settings -> Android SDK -> SDK Tools 탭에서 NDK를 찾아 설치
위와 같이 하면 NDK 최신 버전이 설치되는데 WORKSPACE 파일을 보면 r12b를 쓰라 되어있다.
그러므로 여기서 다운 받은 r12b를 설치

Bazel 설치

텐서플로의 빌드 툴인 Bazel 설치

WORKSPACE 파일 수정

Clone된 텐서플로 프로젝트의 Root의 WORKSPACE 파일을 열어

#android_sdk_repository(
#    name = "androidsdk",
#    api_level = 23,
#    # Ensure that you have the build_tools_version below installed in the
#    # SDK manager as it updates periodically.
#    build_tools_version = "25.0.2",
#    # Replace with path to Android SDK on your system
#    path = "<PATH_TO_SDK>",
#)
#
# Android NDK r12b is recommended (higher may cause issues with Bazel)
#android_ndk_repository(
#    name="androidndk",
#    path="<PATH_TO_NDK>",
#    # This needs to be 14 or higher to compile TensorFlow.
#    # Note that the NDK version is not the API level.
#    api_level=14)

이 부분의 주석을 제거하고 SDK 및 NDK 경로를 넣어줌

android_sdk_repository(
    name = "androidsdk",
    api_level = 23,
    build_tools_version = "25.0.2",
    path = "/Users/mymacpro/Library/Android/sdk/",
)
android_ndk_repository(
    name="androidndk",
    path="/Users/mymacpro/AndroidStudio_workspace/android-ndk-r12b/",
    api_level=14)

.so 파일 빌드

bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
--crosstool_top=//external:android/crosstool \
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
--cpu=x86_64

빌드가 끝나면 프로젝트 폴더에 bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so가 생성

.jar 파일 빌드

bazel build //tensorflow/contrib/android:android_tensorflow_inference_java

마찬가지로 bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar 생성됨

안드로이드 프로젝트 생성

라이브러리 추가

라이브러리에 libandroid_tensorflow_inference_java.jarlibtensorflow_inference.so 추가

이제 텐서플로의 Java API를 TensorFlowInferenceInterface를 통해 호출 가능하다.

소스 빌드하지 않을 경우 라이브러리 추가하는 제일 간단한 방법
Project nightly-android에서 빌드된 파일을 받는다.
굳이 빌드할 필요도 없음…

지식, 그리고 경제

|

금요일에 도서관에 잠깐 들려 책을 몇권 빌렸다. 신간으로 들어온 책들을 마음가는대로 집어들었다.
마침 아침부터 비가 오고 날씨가 궂어 운동을 한 후 빌려온 책들을 읽으면서 시간을 보냈다.

경제학 위의 오늘

주류 경제학자들과 다르게 인문학적 관점으로 경제학에 접근하는 서적이다.
상당히 강한 어조로 쓰여져 있는데 읽으며 장하준 교수의 어조가 떠오르기도 했다.
같은 비주류 경제학 출신의 저자여서 그런지 주류 경제학 서적들이 당연히 깔고가는 전제들에 대한 비판이 많다.

주류의 입장에서는 자기들 존재의 근본을 의심하는 행위를 좋아할리 없다.
하지만 나는 경제학도도 아니고 사물의 원리와 근본을 따져보기 좋아하는 엔지니어이며,
가치판단이 들어갈 여지가 있는 사회과학에 대한 비판적 견해를 가지고 있기에 이런 주장들은 흥미로웠다.

자신이 믿는 것이 진리이고, 자신의 진리를 인터넷이나 SNS를 통해 설파하는 모습에 조금 진저리가 난 터라,
당연하다고 생각되는 것들을 다시 따져보고 비판하는 저자의 주장이 더 마음에 들었던 것 같다.

근본적인 발전을 위해서는 기본적 진리에 대한 탐구를 늦추지 않아야 한다는 엘론머스크의 말이 아니더라도,
경제와 사회제도가 삶에 미치는 영향이 너무도 지대하기에 자신만의 견해를 갖는 것이 주도적인 삶이라 본다.

전문분야는 전문가에게 맡기고 우리는 각자의 삶을 열심히 살자라고 말할지도 모르겠지만,
지식이라는 것이 얼마나 쉽게 의도를 가지고 변질되는지 깨닿는다면 이는 너무 순진한 생각이다.
지식인들이 자신의 이익에 영합하여 지식을 변질시키는 여러 사례를 지민의 탄생에서 찾아볼 수 있는데,
이런 지식인들에 대항하는 지민(전문지식을 가진 시민)까지는 아니더라도
최소한 스스로 판단할줄 아는 사람이 될 수 있도록 생각하고 탐구하는 노력을 아끼지 말아야 한다.

Django를 이용한 포트폴리오 사이트 제작 (3) - 디자인 컨셉 잡기

|

공동 프로젝트 진행상황

1주차 : JQuery를 이용한 간단한 애니메이션
2주차 : Phaser Library를 이용한 마우스 이벤트에 반응하는 인터랙션
3주차 : 개인 포트폴리오 사이트 공동 기획
4주차 : 프로필 페이지 및 책장 넘기기 형태 구현

5주차 진행상황

지난주에 가닥을 잡았던 메뉴 구성 및 사이트 디자인이 전부 뒤엎어졌다.
홈 화면은 지난주와 같으나 네비게이션 바가 Drawer 형식으로 숨겨져 있으면 좋겠고,
전체적인 페이지 느낌이 책과 같으면 좋겠다는 디자인 컨셉이 잡혔다.
아직 정확한 컨셉이 확정되지 않아 기능구현은 무의미해 같이 이야기를 나누며 기획안을 그려보았다.
지난주에 제작했던 Page flip transition도 디테일이 마음에 안든다고 해 다른 라이브러리를 찾던지,
그냥 작정하고 처음부터 제작해야 할 것 같다.

다음주 목표

디자인 확정
기획이 조금이라도 확정되어야 진전이 있을 것 같은 느낌이 든다.
분명 처음 기획은 그냥 간단히 작품 올리고 볼 수 있는 사이트였는데…