Heap Sort Algorithm Source

package heapSort;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

public class Star {

	public static void main(String args[]) {

		ArrayList<String> data = new ArrayList<String>();
		String file_open_path = "D:/heapData.txt";

		fileRead(file_open_path, data);
		
		System.out.println(data);
		data = heapSort(data);
		System.out.println(data);

	}

	public static ArrayList<String> heapDown(ArrayList<String> data) {
		for (int n = (data.size() / 2) - 1; n >= 0; n--) {
			int leftChild = (n * 2) + 1;
			int rightChild = (n * 2) + 2;

			if (data.get(leftChild).compareTo(data.get(n)) < 0) {
				swapData(data, n, leftChild);
			}

			if (rightChild < data.size()) {
				if (data.get(rightChild).compareTo(data.get(n)) < 0) {
					swapData(data, n, rightChild);
				}
			}
		}
		return data;
	}

	public static ArrayList<String> heapSort(ArrayList<String> data) {
		ArrayList<String> sortedData = new ArrayList<String>();

		int len = data.size();
		data = heapDown(data);

		for (int i = 0; i < len; i++) {
			sortedData.add(0, data.remove(0));
			data = heapDown(data);
		}
		return sortedData;
	}

	private static void fileRead(String path, List<String> data) {
		BufferedReader reader = null;

		if (path != null) {
			try {
				reader = new BufferedReader(new FileReader(path));

				String line = null;
				while ((line = reader.readLine()) != null) {
					if (line.charAt(0) == 65279) {
						data.add(new String(new StringBuffer(line)
								.deleteCharAt(0)));
					} else {
						data.add(line);
					}
				}
				reader.close();
			} catch (Exception e) {
				System.err.println(e);
			} finally {
				try {
					if (reader != null) {
						reader.close();
					}
				} catch (Exception ex) {
				}
			}
		}
	}

	private static void swapData(ArrayList<String> data, int a, int b) {
		String temp;
		temp = data.get(a);
		data.set(a, data.get(b));
		data.set(b, temp);
	}
}


ArrayList 합집합(union)

	public <T> List<T> union(List<T> list1, List<T> list2) {
		Set<T> set = new HashSet<T>();

		set.addAll(list1);
		set.addAll(list2);

		return new ArrayList<T>(set);
	}

ArrayList 교집합(intersection)

	public <T> List<T> intersection(List<T> list1, List<T> list2) {
		List<T> list = new ArrayList<T>();

		for (T t : list1) {
			if (list2.contains(t)) {
				list.add(t);
			}
		}

		return list;
	}

사용예시

public class ListUtil {

	public static void main(String... args) throws Exception {

		List<String> list1 = new ArrayList<String>(Arrays.asList("A", "B", "C"));
		List<String> list2 = new ArrayList<String>(Arrays.asList("B", "C", "D",
				"E", "F"));

		System.out.println("교집합" + new ListUtil().intersection(list1, list2));
		System.out.println("합집합" + new ListUtil().union(list1, list2));
	}

	public <T> List<T> union(List<T> list1, List<T> list2) {
		Set<T> set = new HashSet<T>();

		set.addAll(list1);
		set.addAll(list2);

		return new ArrayList<T>(set);
	}

	public <T> List<T> intersection(List<T> list1, List<T> list2) {
		List<T> list = new ArrayList<T>();

		for (T t : list1) {
			if (list2.contains(t)) {
				list.add(t);
			}
		}

		return list;
	}
}



'대학 생활 > JAVA' 카테고리의 다른 글

[JAVA] JDK 개발 도구 명령어  (0) 2014.07.16
[JAVA] HeapSort Algorithm  (0) 2014.07.09
[JAVA] java.io.RandomAccessFile() (작성중)  (0) 2014.05.27
[JAVA] 전기 요금 계산  (0) 2014.05.14

ubuntu ssh server install

install

sudo apt-get install openssh-server

restart

sudo /etc/init.d/ssh restart
or
service ssh restart

service check

service ssh status
ps ax | grep ssh

service port check

sudo netstat -ntlp | grep ssh
netstat -anp | grep LISTEN | grep sshd

