2014년 8월 15일 금요일

Logcat 이용시 line number 넣기

로그캣 이용시 에러 메시지는 안드로이드가 내뱉기 때문에 더블클릭시에 해당 소스라인으로 바로 점프가 됩니다.

하지만 저희가 입력하는 로그의 경우 그렇지 못하죠.

그래서 저는 별도의 로그를 만들어서 사용합니다.



public static void toLog(String TAG, String STR) {

Log.i(TAG, STR+"("+lineOut()+")");

}

이렇게 사용하게 되면 제가 원하는 태그와 메시지 그리고 그 메시지 뒤에 라인넘버 정보가 나오게 됩니다. 이 정보를 넣게 되면 더블클릭 했을시에 안드로이가 뱉는 에러 메시지 처럼 바로 소스로 접근이 가능하게 되어서 굉장히 편하죠.

lineOut 이라는 함수가 그 주인공인데 그 내부는 다음과 같습니다.



public static String lineOut() {
   int level = 4;
   StackTraceElement[] traces;
   traces = Thread.currentThread().getStackTrace();
   return (" at "  + traces[level] + " ");
}



현재 Thread 의 StackTraceElement 들을 보면 함수를 호출하는 스택을 가지고 있습니다.
이 스택을 보게 되면 아마 여러분도 대충 감이 오실거라 생각됩니다.


위 메시지는 제가 traces level을 0~4 까지 보았을때의 연속적인 Stack 의 메시지를 출력한 결과입니다.
toLog()라는 메시지는 실제로 onStart 라는 함수에서 불려졌지만 이는 StackTraceElement중 4번째에 해당됩니다.

Thread의 StackTrace는 안드로이드의 핵심인 dalvik에서 관리되고 있습니다.

저의 경우 lineOut이라는 함수가 toLog 함수 안에 다시 포함되어지기 때문에 5번째 스택에 들어있지만 여러분의 기호에 맞게 level 을 설정 하셔서 쓰시면 되겠습니다.

StackTrace문장이 한 로그에 하나의 Element 만 있다면 더블 클릭시에 해당 소스 페이지로 넘어가기 때문에 검색을 하거나 찾을 필요가 없어 굉장히 편리합니다~~

나름 꿀팁이랄까... 수고하세요~

2014년 8월 13일 수요일

Tizen Platform Development


한국 EFL 커밋터이신 서주영님의 타이젠 플랫폼 개발 10편을 정리했습니다.
서주영님은 현재 삼성전자 소프트웨어 센터에서 근무중 이시며
개인블로그 seoz.egloos.com 를 운영하고 계십니다.

1편 - http://www.embeddedworld.co.kr/atl/view.asp?a_id=6122
2편 - http://www.embeddedworld.co.kr/atl/view.asp?a_id=6212
3편 - http://www.embeddedworld.co.kr/atl/view.asp?a_id=6290
4편 - http://www.embeddedworld.co.kr/atl/view.asp?a_id=6362
5편 - http://www.embeddedworld.co.kr/atl/view.asp?a_id=6441
6편 - http://www.embeddedworld.co.kr/atl/view.asp?a_id=6539
7편 - http://www.embeddedworld.co.kr/atl/view.asp?a_id=6662
8편 - http://www.embeddedworld.co.kr/atl/view.asp?a_id=6777
9편 - http://www.embeddedworld.co.kr/atl/view.asp?a_id=6894
10편 - http://www.embeddedworld.co.kr/atl/view.asp?a_id=7038

원문 링크 이기 때문에 링크로 가셔서 보시길 바랍니다

2014년 8월 12일 화요일

[Linux] Ubuntu 12.04 install flash plug-in to chromium

현재 Adobe flash 는 linux chromium 에서 plugin 형태로 지원되지 않는다.
firefox 는 지원되니 귀찮으면 그냥 파폭 쓰셔도 됩니다.

chromium 에서 flash player를 사용하기 위해서는

pepper flash player를 사용합니다.

sudo add-apt-repository -y ppa:skunk/pepper-flash 
sudo apt-get update; sudo apt-get install pepflashplugin-installer 
sudo sh -c 'echo ". /usr/lib/pepflashplugin-installer/pepflashplayer.sh" >>/etc/chromium-browser/default'

2014년 7월 31일 목요일

[Github] Git caret and tidle

Git caret and tilde

I spent a little bit of time playing with Git today, specifically the way that the ^ (caret) and ~ (tilde) work and thought I'd document it here in case I forget.

The short version

If you want a deeper explanation skip down to "The long version".
ref~ is shorthand for ref~1 and means the commit's first parent. ref~2 means the commit's first parent's first parent. ref~3 means the commit's first parent's first parent's first parent. And so on.
ref^ is shorthand for ref^1 and means the commit's first parent. But where the two differ is that ref^2 means the commit's second parent (remember, commits can have two parents when they are a merge).
The ^ and ~ operators can be combined.
Here's a diagram showing how to reference various commits using HEAD as the starting point.
Referencing commits from HEAD using ~ and ^

