실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.7.0_51

 WebServer

 Apache Tomcat 7.0


ADT(Android Development Tool) 설치

안드로이드 개발에 필요한 기능을 묶어서 만든 플러그인으로 이클립스와 SDK와 연결해준다.


1. 이클립스를 실행하고 아래 메뉴를 선택한다.

Help - Install New Software



2. 설치할 경로를 입력하기 위해 Add...를 클릭하고 아래와 같이 입력한다.

https://dl-ssl.google.com/android/eclipse/



3. 플러그인을 선택한다. 

  • NDK Plugins은 Native Development Kit의 약자로 C 또는 C++로 개발할 수 있게 도와주는 Development Kit이다.

4. 설치를 진행한다.



5. 이클립스가 재시작되고 설치가 완료된다. 

아직 안드로이드 개발 환경이 완성된 것은 아니다. 다음은 SDK를 설치하고 이클립스에 연동시켜보자.


Android SDK 설치


1. SDK는 안드로이드 홈페이지에 받을 수 있다.

  • 홈페이지에 접속하면 아래와 같은 화면이 나오게되는데 파란색 버튼(Download the SDK)를 선택하게되면 ADT와 SDK가 함께 설치된 이클립스를 받을 수 있다.
  • 하지만 위에서 이클립스와 ADT를 받았으니 SDK만 받기위해 좀 더 아래로 내려가 DOWNLOAD FOR OTHER PLATFORMS를 선택하자.
  • 각자 자신의 컴퓨터에 맞는 파일을 다운받는다.


2. 압축파일을 보면 이클립스도 같이 들어있다. 이클립스는 이전에 받았기 때문에 두개의 파일만 원하는 곳에 받는다. 계속 사용해야하므로 바탕화면에 덩그러니 놓아두는 것은 피하자.


3. 이클립스를 켜면 아래와 같은 창이 나올 것이다. 혹시나 나오지 않게 되면 아래 메뉴로 들어간다.



4. 다운받은 SDK를 지정해준다.



5. SDK를 실행시키고 설치하고자 하는 파일을 받는다.

이클립스 SDK 버튼이 보이지 않을 때



안드로이드 설치가 완성되었다.

문제점

$ git push 를 사용하니 다음과 같은 경고가 발생하였다.

warning: push.default is unset; its implicit value is changing in

Get 2.0 from 'matching' to 'simple'. To squelch this message

and maintain the current behavior after the default changes, use:

    git config -- global  push.default matching

To squelch this message and adopt the new behavior now, use:

    git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.

(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode

'current' instead of 'simple' if you sometimes use older versions of Git)

fatal: colud not read Username for 'https://github.com': No such file or directory


해결방안

Git 2.0 부터는 git push의 기본 동작이 matching에서 simple로 바뀌었다는 경고이다. 이 경고를 나오지 않게 하려면 

git config --global push.default matching 혹은 git config --global push.default simple 을 실행하면 된다.

matching은 동일한 이름을 가진 모든 branch를 push한다. 두 end를 늘 동일한 상태로 유지하고자 할 때 사용된다. 여럿이 사용하는 환경에는 부적합하다.

simple은 현재 작업중인 branch만 push한다.


위 사진에서 경고는 사라졌지만 다른 문제점도 찾아봐야겠다.

참고1참고2참고3 


문제점

Window git에서 unable to access ... Protocol https not supported or disabled in libcurl 오류 발생



해결방안

 libcurl 버전이 맞지 않아 발생 or 중복되어서 에러 발생

C:\Windows\SysWOW64\libcurl.dll 삭제.

(혹시 모를 상황을 대비해 백업해두기로 한다.)





 실행환경

 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) / 테스트기기 : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


문제점

xml에서 개행(엔터)을 넣어주고 싶을 경우.


해결방안

개행할 곳에 \n을 넣어준다.

<string name="msg">
    개행하기\n
    두번째 줄</string>


 실행환경

 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) / 테스트기기 : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


문제점

gps를 잘 사용하다가 언제부턴가 계속 위치를 가져오지 못한다.

아마 재부팅 후 부터 가져오질 못하는것 같다. 로그는 남겨서 어디까지 실행하는지 확인해봤다.

먼저 선언부이다.

Location location;
protected LocationManager locationManager;

locationManager = (LocationManager) mContext.getSystemService(mContext.LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);



먼저 GPS가 활성화되어 있을 때 날짜를 Toast로 출력하였다 사진엔 보이진 않지만 정상적으로 실행되었다.

1번 로그와 2번 로그 모두 확인할 수 있었다. 하지만 3번 로그가 출력되지 않았다.

location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

위 코드에서 문제가 있는 것 같다. getLastKnownLocation()은 이전에 저장된 위치정보을 가져오기 때문에 재부팅 후에는 null값을 반환한다.



해결방안

퍼미션으로 추가한 android.permission.ACCESS_FINE_LOCATION 은 위성과 직접 연결하여 현재 위치를 받아오는 것이다. 

