Authentication과 Authorization 차이

|

Authentication과 Authorization를 많이 섞어서 쓰거나 혼동해서 쓰는 경우가 많은데, 이 둘의 차이가 무엇인지 포스팅해보도록 하겠습니다.

간단히 한 단어로 각각을 설명하면 다음과 같습니다.

Authentication : 인증
Authorization : 인가

좀 더 설명을 해보면, Authentication은 로그인(Login)과 같이 자신을 인증하는 것이고, Authorization은 로그인한 그 사람이 관리자(Admin)인지 일반 사용자인지, 게스트인지 구분하는 것이라고 생각할 수 있습니다.

그리고 추가적으로 Certification은 특정 기관의 인증, 심사를 통과한 인증을 말합니다.

Windows 10 - Bash 설치

|

Windows 10에서 Bash를 설치하는 방법

2016년 봄부터 윈도우 10에서 Bash를 사용할 수 있도록 제공하고 있습니다. 하지만, 아직 정식 지원은 아니며 개발자 모드를 활성화해야만 사용할 수 있습니다. 더 자세한 내용은 여기에서 확인할 수 있습니다.


Bash를 사용하기 위한 최소 사양

  • Build 14316 이후
  • 64 bit 운영체제

시스템 정보에서 내 PC가 요구 사양을 만족하는지 확인 할 수 있습니다.

image


설치 방법

먼저 개발자 모드를 설정합니다.

모든 설정 → 업데이트 및 복구 → 개발자용

image

Windows 기능 켜기/끄기에서 ‘Linux용 Windows 하위 시스템(베타)’를 설치합니다.

제어판 → 프로그램 제거 및 변경

image

image

명령 프롬프트 창에서 bash를 실행합니다.

image

이제 bash가 설치 완료되었습니다.

Eclipse 실행 할 때 Failed to create the Java Virtual Machine 오류 뜰 때

|

이제는 Android Studio 만을 사용하고 있어서 거의 필요가 없는 글일 수도 있지만, 가끔씩 Eclipse를 사용해야 할 경우도 있어서(과거에 작성한 프로젝트를 수행한다거나) 포스팅을 해봅니다. Eclipse를 사용하다가 가끔씩 Failed to create the Java Virtual Machine 오류가 뜨는 경우가 있습니다.

이런 경우는 Eclipse가 있는 폴더에 가서 eclipse.ini 파일을 수정해주면 됩니다. (하지만, 역시 Eclipse에서 Android Studio로 갈아타는게 제일 좋은거 같습니다.)


수정 전 eclipse.ini

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120522-1813
-product
com.android.ide.eclipse.adt.package.product
--launcher.XXMaxPermSize
256M
-showsplash
com.android.ide.eclipse.adt.package.product
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms40m
-Xmx768m
-Declipse.buildId=v21.0.1-543035


수정 후 eclipse.ini

-startup

plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120522-1813
-product
com.android.ide.eclipse.adt.package.product
--launcher.XXMaxPermSize
128M
-showsplash
com.android.ide.eclipse.adt.package.product
--launcher.XXMaxPermSize
128m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms40m
-Xmx768m
-Declipse.buildId=v21.0.1-543035

Application의 설치 또는 삭제 이벤트 획득하기

|

안드로이드에서 어플리케이션(이하 App)을 설치하거나 삭제할 때는 그 이벤트가 Broadcast로 전달됩니다. 즉, BroadcastReceiver를 등록해놓은 각 App들의 설치/삭제 이벤트를 수신할 수 있습니다.


AndroidManifest.xml

manifest.xml에 다음과 같이 BroadcastReceiver를 추가해줍니다.

<receiver android:name=".PackageEventReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED"/>
        <action android:name="android.intent.action.PACKAGE_REMOVED"/>
        <action android:name="android.intent.action.PACKAGE_REPLACED"/>
        <data android:scheme="package"/>
    </intent-filter>
</receiver>


PackageEventReceiver.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import android.util.Log;

public class PackageEventReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    String packageName = intent.getData().getSchemeSpecificPart();
    String action = intent.getAction();

    if(action.equals(Intent.ACTION_PACKAGE_ADDED)) {
      Log.d("", "[snowdeer] Package ADDED : " + packageName);
    } else if(action.equals(Intent.ACTION_PACKAGE_REMOVED)) {
      Log.d("", "[snowdeer] Package REMOVED : " + packageName);
    }
  }
}


Event Receiver 등록

private PackageEventReceiver mPackageEventReceiver = new PackageEventReceiver();

private void registerPackageEventReceiver() {
  registerReceiver(mPackageEventReceiver, new IntentFilter(Intent.ACTION_PACKAGE_ADDED));
}


또는 다음과 같은 코드를 이용해서 등록하면 됩니다.

private PackageEventReceiver mPackageEventReceiver = new PackageEventReceiver();

private void registerPackageEventReceiver() {
  IntentFilter intentFilter = new IntentFilter();
  intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
  intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL);
  intentFilter.addDataScheme("package");
  registerReceiver(mPackageEventReceiver, intentFilter);
}

App Intro(가이드 도움말) 화면 꾸미기

|

일반적인 AppIntro 화면은 대략 다음과 같은 형태를 하고 있습니다.

image

많은 사람들이 사용하고 있는 오픈소스가 있으며, 여기에서 확인할 수 있습니다.

Dependency 설정

Android Studio에서는 간단히 gradle에 다음 라인만 추가하면 AppIntro 컴포넌트를 사용할 수 있습니다.

dependencies {
    compile 'com.github.paolorotolo:appintro:4.1.0'
}


사용하는 코드는 다음과 같습니다. AppIntro 클래스를 상속받은 Activity를 구현하면 됩니다. 그리고 중요한 점은 onCreate() 함수 내에서 setContentView() 함수는 지워야 한다는 점입니다. 각각의 Intro 화면들은 Fragment를 상속받아서 구현할 수 있습니다.

SplashActivity.java

import android.content.Intent;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

import com.github.paolorotolo.appintro.AppIntro;

public class SplashActivity extends AppIntro {

  Fragment mSplash1 = new SplashFragment1();
  Fragment mSplash2 = new SplashFragment2();
  Fragment mSplash3 = new SplashFragment3();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_splash);

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      Window w = getWindow(); // in Activity's onCreate() for instance
      w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
          WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }

    addSlide(mSplash1);
    addSlide(mSplash2);
    addSlide(mSplash3);
  }

  @Override
  public void onSkipPressed(Fragment currentFragment) {
    super.onSkipPressed(currentFragment);
    startMainActivity();
  }

  @Override
  public void onDonePressed(Fragment currentFragment) {
    super.onDonePressed(currentFragment);
    startMainActivity();
  }

  @Override
  public void onSlideChanged(@Nullable Fragment oldFragment,
      @Nullable Fragment newFragment) {
    super.onSlideChanged(oldFragment, newFragment);
  }

  @Override
  protected void onResume() {
    super.onResume();
  }

  private void startMainActivity() {
    Intent intent = new Intent(SplashActivity.this, MainActivity.class);
    startActivity(intent);
    finish();
  }
}