The long version

I've created a dummy repository with several commits in it.
$ git log --graph --oneline
* 8329384 Seventh commit
*   f5717b0 Merge branch 'my_branch'
|\  
| * 956c87d Fourth commit on a branch
* | a8fe411 Sixth commit
|/  
* c7c2590 Third commit on a branch
* 86362ff Second commit on a branch
* 748855b First commit on a branch
* 1855b25 Fifth commit
* 67cf3a7 Fourth commit
* ea29778 Third commit
* 28c25b1 Second commit
* cd00b76 First commit
Starting at the bottom, the early commits were made straight onto master.
The commits starting at 748855b and moving up to c7c2590 were made on a branch and merged into master, but no changes had been made on master in the mean time.
The commits a8fe411 and 956c87d were made on separate branches at the same time. They were merged together in commit f5717b0.
Finally, 8329384 was committed straight onto master.
We can use git show to look at individual commits.
You'll already know that HEAD points to the tip of the current branch:
$ git show --oneline HEAD
8329384 Seventh commit
...
Putting the caret symbol (^) next to a commit means the parent of that commit. So the following will show the parent of HEAD:
$ git show --oneline HEAD^
f5717b0 Merge branch 'my_branch'
...
HEAD^ is shorthand for saying HEAD^1, which literally means show me parent 1 of that commit. You can also say HEAD^2 but in this instance it won't make any sense:
$ git show --oneline HEAD^2
fatal: ambiguous argument 'HEAD^2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
Because HEAD only has 1 parent.
But f5717b0, the point where the two branches were merged, has two parents, one on master and one on the branch:
$ git show --oneline f5717b0^1
a8fe411 Sixth commit
...

$ git show --oneline f5717b0^2
956c87d Fourth commit on a branch
...
The tilde symbol (~) works in a similar way. In fact HEAD~ will reference the same commit as HEAD^:
$ git show --oneline HEAD~
f5717b0 Merge branch 'my_branch'
...
Again, HEAD~ is shorthand for HEAD~1, but here this means the first ancestor of HEAD– HEAD~2 is not the second parent of HEAD but the grandparent of HEAD:
$ git show --oneline HEAD~1
f5717b0 Merge branch 'my_branch'
...

$ git show --oneline HEAD~2
a8fe411 Sixth commit
...

$ git show --oneline HEAD~3
c7c2590 Third commit on a branch
...
As you can see, 956c87d Fourth commit on a branch is not visible when using the tilde operator. This is because the tilde operator always presumes you want to view the first parent's parent.
To access the second parent's parent the tilde and caret symbols can be combined:
$ git show --oneline HEAD~1^1
a8fe411 Sixth commit
...

$ git show --oneline HEAD~1^2
956c87d Fourth commit on a branch
...
In this way you should be able to reference any commit in your repository's history.

http://cache.preserve.io/h7bo2ez7/index.html

2014년 6월 24일 화요일

Eclipse DDMS Logcat 이용시 Log를 통해 line number( 라인 넘버 ) 찍기


 Log.d(TAG, "라인넘버를 넣어봅시다  " + Utils.lineOut());


1
2
3
4
5
6
public static String lineOut() {
    int level = 3;
    StackTraceElement[] traces;
    traces = Thread.currentThread().getStackTrace();
    return (" at "  + traces[level] + " " );
}

함정이 있다면..

Log.d()함수를 다시 재수정 해서 Utils.lineOut()을 넣으려 해도 예를들면

1
2
3
public static void toLog(String str1, String str2) {
    Log.d(str1,str2+Util.lineOut());//여기가 45라인이라 칩시다.
}

// 요렇게 해도 해당 toLog()를 콜한 지점이 아닌 toLog()함수 자체의 라인넘버인
// 45만 나옵니다. 해결법은 아직 찾지 못했습니다..아시는분 댓글 부탁드립니다~

2013년 5월 14일 화요일

Spring + Mybatis + Restful 환경구축 (3)

두번째 글에서 mybatis 설정 까지 했습니다.

이제 Restful 이 남았네요.

그전에 간단히 Restful 이 뭔지 한줄 설명을 하자면

기존에 웹페이지는 서버에서 페이지를 요청할때 필요한 값들을 url 자체에 올려서 하거나 패킷안에 데이터로 넣어서 보냈습니다.

url 이 GET

패킷에 넣는걸 POST 방식이라 합니다. HTTP REQUEST METHOD 라고 아마 패킷에 명시되어 있습니다.

이외에도 여러개가 더 있습니다.