핸드폰을 재부팅하거나 GPS 위치정보를 가지고 있지 않은 경우(GPS를 한번도 사용하지 않았다면)에 건물내부에서 GPS만을 사용하는 앱으로 테스트를 할 경우 현재 위치를 가져올수 없기 때문에 getLastKnownLocation()은 마지막에 GPS를 구동시켰던 장소를 가져오게 된다. 하지만 마지막 위치정보가 없기 때문에 null값이 반환된다.


실외에서 GPS를 활성화 시키고 대략 10초가량 기다린 후에 앱을 실행시켜보니(혹은 위치정보를 가져오는 버튼을 클릭했을 경우) 정상적으로 현재위치를 확인할 수 있었다.


위치정보를 계속 가져오는 것을 바란다면 정확성은 떨어지지만 조건문을 사용해서 GPS가 활성화 되어있지 않으면 네트워크 정보를 가져오는 방법이 있다. 전체 코드는 아니지만 확인해보길 바란다.

public Location getLocation() {
	try {
		locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

		// GPS, NETWORK 활성화 여부 확인
		isGPSEnabled = locationManager.
			isProviderEnabled(LocationManager.GPS_PROVIDER);
		isNetworkEnabled = locationManager.
			isProviderEnabled(LocationManager.NETWORK_PROVIDER);

		if (!isGPSEnabled && !isNetworkEnabled) {
			// 모두 비활성화의 경우
		} else {
			this.canGetLocation = true;
			if (isNetworkEnabled && !isGPSEnabled) {
				locationManager.requestLocationUpdates(
						LocationManager.NETWORK_PROVIDER,
						MIN_TIME_BW_UPDATES,
						MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
				if (locationManager != null) {
					location = locationManager
							.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
					if (location != null) {
						data.setLatitude(location.getLatitude());
						data.setLongitude(location.getLongitude());
					}
				}
			} else if (isGPSEnabled) {
				if (location == null) {
					locationManager.requestLocationUpdates(
							LocationManager.GPS_PROVIDER,
							MIN_TIME_BW_UPDATES,
							MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
					if (locationManager != null) {
						location = locationManager
								.getLastKnownLocation(LocationManager.GPS_PROVIDER);
						if (location != null) {
							data.setLatitude(location.getLatitude());
							data.setLongitude(location.getLongitude());
						}
					}
				}
			}
		}

	} catch (Exception e) {
		e.printStackTrace();
	}

	return location;
}


참고1, 참고2

Listener 사용 - 2014.03.18 강의내용

package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

	Button _btnNum;
	Button _btnName;

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

		_btnNum = (Button) findViewById(R.id.btn_num);
		_btnName = (Button) findViewById(R.id.btn_name);

		OnClickListener mClickListener = new OnClickListener() {
			@Override
			public void onClick(View v) {
				switch (v.getId()) {
				case R.id.btn_num:
					Toast.makeText(MainActivity.this, "2010211878",
							Toast.LENGTH_LONG).show();
					break;
				case R.id.btn_name:
					Toast.makeText(MainActivity.this, "Kim Yeong-Jun",
							Toast.LENGTH_LONG).show();
					break;
				}

			}
		};
		_btnNum.setOnClickListener(mClickListener);
		_btnName.setOnClickListener(mClickListener);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

정적필드, 정적메소드

변수, 메소드 앞에 static키워드 붙인다.

인스턴스화 하지않고도 클래스의 이름으로 사용할 수 있는 필드, 메소드.

public class Student {
	String name;
	int age;
	static int count;
	
	Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
}


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

[JAVA] 파일 읽기, 쓰기  (0) 2014.04.16
[JAVA] java.io.File 클래스  (0) 2014.04.10
[JAVA] String <-> int, double, float 변환  (0) 2014.02.28
[JAVA] heap, stack 메모리  (0) 2014.01.24

출처 : 읽기 좋은 코드가 좋은 코드다. - 더스틴 보즈웰, 트레버 파이커 지음

assertEqual()

File "file.py", line X, in <module>
    assert a == b
AssertionError
이 대신 unitest 모듈에 있는 assertEqual() 메소드를 사용할 수도 있다.
import unittest
Class MyTestCase(unittest.TestCase):
    def testFunction(self):
        a = 1
        b = 2
        self.assertEqual(a, b)

if _name_ == '_main_':
    unittest.main()
이는 다음과 같은 에러 메시지를 출력한다.
File "MyTestCase.py", line 7, in testFunction
        self.assertEquals(a, b)
AssertionError: 1 != 2


문제점

코드 작성중 fopen에서 에러발생.


해결방안

두개의 방법중 하나를 선택한다.

1. fopen_s()를 사용한다.

FILE* fp;
fopen_s(&fp, "c:\test.txt", "rw");


2. _CRT_SECURE_NO_WARINGS 허용한다.

프로젝트 오른쪽 클릭 후 속성에서 전처리게 정의에 추가한다.


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

[C] 연산자 우선순위  (0) 2014.05.02
[VS] Visual studio 코드 자동 정렬  (0) 2014.04.24
[C++]ifstream 클래스  (0) 2013.10.31
[C] 성적표 출력하기(파일읽기 scanf함수)  (0) 2013.10.16

Toast 사용 - 2014.03.11 강의내용

public class HelloAndroidActivity extends Activity {
	Button _clickBtn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main); // 초기에 띄워줄 화면

		// 초기화
		_clickBtn = (Button) findViewById(R.id.btn_click);

		// 이벤트 리스너
		_clickBtn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// 매개변수 1 : context 내가 사용할 응용프로그램 자체
				// 매개변수 2 : 출력할 문자
				// 매개변수 3 : 화면에 보여줄 시간

				Toast.makeText(HelloAndroidActivity.this, "test", Toast.LENGTH_LONG).show();
				// Toast.makeText(getApplicationContext(), "test",Toast.LENGTH_LONG).show();

				// 아래 변수를 생성해주어야만 사용 가능
				// final Context thisContext = this.getApplicationContext();
				// Toast.makeText(thisContext, "test",Toast.LENGTH_LONG).show();
			}
		});

	}

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

}

