마인드진 공간 블로그

블로그 이미지
안드로이드 어플을 개발하고 있는 개발자 입니다.
by 마인드진

1. Android Eclipse Plugin을 이용한 G1 디바이스에 배포 (Self Deploy)

역시 데모 어플리케이션은 Hello Android가 제격이다.

Android USB Driver가 정상적으로 설치되었다면, cmd 창에서 adb devices를 입력하면 아래와 같은 결과를 볼수있다.

정상적으로 연결되었다면 list of devices에 식별자를 볼 수 있다.


이제 이클립스를 실행 시키고 Hello Android 프로젝트를 실행시키면

애뮬레이터에 올라가는게 아니라 실제 G1 디바이스에 올라가게 된다.

HelloAndroid Project Run

Console Window

 

위의 그림과 같이 Hello Android app.가 인스톨 되면 G1 디바이스를 보면 애뮬레이터로만 보던

어플리케이션 실행 화면이 보이고, 뒤로가기 버튼을 누르면 다른 어플리케이션과 함께 Hello Android app.

아이콘이 보인다.

HelloAndroid Icon

HelloAndroid Screen Shot



사실 어플리케이션 개발을 위한
기본적인 환경설정usb driver만 제대로 설치 되면 가능한 방법이다.

출저 :
ttp://kepricon.tistory.com/entry/%EC%95%A4%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-1-install-the-Android-App-set-the-configuration-1

Comment +0

App Widgets

Android2009. 12. 9. 10:04

App Widgets are miniature application views that can be embedded in other applications (such as the Home screen) and receive periodic updates. These views are referred to as Widgets in the user interface, and you can publish one with an App Widget provider. An application component that is able to hold other App Widgets is called an App Widget host. The screenshot below shows the Music App Widget.

This document describes how to publish an App Widget using an App Widget provider.


Reffrence : http://developer.android.com/guide/topics/appwidgets/index.html

Comment +0

구글고글

신기술2009. 12. 8. 16:11

Use pictures to search the web.

A picture is worth a thousand words.No need to type your search anymore. Just take a picture.

Find out what businesses are nearby.Just point your phone at a store.

This is just the beginning - it's not quite perfect yet.Works well for some things, but not for all.

Your pictures, your control.Turn on 'visual search history' to view or share your pictures at any time. Turn it off to discard them once the search is done.

Learn more in the Google Mobile Help Center.

Go to Android market from your phone and search for "Google Goggles".

Google Goggles in Action

Click the icons below to see the different ways Google Goggles can be used.

Goggles results for a landmark scan.

Available on phones that run Android 1.6+ (i.e. Donut or Eclair)

Comment +0


아래의 순서대로 실행하면 문제없이 자바에서 C 프로그램을 호출한 결과를 볼 수 있을 것이다.

사용환경은 다음과 같다.
 - CentOS5.3 64 bit
 - Java SE : javac 1.6.0_15
 - C compiler : GNU GCC

▶ 먼저 아래의 C 프로그램을 호출하는 자바소스를 작성하자.
[json01@localhost jni]$ vi HelloWorldJNI.java

public class HelloWorldJNI {

    native byte[] sayHelloWorld();

//    static {
//        System.setProperty("java.library.path", "/users/lib");
//        System.loadLibrary("HelloWorldJNI");
//    }

    public static void main(String[] args) {
        System.loadLibrary("HelloWorldJNI");
        byte buf[];
        HelloWorldJNI hello = new HelloWorldJNI();
        buf = hello.sayHelloWorld();
        System.out.println(" result:"+ buf );
    }

}


▶ 자바로 부터 호출되는 C 프로그램을 작성하자.
[json01@localhost jni]$ vi HelloWorldJNI.c

#include "HelloWorldJNI.h"
#include <jni.h>

JNIEXPORT jbyteArray JNICALL Java_HelloWorldJNI_sayHelloWorld
(JNIEnv *env, jobject job)
{
    jbyteArray jb;
    static char outputbuf[20];

    strcpy(outputbuf, "Hello World. JNI\n");
    jb = (*env)->NewStringUTF(env, outputbuf);

    return(jb);
}


