Posted
Filed under Action Script

stop();

var str:String = "fun1";
this[str]();
function fun1():Void{
 trace("fun1");
}
java 에 reflection과 비슷한 함수 호출 방법을 찾던중 위와 같이 가능 하다는 사실을 아게 됬다.
this <-- 대신 생성된 클래스를 넣게 되면 해당 클래스의 해당 메소드를 찾게 된다.
AA aa = new AA();
var str:String = "fun1";
aa[str]();
function fun1():Void{
 trace("fun1");
}

물론 AA라는 클레스가 존재 해야 한다. as2.0 기준으로 테스트  했음.

2010/02/02 14:22 2010/02/02 14:22
Posted
Filed under Action Script

 flash 컨텐츠를 작업 하다 보면 배포 하는 용도에 따라서 class file 즉 as 파일의 위치를  설정 해줘야 할 경우가 발생 한다. 그리고 상황에 따라서 어떤 일에 대한 다른 view를 만들기 위해서 설정 값에 의해서 실행하는 일들이 달라 진다고 했을 때 , 해당 클래스명을 받아 동적으로 생성하여 처리를 할 수 있다. 마치 java의 reflection과 비슷한 기능 이라 할 수 있을 거 같다.

 아래는 api에서 복사 했으며, 이것들을 이용하여 구현이 가능 하다.
hasDefinition을 통해서 해당 클래스가 존재 하는지 체크 후 , hasDefinition 메소드로 해당 클레스를
가져와 객체로 생성 하면 된다.

Creates a new application domain.
Checks to see if a public definition exists within the specified application domain.
Gets a public definition from the specified application domain.

google에서 검색해서 찾은 소스 이면 더 자세한 내용은 링크를 참조 하면되다.
[소스참조]  : http://snipplr.com/view.php?codeview&id=18147
var instance:Sprite;

if ( ApplicationDomain.currentDomain.hasDefinition("MyClassName") )
{
 var MyClass:Class = getDefinitionByName( "MyClassName" ) as Class;
 instance = new MyClass( params ) as Sprite;
}else {
 instance = new Sprite( params );
}

2010/01/30 17:12 2010/01/30 17:12
Posted
Filed under ORACLE

[원문] : http://jen.fluxcapacitor.net/geek/autoincr.html

1. 1씩 증가 시키기 위해서 test_seq라는 트리거를 생성한다.
create sequence test_seq
start with 1
increment by 1
nomaxvalue;


2. 테이블 생성
create table test (id number, testdata varchar2(255));


3. test 테이블에 있는 id에 insert가 되는 시점에 1씩 증가 시키기 위한 트리거 생성
    트리거를 하나 더 생성 하여 1에서 만든 test_seq 값을  test테이블에 id에 할당 한다.

 create trigger test_trigger
 before insert on test
 for each row
 begin
 select test_seq.nextval into :new.id from dual;
 end;

4. 트리거를 사용 하지 않을 경우
insert into test values(test_seq.nextval, 'voila!')
test.sql.nextval를 통하여 등록 한다.

2010/01/29 13:12 2010/01/29 13:12
Posted
Filed under android

[원문] : http://androidhuman.tistory.com/entry/액티비티와-태스크Task


액티비티는 같은 어플리케이션 내에 존재하는 액티비티 뿐만 아니라 다른 어플리케이션 내에 존재하는 액티비티까지호출할 수 있습니다. 일반적인 어플리케이션들은 각자 자신의 어플리케이션 내에 있는 구성요소들만 사용할수 있습니다. 따라서 특정 기능 (: 바코드 스캔 )을 자신의 어플리케이션에서 이용하려면 새로 그 역할을하는 컴포넌트를 구현해야 했죠. 하지만, 안드로이드는 특이하게도다른 어플리케이션 내의 컴포넌드들을 호출하여 마치 자신의 어플리케이션에서 사용하는 것이 가능합니다.

만약, 제가 책을 관리하는 어플리케이션을 만들었다고 가정해 봅시다. 책을 관리하는 어플리케이션이면 책을 추가하는 기능이 있어야겠지요? 그런데책 정보를 일일이 입력하는 것은 손이 많이 가기에 책의 바코드를 인식하여 책 정보를 추가할 수 있게 하고 싶어합니다. 그런데 마침, 바코드를 스캔해주는 어플리케이션이 있네요? 그렇다면 이 어플리케이션을 이용하여 책의 바코드를 스캔하고, 받은정보를 이용하여 책을 추가해주는 것이 가능합니다.

이렇게 한 어플리케이션에서 다른 어플리케이션의 컴포넌트를 거의 자유자재로 사용할 수 있다보니  파일의 구성으로만 보면 어플리케이션의 경계가뚜렷하지만, 실제로 어플리케이션이 실행되는 것을 보면 어플리케이션의 경계가 뚜렷하지 않습니다. 결국, 안드로이드 어플리케이션들 사이에는 경계가 없다고 할 수 있습니다.

어플리케이션의 경계가 없어 여러 어플리케이션의 컴포넌트들을 호출하여 사용할 수 있다보니, 실질적으로 각 컴포넌트들, 특히나 화면에 표시되면서 사용자와 상호작용을하는 액티비티는 어플리케이션 단위가 아닌, 태스크(Task)를단위로 하여 관리됩니다.