'System > Linux, unix' 카테고리의 다른 글

[UNIX] session 죽이기(kill)  (0) 2014.11.16
[UNIX]메시지 보내기 - talk, write, wall  (0) 2014.10.22
[ubuntu] JAVA JDK 설치하기  (0) 2014.04.06
[ubuntu] 한글 설정하기  (0) 2014.04.04

액티비티의 생명주기

사진 출처(Android API)


  • 액티비티는 시작, 실행, 활성, 비활성화, 정지, 종료상태를 순환한다.
  • 시스템은 태스크[각주:1]의 실행중인 액티비티들을 스택으로 관리한다.


스택상의 액티비티의 세 가지 상태

  • 실행(active, running)
스택의 제일 위에 있는 상태로, 사용자가 화면으로 볼 수 있고,
입력 포커스를 가지며 사용자에게 입력을 받을 수 있는 상태이다.
  • 일시 정지(pause)
포커스는 잃었지만 사용자에게 일부 보이는 상태이다.
다 가리지 않았더나 반투명한 상태를 말한다.
  • 정지(stopped)
다른 액티비티에 의해 완전히 가려진 상태로, 사용자가 화면에서 볼 수 없다.
시스템은 메모리가 부족하면 정지 상태의 액티비티를 언제든지 강제 종료 가능하다.


참고자료, 사이트


  1. 태스크(Task)는 사용자가 실질적으로 "하나의 어플리케이션처럼" 느끼는 액티비티들의 집합. [본문으로]



MySQL DB export, import

Export(내보내기) mysqldump -h 호스트명 -u 사용자명 -p DB명 > 경로\저장할파일명.sql Import(가져오기) mysql -h 호스트명 -u 사용자명 -p DB명 < 경로\가져올파일명.sql

* C 드라이브에서 오류 발생할 수 있으니, 다른 드라이브에 저장 후 실행할 것.

MySQL data export, import

→data export, import 는 테스트해보지 않았으므로 확실하지 않음.

Export(내보내기) select * into outfile "/temp/file.dump" fields terminated by '\t' optionally enclosed by '"' lines terminated by '\n' from [dababase.tablename]; Import(가져오기) LOAD DATA INFILE 'file.dump' INTO TABLE [dababase.tablename] FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';


참고사이트

'Database > MySQL' 카테고리의 다른 글

[MySQL] MySQL 환경변수 설정하기  (0) 2014.08.04
[MySQL] csv 파일 import 하기  (0) 2014.07.23
[MySQL] ODBC 설치 및 설치 에러: Error 1918  (0) 2014.06.25
[MySQL] MySQL 설치하기  (0) 2014.06.25

 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


GoogleMaps v2 Marker 추가하기

구글맵이 화면에 올라와있다고 가정하에 아래 코드 작성.
LatLng loc = new LatLng(x, y); // 위치 좌표 설정
MarkerOptions marker = new MarkerOptions().position(loc);
mGoogleMap.addMarker(marker); // 마커표시
예제
public class MapTest extends FragmentActivity {

	// 초기화
	GoogleMap mGoogleMap; // 구글맵 객체
	LatLng loc = new LatLng(0, 0); // 위치 좌표 설정
	CameraPosition cp = new CameraPosition.Builder().target((loc)).zoom(16)
			.build();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_map_test);

		// 구글 맵 객체 생성
		mGoogleMap = ((SupportMapFragment) getSupportFragmentManager()
				.findFragmentById(R.id.map)).getMap();

		moveDisplay(35.864144, 129.194698, 19);
		addMarker(35.864144, 129.194698);


	// 마커 추가하기
	void addMarker(double x, double y) {
		LatLng loc = new LatLng(x, y); // 위치 좌표 설정
		MarkerOptions marker = new MarkerOptions().position(loc);
		mGoogleMap.addMarker(marker); // 마커표시
	}

	// 화면 이동하기
	void moveDisplay(double x, double y, int zoom) {
		LatLng loc = new LatLng(x, y); // 위치 좌표 설정
		CameraPosition cp = new CameraPosition.Builder().target((loc))
				.zoom(zoom).build();
		mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cp));
	}
}

