카테고리 보관물: Tools

Robo 3T (Robomongo) 설치 on Ubuntu 16.04

Robo 3T는 Robomongo의 새로운 이름으로 아주 유용하게 사용할 수 있는 몽고디비 클라이언트 툴이다. 간단하게 설치하는 방법을 살펴보면 아래와 같다.

1. 다운로드
https://www.robomongo.org/download 에서 플랫폼 버전에 맞게 다운로드한다. 여기에서는 Linux를 선택한다.

2. 다운받은 파일을 필요한 위치에 이동시키고, 압축을 푼다.
mcsong@mcsong-ubuntu:~/Downloads$ mv robo3t-1.1.1-linux-x86_64-c93c6b0.tar.gz ../dev/
mcsong@mcsong-ubuntu:~/dev$ tar xvfz robo3t-1.1.1-linux-x86_64-c93c6b0.tar.gz

3. 링크파일을 패스가 잡혀있는 폴더에 생성한다.
mcsong@mcsong-ubuntu:~/dev/robo3t-1.1.1-linux-x86_64-c93c6b0/bin$ sudo ln -s /home/mcsong/dev/robo3t-1.1.1-linux-x86_64-c93c6b0/bin/robo3t /usr/local/bin/robo3t

4. 이제 실행해서 아래와 같이 연결을 추가하고 사용하면 된다. 

4.1 만약 아래와 같이 에러가 발생한다면..
mcsong@mcsong-ubuntu:~/dev/robo3t-1.1.1-linux-x86_64-c93c6b0/bin$ robo3t
This application failed to start because it could not find or load the Qt platform plugin "xcb"
in "".

Available platform plugins are: xcb.

Reinstalling the application may fix this problem.
Aborted (core dumped)

설치한 폴더의 lib 폴더에서 아래의 파일들을 삭제하면 된다.

libstdc++.so.6
libstdc++.so.6.0.22

안드로이드 지원(support) 라이브러리 구글 메이븐 리파지토리

구글이 지원(support) 라이브러리 다운로드를 위해서 자체 메이븐 리파지토리를 구축해서 25.4.0 버전부터는 구글의 메이븐 리파지토리에서 다운로드 받을 수 있다. 주소는 maven.google.com 이다. 그래서 안드로이드 프로젝트 build.xml 파일에 아래와 같이 구글의 리파지토리도 추가한다.

allprojects {
  repositories {
  jcenter()
  maven { url "https://jitpack.io" }
  maven { url "https://maven.google.com" }
  }
}

https://maven.google.com에 접속하면 https://dl.google.com/dl/android/maven2/ 로 리다이렉트 된다. 구글 메이븐 리파지토리는 서버에서 리스팅 기능을 제공하지 않아서 호스팅 하는 전체 라이브러리를 볼 수 가 없다.

그래서 지원 라이브러리 중에 appcompat-v7 에 대해서 약간의 정보를 살펴봤다.

메타 데이터 정보
https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/maven-metadata.xml

라이브러리 파일
https://dl.google.com/dl/android/maven2/com/android/support/appcompat-v7/25.4.0/appcompat-v7-25.4.0.aar

그리고, 구글 지원 라이브러리 종류는 아래에서 확인할 수 있고, 위의 패턴으로 개별 라이브러리를 확인할 수 있다.
https://developer.android.com/topic/libraries/support-library/packages.html

안드로이드 페브릭(Fabric) 그래들(Gradle) 플러그인 버전 지정하기

페브릭(Fabric)은 아주 유용한 기능을 모바일 플랫폼에 쉽게 적용할 수 있게 도와주는 서비스이다. Crashlytics도 페브릭에서 제공하는 크래시 리포트 서비스이다. Crashlytics을 안드로이드에서 사용하는 방법은 fabric.io/kits/android/crashlytics/install 에서 확인할 수 있다. 여기에서 아래의 아래의 코드를 추가하라고 한다.

buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}