태스크(Task)는 사용자가 실질적으로 하나의 어플리케이션처럼느끼는 액티비티들의 집합이라 할 수 있습니다. 태스크는 스택(Stack) 형태로 구성되며, 스택의 가장 아래에는 이 태스크를 시작한 액티비티인 루트 액티비티(RootActivity)가 있으며, 그 후로 액티비티가 호출되게 되면 그 위에 액티비티가 하나씩쌓여가게 됩니다. 따라서, 태스크를 액티비티가 쌓여 있는스택이라 하여 액티비티 스택(Activity Stack)이라고도 합니다.

정식 명칭은 태스크(Task)이지만,액티비티 스택이라는 용어가 더 개념상으로 정확한 표현이므로 지금부터의 설명에서는 태스크(Task) 보다는액티비티 스택(Activity Stack)이라는 용어를 더 많이 사용할테니, 혼동하지 마세요. ^^ 결국은 같은 뜻이에요~~

아무튼, 이러한 태스크는 메모리상에 동시에 여러 개가 존재할 수 있으며, 각각이독립적이므로 일반적으로 서로 영향을 주지 않습니다,


액티비티 스택(태스크)의 구조




루트 액티비티는 태스크를 시작한 액티비티이며, 대부분 이 액티비티들은 Application Launcher에서 선택되어 실행된 액티비티입니다. 처음 태스크가 시작되면, 태스크에는 루트 액티비티밖에 없습니다. 즉, 루트 액티비티가 액티비티 스택의 가장 위에 있게 되는데, 이렇게 액티비티 스택의 가장 위에 있는 액티비티는 화면에 표시되어 사용자와 상호작용을 수행할 수 있습니다. 이렇게 사용자와 상호작용을 수행하다가 다른 액티비티를 호출하게 되면 액티비티 스택에서 호출된 액티비티가 루트 액티비티의 위에 쌓이게 되고, 호출된 액티비티가 화면에 표시되면서 사용자와 상호작용을 수행하게 됩니다.

이렇게 호출을 거듭해나가다 보면 호출되었던 액티비티들이 액티비티 스택에 계속 순서대로 쌓이게 됩니다. 하지만, 무한정 액티비티를 호출만 하는 경우는 없습니다. 할 일(?)을 다 마쳤으면 이전 화면으로 돌아가야겠죠? 일반적으로 뒤로가기(Back) 키를 눌러 이전 화면으로 이동을 하는데, 이렇게 되면 액티비티 스택의 가장 위에 있던 액티비티는 액티비티 스택에서 사라지게 됩니다. 액티비티 스택에 액티비티가 쌓일 때 호출된 순서대로 쌓였다면, 사라지는 것은 당연히 그 반대 순서로 사라지게 되겠지요?

만약, 사용자가 뒤로가기 키가 아니라 Home 키를 누르게 되면 Home 화면에 뜨게 되고, 액티비티 스택에 저장되어 있던 액티비티들은 그 순서 그대로 저장되어 있게 됩니다. 그래서, Home 키를 눌렀다가 다시 아까 켜져있었던 어플리케이션을 실행시켜보면 Home키를 누르기 이전의 액티비티가 표시되고, 뒤로가기(Back) 키를 눌러보면 액티비티를 호출한 순서 그대로 액티비티 스택에 남아있는 것을 확인할 수 있습니다.




한번 간단히 확인해보도록 하죠. 기본 어플리케이션 중 Music 어플리케이션을 실행한 후, 아무 버튼이나 눌러 첫번째 액티비티, 즉 루트 액티비티가 아닌 다른 액티비티가 뜨게 합니다. 그 후, 홈 버튼을 눌렀다가 다시 Music 어플리케이션을 실행해 봅시다.




위와 같이 아까 우리가 Home 버튼을 눌렀던 때 화면에 떠있던 액티비티가 실행되는 것을 볼 수 있습니다. 여기에서 다시 뒤로가기(Back) 버튼을 누르면 Music 어플리케이션의 메인화면에 뜨는 것을 볼 수 있구요.

이렇게 해서 액티비티 스택, 즉 태스크(Task)에 대해 알아보았습니다. 위에서 설명한 것들은 별도로 옵션을 설정한 것이 아닌 기본 설정 그대로 액티비티를 실행한 것이며, 액티비티를 실행할 때 별도로 옵션을 지정하면 액티비티 스택에 남지 않게 액티비티를 실행하는 등 여러 가지 방법으로 액티비티를 호출하는 것이 가능합니다.
2010/01/27 21:19 2010/01/27 21:19
Posted
Filed under android

[원문]http://www.androidpub.com/41231

안드로이드 2.0 과 이클립스 3.5 현재 둘다 최신 버전으로 개발 설정하는 방법을 정리해 보았습니다. 참고해 보시기 바랍니다.

(이글은 제 블로그에서 가져온 글입니다.)

차례

1. android SDK 다운받기

2. eclipse 다운 받기

3. eclipse 와 android 연동하기