이렇게 구분되어진 어떠한 요청 방식이 나누어져 있는데 이를 이용한 페이지 요청방식 이라고 할 수 있겠네요.

보통 SQL 과 연관되서 GET은 SELECT, POST 는 CREATE 같은 DML ,DDL 같은 쿼리문의 차이를 이용해서 서비스 한답니다.

한줄아니네요.. 암튼 이건 대충 그렇다는거고 자세한 사항은 직접 찾아보세요^^

전 구축만 할테니..

자 시작합시다.

저같은 경우는 웹페이지에 어떠한 값을 요청하거나 주는걸 모두 Ajax JSON 을 통해 주고 받습니다. 본 구축방법도 JSON을 이용한 구축방법에 대해 포스팅 하겠습니다.

JSON을 이용하기 위해서는 Spring Framework 이외에도 Jersey 라는 Framework 가 필요합니다.

Jersey 가 무엇인지는 난 안갈켜줍니닷. 난 구축만 할 뿐..

자 갑시다.

일단 필요한 API 를 Maven 을 통해 설정합니다.

pom.xml 을 열고 dependency 에서 com.sun.jersey 를 검색합니다.

image

이중 여러개가 필요한데 저희가 필요로 하는것은

jersey-server
jersey-servlet
jersey-json
jersey-spring

입니다. 모두 찾아서 추가해 주세요.

이제 소스상에서 구현하면되요? jersey는 간단하죠??

사실 Annotation을 사용한다는 것 이외에는 Framework 라고 하기에는 약한감이 있고 그냥

API 라고 생각하셔도 무난할 듯 합니다.

앞서 jersey를 이용한 구현부를 이미 한번 보았는데요

밑에서 보시죠


image

바로 CommonService 입니다.

근데 보시면 클래스선언 위에

@Path("/test") 가 있습니다.

이는 만약 저희 홈페이지가

http://localhost/gn/

가 기본주소 라면

https://localhost/gn/test

위 주소 뒤에 /test/{필요한 파라미터들} 처럼 넣어서 POST 혹은 GET 방식으로 REQUEST

하게 되면 그 REQUEST METHOD 에 따라 알맞는 함수를 CALL 하고 결과를 반환합니다.

예로 저 위에 소스상에서는

POST 방식은

image

이 함수가 실행되죠

선언은

@POST 하고

@Consumes 은 결과로 제공되는  Content-Type 을 의미합니다.

반대로 웹에서 서버로 제공하는 Content-Type을 명시하기도 하는데 이때는

@Produces 를 사용합니다. 저는 JSON을 사용 함으로 위와같이 하였으나

보통은 "text/plain" 이나 "text/html" 을 넣으면 됩니다.

ex) @Comsumes("text/plain")

이제 이 함수가 실행되는건 알았는데 결과를 return 해야겠죠??

보통 POST 는 SQL 로 치면 테이블 Create 같은 쿼리를 매칭 하기 때문에 요청에 대한 결과로는 200 OK 같은 ' 아 잘 처리됬고 결과 굳 ' 이라고 웹에 날려줍니다.

위와같이 200 을 상태로 넘기면 되겠죠??

그외 GET 에 대해 잠시 살펴보죠

image

POST 와 다르다 하면

또 @Path 가 등장하는 것이겠죠??

이는 /test/{mainCode} 를 의미 합니다.

만약 내가 어떤 테이블에 mainCode 가 100 인 로우를 검색해서 결과를 JSON 으로 받고싶다면

GET 방식으로 http://localhost/gn/test/100

으로 요청하면 되는거죠

쉽죠??~!!!

실제로 이 코드들이 되는지를 살펴보기 위해서 저는

Google Chrome Extension 중에 'Advanced REST Client' 라는걸 사용합니다.

그모습은 다음과 같구요

이걸 이용해서 다음과같이 GET 방식으로 SEND 하면

image

다음과 같이 200 OK 와

JSON 데이터가 들어 있음을 확인 할 수 있습니다.

요청 주소는 @Path에 맞춰서

http://localhost/gn/test/main_

을 요청했고

mainCode = main_ 을 요청한거죠..

잘 되네요^^

헌데 아마 아직 제가 ApplicationContext 에 대해 언급하지 않은거 같은데 이는 걍 소스를 보여드리께요

image

위와 같구요 그 위치는 /WEB-INF/spring/applicationContext.xml 이네요

보통 프로젝트를 생성하면 root-context.xml이 같은 디렉토리에 생성되는데 저는 그냥

새로 만들어서 사용했습니다. 그렇기 때문에 이를 spring 에도 설정을 해줘야 합니다.

우선 프로젝트 우클릭 -> properties 열어 주시고요

image

여기서 Scan 합니다.

근데..왜 난 안될까요.. 다시 properties 여니까 자동으로 설정되네요..

여러분도 그런가요^^?

