플렉스에서 레이아웃의 할당된 크기 자체를 숨겨야 하는 경우가 있다.

안드로이드에서는 레이아웃의 visible 속성에 visible/invisible/gone 속성을 줌으로 인해서 [보이고/숨기고/할당크기까지 숨기고] 가 가능하지만, 플렉스에서는 해당 기능이 없는지 많이 고민했다.


검색해보니 includeinlayout 이라는 것이 있었고 실제로 사용해보았다.

일단 개념정리부터.


화면 컴포넌트 중에 일부를 보였다, 안 보였다 하게 제어해야 할 경우가 있다.

이것을 위해서 visible 속성에 true, false를 주면 안 보이긴 하는데 그 자리가 비어 있어서 영 보기가 안 좋다.

이럴 경우에는 includeInLayout 속성에 true, false를 주면 그 컴포넌트가 원래 코드에 포함되지 않은 것처럼 빈자리 없이 보인다.

단, 절대좌표를 가진 컴포넌트는 당연히 visible을 사용할 때와 똑같이 보일 것이고, Grid, HBox, VBox 등의 Layout Componet에 올라가 있을 경우에만 제대로 동작을 한다.

Flex 하다 보면 다들 느끼겠지만 화면크기가 모든 사용자에게 똑같으면 상관없지만 그렇지 않은 관계로 대부분의 화면 컴포넌트들을 HBox, VBox에 올려 놓고 왼쪽정렬이나 오른쪽정렬을 하는 것이 가장 편하다.


해당레이아웃.includeinlayout = false 를 주면 할당 크기까지 숨기겠다는 뜻이며, true 값은 할당 크기를 숨기지 않겠다는 뜻이 된다.

아쉽게도 안드로이드의 gone 처럼 사용하기 위해서는 해당 레이아웃.visible=false; 까지 해주어야 해당레이아웃 값 안보이고/해당레이아웃 할당크기 숨기고 가 된다.



블로그 이미지

김생선

세상의 모든것을 어장관리

Flex를 설치할 때, flash builder 4.6 을 이용하여 설치를 한다.

필자가 플래쉬 빌더를 설치한 후, 플러그인 형식으로 플래쉬 빌더의 utilities의 Adobe Flash Builder 4.6 Plug-in Utility 를 사용하여 설치를 완료했고, 이클립스에서 Flash 를 활성화 하려는데 에러 16(Error 16)의 에러메시지를 내뱉더라.


삭제 후 재설치를 하여도 되지 않는 현상, 검색을 해보니 아래와 같은 글이 있었다.


http://forums.adobe.com/thread/604540




그냥 뭐 간단히 말해주자면 해당 경로의 cache.db 파일 권한을 재설정해주라는 말이 전부다.


그럼 이쯤에서 윈도우 7 기준으로 해당 경로가 어떻게 되는지 알아보자.


C:\Program Files\Common Files\Adobe\Adobe PCD\cache

 

for 32-bit Windows

 

 

and

 

C:\Program Files (x86)\Common Files\Adobe\Adobe PCD\cache

for 64-bit Windows.


라고 ChrisPaduan 이라는 사람이 친절히 설명해놓았다.


해당 디렉토리의 cache.db를 읽기전용 해제해주면 잘 된다. 여러분, 즐 플렉 하시길 ^_^

블로그 이미지

김생선

세상의 모든것을 어장관리

Starting Tomcat v5.5 Server at localhost' has encounterd a problem.


Server ports (8080, 8009) required by Tomcat v5.5 Server at localhost are already in use. The server may already be running in another process, or a system process may be using the port. To start this server you will need to stop the other process or change the port number(s).


뭐 대충보자면 톰캣 실행하는 데 있어 포트충돌난단 것이다.

해결방안은 작업관리자의 tomcat.exe 프로세스를 죽이면 된다고 하는데, 이건 톰캣을 따로 구축한 사람들만 뜨는지 난 해당사항이 없더라.


나처럼 이클립스 내부에서 톰캣연동하는 사람은, 작업관리자에서 javaw.exe 프로세스를 강종해주면 된다.

블로그 이미지

김생선

세상의 모든것을 어장관리

JSTL 

Jsp표준 태그 라이브러리(Jsp Standard Tag Library)의 약어

 

jstl을 가지고 할수 있는일

간단한 프로그램 로직의 구사(자바의 변수선언,if문for문 등에 해당하는 로직)

다른JSP페이지 호출(<c:redirect>,<c:import>)

날짜,시간,숫자의포맷