▶ 작성한 C 프로그램으로 부터 헤더 파일을 작성하자.
[json01@localhost jni]$ javah HelloWorldJNI
[json01@localhost jni]$ ls -al
合計 16
-rw-r--r-- 1 json01 json01 406 10月  1 14:48 HelloWorldJNI.java
-rw-r--r-- 1 json01 json01 299 10月  1 14:52 HelloWorldJNI.c
-rw-r--r-- 1 json01 json01 415 10月  1 14:52 HelloWorldJNI.h
[json01@localhost jni]$
[json01@localhost jni]$ cat -n HelloWorldJNI.h
     1  /* DO NOT EDIT THIS FILE - it is machine generated */
     2  #include <jni.h>
     3  /* Header for class HelloWorldJNI */
     4
     5  #ifndef _Included_HelloWorldJNI
     6  #define _Included_HelloWorldJNI
     7  #ifdef __cplusplus
     8  extern "C" {
     9  #endif
    10  /*
    11   * Class:     HelloWorldJNI
    12   * Method:    sayHelloWorld
    13   * Signature: ()[B
    14   */
    15  JNIEXPORT jbyteArray JNICALL Java_HelloWorldJNI_sayHelloWorld
    16    (JNIEnv *, jobject);
    17
    18  #ifdef __cplusplus
    19  }
    20  #endif
    21  #endif

▶ C 프로그램 컴파일과 라일브러리 작성
[json01@localhost jni]$ gcc -c -fPIC -o HelloWorldJNI.o -I/usr/java/jdk1.6.0_15/include -I/usr/java/jdk1.6.0_15/include/linux -I/h
ome/json01/src/jni HelloWorldJNI.c
HelloWorldJNI.c: In function ‘Java_HelloWorldJNI_sayHelloWorld’:
HelloWorldJNI.c:10: 警告: incompatible implicit declaration of built-in function ‘strcpy’
[json01@localhost jni]$
[json01@localhost jni]$ ls -al
合計 20
-rw-r--r-- 1 json01 json01  715 10月  1 14:47 HelloWorldJNI.class
-rw-r--r-- 1 json01 json01  406 10月  1 14:48 HelloWorldJNI.java
-rw-r--r-- 1 json01 json01  299 10月  1 14:52 HelloWorldJNI.c
-rw-r--r-- 1 json01 json01  415 10月  1 14:52 HelloWorldJNI.h
-rw-r--r-- 1 json01 json01 1616 10月  1 14:55 HelloWorldJNI.o
[json01@localhost jni]$
[json01@localhost jni]$ gcc -shared -o libHelloWorldJNI.so HelloWorldJNI.o
[json01@localhost jni]$
[json01@localhost jni]$ lsr
合計 28
-rw-r--r-- 1 json01 json01  715 10月  1 14:47 HelloWorldJNI.class
-rw-r--r-- 1 json01 json01  406 10月  1 14:48 HelloWorldJNI.java
-rw-r--r-- 1 json01 json01  299 10月  1 14:52 HelloWorldJNI.c
-rw-r--r-- 1 json01 json01  415 10月  1 14:52 HelloWorldJNI.h
-rw-r--r-- 1 json01 json01 1616 10月  1 14:55 HelloWorldJNI.o
-rwxr-xr-x 1 json01 json01 5797 10月  1 14:56 libHelloWorldJNI.so
[json01@localhost jni]$
[json01@localhost jni]$ cp -f libHelloWorldJNI.so /users/lib
[json01@localhost jni]$
[json01@localhost jni]$ lsr /users/lib
合計 8
-rwxr-xr-x 1 json01 json01 5797 10月  1 14:57 libHelloWorldJNI.so


▶ 자바 컴파일
[json01@localhost jni]$ javac *.java
[json01@localhost jni]$ lsr
合計 28
-rw-r--r-- 1 json01 json01  299 10月  1 14:52 HelloWorldJNI.c
-rw-r--r-- 1 json01 json01  415 10月  1 14:52 HelloWorldJNI.h
-rw-r--r-- 1 json01 json01 1616 10月  1 14:55 HelloWorldJNI.o
-rwxr-xr-x 1 json01 json01 5797 10月  1 14:56 libHelloWorldJNI.so
-rw-r--r-- 1 json01 json01  402 10月  1 14:58 HelloWorldJNI.java
-rw-r--r-- 1 json01 json01  935 10月  1 14:58 HelloWorldJNI.class

▶ 자바 실행
 - 하지만 환경변수 LD_LIBRARY_PATH에 라이브러리가 없기에 아래의 에러가 발생했다.
[json01@localhost jni]$ java HelloWorldJNI
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorldJNI in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)
        at java.lang.Runtime.loadLibrary0(Runtime.java:823)
        at java.lang.System.loadLibrary(System.java:1028)
        at HelloWorldJNI.<clinit>(HelloWorldJNI.java:7)
Could not find the main class: HelloWorldJNI.  Program will exit.


▶ 환경변수 재설정.
[json01@localhost jni]$ vi /users/env/csh/csh_comm_env

# j-son add

echo "***** setting csh_comm_env ****"

