자명종 설명서

자명종 이용 매뉴얼입니다.  필요하신 분들은 다운로드 받아가시길 바랍니다.

어플 소개
자명종은 매 정시간을 알림으로(다양한 음성지원) 들을 수 있는 어플리케이션 입니다.
상단 상태바에서 바로 끌어서 설정가능하며, 토스트 팝업으로 매 정시간 팝업메시지를 띄울 수도 있습니다. 매 시간 알림기능이 작동하지만 설정을 통해 원하는 시간에만 작동하게끔 설정이 가능하며 요일별 및 15분 단위 설정 또한 가능합니다.
바쁜 생활 가운데 시간 가는줄 모르신다구요? 이젠 자명종과 함께 어떻게 시간가는지 확인해 보세요~!

다운로드 -> 자명종_이용매뉴얼



최근 1년간 한국의 인터넷 브라우져 사용통계

최근 1년간 한국의 인터넷 브라우져 사용 통계입니다.  IE의 사용률이 점점 줄고 Chrome의 비율이 점점 늘어나고 있네요.  2012년 5월을 기준으로 IE는 77.09%, Chrome은 14.66% 입니다.  Firefox, Safari 등 다른 브라우져의 비율에는 큰 변화가 없는 것으로 보아, Chrome이 IE 사용자를 잠식하고 있는 것으로 보입니다.  아마도 모바일 인터넷 트래픽의 비중이 점점 커질수록 Chrome의 상승과 IE의 하락세가 더욱 두드러질 것으로 보입니다.  ActiveX의 종말도 이제 점점 현실이 되어가는 것 같네요.  이런 변화에 맞춰 국내의 쇼핑 사이트들이나 기타 결제모듈이 있는 웹사이트들이 오픈 브라우져를 지향하고 있습니다. 예전에는 결제 때문에 IE를 꼭 써야하는 상황이었는데, 이제는 IE 없이도 대부분의 인터넷 사용이 가능한 환경이 되가고 있는 것 같습니다.

하지만, 아직 세계적인 트랜드에는 못미치는 결과입니다.  전세계적으로 보면 이미 Chrome이 IE를 앞질렀습니다.  국낸 인터넷 환경이 참 독특한 것 같습니다. 아시아 전체적으로 봐도 한국처럼 IE 사용률이 크지 않습니다.  유일하게 비슷한 곳이 호주/뉴질랜드 정도가 되겠네요.  그래도, 한국보다는 IE 사용률이 크지 않습니다.

<전세계 기준>

<아시아 기준>

<호주/뉴질랜드 기준>

 

[번역] Using DialogFragments

이 포스트는 구글 안드로이드 개발자 블로그의 포스트를 번역한 내용입니다. 원문과 표현상의 차이는 있을 수 있으나 전체적인 맥락은 동일함을 미리 말씀드리며, 한국 안드로이드 개발자들에게 도움이 되었으면 좋겠습니다.

허니컴은 앱에서 여러 액티비티 사이에서 재사용 할 수 있는 UI와 로직을 지원하기 위해 Fragments라는 것을 소개했습니다. 동시에 액티비티의 showDialog와 dismissDialog 메서드 대신 DialogFragments를 사용하길 권장하고 있습니다.

이 포스트에서는 v4 지원 라이브러리 (허니콤 이전 버전 호환을 위한)를 이용해 DialogFragments를 어떻게 사용하는지 간단한 대화창을 통해 보여드릴 것입니다. Dialogs와 관련한 디자인 가이드라인은 Android Design 사이트를 참고하시기 바랍니다.

 

레이아웃

여기에 fragment_edit_name.xml라는 이름을 가진 대화창의 레이아웃이 있습니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/edit_name"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:layout_gravity="center" android:orientation="vertical"  >

    <TextView
        android:id="@+id/lbl_your_name" android:text="Your name"
        android:layout_width="wrap_content" android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/txt_your_name"
        android:layout_width="match_parent"  android:layout_height="wrap_content"
        android:inputType=”text”
        android:imeOptions="actionDone" />
</LinearLayout>