JSP페이지 하나를 가지고 여러 가지 언어의 웹 페이지 생성

데이터베이스로의 입력,수정,삭제,조회

XML문서의 처리

문자열을 처리하는 함수 호출

 

위에 있는 여러 가지 기능들 중 제일 마지막에 있는 '문자열을 처리하는 함수 호출'을 제외한 나머지 기능들은 모두 커스텀 액션 형태로 제공된다.

(*커스텀액션 : xml문법을 따르면서 특정한 동작을 수행하는 태그)
 

jstl을 살펴보면 커스텀액션이나 함수의 이름앞에 c,fmt,fn등이 접두어가 붙어 있는것을 볼수 있다 

표준 액션의 태그 이름 앞에는 모두 jsp라 는 한 종류의 접두어가 사용되는데 Jstl의 커스텀 액션과 함수에는 왜 이렇게 다양한 접두어가 붙는걸까?

그 이유는 Jstl이 다시 5개의 작은 라이브러리로 나뉘어지고 커스텀 액션과 EL 함수는 각각 다른 라이브러리에 속하기 때문이다. 

 라이브러리

기능 

URL식별자 

접두어 

 코어

일반프로그래밍 언어에서 제공하는 것과 유사한 변수 선언,실행흐름의 제어기능을 제공하고, 다른 JSP페이지로 제어를 이동하는 기능도 제공 

http://java.sun.com/jsp/jstl/core

 c

 포매팅

숫자,날짜,시간을 포매팅하는 기능과 국제화,다국어 지원 기능을 제공 

http://java.sun.com/jsp/jstl/fmt 

fmt 

 데이터베이스

데이터베이스의 데이터를 입력,수정,삭제,조회하는 기능을 제공 

http://java.sun.com/jsp/jstl/sql 

sql 

 XML처리

XML문서를 처리할때 필요한 기능을 제공

http://java.sun.com/jsp/jstl/xml 

xml 

 함수

문자열을 처리하는 함수를 제공 

http://java/sun/com/jsp/jstl/functions

fn 

 

위 표를 보면 c.fmt,fn이라는 접두어가 있다. 그리고 이것은 각각 코어라이브러리,포매팅 라이브러리,함수라이브러리의 접두어라 표시되어 있다. 하지만 라이브러리를 구분하는 것은 사실상 접두어가 아니라 위표에 나와있는 URI실별자이다. 접두어는 단지 코딩을 간편하게 하기 위해 사용되는 수단일 뿐이다. 그러므로 Jsp페이지에서 이 접두어를 사용하기 위해서는 먼저 라이브러리의 UTI식별자와 접두어를 연결해야한다. 그런 일은 taglib 지시자를 통해 할수 있다.

 

taglib지시자는 다른 지시자와 마찬가지로 <%@ ~ %>로 종료된다. 이 지시자에는 uri와 prefix라는 두 개의 애트리뷰트를 써야하고 이 두 애트리뷰트에 각각 URI 식별자와 접두어를 값으로 주어야 한다.

 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

                               ↑                                        

                           접두어                         라이브러리를 식별하는 URI

 

taglib는 jsp페이지의 맨 위쪽에 기술한다. 하지만 어디에 써도 상관은 없다.



출처 : http://blog.naver.com/kalmia888/177110388

[출처] JSTL|작성자 시아

블로그 이미지

김생선

세상의 모든것을 어장관리

에러:Choose unique values for the 'webAppRootKey' context-param in your web.xml files


해당 에러는 패키지 파일 이름 변경 후 web.xml 등에서 context-param의 param-value 값을 바꿔주지 않아서 생기는 문제.


패키지 파일 이름과 param-value를 일치시켜주면 해결된다.

블로그 이미지

김생선

세상의 모든것을 어장관리

어플을 개발하다보면 아래와 같이 공지사항 형식의 dialog를 많이 볼 수 있다.





그러니까, 처음 실행시 해당경고사항에 대해 팝업을 띄워주고 다시보지 않음과 같은 버튼을 만들어서 해당 버튼을 클릭하면 다음부터는 실행하지 않는 것인데, 의외로 구현하기가 거시기한 항목중 하나였다.


간단히 말 해서, dialog와 SharedPreference를 함께 쓰는 것이었다.


sharePreference는 어플리케이션의 "설정"창에서 흔히 볼 수 있는 부분인데, 이에 대한 선행이해가 필요할 것이나, 무작정 따라해서 구현할 수도 있기 때문에 일단 적어본다.


개략적인 구성은 아래와 같다.