아마 자동으로 잡히는거 같습니다만 안되는 분은 Scan 이나 Add를 통해 꼭 ApplicationContext.xml 을 등록해주세요.

이상

Spring + Mybatis + Restful 구축을 마칩니다.

사이사이 엄청난 양의 설명과 개념은 다 뺏습니다.

왜냐면 저같은 경우는 스프링을 하나하나 공부하면서 여기까지 구축하였는데

그때마다 드는 생각이 일단 구성된 모습을 보고싶다. 그 후 이렇게 해야만 하는 이유를 공부해야 뭔가 순서가 맞을거 같다.. 라는거 였습니다.

그래서 구성된 모든 모습을 딱 보고난 후에 책을 보거나 한다면 이해가 더욱 잘되겠죠??

모두 아시다시피 Spring관련 책들은 엄청 두껍고..양이 많습니다.. 그만큼 많은 개념과 설명이 필요하다는 것이겠지요. 하지만 아마 한 5장이나 절반정도는 리팩토링과 스프링의 개념설명 입니다. 그 후 구축을 시작하고 예제를 진행하게 됩니다. 아마 스프링을 시작하는 뉴비들의 장벽이라고 할 수도 있겠지요.. 하지만 분명 중요합니다. 엄청 중요한 부분이기 때문에 저는 다 보기를 추천드리고요.. 그래도 저는 구축부터 한번 딱 해보는게 좋다고 생각합니다. 뭐 설명은 다때려치우고 마지막의 모습을 딱 보고 난 후에 공부를 하는게 좋다고 생각해서 진행하게된 블로깅 입니다. 그리고 스프링의 특성상 이클립스 IDE 를 사용하기 때문에 ( 스프링에서 따로만든 STS 라고도 있습니다만 이또한 이클립스를 기반으로 합니다 ) IDE 와의 설정 싸움이 시작됩니다. JAVA 계열을 하는 모든 분들은 잘 아시겠지만 이게 사용하기가 쉽지 않습니다.. VS2012 나 2010 을 사용하는 주로 C# , C/C++ 를 하시는 분들은 이클립스를 매우 싫어하죠?? 저도 마찬가지입니다. 저는 VS 를 싫어해요.. 엄청불편하니까요..언어에 필요한 요소가 있고 다 필요한게 있고 그런겁니다. 알맞게 사용하면 됩니다. 갑자기 언어 이야기를 하는데.. 뭐 아무튼 이클립스에서 스프링을 구축하는 방법을 프로젝트 생성만 하면 끝날 문제가 아니기에 이러한 과정이 필요한 거겠죠??

그래도 아마 제 글만보고 따라해도 안될 가능성이 있습니다.. 그러한 분들은

댓글을 달아주시거나 메일을 적어주시면 이 소스자체를 드리겠습니다.

기능자체는 없으니 딱히 아까운게 없네여.

뭐 사실 우리나라 특성상 자기가 습득한 기술을 꽁꽁 숨기고 공유안하는 경우가 허다한데

그러한 행동은 우리나라 IT 발전이 더디게 하는 큰 원인이 되겠지요. 결국 자신에게 돌아옵니다.

물론 잘못된건 아닙니다. 하지만 나만 잘하고 내옆에 사람이 못하면 결국 나는 야근해야 하는겁니다. 잘생각하세요. 다 잘해야 다 좋은거에요. 그래서 복사도 다되고.. 다만 출저는 남겨줘야겠죠 최소한..

그러면 이만 ^^

ps. 댓글은 제폰에 실시간으로 푸시되니까 최대한 빨리 답변드리겠습니다 ^^




2013년 5월 13일 월요일

Spring + Mybatis + Restful 환경구축 (2)

자 이제 Mybatis 를 구축해봅시다.

벌써 스프링 구축방법이 생각 안날정도로 날이 많이 지났네요..

Mybatis 를 사용하기 위해선 일단 API가 필요합니다.

헌데 이걸 jar 를 받아서 일일이 추가하느냐. 아니죠

우린 앞서 Maven 을 이용해서 jar들을 추가 했습니다.

마찬가지로 maven 이 제공하는 dependency 를 이용합니다.

pom.xml 을 열어주세요.

image

열어서

image

Dependencies -> Add 눌러줍니다.

image

mybatis 만 치면 아래 검색결과가 나옵니다.

이중 org.mybatis 에 mybatis-spring을 OK!

이후 Ctrl+S 한번 해주시고

Mybatis 를 사용하기 위해서는 SqlMapper 를 설정하기 위해서 몇가지 설정을 해야합니다.

그를 첫번째

일단 Config 와 관련된 파일이 3개정도 되니까 WEB-INF/ 에 config 폴더를 하나 만들께요.

image

위와같이 config.properties , mybatis-config.xml, mybatisMapper.xml 이 필요합니다.

