2014년 8월 31일 일요일

영화, A river runs through it(흐르는 강물처럼), 1992

 하지만 폴은 은연중에 부친의 마음속에 늘 존재했다.
 부친께서 돌아가시기 직전의 마지막 설교를 나는 기억한다.
 " 우리는 누구나 일생에 한번쯤은 사랑하는 사람이 불행에 처한걸 보고 이렇게 기도합니다. '기꺼이 돕겠습니다. 주님!' 그러나 필요할 때 사실 우리는 가장 가까운 사람을 거의 돕지 못합니다. 무엇을 도와야 할지도 모르고 있으며 때로는 그들이 원치 않는 도움을 줍니다. 이렇게 서로 이해 못하는 사람과 산다는 걸 알아야 합니다.
 그렇다 해도 우린 사랑할 수 있습니다.
 완전한 이해 없이도 우리는 완벽하게 사랑할 수 있습니다."

 이해는 못했지만 사랑했던 사람들은 모두 죽었다.
제시 역시..
그러나 난 아직도 그들과 교감하고 있다.
이제 나는 훌륭한 낚시꾼이 되기에는 너무 늙었다.
말리는 친구들도 있지만 아직도 홀로 낚시를 하곤한다.
어숨푸레한 계곡에 홀로 있을 때면
모든 존재가 내 영혼과 기억 그리고 빅 블랙풋 강의 소리, 4박자의 리듬, 고기가 풀리길 바라는 희망과 함께 모두 하나의 존재도 어렴풋해지는 것 같다.
그러다가 결국 하나로 녹아든다.
그리고 강이 그것을 통해 흐른다.
강은 대홍수로 부터 생겨나서 태초의 시간부터 바위 위로 흘러간다.
어떤 바위 위에는 영겁의 빗방울이 머물고 바위들 밑에는 말씀이 있고
난 강에 넋을 잃고 있다.

                                                    영화, A river runs through it(흐르는 강물처럼), 1992
                                                    감독: 로버트 레드포드

 영화가 시작해서 끝나는 순간부터 마지막까지 시종일관 흐르는 강물처럼 영화는 흘러갔다.
아마도 실제로 형이 있는 나에게 영화 속의 형제에게 더 몰입하고 공감할 수 있었는지도 모르겠다.

 영화는 제목과 같이 강물처럼 굽이굽이 흐르고 이어져 마침내는 바다를 만난듯한 벅찬 감동을 준다. 그런 굽이치는 강과 같은 삶의 모습 끝에 맞이한 부친의 돌아가시기전 마지막 설교는 너무나도 와닿는다.

 우리는 주변의 소중한 사람들이 어려움에 처하고 그로 인해 힘들어 하는 것을 수도 없이 본다. 어떻게든 도우려 발버둥치기도 하고, 때로는 그것이 부담으로 다가오기도 한다.

 하지만 부친의 설교와 같이, 많은 경우 그들을 위해 무엇을 도와야 할지도 모르고 있으며 때로는 그들이 원치 않는 도움을 주기도 한다.

 언제나 이해하진 못했지만 사랑하는 사람들이 오기도 하고 또 가기도 한다.
강에는 언제나 새로운 물이 흐르지만, 마르지 않고 영겁의 시간을 흐르듯이 우리는 강이되어 그들과 교감한다.

완전한 이해 없이도 우리는 완벽하게 사랑할 수 있다.