4. 이클립스로 android 소스 보기

5. svn 사용하기

 

 

안드로이드로 프로그램을 만들어 보고 싶은데 개발 환경 셋팅에 어려움을 격고 있을 지도 모르는 분들을 위해 나의 시행 착오 경험을 바탕으로 빠르게 개발 환경 구성을 할 수있는 방법을 소개 한다.

(자바 SDK 설치 방법은 생략한다. 참고로 아래 과정은 자바 1.5 이상 버전에서 문제 없이  작동한다.)

 


1.android SDK 다운 받기

먼저 안드로이드 SDK 를 다운 받는다. 현재 최신 버전은 2.0 이다.

이번에 SDK 설치 방법이 약간 바뀌면서 안드로이드 2.0을 직접 받는것은 아니고 에뮬레이터나 각종 tool등 부가적인 부분만 먼저 받게 된다.

아래 설명하겠지만, 실제 SDK는 이클립스 안드로이드 플러그인을 통해서 다운 받게 된다.

 

주소 :http://developer.android.com/

 

현재 위 주소에서 SDK 탭에 들어가면 바로 다운로드 화면이 뜨게 된다.

 

윈하는 OS용을 다운 받아서 원하는 경로에 압축을 풀어 놓는다.

 

 

 

2. eclipse 다운 받기

두번째로 이클립스를 다운 받는다. 현재 최신 버전은 3.5 갈릴레오 버전이다. 참고로 안드로이드 플러그인은 이클립스3.4, 3.5 두가지 버전을 지원하는것으로 나와 있다.

 

주소:http://www.eclipse.org/

 

 

 

download 탭에서 두번째 92MB짜리로 받는다. 다른 버전으로 시도를 해보았으나 안드로이드 플러그인 설치과정에서 오류가 발생하여 더이상 진행이 불가능 하였다. 가장 최소 기능만 가지고 있는 버전은 오류가 발생할 가능성이 적은것 같다. 이클립스로 다른 작업을 하거나 기존에 사용하던 이클립스가 있지 않다면 이 버전을 추천한다.

 

다운 받아서 원하는 경로에 압축을 푼다.

 

 

만약 다운 받은 이클립스가 실행이 되지 않는다면 압축푼 경로에 eclipse.ini 파일을 아래 내용으로 바꾸고 다시 실행해 보기 바란다.

 아래 내용은 이클립스 3.4에서도 적용된다.

 

-startup
plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
-product
org.eclipse.epp.package.java.product
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx256m

 

 

 


3. eclipse 와 android 연동하기

 

3.1 이클립스 안드로이드 플러그인 설치

이제 이클립스에 안드로이드 플러그인을 설치해야 한다. 다시 안드로이드 개발자 홈페이지로 간다.

 

주소 :http://developer.android.com/

 

메인메뉴 SDK 탭에 왼쪽 메뉴->ADT Plugin for Eclipse -> Installing and Updating 페이지로 이동한다.

 

 

위 사진 처럼 이클립스 3.4, 3.5 버전에서 각각 따로 플러그인을 설치 방법을 친절하게 적어 놓았다.

3.5 버전용 설명을 한글로 다시 설명하면 아래와 같다.

 