문제점

 

 

화면이 회전되어서 다시 회전하려 할 때

 

해결방안

ctrl + F11 수직

ctrl + F12 수평

res/layout/activity.xml

<RelativeLayout
    android:id="@+id/btn_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >

    <RadioGroup
        android:id="@+id/radioGroup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >

        <RadioButton
            android:id="@+id/bt1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="a" />

        <RadioButton
            android:id="@+id/bt2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="b" />

        <RadioButton
            android:id="@+id/bt3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="c" />

        <RadioButton
            android:id="@+id/bt4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="d" />
    </RadioGroup>
</RelativeLayout>


참고사이트

res - layout 에 custom_title.xml 생성

(아래 예제에서는 버튼을 따로 만든 이미지버튼을 사용하였다.)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:background="#505050" >

    <TextView
        android:id="@+id/titleTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="@string/msg"
        android:textColor="#ffffff"
        android:textSize="14sp" />

    <ImageButton
        android:id="@+id/btnMap"
        android:layout_width="80px"
        android:layout_height="80px"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="5dp"
        android:adjustViewBounds="true"
        android:background="@drawable/button_map"
        android:padding="0sp"
        android:scaleType="centerCrop" />

</RelativeLayout>

res - values - style.xml 에 추가

<style name="CustomTitle" parent="android:Theme">
    <item name="android:windowTitleSize">48dp</item>
    <item name="android:windowTitleBackgroundStyle">@style/CustomWindowTitleBackground</item>
</style>

<style name="CustomWindowTitleBackground">
    <item name="android:background">#00000000</item>
</style>

AndroidManifest.xml 수정

작성한 CustomTitle을 적용한다.

<activity
    android:name="com.Test.MainActivity"
    android:theme="@style/CustomTitle">
...

Activity.java 수정

작성한 CustomTitle을 적용한다.

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	// requestWindowFeature(Window.FEATURE_NO_TITLE);
		
	// custom title bar
	requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
	setContentView(R.layout.activity_main);
	getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);

API 이동

public final class PowerManager

java.lang.Object
-> android.os.PowerManager

Class Overview

이 클래스는 장치의 전원 상태를 제어할 수 있게 한다.


장치의 배터리 생명은 이 API를 사용함에 따라 상당한 영향을 받을 것이다. 정말로 필요하지 않는 한 acquire, PowerManager.WakeLock는 사용하지 말고, 가능한 가장 낮은 레벨을 사용하고 그리고 가능한 한 빨리 release하라.


너는 Context.getSystemService()를 호출함으로써 이 클래스의 인스턴스를 얻을수 있다. 


주된 API는 newWakeLock()이다. 그것은 PowerManager.WakeLock 객체를 만들어 준다. 너는 wake lock 객체를 이용해서 장치의 전원상태를 제어하는 메소드들 사용할 수 있다.


예)

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
    wl.acquire();
    // ..screen will stay on during this section..
    wl.release();


The following wake lock levels are defined, with varying effects on system power. 

그 다음으로 wake lock 레벨들은 시스템 전원에 변화하는 효과와 함께 정의된다. 이 레벨들은 상호 배타적이다. - 너는 오직 그것들 중 하나만 명시할지도 모른다.

Flag Value CPU Screen Keyboard
PARTIAL_WAKE_LOCK On* Off Off
SCREEN_DIM_WAKE_LOCK On Dim Off
SCREEN_BRIGHT_WAKE_LOCK On Bright Off
FULL_WAKE_LOCK On Bright Bright

*If you hold a partial wake lock, the CPU will continue to run, regardless of any display timeouts or the state of the screen and even after the user presses the power button. In all other wake locks, the CPU will run, but the user can still put the device to sleep using the power button.


덧붙혀, 너는 오직 화면의 행동에 영향을 주는 두개의 플래그를 추가할 수 있다. 그 플래그들은 PARTIAL_WAKE_LOCK와 같이 사용할때 효과를 얻지 못한다.

