2011년 7월 30일 토요일

a] serializable 과 parcelable

자바에 객체를 저장하는 방법으로 serializable이 있다. 그와 같이 안드로이드에도 parcelable이 있더라.

사실 의미상 parcel이 패키지니까 +able(할수있다)를 붙여서 parcelable이 더 맞는 표현 인 것 같다.


안드로이드 UI 표현의 hierachy상 객체끼리 이래저래 자료를 주고 받기 힘든 부분이 있을거라고 생각했다. serialize로 해서 되는 구문도 있긴 하더라. Bundle에서 put어쩌구 시리얼 어쩌구 함수가 있는데 이 함수는 시리얼 객체를 저장할수도 있고 실재 에러도 안났다.
 꺼내보지는 않았지만.

그리고 parcelable이 안드로이드에 더 적합한 이유는 구현이 복잡하기 때문이다. 그 복잡의 정도는 일일이 넣을 멤버 변수들을 지정해줘야 하는데 있다. 사실 씨리얼라이저블도 객체의 인스턴스(C++에서는 객체의 포인터)를 저장해 놓는 정도 밖에 안된다.
 new가 malloc이니까 new해서 메모리에 생성된 객체의 주소만 알 수 있으면 그게 바로 저장의 의미일거다. -> 사실 내 입장에서는 자바의 객체들이 포인터로 밖에는 안보인다. 그래도 컴언어만 20년 넘게 했으니까.

이래저래 찾다보니 국내 블로그에서는 parcelable을 사용한 분들이 string, int 형 그리고 inner class의 class type으로 저장한 분도 계셨다. 하지만 뭔가 부족해 보였다. 자유롭게 전달하려면 void 포인터가 필요하고 거기에 걸맞는 자바 객체는 Object인데 Object 타입으로 주고 받을 수는 없을 것인가?

dest.writeString(imgData);


dest.writeString(geoData);

dest.writeInt(selectedItem);

dest.writeParcelable(imageViewer, 0);
 
이렇게 구현을 하다보니 string이나 int, array등 기본타입은 문제가 안되는데... 결국 사용자 정의 객체가 문제였다. 그리고 사용자 정의 객체를 저렇게 parcelable로 한다고 해도 그 parcelable에서 또 그 멤버변수를 string이나 int등으로 밖에 쓸 수가 없었다.
 
메써드를 찾다보니

  dest.writeValue(Object v)

가 있더라. 아... 오브젝트 타입으로 보낼수도 있구나. 결국 저게 void point로 보였고, 받는 쪽에서 캐스팅만 잘하면 쓸 수 있다는 희망이 보였다.

하지만 String Array 객체를 저장하려고 열심히 연구중이었는데
dest.writeStringList(thumbsIDList);
가 있다는 걸 알고 한심스러움을 뒤로 하고 fin.

ubuntu] SyntaxError: invalid syntax

오픈소스를 가져와서 컴파일 할 때,

파이썬 구문 에러는 파이썬을 최신으로 업그레이드 해주면 해결된다.

구문 에러 찾다가 도저히 못 찾겠을 때 ^^

2011년 7월 29일 금요일

Math Class