관심가는 lab

 CMS LAB (http://cmslab.snu.ac.kr/)
 Byung-Gon Chun
 bgchun@snu.ac.kr

 Cloud and Mobile System Lab(CMS Lab) is researching on operating and networked systems with focus on big data, cloud computing, mobile operating system, and security. We actively contribute to open-source software projects.

버젼 관리(git), source tree, git hub

 버젼 관리 공부

 https://www.slideshare.net/ibare/dvcs-git

 git 설치

 커멘드 창으로 일부 실행

 source tree 라는 프로그램으로 git 기반 버젼관리 실습 마침


앞으로 해야할 일:

 - 각종 개발, 업무 진행함에 있어서 버젼관리 익숙해지기,
 커멘드 창에서 명령어로 진행하는 것 익숙해지기.

 - 자바 예제 200 끝내기

 - 포스터 인상적인 것들 모티브로 제작해보기

 - 웹/앱 하이브리드 어플리케이션 개발 공부

 - 영어 원문 꾸준히 읽기

2014년 8월 29일 금요일

iOS 플랫폼 기기의 사용자 경험 가이드라인

iOS 플랫폼 기기의 사용자 경험 가이드라인

이 가이드라인은 개인용 휴대기기의 특성과 이에 따른 사용자 경험 요소를 구성할 때 참고할 수 있는 유용한 내용입니다. iOS뿐만 아니라 다른 플랫폼의 스마트폰에도 적용할 수 있는 내용이므로 숙지하길 바랍니다.

-       핵심 기능에 집중하라.
앱의 화면을 구성할 때 항상 이 화면에서 무엇이 가장 중요한 것인가?’를 생각해야 합니다.

-       항상 위에서 아래 방향으로 고려하라.
화면의 상단은 시각적으로 가장 눈에 띕니다. 이는 주로 기기를 쥐는 한 손이나 양손을 사용해 조작할 때 가장 잘 보이는 곳이기 때문입니다. 그러므로 가장 중요하고 상위 개념의 정보를 상단에 배치하는 것이 좋습니다.

-       사용법을 쉽고 명확하게 만들어라
사용자가 최소한의 노력으로 사용법을 익히고 사용할 수 있도록 제어 방법을 최소화하고, 표준 컨트롤 방식과 제스처 인식을 사용해야 합니다.

-       사용자 중심의 용어를 사용하라.
언어를 통해 사용자에게 정보를 제시할 때, 모든 사용자가 이해할 수 있도록 쉽고 명확한 언어를 사용해야 합니다.

-       입력하는 것을 최소화하라.
단순한 터치든 간편한 키패드 사용이든 정보 입력은 시간과 집중을 필요로 합니다. 사용자에게 중요한 자료를 제공하기 전에 입력을 요구하는 것은 앱의 흥미를 떨어뜨립니다.

-       파일을 직접 다루는 행위를 최소화하라.
iOS는 기존의 컴퓨터 플랫폼과 근본적으로 다른 방식으로 데이터를 취급합니다. 그러므로 기존의 파일 시스템과 혼동될 수 있는 파일 관리 기능은 사용하지 않는 것이 좋습니다.

-       연동과 연계 기능을 활용하라.
iOS기기는 개인용 기기이지만 개인의 데이터를 다른 사람과 공유할 수 있도록 SNS나 네트워크 기반의 연동, 연계 기능을 활용할 수 있어야 합니다. iPad의 경우 여러 사람이 함께 사용할 수 있는 특성을 이해하고 활용 방법을 고민해야 합니다.

-       사용자 설정의 사용을 줄여라
iOS의 사용자 설정은 앱을 종료해야 가능하므로 꼭 필요한 것이 아니라면 사용자 설정을 단순하게 유지하는 것이 좋습니다. 꼭 필요한 경우 앱을 종료하지 않아도 효력을 발생할 수 있도록 만들어야 합니다.

-       적합한 방법으로 브랜드를 노출하라.
조용하지만 효과적으로 개발한 앱의 정체성을 노출하려면, 사람들이 기대하는 앱의 콘텐츠나 기능을 저해하지 않는 범위 내에서 노출합니다.

-       검색 기능을 빠르고 효율적으로 만들어라
앱이 취급하는 데이터의 양이 방대하다면, 검색 기능을 효율적으로 사용할 수 있도록 설계하는 것이 좋습니다. 그러므로 높은 품질의 검색 결과를 도출할 수 있도록 다양한 방법을 모색하는 것이 좋습니다.

-       간결하라.
앱에 사용되는 언어는 쉽고 단순하며 명료해야 합니다.

-       사용자 인터페이스 요소를 일관성 있게 사용하라.
표준화된 화면 설계와 컨트롤 요소는 사용자가 쉽게 이해하고 적용할 수 있도록 돕습니다. 그러므로 표준 UI요소를 다른 용도로 사용하는 실수를 하지 않도록 주의합니다.

-       현실적인 표현 요소를 고려하라.
노트나 마이크를 사용자 인터페이스로 표현하는 것은 해당 기능의 용도를 가장 효율적으로 이해하고 사용할 수 있도록 돕는 것입니다.

-       고품질의 그래픽 소스를 활용하라.
사용자 인터페이스에 고품질 그래픽 요소를 사용하면 사람들의 관심과 집중을 극대화할 수 있습니다. 그러므로 고품질, 고해상도의 그래픽 소스를 활용하여 사용자의 관심을 끌 수 있도록 노력합니다.

-       화면 방향 변화에 대응하라.
화면의 방향이 어떻게 바뀌든 핵심 콘텐츠에 대한 초점을 유지해야 합니다. 어떤 상황에서든 콘텐츠가 화면 방향의 대응할 수 있도록 준비해야 합니다.

-       손가락의 크기를 고려하라.
멀티터치 스크린은 손가락 터치로 제어됩니다. 어떤 상황이라도 터치 인터페이스가 보장되도록 버튼 등의 제어 인터페이스의 크기를 유지해야 합니다.

-       애니메이션을 소통의 도구로 활용하라.
애니메이션은 시스템의 상태를 알려주고 피드백 정보를 표시하며, 터치 컨트롤의 직관성을 개선합니다. 또 사용자 액션의 결과를 시각화하는데 중요한 역할을 하므로 신중히 설계하고 사용합니다.

-       제스처를 적절히 사용하라.
사용자가 익숙한 방식으로 제스처를 사용할 수 있도록 일관성을 유지하고, 독립적으로 동작하는 새로운 제스처를 피하는 것이 좋습니다.

-       불필요한 저장 여부를 묻지 마라.
언제나 시스템이 사용자의 작업 물을 믿음직하게 처리하고 있다는 느낌을 주어야 합니다. 필요 이상으로 저장 여부를 묻는 것은 사용자로 하여금 시스템에 대한 불안감을 갖게 만듭니다.

-       수행모드 전환은 필요한 경우에, 최대한 단순하게 수행하라.
수행모드 전환은 사용자가 꼭 확인해야 하거나 모호한 상태를 벗어나기 위해 수행 중인 과업을 중지하는 과정에 수행하는 것이 좋습니다. 이외의 상황에 사용할 경우 사용자의 집중과 사용성 문제를 불러 올 수 있으므로 주의 깊게 설계합니다.

-       언제든지 중지할 수 있도록 만들어라.
어떤 상황이라도 과업을 중지할 수 있어야 하고, 이 과정에서 유실되는 데이터가 없도록 자동 저장합니다. 또 재실행했을 때 이전의 종료 상태로 돌아올 수 있어야 합니다.

-       앱이 프로그램적으로 종료되지 않도록 만들어라.

사용자는 앱의 종료를 시스템 충돌에 의한 비정상적인 종료로 인식하곤 합니다. 외부적인 조건에 의해 앱의 기능이 저해될 때는 적절한 피드백을 통해 상황을 설명하도록 만듭니다

애플의 iOS 휴먼 인터페이스 가이드라인(iOS Human Interface Guideline)

애플의 iOS 휴먼 인터페이스 가이드라인(iOS Human Interface Guideline)

애플은 iOS 플랫폼용 앱 개발의 지침이 되는 휴먼 인터페이스 가이드라인 문서를 배포하고 있습니다.

1.    미적 통합성
얼마나 아름답게 만들어졌는가의 문제가 아니라 그 외관이 기능에 얼마나 제대로 녹아 들었느냐를 의미한다. 정체성과 목적에 부합하는 명확하고 총체적인 메시지를 표시하고 메시지를 저해하지 않아야 합니다.

2.    일관성
 일관성 있는 인터페이스는 사람들이 그 경험과 지식을 다른 상황에서도 응용할 수 있어야 합니다. 종속된 것이 아닌 표준으로써의 장점을 갖는 것으로 이해해야 합니다.

3.    직접 조작
멀티터치는 화면 속의 대상을 직접 조작할 수 있는 환경입니다. 이것은 수행하는 과업에 더 직관성을 갖고 행동의 결과를 예측하는데 큰 장점이 있습니다. 앱에서는 장치를 움직여 화면 속 대상을 조작할 수 있고, 오브젝트를 직접 조작하며 수행 결과를 실시간으로 확인할 수 있습니다.

4.    피드백
사용자 행동에 대한 반응과 그 처리 상황을 직관적으로 알 수 있도록 합니다. 사용자는 조작 행위에 대한 반응을 즉시 확인하고,. 일련의 수행 과정에 대한 시각적인 변화를 인지할 수 있어야 합니다.
5.    메타포(상징)
가상의 대상이나 행위를 현실의 대상과 행위와 연결하고자 할 때 사용자는 그 관계를 즉시 이해할 수 있어야 합니다. 컴퓨터의 폴더와 같은 메타포는 사전 지식이 없어도 무언가를 정리해 수납하는 의미로 이해할 수 있습니다. 메타포는 그 연결 의미를 지나치게 확장하지 않고 직관적인 의미 범주 내에서 정의하는 것이 바람직합니다. 스마트폰에서는 단순히 대상뿐만 아니라 다양한 행동도 메타포로 사용하고 있습니다.

6.    사용자 컨트롤

사용자는 언제든지 수행 중인 행위나 시스템에서 진행되는 수행 과정을 제어할 수 있어야 합니다. 특히 사용자의 조작에 따른 시스템 동작이 위험하거나 파괴적인 결과를 가져올 수 있다면 언제든 결정을 철회하고 취소할 수 있어야 합니다.

2014년 8월 18일 월요일

android event(여러 가지 이벤트)

 1. 터치 입력

  boolean onTouchEvent (MotionEvent event)
  boolean onTouch (View v, MotionEvent event)

  ACTION_DOWN                  화면을 눌렀다.
  ACTION_MOVE                   누를 채로 움직였다.
  ACTION_UP                        화면에서 손가락을 뗏다.

 2. 키보드 입력

     키 입력을 받아 화면상의 원을 상하좌우로 이동 시키는 예제

     public class MoveCircle extends Activity {
private MyView vw;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vw = new MyView(this);
vw.setFocusable(true);
vw.setFocusableInTouchMode(true);
setContentView(vw);
}

protected class MyView extends View {
float mX,mY;
int mColor;

public MyView(Context context) {
super(context);
mX = 100;
mY = 100;
mColor = Color.BLUE;
}

public void onDraw(Canvas canvas) {
canvas.drawColor(Color.LTGRAY);
Paint Pnt = new Paint();
Pnt.setColor(mColor);
Pnt.setAntiAlias(true);
canvas.drawCircle(mX,mY,16,Pnt);
}

public boolean onKeyDown(int KeyCode, KeyEvent event) {
super.onKeyDown(KeyCode, event);
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (KeyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT:
mX-=5;
invalidate();
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
mX+=5;
invalidate();
return true;
case KeyEvent.KEYCODE_DPAD_UP:
mY-=5;
invalidate();
return true;
case KeyEvent.KEYCODE_DPAD_DOWN:
mY+=5;
invalidate();
return true;
case KeyEvent.KEYCODE_DPAD_CENTER:
if (mColor == Color.BLUE) {
mColor = Color.RED;
} else {
mColor = Color.BLUE;
}
invalidate();
return true;
}
}
return false;
}
}
}