이름은 마음대로 해도되고 경로만 잘 설정해주면되요

이제 각 파일 안의 내용을 보죠

첫번째로 config.properties

image

이게 다에요 이건 어디 쓰는거냐면 저는 mysql 을 사용하는데 이를 연결하기 위한 정보를 담고 있습니다. 빨간 네모 부분이 DB명이고 그외 driverclass는 mysql 에 맞췄습니다. DB가 Oracle 이나 sqlite 면 해당 driverclass 명을 적어주면 되겠죠??
유저명이나 비밀번호는 저는 APMsetup 으로 설치한 Apache + mysql 을 사용하니 기본설정이 저런데 여러분 DB에 맞춰서 적으면 되요

두번째로 mybatis-config.xml

image

별거없지요??

이파일을 만드는 방법은 저는 그냥 xml 생성해서 직접 처음부터 적었습니다.

근데 제가 알기론 mybatiseditor 라는 플러그인이 이클립스에 있는걸로 아니 그걸 설치하면

아마 문서타입 정도까진 알아서 만들어 질겁니당.

여긴 이제 mybatis 의 설정을 담는데 mapper 파일의 경로를 지정합니다.

세번째 mybatisMapper.xml

image

자 먼가 복잡해 보입니닷.

이 블로깅을 보기전에 Mybatis 나 Spring에 관한 책으로 공부하신 분이라면 감이 오시겠지만

이부분은 resultMap type 라고 지정해놓은 CommonCode 에 있는 각각의 변수에 SQL Query 의 결과로 나오는 Row data를 변수와 컬럼을 1:1로 매칭시키는 것입니다.

이렇게 매칭만 해놓으면 쿼리 결과가 이제 객체가 되므로 따로 쿼리문을 ResultSet 에서 객체화 하는 부분을 따로 안해도 됩니다. 감이 오시나요??

resultMap 태그 밑에는 실제 어떤 함수가 이 쿼리를 사용하며 WHERE 조건부에 나오는 동적(?) 값을 #{mainCode} 를 받고 이는 String type이고 이 쿼리는 resultMap 'jebal'과 매칭됩니다. 빨간선으로 표시해 놓았죠?

그럼 mapper namespace는 뭐지요? 할수 있습니다. 저도잘 몰라요 ^^*
C++ 에 namespace같은 개념이겠지요뭐..

자이제 이걸보면 아 CommonCode 클래스와 저 함수가 어떻게 쓰이는지 궁금하다..라고 할수 잇겟죠??

자 가봅시다.

CommonCode.java

image

이게 전부입니다.

컬럼과 1:1매칭되는 각 변수가 있고 이 이름은 mapper에 명시한것과 같은 이름 입니다.

이거에 대한 setter, getter 메소드만 있을뿐 입니다. bean 이라고 할수 있겠네요

자 그럼 selectAll2 라는 함수는 어디서 어떻게 쓰이냐??

image

이 CommonService 라는 클래스는 이제 Restful과 함께 설명되어야 하는데 각설하고 일단 mybatis 부분만 설명 후 다시 설명하겠습니다.

아래 get 함수 부분 보시면 return commonDao.selectAll2(main_code) 라고 볼 수 있습니다.

저 main_code는 이 프로그램 어디서가 아니고 웹페이지 상에서 사용자가 날리는 url 에 data부분을 뜻합니다ㅓ.

http://localhost/greennavi/test 여기까지가 현재 CommonService가 제공하는 Service의 주소입니다. 이후 /test/~~ 의 값들을 이용해서 보여줄 페이지를 만들고 보여주게 되는거죠

이때 ~~ 부분이 main_code 가 됩니다. 만약 main_code 가 111 이라면
http://localhost/greennavi/test/111 이라고 하면 저 get 함수가 요청됩니다.

물론 정확하게 Restful 을 설명하자면 GET 방식으로 요청할때만 입니다.

아..그럼 CommonDao 는 무엇이냐.. 이게 로직부분이라고 생각하면 되겟네요

Service를 저는 웹페이지 상의 어떤 url 을 매칭하기 위한 부분을 하나의 서비스라고 했고
(CommonService 를 저는 /test 의 url 에서 하는 service를 뜻합니다.)

Dao 는 Spring에서 말하는 로직 부분이 되겠습니다.

맞나요? 저 초심자라 틀렸다면 댓글 부탁드려요

image

이 부분이 실제 로직 부분이 되겠습니다.

중요한건 sql을 사용하기 위해선 SqlSessionDaoSupport 라는 class를 상속해야 하고 이를

Spring 을 통해 의존성을 주입한 후에 사용 할 수 있습니다.

보시면 selectAll2 함수의 실제 구현부가 나와있습니다.