#################
# section:environment variables
#################
setenv JAVA_HOME /usr/java/jdk1.6.0_15
setenv ORACLE_SID orcl
setenv ORACLE_BASE /opt/app/oracle
setenv ORACLE_HOME ${ORACLE_BASE}/product/11.1.0/db_1
#setenv ORA_NLS33 ${ORACLE_BASE}/ocommon/nls/admin/data
setenv NLS_LANG 'Japanese_Japan.UTF8'
setenv LANG ja_JP.UTF-8

set path = ($JAVA_HOME/bin $path $ORACLE_HOME/bin)
setenv LD_LIBRARY_PATH ${ORACLE_HOME}/lib:/users/lib


#################
# section:alias
#################
alias lsr 'ls -rtl'
alias history=200
alias h history
set savehist = 20


▶ 환경변수 적용하기
[json01@localhost jni]$ source ~/.login
***** setting .login ****
***** setting csh_comm_env ****
***** setting csh_comm_jboss ****
*************************************
***** Have A Nice Day 2009/10/01 ****
*************************************


▶ 자바 실행과 그 결과
[json01@localhost jni]$ java HelloWorldJNI
 result:Hello World. JNI

Comment +0


TextView t = (TextView) findViewById(R.id.tv);

final SpannableStringBuilder sp = new SpannableStringBuilder("foobar
\n");

sp.setSpan(new ForegroundColorSpan(Color.RED), 0, sp.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

final SpannableStringBuilder sp2 = new SpannableStringBuilder("foo ");
sp2.append(sp);

t.append(sp2); //ok, foobar is red

final SpannableStringBuilder sp3 = new SpannableStringBuilder("bar ");
sp3.append(sp);

t.append(sp3); //foobar is no longer red

Comment +0


 

마지막 항목에 Android SDK m5 - rc14 용 전자책 리더를 출시했습니다.
그래서 적용한 3D 회전 효과를 내는 방법을 소개합니다.

 

1. 하고 싶은 것 

현재보고있는 화면을 지도자っと회전하여 뒷면에 다른 이미지를 표시한다.


2. 준비

지도자 90도로 회전하여 테이블과 뒷면의 모양을 변경하기 때문에, 얼굴과 뒷면을 준비합니다.

레이아웃의 XML은 다음과 같습니다.

 

main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/container"
             android:layout_width="fill_parent"
             android:layout_height="fill_parent">
  <ImageView android:id="@+id/front"
             android:src="@drawable/front"
             android:layout_width="fill_parent"
             android:layout_height="fill_parent" />
  <ImageView android:id="@+id/back"
             android:src="@drawable/back"
             android:layout_width="fill_parent"
             android:layout_height="fill_parent"
             android:visibility="gone" />
</FrameLayout>

 

 FrameLayout을 회전시킵니다.
그렇게 하므로써 front와 back 표시를 전환합니다.
초기 상태는 Hidden (gone)입니다.

 


3. 리소스 검색
public void onCreate(Bundle icicle) {
  super.onCreate(icicle);
  setContentView(R.layout.main);
  this.mContainer = (ViewGroup) findViewById(R.id.container);
  this.frontView = (ImageView) findViewById(R.id.front);
  this.backView = (ImageView) findViewById(R.id.back);
}

이것은 Android의 기본입니다.


4. 0 ~ 90도 회전

먼저 앞면을 그대로 90도 회전시킵니다.

float start = 0f;
float mid = 90f;
 
this.centerX = mContainer.getWidth() / 2.0f;
this.centerY = mContainer.getHeight() / 2.0f;
 
Rotate3dAnimation rot;
rot = new Rotate3dAnimation(start, mid, centerX, centerY, depth, true);
rot.setDuration(500);
rot.setAnimationListener(new DisplayNextView(mid, end, depth));
mContainer.startAnimation(rot);

 


3-1. Rotate3dAnimation

 

Rotate3dAnimation은 Animation 클래스를 상속받는 고유 클래스입니다.
ApiDemo을 그대로 사용하지달라고합니다.
애니메이션, Animation 클래스의 applyTransformation 메소드를 Override 합니다.


void applyTransformation(float interpolatedTime, Transformation t) { ... }

 

interpolateTime은 0(으)로부터1까지의 값입니다..
조금 복잡합니다만,0(으)로부터1까지 연속한 값이 매개변수로 건네받아 applyTransformation메소드가 계속 불려짐니다. 시계열로 설명하면 다음과 같습니다.

.


applyTransformation(0f, t);
applyTransformation(0.2f, t);
applyTransformation(0.4f, t);
applyTransformation(0.6f, t);
applyTransformation(0.8f, t);
applyTransformation(1.0f, t);

 

위의 setDuration에서 지정한 500ms 사이에서 할수 있도록 Setting 되어 있는데

이 예제는 0.2 간격으로 부를 것입니다. 만약 이 간격을 변경하려면


rot.setInterpolator(new AccelerateInterpolator());

를 설정합니다. 거리 시간을 변경하면서 applyTransformation이 부를 수있습니다.

조금 복잡하지만 인수 interpolatedTime에 따라 대상을 이동하거나,보기 각도를 변화시키고하면 애니메이션을 구현할 수있습니다.
회전의 경우 카메라를 회전합니다.


Camera camera = new Camera();
camera.rotateY(degrees);

ststartAnimation는 이름 그대로 애니메이션을 시작합니다.

 

3-2. DisplayNextView

 

DisplayNextView은 Animation.AnimationListener를 implements하는 클래스입니다.
이것은 애니메이션의 이벤트를 Listening하는 Listener 입니다. 
이에 해당되는 이벤트는 다음과 같이 3 가지.

 

void onAnimationEnd()
void onAnimationRepeat()
void onAnimationStart()

 

이번에는 0 도에서 90 도까지 회전 애니메이션이 끝난 후 나머지 90 도에서 180 도까지 회전시킵니다.
따라서 onAnimationEnd 이벤트를 사용합니다.

 



5. 90 ~ 180도 회전

 onAniamtionEnd 에서는 잔여 회전을시킵니다。교체 작업은 기본적으로 지금까지와 동일합니다.
Rotate3dAnimation를 사용합니다. 그 전에, 표시면을 바꿉니다.

겉(표)로부터 이면으로 전환하는 예를 나타냅니다

 

this.frontView.setVisibility(View.GONE);
this.backView.setVisibility(View.VISIBLE);

 

설명은 다음과 같습니다.


private class DisplayNextView implements AnimationListener {
  public void onAnimationStart() { }
  public void onAnimationRepeat() { }
  public void onAnimationEnd() {
    mContainer.post(new Runnable() {
      frontView.setVisibility(View.GONE);
      backView.setVisibility(View.VISIBLE);
 
      Rotate3dAnimation rot;
      rot = new Rotate3dAnimation(mid, end, centerX, centerY, depth, false);
      rot.setDuration(500);
      rot.setInterpolator(new AccelerateInterpolator());
      mContainer.startAnimation(rot);
    });
  }
}

이상으로3차원의 회전을 구현할 수 있었습니다.

 
6. Download

eclipse Project 파일입니다. 참고 바랍니다.

 

rotation3d.zip

이것으로 3D애니메이션은 테크니컬한 측면을 살펴 보았습니다..
조금 복잡하지만, 머지않아 누군가가 간단한 라이브러리를 만들 것이라는 생가도 듭니다..
하지만 기초를 알고 있는 것도 손해도 아니라고 생각 듭니다.

 

package com.adamrocker.android.rotation3d;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation.AnimationListener;
import android.widget.ImageView;
 
public class Rotation3D extends Activity {
  private boolean isFront = true;
  private int DURATION = 500;
  private ViewGroup mContainer;
  private ImageView frontView, backView;
  private float centerX;
  private float centerY;
 
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    this.mContainer = (ViewGroup) findViewById(R.id.container);
    this.frontView = (ImageView) findViewById(R.id.front);
    this.backView = (ImageView) findViewById(R.id.back);
  }
 
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    super.onKeyDown(keyCode, event);
    switch (keyCode) {
    case KeyEvent.KEYCODE_SPACE:
      if (isFront) {
        applyRotation(0f, 90f, 180f, 0f);
      } else {
        applyRotation(180f, 270f, 360f, 0f);
      }
      break;
    }
    return false;
  }
 
  /* start(으)로부터end까지Y축회전한다 */
  private void applyRotation(float start, float mid, float end, float depth) {
    this.centerX = mContainer.getWidth() / 2.0f;
    this.centerY = mContainer.getHeight() / 2.0f;
 
    Rotate3dAnimation rot = new Rotate3dAnimation(start, mid, centerX, centerY,
        depth, true);
    rot.setDuration(DURATION);
    // rot.setInterpolator(new AccelerateInterpolator());
    rot.setAnimationListener(new DisplayNextView(mid, end, depth));
    mContainer.startAnimation(rot);
  }
 
  private class DisplayNextView implements AnimationListener {
    private float mid;
    private float end;
    private float depth;
 
    public DisplayNextView(float mid, float end, float depth) {
      this.mid = mid;
      this.end = end;
      this.depth = depth;
    }
 
    public void onAnimationEnd() {
      mContainer.post(new Runnable() {
        public void run() {
          if (isFront) {
            frontView.setVisibility(View.GONE);
            backView.setVisibility(View.VISIBLE);
            isFront = false;
          } else {
            frontView.setVisibility(View.VISIBLE);
            backView.setVisibility(View.GONE);
            isFront = true;
          }
 
          Rotate3dAnimation rot = new Rotate3dAnimation(mid, end, centerX,
              centerY, depth, false);
          rot.setDuration(DURATION);
          rot.setInterpolator(new AccelerateInterpolator());
          mContainer.startAnimation(rot);
        }
      });
    }
 
    public void onAnimationStart() {}
 
    public void onAnimationRepeat() {}
  }
}