두 개의 선택적인 속성을 주의해 보시기 바랍니다.  android:inputType=”text” 속성과 함께 설정된 android:imeOptions=”actionDone” 속성은 소프트 키보드가 엔터키 대신 완료키를 보이도록 설정합니다.

대화창 코드

대화창은 DialogFragment를 상속하며, 하위버전 호환성을 위해 v4 지원 라이브러리를 참조할 것입니다. (Eclipse 프로젝트에 라이브러리를 추가하려면, 프로젝트에서 오른쪽 마우스 버튼을 누르고 Android Tools | Add Support Library를 선택하면 됩니다.)

import android.support.v4.app.DialogFragment;
// ...

public class EditNameDialog extends DialogFragment {

    private EditText mEditText;

    public EditNameDialog() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_edit_name, container);
        mEditText = (EditText) view.findViewById(R.id.txt_your_name);
        getDialog().setTitle("Hello");

        return view;
    }
}

대화창은 DialogFragment를 상속하고 반드시 필요한 빈 constructor를 포함합니다.  Fragments는 onCreateView() 메서드가 제공된 LayoutInflater를 이용해 실제로 뷰를 로딩하도록 구현합니다.

 

대화창 보이기

이제 Activity에서 대화창을 보여주는 코드가 필요합니다. 여기에 사용자의 이름을 입력할 EditNameDialog를 즉시 보여주는 간단한 예제가 있습니다. 작업 완료 후, 입력된 텍스트를 Toast로 보여줍니다.

import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
// ...

public class FragmentDialogDemo extends FragmentActivity implements EditNameDialogListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        showEditDialog();
    }

    private void showEditDialog() {
        FragmentManager fm = getSupportFragmentManager();
        EditNameDialog editNameDialog = new EditNameDialog();
        editNameDialog.show(fm, "fragment_edit_name");
    }

    @Override
    public void onFinishEditDialog(String inputText) {
        Toast.makeText(this, "Hi, " + inputText, Toast.LENGTH_SHORT).show();
    }
}

여기에 주의깊에 봐야 할 부분이 몇 가지 더 있습니다.  먼저, Fragment API와 하위 버전과의 호환성을 위해 지원 라이브러리를 사용하고 있기 때문에, 샘플 코드의 Activity는 지원 라이브러리의 FragmentActivity를 상속합니다.  때문에, getFragmentManager() 대신 getSupportFragmentManager()를 호출합니다.

초기 뷰를 로딩한 후, 액티비티는 곧바로 show() 메서드를 호출하여 EditNameDialog를 보여줍니다.  이를 통해 DialogFragment가 Dialog에 어떤 일이 일어나고 있는지 알 수 있게 하며, Fragment 상태도 일관성을 유지하게 됩니다.  기본적으로 뒤로가기 버튼은 추가적인 코딩이 없어도 대화창을 사라지게 합니다.

 

대화창 사용하기

다음으로 EditNameDialog가 결과 문자열을 Activity로 리턴하도록 수정해 봅시다.

import android.support.v4.app.DialogFragment;
// ...
public class EditNameDialog extends DialogFragment implements OnEditorActionListener {

    public interface EditNameDialogListener {
        void onFinishEditDialog(String inputText);
    }

    private EditText mEditText;

    public EditNameDialog() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_edit_name, container);
        mEditText = (EditText) view.findViewById(R.id.txt_your_name);
        getDialog().setTitle("Hello");

        // Show soft keyboard automatically
        mEditText.requestFocus();
        getDialog().getWindow().setSoftInputMode(
                LayoutParams.SOFT_INPUT_STATE_VISIBLE);
        mEditText.setOnEditorActionListener(this);

        return view;
    }

    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (EditorInfo.IME_ACTION_DONE == actionId) {
            // Return input text to activity
            EditNameDialogListener activity = (EditNameDialogListener) getActivity();
            activity.onFinishEditDialog(mEditText.getText().toString());
            this.dismiss();
            return true;
        }
        return false;
    }
}