java.lang.Math 클래스
1. Math 클래스는 final 제한자로 선언되어 있어 상속할 수 없다.
2. 생성자는 private 제한자로 선언되어 있어 객체 생성을 할 수 없다.
3. 변수와 메소드들은 publicstatic 제한자로 선언되어 있기 때문에 객체 생성 없이 클래스 이름만으로 접근할 수 있다.
Math 클래스는 여러 수학적 계산(지수함수, 대수관계, 삼각함수 등)을 위한 두 개의 상수와 메소드들을 제공
상수
설명
Math.E
2.718281828459045
자연 로그의 밑인 e에 가장 가까운 double
Math.PI
3.141592653589793
직경에 대한 원의 원주의 비율인, Pi에 가장 가까운 double
메소드
설 명
사용 예
ceil()
인자로 들어온 값보다 작지 않은 정수 중 같건 가장 가까운 정수를 double 형으로 반환 (올림)
ceil(-3.6)
round()
인자로 들어온 값과 같거나 가장 가까운 정수를 intlong형을 반환 (반올림), double형이면 long형으로 float형이면 int형으로 반환
round(-3.6)
floor()
인자로 들어온 값보다 크지 않은 정수 중 같거나 가장 가까운 정수를 double형으로 반환 (내림)
floor(-3.6)
max()
인자로 들어온 두 값 중 가장 큰 값을 반환
max(3, 4)
min()
인자로 들어온 두 값 중 가장 작은 값을 반환
min(3, 4)
sin()
삼각함수의 사인 값을 반환
sin(30)
cos()
삼각함수의 코사인 값을 반환
cos(45)
tan()
삼각함수의 탄젠트값을 반환
tan(90)
abs()
인자로 들어온 값의 절대 값을 반환, 음수가 아니라면 인자 값을 그대로 반환, int, long, float, double 형으로 오버로드 되어 있음
abs(-3.2)
sqrt()
인자로 들어온 값의 제곱근을 double 형으로 반환. 음수가 들어왔을 때는 NaN(Not a Number)를 반환
sqrt(3)
random()
0.0과 같거나 크고 1.0 보다 작은 난수를 double 형으로 반환. 정수 값으로 얻기 위해서는 int 형으로 형 변환해야 함
random()
Trigonometric function(삼각함수) 메소드들은 인자 값으로 radian(라디안) 단위를 받기 때문에 우리 사용하는 degree(각도)radian(라디안)으로 먼저 바꾸어야 함. 이 때 사용하는 메소드는 toRadians() 이며 radiandegree로 바꾸는 메소드는 toDegrees()이다.

2011년 7월 28일 목요일

p4:-) 이미지 슬라이딩

이미지 슬라이딩은 다음의 코드로 가능하다.

우선 예네들을 부르고

import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnTouchListener;

 멤버변수를 선언하고

 private GestureDetector mGesture;
 private GestureDetector.OnGestureListener mGestureListener;

on Create에다가 얘들을 붙여주면 된다.

    mGestureListener = new OnGestureListener() {
       public boolean onDown(MotionEvent e) {
        Log.d("hjh", "onDown");
        return false;
       }
    
      @Override
      public void onLongPress(MotionEvent e) {
       // TODO Auto-generated method stub
       Log.d("hjh", "onLongPress");
      }

      @Override
      public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
       // TODO Auto-generated method stub
       Log.d("hjh", "onScroll");
       return false;
      }

      @Override
      public void onShowPress(MotionEvent e) {
       // TODO Auto-generated method stub
       Log.d("hjh", "onShowPress");
      
      }

      @Override
      public boolean onSingleTapUp(MotionEvent e) {
       // TODO Auto-generated method stub
       Log.d("hjh", "onSingleTapUp");
       return false;
      }
      @Override
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
       // TODO Auto-generated method stub
       Log.d("hjh", "onFling");
       return false;
      }
      };
        
      mGesture = new GestureDetector(mContext, mGestureListener);
        
      vImageView.setOnTouchListener(new OnTouchListener() {
   
    public boolean onTouch(View v, MotionEvent event) {
     // TODO Auto-generated method stub
    
     mGesture.onTouchEvent(event);
    
     return false;
    }
   });