getSqlsession() 은 SqlSessionDaoSupport 에서 정의된 함수이고 selectOne 을 통해 하나의 쿼리가 가능합니다. 이때 파라미터로 아까 mapper 에서 설정한 "namespace.함수명" 을 하고 실제 #{main_code} 를 저렇게 mainCode 로 넣어주면 쿼리가 되는 거에요.

그 결과로 하나의 CommonCode 객체가 return 되겟지요??

실제로 저흰 지금 쿼리를 한후 결과값을 건드리지 않고 모두 매핑해서 사용하고 있어서.. 구현부가 따로 할게 없답니다. Spring이 다 지원하니까!! mybatis 니까!! 이게 우리가 이걸 사용하느 이유니까!! 꼭 이걸 위해선 아니지만..뭐 아무튼 쉬워지자나요

아 저 implements 는 제가 Dao를 설계한다고 필요했던거니 없어도 무방합니닷.

일단 이렇게 mybatis 설정이 끝났네요.

Restful은 더욱 간단하니까 달려봅시다.

혹여나 mysql 부분이 필요하시면 댓글 달아드리께요

ps. 위 소스를 다 구현하셔도 아직 실행이 안되실겁니다. applicationContext 를 아직 다 안보여 드렸기 때문에 ^^;; 다음편에 다 공개합니다.

도움되셨다면 피드백을 위한 댓글 부탁드립니다.

2013년 5월 1일 수요일

VideoView 를 Rotate 할때 깨짐현상 해결법


비디오뷰가 있을때 Orientation을 Rotate 뷰의 크기를 전체화면으로 해야하는데 이때 비디오뷰가 깨지는 현상을 발견하였다. ( 아센기준 ) 
해결법공개

@Override
public void onConfigurationChanged(Configuration newConfig) {

// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
switch (newConfig.orientation) {
case Configuration.ORIENTATION_LANDSCAPE:
toLog("ORIENTATION_LANDSCAPE");

if (videoview.isPlaying()) {
this.videoview.pause();
pause_flag = 1;
}
else {
pause_flag = 0;
}
toLog("pause_flag = " + pause_flag);

this.video_content_total_linear.setWeightSum((float) 1);
this.top_linear.setVisibility(View.GONE);
this.bottom_scroll.setVisibility(View.GONE);
this.top_txt.setVisibility(View.GONE);
this.bottom_linear.setVisibility(View.GONE);

LayoutParams params = video_videoview_linear.getLayoutParams();
Log.i("@#@===MY===@#@", "params.height = " + params.height);
Log.i("@#@===MY===@#@", "params.width =" + params.width);
params.height = android.widget.LinearLayout.LayoutParams.FILL_PARENT;
params.width = android.widget.LinearLayout.LayoutParams.FILL_PARENT;
this.video_videoview_linear.setLayoutParams(params);

toLog("Landscape layout GONE.");
toLog("videoview.getMeasuredHeight() = " + videoview.getMeasuredHeight());
toLog("videoview.getMeasuredWidth() = " + videoview.getMeasuredWidth());
toLog("this.width" + this.width);
toLog("this.height" + this.height);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
videoview.getHolder().setFixedSize(800, 480);
videoview.setMeasureDimensionDIS(800, 480);

if (pause_flag == 1) {
videoview.postInvalidate();
this.videoview.start();

}
// synchronized (videoview) {
// toLog("notifyAll");
// videoview.notifyAll();
// }
break;

case Configuration.ORIENTATION_PORTRAIT:
toLog("ORIENTATION_PORTRAIT");
if (videoview.isPlaying()) {
this.videoview.pause();
pause_flag = 1;
}
else {
pause_flag = 0;
}
toLog("pause_flag = " + pause_flag);

this.video_content_total_linear.setWeightSum(2);
LayoutParams params1 = video_videoview_linear.getLayoutParams();
params1.height = 0;
params1.width = android.widget.LinearLayout.LayoutParams.FILL_PARENT;
this.video_videoview_linear.setLayoutParams(params1);

this.top_linear.setVisibility(View.VISIBLE);
this.bottom_scroll.setVisibility(View.VISIBLE);
this.bottom_linear.setVisibility(View.VISIBLE);
this.top_txt.setVisibility(View.VISIBLE);

toLog("Portrait layout VISIBLE.");
toLog("videoview.getMeasuredHeight() = " + videoview.getMeasuredHeight());
toLog("videoview.getMeasuredWidth() = " + videoview.getMeasuredWidth());
toLog("this.width" + this.width);
toLog("this.height" + this.height);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
videoview.getHolder().setFixedSize(480, 330);
videoview.setMeasureDimensionMEASUR(480, 330);

if (pause_flag == 1) {

videoview.postInvalidate();
this.videoview.start();

}

break;

case Configuration.ORIENTATION_UNDEFINED:
toLog("ORIENTATION_UNDEFINED");
break;

default:
break;
}
}