사용자 편의를 위해 mEditText.requestFocus()를 사용해 프로그램적으로 EditText로 포커스를 이동합니다.  다른 방법으로는 레이아웃 XML에 <requestFocus/> 태그를 사용할 수도 있습니다. 하지만, 경우에 따라서는 프로그램적으로 포커스를 호출하는 것이 더 좋을 수도 있습니다.  예를 들어, 레이아웃 XML에서 포커스를 호출할 경우, Fragment의 onCreateView() 메서드에 추가된 OnFocusChangeListener가 호출되지 않습니다.

사용자가 EditText에 포커스를 두면, 소프트 키보드가 자동으로 나타납니다.  프로그램적인 포커스로 동일한 이벤트를 발생시키려면, callgetDialog().getWindow().setSoftInputMode()를 호출합니다.  이전에 Dialog에서 사용하던 Window 관련 작업들도 동일하게 DialogFragment에서 사용할 수 있지만, getWindow() 대신에 getDialog().getWindow()를 호출해야만 합니다.  결과 대화창은 휴대폰과 태블릿에 동일하여 보여집니다:

onEditorAction() 메서드는 사용자가 완료키를 누를 때, 콜백을 처리하는데, 이는 EditText에 OnEditorActionListener를 설정했기 때문입니다. 입력된 텍스트를 전달하기 위해 Activity로 호출됩니다. 이를 위해 EditNameDialog에서 Activity에 의해 구현된 EditNameDialogListener 인터페이스를 선언합니다.  이것은 대화창이 많은 액티비티에서 재사용될 수 있게 해줍니다. onFinishEditDialog()에서 콜백 메서드를 발생시키기 위해 getActivity()를 호출하여 대화창을 실행하는 Activity의 참조키를 획득합니다.  이것은 MVCarchitecture에서 뷰가 컨테이너와 통신할 수 있게 하는 일반적인 패턴입니다.

대화창을 두 가지 방법 중 한 가지로 없앨 수 있습니다.  여기서는 Dialog 클래스 자체에 있는 dismiss()를 호출하고 있습니다.  이것은 show() 메서드처럼 Activity에서 호출 될 수도 있습니다.

이 글이 Dialogs와 관련이 있는 Fragments에 대한 이해하는데 어느 정도 도움이 되었으면 합니다.  이 글에 사용된 샘플 코드는 Google Code에서 찾으실 수 있습니다.

Fragments에 대한 추가적인 자료:

구글 블로그 원문: http://android-developers.blogspot.com/2012/05/using-dialogfragments.html

2012년 6월 6일 IPv6 공식 런칭

2012년 6월 6일 (현충일이네요.  ^^;) GMT (한국시간으로 오전 9시) 전세계적으로 IPv6가 공식 런칭됩니다.  아래 언급된 전세계 메이저 인터넷 및 네트워크 장비 회사들이 참여하고 있습니다.  IPv6가 새로 런칭되는 이유는 현재 사용하는 IPv4의 모든 IP대역이 거의 소진되었기 때문입니다.  초기 설계했을 때는 충분했으나, 컴퓨터가 기하급수적으로 늘어나면서 IP가 모자라게된 것입니다.

AKAMAI, AT&T, CISCO
COMCAST, D-LINK, FACEBOOK
FREE TELECOM, GOOGLE, INTERNODE
KDDI, LIMELIGHT, MICROSOFT BING
TIME WARNER CABLE, XS4ALL, YAHOO!