그런데 문제는... 다운이나 롱프레스의 경우 문제가 아니지만...

  vImageView.setOnTouchListener(new OnTouchListener() { 에서 리스너를 달 때

달리는 넘이 스크롤이 없는 넘이면 스크롤과 플링(옆으로 쏴악 재껴주는... 이미지 슬라이딩의 핵심)
은 로그가 안 찍힌다는 것이다. 즉, 스크롤이 가능한 뷰에 리스너를 달아야 플링 이벤트를
캣치 할 수 있다는 것.

아놔. 구려. 걍 x, y 좌표 계속 캣치해부려. ㅋㅋ

그래도 안들호가 제공하는 API를 써야 편할 듯.

2011년 7월 27일 수요일

p4:-) Image Viewer.



android:layout_width="fill_parent" android:layout_height="fill_parent"

android:topOffset="100dp" android:handle="@+id/handle" android:content="@+id/content">





android:layout_width="fill_parent" android:layout_height="30dp" />

-



android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent" android:background="#fff">



android:layout_height="wrap_content" android:textColor="#000000"

android:text="여기에 제목 같은거" />



android:layout_height="wrap_content" android:textColor="#000000"

android:text="여기에 내용이 들어갑니다." />

P1:-) 몸무게가 빨리 줄어드는 이유

몸에서 수분이 빠져나가서 그런거란다.

몸에서 빼야할건 지방인데

지방이 들어있는 음식을 먹고 지방을 뺀다는 건 어폐가 있는 것이다.

사실 복합적인 음식을 먹고 지방도 계산하면 되겠지만 그게 어렵기 때문에

단일 식품을 먹는 것 같다.

P3:-) 긍정 프로젝트

사실 내가 생각하는 의식수준은 가장 밑바닥아라고
볼 수 있다. 이것이 깨달음이라고도 볼 수 있지만

문제는 나의 언어수준도 더이상 위트가 존재하지 않게 되었다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

금일 오는 길에 비가 억수같이 와서 옷이 다 젖었다.

어제 어머니께서 비 때문에 택시를 못잡아서 열차를 놓치셨다.

젖은 상태로 있으니 어제 열차를 놓치신게 잘 되었다는 생각이 들었다.

늦게 가도 괜찮았고, 비 맞은 상태로 내려가는건 찝찝하기 때문이다.

오늘 내가 비를 맞아서 간과했던 또 다른 생각이 떠오른 것이다.

2011년 7월 26일 화요일

P2) 안드로이드 마켓등록 시간

예전엔 올리면 2분 안쪽이었는데 이제는 꼬박 하루가 걸린다.

LGU+는 도대체 어느 마켓에 접속하도록 놔뒀는지.

아직도 보이지 않고 있다:-)

믓튼 수원맛집 일탄이 나왔다 :-)

어머니께서 금일 부산으로 내려가시니 앞으로 업뎃은 다른 사람에게 맡길까 고려중이다:-)

아니면 다른 사람 의견받고 크래딧에 적는식으로.  . .

이제 소라랑 맛집 가면서 앱을 마무리 지으려고 한다:-)

P1) 몸무게 그대로

거제도에서 이틀 놀고 사회 생활한다고 발렌타인 21 년산에 소즈 맥주폭탄으로 마셨다:-)

라면도 먹고 고기도 엄청:-)

하지만 종완이가 있어 선 단백질 후 잡다한 영양소를 조금이나마 실천할수 있었다:-

놀러갔지만 일부러 수영도 뻑시게하고 턱걸이도 하고 잤다

국밥도 먹고 그랬지만

몸무게는 200 :-D 줄었다 ㅋㅋㅋ

오늘부터는 닭가슴살과 셀러드로 다시 달리는 거야

목표는 58 킬로그램

2011년 7월 22일 금요일

Threads

Threads(스레드) : 프로세스 내에서 자원을 서로 공유하면서 동작하는 작은 프로그램 단위, 프로세스 보다 빠르게 더 적은 자원으로 동작 가능
Multi Threads(멀티 스레드) : 스래드를 이용하여 여러 작업을 동시에 처리하는 것. 여러 스래드를 실행시켜 동시에 여러 작업을 처리하기 위한 기술
User Threads (사용자 스레드) : 일반적으로 사용자가 작성하는 main()메소드를 칭함
Daemon Threads (데몬 스레드) : 입출력 처리, 가비지 컬렉션, 사용자 스래드의 요청 등을 처리하기 위해 자바가상머신에서 제공하는 스레드. 사용자 스레드를 지원하기 때문에 사용자 스레드가 모두 종료된 이후에는 자동적으로 종료