dependencies {
// These docs use an open ended version so that our plugin
// can be updated quickly in response to Android tooling updates

// We recommend changing it to the latest version from our changelog:
// https://docs.fabric.io/android/changelog.html#fabric-gradle-plugin
classpath 'io.fabric.tools:gradle:1.+'
}
}

위 코드를 보면 알겠지만, 페브릭의 그래들 플러그인 버전이 ‘io.fabric.tools:gradle:1.+’로 선언되어 있다. 주석을 읽어보면 알겠지만, docs.fabric.io/android/changelog.html#fabric-gradle-plugin 에서 최신 버전으로 수정하라고 한다. 이 문서를 보면, 아래와 같이 최신 버전을 확인할 수 있고, 변경 내용도 확인할 수 있다.

2017년 6월 14일에 확인해 본 결과로 1.22.2 버전이 최신버전이다.

위 과정에 더불어, 페브릭 그래들 플러그인에 대한 메타 정보는 아래 URL에서 확인할 수 있다.
fabric-artifacts.s3.amazonaws.com/public/io/fabric/tools/gradle/maven-metadata.xml

위 이미지에서 최신 버전 릴리즈 시점이 2017년 05월 31일 이라는 것도 알 수 있다.

결론으로 app 모듈에서 build.gradle 파일의 맨 처음은 아래와 같은 모습이 될 것이다.

buildscript {
    repositories {
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'

        classpath 'io.fabric.tools:gradle:1.22.2'
    }
}

유용한 안드로이드 스튜디오 플러그인 소개

이 글에서는 안드로이드 스튜디오를 사용하면서 안드로이드 앱 개발에 유용한 플러그인을 몇 개 살펴본다. 여기에서 살펴보는 플러그인은 개인적으로 즐겨 사용하는 것으로, 개발시간을 단축하고 안드로이드 스튜디오를 더 편리하게 사용하도록 한다.

1. CodeGlance

이 플러그인은 서브라임 텍스트(Sublime Text)의 우측에 볼 수 있는 코드의 미니 맵을 편집기에 추가하는 플러그인이다. 플러그인 프로젝트에 밝은 테마와 어두운 테마 모두를 지원한다고 나와 있다.
– 플러그인 주소 : https://plugins.jetbrains.com/plugin/7275-codeglance
– 프로젝트 주소 : https://github.com/Vektah/CodeGlance

1.1 설치방법
File > Settings… > IDE Settings > Plugins > Browse repositories 에서 CodeGlan을 검색해서 설치한다.

1.2 사용방법
설치를 완료하고 재시작하면, 편집기 우측에 코드의 미니맵이 나타나는 것을 확인할 수 있다.

2. WIFI ADB ULTIMATE

이 플러그인은 USB로 안드로이드 기기에 연결하지 않고도, 같은 네트워크(WIFI)를 사용하는 안드로이드 기기에 ADB로 연결을 지원하는 도구이다.

플러그인 주소 : https://plugins.jetbrains.com/plugin/9207-wifi-adb-ultimate
프로젝트 주소 : https://github.com/huazhouwang/WIFIADB

2.1 설치방법
File > Settings… > IDE Settings > Plugins > Browse repositories 에서 wifi를 검색해서, 화면에 선택된 플러그인을 설치한다.

2.2 사용방법
안드로이드 스튜디오 우측에 “WIFI ADB ULTIMATE”을 클릭하면 아래의 화면이 나온다. 이 화면에서 안드로이드 기기의 IP를 확인하고 초록색 버튼을 클릭하면 연결된 원격 기기에 기기가 나타나는 것을 확인할 수 있다.

3. Parcelable code generator

이 플러그인은 클래스의 변수를 기준으로 Parcelable 인터페이스 구현 코드를 생성하는 도구이다.

플러그인 주소 : https://plugins.jetbrains.com/plugin/7332-android-parcelable-code-generator
프로젝트 주소 : https://github.com/mcharmas/android-parcelable-intellij-plugin