IPv6에 대한 설명은 위키피디아(http://ko.wikipedia.org/wiki/Ipv6)를 참고하시면 좋을 것 같습니다.  기본적인 개념은 현재 사용되고 있는 기존의 IPv4보다 훨씬 많은 IP 주소를 사용할 수 있다는 것입니다.  IPv4는 32 비트의 정보를 저장할 수 있지만, IPv6는 128 비트의 정보를 저장할 수 있습니다. 위키피디아의 설명에 따르면, 32비트 주소공간이란, 32 비트로 표현할 수 있는 주소영역을 지칭합니다. 32 비트에 의해 생성할 수 있는 모든 IPv4 주소는 232인 4,294,967,296개입니다.  반면에, IPv6의 128비트 주소공간은 128 비트로 표현할 수 있는 2128개인 약 3.4×1038개(340,282,366,920,938,463,463,374,607,431,768,211,456개)의 주소를 갖고 있어 거의 무한대로 쓸 수 있습니다.  현재 공식런칭까지 남은 시간을 보시려면 아래 이미지를 클릭해 보시기 바랍니다. ^^

구글 검색 효과적으로 사용하기

예전과 달리 이제 한국에서도 구글 검색을 많이 사용하고 있습니다.  안드로이드가 활성화되기 전에는 일부 전문자료 검색이 필요한 사람들만 구글 검색을 활용했지만, 스마트폰(안드로이드)이 대중화되면서, 일반 사용자들도 기본 검색엔진으로 구글을 많이 사용하고 있습니다.  그렇다면, 여러분은 구글 검색을 효과적으로 사용하고 계신가요?

구글 검색은 일반적으로 알려지지 않은 다양한 검색 옵션이 존재합니다.  추가적인 검색조건을 제시함으로 원하는 결과를 좀 더 빨리 찾을 수 있게 도와줍니다.  이런 구글 검색팁을 제공하는 인포그래픽이 있어서 공유합니다.  구글 검색이 제공하는 추가적인 검색옵션 명령어는 아래와 같은 것들이 있습니다.

site: 사이트(도메인) 주소
~ 검색할 관련 단어
“” 큰 따옴표 안의 문구와 정확히 일치하는
– 검색에서 제외할 단어
.. 검색결과에 포함할 기간

예를 들어 아래와 같이 검색어를 입력하면:
site:nytimes.com ~college test scores -STATs 2008..2010

“nytimes.com 사이트에서 college라는 단어와 관련있는 test scores라는 문구를 포함하고, STATs라는 단어는 제외된 2008년에서 2010년 사이의 데이터를 찾아라~”라는 의미가 됩니다.

이 외에도 아래와 같은 추가적인 명령어 옵션들이 있습니다.

filetype: 검색할 파일의 확장자
intitle: 타이틀에 입력한 단어를 포함하는
author: 작성자

또한 구글 검색을 아래와 같이 간편한 유틸리티로도 사용할 수 있습니다.  디테일에 강한 구글 검색!  이런 숨겨진(?) 기능들을 오늘부터 한번 사용해 보시죠~

define:  입력한 단어의 뜻을 알려줍니다
(2*3)/5+44-1  [수학공식]  입력한 수학공식을 자동으로 계산해 줍니다
54 pounds in kilograms  54 파운드를 킬로그램으로 변환한 값을 알려줍니다

Activity와 Service 혹은 두 개의 프로세스에서 SharedPreferences 값 공유하기

Gingerbread (Android 2.3)  이전 버전에서는 SharedPreferences에 저장된 값을 여러 프로세스나 Activity와 Service 사이에서 사용할 수 있었습니다.  예를 들어 PreferenceActivity에서 변경한 값을 바로 Service 프로세스에서 가져와 사용할 수가 있었죠.  하지만 최근 안드로이드 버전 (Gingerbread 이 후)에서는 명시적으로 설정하지 않는 한 같은 방식으로 사용할 수가 없습니다.   하나의 프로세스에서 SharedPreferences의 값을 변경해도 계속 이전 값만을 불러오게 됩니다.

이 문제를 해결하려면, 변경된 값을 불러오는 프로세스에서 SharedPreferences를 새로 로딩할 때 아래와 같이 설정해줘야 합니다.  이 문제를 해결하는데 며칠을 구글링했네요….  ㅠㅜ  동일한 문제를 겪고 계신 개발자분들에게 도움이 되었으면 좋겠습니다.

SharedPreferences myPrefs 
  = context.getSharedPreferences("myPrefs", Context.MODE_MULTI_PROCESS);

PreferenceActivity에서 사용자 지정 SharedPreferences 사용하기

안드로이드 개발자라면 PreferenceActivity가 얼마나 편리한지 다들 알고 계시리라 생각합니다.  PreferenceActivity (HONEYCOMB 이상은 PreferenceFragment) 에는 컨텍스트의 기본 SharedPreferences가 제공되는데, 가끔은 다른 이름이나 다른 모드로 사용해야 할 때가 있습니다.

이럴 경우 사용하는 방법이 있습니다.  PreferenceActivity에 직접적으로 특정 SharedPreferences를 지정할 수 있는 방법이 없기 때문에, 아래와 같은 코드를 사용하면 됩니다:

public class MyPreferencesActivity extends PreferenceActivity {
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    PreferenceManager prefMgr = getPreferenceManager();
    prefMgr.setSharedPreferencesName("my_preferences");
    prefMgr.setSharedPreferencesMode(MODE_WORLD_READABLE);

    addPreferencesFromResource(R.xml.preferences);
  }
}