Comment +0


변화 관리(change-management) 기능에 액세스 하기위해서, Eclipse는 처음부터 Concurrent Versions System (CVS)과 완벽한 통합을 도모했습니다.이제, Apache Software Foundation에서 운영하는 많은 프로젝트들은 Subversion이라고 하는 변화 관리시스템을 사용하고 있습니다. Subversion 저장소를 사용하는 프로젝트에 Eclipse를 사용하는 방법을 배워봅시다.

Eclipse는 대중적인 오픈 소스 변화 관리 시스템인 CVS에 대한 지원을 통합해 왔습니다. CVS의 기능과 그 한계는 잘 알려져 있지만,많은 그룹들은 더 나은 확장성, 변화 합병 및 버전 브랜칭(branching) 지원, 바이너리 파일 포맷 지원을 제공할 수 있는다른 버전 관리 시스템을 연구하고 있습니다.

소셜 북마크

mar.gar.in
Digg
del.icio.us
Slashdot

Subversion (SVN)은 CVS를 대체하는 것으로서, 향상된 성능(지능형 로컬 캐싱과 데이터베이스 백엔드 중심), 쉽고 빠른 브랜칭(branching), CVS 사용에 따른 단점 향상을 제공하고 있습니다.

Eclipse에 Subversion 지원을 추가하는 방법과 IDE에서 기본적인 버전 관리를 수행하는 방법을 배워봅시다.