3.1 설치방법
File > Settings… > IDE Settings > Plugins > Browse repositories 에서 parcel를 검색해서 아래 화면에 선택된 플러그인을 설치한다.

3.2 사용방법
아래의 이미지에서 사용하는 방법을 쉽게 알 수 있다. 편집기에서 마우스 우측 클릭 > Generate… > Parceable을 선택해서 코드를 생성한다.

4. Android Material Design Icon Generator Plugin

이 플러그인은 머터리얼 디자인 아이콘을 앱에서 사용하기 쉽게 도와주는 도구이다.

플러그인 주소 : https://plugins.jetbrains.com/plugin/7647-android-material-design-icon-generator
프로젝트 주소 : https://github.com/konifar/android-material-design-icon-generator-plugin

4.1 설치 방법
File > Settings… > IDE Settings > Plugins > Browse repositories 에서 material을 검색해서 설치한다.

4.2 사용방법
File > New > Material Design Icon을 선택해서 아이콘을 생성할 수 있다.

5. Findbugs

이 플러그인은 즐겨 사용하는 정적 코드 분석 도구로, 안드로이드 스튜디오에서도 쉽게 사용할 수 있다.

플러그인 주소 : https://plugins.jetbrains.com/plugin/3847-findbugs-idea
프로젝트 주소 : http://andrepdo.github.io/findbugs-idea/

5.1 설치 방법
File > Settings… > IDE Settings > Plugins > Browse repositories 에서 findbug를 검색해서 설치한다.

5.2 사용 방법
프로젝트의 모듈로 이동해서 마우스 우측을 선택해서, FindBugs 메뉴를 선택해서 정적 분석을 시작한다.

아래의 화면은 룰에 위반되는 사례를 FindBugs가 분석한 항목들에 대한 화면이다. 이 개별 항목들이 반드시 버그가 아니지만, 그래도 확인해볼 필요가 있겠다.

6. ColorManager

이 플러그인은 안드로이드 스튜디오의 리소스 파일에서 컬러 색을 좀 더 잘 보여주는 도구이다.

플러그인 주소 : https://plugins.jetbrains.com/plugin/8583-android-color-manager
프로젝트 주소 : https://github.com/shiraji/color-manager

6.1 설치방법
File > Settings… > IDE Settings > Plugins > Browse repositories 에서 color mana를 검색해서 설치한다.

6.2 사용방법
안드로이드 프로젝트 리소스 폴더에 있는 colors.xml을 열고, 우측의 탭에서 “Color Manager”를 선택하면 아래의 화면을 볼 수 있다. 이 플러그인이 머터리얼 컬러의 종류와 색을 화면에 다 보여주기 때문에, 색을 확인하기 위해서 구글 머터리얼 사이트에 접속하지 않아도 된다.

7. Android API Level Plugin

이 플러그인은 안드로이드 API 레벨과 버전 이름을 보여주는 도구이다. 여기에서 살펴본 플러그인들 중에 가장 간단하지만 아주 유용하게 사용될 수 있다.

플러그인 주소 : https://plugins.jetbrains.com/plugin/8121-android-api-level
프로젝트 주소 : https://github.com/droibit/androidapilevel-plugin

7.1 설치방법
File > Settings… > IDE Settings > Plugins > Browse repositories 에서 “Android API Level”를 검색해서 설치한다.

7.2 사용방법
툴바에 안드로이드 아이콘이 한개 추가된 것을 알 수 있다. 아래와 같이 이 버튼을 클릭하면 안드로이드 API의 레벨과 버전등을 보여주는 화면을 아래와 같이 보게 된다.

이상 안드로이드 앱을 개발하면서 유용하게 사용하는 플러그인 몇 개를 살펴봤다. 이 플러그인을 사용해서 개발에 도움이 되었으면 좋겠다.

버터나이프(ButterKnife)를 사용한 효율적인 추상화