GoogleMaps v2 Marker 삭제하기

dddd



i n v i t a t i o n

티스토리 초대장

+ 남은 초대장 수 : 00

안녕하세요!

티스토리에 보금자리를 마련하시려는 여러분께 초대장을 배포해 드리려고 합니다.

나만의, 내 생각을, 내 기억을 담는 소중한 블로그를 만들고 싶다면 티스토리로 시작해보세요!

티스토리 블로그는 초대에 의해서만 가입이 가능합니다. 원하시는 분은 댓글에 운영목적과 E-mail 주소 남겨주시면 초대장을 보내드립니다. 남겨주실 때에는 꼭 비밀댓글로 남겨주세요!

초대장을 보내드리고 바로 개설하시지 않으신 분들은 초대장을 회수할 수도 있으니 바로 개설해주세요!

Yes
이런 분들께 드립니다!
1. 다른 블로그를 사용해보셨던 분
2. 이메일 주소가 정상적인 분
3. 블로그를 시작하려는 이유를 남겨주신 분!
No
이런 분들께 드리지 않아요!
1. 이메일 주소가 의심되는 분!
2. 이메일 주소를 남기지 않으신 분
3. 이유도 없이 달라고 하시는 분!
티스토리 이래서 좋아요!
1. 이미지, 동영상, 오디오, 파일까지! 무한 용량과 강력한 멀티미디어를 올릴 수 있어요!
2. 스킨위자드로 스킨을 내맘대로~ 거기에 기능 확장 플러그인까지!
3. 내가 원하는대로 myID.com으로 블로그 주소를 만들 수 있어요!


이클립스 글자색 바꾸기(Color Theme)

Eclipse Color Themes Download Site Link


▶ 먼저 위 링크를 통해 아래사진과 같은 사이트에서 원하는 Theme를 선택하여 다운받는다. 이때 다운로드는 Eclipse Preferences(EPF)를 받는다.




▶ 이클립스에서 File - Import - Preferences 를 통해 다운받은 Theme 파일을 적용시킨다.






원래 상태(default)로 변경하기

"Windows>Preferences>Java>Editor"에서 Syntax Coloring - "Restore Defaults"하고 "Apply"합니다.

그리고 "General>Editors"에서 Text Editors에 들어가셔서 마찬가지지로 "Restore Defaults"하고 "Apply"하시면 원래상태로 돌아옵니다




1. Eclipse 다운받기

▶ 이클립스 4.4 루나에서 추가된 점 링크이동

2. Dark Theme 적용하기

Window - Preferences - General - Appearance 선택 후 Theme 변경





2.1 변경 후 Color Theme

▶ 변경 후 코드창이 밝아 사용하기 어렵다. 아래 링크를 통해 Color Theme 를 변경한다.

[Eclipse] 이클립스 글자색, 배경색 바꾸기(color themes change)


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64

1. MySQL ODBC 설치하기


2.1. MySQL Connector/ODBC Error 1918


2.2. 해결방안



C:\Windows\System32 안에 msvcr100_clr0400.dll 을 msvcr100.dll 로 바꾸어준다.

(구글에서 찾은 해결방법이므로 기존 파일을 백업하길 바라고, 다른 문제는 책임지지 않습니다.)


+ 추가 문제점

파일명을 변경하고 나면 MySQL Installer 가 실행되지 않았는다. 그래서 복사본이었던 파일을 msvcr_clr0400.dll 로 넣어두었다.


참고사이트

1. MySQL 설치파일 다운받기

먼저 링크를 통해 MySQL 홈페이지에서 설치파일을 받는다.


2. MySQL 설치하기






Connector/ODBC 이 설치가 되지않는다면 추후에 받도록 한다.






root의 비밀번호를 지정해준다.





 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


문제점

  • 구글맵에 여러개의 마커를 추가하려고한다.
  • 이동경로를 표시하기 위해 마커를 사용하고, 마커를 찍는 방법은 다른 스레드를 생성하여 실행한다.


해결방안