flag 를 새로 집어넣는 것이 매우 중요!

2013년 4월 24일 수요일

Spring + Mybatis + Restful 환경구축 (1)

프로젝트가 쓰러졌다.

하지만 나는 스프링을 이용한 서버를 이미 구축했다.

차마 버릴수 없었다.

그래서 고생끝에 성공한 서버구축에 대한 포스팅을 남기려 한다.

아마 스프링 책을 참고 하더라도 그래서 환경구축은 어떻게해야하는데??

라는 의문을 나처럼 많은 스프링 뉴비들이 공통적으로 가질거라 생각한다.

그래서 Spring 과 Mybatis , Restful 기반의 서버를 만들기위한 환경구축에 대한 포스팅을

시작해보자.

1. Eclipse IDE 설치

이클립스는 Juno 버젼으로 시작하겠으며 Windows7 ultimate(x64) 가 기본인 환경이다.

먼저 이클립스를 설치한다.

보통 스프링 전용 IDE인 Spring Tool Suite(STS) 를 스프링 홈페이지에서 받아서 사용하지

만 나는 이클립스 환경에서 구축했다. 기존의 플러그인들을 다시 설치하고 워크스페이스를

공유하는 등의 중복작업을 하기 싫었고 IDE를 따로 사용하기 귀찮았기 때문이다.

http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/juno/SR2/eclipse-jee-juno-SR2-win32-x86_64.zip&mirror_id=466

2. JDK 설치

JDK 는 최신버젼인 1.7을 기반으로 시작하도록 하겠다.

오라클 홈페이지에서 간단히 받아 설치하도록 한다.

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

3. JAVA 환경변수 설정

JAVA를 설치했다면 기본적으로 환경변수를 설정한다.

내컴퓨터 -> 속성 ->고급 시스템 설정 -> 환경변수



이후 새로만들기를 통해 JAVA_HOME 을 지정한다.
이때 경로는 jdk 폴더의 경로까지 지정한다.



4. STS(Spring Tool Suite) Plug-in 설치

 자 이제 이클립스를 켜서 스프링을 사용하기위한 STS 플러그인을 설치하자.

만약 이크립스가 안켜진다면 이클립스 실행파일이 있는 경로의 eclipse.ini를 수정하여 오류를 해결하도록 하자. 이는 여러분에게 맡기겠다.

Menu -> Help -> Eclipse Market 을 켜보자.


켜면 


이러한 창이 뜨고 Find 에 'spring juno' 를 치면 위 그림과같은 검색결과가 나타난다.

Juno를 쓰지않고 인디고나 헬리오스를 사용한다면 해당 버젼에 맞는 검색을 하면 나온다.

자 이제 Install 을 눌러보자..


그러면 위 화면과 같은 창이뜬다. 

뭔가많다. 고민할 필요없다. 다설치. Next

이후 동의하고 설치한다.


설치중...

이후 완료되면 이클립스를 재시작 하라고 하니 재시작 하자.

자 재시작후 잘 설치되었는지 확인해 보자
Menu -> Help -> About Eclipse 클릭



자 여기서 Installation Details 클릭



아까 보았던 STS 플러그인 목록이 좍 있다..

이클립스에 설치하는 모든 클러그인은 여기에 나타나니 유용하게 사용바란다.

삭제 및 업데이트가 가능하고 속성을 볼수 있다.

자 이제 STS설치는 끝났다.

그러면 이제 Maven 이라는걸 설치해보자.

Maven 이란 간단히 설명하면 JAVA를 위한 Build 도구이다.

Jar 파일을 만들때 보통 사용되며 우리가 프로젝트를 진행할때 분명 외부라이브 러리를 사용하게 된다. 이러한 외부 라이브러리를 직접 jar 를 받아서 프로젝트에 넣고 Build path에 넣는 그런 번거러움을 줄이기 위해 사용된다. 정확히 이를 위해서 사용되는건 아니지만 더 궁금하다면 메이븐에 대해 찾아보도록 한다. 심지어 책으로도 나와있으니 자바를 개발하는 사람이라면 알아두는 편이 매우매우 도움이 될 것이다.


5. Maven Plug-in 설치

STS 를 설치하는것과 마찬가지로 Eclipse Marketplace 에 Maven 이라 검색한다.




그러면 메이븐에 관한 많은 플러그인이 검색되는데 우리가 필요로 하는것은 위 그림 가운데 

위치한 ' Maven Intergration for Eclipse ' 이다.

Install 눌러 설치한다. 망설일것 없이 다 설치한다. 또 재시작한다. 하라는데 우짜겟노 하자.



자 이제 Just Spring 을 시작하기 위한 단계까진 왔다.