Preference 항목을 두 개를 만든다고 가정하자, 각각 A와 B 이다.

어플이 실행될 때 마다 A Preference에 어플 버전을 저장하고 dialog를 호출할 때 A Preference와 B(초기값 null) Preference를 비교하여, A와 B가 다르면 dialog를 보여준다.

[다시보지 않기] 버튼을 클릭할 경우, 어플리케이션 버전을 B Preference에 저장한다.


결론적으로 어플이 실행될 때 [다시보지 않기]를 클릭한 경우, 저장된 A와 B가 서로 같기 때문에 dialog를 출력하지 않는다.


만약 어플리케이션 버전업을 할 경우, A Preference에는 새로운 버전이 저장되며, B Preference에는 기존의 버전이 저장되기 때문에 A와 B가 다르고, 다르기 때문에 dialog를 다시 보여준다.


약간 이해가 어려울 지 모르겠지만 뭐 상관없다.


그럼 개략적인 소스를 살펴보자.


/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);


String version;

try {

PackageInfo i = getPackageManager().getPackageInfo(getPackageName(), 0);

version = i.versionName;

} catch (NameNotFoundException e) {

version = "";

}


SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE); // UI 상태를 저장합니다.

SharedPreferences.Editor editor = pref.edit(); // Editor를 불러옵니다

editor.putString("check_version", version); // 저장할 값들을 입력합니다.

editor.commit(); // 저장합니다.


String check_version = pref.getString("check_version", "");// 

String check_status = pref.getString("check_status", "");

if (!check_version.equals(check_status)) {

AlertDialog alert = new AlertDialog.Builder(this).setIcon(R.drawable.icon)

.setTitle(R.string.app_notice)

.setMessage(R.string.app_notice_update)

.setPositiveButton(R.string.app_notice_yes, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

}

})


    .setNegativeButton(R.string.app_notice_no, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

String version;

try {

PackageInfo i = getPackageManager().getPackageInfo(getPackageName(), 0);

version = i.versionName;

} catch (NameNotFoundException e) {

version = "";

}

SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE); 

   // UI 상태를 저장합니다.

SharedPreferences.Editor editor = pref.edit(); // Editor를 불러옵니다

editor.putString("check_status", version);

editor.commit(); // 저장합니다.

dialog.cancel();

}

}).show();

}

}



그럼 이제 소스를 차분히 뜯어보자.


String version;

try {

PackageInfo i = getPackageManager().getPackageInfo(getPackageName(), 0);

version = i.versionName;

} catch (NameNotFoundException e) {

version = "";

}


이 부분은 어플리케이션의 버전을 저장하는 부분이다. version 이라는 항목에 String 값으로 저장된다.



SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE); // UI 상태를 저장합니다.

SharedPreferences.Editor editor = pref.edit(); // Editor를 불러옵니다

editor.putString("check_version", version); // 저장할 값들을 입력합니다.

editor.commit(); // 저장합니다.


주석이 잘 달려있기 때문에 크게 설명할 부분이 없다.

check_version 항목에 현재 어플리케이션 버전을 저장한다.



String check_version = pref.getString("check_version", "");// 

String check_status = pref.getString("check_status", "");


여기서부터가 이제 중요하다.

저장된 check_versioncheck_status를 가져온다.

check_version은 윗부분에서 현재 어플리케이션을 저장했으며, check_status에서는 아무것도 저장되지 않았기 때문에 null값이 들어간다.



if (!check_version.equals(check_status)) {


check_version과 check_status를 비교한다. string 형이기 때문에 .equals로 비교를 하며, 서로 값이 다를 때를 가정하기 때문에 check_version 앞에 !를 붙인다.



AlertDialog alert = new AlertDialog.Builder(this).setIcon(R.drawable.icon)

.setTitle(R.string.app_notice)

.setMessage(R.string.app_notice_update)

.setPositiveButton(R.string.app_notice_yes, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

}

})


해당 부분은 dialog 부분이기 때문에 설명 없이 넘어간다.

해당 부분은 ok 버튼을 클릭했을 때를 나타낸다.