Flag Value Description
ACQUIRE_CAUSES_WAKEUP Normal wake locks don't actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.
ON_AFTER_RELEASE If this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker if you are cycling between wake lock conditions.

Any application using a WakeLock must request the android.permission.WAKE_LOCK permission in an <uses-permission> element of the application's manifest.


Summary

Nested Classes
class PowerManager.WakeLock A wake lock is a mechanism to indicate that your application needs to have the device stay on. 
Constants
int ACQUIRE_CAUSES_WAKEUP Wake lock flag: Turn the screen on when the wake lock is acquired.
int FULL_WAKE_LOCK This constant was deprecated in API level 17. Most applications should use FLAG_KEEP_SCREEN_ON instead of this type of wake lock, as it will be correctly managed by the platform as the user moves between applications and doesn't require a special permission.
int ON_AFTER_RELEASE Wake lock flag: When this wake lock is released, poke the user activity timer so the screen stays on for a little longer.
int PARTIAL_WAKE_LOCK Wake lock level: Ensures that the CPU is running; the screen and keyboard backlight will be allowed to go off.
int SCREEN_BRIGHT_WAKE_LOCK This constant was deprecated in API level 13. Most applications should use FLAG_KEEP_SCREEN_ON instead of this type of wake lock, as it will be correctly managed by the platform as the user moves between applications and doesn't require a special permission.
int SCREEN_DIM_WAKE_LOCK This constant was deprecated in API level 17. Most applications should use FLAG_KEEP_SCREEN_ON instead of this type of wake lock, as it will be correctly managed by the platform as the user moves between applications and doesn't require a special permission.
Public Methods
void goToSleep(long time)
Forces the device to go to sleep.
boolean isScreenOn()
Returns whether the screen is currently on. 화면이 현재 켜있는지 반환한다. 
PowerManager.WakeLock newWakeLock(int levelAndFlags, String tag)
Creates a new wake lock with the specified level and flags. 생성한다. 새로운 wake lock
void reboot(String reason)
장치를 재부팅한다.
void userActivity(long when, boolean noChangeLights)
Notifies the power manager that user activity happened.
void wakeUp(long time)
Forces the device to wake up from sleep.


Constants






http://aroundck.tistory.com/48



by the use of... -숙어- ...의 상용(일상적으로 씀)에 따라.

significantly -부사- (영향을 주거나 두드러징 정도로) 상당히[크게]

affected -형용사- 영향을 받은

unless -접속사- ......하지 않는 한

be sure to do something -숙어- (명령문으로 쓰여) 꼭[반드시] ~을 해라

as soon as -- ...하자마자

as soon as possible -숙어- 되도록 빨리

affect one's behavior -숙어- ~의 행동에 영향을 주다.

have no effect -숙어- 효과를 얻지 못하다


GDB 메모리 조사 방법

examine을 줄인 명령 x로 메모리를 조사할 수 있다.
  • 현재 명령의 위치 확인 방법 : info register eip -> i r eip (축약형)

형식 문자

  • o : 8진법으로 확인
  • x : 16진법으로 확인
  • u : unsigned 표준 10진법으로 확인
  • t : 2진법으로 확인


  • 여러개 확인 하는 방법 : 위 형식문자 앞에 숫자를 넣어준다.


표시 유닛 크기

메모리 단일 유닛의 기본 크기는 워드(Word)로 4 Byte다.

사용방법은 형식 문자 끝에 추가하여 바꿀 수 있다.

  • b : 단일 바이트
  • h : 2바이트의 하프워드(Halfword)
  • w : 4바이트의 워드
  • g : 8바이트의 자이언트(Giant)


각종 타입 변환하기

byte _byte = 12;
int _int = 123;
long _long = 12;
float _float = 1.23f;
double _double = 123.123;
String str;

// Byte <-> String
str = Byte.toString(_byte);
_byte = Byte.parseByte(str);
				
// Integer <-> String
str = Integer.toString(_int);
_int = Integer.parseInt(str);
				
// Long <-> String
str = Long.toString(_long);
_long = Long.parseLong(str);
				
// Float <-> String
str = Float.toString(_float);
_float = Float.parseFloat(str);
				
// Double <-> String
str = Double.toString(_double);
_double = Double.parseDouble(str);;



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

[JAVA] java.io.File 클래스  (0) 2014.04.10
[JAVA]정적필드, 정적메소드  (0) 2014.03.18
[JAVA] heap, stack 메모리  (0) 2014.01.24
[JAVA] ArrayList, LinkedList, Stack, Queue  (0) 2014.01.09

참고 : http://memesong.blogspot.kr/2012/09/blog-post.html


import java.text.SimpleDateFormat;
import java.util.Date;

// 시스템으로부터 현재시간(ms) 가져오기
long now = System.currentTimeMillis();
// Data 객체에 시간을 저장한다.
Date date = new Date(now);
// 각자 사용할 포맷을 정하고 문자열로 만든다.
SimpleDateFormat sdfNow = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String strNow = sdfNow.format(date);