오른쪽에 3.5 버전용 설명에서 url을 복사한다. (https://dl-ssl.google.com/android/eclipse/)

이클립스를 실행하고  메뉴-> help -> Install New Software... 로 들어간다.

팝업창 상단에 Add.. 버튼을 클릭한다.

 

또 다시 팝업에서 name은 androip plug in (아무거나) 입력하고 복사한 주소를 location 에 입력하고 OK 한다.

 

 위 와 같이 두개 플러그인이 보인다. 모두 선택하고 Next -> finish 한다.

 

안드로이드 사이트에도 써 있긴한데 위 처럼해도 플러그인 검색이 되지 않는 경우가 있는것 같다.

그럴때는 https://dl-ssl.google.com/android/eclipse/ 주소의 https에서 s를 뺀 http://dl-ssl.google.com/android/eclipse/ 로 입력해 보기 바란다.

 

 

그러면 의존성이 있는 패키지를 검색하는데 어느정도 시간이 필요하다.

이 과정이 끝나면 뭔가 라이센스약관에 동의 한후 모든 패키지를 다운 & 설치하게 된다. 이과정 역시 시간이 좀 걸린다. 다운로드속도가 상당히 느린편이다.

 

혹시 약관에 동의하여도 Finish 버튼이 활성화가 되지 않는 다면 이클립스를 재시작하고 해보기 바란다. 이클립스에 작은 버그가 있는 것으로 보인다.

 

 

이 과정이 모두 끝나고 이클립스를 재시작하고 툴바에 까만 폰이 보이면 플러그인은 정상적으로 설치된것이다.

하지만 아직 끝난것이 아니다.

처음에 말한데로 android 2.0 SDK를 플러그인을 통해서 다운 받아야 한다.

 

 3.2 안드로이드 플러그인통해 SDK 다운 받기

 이클립스 메뉴 -> Window -> Preferences 로 들어가면 왼쪽 두번째에 android가 보인다.

 

여기서 SDK Location 부분에 최초에 받은 android SDK 를 저장해놓은 폴더를 지정해 준다.


 

아래 부분에 설치된 플랫폼이 보이는 공간인데 아직 아무것도 없을것이다.

OK 하고 나간후 툴바의 까만폰 모양 버튼을 클릭한다.

 

그러면  Android SDK AVD Manager 창이 뜬다.

여기서 왼쪽 첫번째 항목은 가상 폰 즉 에뮬레이터가 보이는 곳이고

두번째 Install Packages 를 선택하면 설치된 안드로이드 패키지들이 보이는 곳인데 역시 아직 아무것도 없을것이다.

세번째  AvailablePackages 선택한다.

 

 

오른쪽에 보이는 항목이 실제 다운 받을 수 있는  SDK와 부가 패키지 들이다.

모두 선택후 좌하단 Install Selected를 클릭한다. 참고로 이과정은 지금까지 중에 가장 오래 걸리는 작업이다. 이클립스 플러그인 다운보다 더 속도가 안나오는것으로 생각된다. 그리고 나는 다운 설치 과정에서 계속 오류가 발생하여 1.1버전과 2.0 버전만 받아서 설치하였다. 다운중 뭔가 문제로 sdk가 설치가 안된다면 일단 최신 버전인 SDK Platform Android 2.0 API 5, reversion 1 만 받아도 큰 문제는 없을것이다. 그리고 SDK이외의 패키지는 모두 받는것이 좋을것 같다. Install Packages 메뉴에 sdk2.0 항목이 올라오면 설치에 성공한것이다.

 

이과정에서 시간이 오래 걸릴 것이기 때문에 잠시 다른 얘기를 해보면  안드로이드 플러그인 최초 버전에서는 다운로드 받은 sdk 경로만 지정해주면 되는 형태 였다가 다음 버전이 나오면서 부터 sdk 버전을 선택할 수 있는 형태로 바뀌었다. 이전 버전에서 만든 프로그램과의 호환에 신경을 쓴다는 뜻이다. 그리고 이번 버전에서는 아예 sdk가 버전업되도 플러그인안에서 다운 받을 수 있도록 더욱 발전된 형태로 바뀌었고 세세한 기능들도 계속 업그레이드 되고 있다. 나온지 얼마 되지 않았지만 안드로이드는 계속해서 진화하고 있는 중이다.

 

 

3.3 virtual device 생성하기

이제 Android SDK AVD Manager에서 왼쪽 첫번째 메뉴로 간다.

에뮬레이터 설정인데, 화면 해상도, 타겟 안드로이드 버전등을 바꿔서 여러개 가상 장치를 만들 수 있게 되어 있다.

 

오른쪽 New... 버튼을 클릭힌다.

 

타겟에 android 2.0을 선택하면 최신버전에서 개발이 가능하다. 혹시 타겟 부분에 아무것도 없다면 SDK 설치가 제대로 되지 않은것이다.

 

 

3.4 에뮬레이터 실행

 

Virtual Devices 에서 Start...를 클릭한다.

 

기본 에뮬레이터 스킨도 이번 버전에서 바뀌 었다.

여기까지 됬다면 이제 안드로이드 어플리케이션개발이 가능하다!

 

Start... 를 했는데 다음과 같은 오류가 발생했을 경우

emulator: ERROR: bad config: virtual device directory lacks config.ini

 

위 오류는 OS에서 한글 계정으로 로그인한 경우에 발생하게 된다.

가상장치를 만들면  계정 폴더안에 설정 파일을 저장하는데 이 경로에 한글이 있으면 에뮬레이터가 실행이 되지 않는다.

 

 

해결방법은 수동으로 한글이 없는 경로에 새로운 avd를 create한다.

 1.커맨드 창에서 최초에 받은  [안드로이드 SDK경로]/tools 폴더로 이동

 2.다음 명령 실행

$ android create avd -n [가상장치이름] -p [경로]

 3.Android SDK AVD Manager 로 가면 가상 장치가 생성되어 있다.

 

 

 

 

여기 부터는 필수 과정은 아니지만 도움이 될만한 내용이다. 특히 소스는 꼭 열어보는것이 좋다고 본다.


4. 이클립스로 android 소스 보기

안드로이드는 오픈 소스이다. 그런데 이상하게도 SDK 를 배포할때 소스는 포함이 되어 있지 않다. 결론적으로는 이클립스로 소스를 볼 수 있는 방법을 만들어 놓았음에도 불구하고 기본적으로 소스를 포함 하지 않는것은 구글의 정책적인 이유가 있기때문이라고 짐작해본다.

 

소스를 다운 받고 이클립스에서 안드로이드 SDK의 소스를 볼 수있도록 하는것이 이번 목표다.

 

4.1 소스 다운받기

안드로이드 소스 사이트로 이동한다.

 

주소:http://source.android.com/

 

안드로이드와 관련된 소스는 이곳에서 확인할 수 있다.

 

 

안드로이드 소스는 Git 이라는 솔루션을 사용하여 저장되어 있다.  Git은 오픈소스 분산 버전 컨트롤 시스템이라고 Git 홈페이지에 나와 있다.

 

 Git 홈페이지 주소: http://git-scm.com/

 

 cvs나 svn과 같은 개념의 소스저장 기술인것 같은데 구글이 기존에 익숙한 cvs나 svn 이 아닌 git을 선택한 이유는 다른것도 있겠지만  웹을 통해 소스를 관리하기 쉬운 기술때문이 아닌가 생각해 본다.

  

왼쪽 메뉴에서 첫 메뉴 Get source 로 이동한다. 오른쪽 본문에서 What's in the source? 항목에 보면 GitWeb 이라는 링크가 보인다. 이곳을 클릭한다.

 

이곳이 보이는 항목 하나 하나가 안드로이드를 구성하고 있는 하나의 프로젝트 들이다. 보면 알겠지만 달빅VM, os 커널, 안드로이드 내장 기본 어플리케이션, 에뮬레이터등 엄청나게 많은 프로젝트 들이 있다. 안드로이드 SDK는 이중 하나의 프로젝트에 불과 하다. 이렇게 정말 방대한 양의 소스들을 작성하고 모두 오픈하고 있다는것은 구글이 안드로이드를 위해 얼마나 많은 투자를 하고 있는지 느끼게 해줄만한 부분이다.

 

위에 보이는 프로젝트들중 platform/frameworks/base.git 을 찾아 들어간다.

 

이곳이 안드로이드 플랫폼 api 저장소 메인화면이다. 이곳을 보면 안드로이드 플랫폼을 개발중인 개발자 이름과 소스를 수정한 시간까지 보이고 있다. 중간쯤 보면 tags 라는 곳이 보이는데 이곳이 플랫폼을 배포하는 순간의 소스를 저장하고 있는곳이다. 아쉽게도 이글을 쓰는 현재 안드로이드 2.0 SDK의 tag는 올라와 있지 않다. 아마 비공개로 되어 있는것 같은데 이부분도 정책적인 이유가 있는것으로 보인다. 공개가 되는대로 글을 수정하도록 하겠다.

일단 기존 1.6 버전이라도 다운 받는 법을 알려드리면 tags 항목을 클릭하고 들어가서 snapshot이라는 링크를 클릭한다. 다운로드 창이 뜨는데 이것이 안드로이드 플랫폼의 소스이다.

 

4.2 이클립스에서 소스 보기

평범한 자바 라이브러리들은 이클립스에서 라이브러리에 소스코드를 등록해서 볼 수 있다. 그런데 안드로이드는 라이브러리 jar 파일에 소스를 붙이는 메뉴가 빠져 있다.

 

안드로이드에서는 다른 방법으로 소스를 볼 수 가 있는데 이 부분도 안드로이드 2.0 SDK 소스가 올라오는데로 업데이트를 하도록 하겠다.

 

 



5. svn 사용하기

 

프로젝트를 진행하게 되면 소스관리툴이 반드시 필요하다. 팀단위로 프로젝트를 진행할때는 물론이고 혼자서 프로젝트를 진행할때도 잘못 수정한 부분을 이전으로 돌릴 수 있는 기능이 때문에 사용하는 것이 좋다.


5.1 이클립스에 svn plugin 설치


이클립스 메뉴 -> help -> Install New Software... 로 간다.

Work with 에 Galileo 를 선택하면 그중 Collaboration  이라는 항목이 보인다.

 

 

 위 사진 처럼 Subversive SVN Integration for the Mylyn Project (Optional)(Incubation), Subversive SVN Team Provider (Incubation) 두 항목을 선택하고  Next -> 라이센스 동의후 Finish 한다. 그러면 설치후 이클립스를 재시작하게 되는데 이때 subversive Connector Discovery화면이 바로 뜬다.

 


svn connector를 다운 받는 창인데  이 부분도 이번에 처음 보는 방식이다. 나열된 항목들이 뭔지 정확하게는 모르겠지만 나 같은 경우 위처럼 SVN Kit 1.3.0을 다운 받았고 특별한 문제 없이 사용중이다. 선택후 Finish 한다.

이어지는 창에서  Next -> Next ->라이센트 동의 ->Finish 한다.


 이클립스 메뉴 -> window -> Open perspective -> Others... 로 들어간다. 

SVN Repository Exploring 이 생기면 svn 설치 성공이다.



 

 5.2 svn 저장소 생성 (google code)

구글에서 무료 svn 호스팅을 제공한다. 구글이 개발자 지원 프로젝트 이다. 따로 svn 서장소를 가지고 있다면 필요 없는 과정다. 개인적인 프로젝트를 진행할때는 쓸만할 것으로 생각한다. 다만 이곳에 올린 소스는 외부누구나 수정은 못해도 볼 수는 있는 상태로 된다.

다른 사용자에게 수정권한을 줘서 여럿이 동시 작업도 가능하다.



주소: http://code.google.com

 

 

왼쪽 메뉴 -> 개발자 리소스 ->  Open Source Programs 로 간다.

이 화면에서  프로젝트 호스팅 링크를 클릭한다.




 create a new project 를 클릭한다.


사전에 구글가입이 되어 있어야 프로젝트 생성이 가능하다.


프로젝트를 생성하고  프로젝트 메인화면에 가사 상단 source 메뉴로 들어간다. 이 화면에서 파란 박스를 잘 보면 url이 있는데 이곳이 저장소의 주소다.


참고로 https.. 로 시작하는 주소는 소스 수정이 가능한 팀맴버를 위한 주소이고 http..로 시작하는 주소는 익명의 외부인들을 위한 읽기만 가능하게 접근하는 주소이다.


5.3 이클립스에서 저장소 연결

점점 안드로이드와는 거리가 멀어지는것 같아서 간단하게 설명한다.


이클립스 메뉴 -> window -> Open perspective -> Others...  -> SVN Repository Exploring 로 들어간다.

SVN Repositories 에서 New -> Repository Location 들어간다.


google code나 다른 저장소의 주소를 URL부분에 입력한다.

2010/01/25 21:32 2010/01/25 21:32
Posted
Filed under JSP, JAVA
첨부파일 : 압축해제후 log4j-1.2.14.jar 파일을
JDK설치된 폴더의 lib/ext 디렉토리에 카피후
프로젝트 properties 의 Java Build Path >
Library > Add External Jars ... 에서 추가시킴



LOG4J

I. 들어가면서.. 그리고 log4j


log4j는 자바 어플리케이션에서 빠르고 효과적으로 로깅 할 수 있도록 도와주는 오픈 소스 프로젝트입니다.


로깅(logging)은 코드의 가독성을 떨어뜨리는 단점이 있지만 애플리케이션에 문제가 있을 때 개발자가 자세한 상황을 파악할 수 있도록 해 주며 테스팅시 빠질 수 없는 요소입니다.


아마도 여러분들은 여러 어플리케이션이 추가되면서 각 개발자들만의 독특한 로깅방식이 서로 썩이고 얽혀서 화면에 나타나는것을 많이 봤을겁니다 -_-;
즉 로깅방법을 통일할 필요가 있는것이죠. 모든 개발자가 특정 포맷에 맞추어서 로깅 한다면 한결 로깅하기도 편하겠지요


오픈 소스 프로젝트인 Log4j는 개발자들이 매우 손쉽고 다양한 형태로 로깅을 할 수 있도록 도와줍니다. 성능또한 우수해 더이상 System.out.println을 사용할 필요가 없습니다.



II. 다운로드


다운로드 http://logging.apache.org/log4j/docs/download.html

매뉴얼 http://logging.apache.org/log4j/docs/documentation.html

API spec http://logging.apache.org/log4j/docs/api/index.html



III. LOG4J 구조


일단 log4j를 잘 모르지만 그 구조만 살짝 살펴보고 넘어갑시다

log4j는 크게 3가지 요소로 구성되며 그 구조는 다음과 같습니다

① Logger(Category) : 로깅 메세지를 Appender에 전달합니다.

② Appender : 전달된 로깅 메세지를 파일에다 기록할 것인지, 콘솔에 출력할 것인지

                   아니면 DB에 저장할 것인지 매개체 역활을 합니다.

③ Layout : Appender가 어디에 출력할 것인지 결정했다면 어떤 형식으로 출력할 것이지

                출력 layout을 결졍합니다.

쉽죠?



IV. LOG4J 로깅 레벨


log4j는 다양한 로깅레벨을 지원합니다.


① FATAL : 가장 크리티컬한 에러가 일어 났을 때 사용합니다.

② ERROR : 일반 에러가 일어 났을 때 사용합니다.

③ WARN : 에러는 아니지만 주의할 필요가 있을 때 사용합니다.

④ INFO : 일반 정보를 나타낼 때 사용합니다.

⑤ DEBUG : 일반 정보를 상세히 나타낼 때 사용합니다.


만약 로깅 레벨을 WARN 으로 설정하였다면 그 이상 레벨만 로깅하게 됩니다.

즉 WARN, ERROR, FATAL 의 로깅이 됩니다.



V. 샘플코드 1


jsp에서 사용하는 예제가 없어 만들어 봤습니다.


test.jsp


<%@ page contentType="text/html;charset=MS949"
 import="org.apache.log4j.Logger" %>

<%!
 static Logger logger = Logger.getLogger("test.jsp");
%>

<%
logger.fatal("fatal!!");

logger.fatal("fatal2!!", new NullPointerException("널입니다요"));

logger.error("error!", new NumberFormatException());

logger.error("error!2");

logger.warn("warn");

logger.info("info");

logger.debug("debug");
%>


결과 콘솔화면








static Logger logger = Logger.getLogger("test.jsp");

static 메소드 getLogger를 통해 logger 인스턴스를 가져옵니다.
getLogger에는 파라미터로 스트링 혹은 클래스를 사용하는데 jsp에서는 클래스를 파라미터로 주기에는 좀 애매합니다. 그냥 스트링으로 주도록 하지요


logger.fatal("fatal!!");
logger.fatal("fatal2!!", new NullPointerException("널입니다요"));
  
logger에 fatal 레벨의 메세지를 전달합니다. 다음 두가지 메소드를 지원하는군요

fatal(Object message)

fatal(Object message, Throwable t)

각 레벨마다 위처럼 두가지 메소드를 지원합니다.


지원 메쏘드
logger.fatal(Object message) logger.fatal(Object message, Throwable t)
logger.error(Object message) logger.error(Object message, Throwable t)
logger.warn(Object message) logger.warn(Object message, Throwable t)
logger.info(Object message) logger.info(Object message, Throwable t)
logger.debug(Object message) logger.debug(Object message, Throwable t)


VI. 샘플코드 2


서블릿의 경우 다음과 같이 코딩하면 되겠군요

TestServlet.java


import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class TestServlet extends HttpServlet {


    static Logger logger = Logger.getLogger(TestServlet.class);


    public void init(ServletConfig config) throws ServletException {
         super.init(config);
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

         try {
              ...
   
              logger.info("Hellow World~");

              ...

          } catch (Exception e) {
              logger.error("Error at TestServlet", e);
          }
     }
}



VII. LOG4J 설정


log4j 설정은 프로그램 내에서 할 수 있지만 설정파일을 사용함으로서 좀더 유연하게 log4j환경을 만들 수 있습니다.


프로그램에서 설정

<%@ page contentType="text/html;charset=MS949"
 import="org.apache.log4j.*,java.io.* "
%>

<%!
 static Logger logger = Logger.getLogger("log4j.jsp");
%>

<%
String layout = "%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n";
String logfilename = "DailyLog.log";
String datePattern = ".yyyy-MM-dd ";

PatternLayout patternlayout = new PatternLayout(layout);
DailyRollingFileAppender appender = new DailyRollingFileAppender(patternlayout, logfilename, datePattern);
logger.addAppender(appender);
logger.setLevel(Level.INFO);
logger.fatal("fatal!!");
%>


property 파일에 설정
log4j.properties를 만들어 /WEB-INF/classes 밑에 놓으세요



log4j.rootLogger=INFO, stdout, rolling

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender

log4j.appender.rolling.File=output.log

log4j.appender.rolling.Append=true

log4j.appender.rolling.MaxFileSize=500KB

log4j.appender.rolling.DatePattern='.'yyyy-MM-dd

log4j.appender.rolling.layout=org.apache.log4j.PatternLayout

log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n


#최상위 카테고리에 INFO로 레벨 설정 및 appender로 stdout, rolling을 정의

log4j.rootLogger=INFO, stdout, rolling

#stdout 어펜더는 콘솔에 뿌리겠다는 정의

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

#stdout 어펜더는 patternlayout을 사용하겠다는 정의

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

#페턴은 다음과 같이 포맷팅 하겠다는 것을 정의

log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n


#역시나 rolling 어펜더는 파일로 처리한다라고 정의

log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender

#로그 파일 이름은 output.log

log4j.appender.rolling.File=output.log

#true면 톰캣을 내렸다 올려도 파일이 리셋되지 않습니다.

log4j.appender.rolling.Append=true

#파일 최대 사이즈는 500KB로 설정

log4j.appender.rolling.MaxFileSize=500KB

#파일 포맷은 output.log.2005-03-10 으로 관리하겠다고 정의

log4j.appender.rolling.DatePattern='.'yyyy-MM-dd

#역시나 rolling 어펜더는 패턴 레이아웃을 사용하겠다고 정의

log4j.appender.rolling.layout=org.apache.log4j.PatternLayout

#rolling 어펜더는 패턴 레이아웃 포맷

log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n



VIII. 설정 포맷


로그파일명 포맷 (DatePattern)
로그파일명 포맷입니다. 날짜, 시간 및 분단위로까지 로그 파일을 분리할 수 있습니다.

형식 설명
'.'yyyy-MM 매달 첫번째날에 로그파일을 변경합니다
'.'yyyy-ww 매주의 시작시 로그파일을 변경합니다.
'.'yyyy-MM-dd 매일 자정에 로그파일을 변경합니다.
'.'yyyy-MM-dd-a 자정과 정오에 로그파일을 변경합니다.
'.'yyyy-MM-dd-HH 매 시간의 시작마다 로그파일을 변경합니다.
'.'yyyy-MM-dd-HH-mm 매분마다 로그파일을 변경합니다.



PatternLayout 포맷
로그자체를 어떤 포맷으로 남길지 결정합니다.
layout에는 HTMLLayout, PatternLayout, SimpleLayout, XMLLayout등이 있으며 PatternLayout이 일반적으로 가장 많이 쓰입니다.


형식 설명
%p debug, info, warn, error, fatal 등의 priority 가 출력된다.
%m 로그내용이 출력됩니다
%d 로깅 이벤트가 발생한 시간을 기록합니다.
포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다
%t 로그이벤트가 발생된 쓰레드의 이름을 출력합니다.
%% % 표시를 출력하기 위해 사용한다.
%n 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다.
%c 카테고리를 표시합니다
예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
%C 클래스명을 포시합니다.
예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
%F 로깅이 발생한 프로그램 파일명을 나타냅니다.
%l 로깅이 발생한 caller의 정보를 나타냅니다
%L 로깅이 발생한 caller의 라인수를 나타냅니다
%M 로깅이 발생한 method 이름을 나타냅니다.
%r 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
%x 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
%X 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.

예시) (같은 색끼리 보시면 됩니다)