대부분 프로젝트에서 소스의 양은 복잡도와 밀접한 관계가 있다. 그래서 OOP 언어에서는 공통 로직의 추상화와 모듈화로 소스의 복잡도를 줄이는 방향으로 가이드하고 있다는 것을 알 수 있다. 자바언어는 도메인에 특화된 여러 프레임웍이 제공하는 의존성 주입(DI)을 사용해서 코드의 복잡도를 줄이고 있다.

안드로이드 앱 프로젝트 또한 프레임웍 기반에서 개발한다. 그래서 안드로이드 프로젝트를 지원하는 각종 라이브러리가 존재하지만 프레임웍은 존재하지 않는 이유이기도 하다. 그래서 대부분의 의존성을 주입하는 라이브러리들은 어노테이션으로 컴파일 타임에 코드를 생성하는 형태이다. 이 형태는 런타임에 의존성 주입을 하는 형태보다 성능상의 이점이 있어서 표준처럼 사용하고 있다.

의존성 주입을 지원하는 대표 라이브러리로 버터나이프(ButterKnife)와 대거(Dagger)가 있다. 개인적으로도 버터나이프를 사용하고 있고, 안드로이드 프로젝트를 시작할 때에 처음 사용하는 라이브러리이다. 그래서 이 라이브러리를 사용해서, 비교적 좋은 형태의 추상화 예제를 살펴보겠다.

아래 예제는 안드로이드 프로젝트에서의 가장 많은 템플릿(Boilerplate) 코드로 뷰(View)에서 위젯(Widget)을 로드하는 예제이다. 아래 예제에서 액티비티(Activity)와 프레그먼트(Fragment)에서 어떻게 사용하고, 개선하는지 살펴보자.

1. 안드로이드 기본 예제

아래는 안드로이드 앱에서 많이 사용하는 액티비티와 프레그먼트의 예제이다.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

/**
 * Created by mcsong@gmail.com on 2016-11-14.
 */
public class MainActivity extends AppCompatActivity {

	private TextView tv01;
	private TextView tv02;
	private TextView tv03;
	private TextView tv04;

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

		tv01 = (TextView) findViewById(R.id.activity_main_tv_01);
		tv02 = (TextView) findViewById(R.id.activity_main_tv_02);
		tv03 = (TextView) findViewById(R.id.activity_main_tv_03);
		tv04 = (TextView) findViewById(R.id.activity_main_tv_04);
	}
}

액티비티 예제

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * Created by mcsong@gmail.com on 2016-11-14.
 */

public class MainFragment extends Fragment {

	private TextView tv01;
	private TextView tv02;
	private TextView tv03;
	private TextView tv04;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment_main, parent, false);

		tv01 = (TextView)view.findViewById(R.id.fragment_exview_tv_01);
		tv02 = (TextView)view.findViewById(R.id.fragment_exview_tv_02);
		tv03 = (TextView)view.findViewById(R.id.fragment_exview_tv_03);
		tv04 = (TextView)view.findViewById(R.id.fragment_exview_tv_04);

		return view;
	}

}

프레그먼트 예제

위 예제들은 findViewId() 메서드를 사용해서 화면에 배치한 위젯을 로드하는 예제이다. 이 형태로 화면에서 많은 위젯을 로드하면, 코드의 양도 그만큼 늘어난다.

2. 버터나이프(Butterknife) 예제

버터나이프를 사용해서 액티비티나 프레그먼트에서 화면을 로드하는 예제이다.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import net.sjava.example.abstraction.R;

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * Created by mcsong@gmail.com on 2016-11-14.
 */

public class ButterknifeActivity extends AppCompatActivity {

	@BindView(R.id.activity_main_tv_01) TextView tv01;
	@BindView(R.id.activity_main_tv_02) TextView tv02;
	@BindView(R.id.activity_main_tv_03) TextView tv03;
	@BindView(R.id.activity_main_tv_04) TextView tv04;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ButterKnife.bind(this);
	}
}

액티비티 예제

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import net.sjava.example.abstraction.R;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;

/**
 * Created by mcsong@gmail.com on 2016-11-14.
 */