구글맵의 문제가 아니었다. 안드로이드에서는 화면 UI를 변경하려면 하나의 액티비티에서만 가능하다.

그렇게 때문에 main이 아닌 다른 스레드에서 마커를 찍어주니 에러가 발생하였다.

그래서 Handler를 만들어주고 다른 Thread에서 호출하였다.


Application Specification

 Date

 2014.06.20

 Name

 wisay (wise saying)

 Version

 1.3.1

 minSdkVersion

 14

 Google Play

 링크


이전 업데이트


 


1. 변경 사항

스크롤바의 디자인 변경, 아이콘 변경, 환경설정창 메뉴 추가(문의하기, 평가하기), 타이틀바 디자인 변경, 타이틀바 코드 수정


2. 보완해야할 점

검색기능, 즐겨찾기기능, 위젯 디자인 설정, 탭뷰 프래그먼트로 변경,

 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.8.0_05

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


안드로이드 메일보내기

Intent it = new Intent(Intent.ACTION_SEND); String[] mailaddr = {"opid911@gmail.com"}; it.setType("plaine/text"); it.putExtra(Intent.EXTRA_EMAIL, mailaddr); // 받는사람 it.putExtra(Intent.EXTRA_SUBJECT, "[wisay]"); // 제목 it.putExtra(Intent.EXTRA_TEXT, "\n\n" + "v" + appVersion); // 첨부내용 startActivity(it);

받는주소에는 문자열배열이 아니면 안되는것 같다.


ListView에 Scrollbar 감추기

listview.xml

<ListView android:id="@+id/listview" ... android:scrollbars="none" >

ListView에 이동하는 스크롤바 적용하기(fast scroll)

listview.xml

<ListView android:id="@+id/listview" ... android:fastScrollEnabled="true" >


Application Specification

 Date

 2014.06.13

 Name

 wisay (wise saying)

 Version

 1.3.0

 minSdkVersion

 14

 비고

 .


v1.3.0 이전 업데이트

  • 1.0.0 - 텍스트 파일에 저장된 명언들을 구분자로 읽어 들여 리스트 출력 , 위젯기능
  • 1.0.1 - 디자인 수정(책상앞에 놓여있던 주황색 펜을 보고 주황색 선택)
  • 1.0.2 - 버튼 디자인 변경, 리스트에 각 명언 클릭시 Toast로 영어 번역 보기 기능
  • 1.0.3 - 버전 호환성 변경(minSdkVersion 변경)
  • 1.0.4 - 테스트용으로 올린 어플에서 사용자에게 필요한 부분 모두 지우고 재등록
  • 1.1.0 - 데이터를 텍스트파일에서 DB화, 리스트에 각 명언 클릭시 영어, 한글 함께보기 기능, 위젯 최대라인수 설정
  • 1.2.0 - 환경설정 추가(기본 언어 설정(영어, 한글)), 랜덤 명언 클릭시 영어, 한글 함께보기 기능 추가
  • 1.2.1 - 랜덤 명언 클릭시 새로고침 안되는것 수정, 사용 국가 추가(미국, 캐나다)
  • 1.3.0 - DB 구조 변경(카테고리 테이블 나눔), 카테고리 기능 추가, 데이터 추가


1. 변경 사항

DB 테이블 나누고 카테고리 기능을 추가하였다. 점점 클래스 구조가 복잡해지는 것 같다.


2. 보완해야할 점

검색기능, 즐겨찾기기능, 위젯 디자인 설정, 탭뷰 프래그먼트로 변경,

앞으로 업데이트할때마다 블로그에 남겨놔야겠다.

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TabHost
        android:id="@+id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1" >
            </FrameLayout>

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </TabHost>
</LinearLayout>

tabhost의 id가 @android:id/tabhost가 아닌 @+id/tabhost 이다.

위 tab은 FrameLayout 속성에 layout_weight="1" 때문에 하단에 위치하게 된다.


MainActivity.java