시작하기 전에

Eclipse를 다운로드 하여 설치해야 한다. (참고자료)자신의 플랫폼에 맞춰 Eclipse SDK를 다운로드 하면 기본 Eclipse IDE(Eclipse Platform)과Java™ Development Kit이 생긴다. C/C++로 작업하려면, C Development Tooling (CDT) 웹사이트를 방문하여, 업데이트 매니저를 사용하여 CDT를 설치하라. (업데이트 매니저 사용 방법은 다음 섹션에서 설명한다.)

또한, Subversion 저장소에 액세스 해야 한다. 한 가지만 설정해야 한다면 Subversion 웹 사이트에서 제공하는 문서를 참조하라. (참고자료) 데모용으로 Subclipse 프로젝트를 검사하고, 필자의 LAN의 저장소에서 프로젝트로 작업하는 방법을 보여 줄 것이다.




위로


Subclipse를 Eclipse에 추가하기

Subclipse는 Subversion 지원을 Eclipse IDE에 추가하는 프로젝트이다. 우리는 Eclipse의 업데이트 매니저를 사용하여Subclipse를 우리의 Eclipse IDE에 추가할 것이다. Eclipse의 Help 메뉴에서 Software Updates > Find and Install을 선택하여 업데이트 매니저를 연다.


그림 1. Eclipse 업데이트 매니저


소프트웨어 업데이트를 검색하기 위해 사용하는 것 외에도, 이 업데이트 매니저를 사용하여 Subclipse 같은 새로운 기능을 찾아서 설치할 수 있다. Search for new features to install이 선택되었는지 확인하고, Next를 클릭하여 계속 진행한다. Eclipse는 다음의 업데이트 매니저 패널을 디스플레이 한다.


그림 2. 업데이트 매니저 사이트


측정 기능을 찾았기 때문에, 기존 사이트의 체크를 해제하고, New Remote Site를 클릭하여 New Update Site 다이얼로그를 디스플레이 한다. (그림 3) 이것을 사용하여 Subclipse 업데이트 사이트를 리스트에 추가할 것이다.


그림 3. 새로운 업데이트 사이트 추가하기


Name에 알맞은 것을 입력하고(Subclipse가 적당하다.), URL에 http://subclipse.tigris.org/update_1.0.x (현재 Subclipse 업데이트 사이트)를 입력한다. OK를 클릭하여 Subclipse 업데이트 사이트를 업데이트 매니저의 리스트에 추가한다.