android event handler(안드로이드 이벤트 처리)

 크기가 작고 입력 장치가 부족한 모바일 장비는 터치 스크린을 최대한 활용하기 위해 예외없이 그래픽  사용자 인터페이스(GUI)를 채택한다. 화려한 그래픽 인터페이스는 사용하기 편리하지만 개발하기는 더 까다롭다. 미리 정의된 절차대로 동작하는 것이 아니라 사용자의 입력이나 시스템의 상황 변화에 의해 발생하는 이벤트에 적절히 반응하도록 작성해야 한다. 그러다 보니 이벤트를 매끄럽게 잘 처리하는 기술이 중요하다.

 사용되는 자바 문법: 인터페이스 구현 및 상속, 내부 클래스, 익명 클래스

 1. 콜백 메서드 재정의
     대표적인 콜백 : boolean onTouchEvent (MotionEvent event)
                            boolean onKeyDown (int keyCodeu, KeyEvent event)
                            boolean onKeyUp (int keyCode, KeyEvent event)
                            boolean onTrackballEvent (MotionEvent event)


  예제 : onTouchEvent를 받아서 처리하기


   public class HandleEvent extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View vw = new MyView(this);
setContentView(vw);
}

class MyView extends View {
public MyView(Context context) {
super(context);
}

public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Toast.makeText(HandleEvent.this,"Touch Event Received",
Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
}
}

 *잘 모르는 것: View 클래스로 부터 MyView 클래스를 파생시켜 onTouchEvent 콜백 메서드를 재정의한다. 슈퍼클래스의 메서드를 직접 수정할 수는 없으니 재정의하려면 일단 상속부터 받아야 한다. 재정의된 메서드는 super의 메서드를 호출하여 부모에게 처리 기회를 먼저 제공하는 것이 보편적이다.


 2. 리스너 인터페이스 구현

  리스너는 특정 이벤트를 처리하는 인터페이스이다.

  1) 리스너를 상속받는 클래스를 선언하고 추상 메서드를 구현한다.
  2) 리스너 객체 TouchListner를 선언 및 생성한다.
  3) 준비된 리스너 객체를 뷰의 이벤트와 연결한다.


 3. 액티비티가 리스너 구현

 4. 뷰가 리스너 구형

 5. 익명 내부 클래스 사용

 6. 익명 내부 클래스의 임시 객체 사용