public class MainActivity extends ActivityGroup {
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		createTab();
	}

	private void createTab() {
		TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
		tabHost.setup(getLocalActivityManager());

		tabHost.addTab(tabHost.newTabSpec("TAB1").setIndicator("TAB1")
				.setContent(new Intent(this, Tab1Activity.class)));
		tabHost.addTab(tabHost.newTabSpec("TAB2").setIndicator("TAB2")
				.setContent(new Intent(this, Tab2Activity.class)));

		}

	}
}


참고 사이트



어플리케이션 버전 가져오기

// 어플 버전 가져오기
PackageInfo pi = null;
try {
	pi = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
	Log.e(TAG, e.getMessage());
}
String appVersion = pi.versionName;
Int appCode = pi.versionCode; 


자바코드(activity)에서 setText()로 값 변경시 태그넣기

TextView t1 = (TextView)findViewById(R.id.t1);
t1.setText(Html.fromHtml("1번째줄" + "<br />" + "2번째줄"));


자바코드(or Activity)에서 string.xml 값 가져오기

String st1 = getString(R.string.s1);
CharSequence st2 = getText(R.string.s2);


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


Google Maps Android API v2 (구글 맵) 사용하기


구글에서 제공하는 사용 방법(링크)


1. 구글맵 라이브러리 다운로드 및 프로젝트 생성하기

2. 새 프로젝트에서 구글맵 라이브러리 프로젝트 가져오기

3. 인증키 발급받기

 3-1. 디버깅용

  3-1-1. cmd창에서 확인하기

  3-1-2. 이클립스에서 확인하기

 3-2. 릴리즈용

4. 구글맵 인증키 발급받기

5. 구글맵 사용하기



1. 구글맵 라이브러리 다운로드 및 프로젝트 생성하기

 1-1. Google Play services SDK 다운로드하기

  Android SDK Manager - Google Play services 를 설치한다.


 1-2. 구글맵 라이브러리를 가져오기.

  1-2-1. Ctrl + N -> Android Project from Existing Code 를 선택한다.


  1-2-2. Root Directory 에 설치한 구글맵 라이브러리 경로를 지정해준다.

SDK경로\extras\google\google_play_services\libproject\google-play-services_lib



2. 구글맵을 사용할 새로운 프로젝트 생성하기.

  2-1. 프로젝트를 생성하고, 프로젝트를 오른쪽 클린한 후 Properties(속성)를 선택한다.

 


  2-2. 하단의 Library창에서 Add를 통해 가져온 프로젝트 추가해준다.





3. 인증키 발급받기

 3-1. 디버깅용 키 지문 확인하기.

  3-1-1. cmd(commend)창에서 확인하기.

1. OS별로 아래 경로로 이동

 OS X, Linux

  ~/.android

 윈도우 xp

  C:/Documents and Settings/사용자 계정/.android

 윈도우 7

  C:/Users/사용자 계정/.android


2. 명령어 실행

 keytool -v -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android

 혹은 -keystore 값에 경로를 함께 지정해도 된다.


  3-1-2. 이클립스에서 확인하기

   Window - Preferences -> Android - Build


 3-2. 릴리즈용

....


4. SHA1 지문으로 구글 키 발급받기

 4-1. Google APIs console로 이동한 뒤에 프로젝트를 생성한다.


4-2. 좌측 메뉴중 APIs & auth - APIs 에서 Google Maps Android API v2 를 찾아 활성화시켜준다.


 4-3. APIs & auth - Credentials 에서 Public API access의 CREATE NEW KEY를 선택하고, Android key를 선택한다.



 4-4. 아래와 같은 창이 나오면 위에서 확인했던 SH1키와 같이 현재 작업중인 패키지를 넣는다.

예) [SHA1지문];[현재 작업중인 패키지 이름]

AF:3B:EF:67:CE:A1:5C:7D:C2:3F:C4:99:8B:63:7F:F5:92:83:E2:11;com.example.googlemap_v2



 4-5. 아래와 같이 키가 발급되었다.


5. 구글 맵 사용하기(code)

 5-1. 매니페스트 설정하기.

  5-1-1. Manifest 탭


   5-1-2. Application 탭(Meta Data 2개를 추가해야 한다.)

   5-1-3. Permissions 탭