위의 test.jsp를 다음 포맷으로 출력해본다면

[%c] [%C] [%d] [%F] [%l] [%L] [%m] [%M] [%n] [%p] [%r] [%t] [%x] [%X]는 다음과 같다

[test.jsp] [org.apache.jsp.test_jsp] [2005-03-10 12:37:23,561] [test_jsp.java] [org.apache.jsp.test_jsp._jspService(test_jsp.java:64)] [64] [fatal!!] [_jspService] [개행] [FATAL] [765567] [http-8080-Processor25] [] []


=============================================

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

2010/01/19 15:18 2010/01/19 15:18
Posted
Filed under JSP, JAVA

한글 처리를 하기 위해서 RequestProcess 를 상속 하여 넘어 오는 모든 Request 에 대해서
UTF-8 인코딩 처리를 하면,
javax.servlet.ServletException: TilesPlugin : Specified RequestProcessor not compatible with TilesRequestProcessor
        at org.apache.struts.tiles.TilesPlugin.initRequestProcessorClass(TilesPlugin.java:360)
        at org.apache.struts.tiles.TilesPlugin.init(TilesPlugin.java:164)
        at org.apache.struts.action.ActionServlet.initModulePlugIns(ActionServlet.java:1158)
        at org.apache.struts.action.ActionServlet.init(ActionServlet.java:473)
        at javax.servlet.GenericServlet.init(GenericServlet.java:258)

