'전체 글'에 해당되는 글 171건

  1. 2017.04.13 [스시고산] 분당 수내 맛집 (초밥, 회) 오마카세 전문점
  2. 2017.04.03 구글 firebase 프로젝트 생성및 적용하기
  3. 2017.04.01 구글 firebase는 무엇인가? 제공하는 기능은? 1
  4. 2017.03.30 App이 foreground 인지 background 인지 구별하기 1
  5. 2015.10.14 android face detecting ( FaceDetector vs google-play-vision )

[스시고산] 분당 수내 맛집 (초밥, 회) 오마카세 전문점

여행&맛집 2017. 4. 13. 23:32

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

오늘은 분당에 있는 스시고산 이라는 일식집( 초밥,회 전문점)에 방문한 이야기입니다. 

위치는 아래 지도에서 보는것 처럼 수내역 2번 출구로 나오면 됩니다. 

대덕프라자 빌딩 2층에 있습니다. 



맛있다는 소문을 듣고 처음 방문했는데, 가게는 그렇게 큰 느낌은 아니었습니다. 


메뉴는 되게 단순합니다. 

오마카세로 유명한 집인데요, 저녁 오마카세로 먹었습니다. 



오마카세란?

'당신에게 맡깁니다' 라는 뜻으로 초밥 셰프에게 맡길테니, 세프의 솜씨를 보여주세요 입니다. 그래서 그때 그때 나오는 메뉴가 다르다고 합니다. 


즉, 셰프 앞에 앉아서 바로 바로 만들어 주는 초밥을 먹는 곳입니다. 

위사진처럼 바로 만들어서 앞에 있는 접시에 놓아줌니다. 


자리에 않으면 아래처럼 기본 세팅을 해줍니다. 

일식집 답게 정결한 느낌입니다. 

아래 사진은 모두 푸디카메라로 찍었습니다. (참 잘나와요) 


그리고 전식이라고 해야 하나요, 초밥전에 간단하게 4가지가 나옵니다. 

1. 계란찜 : 계란이 정말 부드럽고 맛있어요. 

2. 해삼 : 씹는맛도 있고 맛있어요. 

3. 회무침 : 소량인데 소스가 상큼해서 잘 어울려요. 

4. 튀김? 


그 다음으로 본격적으로 초밥이 나오기 시작합니다. 

 광어

농어  

  ??

도미  

  

 생새우 











































초밥이 하나씩 만들어서 바로바로 주셔서, 먹느라고 사진은 몇게 못찍었는데, 

초밥을 한 20개는 만들어 주셨습니다.  다 먹었더니 완전 배불러요~

물론 가장 맛있는 초밥은 참치대뱃살(오도리) 였구요~ 





초밥을 다 먹고 나면 우동이 나옵니다. 


이건 미니 회덥밥 같습니다. 간장을 조금 넣었으니 조금 먹어보고 적절하게 간장을 더 넣고 비벼먹으면 된다고 합니다. 


그리고 부드러운 카스테라 사이에 계란이 들어있는 빵을 줍니다. 

이것도 처음먹어 보는데, 맛있어요. 


마지막 입가심으로 딸기와 팥갱~ 


양갱은 딸기 사이에 숨어있어요~ 


오마카세로 처음 먹어 봤는데, 상당히 만족합니다. 

가격은 45,000 으로 싸지는 않지만 특별한 날에 먹어볼만 합니다. 


사진은 Foodie 라는 앱으로 찍었는데, 음식사진 찍을때 최고네요. 

음식이 더 맛있어 보이고~ 생동감 있어 보여요. 





:

구글 firebase 프로젝트 생성및 적용하기

android 2017. 4. 3. 21:43

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이번에는 firebase를 적용하는 방법에 대해서 알아 보겠습니다. 

firebase에서 제공하는 간략한 기능에 대해서 알아 보려면 다음 글을 읽어 보세요. 


2017/04/01 - [android] - 구글 firebase는 무엇인가? 제공하는 기능은?




firebase의 기능을 사용할때, 단순하게 SDK만 추가하면 되는것이 아니라, firebase console에서 설정을 추가하는 작업이 필요합니다. 


먼저 firebase console에 접속을 해서 프로젝트를 생성합니다. 

https://console.firebase.google.com/


저는 이름을 간단하게 firebaseChat 이라고 만들었습니다. 