1개의 permission과 7개의 user-permission을 추가한다.

<permission
    android:name="com.example.maptest.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" >
</permission>
<uses-permission android:name="com.example.maptest.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />



JAVA CODE

   5-1-4. AndroidManifest.xml에서 바로 추가할 수도 있다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.maptest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <permission
        android:name="com.example.maptest.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" >
    </permission>

    <uses-permission android:name="com.example.maptest.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.maptest.MapTest"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="KEY" />
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    </application>

</manifest>


  5-2. layout에 fragment 추가하기

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapTest" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
    <fragment 
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment"/>

</RelativeLayout>


  5-3. MainActivity에 FragmentActivity 상속 받기

public class MainActivity extends FragmentActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


참고자료



자바캔에서 구현이 잘되어있어서 본문글 자체를 그래도 가져온 글입니다. 본문글은 이곳입니다.

(문제가 생긴다면 삭제하도록 하겠습니다.)


안드로이드에서 2회 연속 백버튼을 눌러서 앱을 종료시키는 경우가 흔한데, 이 기능은 많이 사용되므로 다음과 같이 별도 클래스로 기능을 분리하면 향후 기능 재사용이 편리하다.

public class BackPressCloseHandler {

	private long backKeyPressedTime = 0;
	private Toast toast;

	private Activity activity;

	public BackPressCloseHandler(Activity context) {
		this.activity = context;
	}

	public void onBackPressed() {
		if (System.currentTimeMillis() > backKeyPressedTime + 2000) {
			backKeyPressedTime = System.currentTimeMillis();
			showGuide();
			return;
		}
		if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {
			activity.finish();
			toast.cancel();
		}
	}


	private void showGuide() {
		toast = Toast.makeText(activity, "\'뒤로\'버튼을 한번 더 누르시면 종료됩니다.",
				Toast.LENGTH_SHORT);
		toast.show();
	}

}

BackPressCloseHandler의 구현은 간단하다.

  • backKeyPressedTime은 백버튼이 눌린 마지막 시간을 기록한다.
  • onBackPressed() 메서드는 현재 시간이 마지막 백버튼 누른 시간으로부터 
    • 2초 이상 지났으면, 마지막 백버튼 눌린 시간을 현재 시간으로 갱신하고 showGuide()를 실행한다.
    • 2초 이상 지나지 않았으면, Activity를 종료한다.
    • 참고로, 2초는 Toast.LENGTH_SHORT의 기본 값이다.
  • showGuide() 메서드는 Toast를 이용해서 메시지를 출력한다.

2회 연속 백버튼 누를 때 종료시키고 싶은 Activity가 있다면, 다음과 같이 사용한다.

  • BackPressCloseHandler 타입의  backPressCloseHandler 필드를 추가한다.
  • onCreate() 메서드에서 BackPressCloseHandler 객체를 생성해서 필드에 할당한다.
  • onBackPressed() 메서드에서 backPressCloseHandler.onBackPressed()를 호출한다.
아래 코드는 실제 적용한 코드의 일부를 발췌한 것이다.


public class HomeActivity extends Activity ... {

	private BackPressCloseHandler backPressCloseHandler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.home_layout);
		...
		backPressCloseHandler = new BackPressCloseHandler(this);
	}

	@Override
	public void onBackPressed() {
		backPressCloseHandler.onBackPressed();
	}
}


문제점

다이얼로그에서 버튼을 클릭하면 닫히는 것을 막으려고 한다. 
참고사이트

해결방안

기존 리스너는 버튼만 만들어주고 AlertDialog 객체를 통해 오버라이딩해서 사용한다. 
그리고 아래 조건문을 통해 dimiss()를 제어한다.