// 1. 위 코드를 2줄로 줄였다.
SimpleDateFormat sdfNow = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
time = sdfNow.format(new Date(System.currentTimeMillis()));
					
// 2. 위 코드를 1줄로 줄였다. 하지만 위에 코드를 이해하지 못한 상태라면 가독성이 떨어질 수 있다.
time = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date(System.currentTimeMillis()));


다른 방법

Calendar calendar = Calendar.getInstance();

// long으로 가져올 때
long now = calendar.getTimeInMillis();
// 문자열로 가져올 때
String str = calendar.getTime().toString();

calendar.getTime().toString(); 일 때 출력 형식



 실행환경

 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) / 테스트기기 : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


출발지, 목적지 포트확인 수식



// 주석안의 내용은 수식을 설명한 것 이므로 적용시킬때는 지워야 한다. // + N("내용")의 내용은 수식내에 사용할 수 있는 주석이므로 지우지 않아도 된다. =IF(OR(+N("AND(AND(출발지, OR(포트)), AND(도착지, OR(포트)))"), // ↓ 출발지가 all이고, 도착지를 지정해놓은 경우 AND(AND(TRUE, OR(TRUE)), AND($F2="1.2.3.456", OR($G2=80))), // ↓ 출발지는 검사하지 않고, 도착지만 확인하는 경우 AND($F2="1.2.3.456", OR($G2=80, $G2=3389)), AND($F2="1.2.3.456", OR($G2=80)), // ↓ 출발지는 검사하지 않고, 도착지의 포트가 모두 all인 경우 AND($F2="1.2.3.456", TRUE) + N("편집실 all"), // ↓ 출발지의 IP와 모든 포트, 도착지의 IP와 포트를 확인하는 경우 AND(AND($D2="1.12.3.456", TRUE), AND($F2="1.2.3.456", OR($G2=3389))) + N("스트리밍"), AND($F2="1.2.3.456", OR($G2=3389, $G2=1935)) + N("스트리밍"), AND($F2="1.2.3.456", OR($G2=1935, $G2=177, $G2=8086, $G2=21, $G2=22, $G2=1521, TRUE)) + N("개발용"), AND($F2="1.2.3.456", TRUE) + N("필요없음") ), "허용", "제한")


=IF(OR(+N("AND(AND(출발지, OR(포트)), AND(도착지, OR(포트)))"),
AND(AND($D2="출발지 IP주소", TRUE), AND($F2="도착지 IP주소", OR($G2=포트))) + N("주석"),
), "허용", "제한")



1. 위도, 경도 찾기


BusStopID:    Latitude:    Longtitude:

example URL
http://map.naver.com/?dlevel=12&x=129.2171104&y=35.8459072&stationId=421826&enc=b64


2. 엑셀 수식 사용하여 찾기

▼2014.07.24 추가

BusStopID
=MID($A$1,FIND("stationId=",$A$1)+10,FIND("enc=",$A$1)-FIND("stationId=",$A$1)-11)
Latitude
=MID($A$1,FIND("y=",$A$1)+2,FIND("stationId",$A$1)-FIND("y=",$A$1)-3)
Longtitude
=MID($A$1,FIND("x=",$A$1)+2,FIND("y=",$A$1)-FIND("x=",$A$1)-3)



▼이전 포스팅

 

정보추출.xlsx


위도경도찾기.xlsx



수식을 이용해 url주소에서 위도, 경도 값 구하기.


1. 엑셀파일에 url 주소 가져오는 방법

값을 구할 곳을 선택하고 오른쪽에 클립모양의 버튼 클릭후 URL 복사.

 

2. 엑셀파일의 첫번째시트(url주소)에 복사한 후 두번째시트(값)에서 확인.



수식은 아래와 같다.

 name

 =LEFT(url주소!A2,IFERROR(FIND("거리뷰",url주소!A2), FIND("즐겨찾기",url주소!A2))-1)


 latitude

 =MID(url주소!B2,FIND("lat=",url주소!B2)+4,FIND("lng",url주소!B2)-FIND("lat",url주소!B2)-5)


 longitude

 =MID(url주소!B2,FIND("lng=",url주소!B2)+4,FIND("dlevel",url주소!B2)-FIND("lng",url주소!B2)-5)



res - values - strings.xml 에서 굵게하고 싶은 글자에 <b> 태그를 넣는다.

<string name="msg">
    <b>GPS 사용 시 실내에선 정확하지 않을 수도 있습니다.</b>   
</string>


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


현실 세계와 소프트웨어의 차이를 메울 3가지 단계와 이를 원활히 진행할 모델링 기술.


1단계. 업무 분석 : 현실 세계 일의 진행 방법을 정리한다.

  • 대상으로 하는 현실 세계의 일이 어떠한 역할 분담으로 어떻게 진행되는지를 정리하는 것.
  • 업무를 수행하기 위한 과제를 도출, 컴퓨터에 맡길 일을 정하기 위한 정보의 원천
  • 컴퓨터를 왜(why) 이용하는지를 정리하는 것이라고도 말한다.