스래드 생성
Threads 클래스를 상속하는 방법
Runnable interface를 구현하는 방법 : 이 방법은 스레드를 정의하고자 하는 클래스가 이미 다른 클래스를 상속하고 있을 때 사용하는 방법

스래드 상태
Startable state(생성 상태) : Threads클래스나 Runnable인터페이스를 이용하여 스래드를 구현한 후 스레드 객체를 생성한 상태. 해당 스레드를 실행시키기 위해서는 start()메소드를 사용하면 되며 start() 메소드가 호출되면 자바가상머신은 스레드를 실행하기 위한 자원을 할당한 후 스레드를 실행가능 상태로 전이 시킨다. 생성 상태에 있는 스레드를 종료시키기 위해서는 stop()메소드를 호출하면 된다.
Runnable state(실행가능 상태) : start()메소드를 호출하면 실행가능 상태로 전이. 실행가능 상태에 있는 스레드는 자바가상머신의 스케줄링에 의해서 실행가능 여부가 결정되며 실행 가능한 스레드가 존재하면 자바가상머신은 해당 스레드의 run()메소드를 호출하여 실제 코드를 실행. run() 메소드를 실행하고 있는 스레드에서 yield() 메소드가 호출되면 해당 스레드는 대기 상채로 전이.
Runnable state(실행가능 상태)에서 Not Runnable state(실행중지 상태)로 전이하기 위해서는 다음과 같은 조건에 맞아야 함
sleep()메소드 호출
wait()메소드 호출
suspend()메소드 호출
입출력 작업을 하기 위해 대기하는 경우 이다
Not Runnable state(실행중지 상태) : 실행가능 상태에 있던 스레드가 특정 호출로 인해 더 이상 실행을 하지 못하고 실행대기하고 있는 상태. 실행중지 상태의 스레드는 스케줄 되지 않기 때문에 실행되기 위해서는 먼저 실행가능 상태로 전이되어야 함.
실행가능 상태로 전이되기 위해서는 다음과 같은 조건에 맞아야 한다.
sleep() 메소드 호출에 의한 경우는 지정된 시간이 지나야 함
wait() 메소드 호출에 의한 경우는 notify()notifyAll()메소드가 호출되어야 함
suspend() 메소드 호출에 의한 경우는 resume()메소드가 호출되어야 함
입출력 작업을 위해 중지 상태가 된 경우에는 입출력 작업이 완료되어야 함
Dead state(종료 상태) : 스레드는 하나의 실행 단위로서 할 일을 다 마치게 되면 종료 상태로 전이. 종료되는 경우는 run()메소드가 정상적으로 종료되는 경우와 stop()메소드를 통한 강제적으로 종료되는 경우가 있다.
메소드 명
기 능
start()
스레드를 실행 가능 상태로 전이
stop()
스레드의 실행을 중지
sleep(long millis)
지정된 시간 동안 스레드를 쉬게 함
wait()
현재의 스레드를 기다리게 함
suspend()
스레드의 실행을 일시적으로 중단
notify()
wait()메소드에 의해 기다리고 있던 하나의 스레드를 깨움
notifyAll()
wait()메소드에 의해 기다리고 있던 모든 스레드를 깨움
resume()
일시적으로 중단된 스레드를 실행

bootcamp 지우기

맥북 프로 레티나 터치바 diskutility 에서 bootcamp 파티션 삭제하면 검은색에서 회색으로 바뀐다(APFS로 지정) 파틴션 아이콘 클릭하여 - 버튼을 이용하여 삭제하면 끝.