project를 만들고 나면, 위그림과 같이 "Android 앱에 Firebase추가" 를 선택합니다. 

그러면 아래그림처럼 나오는데 packageName과 닉네임은 입력하면 되구요. 





중요한게 '디버그 서명 인증서 SHA-1(선택사항)' 인데요 


cmd 창에서 아래 명령으로 debug.keystore의 SHA-1 값을 구할수 있습니다. 



C:\Users\hanburn\.android>keytool -exportcert -alias androiddebugkey -keystore debug.keystore -list -v -storepass android



설명에도 있지만, firebase의 로그인기능, 동적링크, 초대등에 필요합니다. 

그 외의 기능만 사용한다면 입력하지 않아도 됩니다. 


팁: cmd 창에서 마우스 오른쪽클릭후 표시를 선택하면 마우스로 text를 선택할수 있습니다. 선택한뒤 마우스 오른쪽을 클릭하면 선택된 내용이 복사됩니다. notepad 등을 띄어서 붙어넣기 하면 SHA-1 값을 쉽게 복사할수 있습니다. 





그런후 오른쪽 하단의 파란버튼을 누르면 위 사진처럼 config 파일(google-service.json)을 다운받을수 있는 화면이 나옵니다.  다운받은 json 파일을 그림처럼 app/ 하위에 복사합니다. 



이제 마지막으로 build.gradle에 2줄을 추가하면 되는데요, 




먼저 제일 상위에 있는 build.gradle 파일에 

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
// 아래줄 추가
classpath 'com.google.gms:google-services:3.0.0'

}
}



다음으로 app/build.gradle 파일의 상단에 다음을 추가합니다.  

apply plugin: 'com.android.application'
// 아래줄 추가
apply plugin: 'com.google.gms.google-services'


이것으로 firebase 적용을 완료 하였습니다. 



이렇게 firebase console에서 프로젝트를 생성하고, App에 적용하기만 하면 firebase에서 기본적으로 제공하는 것들은 firebase console에서 확인 할 수 있습니다. 


* 가장 강력한 것은 analytics 인데요, 상단히 많은 정보를 제공하고 있습니다. 

* 추가로 crash-report 도 같이 제공하고 있습니다. 


다음에는 firebase에서 제공하는 다른 기능들을 하나씩 살펴보겠습니다. 





:

구글 firebase는 무엇인가? 제공하는 기능은?

android 2017. 4. 1. 01:38

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

2016년에 출시된 구글의 firebase에 대해서 알아 보자. 

firebase는 앱개발을 할때 필요한 도구와 인프라를 제공하기 위해서 구글에서 만들었다. 



초창기 안드로이드앱은 서버와 연동 없어 혼자 동작하는 기능의 앱이 많았다면, 요즘에는 앱혼자 동작하기 보다는 서버에서 데이터를 받아서 연동는 기능이 거의 필수처럼 구현되고 있는 상태이다. 그래서 구글에서는 앱개발자가 앱개발에만 전념할수 있도록 앱개발 이외의 모든것을 제공하기 위해서 firebase라는 이름으로 제공하고 있다. 

그럼 firebase에서 제공하는 것들은 어떤 것이 있는지 대략적으로 알아보자. 



이미지출처 : https://firebase.google.com/




위의 그림에서 보듯이, 크게 3가지의 카테고리로 제공하고 있다. 

구글에서 firebase를 사용하면 고품질의 앱을 빠르게 개발하고, 사용자층을 확대하고, 더많은 수익을 창출할 수 있는 모바일 플랫폼으로 설명하고 있다. 

이중에서 개발에 관련된것 위주로 간략하게 살펴보자. 



* Realtime Database 

 - On-line으로 제공되는 NoSQL DB 이다. 오프라인 모드를 지원하는 특징이 있다. 

 - 앱에서 하나의 DB를 보게되므로 여러 사용자에게 동기화된 데이터를 제공 가능하다. 

 - 리얼타임 데이터베이스를 사용하면 계시판등을 쉽게 만들수 있을것 같다. 



* Authentication

 - 로그인등의 인증을 제공하는데, Firebase에서제공하는 UI인증을 사용할수도 있고, 

 - Firebase SDK를 사용해서 로직 처리만 사용할 수도 있다. 

 - googke, facebook, twitter, github 와 제휴되어서 각각의 계정으로 로그인 인증을 제공한다. 

 