2단계. 요구 정의 : 컴퓨터에 맡길 일의 범위를 정한다.

  • 컴퓨터의 주특기인 「정해진 일」과 「기억하는 일」이므로, 현실 세계의 업무 중에서 이러한 일을 도출할 필요가 있다.
  • 컴퓨터에게 어떤(what) 일을 시킬 것인지를 정하는 것에 해당한다.

3단계. 설계 : 소프트웨어를 어떻게 작성할지를 결정한다.

  • 컴퓨터를 관리하는 소프트웨어를 어떻게 실현할지를 결정하는 것에 해당한다.
  • 설계작업의 흐름
    • 실행 환경의 정의
      • 채용하는 하드웨어, 소프트웨어 제품의 선정
      • 신뢰성과 실행 효율 등의 시스템 요건, 기술과 제품의 성숙도, 비용, 운용 면 등 여러 가지 점을 고려해서 제품 선정
      • 특히 소프트웨어에 대해서는 운영체제, 통신, 데이터베이스 등 각각의 분야에 있어서 채용하는 기술과 제품을 결정할 필요가 있음
    • 소프트웨어 전체 구조의 정의
      • 전체를 복수의 서브 시스템으로 분할
      • 임베디드 소프트웨어와 같이 타이밍이 중요한 어플리케이션은 이 단계에서 스레드의 구성도 대체적으로 검토
      • OOP를 전제로 하는 경우, 어플리케이션 전체의 표준화와 품질 확보를 목적으로 전체적으로 공통이 되는 소프트웨어 구조를 결정한 후에 프레임워크를 제품군으로 준비하는 경우도 있다.
      • 서브 시스템의 구조는 UML의 패키지 다이어그램을 사용해서 표현한다.
    • 각각의 소프트웨어 구성품의 설계
      • 각각의 어플리케이션 기능을 표현하는 소프트웨어 구성품의 사양과 인터페이스를 하나하나 결정한다.
      • OOP에서는 클래스 및 메소드의 사양과 인터페이스를 결정하는 설계 작업 흐름 표현한다.


모델링 : 3가지 단계에 관해서 객체지향은 모델링을 지원한다. 

모델링에서는 하나의 어플리케이션이라도 업무 분석, 요구 정의, 설계의 산출물이 각각 다르다. 현실 세계와 소프트웨어의 차이를 메우는 3가지 단계는 현실 세계를 그대로 받아들이는 시점으로부터 컴퓨터의 상황에 맞추는 시점으로 바꾸어 가는 단계라고도 볼 수 있다.

모델링의 목적

업무 분석 : 현실 세계의 모습을 그대로 받아들인다.

요구 정의 : 컴퓨터의 성질을 고려해서 맡길 일의 범위를 정한다.

설계 : 하드웨어의 능력, OS와 미들웨어의 특성, 프로그래밍 언어의 표현 능력등을 고려해서 소프트웨어의 구조를 정한다.



아파치 톰캣 7.0 설치(새창)

플러그인 설치


■ 아파치 톰캣(Apache Tomcat)이란? - 위키백과

아파치 톰캣(Apache Tomcat)은 아파치 소프트웨어 재단에서 개발된 서블릿 컨테이너(또는 웹 컨테이너)만 있는 웹 애플리케이션 서버이다.

톰캣은 웹 서버와 연동하여 실행할 수 있는 자바 환경을 제공하여 자바 서버 페이지(JSP)와 자바 서블릿이 실행할 수 있는 환경을 제공하고 있다. 톰캣은 관리툴을 통해 설정을 변경할 수 있지만, XML 파일을 편집하여 설정할 수도 있다. 그리고, 톰캣은 HTTP 서버도 자체 내장하기도 한다.

아파치 톰캣은 Apache Licence, Version 2를 채용한 오픈소스 소프트웨어로서, 서블릿이나 JSP를 실행하기 위한 서블릿 컨테이너를 제공하며, 상용 웹 애플리케이션 서버에서도 서블릿 컨테이너로 사용하는 경우가 많다. 버전 5.5 이후는 기본적으로 Java SE 5.0 이후를 대응한다.

참고로 Tomcat은 사전적 의미로 '수고양이'를 뜻한다.


■ 아파치 톰캣 설치

1. 아파치 톰캣 홈페이지에서 다운로드를 한다.


2. 설치는 기본설정으로 하면된다. 기본 포트는 8080이다.

오라클과 포트가 겹칠수도 있으므로 8090으로 하는 것을 추천한다.


■ 이클립스에 아파치 톰캣 플러그인 연동

3. 위 링크를 통해 플러그인을 받고 압축파일안의 com.sysdeo.eclipse.tomcat_3.3.0 폴더를 이클립스폴더 내 플러그인안에 넣는다.(예. D:\eclipse-jee-kepler-SR1-win32-x86_64\eclipse\plugins)