public class ButterknifeFragment extends Fragment {
	@BindView(R.id.fragment_exview_tv_01) TextView tv01;
	@BindView(R.id.fragment_exview_tv_02) TextView tv02;
	@BindView(R.id.fragment_exview_tv_03) TextView tv03;
	@BindView(R.id.fragment_exview_tv_04) TextView tv04;

	private Unbinder unbinder;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment_main, parent, false);
		unbinder = ButterKnife.bind(this, view);
		return view;
	}

	@Override
	public void onDestroyView() {
		super.onDestroyView();
		unbinder.unbind();
	}
}

프레그먼트 예제

버터나이프 예제들은 @BindView 어노테이션을 사용해서 화면의 위젯을 로드한다. 이 예로 위의 안드로이드 기본 예제보다 약간의 수고를 덜 수 있다.

3. 버터나이프 추상화 예제

버터나이프를 사용해서 액티비티와 프레그먼트에서 추상화하는 예제와 추상화한 액티비티와 프레그먼트를 사용하는 예를 살펴보자.

3.1 추상화 예제

import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.v7.app.AppCompatActivity;

import butterknife.ButterKnife;

/**
 * Created by mcsong@gmail.com on 2016-11-14.
 */
public abstract class AbsBaseActivity extends AppCompatActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(getLayoutId());
		ButterKnife.bind(this);
	}

	@LayoutRes
	public abstract int getLayoutId();
}

추상화 액티비티 예제

이 추상화한 클래스는 abstract 클래스로 이 클래스를 상속하는 클래스는 getLayoutId() 메서드를 구현하게 만든다. 이 메서드에서는 액티비티의 화면인 xml 파일의 id를 반환하도록 한다.


import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import butterknife.ButterKnife;
import butterknife.Unbinder;

/**
 * Created by mcsong@gmail.com on 2016-11-14.
 */

public abstract class AbsBaseFragment extends Fragment {

	Unbinder mUnbinder;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		View view = inflater.inflate(getLayoutId(), container, false);
		mUnbinder = ButterKnife.bind(this, view);
		return view;
	}

	@LayoutRes
	public abstract int getLayoutId();

	@Override
	public void onDestroyView() {
		super.onDestroyView();
		mUnbinder.unbind();
	}
}

추상화 프레그먼트 예제

이 추상화한 프레그먼트는 추상화한 액티비티의 getLayoutId()와 더불어, onDestroyView() 메서드에서 버터나이프로 읽어들인 뷰를 제거하는 메서드를 추가했다.

3.2 사용 예제

import android.os.Bundle;
import android.widget.TextView;
import net.sjava.example.abstraction.R;

import butterknife.BindView;

/**
 * Created by mcsong@gmail.com on 2016-11-14.
 */

public class ButterknifeMainActivity extends AbsBaseActivity {

	@BindView(R.id.activity_main_tv_01) TextView tv01;
	@BindView(R.id.activity_main_tv_02) TextView tv02;
	@BindView(R.id.activity_main_tv_03) TextView tv03;
	@BindView(R.id.activity_main_tv_04) TextView tv04;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}

	@Override
	public int getLayoutId() {
		return R.layout.activity_main;
	}
}

액티비티 예제

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import net.sjava.example.abstraction.R;

import butterknife.BindView;

/**
 * Created by mcsong@gmail.com on 2016-11-14.
 */

public class ButterknifeMainFragment extends Fragment {
	@BindView(R.id.fragment_exview_tv_01) TextView tv01;
	@BindView(R.id.fragment_exview_tv_02) TextView tv02;
	@BindView(R.id.fragment_exview_tv_03) TextView tv03;
	@BindView(R.id.fragment_exview_tv_04) TextView tv04;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
		return super.onCreateView(inflater, parent, savedInstanceState);
	}
}

프레그먼트 예제

* 예제 코드 : https://github.com/mcsong/AbstractionExample
이 글에서 버터나이프를 사용해서 비교적 효율적으로 추상화해서 사용하는 방법을 살펴봤다.