와 비슷한 ERROR 메시지가 발생 한다.
API를 찾아 보니 ..

TilesRequestProcessor 라구 Tiles 를 위한 RequestProcessor가 존재 한다.
그럼으로,, TilesRequestProcessor 를 상속 하여 구현 하면 끝..

package com.ubibada.lms.struts;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.RequestProcessor;
import org.apache.struts.tiles.TilesRequestProcessor;

public class DefaultRequestProcessor extends TilesRequestProcessor {
 @Override
 protected boolean processPreprocess(HttpServletRequest request,HttpServletResponse response) {
  try {
   request.setCharacterEncoding("UTF-8");
   return true;
  } catch (Exception e) {
   return false;
  }
 
 }//end function
}

이런식으로
import org.apache.struts.tiles.TilesRequestProcessor;  한 후 상속 하여 구현 하면 된다.
관련 APi
http://struts.apache.org/1.x/struts-tiles/apidocs/org/apache/struts/tiles/TilesRequestProcessor.html

public class TilesRequestProcessor
extends org.apache.struts.action.RequestProcessor

RequestProcessor contains the processing logic that the Struts controller servlet performs as it receives each servlet request from the container.

This processor subclasses the Struts RequestProcessor in order to intercept calls to forward or include. When such calls are done, the Tiles processor checks if the specified URI is a definition name. If true, the definition is retrieved and included. If false, the original URI is included or a forward is performed.