4. 이클립스를 재시작하면 Tomcat 아이콘이 생긴다.


5. 컴퓨터 내에 받은 아파치 톰캣을 연동한다. 

window -> preferences 의 Tomcat 에서 7.0을 선택하고 Tomcat home에는 톰캣이 설치된 경로를 선택한다.

Context declaration mode에는 Server.xml을 선택하고, 

Configuration file에는 C:\Program Files\Tomcat 7.0\conf\server.xml처럼 server.xml의 경로를 입력한다.

(아파치톰캣8.0은 이클립스에서 지원하지않는다.)


6. Advanced에는 톰캣의 경로를 지정한다.


7. 테스트할 파일을 작성하고 확인해보자.


8. 작성한 코드를 실행해본다.




읽기 좋은 코드가 좋은 코드다(더스팀 보즈웰, 트레버 파우커 지음, 임백준 옮김) 를 읽고 

자주 참고하면서 습관화하려는 부분을 정리해 놓은 것으로 좀 더 자세한 내용은 책을 보기 바랍니다.


■ 이름에 정보를 담아라

  • 특정한 단어 고르기
    • 무의미한 단어를 피하고 구체적인 단어 선택로 명확하고 간결한 이름이 좋다.
    • 예) GetPage() -> FetchPage(), DownloadPage()
  • 보편적인 이름 피하기
    • retval라는 이름보다 변수값을 설명하는 이름을 사용한다.
    • tmp는 짧게 임시적으로만 존재하고, 임시적 존제 자체가 변수의 가장 중요한 용도일때에 한해서 사용한다. 
    • 루프반복자로 i, j 보다는 구체적으로 members_i, users_i 혹은 간결하게 mi, ui로 사용한다.
    • tmp, it, retval 같은 보편적인 이름을 사용하려면, 꼭 그렇게 해야 하는 이유가 있어야 한다.
  • 추상적인 이름 대신 구체적인 이름 사용하기
  • 접두사 혹은 접미사로 이름에 추가적인 정보 덧붙이기
    • 예) string id; // Example: "af84ef845cd8" -> string hex_id;
    • 단위값을 포함하는 값. size_mb, max_kbps
    • 헝가리언 표기법 : pLast와 같이 추가적인 속성을 이름 앞에 붙여 넣는 것.
    • 잉글리쉬 표기법 : 변수가 가지는 중요한 속성을 포착한 다음, 그 속성에 중요한 의미가 있으면 변수명에 포함.
  • 이름이 얼마나 길어져도 좋은지 결정하기
    • 좁은 범위에서 잠깐 사용되는 변수명은 짧을수록 더 좋다.
    • 단어 완성 기능 이용하기 (이클립스 Alt + / , Vim Ctrl + P)
  • 추가적인 정보를 담을 수 있게 이름 구성하기
    • 밑줄와 대시 그리고 대문자를 잘 이용하라.
    • 예) 클래스변수를 로컬변수와 구분하기 위해 '_'를 붙일 수 있다.
    • 예) html태그에 id는 밑줄로 단어를 구분하고 class는 대시로 구분한다.
      • <div id="middle_colum" class="main-content">


■ 오해하지 않도록 정하기

  • 어떤 값의 상한과 하한을 정할 땐 max_와 min_을 이름 앞에 붙이면 좋은 접두사 역할을 한다.
    • x < max_val
  • 경계를 포함한다면 first와 last가 좋은 이름이다.
    • x <= last_val
  • 경계의 시작만 포함하고 마지막은 배제하는 범위라면, begin과 end가 가장 널리 사용되는 이름이므로 최선이다.
    • begin <= x <end
  • 불리언값 이름을 정할 때는 불리언이라는 사실을 명확이 드러내기 위해서 is나 has와 같은 단어를 사용한다.
  • 사람들이 특정한 단어를 일반적으로 생각하는 사실에 유의할 필요도 있다.
    • get() 혹은 size()와 같은 함수가 가벼운 메소드라고 기대할지도 모른다.
    • 최근에 C++ 표준 라이브러리에서 "size()는 O(1)이어야 한다."는 규칙을 정했다.


성공과 실패를 결정하는 1%의 객체 지향 원리(Akira Hirasawa 저, 이길섭, 신동완 역, 성안당)를

바탕으로 기억해두고 싶은 내용 정리한 것임.


  • 프로그램을 표현하는 기술
  • 형태가 없는 소프트웨어를 보는 도구
  • 프로그램의 구조와 동작을 표현하기 위해 사용되는 대표적인 다이어그램 - 클래스 다이어그램, 시퀀스 다이어그램, 커뮤니케이션 다이어그램
  • 클래스 다이어그램
    • 집합론으로 분류, 정리된 현실 세계 사물의 관계를 표현
    • 정적인 정보를 표현한다.
    • 프로그램이 실행될 때의 구조 표현(클래스의 정의 정보와 클래스 간의 관계 표현)
  • 시퀀스 다이어그램, 커뮤케이션 다이어그램
    • 역할 분담 표현, 프로그램의 움직임을 표현한다.
    • 동적인 정보를 표현한다.
    • 상위 공정에서 '정해진 역할을 갖는 복수의 사람과 조직이 협조해서 전체의 일을 달성하는 모습'의 표현에 사용 가능
    • 시퀀스 다이어그램