그렇다면 프로젝트 생성하고 실행하면 뭐라도 기본적으로 되야겠지??

프로젝트를 하나 만들어서 테스트 해보자.



자 만들자. 어라 나 이미 만들었네..제길.. 지우고 다시해야지




자 Spring -> Spring Template Project 를 Next!


Spring MVC Project 를 선택후 Next!!

이후 아마 다운로드를 한다고 나올텐데 OK 눌러주자. 난생략


프로젝트 명과 가장 상위의 패키지 명을 적고 완료!



자 이구성대로 나왔다면 일단 성공~~

이데로 실행하면 뭐라도 되야겠죠??

자 실행을 해봅시다.

근데 스프링은 서버자나?? 그럼 서버는???

그래서 서버를 만들어 봅시다.



프로젝트를 우클릭후 Run As -> Run on Server 클릭!


자 그러면 이렇게 많은 서버중 하나를 선택해야해요

근데 난 무난무난열매 아파치 톰캣 6.0 을 이용해요.

7.0 은 뭔가 쌔거자나 분명 버그가 있을거야.. 실제로 그래요..그래서 6.0써요.. 



자 톰캣 6.0 선택하고 서버명과 호스트이름따위 알아서 하셈요 난 그대로 해요

Next!


오..근데 내가 톰캣을 설치한적이 없어요!

Download and Install... 클릭!!

원하는 경로 하나 잡아주시고.. 왠만하면 'Tomcat 6.0' 이라고 새폴더 하나 만드셔서 관리하세요~~ 그리고 만약 경로 설정했는데

The Tomcat installation directory is not valid. It is missing expected file or folder lib/jasper-el.jar.

부왕~~ 이런 에러가 뜬다!! 그럼 걍 캔슬 누르고 다시 이 화면까지 옵니다.

그러고 다시 Browse 로 경로잡으면

왠걸?? 됨..ㄷㄷ;; 자체 버그라고 하니... 어쩔수없지..이클립스자나..익숙해져야해요..



Finish 해주세요~~

그러면 실행이 됩니다!! 왜냐!! Run AS 로 했으니까!!!

근데!!!

될리가 없습니다..

자..  절 따라해보아

이유인즉 간단히 말하면

maven 에서 제공하는 jsp 관련 라이브러리와 spring에서 제공하는 라이브러리의 충돌로

인해 발생하는 거랍니다. 그러니 우린 메이븐을 쓰니까 메이븐을 기본으로 잡아야겠죵??

출동


자 이런 에러페이지가 나타나고 Console쪽을 보면 구동과 동시에 에러가 엄청나게 발생했고 그 이유인즉 Servelt 에서Jar 를 읽을수 없다니 어쩌니... 자 해결합시다

프로젝트 상에 있는 가장 아래에 있는 파일인 pom.xml 을 엽니다. 물론 서버 종료하고.. 빨간버튼 아시죠? 이거 모르면 이클립스..다시배워요..


여기서 아래쪽에 ' Dependencies ' 탭으로 들어가면 상위 그림같은 화면이 나타납니다.

여기서 servlet-api : 2.5 , jsp-api : 2.1 을 Remove합니다.

그리고 ADD를 누릅니다.




그리고 검색란에 ' org.apache.maven.plugins ' 라고 검색해서

maven-war-plugin 을 선택하고 OK 합니다!

그리고 Ctrl + S 로 저장하시고


자 그리고 Server 를 재시작 합니다!

이미 프로젝트를 Run on Server 한번 했기 때문에

Tomcat Server 에 나의 프로젝트가 올라가 있는 상태입니다.

서버를 재시작하면 나의 프로젝트가 다시 서버에 올라가게 되죵

START!!


처음에 실행 했을때는 저 주소가 500에러가 떳는데

이제 실행하니 콘솔상에 에러도 없고 home.jsp 가 프로젝트 기본 jsp파일인데 내용까지 나타납니다.

주소는

http://localhost:8080/test/ 입니다. home.jsp 까지 안붙여도되요

와..이제 겨우 프로젝트 만들고 걍 실행 Just 실행한번 해봣어요..

Mybatis 와 Restful이 남았네요..

힘들다..

하루 쉬고 올릴게요...

안되는 부분 있으신 분은 댓글 남겨주세요!! 폰으로 댓글 알림 오니까 실시간으로 알려 드리도록 하겠습니다.

다음 포스팅에서는 Mybatis 의 설정에 대해 포스팅 하겠습니다.


-ps

제 포스팅은 Spring + Mybatis + Restful 을 구축하는 방법을 포스팅 하는거지

그 내용이나 개념은 하지 않습니다. 이는 책이나 각 프레임워크 홈페이지를 참고하셔서

각자 공부를 하시기를 바래요 물론 예제는 있을겁니다. 저도 공부중이라..ㅠㅠ