* Cloud Messaging 

 - 기존의 GCM(Google Cloud Messaging)이 FCM(Firebase Cloud Messaging)으로 이름이 변경된 것이다. 

 - 기존 push와 같은 알림메시지 뿐만이 아니라 데이터 메시지가 추가되었다. 

 - 메시지 전송시에도 기기별, 그룹별, 주제별로 타게팅 해서 보낼수 있다. 



* Storage 

 - 사용자의 사진, 동영상등의 컨텐츠를 저장할 수 있는 공간을 제공한다. 

 - 구글 클라우드 스토리지(Google Cloud Storage) 이다. 



* Hosting 

 - 웹 컨텐츠 호스팅 서비스로, global CDN을 제공한다.  

 - SSL을 기본적으로 제공한다. 

 - 앱개발보다는 웹개발에 적합한 도구로 보인다. 



* Remote Config 

 - 앱 업데이트 없이 어떤 변경을 동적으로 하고 싶을때 사용한다. 

 - GTM(Google Tag Manager)와 같은 방식으로 동작한다. 

 - 예를 들면, theme="white" 로 하면 앱의 전체적인 테마가 white계열로 보이다가, theme="black"으로 설정을 변경하면 앱이 black 계열로 변경되게 하는 것이다. 



* TestLab 

 - 일종의 AB테스트를 지원하는 기능이다. 

 - 예를 들으서 새로운 기능을 출시 할때, 전체 사용자가 아니라 일부 사용자에게만 시범적으로 먼저 사용해보고 피드백등을 받을수 있게 해준다. 

 - 피드백은 스크린샷, 로그, 동영상등으로 받을수 있다. 



* Crash Reporting 

 - 앱이 실행중 crash가 발생할때 어디서 죽었는지 callstack등을 제공한다. 

 - 또한 기기특성, 성능데이터 및 사용자 상황을 같이 제공해서 문제 해결을 도와준다. 



위에서 제공하는 기능들은 앱을 개발할때 필요한데, 서버개발이 필요한 부분이라서 firebase를 이용하면 상당한 도움이 될 것 같다. 제공하는 기능들이 앱개발시 필요한 것이고, 하나하나가 모두 유익한 것들이다. 


위에서 제공하는 기능들이 서로 연동되고 통합하는 중심에는 firebase의 꽃이라고 할 수 있는 Analytics가 존재한다. 


[Analytics] 

 - 기존의 GA(Google Analytics)가 웹페이지를 위한 목적으로 개발되었다면, FA(Firebase Analytics)는 앱을 목적으로 개발된 것이다. 

 - 사용자가 App을 사용하는 방식을 파악할 수 있다. 

 - 다양한 각도에서 여러가지 보고서를 제공한다. 

 - 중요한 것은 제한이 없는 무료라는 것이다.  ( GA는 light한 사용은 무료이고, 일정이상 사용하려면 유료 )

 - firebase 에서 제공하는 다른 기능들과 통합하여 여러가지 관리를 할 수 있다. 



중요한것 한가지를 빼먹었는데, firebase에서 제공하는 기능들 중에서 모두 무료로 제공하는건 아니다. 

Database, Storage, Hosting, TestLab , GoogleCloud Platform 등은 어느정도 까지만 무료로 제공한다. 

아래에서 무료로 지원하는 범위를 정리하였다. 


 Realtime Database

 동시접속

 100명

 저장용량

 1 GB

 다운로드

 10 GB / month

 Storage 

 저장용량

 5 GB

 다운로드

 1 GB / day

 업로드 횟수

 20,000 번 / day 

 다운로드 횟수

 50,000 번 / day

 Hosting

 저장용량 

  1 GB

 전송용량 

  10 GB / month


각각 기능들을 따로 제공하는 서비스들이 있는데, 각각 다른것을 이용하는 것보다 통합된 firebase를 사용하면 어떨까? 

실제 사용에 대한 판단은 사용하는 사람이~~  ( 저는 사용해보는 것에 한표~ ) 


이상으로 간단하게 firebase는 무엇이고, 어떤 기능들을 제공하는지 알아 봤습니다. 

다음으로는 간단하게 firebase를 적용하는 방법에 대해서 알아 보겠습니다. 


2017/04/03 - [android] - 구글 firebase 프로젝트 생성및 적용하기





:

App이 foreground 인지 background 인지 구별하기

android 2017. 3. 30. 22:24

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드 App을 만들다 보면은 App이 background로 내려가는 시점을 알아야 할 때가 있다. 