사진 출처

      • 실행될 경우에 인스턴스 간의 메소드 호출을 시계열로 표현한다.
      • 역할 분담된 사람과 조직이 협력해서 전체의 일을 달성하는 모습을 시계열로 표현한다.
      • 시퀀스 다이어그램 모델링 하기
    • 커뮤니케이션 다이어그램
      • 실행될 경우에 인스턴스 간의 메소드 호출을 인스턴스의 관계 중심으로 표현한다.
      • 역할 분담된 사람과 조직이 협력해서 전체의 일을 달성하는 모습을 구조 중심으로 표현한다.
  • 유스케이스 다이어그램
    • 컴퓨터가 수행하는 일의 범위를 명확하게 표현한다.
    • 즉, 시스템의 전체 모습을 개략적으로 파악하는 데 유용한 다이어그램이다.
  • 액티비티 다이어그램
    • 프로그램의 논리를 기술하기 위해 사용한다.
    • 현실 세계의 업무 흐름을 표현할 목적으로 종종 사용한다. 
    • 시퀀스 다이어그램과 커뮤티케이션 다이어그램으로 표현 가능하지만, 실제로 일의 모습을 분석할 때는 통상 등장 인물의 역할 분담보다도 전체의 흐름을 이해하는 데 중점을 두기 때문에 직감적으로 표현 가능한 액티비티 다이어그램을 이용한다.
  • 스테이트 머신 다이어그램
    • 외부로부터의 이벤트에 의해 사물의 상태가 변화해 가는 모습을 표현한다.

언어

자연언어

컴퓨터용 언어

(프로그래밍 언어, 식자 언어)

모델링 언어(UML)

목적

인간끼리의 의사 소통

컴퓨터에 일을 지시

인간끼리의 의사 소통

형식

음성, 문자

문자

그림

특징

기본적인 문법은 있지만 상세함은 느슨함. 같은 언어에도 방언이 허락된다.

상당히 엄격

직감적으로 이해하기 쉬움을 중시


성공과 실패를 결정하는 1%의 객체 지향 원리(Akira Hirasawa 저, 이길섭, 신동완 역, 성안당)를

바탕으로 기억해두고 싶은 내용 정리한 것임.


UML(Unified Modeling Language, 통합 모델링 언어)

  • 소프트웨어 공학에서 사용되는 표준화된 범용 모델링 언어(위키)
  • 객체 지향 기술에 관한 국제 표준화 단체인 OMG(Object Management Group)라는 조직에 의해 표준으로 채택.
  • 1990년대 후반에 주요한 개발 방법론의 제안자인 그래디 브츠(Grady Booch), 제임스 럼보우(James RumBaugh), 이바 야콥슨(Ivar Jacobson)이 모여서 도식 표현을 통일하여 만들어진 결과가 UML. (이 3명은 Three Amigos라고 불리고 있다.)


표. UML2.0에 규정된 13종류 다이어그램

 NO

명칭(한글) 

명칭(영어) 

용도 

1

클래스

다이어그램

Class

Diagram

클래스 명세와 클래스 간의 관계를 표현

2

복합 구조

다이어그램

Composite

Structure

Diagram

전체-부분 구조를 가진 클래스를 실행할 때의 구조를 표현

3

컴포넌트

다이어그램

Component

Diagram

파일과 데이터베이스, 프로게스와 스레드 등의 소프트웨어 구조를 표현

4

디플로이먼트

다이어그램

Deployment

Diagram

하드웨어와 네트워크 등 시스템의 물리 구조를 표현

5

객체

다이어그램

Object

Diagram 

인스턴스 간의 연관 관계를 표현 

6

패키지

다이어그램

Package

Diagram

패키기 간의 연관 관계를 표현

7

액티비티

다이어그램

Activity

Diagram

일련의 처리에 있어 제어의 흐름을 표현

8

시퀀스

다이어그램

Sequence

Diagram

인스턴스 간의 상호  작용을 시계열로 표현

9

커뮤니케이션

다이어그램

Communication

Diagram

인스턴스 간의 상호 작용을 구조 중심으로 표현

10

인터액션 오버뷰

다이어그램

Interaction

Overview

Diagram

조건에 따라 다르게 동작을 하는 시퀀스 다이어그램을 액티비티 다이어그램 안에 포함하여 표현

11

타이밍

다이어그램

Timing

Diagram

인스턴스 간의 상태 전이와 상호 작용을 시간 제약으로 표현

12

유스케이스 다이어그램

UseCase

Diagram

시스템이 제공하는 기능과 이용자의 관계를 표현

13

스테이트 머신

다이어그램

State

Machine

Diagram

인스턴스의 상태 변화를 표현




+ Recent posts