Actually, catching is done by overloading the following methods:  <-- 즉  이거를 상속 해서 구현 하라고 함..


2010/01/19 14:56 2010/01/19 14:56
Posted
Filed under JSP, JAVA

한글을 사용 하기 위해서는 char-set을 utf-8로 설정을 해야 한다.
한글 처리를 하기 위해서 작성한 클래스  이며
RequestProcessor  를 상속 한 후
processPreprocess 메소드를  재정의 하여 구현 하였다.


package com.ubibada.lms.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.RequestProcessor;


public class defaultRequestProcessor extends RequestProcessor {
 @Override
 protected boolean processPreprocess(HttpServletRequest request,HttpServletResponse response) {
  try {
   request.setCharacterEncoding("UTF-8");
   return true;
  } catch (Exception e) {
   return false;
  }
 
 }//end function
}

2010/01/16 21:50 2010/01/16 21:50
Posted
Filed under JSP, JAVA
<struts-config>
  <form-beans>
  <global-exceptions />
  <global-forwards />
  <action-mappings />
  <message-resources />
</struts-config>

순서대로 struts-config.xml 파일에 선언 하여 사용 해야 한다.
선언 하는 순서가 다르더라도 동작은 하지만
오류가 발생 함으로 반드시 1.3에서는 struts-confg파일 선언 순서를 지켜서 사용 해야 한다.


2010/01/16 21:18 2010/01/16 21:18
Posted
Filed under ORACLE
[원문:] http://iret-ceo.blogspot.com/2009/01/oracle-limit-offset.html

OracleではLimit Offsetがないため処理的に困ることが多い
じゃあどうするかというと
betweenとrow_number() over()を使うとうまくいける

テーブル例
TEST
 SORT NUMBER(1),
TEST_NAME VARCHAR2(256)

例として先頭の10個取ってくるサンプル
select
*
from(
select
row_number() over(ORDER BY SORT) AS NUM,
TEST_NAME
FROM
TEST
ORDER BY SORT
)
WHERE
NUM BETWEEN 0 AND 10

2010/01/11 11:44 2010/01/11 11:44