블로그가 이전되었습니다.

http://blog.bsk.im/2015/08/18/introducing-android-design-support-library/ 에서 확인해 주세요.


Cover image by Manual


Material Design

머티리얼 디자인은 Google I/O 2014에서 안드로이드 5.0(롤리팝)과 함께 처음 소개된 구글의 디자인 철학이자 가이드라인입니다. 모바일 뿐만 아니라 데스크탑을 아우르는 새로운 디자인 가이드라인을 제시하므로써 이전까지 구글이 내놓은 여러가지 제품에서 다소 제각각이었던 디자인들을 일관된 디자인으로 재편함으로써 통일된 UI/UX를 제공하겠다는 것이 목적입니다.

저는 머티리얼 디자인을 매우 좋아합니다. 플랫폼에 상관없이 매우 일관성 있는 디자인 경험을 제공할 뿐만 아니라, 가이드라인이 잘 제시되어 있어 적용하기 쉽고, 미려하기 때문이죠.

머티리얼 디자인에서 표면과 그림자는 물리적인 구조를 형성하여, 사용자들이 화면 상의 어떤 부분을 터치할 수 있고 움직일 수 있는지 쉽게 이해할 수 있도록 돕습니다. 현대적인 출판물 디자인 원칙이 반영되어 다른 부가 요소보다 컨텐츠 자체가 강조됩니다. 모든 움직임에는 의미가 있으며, 화면 요소들 간의 관계를 명확히 하고 세세한 디테일을 통해 사용자에게 이러한 관계를 알려줍니다.

"구글 디벨로퍼 코리아 블로그 - 머티리얼 디자인 (Material Design) 이란?"

머티리얼 디자인에 대한 간단한 설명은 "구글 디벨로퍼 코리아 블로그 - 머티리얼 디자인 (Material Design) 이란?"을, 머티리얼 디자인을 적용하기 위한 가이드라인은 Google Design을 참고하세요.

안드로이드와 머티리얼 디자인

I/O 2014에서 머티리얼 디자인과 함께 공개된 롤리팝에서는 기본적으로 이 새로운 머티리얼 디자인이 적용되어 있습니다.

Android 5.0 Lollipop Showcase from Android Central.

하지만 문제는 이 머티리얼 디자인을 직접 안드로이드 앱 개발에 구현하는 것이 매우 어렵다는 점이었습니다. v7-appcompat, cardview, recyclerview 등 일부 머티리얼 디자인을 적용하기 위한 서포트 라이브러리가 제공되었지만 그 기능이나 요소들이 매우 제한적이어서 별도의 커스텀 라이브러리를 사용해야 했습니다. 심지어 구글에서 만든 앱들조차도 제각각 다른 형태로 머티리얼 디자인을 적용하는 모습을 보여주었습니다.

안드로이드 디자인 서포트 라이브러리

개발자들의 이런 불만을 들어준 것일까요? 구글은 이번 Google I/O 2015에서 머티리얼 디자인을 더욱 쉽게 적용할 수 있는 'Android Design Support Library'를 공개했습니다. 덕분에 개발자들은 자신들의 앱에 머티리얼 디자인을 통일된 방식으로 좀 더 쉽게 적용할 수 있게 되었습니다. 이렇게 된 이상, 머티리얼 디자인을 적용하지 않을 이유는 없겠죠?

이제 빨리 이번 안드로이드 디자인 서포트 라이브러리에 포함된 요소들을 차례로 살펴보고, 이들을 어떻게 구현할지 간단히 소개해 보겠습니다.

시작하기

간단합니다. 다른 라이브러리들처럼 gradle에 dependency를 등록해 줍니다. 
compile 'com.android.support:design:22.2.0'

물론 그 전에 SDK Manager를 통해서 Android Support Repository를 꼭 업데이트해야 합니다.

아직도 이클립스를 쓰시는 분들, 이제는 정말 안드로이드 스튜디오, 혹은 안드로이드 스튜디오의 기반이 되는 Intellij로 옮겨가실 때가 되었습니다. 이미 이클립스에 대한 SDK의 공식 지원이 끊긴지도 오래 되었습니다. 여기에서부터 천천히 시작해 보세요.

Snackbar

레퍼런스 / 디자인 가이드

Snackbar는 Toast와 비슷하게 화면 하단에 간단한 메시지를 통해 어떤 동작에 대한 피드백을 줄 수 있는 요소입니다. 대부분의 동작와 사용법은 Toast와 비슷하지만, 화면 하단에 붙어 표시된다는 점과 메시지와 함께 액션(Action)을 포함할 수 있다는 점에서 차이가 있습니다.

표시되고 나면 사용자들은 (액션이 있는 경우) 액션을 취하거나, 좌우로 스와이프(swipe-to-dismiss)하여 스낵바를 숨길 수 있습니다. 물론 일정 시간이 지나면 스낵바는 자동으로 사라집니다.

 
Snackbar에는 액션을 추가할 수 있고, 나타나고 사라질때 애니메이션 효과가 적용됩니다. 
from Google Material Design Guideline


물론 액션 없이 그냥 메시지만 표시할 수도 있습니다. 
from Google Material Design Guideline

구현은 매우 간단합니다.

Snackbar.make(parentLayout, R.string.snackbar_text, Snackbar.LENGTH_LONG)  
  .setAction(R.string.snackbar_action, myOnClickListener)
  .show(); // show 까먹지 마세요!

Toast랑 무지 비슷하죠? 다만 차이점은 첫번째 인자로 view를 넘겨준다는 점입니다. 화면에 표시되고 있는 view중 아무거나 넣어 주면 Snackbar가 알아서 적당한 parent view를 찾아 Snackbar를 표시해줍니다.

혹시 기존의 Toast를 Snackbar로 옮기는 과정에서 view가 생성되기 전에 Snackbar를 보여주려고 한다면 당연히 문제가 생기게 됩니다. 이미 Activity의 View는 만들어졌지만, 내부 Fragment의 View가 아직 생성되지 않은 경우(ex. onCreate()) 다음과 같이 content view를 사용할 수 있습니다만, 추천하지는 않습니다. (급한 불을 꺼야 하는 경우에서만 사용하시고, 이 같은 상황에서는 Toast를 사용하는 것이 더 적합한 것일지도 모릅니다)

Snackbar.make(getActivity().findViewById(android.R.id.content), ...);  

만약 Snackbar에서 좌우로 밀어 숨기기(swipe-to-dismiss)나 위젯 자동 정렬(FloatingActionButton 자동 이동 등)의 기능을 사용하기 위해서는 아래에서 설명할 CoordinatorLayout을 최상위 레이아웃으로 사용하여야 합니다. 이 부분은 잠시 후 CoordinatorLayout을 설명하는 부분에서 좀 더 자세히 다루도록 하겠습니다.

TextInputLayout

레퍼런스 / 디자인 가이드

TextInputLayout은 기존의 EditText를 감싸 그 기능을 확장해 한층 더 업그레이드 해 주는 레이아웃입니다. 기존의 EditText는 글자를 입력하면 Hint Text가 사라지는 것과는 달리, TextInputLayout을 사용하면 EditText가 focus 될 때 Hint Text Text가 플로팅 레이블 형태로 좌측상단에 나타나 사용자가 입력하고 있는 내용이 뭔지 알 수 있게 됩니다.

미려한 애니메이션은 덤입니다. 강조색은 별도의 설정이 없으면 colorAccent로 설정됩니다.

역시나 구현은 매우 간단합니다. 다음과 같이 레이아웃에서 EditText를 TextInputLayout으로 감싸줍니다.

<android.support.design.widget.TextInputLayout  
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/edit_text_email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress"
        android:hint="@string/hint_email" />
</android.support.design.widget.TextInputLayout>  

힌트를 표시하는 것 외에도 setError()를 호출하여 EditText 아래에 오류 메시지를 표시할 수 있습니다. setErrorEnabled()를 호출하면 EditText 아래에 에러 메시지를 표시하기 위한 공간이 할당됩니다. 에러 메시지가 나올 때 갑자기 레이아웃이 바뀌는 것을 방지하기 위해 뷰가 생성될 때 미리 함수를 호출해 놓는 것을 추천합니다.

setErrorEnabled(true);  
setError(getString(R.string.text_error_message));  

에러 메시지 표시하기

※주의: 라이브러리 버전 22.2.1 이하에서 TextInputLayout안의 EditText에 OnFocusChangeListener를 새로 할당하면 애니메이션이 제대로 되지 않는 문제가 발생하고 있습니다. 다음 버전에서 고쳐진다고 합니다만, 그 때까지는 다음과 같이 기존에 있던 OnFocusChangeListener를 보존하면서 새로운 OnFocusChangeListener를 붙여주어야 합니다.

TextInputLayout inputLayout = (TextInputLayout)findViewById(R.id.input_layout);  
EditText editText = inputLayout.getEditText();  
final OnFocusChangeListener existing = editText.getOnFocusChangeListener();

editText.setOnFocusChangeListener(new OnFocusChangeListener() {  
    public void onFocusChange(View view, boolean focused) {
        existing.onFocusChange(view, focused);
        // Your custom logic
    }
});

참고: http://stackoverflow.com/questions/31197312/textinputlayout-not-animating-when-onfocuschangelistener-applied-to-wrapped-edit

Floating Action Button (FAB)

레퍼런스 / 디자인 가이드

 
A floating action button recentering a map view. 
from Google Material Design Guideline

Floating Action Button은 인터페이스의 가능한 동작(ex. 새로운 아이템 목록에 추가)을 나타내는 동그란 버튼 컴포넌트입니다. 기본 색상은 별도의 설정이 없다면 역시 colorAccent로 적용되고, 2가지 크기(Normal, Mini)를 지원합니다.

2가지 크기의 FAB. Normal(왼쪽)과 Mini(오른쪽). (from Google Material Design Guideline)

  • Normal (56dp): 가장 일반적으로 사용되는 크기입니다. 주로 화면 우측 하단이나 AppBar에 붙어서 사용됩니다.
  • Mini (40dp): 소형. 화면에 보여지고 있는 다른 구성 요소들과의 시각적 조화(visual continuity)가 중요할 경우 이상적입니다.

뿐만 아니라 FloatingActionButton은 ImageView를 확장하기 때문에 XML의 android:src속성이나 setImageDrawable()과 같은 메서드를 이용하여 FloatingActionButton에 표시될 아이콘을 설정할 수 있습니다.

  • fabSize: FAB의 크기 설정(normal 혹은 mini)
  • backgroundTint: 배경(background)에 적용할 tint의 색상을 설정합니다
  • rippleColor: 버튼을 눌렀을 때 나타나는 ripple effect의 색상을 설정합니다
  • src: 버튼 안에 사용할 아이콘을 설정합니다

FAB를 레이아웃에 추가하는 것 역시 매우 쉽습니다.

<android.support.design.widget.FloatingActionButton  
     android:id="@+id/fab"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:src="@drawable/ic_plus"
     app:fabSize="normal" />