코드

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		tvName = (TextView) findViewById(R.id.tvName);
		btnClick = (Button) findViewById(R.id.btnClick);

		btnClick.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				dialogView = (View) View.inflate(asdasd.this, R.layout.dialog,
						null);

				AlertDialog.Builder builder = new AlertDialog.Builder(
						asdasd.this);
				builder.setMessage("Test input data");
				builder.setView(dialogView);
				builder.setPositiveButton("ok",
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
							}
						});
				builder.setNegativeButton("clear",
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
							}
						});
				final AlertDialog dialog = builder.create();
				dialog.show();

				dlg_edt_name = (EditText) dialogView
						.findViewById(R.id.dlg_edt_name);

				dialog.getButton(AlertDialog.BUTTON_POSITIVE)
						.setOnClickListener(new View.OnClickListener() {
							@Override
							public void onClick(View v) {
								Boolean wantToCloseDialog = true;

								tvName.setText(dlg_edt_name.getText());

								if (wantToCloseDialog)
									dialog.dismiss();
							}
						});
				dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
						.setOnClickListener(new View.OnClickListener() {
							@Override
							public void onClick(View v) {
								Boolean wantToCloseDialog = false;

								dlg_edt_name.setText("");

								if (wantToCloseDialog)
									dialog.dismiss();

							}
						});
			}
		});
	}


dialogExam.zip


교착상태(Deadlock)

모든 프로세스들이 대기 중이고 프로그램이 진행을 할 수 없는 상태.

두 개 이상의 작업이 서로 작업이 끝나기만을 기다리고 있어서, 결과적으로 어떤 일도 완료하지 못하게 되는 것을 말한다.

병행성(concurrency)

프로그램에 있는 연산들이 병렬적으로 실행될 수 있으면 연산들이 병행적이라고 함. 병렬성의 가능성을 말함. <-> 순차적

상호배제(Mutual exclusion)

공유변수를 액세스하고 있는 하나의 프로세스 이외에 다른 모든 프로세스들이 공유변수를 액세스하지 모하도록 제어하는 기법.

각 프로세스들이 변수를 '읽기'만 할 때에는 문제가 없다. 하지만 '쓰기'를 하려고 할 때 문제가 발생한다. 따라서 이런 경우 서로 동시에 액세스 하지 못하도록 하는 것이 상호배제이다.

임계구역(Critical Sections, Critical Region)

어떤 프로세스가 공유데이터를 액세스하고 있을 때 그 프로세스는 임계구역에 있다고 한다. 상호배제를 위해서 한 프로세스가 임계구역에 있으면 다른 프로세스가 이에 접근하지 못하도록 해야 할 것이다.

성공과 실패를 결정하는 1%의 객체 지향 원리(Akira Hirasawa 저, 이길섭, 신동완 역, 성안당)를 바탕으로 기억해두고 싶은 내용 정리한 것임.


XP(eXtreme Programming) ? (위키)


1. XP ?

애자일 개발 프로세스가 불리는 개발 방법 중의 대표적인 방법으로 10~12개 정도의 구체적인 실천 방법을 정의한다.

비교적 적은 규모의 인원의 개발 프로젝트에 적용하기 좋으며, 개발 문서 보다는 소스코드를, 조직적인 개발의 움직임 보다는 개개인의 책임과 용기에 중점을 두는 경향이 크다. - 위키

형식적인 작업 순서와 문서 형식의 산출물을 정의하고 있지 않은 대신 기본 이념인 '4가지 가치'와, xp를 실천하기 위한 작업 항목인 '12가지 실천 항목'을 정의한다.


2. 4가지 가치

2-1. 의사 소통(Communication)

팀의 맴버와 고객과의 의사 소통을 중시한다.

2-2. 단순성(Simplicity)

설계에 얽매이지 않고, 최소한의 필요와 단순함을 지키는 것을 중시하며 변경할 필요가 있으면 언제든지 기존 프로그램의 내부 구조를 개선하는 리팩토링(refactoring)을 행한다.

2-3. 피드백(Feedback)

완성한 프로그램은 바로 실행시켜 테스트를 하고, 그 결과를 피드백해서 개선한다.

2-4. 용기(Courage)

필요한 경우에는 용기를 가지고 설계를 변경한다.


3. 12가지 실천 항목

계획 게임

작은 릴리즈

메타파

단순한 디자인

테스팅

리팩토링

페어 프로그래밍

공동 소유권

계속적인 통합

주 40시간 노동

온 사이트 고객

코딩 표준



+ Recent posts