.setNegativeButton(R.string.app_notice_no, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {


[다시보지 않음] 항목을 클릭했을 때를 정의한다.



String version;

try {

PackageInfo i = getPackageManager().getPackageInfo(getPackageName(), 0);

version = i.versionName;

} catch (NameNotFoundException e) {

version = "";

}


현재 어플리케이션 버전값을 읽어오기 위한 version 체크 부분이다.



SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE); 

   // UI 상태를 저장합니다.

SharedPreferences.Editor editor = pref.edit(); // Editor를 불러옵니다

editor.putString("check_status", version);

editor.commit(); // 저장합니다.

dialog.cancel();


SharedPreference의 pref에 아래의 내용을 저장한다.

check_status에 위에서 호출한 version 값을 저장하고 dialog를 cancle 한다.




이로써 다시보지 않음 dialog를 정의하는 방법에 대해 알아보았다.

negative 버튼을 클릭하였을 때 현재 버전을 check_status에 저장하고, 어플리케이션을 다시 실행하였을 때, check_version과 check_status를 비교하여 같으면 보이지 않고, 다르면 보이는 코드는 이처럼 구현된다.


물론 중복되는 소스도 있고 확실히 좀 더 줄일 수 있는 부분이 몇군데 보이지만 현재로써는 내가 할 수 있는 부분은 이와 같다.

'어장 프로그래밍 > 어장 안드로이드' 카테고리의 다른 글

공지사항 dialog  (2) 2012.09.26
[Android] addview를 사용할 때의 위치설정  (0) 2012.08.08
Thread로 ProgressDialog 사용하기  (0) 2012.08.03
listview와 intent  (0) 2011.03.16
listview  (0) 2011.03.12
블로그 이미지

김생선

세상의 모든것을 어장관리

테이블 스페이스란, 말 그대로 DB의 테이블 공간을 뜻한다.

DB 유저를 생성하고 끝나는 것이 아니라, 해당 유저가 사용할 테이블 공간을 만들어야 시작이라는 뜻이다.


해당 툴은 SQL PLUS를 사용하였다.


1. Tablespace 생성

SQL> create tablespace [테이블 스페이스 이름] datafile '[저장될 경로\파일이름.ora]' size [용량]m;


우리 회사의 경우, 2기가를 기본으로 사용하며 테이블 스페이스의 자동용량증가라거나 그러한 옵션을 절대 사용하지 않기 때문에 여기까지.


또한, 테이블 스페이스를 추가하는 방법은 아래와 같다.


2. Tablespace 추가

SQL> alter tablespace [테이블 스페이스 이름] add datafile '[저장될 경로\파일이름.ora]' size [용량]m;


이러한 방법으로 가능하다.


3. Tablespace 삭제

삭제방법은 약간 까다로운데, 나같은 경우엔 잘못된 이름지정으로 삭제를 하였다. 다른 경우에는 뭐 어찌될 지 모르겠다.


SQL> drop tablespace [테이블 스페이스 이름]

그런데 때때로 데이터가 들어있는 이유나 그 외 이유로 테이블스페이스가 삭제되지 않는 경우도 있다.

그럴 땐 아래와같이 입력해보자.


SQL> drop tablespace [테이블 스페이스 이름] including contents and datafiles;

이 명령어는 걍 닥치고 다 삭제한다.





참고로, 내가 약간 실력이 후달려서 SQL PLUS에서 스크립트 불러오는 단축키를 몰라서 쓰는 방법인데, cmd에서도 가능하다.

cmd를 호출하고 아래와 같이 입력한다.


c:\>sqlplus


그리고 사용자명과 아이디를 입력하면 cmd에서 SQL PLUS가 이용이 가능, 방향키로 스크립트를 불러올 수 있으니 반복된 타이핑을 하지 않아도 편리하다.

블로그 이미지

김생선

세상의 모든것을 어장관리

오라클 system 비밀번호를 분실했을 때, 정말 식은땀 날 뻔 했다.

일단 오라클이 설치된 서버의 admin 계정으로 들어가서, cmd 를 띄워두고 아래와 같이 입력한다


C:\>sqlplus "/as sysdba"

SQL> show user

USER is "SYS"


이런식으로 보일 것이다.

그럼 여기에서 계정 암호를 변경해주자.


SQL> alter user system identified by 암호;




한가지 더, system 계정이 lock 걸렸을 때의 대처방법

cmd에서 마찬가지로 아래의 명령어를 입력하자.



SQL> alter user system(유저명이 될수도 있다) account unlock;


그럼 끝

블로그 이미지

김생선

세상의 모든것을 어장관리

어플리케이션을 개발하면서 addview를 사용하게 되었다.

addview란, 해당 activity가 호출하는 xml 레이아웃에 소스코드로 직접 view를 만들어서 add를 한다고 보면 된다.


간단히 소스를 보자.


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.sign);
		
		myView = new MyView(this);
		LayoutParams param;
		param = new LayoutParams(width, rowheight * 10);
		param.gravity = Gravity.BOTTOM;

		layout = (LinearLayout) findViewById(R.id.layout);
		layout.addView(myView, 1, param);

		findViewById(R.id.btnConfirm).setOnClickListener(this); // 확인
		findViewById(R.id.btnReSign).setOnClickListener(this); // 재서명
		
		GetScreenSize();
		ActivityInitialize();

	}