DDMS File Explorer를 사용해서 SharedPrefereces 이름을 확인해 보시기 바랍니다.

IBM 키보드를 아이패드에서 사용하기

아이패드에 USB를 연결할 수 있는 젠더(http://store.apple.com/kr/product/MC531FE/B)를 구매하면 일반 IBM 키보드를 사용 할 수 있습니다.  하지만, 맥킨토시와 여러가지 기능키 및 단축키가 좀 다른데요.  자주 사용하는 단축키를 정리해 봤습니다.  윈도즈키가 Command 키입니다. 즉, 한영을 전환하려면 윈도즈키+스페이스키입니다. 기타 키 조합은 아래와 같습니다.

  • 윈도즈키-스페이스키 : 한영전환
  • 윈도즈키-a : 전체 선택
  • 윈도즈키-c : 복사
  • 윈도즈키-x : 잘라 내기
  • 윈도즈키-v : 붙여 넣기
  • 윈도즈키-z : 실행 취소(Undo)
  • Ctrl-A : 캐럿을 맨 앞으로 이동
  • Ctrl-E : 캐럿을 맨 되로 이동

신 개념의 검색 브라우저: Yahoo! Axis

야후!가 어제 새로운 검색 브라우저를 런칭했습니다.  Yahoo! Axis입니다.  이번 버전은 데스크탑과 iOS 기반의 모바일 기기만을 지원합니다.  아직까지는 미국의 앱스토어에서만 설치 가능합니다.  크롬, 파이어폭스 등의 데스크탑 브라우저에 플러그인/익스텐션 형태로 설치되는 데스크탑 버전은 지역에 제한이 없으니 사용해 보실 수 있습니다.

예전에 발표한 순간검색(검색창에 단어 철자를 하나 입력할 때마다 실시간으로 바로 검색결과를 노출) 기능에 검색 히스토리를 여러가지 기기에서 이어서 볼 수 있는 N-Screen을 추가적으로 구현했습니다.  현재 시장에 사용되고 있는 브라우저에 플러그인 형태로 설치되는 것도 Yahoo! Axis가 많은 사용자에게 사용될 수 있는 장점이 될 것 같습니다.  Yahoo! Axis 공식사이트에 가셔서 한번 설치해 보시기 바랍니다.  http://axis.yahoo.com/

 

전 세계 IT기업의 특허 전쟁

지난 2008년부터 지금까지 전 세계 IT기업들 간의 특허 전쟁에 관한 인포그래픽이 있어서 공유드립니다.  특허 전쟁을 이런식의 이미지로 표현하니 마치 지구 위에서 대륙간 탄도 미사일을 쏘는 것과 같은 모습입니다.  이제는 정말 아날로그적인 전쟁이 아니라, 이런 디지털 전쟁의 시대가 된 것 같습니다.

인포그래픽의 하얀 바탕은 현재 전쟁 중인 것, 회색은 합의가 이루어진 것을 의미합니다.  그리고, 동그라미 안의 숫자는 관련된 특허의 갯수입니다.  화살표 시작 시점이 검은색 동그라미는 특허소송을 처음 진행한 곳이며, 햐얀 동그라미는 상대방이 소송을 진행했기 때문에 함께 역으로 소송을 진행한 경우입니다.

화살표 색깔의 진하기는 연도를 의미합니다.  색깔이 진할 수록 최근에 진행되는 소송입니다.


by visually. Browse more data visualizations.