레퍼런스 / 디자인 가이드

네비게이션 드로워(Navigation Drawer)는 사용자들이 앱 내에서 각기 다른 섹션들을 쉡게 오갈 수 있도록 해 주는 중요한 요소입니다. 이 네비게이션 드로워가 얼마나 일관성 있게 잘 디자인 되어 있는지의 여부가 앱의 편의성을 판가름하는 중요한 요소가 됩니다. 이는 특히 처음 사용하는 사용자에게 매우 크게 작용합니다.

새로 추가된 NavigationView는 기존의 DrawerLayout 내부에 위치하면서 이런 네비게이션 드로워를 구현하는데 필요한 프레임워크와 함께 메뉴 리소스를 통해 쉽게 네비게이션 메뉴를 설정할 수 있도록 해 줍니다.

우선 다음과 같이 레이아웃을 구성해 줍니다.

<android.support.v4.widget.DrawerLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <!-- your content layout -->
    <FrameLayout
        android:id="@+id/main_content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/navigation_header"
        app:menu="@menu/drawer" />

</android.support.v4.widget.DrawerLayout>  

Navigation View에서 살펴볼 핵심 요소는 2가지가 있습니다.

Header Layout

app:headerLayout 속성은 드로워(Drawer)의 헤더 색션의 레이아웃을 정의하는 데 쓰입니다. 이 부분은 네비게이션 아이템들의 바로 위에 위치하게 되는데요, 다음과 같이 주로 프로필 섹션으로 사용됩니다.

프로필 드로워 헤더 섹션 (from Google Material Design Guideline)

app:menu 속성은 드로워 내부에 사용될 네비게이션 메뉴를 지정하는 데 사용됩니다. 물론inflateMenu() 를 통해 코드를 이용해 메뉴를 수동으로 구성할 수도 있습니다.

안드로이드 Gmail 앱의 내비게이션 드로워 (from Google Play Store)

네비게이션 메뉴를 구성할 때 서브 헤더를 사용해 항목들을 구분할 수도 있습니다. 위 Gmail 앱의 네비게이션을 보면 윗 부분과 달리 아래 All labels 부분에는 서브 헤더가 달려 있는 것을 볼 수 있습니다.

서브 헤더 없이 단순한 형태의 드로어 메뉴를 구성하는 방법은 다음과 같습니다.

<menu xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"    
    tools:context=".MainActivity">
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/navigation_item_1"
            android:checked="true"
            android:icon="@drawable/ic_android"
            android:title="@string/navigation_item_1" />
        <item
            android:id="@+id/navigation_item_2"
            android:icon="@drawable/ic_android"
            android:title="@string/navigation_item_2" />
    </group>
</menu>  

이렇게 하면 네비게이션 메뉴들이 단순히 아래로 쭉 나열되는 형태로 보여지게 됩니다. 현재 선택되어 있는 항목은 자동으로 네비게이션 드로어에 강조 표시되므로 사용자가 현재 선택된 탐색 항목이 무엇인지 알 수 있게 됩니다.

반면 서브 헤더를 사용해 네비게이션 항목들을 구분하는 방법은 다음과 같습니다.

<menu xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"                       
    tools:context=".MainActivity">
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/navigation_subheader"
            android:title="@string/nav_header">
            <menu>
                <!-- Menu items go here -->
                <item
                    android:id="@+id/navigation_sub_item_1"
                    android:icon="@drawable/ic_android"
                    android:title="@string/navigation_sub_item_1"/>
                <item
                    android:id="@+id/navigation_sub_item_2"
                    android:icon="@drawable/ic_android"
                    android:title="@string/navigation_sub_item_2"/>
            </menu>
         </item>
    </group>
</menu>  

네비게이션 드로워 안에 들어가는 메뉴들을 런타임에서 코드를 이용해 수정하는 것도 가능합니다. getMenu()를 이용해 현재의 Menu 인스턴스를 가져와 수정해 주면 됩니다.

뿐만 아니라 다음 속성들을 이용해 여러가지 추가적인 설정을 할 수 있습니다.

  • itemBackground — 메뉴 아이템의 background resource 설정
  • itemIconTint — 메뉴 아이템의 아이콘 틴트 색상 설정
  • itemTextColor — 메뉴 아이템의 텍스트 색상 설정

네비게이션 드로워의 선택한 항목에 대한 콜백을 받으려면 setNavigationItemSelectedListener()를 이용해 OnNavigationItemSelectedListener를 설정해 주면 됩니다. 이를 이용해 사용자가 네비게이션 메뉴를 선택했을 때 원하는 작업을 수행할 수 있습니다.

NoteAPI21 이상의 기기에서는 NavigationView가 자동으로 상태 표시줄의 scrim protection 문제를 자동으로 처리하여 네비게이션 드로워 위로 scrim이 오버레이 될 수 있도록 해 줍니다.

TabLayout

레퍼런스 / 디자인 가이드

 
탭 터치 애니메이션 (from Google Material Design Guideline)

TabLayout은 탭을 기존보다 보다 쉽고 간편하게 구현할 수 있게 도와주는 컴포넌트입니다. 기본적으로 고정 탭(Fixed tabs)과 스크롤 탭(Scrollable tabs) 2가지를 모두 지원합니다. 고정 탭에서는 모든 탭이 보기의 너비를 골고루 똑같이 나눠 쓰게 하거나 탭을 가운데 정렬 할 수 있는 반면, 스크롤 탭에서는 탭의 크기가 균일하지 않고 가로 방향으로 스크롤할 수 있습니다.

고정 탭, 균일한 너비 (from Google Material Design Guideline)

고정 탭, 가운데 정렬 (from Google Material Design Guideline)

 
Google Play Music 앱의 스크롤 탭 (from Google Material Design Guideline)

가장 먼저 레이아웃에 TabLayout을 추가해 줍니다.

<android.support.design.widget.TabLayout  
    android:id="@+id/sliding_tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabMode="fixed"
    app:tabGravity="fill" />

여기에는 입맛에 따라 설정해 줘야 할 몇 가지 속성들이 있습니다.

  • tabMode: TabLayout의 모드를 설정합니다. fixed(모든 탭을 한번에 표시)와 scrollable(일부 탭만 표시하고 나머지는 스크롤)중에서 선택할 수 있습니다.
  • tabGravity: 탭의 정렬 방식을 선택합니다. fill(너비를 모두 같게 나누어 표시)와 center(가운데 정렬)을 사용할 수 있습니다.

또한, TabLayout에서는 다음과 같은 3가지의 리스너가 사용됩니다. OnTabSelectedListener를 제외한 나머지 2개는 탭과 함께 ViewPager를 사용하는 경우에만 필요합니다.

  • TabLayout.OnTabSelectedListener: 탭의 선택 상태가 변경될 때 호출되는 리스너입니다.
  • TabLayout.OnPageChangeListenerViewPager에서 페이지의 상태가 변경될 때(스크롤) 이에 따라 탭의 상태도 변경되어야 하기 때문에 필요한 리스너입니다. 이 리스너가 ViewPager에 붙어서 페이지 변경 이벤트를 TabLayout에 전달해 탭의 선택 상태를 동기화 해 주는 역할을 합니다.
  • ViewPager.OnTabSelectedListener: 위와는 반대로 TabLayout에서 탭을 선택할 때 이에 따라 페이지의 선택 상태도 변경되어야 하기 때문에 필요한 리스너입니다. 이 리스너가 탭의 선택 이벤트를 ViewPager에 전달해 탭과 페이지의 선택 상태가 동기화 될 수 있도록 합니다.

TabLayout이 레이아웃에 추가되었다면, 탭을 추가하는 것은 이전에 액션바에 탭을 추가하는 방법과 동일합니다. 아래와 같이 코드에서 새 탭을 만들고, setText()와 setIcon()메소드를 이용해 탭의 이름과 아이콘을 설정해 줍니다.

물론, 페이지를 넘기는 데 ViewPager를 사용하는 경우, setupWithViewPager()를 사용해 이 둘을 간단하게 연결할 수 있습니다.

고맙게도, setupWithViewPager()는 다음과 같은 일들을 자동으로 수행해 줍니다.

  • ViewPager.OnPageChangeListener를 자동으로 등록해 ViewPager의 페이지 변경 이벤트가 TabLayout에 전달될 수 있도록 합니다.
  • 코드로 일일이 탭을 생성해 주지 않아도 ViewPager의 PagerAdapter로부터 자동으로 탭을 만들어 줍니다. 만세! (참고: setTabsFromPagerAdapter())
  • TabLayout.OnTabSelectedListener를 자동으로 등록해 TabLayout의 탭 변경 이벤트가 ViewPager에 전달될 수 있도록 합니다.

그래서 다음과 같이 간단한 코드로 TabLayout와 ViewPager를 구현할 수 있게 됩니다.

ViewPager pager = (ViewPager)  
rootView.findViewById(R.id.viewPager);  
pager.setAdapter(new MyPagerAdapter(getActivity().getSupportFragmentManager()));

TabLayout tabLayout = (TabLayout) rootView.findViewById(R.id.sliding_tabs);  
tabLayout.addTab(tabLayout.newTab().setText("Tab One"));  
tabLayout.addTab(tabLayout.newTab().setText("Tab Two"));  
tabLayout.addTab(tabLayout.newTab().setText("Tab Three"));  
tabLayout.setupWithViewPager(pager);  


Coordinator Layout

레퍼런스 / 디자인 가이드

CoordinatorLayout은 터치나 드래그와 같은 이벤트가 일어날 때 여러 개의 하위(child) view들이 서로 상호 작용을 할 수 있도록 해 주는 레이아웃입니다.

Note: 레이아웃들이 정상적으로 작동할 수 있도록 support library dependency를 최신 버전(22.2.0 이상)으로 업데이트 해 주세요. (ex. RecyclerView 등)

CoordinatorLayout은 다음과 같은 두 가지 속성을 제공하여 화면에 있는 view들이 다른 view들을 기준(앵커, anchor)으로 하여 상호작용 할 수 있도록 해 줍니다.

  • layout_anchor: 다른 view를 anchor로 설정할 수 있습니다.
  • layout_anchorGravity: 위에서 설정한 anchor를 기준으로 한 gravity를 설정합니다.

FloatingActionButton & Snackbar

앞에서 Snackbar를 설명할 때 언급했던 Snackbar와 FloatingActionButton의 상호작용은 CoordinatorLayout을 활용한 좋은 예입니다. CoordinatorLayout을 사용하면 스낵바가 표시될 때 FAB를 가리는 대신 애니메이션 효과와 함께 자동으로 위, 아래쪽으로 이동합니다. 뿐만 아니라 Snackbar의 swipe-to-dismiss도 사용할 수 있게 됩니다.

CoordinatorLayout을 이용하면 Snackbar를 표시할 때 FAB을 자동으로 밀어올리고, Snackbar에 대해 swipe-to-dismiss를 수행할 수 있게 됩니다.