그런데, 안드로이드에서는 Home 버튼을 눌렀는지 알 수 있는 방법이 없어서 약간의 편법을 사용해야 한다. 



먼저 고전적인 방밥으로는 ActivityManager를 이용하는 방법이다. 

코드로 보면 아래와 같다. 


private boolean isAppIsInBackground(Context context) {
    boolean isInBackground = true;
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
        List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
            if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                for (String activeProcess : processInfo.pkgList) {
                    if (activeProcess.equals(context.getPackageName())) {
                        isInBackground = false;
                    }
                }
            }
        }
    } else {
        List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
        ComponentName componentInfo = taskInfo.get(0).topActivity;
        if (componentInfo.getPackageName().equals(context.getPackageName())) {
            isInBackground = false;
        }
    }

    return isInBackground;
}


키캣미만에서는 RunningTaksInfo를 이용하고, 키캣이상에서는 RunningAppProcessInfo 를 이용하는 방식이다. 그런데 이 방색을 사용할때는  GET_TASKS 권한을 AndroidManifest.xml에 추가해야 하는데,  GET_TASKS 권한이 deprecated 되었다. 



그래서 다른 방식으로 사용하는것이 Activity의 onStart(), onStop() 함수를 오버라이드(override) 해서 count 하는 방식이다. 대략적인 코드는 아래와 같은 모습이다. 


public class BaseActivity extends Activity {
public static int foregroundCount = 0; // 전역 count 변수

@Override
protected void onStart() {
    super.onStart();
    foregroundCount = foregroundCount+ 1;
}


@Override
protected void onStop() { super.onStop(); foregroundCount = foregroundCount - 1;
} }


Application에서 사용하는 모든 Activity가 BaseActivity를 상속받게 하고, foregroundCount 가 1이상이면 foreground로 볼 수 있는 것이다. 

Activity가 많다면 은근히 작업이 많아 질 수도 있고, 나주에 추가되는 Activity에서 BaseActivity 로부터의 상속을 빼먹으면 버그가 발생하기 쉬운 방식이다. 



그럼 좀 더 안전한 방법은 없을까? 

앱에있는 Application 클래스를 이용하는 방법이 있는데, 

먼저 background에 있는지 체크하는 방법을 알아보자 


public class MyApplication extends Application {
    // ...
    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (level == TRIM_MEMORY_UI_HIDDEN) {
           isBackground = true;
           notifyBackground();
        }
    }
}


그런데, onTrimMemory 함수는 screen off 상태일때는 호출이 안되므로, 아래처럼 리시버를 등록해서 체크해야 한다. (screen off 상태는 전원버튼을 눌러서 화면을 끄는것을 말한다. ) 


public class MyApplication extends Application {
  // ...
  @Override
    public void onCreate() {
        super.onCreate();
        // ...
        IntentFilter screenOffFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
              if (isBackground) {
                  isBackground = false;
                  notifyForeground();
              }
            }
        }, screenOffFilter);
      }
}


이렇게 하면 background 상태는 체크가 되는데, foreground 상태는 어떻게 알아 낼 수 있을까?

간단하게 ActivityLifecycleCallback() 함수를 이용하면 된다. 


public class MyApplication extends Application {
    // ...
    @Override
       public void onCreate() {
           super.onCreate();

     registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
               // ...
               @Override
               public void onActivityResumed(Activity activity) {
                 if (isBackground) {
                     isBackground = false;
                     notifyForeground();
                 }
               }
               // ...
           });
       }
       // ...
}



이상으로 App이 foreground에 있는지, background에 있는지 체크하는 방법에 대해서 

1. ActivityManager를 이용하는 고전적인 방법 

2. Activity의 onStart(), onStop() 을 활용한 방법

3. Application의 onTrimMemory(), registerActivityLifecycleCallbacks() 를 활용하는 방법

으로 알아 보았습니다. 





:

android face detecting ( FaceDetector vs google-play-vision )

android 2015. 10. 14. 15:02

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

먼저 혼동하기 쉬운 얼굴인식과 얼굴검출에 대해서 간단하게 짚고 넘어가면..

얼굴검출(face detect)은 이미지에서 얼굴이 어느 영역에 있는지 찾는 것이고

얼굴인식(face recognize)A라는 얼굴과 B라는 얼굴이 유사한지 또는 같은 사람인지 판별하는 것이다.

 