업데이트 매니저 창에 Finish를 클릭하여 새로운 기능을 검색한다. 이 경우, 우리가 찾고 있는 새로운 기능은 Subclipse이다. 잠시 후에, 업데이트 매니저의 검색이 완료되고, 검색 결과가 디스플레이 된다.


그림 4. 설치할 새로운 기능


Subclipse를 체크하고(닫힌 삼각형을 클릭하여 이 기능에 정확이 무엇이 포함되었는지를 볼 수 있다.), Next를 클릭하여 기능의 라이센스 조건을 검색한다. 조건을 수락하고, Next를 클릭하여 여러분이 선택했던 기능을 검토한다. Finish를 클릭하여 Subclipse를 다운로드 및 설치한다.

업데이트 매니저는 Subversion 컴포넌트를 다운로드 한다. 설치하기 전에, Eclipse는 이 기능들이 디지털 서명이 되지 않았음을 경고할 것이다. (그림 5) 이것이 설치를 취소할 수 있는 마지막 기회이다. Install All을 클릭하여 설치를 계속 진행한다.


그림 5. Subclipse가 디지털 서명 되지 않았다.


Subversion이 설치되면, Eclipse는 IDE를 재시작 하여 새로운 기능을 활성화 해야 한다고 경고한다. (그림 6) Eclipse를 바로 재시작 한다.


그림 6. 새로운 기능 설치 후에 Eclipse 재시작 하기


Eclipse를 재시작 하면, Subclipse가 설치되고 준비가 된다.

Mac OS X나 리눅스®에서 Eclipse를 실행한다면, JavaHL 라이브러리를 설치해야 하는데, 이것은 Subclipse FAQ의 Troubleshooting 섹션에 설명되어 있다. (참고자료) Subclipse를 사용하기 전에 이를 수행해야 한다.

빠른 테스트

설치를 완료하면 새로운 기능을 테스트 하는 것이 좋다. Subversion 저장소에서 Subclipse 카피를 체크하여 이것이 올바르게 설치되었는지를 확인한다.

Eclipse File 메뉴에서, Import를 선택하여 Import 매니저를 디스플레이 한다. (그림 7) SVN에서 Checkout Projects를 선택하고, Next를 클릭한다.


그림 7. Import 매니저


Select/Create Location 패널에서(그림 8), 새로운 위치를 만들고(아직 아무것도 설정하지 않았기 때문이다.), Next를 클릭하여 계속 진행한다. Next 버튼이 활성화 되지 않으면, Use existing repository location 옵션으로 전환하여, Create a new repository location으로 가서 Next 버튼을 실행한다.


그림 8. 새로운 저장소 위치 만들기