이를 구현하기 위해서는 FloatingActionBar 을 CoordinatorLayout의 바로 하위(child)로 추가하고, layout_gravity 속성을 통해 FAB의 위치를 지정해 주어야 합니다.

<android.support.design.widget.CoordinatorLayout  
    android:id="@+id/main_content">

    <!-- Your other views -->

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_plus"
        android:layout_gravity="bottom|right"
        app:fabSize="normal" />

</android.support.design.widget.CoordinatorLayout>  

이제 Snackbar를 보여줄 때 CoordinatorLayout를 view 파라메터로 넘겨주면 됩니다.

Snackbar.make(mCoordinator, "Your message", Snackbar.LENGTH_SHORT)  
    .show();


App Bar

CoordinatorLayout을 활용하면 스크롤에 따른 view의 모양을 변화시킬 수 있습니다. 아주 대표적인 예가 바로 App Bar(예전에 Action bar라고 불리던)입니다. 이미 여러분은 레이아웃에서 Toolbar를 사용하고 계실 것입니다. 디자인 라이브러리는 이 기능을 한 단계 더 발전시킨 AppBarLayout를 제공합니다. 이것을 사용하면 Toolbar와 함께 사용되는 여러가지 레이아웃(예컨대 TabLayout)들이 (ScrollingViewBehavior로 표시된) 다른 뷰에서 스크롤 이벤트가 일어날 때 툴바와 어우러져 자연스럽게 반응하도록 할 수 있습니다.

<android.support.design.widget.CoordinatorLayout  
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

     <! -- Your Scrollable View -->
    <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />


    <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
                  ...
                  app:layout_scrollFlags="scroll|enterAlways" />

        <android.support.design.widget.TabLayout
                  ...
                  />

    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>  

이제 사용자가 RecyclerView를 스크롤하면 AppBarLayout이 스크롤 이벤트에 응답할 수 있게 됩니다.

 
(from Google Material Design Guideline)

여기서 살펴볼 점은 두 가지가 있습니다.

먼저 layout_scrollFlags 속성에 스크롤에 반응할 방법인 scroll flag을 설정해 주어야 합니다. 여기에서 화면 밖으로 스크롤 될 때 화면 상단에 남아 있을 지, 아니면 사라질 지를 결정합니다. flag의 예는 다음과 같습니다.

  • scroll: 스크롤 이벤트에 반응할 모든 view에 반드시 이 flag를 설정해야 합니다.

  • enterAlways: 아래쪽 방향으로 스크롤할 때마다 이 보기가 표시됩니다. ('quick return')

  • enterAlwaysCollapsed: 해당 view에 minHeight 속성이 있는 경우, 해당 크기로 시작해 맨 위로 스크롤 될 때만 전체 높이로 확장됩니다.

  • exitUntilCollapsed: view가 minHeight가 될 때 까지만 축소됩니다.

Note: scroll 플래그를 사용하는 모든 보기는 이 플래그를 사용하지 않는 보기보다 먼저 선언해야 합니다. 그래야 모든 view가 맨 위쪽부터 화면 밖으로 스크롤되고 고정된 요소들이 화면에 남도록 할 수 있습니다.

다음으로는 RecyclerView에 사용된 layout_behavior속성입니다. 이 속성은 RecyclerView가 CoordinatorLayout과 함께 동작하도록 하기 위해서 반드시 필요합니다. 즉, 레이아웃이 RecyclerView의 스크롤 이벤트에 반응할 수 있게 된다는 것입니다. 우리가 위 코드에서 사용한 레이아웃에서는 Toolbar에 layout_scrollFlags 속성을 선언해 놓았기 때문에 RecyclerView에서 스크롤이 일어나면 이 이벤트가 ToolBar에 전달되어 화면 안 혹은 밖으로 스크롤 되게 됩니다. 반면, TabLayout에는 이 속성을 선언하지 않았기 때문에 스크롤이 일어나더라도 화면 상단에 남아 있게 되는 것이죠.


Collapsing Toolbar

앞에서 살펴본 것과 같이 Toolbar를 AppBarLayout로 감싸 주면 enterAlwaysCollapsed나 exitUntilCollapsed 같은 flag를 지정해 스크롤 이벤트에 반응할 수 있었습니다. 하지만 스크롤 이벤트에 따라 view들을 축소하거나 하는 등의 상세한 조작은 불가능했는데요, 새로 추가된 CollapsingToolbarLayout을 사용해 Toolbar를 감싸 주면 스크롤에 따라 Toolbar를 확장하거나 축소할 수 있게 됩니다.

<android.support.design.widget.AppBarLayout  
        android:layout_height="192dp"
        android:layout_width="match_parent">
    <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">
        <android.support.v7.widget.Toolbar
                android:layout_height="?attr/actionBarSize"
                android:layout_width="match_parent"
                app:layout_collapseMode="pin"/>
        </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>  

CollapsingToolbarLayout과 Toolbar를 함께 사용하는 경우 좋은 점은 레이아웃이 완전히 표시될 때는 제목이 크게 나타났다가 레이아웃이 축소될 때 애니메이션과 함께 제목이 점점 작아져 기본 크기로 자연스럽게 전환된다는 것입니다. 이를 위해서는 Toolbar 자체가 아닌, CollapsingToolbarLayout의 setTitle()을 이용해 제목을 설정해 주어야 합니다.