위와 같이 setContentView에서 sign 레이아웃을 호출하였고, 하단부에서 addview를 통하여 layout 하나를 더 호출한다.

그 결과, 아래와 같다.



밑의 버튼이 달린 부분이 xml로 작성된 레이아웃이고, 좀 더 진한 회색이 addview로 작성된 레이아웃이다.

그럼, 이 부분의 위치를 바꿀 수는 없을까?

버튼을 상단으로 위치하게 할 순 없을까?


방법은 별거없다.


layout.addView(myView, 1, param);


의 1을 0으로 주면 아래의 그림과 같이 변한다.


뭐 addview에 대해서는 좀 더 배워야 하니까, 여기까지 하자.

'어장 프로그래밍 > 어장 안드로이드' 카테고리의 다른 글

공지사항 dialog  (2) 2012.09.26
[Android] addview를 사용할 때의 위치설정  (0) 2012.08.08
Thread로 ProgressDialog 사용하기  (0) 2012.08.03
listview와 intent  (0) 2011.03.16
listview  (0) 2011.03.12
블로그 이미지

김생선

세상의 모든것을 어장관리



안드로이드 어플리케이션을 개발하면서 ProgressDialog를 쓰게 된다.

대부분 로딩화면에서 이 다이얼로그를 사용하는데, 매우 기초적인 다이얼로그의 경우, 작업이 끝나도 dismiss를 통한 수동 종료를 해주어야 하는 식으로 작업한다.


이럴 경우, 간단한 것에는 큰 문제가 없지만 로딩시 몇개의 개체가 불려왔는지에 대한 각종 부분을 보여주기 위해서는 thread를 통한 제어가 필요하다는 것이다.


뭐 여튼, 간단명료하게 설명을 해 보겠다.

ProgressDialog(); // ProgressDialog 호출

이 부분은 ProgressDialog를 호출하는 부분이다.

onCreate에 선언하여 로딩시 쓸 수도 있고, OnClickListener에 선언하여 클릭시 로딩 등에서도 사용이 가능하다.


나의 경우에는 아래와 같이 선언하였다.

	@Override
	public void onClick(View v) {
		String attendance;
		switch (v.getId()) {
		case R.id.btnReSign:
			ProgressDialog(); // 진행바 호출
			myView.reset();
			break;

		}
		finish();
	}



그럼 ProgressDialog();의 부분을 보자.

private ProgressDialog SaveUserSign; // Loading Dialog
	void ProgressDialog() {
		/* ProgressDialog */
		SaveUserSign = ProgressDialog.show(this, "김생선 어플", "저장중입니다.", true, false);

		Thread thread = new Thread(new Runnable() {
			public void run() {
				// 처리할 부분
				handler.sendEmptyMessage(0);
			}
		});
		thread.start();
	}

ProgressDialog이 SaveUserSign이란 이름으로 호출이 되고, SaveUserSign은 ProgressDialog를 .show에 주어진 메시지로 출력이 된다. 

그리고 Thread를 통하여 주석에 위치한 처리할 부분을 처리하고, 이 작업이 끝나면 handler를 호출한다. 

나의 경우, 주석의 위치에 사람들의 서명부분을 저장하고 서버로 올리는 작업을 추가했다. 



마지막으로 종료를 위한 handler부분을 살펴보자.

	private Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			SaveUserSign.dismiss(); // 다이얼로그 삭제
			// View갱신
		}
	};

handler부분은 SaveUserSign의 다이얼로그를 dismiss 해준다는 내용이 가장 크다.

그 외에 큰 어려움은 없으니 조금만 살펴보고 연구하면 다음엔 더 쉽게 구현할 수 있을 것 같다.

AsyncTask 방법을 사용하는 것도 있다는데... 흐미...

'어장 프로그래밍 > 어장 안드로이드' 카테고리의 다른 글

공지사항 dialog  (2) 2012.09.26
[Android] addview를 사용할 때의 위치설정  (0) 2012.08.08
Thread로 ProgressDialog 사용하기  (0) 2012.08.03
listview와 intent  (0) 2011.03.16
listview  (0) 2011.03.12
블로그 이미지

김생선

세상의 모든것을 어장관리

티스토리 툴바