다음 섹션에서(그림 9), 저장소 URL(http://subclipse.tigris.org/svn/subclipse/)을 Url 필드에 추가하고, Next를 클릭한다. 잠시 후에, Eclipse는 사용자 ID와 패스워드를 묻는다. Subclipse 사이트에 대한 계정이 없다면, ID에는 guest를 패스워드는 공백으로 하고, Save Password 박스를 체크하고 OK를 클릭한다.


그림 9. 저장소 URL 추가하기


Eclipse는 Subclipse 저장소에 폴더들을 디스플레이 한다. (그림 10) 트렁크를 확장하고, subclipse 폴더를 선택한 다음, Finish를 클릭하여 Subclipse 프로젝트의 소스 코드의 카피를 체크한다. 이것이 무엇인지 모르기 때문에, New Project 마법사가 뜨면 Simple > Project를 선택한다.


그림 10. Subclipse 저장소




위로


기본적인 Subversion 연산

Subclipse를 성공적으로 설치했고, Subversion 서버용 지원을 Eclipse 설정에 추가했으며, 저장소에서 현재의 Subclipse소스 코드를 다운로드 함으로써 Subclipse를 테스트 했다. 이제, 코드와 Subversion 저장소가 어떻게 실행되는지를보자.

Subversion 작동 방법을 보기 전에, 저장소에 대해 잠깐 이야기 해보자.이것은 port 8000에 dogma라고 하는 머신에 호스팅 되었으며, 필자는 필자의 developerWorks 기술자료와연결된 새로운 developerWorks 코드용 저장소를 만들었다. 필자의 프로젝트를 직접 저장소의 루트에 놓을 것이다. 기타저장소들은 개발 버전, 태그 브랜치에 맞게 trunk, tags, branches 라는 이름의 폴더를 갖지만,developerWorks 기술자료 코드를 태깅 또는 브랜칭 할 염려는 없다.

필자는필자의 첫 번째 기술자료에서 두 개의 프로젝트, forkWork과 threadWork을 추가했다. 필자의 Eclipse워크스페이스(그림 11)에는 developerWorks 기술자료에서 온 세 개의 다른 프로젝트들도 포함되어 있다.(getopt_demo, getopt_long_demo, readdir_demo).


그림 11. 나의 Eclipse C/C++ 프로젝트


이제 실행을 시작해 보자.

프로젝트를 저장소에 추가하기

새로운 프로젝트를 Subversion 저장소에 추가하려면, 프로젝트를 오른쪽 클릭하고(Eclipse의 프로젝트 뷰 또는 Navigator 뷰), 메뉴에서 Team > Share Project를 선택한다. Eclipse는 Share Project 다이얼로그를 디스플레이 한다.


그림 12. Share Project 다이얼로그


현재 Eclipse에서 지원되는 저장소 리스트에서 SVN을 선택하고 Next를 클릭한다. 다음 다이얼로그(그림 13)에서는 기존 저장소 위치를 선택하거나, 새로운 위치를 만들 수 있다.


그림 13. 저장소 위치 선택하기


저장소가 이미 리스팅 되었다면, 이것을 선택하고, Finish를 클릭한다. 저장소가 리스팅 되지 않았다면, 추가한 후 계속 진행한다. (빠른 테스트 참조) Eclipse는 프로젝트와 같은 이름으로 저장소에 새로운 디렉토리를 만들고, 프로젝트에 모든 파일과 폴더 리스트를 디스플레이 한다.


그림 14. 프로젝트 콘텐트 추가하기


위 영역에 프로젝트를 설명하는 알맞은 코멘트를 입력한 다음, Select All을 클릭하여 프로젝트에서 모든 파일들을 체크한다. OK를 클릭하여 프로젝트에 체크하고, 현재 상태를 Subversion 저장소로 보낸다.

Subversion의 명령어와 아웃풋이 Console 뷰에 디스플레이 되는데, 주로 Eclipse 윈도우 아래에 보인다. 프로젝트에 Subclipse가 정확히 무엇을 하는지 알 수 있다.

프로젝트 업데이트

버전 관리 시스템의 핵심적인 기능 중 하나는 다른 개발자들이 개발을 진행하면서, 준비가 될 때마다 변경할 수 있는 기능이다. 변경 사항을 다운로드 하여, 로컬 카피에 통합시키려면, 프로젝트를 업데이트 해야 한다.

업데이트 하고자 하는 프로젝트를 오른쪽 클릭하고, 메뉴에서 Team > Update를 선택한다. Eclipse는 저장소에서 변경 사항을 검색하고, 로컬 카피와의 합병을 시도한다.

파일 또는 디렉토리 추가하기

파일을 프로젝트에 추가하면(그림 15), 이것은 버전 관리의 일부가 자동으로 되는 것이 아니다. 구체적으로 이것을 저장소에추가해야 한다. 스크린샷을 보면, 필자가 ReadMe.txt 파일을 threadWork 프로젝트에 추가했음을 알 수 있다.


그림 15. 새로운 파일 추가하기


새로운 파일을 추가한 다음, Team > Add to Version Control을 선택한다. 이것이 전부이다. 다음에 이 프로젝트에서 저장소에 변경 사항이 이루어지면, 새로운 파일이 추가된다.

파일 또는 디렉토리 삭제하기

프로젝트와 더 이상 관련이 없는 저장소에 파일을 추가했다면, 쉽게 삭제할 수 있다. 파일을 오른쪽 클릭한 후에 Delete를 선택한다. Team 메뉴가 필요 없으며, Subclipse가 파일에 자동으로 삭제 플래그를 달며, 이것을 프로젝트로부터 삭제한다. 다음에 저장소에 변경 사항을 만들면, 파일이 삭제된다.

파일 또는 디렉토리의 재명명

Subclipse의 컨트롤 아래에 있는 파일 또는 디렉토리를 재명명 하려면, 오른쪽 클릭을 하고, Rename을 선택한다. 엔트리 필드에 아이템의 새로운 이름을 입력하고 Enter를클릭한다. 파일이 프로젝트에서 재명명 되고, rename 연산(새로운 이름에는 Add, 오래된 이름에는 Delete)은 다음실행을 위해 대기한다. 그림 16은, main.c를 threadWork.c로 바꾼 후에 threadWork 프로젝트 모습이며,아직 변경 사항을 실행하기 전이다. 작은 파란색 더하기 부호는 Subclipse가 새로운 파일을 추가했음을 나타낸다.


그림 16. 추가 또는 삭제인 경우에도 파일 재명명은 기본이다.

파일 무시하기

프로젝트가 파일을 만들거나, Subversion 저장소에 추가하고 싶지 않은 파일을 포함하고 있을 경우, Subclipse에 이를무시하도록 명령할 수 있다. 버전 관리에서 배제하고자 하는 파일이나 디렉토리를 오른쪽 클릭한 다음, Team > Add to svn:ignore를 선택하여 Add to svn:ignore 다이얼로그를 디스플레이 한다.


그림 17. 버전 관리에 포함시키고 싶지 않은 리소스 무시하기


OK를 클릭하여 특정 파일을 프로젝트의 디렉토리용 svn:ignore 프로퍼티에 추가한다. Wildcard extension을 선택하여 현재 파일의 확장자를 가진 모든 파일들을 무시하거나, Custom pattern을 선택하여 고유의 와일드 카드를 추가하여 리스트를 무시한다. 무시 리스트에 이루어진 변경 사항은 다음에 변경 사항을 실행할 때 저장소에 추가된다.

변경 사항 실행하기

프로젝트를 변경 했다면, 코드 컴파일, 변경 사항 테스트를 실행하고, Subversion 저장소에 이를 위임해야 한다. 이것은워크스테이션 자가 삭제의 경우 백업으로서 작동하고, 다른 개발자들이 로컬 카피들을 업데이트 하여 변경 사항을 포함시키도록 할 수있다.

변경 사항을 실행하기 전에 프로젝트를 업데이트 하라. ("프로젝트 업데이트" 참조) 프로젝트를 오른쪽 클릭하고 메뉴에서 Team > Commit을 선택한다. Eclipse는 Commit 다이얼로그를 디스플레이 하는데(그림 18), 여기에는 변경 사항이 요약되어 있다.


그림 18. 저장소에 변경 사항 실행하기


주의 깊게 살펴본다면, 프로퍼티 디렉토리에 프로퍼티 변화가 있었고(svn:ignore 프로퍼티를 추가하여 저장소에서 특정 파일들을 배제했다.), threadWork.c가 추가되면서 main.c가 삭제되었다. 이러한 변화 쌍들은 실제로 하나의 연산을 나타낸다. (파일 재명명)

저장소에서 빼고 싶다면, 리소스를 선택하지 않을 수 있다. 하나의 파일에서 작업을 부분적으로 마쳤고, 미완 변경 사항을 추가하고 싶지 않을 경우에 유용하다. 위 텍스트 필드에 알맞은 코멘트를 입력한 다음, OK를 클릭하여 변경 사항을 저장소에 추가한다.




위로


요약

Subclipse프로젝트는 Subversion 버전 관리 시스템을 CVS 서버만 지원하는 Eclipse의 탁월한 팀 프로젝트 관리 기능과통합했다. Eclipse의 업데이트 매니저를 사용하면, Subclipse를 Eclipse에 쉽게 추가할 수 있고, 이러한 탁월한버전 관리 시스템을 Eclipse에서 직접 사용할 수 있게 된다.

프로젝트를 저장소에 추가하고, 프로젝트의 리소스를 관리하는 것이 Subversion에 익숙하지 않은 사람들에게는 힘든 일이지만, 일반 연산 절차는 단순하다. 이 글이 여러분이 Subclipse를 익히는데 도움이 되었기 바란다.



참고자료

교육

제품 및 기술 얻기

토론


필자소개

Chris Herborth는 10년 이상의 경력을 가진 기술 라이터이다. 주로 운영 체계와 프로그래밍에 대한 글을 쓰고 있다. 아들 Alex와 아내 Lynette와 함께 살고 있으며, 비디오 게임을 디자인 및 연구하고 있다.

Comment +0

TureMobile 입사

My Lite2009. 12. 4. 13:12




우후훗 ~
어려운 불경기 속에 졸업하기 전에 취업 성공 ㅠ_ 감격,,,

경기도 성남에서 생활하게 되었다.
안드로이드 개발을 하게 되었는데,,

앞으로 어떻게 되려나..?

힘내자 화이팅 !!!

이 장소를 Daum지도에서 확인해보세요.
경기도 성남시 중원구 상대원1동 | (주)트루모바일
도움말 Daum 지도

'My Lite' 카테고리의 다른 글

[투표인증]  (0) 2012.04.11
신기한 조선왕보 계보!!  (0) 2012.04.02
북한산 둘레길 ( 1~3 구간 )  (2) 2012.04.01
전우치 촬영장을 찾아서 .. !!  (0) 2010.01.08
IT멘토링ㆍ인턴십 제도 성과보고회  (0) 2009.12.16
TureMobile 입사  (0) 2009.12.04

Comment +0