뿐만 아니라, Collapsing Toolbar가 제대로 작동하기 위해서는 app:layout_collapseMode속성을 지정해 주어야 하는데요, 여기에는 두 가지 옵션이 있습니다.

  • "pin"CollapsingToolbarLayout이 완전히 축소되면 툴바는 화면 맨 위에 고정(pinned)되어 보여집니다.

  • "parallax": 툴바가 축소되는 동안 Parallax 모드 (예컨대 CollapsingToolbarLayout안에 ImageView를 사용하는 경우)로 동작하도록 합니다. 옵션으로 layout_collapseParallaxMultiplier 속성을 사용하여 transition의 translation multiplier를 설정할 수도 있습니다. (예: app:layout_collapseParallaxMultiplier="0.7") 이때 CollapsingToolbarLayout에 app:contentScrim="?attr/colorPrimary" 속성을 사용해 주면 view가 축소될 때 그림 위로 지정한 색상이 오버레이 되면서 자연스럽게 Toolbar로 축소되는 애니메이션을 구사할 수 있습니다. (참고: Android Reference


Wrap Up

이제 더 이상 망설일 필요가 없습니다. 지금 바로 여러분의 앱에 머티리얼 디자인을 적용해 보세요! 
아직 잘 감이 안 오신다면 이 페이지를 참고해서 차근차근 따라해 보시고, 최근 버전 22.1 업데이트 되면서 디자인 서포트 라이브러리에 추가된 부분들은 구글 안드로이드 개발자 블로그를 참고해 보세요.


References

Google Developers Blog - Android Design Support Library 
Google Developers Korea Blog - Android Design Support Library 
Ribot Labs - Exploring the new Android Design Support Library 
커니의 안드로이드 이야기 - Support Design Library (Google I/O Extended Seoul, 2015)


WRITTEN BY
편지함
The Base Code of the Human Race

,

얼마전 이통3사의 갤럭시S3 젤리빈 4.3 업데이트가 있었습니다. 갤럭시S3나 노트 3는 젤리빈 4.2를 건너뛰고 4.1에서 4.3으로 바로 업데이트 되기 때문에 체감적으로 많은 성능 향상과 기능 추가가 있었습니다. 그 중 하나가 락스크린 바로가기 기능인데, 이상하게도 해외판 펌웨어에서는 락스크린 바로가기 기능이 사용 가능하지만 국내판 펌웨어에서는 관련 기능이 설정 항목에서 숨겨져 있었습니다. 다행히도 관련 기능이 숨겨져 있을 뿐, 삭제된 것은 아니라서 간단한 방법을 통해 이를 활성화 할 수 있습니다.

 

갤럭시S3 LTE 젤리빈 4.3 펌웨어에서 잠금화면 바로가기를 설정한 모습

 


※ 갤럭시 시리즈 히든 설정들에 간편하게 접근할 수 있는 어플이 마켓에 올라왔습니다. 런쳐를 통한 설정이 귀찮으신 분들은 어플을 다운받아 설정하시면 됩니다.

https://play.google.com/store/apps/details?id=uz.dev.app.galaxy.hidden
 
갤럭시 시리즈 젤리빈 4.3 이상에서 락스크린 바로가기 사용하기

 

1. 우선 액티비티 바로가기를 생성할 수 있는 런쳐를 준비합니다. 노바 혹은 아펙스 런쳐가 이를 지원합니다. 구글 플레이나 기타 마켓을 통해 런쳐를 설치합니다.

노바 런쳐: 구글 플레이 https://play.google.com/store/apps/details?id=com.teslacoilsw.launcher

아펙스 런쳐: 구글 플레이 https://play.google.com/store/apps/details?id=com.anddoes.launcher

 

2. 런쳐를 실행해 홈 화면의 빈 공간을 길게 눌러줍니다. 홈 화면에 추가할 항목을 선택할 수 있는 팝업이 나타납니다. 여기서 [바로가기] 항목을 선택합니다.


 

3. 여러가지 항목들 중에서 [액티비티(Activity)] 항목을 선택합니다.


 

4. 기기에 설치된 앱들의 목록이 나오고 해당 앱을 선택하면 관련 액티비티들의 목록이 나타납니다. 여기서는 환경설정의 액티비티가 필요하므로 아래쪽에 있는 환경설정을 찾아 터치해 줍니다. 여러가지 액티비티 중 "바로가기(.lockscreenshortcut.LockScreenShortcutSettings)"를 선택합니다.


 

5. 홈 화면에 생성된 바로가기를 터치해 숨겨진 설정 화면으로 들어갑니다.


 

6. 좌측 상단의 토글 스위치를 터치해 바로가기를 활성화 해 줍니다. 이제 자신의 기호에 맞게 잠금화면 바로가기를 설정해 줍니다. +버튼을 눌러 앱을 추가할 수 있고, 길게 눌러 드래그하면 위치를 수정하거나 삭제할 수 있습니다. 


 

7. 설정을 마치고 잠금화면을 띄워 보면 화면 하단에 바로가기가 활성화 된 것을 확인할 수 있습니다.


 



WRITTEN BY
편지함
The Base Code of the Human Race

,
안드로이드와 루팅

저는 디자이어 이후로 스마트폰은 쭉 안드로이드를 사용해 왔습니다. 중간에 아이팟 터치를 통해 iOS를 경험해 보면서 정말 많은 앱을 구매했고 탈옥와 시디아를 경험해 봤지만, 안드로이드의 개방성과 강력한 공유 기능은 iOS가 샌드박스 구조인 이상 절대 따라올 수 없는 부분이기 때문이었습니다. 디자이어와 갤럭시 노트1 해외판을 사용하면서 받았던 XDA의 강력한 지원은 정말 이루 말할 수 없는 강력함임을 써보셨던 분들을 아실 겁니다. 커스텀의 끝은 순정이라는 말이 있듯이, 이제는 왠만한 커스텀은 다 해 봤기 때문에 런쳐를 바꾸는 등의 작업 외에는 순정 상태를 고집하고 있습니다. 다만, 바뀌지 않는 것이 있다면 iOS를 쓸 때 탈옥을 했던 것처럼, 항상 루팅을 합니다. 필요 없는 통신사 앱을 제거하기 위해서기도 합니다만, 디자이어 때부터 티타늄 백업을 통해 쌓아 온 백업 데이터 때문에 절대 루팅을 포기할 수 없게 되었습니다.

젤리빈 4.3 업데이트, 루팅, 그리고 'KNOX'

바로 어제(11월 13일) 이통3사 갤럭시S3의 젤리빈 4.3 업데이트가 있었습니다. 3G용 펌웨어에는 포함되어 있지 않으나, LTE용 펌웨어에는 삼성의 보안 솔루션인 KNOX가 포함되어 있습니다. 최근 출시된 갤럭시 노트3와 갤럭시 노트 10.1(2014), 그리고 앞으로 출시될 삼성 안드로이드 기기들에는 아마 기본적으로 KNOX가 탑재될 것으로 보입니다. 그런데 KNOX가 탑재된 기기에서 기본의 방법으로 루팅을 하는 경우 KNOX 워런티가 손상되어 KNOX를 사용할 수 없음은 물론, 보증 기간 내에 무상수리를 받을 수 없게 됩니다. 또한 순정 상태이더라도 녹스가 적용되어 있을 경우 녹스가 적용되지 않는 펌웨어로의 다운그레이드는 불가능합니다.

방패가 있으면 창도 있듯이, 갤럭시 노트3와 갤럭시S4는 이미 KNOX를 우회해 루팅할 수 있는 툴(http://www.kingoapp.com/android-root.htm, http://www.mgyun.com/vroot)이 속속들이 나오고 있습니다. 루팅 툴이 작동하지 않는다면 사용자들이 수정한 녹스 우회 루팅 펌웨어를 사용해도 됩니다. 하지만 아직 갤럭시S3 LTE 버전의 루팅 툴이 없는데다, 녹스 우회 펌웨어들도 아직 만들어지지 않았기 때문에 직접 루팅을 시도해 보기로 했습니다.

※ 현재 U+용 갤럭시S3 LTE 버전의 녹스 제외 및 CWM 리커버리 적용 펌웨어는 맛클에서 구할 수 있습니다.(http://www.matcl.com/?m=bbs&bid=imbeded&uid=205623)

갤럭시S3 3G버전은 4.3 펌웨어에 KNOX가 포함되어 있지 않으므로 기존의 루팅 방법을 사용하시면 됩니다.


갤럭시S3 LTE버전 젤리빈 4.3 루팅하기

2013.11.20 업데이트: Vroot를 통한 녹스 우회 루팅이 가능하다는 의견이 있었습니다. Vroot를 다운받으시거나 S_papa님 블로그(http://spapa1004.tistory.com/106)에서 한글화 파일을 받으시기 바랍니다.
Vroot 다운로드 링크: http://www.mgyun.com/vroot

※ 아래 방법으로 펌웨어 업데이트를 진행하기 전에 반드시 백업을 하시기 바랍니다.

※ 이 포스트에서 소개하는 모든 작업으로 인해 발생하는 문제는 전적으로 사용자에게 있습니다. 펌웨어를 다루는 데 익숙하신 분들만 참고하시기 바라며, 정상적인 플래시 과정에서도 문제가 생길 수 있다는 점 항상 유의하시기 바랍니다.

※ 아래 방법은 커스텀 바이너리 카운트를 증가시킵니다. 트라이앵글 어웨이를 사용해 지울 수 있으나, 이에 익숙하지 않으신 분은 루팅카운트가 올라가지 않는 사용자 펌웨어를 기다리시기 바랍니다.

※ 루팅카운트가 올라가지 않는 커스텀 펌웨어를 만드는 방법은 추후 포스팅 하겠습니다. 방법을 아시는 분들은 sboot.bin 파일을 삭제 후 다시 묶어 주시면 됩니다.

기본적인 원리는 공개된 4.3 순정 펌웨어에서 녹스 관련 파일을 제거하는 것입니다. (몸소 녹스 워런티를 확인해 주신 맛클 S_papa님께 감사드립니다. http://www.matcl.com/?m=bbs&bid=usermoim&uid=203350)

이 방법을 사용하는 경우 녹스는 사용할 수 없으며, 다운로드 모드에서 녹스 워런티는 나타나지 않습니다. 즉, 녹스 워런티는 손상되지 않으며, 녹스를 제외하고는 이전 버전의 펌웨어들과 동일하게 동작합니다. 따라서 이전 버전 펌웨어로 다운그레이드하거나 루팅을 하더라도 녹스 워턴티는 깨지지 않으며 언제든지 순정 상태로 되돌릴 수 있게 됩니다.

1. 파티션 및 IMEI 손상 등 만일의 사태를 대비하여 EFS 백업을 수행합니다. 인터넷 검색을 통해 쉽게 하실 수 있을 겁니다.(관련 툴, XDA http://forum.xda-developers.com/showthread.php?t=1308546)


2. 각 통신사에 맞는 4.3 펌웨어를 준비합니다. 맛클 대용량 펌웨어 자료실에서 구할 수 있습니다. (http://www.matcl.com/?r=home&m=bbs&bid=torrent)

3. 다운받은 펌웨어의 확장자를 tar로 바꾼 뒤 이를 압축 프로그램을 이용해 열어 줍니다. 여기서 녹스 관련 이미지 파일인 sboot.bin을 삭제해 줍니다. 알집을 이용하면 되는 것 같은데 저는 알집을 사용하지 않기 때문에 리눅스 쉘을 이용했습니다.


4. 이후 과정은 일반적인 펌웨어 업데이트 방법과 같습니다. 오딘으로 플래시 해 주면 됩니다. (오딘 사용법은 인터넷 검색을 통해 쉽게 알 수 있습니다.)


5. 정상적으로 업데이트 된 것을 확인할 수 있습니다. 다운로드 모드로 들어가 녹스 관련 워런티가 표시되지 않는 것을 확인합니다.

※ 와이파이 등 관련 기능이 동작하지 않은 경우 롬 플래시가 제대로 되지 않은 경우입니다. 공장초기화 후 다시 펌웨어를 플래시 하시기 바랍니다.


6. 이후 커스텀 리커버리나 기존의 방법을 이용해 루팅을 하시면 됩니다.

※ 저는 루팅카운트를 신경 쓰지 않으므로 Philz-Touch Recovery를 오딘으로 플래시 한 후 리커버리 모드로 들어가 (전원+볼륨+홈키) Supersu 바이너리를 플래시 했습니다.

갤럭시S3용 Philz-Touch Recovery 다운로드:http://d-h.st/users/philz_touch/?fld_id=16049#files / 관련글: http://forum.xda-developers.com/showthread.php?t=2002953

SuperSU 바이너리 다운로드: http://download.chainfire.eu/supersu /관련글: http://forum.xda-developers.com/showthread.php?t=1538053


※ 업데이트 후 기기가 너무 느려지거나 배터리 소모량이 지나치게 증가하는 경우 공장초기화를 해 주시기 바랍니다. 일반적으로 버그 픽스가 아닌 버전 업데이트의 경우 공장초기화를 해 주는 것이 좋습니다.


WRITTEN BY
편지함
The Base Code of the Human Race

,

※ 이 글은 2013년 10월 현재 최신 글입니다. 천제의 관측 결과에 따라 계속 업데이트되며 잘못된 내용이 있으면 관련 자료 링크와 함께 피드백을 남겨주세요.

VV 시퍼이 A

제가 천문공부를 할 때(벌써 오래 지났네요ㅜ)는 세상에서 가장 큰 별은 지구에서 약 4,900 광년(1,500 파섹) 떨어진 케페우스 별자리에 속한 VV Cephei A(VV 시퍼이 A)별이었습니다.
(참고 : VV Cephei는 식쌍성으로 알려져 있으며 주성인 A는 적색 초거성이고, VV Cephei B는 청색 초거성입니다. VV Cephei B의 질량은 태양의 약 10배 정도이며 광도는 태양의 10만배라고 합니다.)

지름은 무려 태양의 1050배(1050 R☉), 부피는 360만 배에 달하는 무지막지한 크기입니다. 몸집에 비해 질량은 태양의 100배가 넘지 않아 밀도가 희박하고 표면온도는 3800-3900K로 낮지만(태양의 표면 온도는 약 6000K) 그 크기로 인해 밝기는 태양보다 약 30만배(200,000-320,000 L☉) 이상 밝게 빛납니다.

태양과 VV시퍼이A의 크기 비교
 

하지만 이런 무지막지한 별보다 더 큰 별이 있다고 알려졌습니다. 바로 VY 카니스 메이저리스라는 별입니다.

VY Canis Majoris

제가 이 글을 포스팅 하던(2012년 1월) 때 까지만 해도 세상에서 가장 큰 별은 바로 큰개자리에 있는 VY 케니스 메이저리스(VY Canis Majoris, VY CMa)라는 별이었습니다. 당시의 측정치는 태양 지름의 약 2000배로, 크기가 너무 커서 항성 진화 이론에 의문을 제기하게 하기도 했습니다. 하지만 최근 측정치가 보정되면서 크기 순위로는 5위 밑으로 내려앉게 되었습니다.

이 별은 19세기 초 제롬 랄랑드의 성표에 처음으로 등장한 이래로 주목받아 온 천체로 지구에서 약 3,840 광년(1,170파섹) 떨어져 있습니다. 지름은 무려 태양의 약 1420배(1420±120R⊙)인데, 만약 태양 대신 이 별을 태양계 중심에 놓는다면 목성의 궤도 까지 미친다고 합니다. 이는 빛의 속도로 달려도 8시간이 걸리는 거리라고 하네요. 빛이 1초에 지구를 7바퀴 반을 돈다는 사실은 이미 알려져 있으니 짐작이 되시나요?

태양과 VY Canis Majoris의 크기 비교
출처 : Mysid , 위키피디아 Wikimedia Commons 


VY 케니스 메이저리스의 표면 온도는 약 3490K (태양의 표면 온도는 약 6000K) 이며. 밝기는 태양의 27만배(270,000 L⊙), 질량은 태양의 17배(17±8M⊙)정도라고 합니다.

VY 케니스 메이저리스를 여러 행성과 다른 별들의 크기를 비교한 자료입니다. (클릭하면 커집니다.)

※ 1에서 금성이 목성으로 잘못 표기되어 있습니다.

 행성, 항성의 크기 비교
출처: 위키미디어 (http://commons.wikimedia.org/wiki/File:Star-sizes.jpg), 한글 주석 by 편지함

아래 사진 역시 다른 행성과 별들의 크기를 동일한 중심에 놓고 비교한 자료입니다.



출처: Mycyclopedia, "Relative Size of Giant Stars (항성 크기 비교)" (http://mycyclopedia.tistory.com/35)

하지만 글을 수정하고 있는 지금, 더 큰 별이 있다고 알려졌는데요, 바로 NML Cygni(백조자리 NML)입니다.

NML Cygni

제가 이 글을 수정하는 현재(2013년 10월) 세상에서 가장 큰 별은 백조자리 방향에 있는 백조자리 NML(NML 시그니, NML Cygni, V1489 Cygni) 입니다. 이 별은 1965년에 Neugebauer, Martz, and Leighton 세 사람이 발견했는데, 이들은 자신들의 이름 앞글자를 하나씩 따서 NML이라고 이름 지었다고 합니다.

거리는 지구에서 약 5,300광년(1,610 파섹) 떨어져 있어서 태양과 가장 가까운 거성이라고 합니다. 질량은 태양의 25–40배(M☉), 반지름은 약 1,650배(R☉)로, 이는 태양 부피의 약 36억 배(3,600,000,000) 정도입니다. 지금 태양의 위치에 놓으면 목성의 궤도를 넘어 목성과 토성 궤도의 중간까지 온다고 하니 상상이 되시나요?
크기가 큰 만큼 그 밝기도 밝아서 태양 밝기의 약 27만배(270,000 L☉) 정도라고 하네요.

위에서 살펴보았던 VY 케이스 메이저리스와 비교해 볼까요?

출처: NML Cygni, la estrella más grande(http://www.curiosidadsq.com/2012/10/nml-cygni-la-estrella-mas-grande.html)

그런데 사실, 이 녀석보다 더 큰 별이 있습니다.

뭐? NML Cygni가 제일 큰 별이라며!

맞는 말이기도 하고, 틀린 말이기도 합니다. 바로 방패자리 UY(UY Scuti)가 있기 때문이죠. 이 별의 크기는 태양의 약 1700배(1,708 ± 192 R☉)로 태양 부피의 약 50억배입니다. 목성과 토성의 궤도 중간보다도 더 큰 크기입니다. (너 정말...) 현재의 관측 결과로는 질량은 태양의 32배(32M☉), 밝기는 34만배(34,000L☉) 정도입니다.

그런데 왜 가장 큰 별이 아니나구요? 바로 계산된 예상 수치가 아직 부정확하기 때문입니다. 위의 수치를 보시면 반지름 오차의 범위가 192R☉입니다. 만약에 예상 수치의 최소값인 1,520R☉가 되면 현재 순위로는 5번째로 큰 별인 VX Sagittarii와 같은 크기가 됩니다. 그래서 현재로써 가장 큰 별은 NML 시그니라고 할 수 있겠네요.

위에서 언급했던 크기가 무지 큰 이런 극대거성(Hypergiant)들은 별의 진화 단계에서 거의 끝에 있는 녀석들입니다. 때문에 불안정하고, 수명이 짧아 매우 희귀합니다. 이런 별들은 수축과 팽창을 반복하는 변광성들이 많습니다. 밀도가 낮고, 많은 양의 질량이 밖으로 방출되고 있어서(질량손실 비율이 큼) 항성의 대기가 매우 넓게 확장되어 있다는 점도 한몫 합니다. 그래서 관측 데이터가 많지 않고, 그마저도 정확도가 높지 않아서 새로운 데이터가 들어오면 그 값이 크게 수정되기도 합니다. 사실 정말 넓고 넓은 우주를 연구하는 천문의 특성이기도 합니다. 공부를 하다 보면 거의 정설이 되었던 가설들도 새로운 천체가 발견되면서 수정이 된 경우를 많이 발견하실 수 있을 겁니다. 생각해 보니 이것이 결국 과학이기도 하네요.

P.S
지금까지 발견된 별의 크기는 반지름 순으로 나열한 페이지'



WRITTEN BY
편지함
The Base Code of the Human Race

,

다양한 언어를 지원하면서 강력한 디버깅 기능을 가지고 있는 비주얼 스튜디오는 이클립스와 더불어 가장 많이 사용되는 IDE(통합 개발환경, Integrated Developing Environment)입니다. 아직도 대다수의 사람들이 프로그래밍을 배울 때 C나 C++로 시작합니다. 가장 기본이 되면서 중요하기 때문이죠. 많은 대학교에서 C를 기초과목으로 가르치고 있는 것도 비슷한 이유일 것입니다. Visual Studio는 C와 C++, C#과 닷넷 등에 대한 강력한 개발환경을 지원하는데다, DreamSpark 프로그램을 통해 교육기관이나 학생들에게 무료로 배포되기 때문에 많은 사랑을 받고 있죠.


프로그래밍을 처음 배우시는 분들이나 간단한 프로그램을 만드는 경우 보통 과거 도스 환경을 연상케 하는, "까만 바탕에 하얀 글씨" 인터페이스인 콘솔 응용 프로그램을 만들게 됩니다.

일반적인 콘솔 응용 프로그램의 예


일반적으로 코딩을 하는 경우 먼저 코드를 작성 한 뒤, 프로그램을 실행 해 자신의 코드가 잘 동작하는 지 확인하고 오류를 잡기 위한 '디버깅'과정을 반복하게 됩니다.


Visual Studio에서는 Ctrl + F5키를 이용해 프로그램을 실행, 즉 "디버깅 하지 않고 시작(Start without debugging)"할 수 있습니다. 그러면 명령 프롬프트가 실행되면서 창에서 결과값을 확인할 수 있죠. 그런데 프로그램이 종료되면서 이 콘솔 창이 사라지게 되면 프로그램이 종료되기 전까지의 결과를 확인할 수 없게 됩니다. 그래서 아래 그림처럼 Visual Studio는 자동으로 프로그램이 종료되기 직전에프로그램을 멈추어 줍니다.

비주얼 스튜디오에서 종료 직전에 프로그램을 자동으로 멈춘 모습


즉, 비주얼 스튜디오가 소스코드에 다음과 같이 system("pause")를 자동으로 추가해 주는 것입니다.

#include <stdio.h>

int main(...)
{
    //작성한 코드
     system("pause");
     return 0;
}


하지만, 프로젝트 생성 시 콘솔 응용 프로그램으로 생성하지 않는 경우 Build 할 때의 flag가 달라져 Ctrl + F5를 이용해 실행하는 경우에도 프로그램이 종료되면 자동으로 콘솔 창이 꺼지는 경우가 있습니다.

이런 경우 위 코드처럼 소스코드 마지막에 system("pause")를 추가하거나 다음과 같이 프로젝트 속성을 바꿔 주면 됩니다.


1. 메뉴의 [프로젝트(Project)] - ['프로젝트 이름' 속성(Properties)]으로 들어갑니다.


2. 왼쪽의 [구성 속성(Configuration Properties)] - [링커(Linker)]에서 [시스템(System)]을 선택하고, 오른쪽의 [하위 시스템(Subsystem)]에서 [콘솔 Console (/SUBSYSTEM:CONSOLE)]을 선택합니다.


3. 이제 Ctrl + F5를 눌러 프로그램을 실행하면 종료 후 창이 사라지지 않는 것을 확인할 수 있습니다.

비주얼 스튜디오에서 종료 직전에 프로그램을 자동으로 멈춘 모습



WRITTEN BY
편지함
The Base Code of the Human Race

,


MonoDevelop Color Scheme 변경하기


1. Monodevelop용 Color Scheme파일을 다운로드하거나 작성합니다. 파일은 XML 형식을 지원합니다.

Sublime Text에 기본으로 쓰이는 Monokai 스키마와 GitHub스타일은 다음 링크에서 받을 수 있습니다.

Syntax Highlighting styles for MonoDevelop, https://github.com/dkucinskas/MonoDevelop-Styles/archive/master.zip


2. Monodevelop를 실행하고, 메뉴바의 [Tools] - [Options]를 선택합니다.



3. 좌측에서 Text Editor 아래의 [Syntax Highlighting]을 선택한 뒤, 오른쪽 하단의 [Add]를 클릭합니다.

기본으로 포함된 컬러 스키마 중에 맘에 드는 것이 있다면 구지 추가하지 않고 사용해도 됩니다.


4. 다운로드 한 파일이 있는 곳으로 이동해 가져오고자 하는 파일을 선택하고 [Open]을 클릭합니다.


5. 방금 가져온 컬러 스키마를 선택하고 OK를 클릭합니다.


6. 열려있는 모든 탭을 닫고 다시 열거나, Monodevelop를 다시 실행하면 컬러 스키마가 변경된 것을 확인할 수 있습니다.


참고 MonoDevelop 테마 어둡게 하기


WRITTEN BY
편지함
The Base Code of the Human Race

,

음원을 하나, 둘 모으다 보면 그 양이 너무 많아져서 관리하기가 힘들어집니다. 그래서 많은 분들이 폴더를 이용하시거나, 애플 아이튠즈를 이용해 불어난 음원 관리를 하고 계십니다. 저도 처음에는 아티스트, 앨범 단위의 폴더로 관리했지만, 양이 너무 많아지다 보니 아이튠즈에 맞기게 되었습니다. 외관도 미려하고, 음원 재생 본연의 기능도 잘 갖추고 있기 때문이죠. (윈도우와 안드로이드를 주로 쓰는 저에게는 윈도우에서 유독 오래 걸리는 '동기화'를 하지 않아도 된다는 사실이 참 다행입니다.)

 

하지만 수많은 음원을 라이브러리(아이튠즈의 보관함)에 추가하다 보니 중복된 음악도 생기고, 파일의 이름을 바꿔서 연결이 끊어지기도 합니다. 중복된 음악은 재생이라도 되지만, 파일명이 변경되거나 파일이 없어진 경우 재생을 멈추고 다음과 같은 에러 메시지를 출력하게 됩니다.

 

이렇게 되면 노래도 함께 끊기게 되니 다시 재생해주는 것이 여간 불편한 일이 아닐 수 없습니다. 더군다나 아이튠즈를 이용해 음원관리를 하시는 분들께는 중복 음원은 피같은 용량을 낭비하게 되는 일입니다. 저장공간은 곧 돈으로 연결되기 때문이죠.

 

다행인 것은 중복파일을 윈도우 탐색기로 일일이 찾아 삭제할 필요 없이 아이튠즈에서 자체적으로 '중복 파일 보기' 기능을 제공합니다. iTunes 11로 업데이트 되면서 삭제된 기능이었는데 다행히도 11.1로 업데이트 되면서 다시 사용할 수 있게 되었습니다. ('애플이 아이튠즈 11에서 제거한 7가지 기능', http://macnews.tistory.com/596)

 

※ 아래 방법은 음원 파일 뿐만 아니라 아이튠즈 보관함에 등록된 모든 컨텐츠에 사용할 수 있습니다.

 

아이튠즈에서 중복 파일 보기 기능 사용하기

 

1. 메뉴에서 보기 > 중복된 항목 보기를 선택합니다. 노래 제목과 아티스트가 같은 음악을 검색합니다.

 

아래와 같이 중복된 항목들이 표시됩니다. 제이슨 므라즈의 'A Beautiful Mess'는 노래 제목과 아티스트는 같지만 다른 앨범에 수록된 곡이네요~

 

2. 음원을 많이 가지고 계신 분이라면 라이브 버전처럼 여러 버전의 노래를 가지고 계실 겁니다. 윈도우에서는 Shift키, Mac에서는 Alt 키 또는 Option 키를 누른 상태로 메뉴의 보기 > 완전히 중복된 항목 보기를 선택합니다. 이렇게 하면 제목, 아티스트 뿐만 아리나 앨범까지 같은 항목들이 표시됩니다.

 

이전에는 있었던 'A Beautiful Mess'가 사라진 것이 보입니다. 

 

3. 이제 중복된 항목들을 Ctrl키(맥에서는 Command키)를 누르고 선택해 없애주면 됩니다.

※ Delete키를 이용해 삭제하는 보관함에서만 삭제되고, Shift + Delete (맥에서는 Option + Delete)를 이용하면 파일을 삭제할 수 있는 옵션이 나타납니다.

 

4. 중복된 항목을 좀 더 쉽게 삭제하고 싶은 경우 '보관함에 추가된 시간'순으로 정렬해 삭제하면 편합니다. 이름-시간-아티스트...가 있는 부분을 마우스 [오른쪽 클릭] - [추가된 날짜]를 선택합니다.

 

"추가된 날짜" 부분을 클릭하면 보관함에 추가된 시간 순으로 정렬됩니다.

 

5. 파일과의 연결이 끊긴 경우 맨 오른쪽에 ! 느낌표가 표시됩니다. 표시되지 않는 경우 처음부터 한곡씩 넘기면서 플레이해 주면 에러 메시지와 함께 연결이 끊어진 파일이 표시됩니다.


WRITTEN BY
편지함
The Base Code of the Human Race

,

윈도우 7에서 새로 추가된 기능, '슈퍼바'


 아마 윈도우 XP, 비스타에서 윈도우 7로 오면서 일어난 가장 큰 변화는 작업표시줄의 변신일 것입니다. '슈퍼바(Superbar)' 기능은 기존의 '빠른 실행'과 '실행 중 작업'을 효과적으로 섞어내면서 매우 편리한 작업환경을 제공합니다.


 기존의 작업 표시줄은 작은 아이콘과 실행중인 작업의 이름을 표시했지만, 사실 아이콘을 임의로 바꾸지 않는 한 대부분의 작업을 구분하는 데는 아이콘만으로 충분합니다. MS는 이에 착안하여 실행중인 프로세스를 적은 공간에 더 많이 표시함은 물론, 더 직관적으로 구분할 수 있는 방법으로 큰 아이콘들을 배치하는 '슈퍼바'라는 방식을 고안했습니다. 물론 이것이 기존에 없었던 새로운 기능은 아닙니다. 맥OSX는 기본적으로 이와 비슷한 '독(Dock)'을 오래 전부터 사용하고 있고, 많은 윈도우 유저들이 RocketDock과 같은 프로그램을 통해 이런 '독'을 사용해 왔습니다. MS도 윈도우 7부터 이런 '독'의 개념과 기존의 강력한 '작업 표시줄'을 결합하여 '슈퍼바'를 만들어 냄으로써 접근성과 편리함을 제공할 뿐만 아니라, 매우 크게 성장하고 있는 타블렛 시장의 터치 인터페이스에도 대응할 수 있게 되었죠. '슈퍼바'는 터치 인터페이스를 크게 강화한 윈도우 7의 후속 버전인 윈도우 8에도 그대로 계승되면서 그 효과를 발휘하고 있습니다.


 이런 '슈퍼바'를 처음 접하는 경우 당황할 수 있지만, 익숙해 지면 정말 정말 편리합니다. 위의 그림처럼 슈퍼바에 등록한 아이콘들을 꾸며서 심플하고 직관적이게 만들 수도 있죠. 아직 슈퍼바에 익숙하지 않으신 분들이라면 이 기사(베타뉴스, http://www.betanews.net/article/487913)를 참고하셔서 좀 더 친숙해 지시기를 바랍니다.


 저 역시 윈도우 7 출시 이후부터 오랫동안 윈도우 7를 사용했고, 하드웨어 호환 문제로 인해 아직 윈도우 8로 업그레이드를 하지 못하고 있습니다. 하지만, 최근 슈퍼바에 등록한 아이콘 중 하나의 위치가 계속 바뀌는 문제가 발생했습니다. 아이콘을 다시 원하는 자리로 옮겨도 일정 시간이 지나면 다시 원래의 자리로 돌아가는 것이었습니다. 슈퍼바의 편리한 기능 중 하나가 Win키 + 숫자키를 통해 슈퍼바에 등록 프로그램을 빠르게 실행할 수 있다는 점인데, 자주 사용하는 프로그램이 계속 맨 뒤로 가 버리니 이를 사용할 수 없게 되었죠. 그런데, 얼마 전 이 문제의 해결 방법을 알게 되었습니다.


슈퍼바 아이콘이 임의로 변경되는 문제


 슈퍼바에 등록한 아이콘의 순서가 임의로 바뀌거나, 순서가 바뀌지 않는 문제는 주로 64비트 윈도우에서 발견되고 있는 것으로 보입니다. 이 문제의 자세한 원인은 알 수 없으나(Microsoft Answers에도 이와 관련된 몇 가지 질문이 등록되어 있으나 명확한 원인을 제시하고 있지는 않습니다.) 슈퍼바에 아이콘을 등록하는 과정에서 발생하는 문제인 것으로 추정됩니다.


 슈퍼바에 아이콘을 등록하는 경우 "C:\Users\사용자 이름\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"에 해당하는 프로그램의 바로가기가 생성되고, 윈도우는 이 폴더에 있는 바로가기(.lnk)를 슈퍼바에 표시하게 됩니다. 이 과정에서 윈도우의 비정상적인 종료나 기타 다른 이유로 인해 바로가기가 정상적으로 연결되지 않거나, 손상되는 경우 관련 문제가 발생하는 것으로 추정됩니다.


이는 문제가 있는 바로가기를 삭제한 후, 슈퍼바에 다시 등록하면 해결됩니다.


1. 문제가 있는 슈퍼바 아이콘에 해당하는 프로그램을 모두 닫고, 아이콘을 [오른쪽 클릭] - [이 프로그램을 작업 표시줄에서 제거]를 선택합니다.


2. 대부분의 경우 아이콘을 삭제했음에도 불구하고, 아이콘이 여전히 슈퍼바에 남아 있을 것입니다. 해당 아이콘을 클릭해 실행을 시도해 봅니다. 아이콘이 삭제된 경우 5번로 이동해서 아이콘을 다시 등록하시면 됩니다.


3. 다음과 같은 오류가 나타날 것입니다. 예(Y)를 눌러 손상된 바로가기를 삭제합니다.


4. 슈퍼바에서 해당 바로가기가 삭제된 것을 볼 수 있습니다.

여전히 바로가기가 남아 있는 경우, 탐색기를 이용해 "%appdata%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar" 로 이동하여 해당 바로가기가 있다면 삭제하고 탐색기를 재실행하거나 로그오프 후 다시 로그인 합니다.


5. 이제 해당 프로그램을 다시 실행해 줍니다. 그리고 해당 아이콘을 [오른쪽 클릭] - [이 프로그램을 작업 표시줄에 고정]을 선택합니다.


6. 해당 아이콘을 원하는 위치로 옮겨 주면 됩니다.







WRITTEN BY
편지함
The Base Code of the Human Race

,

브랜드 노트북이나 조립 컴퓨터가 아닌 브랜드 컴퓨터를 쓰시는 분들이라면 윈도우 로그온 화면 배경이 제조사의 커스터마이즈에 의해 바뀌어 계신 분들이 많을 겁니다. 윈도우7의 기본 로그온 화면은 이렇습니다.


제조사의 로그온 화면이 맘에 안 드시는 분들도 계실 거고, 기본 로그온 화면에 질린 분들도 계실 겁니다. 그래서 지금부터 로그온 화면을 변경하는 방법에 대해 소개하려고 합니다.


Windows 7 로그온 화면 변경하기


※ 본 방법은 시스템 레지스트리를 변경하는 작업을 포함합니다. 다른 시스템 레지스트리를 건드리지 않도록 유의하세요.

※ 윈도우7, 윈도우 서버 2008 기본 로그온 화면은 스누피님 블로그 - http://snoopybox.co.kr/685 에서 받으실 수 있습니다.


1. 먼저 [시작] - [regedit] 입력 - [오른쪽 클릭] - [관리자 권한으로 실행], 또는 [시작] - [모든 프로그램] - [보조 프로그램] - [실행] 오른쪽 클릭 - [관리자 권한으로 실행] - [regedit 입력]과 같은 방법으로 레지스트리 편집기를 관리자 권한으로 실행합니다.

(※ 관리자 권한으로 실행하는 방법에 대해서는 명령 프롬프트(cmd) 관리자 권한으로 실행하기 참고)

관리자 권한으로 열린 [실행]


2. 레지스트리 편집기 화면에서 아래 경로로 이동합니다.
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background


3. OEMBackground를 더블 클릭하여 값 데이터(V)의 값을 1로 변경합니다.
※ OEMBackground라는 값이 없는 경우 [마우스 오른쪽 클릭] - [새로 만들기] – [DWORD(32비트) 값]에서 OEMBackground라는 이름의 값을 추가하면 됩니다.


4. 윈도우 탐색기를 실행해 C:\Windows\System32\oobe\info\backgrounds 폴더로 이동합니다.

※ 만약 이 위치에 해당 폴더가 없는 경우에는 폴더를 생성해 줍니다.

로그온 배경화면으로 사용할 이미지를 준비해 "backgrounds"에 넣고, 이름을 backgroundDefault.jpg로 바꿔 줍니다.이때 로그온 화면으로 설정될 이미지의 파일의 크기는 256KB 미만이어야 합니다.


5. [시작] - [로그오프(L)] 혹은 [사용자 전환(W)], [잠금(O)], [Win 키 + L](잠금) 등을 이용하여 바뀐 화면을 확인합니다.



로그온 화면이 변경되지 않는 경우


위의 방법을 잘 따라했는데도 로그온 화면이 변경되지 않는 경우 다음 절차를 따르면 됩니다.


1. 이전과 같은 방법으로 관리자 권한으로 로컬 그룹 정책 편집기(gpedit.msc)를 엽니다.

  • [시작] - [gpedit.msc 입력] - [오른쪽 클릭] - [관리자 권한으로 실행]
  • [시작] - [모든 프로그램] - [보조 프로그램] - [실행] 오른쪽 클릭 - [관리자 권한으로 실행] - [gpedit.msc 입력]


2. 로컬 그룹 정책 편집기가 뜨면 [컴퓨터 구성(Computer Configuration)] - [관리 템플릿(Administrative Templates)] - [시스템(System)] - [로그온(Logon)]에서 "항상 사용자 지정 로그온 배경 사용(Always use custom logon background)"항목을 찾아 더블 클릭 합니다.


3. 사용(E)에 체크하고 확인을 누릅니다.


4. 이전과 같은 방법으로 로그온 화면이 변경되었는지 확인합니다.


WRITTEN BY
편지함
The Base Code of the Human Race

,

관리자 권한 문제가 발생하는 이유, UAC(사용자 계정 컨트롤)

윈도우 비스타부터 UAC(사용자 계정 컨트롤)이 추가되면서 각 사용자 계정에 대한 보안 정책이 강화되었습니다.

※ 사용자 계정 컨트롤에 대해 더 궁금하신 분은 "사용자 계정 컨트롤(UAC)이란?" - 캐블님 블로그를 참고하세요


그래서 사용자가 시스템의 주요 설정을 변경하려는 경우 관리자 권한이 필요하게 되고, 이런 명령들을 일반 사용자 계정에서 실행하면 사용자 계정 컨트롤이 해당 명령의 실행을 차단하고 결국 액세스가 거부되었다는 메세지를 출력하게 됩니다.

따라서 이런 명령들을 사용하려면 다음과 같은 방법 중 하나를 따라야 합니다.
1. 사용자 계정 컨트롤(UAC) 끄기
2. 어드민 계정(Administrator) 활성화
3. 명령 프롬프트를 관리자 권한으로 실행


첫번째 방법의 경우 명령 프롬프트가 항상 관리자 권한으로 실행됩니다. 하지만 보안 상 권장하지 않는 방법입니다.

(UAC를 끄는 방법은 "사용자 계정 컨트롤(UAC) 끄기" - 캐플님 블로그 참고)


두번째 방법은 어드민 계정을 활성화하여 슈퍼 관리자 계정을 사용하는 방법입니다. 이 방법은  윈도우 비스타, 윈도우 7에서 주로 사용된 방법이나, 윈도우 8에서는 어드민 계정을 사용하는 경우 윈도우8의 최대 강점인 앱을 사용할 수 없습니다.


세번째 방법은 필요할 때만 명령 프롬프트를 관리자 권한으로 실행하는 방법입니다. 이 방법을 가장 권장하며 이 글에서는 세번째 방법에 대해 소개할 것입니다.


명령 프롬프트 관리자 권한으로 실행하기


명령 프롬프트를 관리자 권한으로 실행하는 방법에는 여러 가지가 있습니다.


바로가기를 [Ctrl + Shift + 클릭] 하여 실행


타일, 시작 메뉴, 슈퍼바 등에 있는 프로그램 바로가기를 Ctrl + Shift 키를 동시에 누르고 클릭하여 실행하면 해당 프로그램이 관리자 권한으로 실행됩니다.



바로가기 오른쪽 클릭 - 관리자 권한으로 실행(A)


타일, 시작 메뉴, 슈퍼바 등에 있는 프로그램 바로가기를 오른쪽 클릭하여 [관리자 권한으로 실행(A)] 선택


[시작] - [모든 프로그램] - [보조 프로그램] - [명령 프롬프트] 바로가기에 오른쪽 클릭 [관리자 권한으로 실행(A)] 선택


※ 슈퍼바 바로가기의 경우 Shift키를 누르고 오른쪽 클릭해야 메뉴가 나타납니다.



바로가기에 관리자 권한 실행 속성 적용


프로그램 바로가기의 속성을 변경하여 다음에도 해당 바로가기를 실행하면 관리자 권한으로 실행되도록 해 주는 방법도 있습니다.


명령 프롬프트 바로 가기 오른쪽 클릭 - [속성(R)] - [고급(D)]


고급 속성 대화 상자에서 [관리자 권한으로 실행(R)] 체크



관리자 권한으로 실행된 명령 프롬프트


이렇게 실행된 명령 프롬프트는 '관리자'라는 문구가 앞에 나타나 관리자 권한으로 실행되고 있는 것을 확인할 수 있습니다.



WRITTEN BY
편지함
The Base Code of the Human Race

,

Windows Vista 서비스 팩 1(SP1)을 설치하면 나중에 SP1을 삭제할 때를 대비하여 예전 파일들을 백업해 놓습니다.

하지만, SP1을 제거하지 않는 경우 이런 백업들은 전혀 필요가 없게 됩니다.

(Windows Vista SP1 설치는 Windows Vista SP1 한국어(다국어) 정식 릴리즈 참고)


결국 이 백업들은 일정량의 디스크 공간을 차지하게 되므로, 이 백업들을 제거해 디스크 여유 공간을 확보할 수 있게 됩니다.


이를 수행하는 명령이 vsp1cln 명령입니다.

vsp1cln 명령은 "Vista SP1 Cleaner"의 약어로 500MB에서 많게는 3GB까지 빈 공간을 만들어 줍니다. 이는 사용자 환경에 따라 다를 수 있습니다.


주의! 이 명령을 실행하면 서비스팩1을 제거할 수 없습니다.


윈도우 비스타 서비스팩1(Vista SP1) 백업 파일 삭제하기


1. 관리자 권한으로 명령 프롬프트를 실행합니다. (명령 프롬프트(cmd) 관리자 권한으로 실행하기 포스트 참조)


2. vsp1cln.exe (exe는 생략 가능)를 입력합니다.
사용자 삽입 이미지

계속하시겠습니까? 라는 문구가 나오면 [Y]를 눌러줍니다.

명령을 실행할 때 나오는 주의 문구에서 알 수 있는 바와 같이, 이 명령을 실행하면 서비스팩1을 제거할 수 없으니 주의하세요.



WRITTEN BY
편지함
The Base Code of the Human Race

,

안드로이드의 화면 회전


대부분의 스마트폰은 자이로스코프와 중력센서가 있어 스마트폰을 회전하면 그에 맞게 화면을 회전시킬 수 있습니다. 안드로이드에서는 설정을 통해 스마트폰을 회전했을때 화면을 자동으로 회전시킬지 아니면 그대로 유지할 지를 결정할 수 있습니다.


안드로이드 알림 서랍 (Notification Drawer)의 빠른 설정



일반적으로 세로가 긴 세로화면 모드를 Portrait, 가로가 긴 가로화면 모드를 Landscape라고 부릅니다.

image from "Designing for Multiple Views and Orientations using Blend", blendinsider


화면을 자동으로 회전하는 경우 누워서 스마트폰을 보거나 잠시 들었다 놓았다 하는 경우에도 화면이 회전하기 때문에 불편하고, 화면을 회전할 때에 걸리는 시간이 있어 대부분의 사용자들은 자동 회전을 해제하고 사용합니다.


하지만 가끔 화면을 회전하고 싶은 경우가 있습니다. 이때에는 일일이 설정에 들어가서 1. 화면 자동 회전을 켜고 2. 화면을 회전한 뒤 3. 화면 자동 회전을 끄고 4. 원하는 앱을 실행한 뒤 5. 볼일이 끝나면 다시 설정에 들어가서 6. 화면 자동 회전을 켜고 7. 화면을 다시 세로로 회전한 뒤 8. 화면 자동 회전 옵션을 끄는 (물론 요즘 스마트폰에서 대부분 지원하는 알림 서랍에 있는 빠른 설정을 통해 - 첫번째 스크린샷 참조 - 이 과정을 줄일 수 있지만) 불필요한 과정을 거쳐야 합니다.

안드로이드 디스플레이 설정에 있는 화면 자동 회전 옵션



또, 자동 화면 회전 옵션을 켜더라도 세로모드나 가로모드를 지원하지 않는 앱들이 있습니다. 대표적으로 게임류 앱이나, 삼성 기본 홈 런쳐인 '터치위즈', 금융앱 등이 그것이죠. 그래서 기기 설정에서 '자동 회전' 옵션이 활성화 되어 있더라도 화면을 회전할 수 없습니다.


지금부터 소개할 어플인 'Rotation Lock'은 기기를 회전할때마다 화면을 회전할 지 말지 결정할 수 있도록 도와주는 어플입니다. 화면회전을 지원하지 않는 앱에 대해서도 화면을 강제로 회전할 수 있습니다.

 

화면 회전을 자유롭게! Rotation Lock


Rotation Lock(Adaptive)

MICGOOWARE

Android, Google Play Store

가격: 무료

구동환경: 2.2 (Froyo) 이상

루팅 필요: X

링크 : https://play.google.com/store/apps/details?id=ui.robot.rotate


Rotation Lock은 구글 플레이 스토어에서 무료로 다운로드 가능하고, 루팅은 필요 없으며 안드로이드 2.2 (프로요) 이상 환경에서 작동합니다. 대부분의 스마트폰이 2.3 (진저브레드) 이상이고 프로요는 찾아보기 힘들 정도니 거의 모든 환경에서 잘 작동한다고 보면 됩니다.


판매자의 설명에 따르면, 이 어플을 사용하면 사용자가 원할 때에만 화면을 회전할 수 있으니 매우 생산적이며, 많은 연산을 요구하는 화면 회전을 불필요하게 하지 않기 때문에 배터리를 아낄 수 있다고 합니다.

이 어플을 실행하면 상태바(Status Bar)에 Adaptive Rotation Lock 아이콘이 나타납니다.

(메모리에 어플이 상주하게 되는데, 어플의 크기가 작고 차지하는 메모리도 매우 작으니 걱정할 필요는 없습니다.)


이제 우리가 원하는 회전 모드(Rotation Mode)를 선택하기 위해 상태바를 끌어 내려 알림 서랍의 Adaptive Rotation Lock 아이콘을 터치해 줍니다.


그러면 아래와 같이 8가지 회전 옵션을 선택할 수 있습니다.



각각의 회전 모드를 간략히 설명하면 다음과 같습니다.

  1. Adaptive Lock : 기기을 회전하면 화면에 회전 아이콘을 표시하고, 사용자가 이 아이콘을 터치하면 화면을 회전하여 고정
  2. Landscape : 가로로 화면 고정
  3. Portrait : 세로로 화면 고정
  4. Reverse Portrait : 뒤집힌 세로모드
  5. Reverse Landscape : 뒤집힌 가로모드
  6. Force Auto : 모든 어플 강제로 자동 회전
  7. Stock Auto : 자동 회전 (기본 자동 회전 활성과 동일)
  8. Stock Portrait : 자동 회전 해제 (기본 자동회전 비활성과 동일)
  9. Disable : Adaptive Rotation 어플 종료 (메모리에 어플이 상주하지 않음)

사용자의 입맛에 따라 설정할 수 있지만 개인적으로 'Adaptive Lock' 모드를 추천합니다.

기기를 회전할 경우 아래와 같이 화면 중앙에 회전 아이콘이 나타나는데,


화면을 회전하고 싶은 경우에만 이 아이콘을 클릭하면 됩니다. 즉, 화면을 선택적으로 회전할 수 있는 것이죠. 화면 회전을 지원하지 않는 어플도 강제로 회전할 수 있습니다.

화면 회전 아이콘을 눌러 홈화면을 회전한 모습


아래 그림처럼 기기의 방향에 따라 화면 방향(Orientation)을 자유롭게 변경할 수 있습니다.

image from "Rotation Lock product page" at Google play store


마지막으로 개발자가 올린 어플 구동 영상입니다.




WRITTEN BY
편지함
The Base Code of the Human Race

,

글에 앞서


※ 본 팁은 파이어폭스의 램 캐시를 이용하는 방법입니다. 디스크 캐시를 이용하려는 경우나 자신에게 맞는 캐시 관리법을 찾으려는 경우 이 글(파이어폭스 캐시 관리하기)을 참고하세요.


파이어폭스 램 캐쉬(메모리 캐쉬) 사용하기


1. 우선 기존에 있던 캐시파일을 지워 줍니다. Firefox의 캐시 폴더는 아래의 경로에서 찾을 수 있습니다.

- Windows XP: C:\Documents and Settings\[사용자 이름]\Local Settings\Application Data\Mozilla\Firefox\Profiles\[프로필 이름]\Cache

- Windows Vista 이상: C:\Users\[사용자 이름]\AppData\Local\Mozilla\Firefox\Profiles\[프로필 이름]\Cache


2. 캐시 폴더를 삭제했다면, 파이어폭스 주소창에 about:config 라고 입력합니다.




2. 고급 환경 설정 기능 동의 창에서 동의 버튼을 틀릭합니다.


3. 검색에 browser.cache를 입력하고 다음 값들을 수정해 줍니다. (각 값들은 더블클릭하여 수정할 수 있습니다.)


browser.cache.disk.capacity - 0 입력

- 디스크 캐시 사용 용량을 0 으로 합니다.

browser.cache.disk.enable - false

- 디스크 캐시를 사용하지 않도록 합니다.

browser.cache.memory.enable - true

- 램 캐시를 사용하도록 합니다.


파이어폭스 램 캐시가 활성화 되었습니다. 이제 램 캐시의 크기를 조절해 봅시다.


4. 새 탭을 열고 주소창에 about:cache?device=memory 를 입력해 현재 캐시 사용량을 확인합니다.

Maximum storage size가 현재 설정된 메모리 캐시 용량이고 Storage in use가 현재 사용중인 메모리 캐시 크기입니다.

저는 현재 약 1MB(1616KB)의 캐시를 이용하고 있고 제 컴퓨터의 램이 8GB이므로 메모리 캐시의 용량을 넉넉하게 1GB=1048576KB로 잡아 주기로 했습니다. 자신의 램 용량과 Storage in use값을 참고해서 램 캐시 용량을 정해 줍니다.


5. 다시 고급 환경 설정(about:config)으로 돌아와 빈 공간에 마우스 오른쪽 클릭-[새로 만들기]-[정수]를 선택합니다.



6. 환경 설정 이름에 browser.cache.memory.capacity 를 입력하고 확인을 누릅니다.


7. 위에서 정한 램 캐시 용량을 입력합니다. 단위는 KB입니다.


8. 램 캐시 설정이 끝났습니다.


WRITTEN BY
편지함
The Base Code of the Human Race

,

요즘 무선 네트워크(WiFi)의 보급이 활성화되면서 노트북이나 스마트폰을 사용하는 사람의 대다수가 무선 네트워크를 통해 인터넷을 이용하고 있습니다.


무선 인터넷에 연결할 경우 윈도우에서는 그 설정값을 기억하고 다음에 그 네트워크가 발견될 경우 한번의 클릭만으로 연결하거나, 저장된 네트워크에 자동으로 연결합니다.

여러개의 무선 네트워크가 검색되는 모습여러개의 무선 네트워크가 검색되는 모습


하지만 이렇게 이전에 연결했던 네트워크들이 여러개 있을 경우, 자신이 원하는 네트워크로 연결되지 않고 자동으로 다른 네트워크로 연결될 때가 있습니다.


이럴 때는 네트워크 연결 우선 순위를 조절해 우선적으로 연결할 네트워크를 지정할 수 있습니다.
물론, 원하지 않는 무선 네트워크에 자동으로 연결되는 것을 방지하는 것도 가능합니다.


네트워크 연결 우선 순위 조절하기(연결 순서 바꾸기)


1. 시작 메뉴-'무선 네트워크'를 입력해 [무선 네트워크 관리]로 들어갑니다.

(또는 제어판-네트워크 및 인터넷-무선 네트워크 관리)


2. 원하는 무선 네트워크를 선택하고 오른쪽 클릭-[위로 이동] 또는 [아래로 이동]을 클릭해 연결 순서를 조정합니다.

무선 네트워크 관리


이렇게 되면 해당 네트워크들이 연결 하능한 경우 위에서부터 차례대로 접속을 시도합니다.


무선 네트워크 자동 연결 막기


1. 같은 방법으로 '무선 네트워크 관리'에서 수정하려는 무선 네트워크의 프로필을 선택하고 [속성]을 클릭합니다.

무선 네트워크 관리 화면


2. '이 네트워크가 범위 내에 있을 떄 자동으로 연결(M)'체크를 해제합니다.



WRITTEN BY
편지함
The Base Code of the Human Race

,
※ 이 팁은 윈도우 XP, 비스타 사용자에게만 해당되는 팁입니다. 윈도두7 사용자들께서는 제어판-글꼴에서 내장된 클리어타입 튜너를 사용하세요!

윈도우 XP나 비스타에서 맑은 고딕과 같은 글꼴이 뿌옇게 보이거나 가독성이 떨어지는 경우 클리어타입(ClearType)  기술을 적용해 가독성을 높일 수 있습니다. 이 블로그에서도 기본 서체로 맑은 고딕과 나눔 고딕을 사용하고 있습니다.
(참고 : 이 블로그는 맑은고딕과 나눔고딕을 사용합니다)

클리어타입이란?


클리어타입(ClearType)이란 마이크로소프트에서 개발한 글꼴 렌더링 기술로, 컴퓨터 화면에서 출력되는 문자열의 모양을 특정한 방식으로 개선해 줍니다.
 
컴퓨터의 화면은 화소로 이루어져 있기 때문에. 이러한 화소에 보여지는 문자는 글자가 뭉게지고(에일리어싱), 평판 모니터에서 가독성이 떨어져 눈이 쉽게 피로해집니다. 따라서 클리어타입 기술을 글꼴에 적용하여(앤티 에일리어싱을 사용) 문자 가독성을 높일 수 있습니다.

이런 클리어타입 기술은 윈도우 XP부터 적용되어 왔습니다.

※ 클리어 타입 글꼴이라는 말은 잘못된 말입니다.
클리어타입은 오픈타입이나 트루타입과 같은 글꼴자체 기술이 아니라 글꼴 렌더링 기술입니다. 그래서 "맑은 고딕은 클리어타입 글꼴"이라는 말을 쓸 수 없습니다. 맑은 고딕은 오픈타입 글꼴이고, 맑은 고딕에 클리어타입 렌더링을 적용하게 되는 것입니다. 



윈도우XP, 비스타에 클리어타입(ClearType) 적용하기


1. Microsoft Typography에서 온라인 클리어타입 튜너 사용하기

http://www.microsoft.com/typography/cleartype/tuner/Step1.aspx 에서 ActiveX 설치를 통해 클리어타입 튜너를 사용할 수 있습니다.


2. 클리어타입 튜너 파워토이 (ClearType Tuner PowerToy) 설치하기

마이크로소프트 클리어타입 튜너 파워토이를 설치하여 제어판에서 클리어타입 튜너를 사용할 수 있습니다.
 
다운로드 : http://www.microsoft.com/typography/ClearTypePowerToy.mspx
(setup.exe – 2.47MB)

클리어타입 튜너를 설치하면 제어판-모양 및 테마에서 ClearType Tuning이라는 항목을 찾을 수 있습니다. 

※클래식 보기의 경우 다음과 같은 아이콘을 찾아 클릭해 주세요.


'Turn On ClearType' 에 체크하고, 오른쪽 아래의 'Start Wizard' 를 클릭하여 순서에 따라 자신에게 가장 편안하고 잘 보이는 부분을 선택하면 됩니다.

'Start Wizard'를 클릭하여 순서대로 진행하지 사용하지 않고, 상단의 Advanced 탭을 클릭하여 사용자가 글꼴을 직접 선택해 튜닝하는 것도 가능합니다.

WRITTEN BY
편지함
The Base Code of the Human Race

,

윈도우 7, 윈도우 비스타를 사용하시는 여러분 중 돋보기 기능이나 윈도우 내레이터 및 화상키보드가 부팅 할 때마다 시작되는 경우를 한번씩은 경험해 보셨으리라고 생각합니다.

사용자 삽입 이미지

귀차니즘을 유발하는 돋보기 기능


이럴 때, 어떤 방법을 쓰더라도 꺼지지 않는데다가 돋보기의 경우 클리어타입 기능까지 꺼버려 트루타입 폰트를 사용하는 글씨(ex. 맑은 고딕)가 흐릿하게 보이는 경우 답답하기 일쑤인데요, 간단한 방법을 통해 이 기능을 끌 수 있습니다.
 

1. 시작 - 제어판 또는, 시작 - 하단의 검색창에 제어판을 입력해 제어판으로 이동합니다.

2-1. 윈도우 7의 경우
제어판 오른쪽 상단의 보기 기준 오른쪽 화살표를 눌러 큰 아이콘을 선택한 뒤 접근성 센터를 클릭합니다.
※ 시작 - 하단의 검색창에 접근성 센터를 입력해서 클릭해도 됩니다. 



2-2. 윈도우 비스타의 경우
제어판 왼쪽 부분의 클래식보기를 클릭한 뒤, 내게 필요한 옵션으로 들어갑니다.
※ 시작 - 하단의 검색창에 내게 필요한 옵션 모음을 입력해서 클릭해도 됩니다.

사용자 삽입 이미지


3. 모든 설정 탐색 부분을 찾습니다.

모든 설정 탐색

모든 설정 탐색 부분을 주목합니다.

  • 디스플레이가 없는 컴퓨터사용 클릭 → 내레이터켜기 체크해제
  • 컴퓨터을 보기 쉽게 설정 클릭 → 돋보기켜기 체크해제
  • 마우스 또는 키보드가 없는 컴퓨터사용 클릭 → 화상키보드 사용 체크해제

4. 사용하실 경우 체크, 끄려는 경우 체크 해제를 통해 사용 유무를 선택하실 수 있습니다.

사용자 삽입 이미지


WRITTEN BY
편지함
The Base Code of the Human Race

,