안드로이드에서 face dectect을 하기 위해서는 2가지 방식이 있다.

첫번째는 , Image 소스에서 얼굴을 검출(dectect)하는 android.media.FaceDetector 를 이용하는 방법

두번째는, live stream 소스에서 얼굴을 검출하는 Camera.FaceDetectionListener 를 이용하는 방법

 

Android 에서 얼굴검출을 위해서 3rd party library를 사용하지 않는다면 어쩔수 없이 사용하는 FaceDetector API level 1 부터 사용가능하데, 그래서 그런지 결과나 성능에서 상당히 떨어진다. 그리고 FaceDetector를 사용할때는 한가지 주의 할점이 입력 Bitmap RGB_565 타입을 넘겨야 한다. 대략적인 코드는 아래와 같다.

 

android.media.FaceDetector.Face[] scaledFaces = new android.media.FaceDetector.Face[1]; // 얼굴 1개만 인식
Bitmap inputBitmap = buildScaledFace565Bitmap(imageBitmap);
android.media.FaceDetector faceDetector = new android.media.FaceDetector(inputBitmap.getWidth(), inputBitmap.getHeight(), 1);
faceDetector.findFaces(inputBitmap, scaledFaces);

 

그리고 입력 bitmap의 크기가 커질수로 수행시간이 기하급수적으로 늘어난다. 그리고 detecting된 정보도 두 눈사이의 중점 Point, 중점 Point에서 눈사이의 거리 정보만 준다. 즉 얼굴영역(Rect)는 알려주지 않는다.

 

그래서 2015 8월에 google에서 google-play-vision library를 발표했는데, 무척이나 좋다.

간단하게 media.FaceDetector와 비교해본 테스트 성능은 아래와 같다.

 

갤럭시 S4단말

사진크기

FaceDetector 시간

Vision 시간

460 * 560

224ms

154ms

960 * 960

705ms

305ms

1920 * 1200

2380ms

350ms

 

성능도 좋지만 결과 품질도 상당히 좋다. 주요한 장점을 설명하면 아래와 같다.

 

1.     얼굴영역(left/right 정보, width, height)를 알려준다.

 

·                     getPosition() - Returns the top left coordinates of the area where a face was detected

·                     getWidth() - Returns the width of the area where a face was detected

·                     getHeight() - Returns the height of the area where a face was detected

 

 

2.     얼굴이 기울어저 있어도 검출된다.



위그림처럼 y축 기준으로 60도 회전된 얼굴과, xy평면을 기준으로 45도 회전된 얼굴까지 검출이가능하다. 기존 android.media.FaceDetector에 비하면 비약적인 발전으로 보인다. ^^;

 

3.     얼굴의 다양한 특징 포인트를 알려준다.

얼굴의 특징 포인트를 Landmark로 부르는데, 코드에 아래처럼 정의 되어 있다.

public static final int BOTTOM_MOUTH = 0;
public static final int
LEFT_CHEEK = 1;
public static final int
LEFT_EAR_TIP = 2;
public static final int
LEFT_EAR = 3;
public static final int
LEFT_EYE = 4;
public static final int
LEFT_MOUTH = 5;
public static final int
NOSE_BASE = 6;
public static final int
RIGHT_CHEEK = 7;
public static final int
RIGHT_EAR_TIP = 8;
public static final int
RIGHT_EAR = 9;
public static final int
RIGHT_EYE = 10;
public static final int
RIGHT_MOUTH = 11;

 

두눈위치, 입위치, 볼위치, 코위치, 귀위치 등 얼굴에 대해서 상세한 정보를 줄 수 있는데, 물로 검출에 성공한 경우에만 Landmark 위치를 알 수 있다. 실제로 테스트 해보면 귀위치는 잘 안나온다.

 


Image에서 얼굴검출할 때 사용하면 상당히 유용할 듯 한다. 추가로 FaceTracking(live로 얼굴을 검출하고 얼굴이 이동하면 따라가면서 계속 검출하는)도 가능하다. 하지만 FaceTrackinginput 크기가 클 경우 FPS가 잘 안나온다.

 

[관련자료]

https://developers.google.com/vision/face-detection-concepts

http://android-developers.blogspot.kr/2015/08/google-play-services-78-lets-see-whats.html

https://github.com/googlesamples/android-vision


 

 


 

 

 



: