파이썬, 장고 설치

# python 설치
$ sudo apt-get install python3.4

# 가상환경 만들기
$ python3 -m venv myvenv
## 우분투 14.04 에러시
$ sudo apt-get install python-virtualenv
$ virtualenv --python=python3.4 myvenv
##실행하기
$ . myvenv/bin/activate

실행한 뒤 프롬프트 앞에 (myvenv) 가 붙는다면 성공

# Django 설치
$ pip install django==1.8

가상환경 만들기 참고 링크


Django 프로젝트 시작

# 프로젝트 설치
$ django-admin startproject myproj .
# 생성 디렉토리
├── manage.py
└── myproj
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
# 설정변경
$ vi settings.py 

## 아래 내용 추가 및 변경
TIME_ZONE = 'Asia/Seoul'
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# 데이터베이스 만들기
$ python manage.py syncdb
$ python manage.py migrate


개발서버 실행하기

$ python manage.py runserver
# 터미널 종료하지 않은 채로 새로운 터미널에서 확인
$ curl 127.0.0.1:8000

# AWS 사용시에 외부에서 접속 가능하도록 하려면
$ python manage.py runserver 0.0.0.0:8000

aws 포트열기

포트를 열어두어야 외부에서 공용IP로 접속이 가능하다.

NETWORK & SECURITY -> Security Groups 에서 그룹 선택하고 Inbound에 8000 포트 추가


이진탐색

 이진 탐색(binary search)는 정렬되어 있는 자료들의 집합에서 특정 자료를 찾고자 할 때 많이 사용되며 매우 빠른 탐색 알고리즘이다. 이진 탐색은 '퀵정렬'과 유사하게 '분할 후 정복(divide and conquer)'의 전략을 사용한다. 이 전략을 사용하는 알고리즘은 문제를 나누어 해결해 나가는 방법이기 때문에 실행시간은 log의 설징을 갖는다. 특히 문제의 크기를 정확히 양분하는 경우에는 최악의 경우라고 logN의 성능을 보장한다.

 이진 탐색의 탐색 시간은 'T = K * logN'으로 O(logN)이다. 선형 탐색의 시간보다 상당히 빠르지만 이진 탐색은 반드시 정렬이 되어있어야 한다. 그러므로 정렬되지 않는 리스트의 경우에는 정렬하는 비용 또한 상당히 들 것이다. 이와 같은 단점에도 불구하고 다음과 같은 상황에서 이진 탐색은 효율적인 성능을 제공한다.

 1) 새로운 자료가 추가되었어도 모든 자료가 재정렬이 일어나지 않는 경우 -> 해싱, 인덱스를 이용하는 경우

 2) 획기적으로 빠르고, 효율적인 자료의 재정렬이 가능한 자료 구조를 사용할 경우 -> B-트리 계열의 트리 구조 사용


다음은 이진 탐색의 JAVA 소스이다.

package Search;

public class BinarySearch {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

		binarySearch(2, arr);
	}

	public static void binarySearch(int iKey, int arr[]) {
		int mid;
		int left = 0;
		int right = arr.length - 1;

		while (right >= left) {
			mid = (right + left) / 2;

			if (iKey == arr[mid]) {
				System.out.println(iKey + " is in the array with index value: " + mid);
				break;
			}

			if (iKey < arr[mid]) {
				right = mid - 1;
			} else {
				left = mid + 1;
			}

		}
	}
}


+

기술면접에서 이진탐색을 왜 구현하지 못했을까... 자료구조 시간에 그렇게 공부하고 이해하고 구현하고 다 해본 것을ㅠㅠ

기본을 먼저 보고 갔어야 하는 건데, 괜히 다른 알고리즘을 너무 보고 갔더니 간단한 알고리즘조차 어렵게만 생각하고 복잡하게 풀려고 한 것 같다.. 그래서 다시 기본기를 훑어보고자 이렇게 블로그에 남겨놓는다.

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

[JAVA] 기수정렬(RadixSort)  (0) 2015.11.20
[JAVA] 피보나치 - 재귀사용  (0) 2015.11.13
[JAVA] 퀵정렬(QuickSort)  (0) 2015.11.06
[JAVA] 딕스트라 최단경로(Dijkstra Shortest Paths)  (0) 2015.10.31

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

[JAVA] 이진탐색(Binary Search)  (0) 2015.11.27
[JAVA] 기수정렬(RadixSort)  (0) 2015.11.20
[JAVA] 퀵정렬(QuickSort)  (0) 2015.11.06
[JAVA] 딕스트라 최단경로(Dijkstra Shortest Paths)  (0) 2015.10.31

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

[JAVA] 피보나치 - 재귀사용  (0) 2015.11.13
[JAVA] 퀵정렬(QuickSort)  (0) 2015.11.06
[JAVA] 병합정렬(MergeSort)  (0) 2015.10.30
[JAVA] 버블정렬(BubbleSort)  (0) 2015.10.23

삽입정렬

- 안정정렬

- 시간복잡도: 

- 설명: 왼쪽에 있는 항목들은 정렬된 것으로 가정하고, 증가하는 인덱스의 값을 삽입하는 방법.

- 특징: 정렬대상이 적거나, 이미 부분적으로 정렬되어 있는 상황일 경우 효율적. 선택정렬과 버블보다는 빠름



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

[JAVA] 병합정렬(MergeSort)  (0) 2015.10.30
[JAVA] 버블정렬(BubbleSort)  (0) 2015.10.23
[JAVA] 선택정렬(SelectionSort)  (0) 2015.10.09
[JAVA] 쉘정렬(ShellSort)  (0) 2015.10.02

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

[JAVA] 버블정렬(BubbleSort)  (0) 2015.10.23
[JAVA] 삽입정렬(InsertionSort)  (0) 2015.10.16
[JAVA] 쉘정렬(ShellSort)  (0) 2015.10.02
[JAVA] 달팽이 만들기  (0) 2015.06.23

쉘정렬, (불안정) 간격을 두어 나눈 하위배열을 삽입정렬 반복


이클립스(eclipse)에서 ObjectAid 플러그인 사용하여 Class Diagram 만들기

설치방법

이클립스 실행 후 Help > Install New Software > Add 선택하고 아래 사진과 같이 입력하기.

ObjectAid Update Site 이동하기




사용방법

1. 먼저 사용하려는 프로젝트에 uml 파일을 추가할 폴더 생성.

2. Class Diagram 파일을 생성한다.

3. 생성된 ucls 확장자를 가진 파일에 클래스파일을 드래그해 넣는다.

* 다이어그램 화면에서 오른쪽 클릭하면 이미지 저장(Automatic Image > Save Now , Save As Image)이 가능하고, Layout Diagram을 클릭하면 자동정렬된다.



소프트웨어 공학 실무적 접근

저자
Roger S. Pressman, Bruce R. Maxim 지음
출판사
McGRAW HILL | 2015-01-02 출간
카테고리
컴퓨터/IT
책소개
▶ 이 책은 소프트웨어 공학 이론서입니다. 소프트웨어 공학의 기...
가격비교


애자일 개발


 애자일 개발은 문서가 생성되지 않는다는 것을 의미하는 것이 아니고, 개발 프로세스의 뒤에서 참조되어질 수 있는 문서들을 만든다는 것을 의미한다. 애자일 방법은 종종 라이트 방법(light methods) 또는 린 방법(lean methods)라고도 한다.


[애자일 소프트웨어 개발 선언문]

우리는 소프트웨어를 개발하면서, 또 다른 사람들이 그 일을 하는 것을 도와주면서, 소프트웨어 개발을 위한 더 좋은 방법을 찾아내고 있다. 이 작업을 통해 다음과 같은 것에 가치를 둔다.

        프로세스와 도구보다 개인과 상호작용에

        포괄적인 문서보다 작동하는 소프트웨어에

        계약 협상보다 고객과의 협동에

        계획을 따르는 것 보다 변경에 대한 대응에

즉, 왼쪽 항목도 가치가 있지만, 오른쪽 항목에 더 높은 가치를 둔다.


 민첩성이란

 민첩성이란 환경의 변화에 재빨리 그리고 효율적으로 적응하는 능력의 의미한다. 애자일에서는 고객을 개발 팀의 멤버로 받아들이고, 커뮤니케이션을 보다 쉽게 할 수 있도록 해주는 팀 구조와 사고방식을 장려한다.


 민첩성과 변경 비용

[그림 1] 개발에서의 시간에 따른 변경 비용

 소프트웨어 개발에 있어서 전통적으로는 변경 비용이 시간이 증가함에 따라 비선형 형태로(짙은 실선) 비용이 급속하게 증가한다. 하지만 잘 설계된 애자일 프로세스는 변경 비용 곡선이 평평하게 되도록 하고, 소프트웨어 팀이 과도한 비용을 쓰지 않고 또 개발시간에 영향을 받지 않으면서 나중에 변경하는 것이 가능하게 해준다고 한다. 애자일 프로세스는 소프트웨어가 점증의 형태로 릴리스 되고, 점증 내에서 변경을 보다 잘 제어할 수 있기 때문에 변경 비용을 감소시켜 준다. 또한, 단위 테스팅과 페어 프로그래밍과 같은 다른 애자일 실무와 연관되어 있으면 변경을 하는 데 드는 비용이 적어진다.


페어 프로그래밍 : 한 개의 컴퓨터에 두 명의 프로그래머가 앉아 컴포넌트의 코드를 작성하는 소프트웨어 개발 접근법. 키보드를 잡고 있는 사람을 driver라고 하고 다른 한 사람을 Observer, pointer, navigator라고 한다. 실시간 코드 리뷰가 수행된다는 것을 암시적으로 의미한다.


  애자일 프로세스란?

  애자일 개발 프로세스란 어느 특정 개발 방법론을 가리키는 말이 아니라 애자일(agile=기민한, 좋은 것을 빠르고 낭비 없게 만드는 것) 개발을 가능하게 해 주는 다양한 방법론 전체를 일컫는 말이다 - 애자일 소프트웨어 개발, 위키백과


3.1  애자일리티 원칙

 애자일 연합은 민첩성을 달성하기 원하는 사람들을 위해 12가지 애자일리티 원칙을 정의하였다.

1)   가치 있는 소프트웨어를 일찍 그리고 지속적으로 전달해서 고객을 만족시킨다.

2)   개발 후반부일지라도 요구사항 변경을 반겨라. 애자일 프로세스는 변화를 활용해 고객의 경쟁력에 도움이 되게 한다.

3)   작동하는 소프트웨어를 자주 전달하라. 두어 주에서 두 달 간격으로 하되 더 짧은 기간을 선호하라.

4)   비즈니스 쪽의 사람들과 개발자들은 프로젝트 진행하는 동안 같이 일해야 한다.

5)   동기부여가 된 개인들 중심으로 프로젝트를 구성하라. 그들이 필요로 하는 환경과 자원을 주고 그들이 일을 끝내리라고 신뢰하라.

6)   개발 팀으로, 또 개발팀 내부에서 정보를 전하는 가장 효율적이고 효과적인 방법은 면대면 대화이다.

7)   작동하는 소프트웨어가 진척의 주된 척도이다.

8)   애자일 프로세스들은 지속 가능한 개발을 장려한다. 스폰서, 개발자, 사용자는 일정한 속도를 계속 유지 할 수 있어야 한다.

9)   기술적 탁월성과 좋은 설계에 대한 지속적 관심이 민첩성을 높인다.

10)  간결함-처리하지 않은 작업의 양을 최대로 해주는 기술-은 필수적이다.

11)  최고의 아키텍처, 요구사항, 설계는 자기 조직적인 팀에서 나온다.

12)  팀은 정기적으로 어떻게 더 효과적이 될지 숙고하고, 이에 따라 팀의 행동을 조율하고 조정한다.


3.2  애자일 개발 전략

 "... 아무도 민첩성을 반대하지는 않는다. 실질적인 질문은 다음과 같은 것이다. 민첩성을 얻기 위해 가장 좋은 방법이 무엇인가? 중요한 것은, 고객의 오늘의 요구를 만족하고 오랜 기간 동안 요구를 만족하도록 확장 가능한 품질 특성을 가지고 있는 소프트웨어를 어떻게 개발하나?이다. ... 두 학파의 좋은 점만 생각하면 얻을 수 있는 것이 많이 있고, 각 방식을 폄하하면 아무것도 얻을 것이 없다."

 애자일리티와 소프트웨어공학 중에서 선택할 필요는 없다. 그보다는 애자일한 소프트웨어 공학을 정의하라.


 익스트림 프로그래밍

 익스트림 프로그래밍(eXtreme Programming, XP)은 켄트 백 등이 제안한 소프트웨어 개발방법으로, 비즈니스 상의 요구가 시시각각 변동이 심한 경우에 적합한 개발 방법이다. -위키백과


4.1  XP 프로세스

 XP는 객체지향 기법을 개발 패러다임으로 사용하고, 네 가지 프레임워크 액티비티(계획 수립, 설계, 코딩, 테스팅) 맥락 안에서 이루어지는 규칙들과 실무들을 포함한다.


[그림 2] 익스트림 프로그래밍 프로세스


●  계획 수립 : 계획 수립 액티비티(=planning game)는 요구하는 출력과 주요 특징과 기능에 대한 요구 사항(스토리)을 수집한다. 고객은 각 스토리를 인덱스 카드에 정한다(우선순위 설정). XP팀은 스토리를 평가하고 비용과 시간(주 단위)을 판단한다. 3주 이상이 된다면 스토리를 더 작은 스토리로 나눠야 한다.

●      XP팀에 의해 개발될 다음 릴리스(다음 점증)에 요구사항 그룹을 어떻게 나눌지 결정하기 위해 고객과 개발자는 같이 작업한다. 개발이 진행되면서, 고객이 요구사항을 변경할 수 있다. XP는 남아 있는 모든 릴리스를 다시 생각하고 그것에 따라 계획을 수정한다.(Small Release)                                                        

●  설계 : XP설계는 엄격하게 KIS(keep it simple), KISS(keep it small and simple) 원칙을 따른다. 복잡한 표현보다는 항상 간단한 설계를 선호한다.(Simple Design)

●   XP에서는 소프트웨어를 객체지향 맥락으로 생각하기 위한 효율적인 방법으로 CRC카드를 사용할 것을 권장한다. CRC(class-responsibility-collaborator) 카드는 객체 지향 소프트웨어설계에서 사용되는 브레인스토밍 툴로, 지금의 소프트웨어 점증에 적합한 객체지향 클래스를 파악하고 구조화한다. 일반적으로 디자인을 시작할 때 어떤 객체가 필요하고 그들이 어떻게 상호 연계할지 여부를 결정하는 데 사용한다.

●   만약 스토리 설계의 한 과정에서 어려운 설계 문제를 접하게 되면, XP는 그 부분에  대해 작동하는 프로토타입을 즉각적으로 만들 것을 권장한다.


●  코딩 : 코딩을 시작하기 전에 단위 테스트를 생성한다.(XP 방식의 핵심 요소) 관련 없는 것은 더 이상 추가하지 않는다(KIS). 코드가 완성되면 즉시 단위 테스트가 이루어지고, 개발자에게 즉각적인 피드백을 제공하게 된다.

●   코딩 액티비티를 진행하는 동안의 핵심 개념은 페어 프로그래밍(pair programming)이다. 이 방법은 실시간 문제 해결과 실시간 품질보증을 위한 메커니즘을 제공한다. 작업을 완수하면 다른 사람이 작업한 것과 통합한다. 통합 팀에 의해 하루 단위로 이루어지고, 다른 경우 페어 프로그래머가 통합의 책임을 진다. "지속적인 통합" 전략은 호환성과 인터페이스 문제들을 피하도록 해주고, 초기에 에러를 발견하는 "스모크 테스팅(smoke testing)" 환경을 제공해 준다.


●  테스팅 : 단위 테스트는 자동적인 수행을 가능하게 해주는 프레임워크를 사용하여 구현되어야 한다. 이렇게 하는 것은 코드가 수정될 때 마다(XP 리팩토링 철학에 따라, 자주) 회귀 테스트 전략을 쓸 것을 권장한다.

●   고객 시험(customer test)이라고도 하는 XP의 인수시험(acceptance test)은 고객에 의해 명시되고, 보여지고, 검토되는 전반적인 시스템 특성과 가능에 초점을 맞춘다. 인수 시험은 소프트웨어 릴리스의 일부분으로 구현되는 사용자 스토리로부터 만들어진다.


4.2   산업계 XP

 Joshua Kerievaky는 산업계 익스트림 프로그래밍(Industrial Extreme Programming, IXP)을 다음과 같이 묘사하였다. "IXP는 XP가 자연스럽게 발전한 것이다. XP가 가진 최소화, 고객 중심, 테스트 구동 정신으로 가득 차 있다. 기존 XP와의 차이점으로 더욱 많이 포함되어 있는 관리, 확장된 고객의 역할, 개선된 기술적 실무 측면이 있다. 대규모 조직 안에서 XP팀이 중요한 프로젝트를 성공적으로 수행하기 위해 고안된 여섯 가지의 새로운 실무과정은 다음과 같다.

●   준비 평가 : 모든 구성원이 준비가 되었는지, 적합한 개발환경이 만들어졌는지, 연관된 수준의 기술을 이해하고 있는지 확인한다.

●   프로젝트 커뮤니티 : 커뮤니티는 기술자와 다른 이해관계자들을 포함해야 하고, 프로젝트 팀을 위해 알맞은 사람들이 필요한 기술과, 훈련이 잘 되어있는지 결정한다.

●   프로젝트 차터링 : 프로젝트를 위한 적합한 비즈니스 명분이 있는지와, 프로젝트가 조직의 전반적인 목표와 목적을 발전시킬 것인지를 결정하기 위해 프로젝트 자체를 평가한다.

●   테스트-주도 관리 : 일련의 측정 가능한 목표를 설정하고, 이러한 목표에 도달하였는지 여부를 결정하기 위한 메커니즘을 정의한다.

●   회고 : 소프트웨어 점증이 인도된 후에 특별한 기술적 검토를 수행한다. 회고라고 불리는 검토에서는 소프트웨어 점증과 또는 전체적인 소프트웨어 릴리스를 통해 "이슈, 이벤트 그리고 학습한 교훈"을 조사한다.

●   지속적 학습 : 고품질 프로덕트를 만들 수 있도록 새로운 방법론과 기술을 배울 것을 권장한다.


 그 외 애자일 프로세스 모델

 가장 광범위하게 사용되는 애자일 프로세스 모델은 익스트림 프로그래밍이다. 그 외에 네 가지 일반적인 애자일 방법에 대해 살펴본다.


5.1  스크럼(scrum, 럭비 경기의 액티비티에서 유래)

 스크럼은 특정 언어나 방법론에 의존적이지 않으며, 개발 언어는 물론이고 객체지향 언어와도 관련이 없는 넓은 응용 범위의 개발 기법이다. 프로젝트관리를 위한 상호, 점진적 개발방법론으로, 개발 프로젝트를 위해 고안되었지만 유지보수 팀이나 일반적 프로젝트/프로그램 관리에서도 적용 가능하다. 스크럼은 애자일 소프트웨어 개발 과정의 하나로 다음과 같  은 특성을 가지고 있다.

●   솔루션에 포함할 기능/개선점에 대한 우선 순위를 부여한다.

●   개발 주기는 30일 정도로 조절하고 개발 주기마다 실제 동작할 수 있는 결과를 제공하라.

●   개발 주기마다 적용할 기능이나 개선에 대한 목록을 제공하라.

●   날마다 15분 정도 회의를 가져라.

●   항상 팀 단위로 생각하라.

●   원활한 의사소통을 위하여, 구분 없는 열린 공간을 유지하라.


[그림 3] 스크럼 프로세스 흐름


 각각의 프레임워크 액티비티(요구사항, 분석, 설계, 변경, 인도를 포함하는 개발 액티비티)에서, 작업 태스크는 스프린트(Sprint)라 불리는 프로세스 패턴 안에서 생긴다. 스프린트 안에서 수행되는 작업은 스크럼 팀에 의해 당면한 문제에 맞춰지고 실시간으로 정의되고 또한 종종 수정된다.

 스크럼은 빠듯한 시간, 요구사항의 변경, 그리고 사업상 위험한 상태를 가지고 있는 프로젝트에 효과적이고, 프로젝트 우선순위, 구분되어 있는 작업 단위, 커뮤니케이션, 그리고 빈번한 고객 피드백을 강조하는 일련의 프로세스 패턴을 포함하고 있다


●   백로그(Backlog) : 개발할 제품에 대한 요구 사항 목록

●   스프린트(Sprints) : 반복적인 개발 주기, 미리 정의된 타임박스(일반적으로 30일)에 적절하게, 백로그에 정의되어 있는 요구사항을 완수하는 데 필요한 작업 단위.

●   스크럼 미팅(Scrum meeting) : 스크럼 팀에 의해 매일 열리는(일반적으로 15분) 회의. 세 가지 주요 질문내용에 대해서 모든 팀 멤버가 묻고 대답한다.

●   지난번 팀 미팅 이후에 무엇을 하였나?

●   어떤 걸림돌이 있나?

●   다음 팀 미팅 때까지 무엇을 완수할 계획인가?

 스크럼마스터(ScrumMaster)라 불리는 팀 리더는 미팅을 주관하며, 팀원을 코칭하고, 프로젝트의 문제 상황을 해결하는 역할을 하고, 각 멤버들의 답변을 평가한다.

●   데모(Demos) : 소프트웨어 점증을 고객에게 인도해서, 고객에게 구현된 기능이 보여지고 평가될 수 있도록 한다. 데모에는 계획한 모든 기능이 포함되어 있지 않을 수 있지만, 설정된 타입-박스 안에는 인도될 수 있는 기능들이 포함되어 있다는 것을 아는 것이 중요하다.


5.2  동적 시스템 개발 방법(Dynamic Systems Development Method, DSDM)

 DSDM은 통제된 프로젝트 환경에서, 점증적 프로토타이핑을 통해 빠듯한 시간 제약조건 내에 시스템을 개발하고 유지보수하기 위한 프레임워크를 제공하려는 개발 방식이다. 또한, Rapid Application Development (RAD) 방법론에서 발전한 것으로, 초기부터 지속적으로 사용자의 적극적 참여를 통한 요구사항 즉시 반영 방식이다.


●   DSDM의 9개의 철학

●   적극적인 사용자 참여.

●   DSDM 팀은 결정을 내릴 수 있어야 한다.

●   수시로 제품을 인도해야 한다.

●   비즈니스 목적에 맞추는 것은 인도물의 필수 기준이다.

●   반복적이고 점증적인 개발은 정확한 비즈니스 솔루션으로 수렴

●   개발 동안 변경이 가능함

●   요구사항은 상위 수준에서 우선순위가 정해져야 한다.

●   생애주기를 통한 통합 테스팅

●   모든 이해관계자 간의 협업과 협조가 필수적이다.


●   DSDM의 5단계

●   Feasibility Study(타당성 분석)

●   Business Study(비즈니스 요구사항 분석)

●   Functional Model Iteration(기능 모델 반복)

●   Design and Build Iteration (설계와 구현통합)

●   Implementation(구현)


5.3  애자일 모델링(Agile Modeling)

 "애자일 모델링은 소프트웨어-기반 시스템의 효과적인 모델링과 문서화를 위한 실무-기반 방법론이다. 간단히 말하자면, 애자일 모델링은 소프트웨어 개발 프로젝트에 효과적이고 경량적인 방법으로 적용할 수 있는, 소프트웨어를 모델링하기 위한 가치, 원칙 그리고 실무의 모임이다. 애자일 모델은 전통적인 모델들보다 더 효과적이라. 왜냐하면 그것은 약간 좋은 것이고 완벽할 필요가 없기 때문이다. ", AM을 유일한 것으로 만들어주는 원칙들은 다음과 같다.

●   목적을 가진 모델 : 모델을 생성하기 전에 특정한 목표를 가지고 있어야 하며, 목표가 정해지면 어느 표기 유형을 사용할 것 인지와 요구되는 상세함의 수준이 더 명확해 질 것이다.

●   다중 모델 사용 : 필요한 통찰력을 제공하기 위해서 각 모델이 시스템의 다른 측면을 나타내야 하고, 대상으로 삼은 고객에게 가치를 제공해 주는 모델만 사용 하여야 한다는 것을 제안한다.

●   가벼운 여정 : 소프트웨어공학 작업이 진행됨에 따라, 장기적인 가치를 제공하는 모델만을 유지하고, 나머지는 폐기하라. 보관되는 모든 작업 산출물은 변경이 이루어지면 유지보수가 되어야 한다.

●   표현보다 컨텐츠가 더 중요 : 모델링은 대상으로 하는 고객에게 정보를 전달해 주어야 한다.

●   개발툴과 모델에 대해 알기 : 소프트웨어를 개발하기 위해 사용하는 각 모델의 강점과 약점을 이해하라.

●   부분 적 적용 : 모델링 방식은 애자일 팀의 필요에 따라 적응되어야 한다.


5.4  애자일 통합 프로세스(Agile Unified Process, AUP)

 AUP는 크게는 순차적, 작게는 반복적인 철학을 채택하였다. 전통적인 UP 단계 액티비티 -inception, elaboration, construction, transition-를 채택함으로써 순차적 오버레이를 제공한다. 각 액티비티동안 민첩성을 얻기 위해, 그리고 가능한 한 빨리 최종 사용자에게 점증을 인도하기 위해 팀은 반복 수행한다. AUP 반복에서는 다음과 같은 액티비티에 역점을 둔다.

●   모델링 : 비즈니스와 문제 영역에 대한 UML 표기를 생성한다. 하지만, 민첩성을 유지하기 위해 "단지 좋을 정도"이어야만 한다.

●   구현 : 모델은 소스코드로 변환 되어야 한다.

●   테스팅 : XP와 같이 에러를 발견하고 소스코드가 요구사항을 만족시킨다는 것을 확실히 하기 위해 팀은 일련의 테스트를 설계하고 실행시킨다.

●   배치 : 소프트웨어 점증의 인도와 최종 사용자부터의 피드백 획득에 초점을 맞춘다.

●   형상과 프로젝트 관리 : 형상관리는 변경관리, 리스트관리, 팀이 개발하는 것을 제어한다. 프로젝트 관리는 팀의 진척사항을 추적하고 관리하며 팀 액티비티를 조정한다.

●   환경 관리 : 팀에 가능한 표준, 도구, 다른 지원 기술을 포함하는 프로세스 인프라를 조정한다.


 애자일 프로세스 도구

  협력과 커뮤니케이션 "도구"들은 일반적으로 기술수준이 낮으며, 애자일 개발자간의 정보와 조화를 제공하는 매커니즘("물리적 근접, 화이트 보드, 포스트 시트, 인덱스 카드 그리고 스티커 메모지" 또는 최근 소셜 네트워킹 기술들)을 포함한다. 능동적 커뮤니케이션은 팀 역학(예를 들어, 페어 프로그래밍)을 통해 얻어지며, 반면에 수동적 커뮤니케이션은 "정보 라디에이터"에(예를 들어, 하나의 점증을 구성하는 서로 다른 컴포넌트들의 전체적인 상태를 나타내는 평범한 패널 디스플레이)에 의해 얻어진다. 애자일 프로세스를 지원하는 "도구 모음"은 기술적인 측면보다는 사람 측면에 더 초점을 맞추고 있다.




설치

Apache 설치

설치
$ sudo apt-get install apache2
소유권 설정
$ sudo chown pi -R /var/www
자동 실행
$ sudo update-rc.d apache2 defaults


MySQL 설치

$ sudo apt-get install mysql-server mysql-client libmysqlclient-dev
외부접속 가능하게하기(주석처리하기)
$ sudo vi /etc/mysql/my.cnf
#bind-address = 127.0.0.1

PHP 설치

$ sudo apt-get install php5

phpMyAdmin 설치

$ sudo apt-get install phpmyadmin


# 설정 공유

File > Export 에서 Preferences를 export하고 다른 워크스페이스에서 import.


1. 설정파일 수정

eclipse > eclipse.ini 파일을 수정하며, 아래 설정값을 자신의 사양에 맞춰 변경하여 사용한다. 세미콜론(;)은 주석이다.

; workspace의 경로를 윈도우 타이틀바에 출력
-showlocation

; 클래스 유효성 검사 생략, 그러나 나중에 어딘서 오류나는지 확인하기 위해 사용 추천
;-Xverify:none

; jdk 버전으로 설정하면 속도 향상
-Dosgi.requiredJavaVersion=1.6

;---------------------------------------------
; JVM 메모리 관리
;---------------------------------------------
; JVM 시작히 힙 영역 크기 : 최소(ms), 최대(mx)
-Xms64m
-Xmx1024m

; Permanent(영구) 영역 : JVM 클래스와 메소드를 위한 공간, 'Out of Memory' 에러 발생시 크기 조절 = PermSize
; New/Young 영역 :  새로 생성된 개체들을 위한 공간 = NewSize
; Old 영역 : 만들어진지 오래된 객체들의 공간(New영역에서 이동)
-XX:PermSize=64M
-XX:MaxPermSize=512M
-XX:NewSize=128M
-XX:MaxNewSize=512M

; Heap Shrinkage를 수행하는 임계치를 지정한다. 예를 들어 이 값이 70이면 Heap의 Free 공간이 70% 이상이 되면 Heap 크기가 축소된다. MinHeapFreeRatio 옵션과 함께 Heap의 크기 조정을 담당한다. 기본값 70
;-XX:MaxHeapFreeRatio=70

;---------------------------------------------
; Garbage Collection 방식에 따라 가능한 옵션
;---------------------------------------------
; 병렬 GC 사용
; 메모리가 충분하고 코어수 많을때 유리하다.
-XX:+UseParallelGC

; CMS GC 사용
; 응답속도가 중요할때 사용한다.
; GC Pause에 의한 사용자 응답시간 저하 현상을 줄인다.
-XX:-UseConcMarkSweepGC
;-XX:+CMSIncrementalPacing

; G1 GC(Garbage-First Garbage Collector) 사용
; 성능은 좋지만 더욱 안정화가 되었을때 사용하는 것이 좋다.
; JDK 1.7.0_4 이후 사용하는것이 안정적
;-XX:+UnlockExperimentalVMOptions
;-XX:+UseG1GC
;-XX:MaxGCPauseMillis=10

;---------------------------------------------

; out of space in codecache 오류 발생시 증가. 이 값은 permGenSpace 공간에 할당되므로 비례하게 커야한다.
-XX:ReservedCodeCacheSize=128m

; 컴파일러의 소수점 최적화 기능을 작동시켜 빨라진다.
-XX:+AggressiveOpts

; 개별 Thread의 Stack Size를 지정
; 대부분 기본값 사용, 어플리케이션의 스레드 스택에 의한 메모리 요구향이 높아지면 'Out Of Memory' 에러 발생
-Xss4m

-XX:+UseFastAccessorMethods
-XX:CompileThreshold=20000


2. 소스 자동 폴딩 해제

Preferences > Java > Editor > Folding 에서 Enable folding 해제

혹은 Coffee Bytes Java Folding 플러그인으로 기능 확장


3. 코드 자동완성기능 해제

(자동으로 실행되는 것을 해제하고, ctrl+space를 사용해서 동작시킬 수 있다.)

Preferences > Java > Editor > Content Assist 에서 Auto Activation - Enable auto activation 해제


4. 오른쪽 하단에 메모리 사용상태 표시

Preferences > General 에서 Show heap status 체크


5. Spell checking 해제

Preferences > General > Editors > Text Editors > Spelling 에서 Enable spell checking 해제


6. 인코딩 변경

Preferences > General > Workspace 에서 Text file encoding 는 UTF-8, New text file line delimite 값은 사용환경에 따라 변경


7. 줄번호 사용(이클립스 루나버전 이후로는 기본값으로 설정)

Perferences > General > Editors > Text Editors 에서 Show line numbers 체크


8. 이클립스 실행속도 개선

실행할때 로딩되는 플러그인을 제외한다.

Preferences > General > Startup and Shutdown 에서 필요없는 것 제외


9. Validation 유효성체크 해제

자신이 사용할 부분만 켜서 사용한다.

Preferences > Validation


10. 불필요한 플러그인 삭제

1) Preferences > Install/Update 에서 Uninstall or update 선택

2) 불필요한 것 Uninstall


11. Autometic Update Off

Preferences > Install/Updates > Automatic Updates 에서 체크해제


참고 사이트

설정파일 링크, 링크, 링크, 링크

위키, GC튜닝, 폴딩강화, GC플러그인, 가비지컬렉터





StringTokenizer 클래스 사용방법

토큰을 따로 지정하지 않으면 공백을 구분으로 나누어진다. 따로 구분문자를 지정하려면 생성자에 넣어준다.

StringTokenizer st = new StringTokenizer("this is a test");
while(st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}
StringTokenizer st = new StringTokenizer("a|b|c|d", "|");
while(st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}

String클래스의 split() 사용하기

String[] result = "this is a test.".split("\\s");
for(int i = 0; i < result.length; i++) {
    System.out.println(result[i]);
}


참고사이트 Link

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

[JAVA] 쉘정렬(ShellSort)  (0) 2015.10.02
[JAVA] 달팽이 만들기  (0) 2015.06.23
[JAVA] 리스트와 배열 간 복사 방법  (0) 2015.04.08
[JAVA] String 인코딩  (0) 2015.04.01

문제점

안드로이드 스튜디오 베타버전에서 정식버전으로 교체하면서 기존의 프로젝트가 실행되지 않는다. 에러 메시지는 아래와 같다.

After Android Studio update: Gradle DSL method not found: 'runProguard()'

해결방안

아래 사진과 같이 runProguard를 minifyEnabled로 바꾸어 주어야 한다. gradle 버전이 바뀌면서 발생하는 에러같다.



참고사이트 Link

import java.util.Arrays;
import java.util.List;

public class Test {
	public void copyByArray(int[] source) {
		int[] target = new int[source.length];
		// arraycopy(원본 배열, 복사 시작 위치, 대상 배열, 대상 배열의 시작 위치, 복사 길이);
		System.arraycopy(source, 0, target, 0, source.length);
	}

	public List copyByList(Integer[] args) {
		List list = (List) Arrays.asList(args);
		return list;
	}

}
package report1;

import java.io.UnsupportedEncodingException;

public class CharacterIncoding {

	public static void main(String[] args) {

		String word = "무궁화 꽃이 피었습니다.";
		try {
			System.out.println("utf-8 -> euc-kr        : "
					+ new String(word.getBytes("utf-8"), "euc-kr"));
			System.out.println("utf-8 -> ksc5601       : "
					+ new String(word.getBytes("utf-8"), "ksc5601"));
			System.out.println("utf-8 -> x-windows-949 : "
					+ new String(word.getBytes("utf-8"), "x-windows-949"));
			System.out.println("utf-8 -> iso-8859-1    : "
					+ new String(word.getBytes("utf-8"), "iso-8859-1"));
			System.out.println("iso-8859-1 -> euc-kr        : "
					+ new String(word.getBytes("iso-8859-1"), "euc-kr"));
			System.out.println("iso-8859-1 -> ksc5601       : "
					+ new String(word.getBytes("iso-8859-1"), "ksc5601"));
			System.out.println("iso-8859-1 -> x-windows-949 : "
					+ new String(word.getBytes("iso-8859-1"), "x-windows-949"));
			System.out.println("iso-8859-1 -> utf-8         : "
					+ new String(word.getBytes("iso-8859-1"), "utf-8"));
			System.out.println("euc-kr -> utf-8         : "
					+ new String(word.getBytes("euc-kr"), "utf-8"));
			System.out.println("euc-kr -> ksc5601       : "
					+ new String(word.getBytes("euc-kr"), "ksc5601"));
			System.out.println("euc-kr -> x-windows-949 : "
					+ new String(word.getBytes("euc-kr"), "x-windows-949"));
			System.out.println("euc-kr -> iso-8859-1    : "
					+ new String(word.getBytes("euc-kr"), "iso-8859-1"));
			System.out.println("ksc5601 -> euc-kr        : "
					+ new String(word.getBytes("ksc5601"), "euc-kr"));
			System.out.println("ksc5601 -> utf-8         : "
					+ new String(word.getBytes("ksc5601"), "utf-8"));
			System.out.println("ksc5601 -> x-windows-949 : "
					+ new String(word.getBytes("ksc5601"), "x-windows-949"));
			System.out.println("ksc5601 -> iso-8859-1    : "
					+ new String(word.getBytes("ksc5601"), "iso-8859-1"));
			System.out.println("x-windows-949 -> euc-kr     : "
					+ new String(word.getBytes("x-windows-949"), "euc-kr"));
			System.out.println("x-windows-949 -> utf-8      : "
					+ new String(word.getBytes("x-windows-949"), "utf-8"));
			System.out.println("x-windows-949 -> ksc5601    : "
					+ new String(word.getBytes("x-windows-949"), "ksc5601"));
			System.out.println("x-windows-949 -> iso-8859-1 : "
					+ new String(word.getBytes("x-windows-949"), "iso-8859-1"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}



소프트웨어 공학 실무적 접근

저자
Pressman 지음
출판사
McGRAW HILL | 2015-01-02 출간
카테고리
컴퓨터/IT
책소개
▶ 이 책은 소프트웨어 공학 이론서입니다. 소프트웨어 공학의 기...
가격비교

 

1.   소프트웨어의 본질

 

 소프트웨어(software 이하 SW)는 프로덕트이며, 동시에 프로덕트를 전달하는 수단이다. ① 프로덕트로써, 소프트웨어는 하드웨어나 네트워크에 의해 구체적인 컴퓨팅 잠재력을 전달한다. ② 프로덕트를 전달하는 수단으로써, 소프트웨어는 컴퓨터를 제어(운영체제)., 정보의 전달(네트워크), 다른 프로그램을 생성하고 제어(소프트웨어 도구와 환경)하는 역할을 한다.

  소프트웨어는 가장 중요한 프로덕트인 정보(한 개의 비트에서부터 많은 데이터로 만든 멀티미디어 데이터)를 생산, 관리, 획득, 수정, 표시, 전파시킨다. 개인적인 관점에서 더욱 유용하게 사용할 수 있도록 개인적인 데이터를 변환하거나, 경쟁력을 향상시키기 위해 사업관련 정보를 관리하거나, 전 세계적인 정보 네트워크로의 게이트웨이를 제공하거나, 다양한 형태의 정보를 획득할 수 있는 수단을 제공한다.

  지난 50년간 하드웨어 성능 개선, 컴퓨터 구조 변화, 저장용량 증가, 다양한 입출력 장치 등으로 인해 컴퓨터 소프트웨어는 더욱 정교해지고 복잡하게 변화하였다. 그러나 개발자의 입장에서는 큰 어려움이 되기도 하였다. 소프트웨어의 규모가 커짐에 따라 개인이 시스템을 개발하는 것이 아닌 여러 개의 팀으로 대체되었다. 하지만 여전히 같은 질문을 하고 있다.

Ÿ   시간 : 소프트웨어가 완성되기 위해 왜 그렇게 많은 시간이 필요한가?

Ÿ   비용 : 소프트웨어 개발 비용이 왜 그렇게 많이 드는가?

Ÿ   소프트웨어를 고객에게 전달하기 전에 왜 모든 에러를 찾지 못하는가?

Ÿ   개발된 프로그램을 유지 보수하는 데 왜 그렇게 많은 시간과 노력을 들여야 하나?

Ÿ   소프트웨어를 개발하고 유지 보수할 때 진척 정도를 측정하기가 왜 어려운가?

  이와 같은 질문들은 소프트웨어의 개발 방식에 대한 질문으로, 이런 질문으로 소프트웨어공학 기술의 필요함을 알려준다.

 

1.1   소프트웨어 정의

  먼저 프로그램은 특정 문제를 해결하기 위한 명령어들의 정렬된 집합을 말한다. 소프트웨어란 컴퓨터 프로그램과 함께 관련된 문서(요구서, 설계서, 분석서, 에러리포트, 설명서, 테스트 리포트, 테스트 케이스등 유지 보수하는데 사용되고, 개발하면서 필요한 모든 문서들)를 포함한 것을 말한다. 곧 프로그램은 하나의 소프트웨어의 진부분집합이다.

 

"소프트웨어는 실행되면서 원하는 기능이나 함수, 성능을 제공해 주는 명령어들, ② 프로그램이 데이터를 적절하게 처리할 수 있게 해주는 자료구조, ③ 프로그램의 사용이나 운영을 나타내는 하드카피나 가상 형태의 문서이다.

- 교재 p5

 


[그림 1] 하드웨어 고장률 곡선

 

  그림 1은 하드웨어 고장률을 나타낸다. 욕조 커브(bathtub curve)로 불리는 그래프로, 하드웨어의 생명주기 초기에는 설계나 제조과정의 결점으로 인해 고장률이 높다. 그리고 결점의 수정을 통해 안정적인 수준으로 떨어진다. 하지만 시간의 지남에 환경적 요인(먼지, 진동, 오용, 극단적인 온도 등)을 겪으며 마모되고 고장률은 다시 올라가게 된다

 

.

[그림 2] 소프트웨어 고장률 곡선

 

  소프트웨어는 하드웨어와 달리 환경적 요인에 의해서 마모되지 않는다. , 하드웨어는 부품이 마모되면 새것으로 교체하면 되지만 소프트웨어는 오류가 발생하면 코드를 변경해야 한다. 이론상으로는 소프트웨어는 마모되지 않으므로 그림 2와 같이 초기에는 높은 고장률을 보이다가 수정을 통해 낮은 고장률인 곡선의 형태를 보여야 한다. 하지만 소프트웨어는 마모되는 것이 아니라 악화되는 것이다.

그림 2의 실제 곡선(Actual curve)과 같이 뾰족한 고장률 곡선이 나타난다. 생명주기에는 발견되지 않은 결함으로 인해 높은 고장률을 나타낸다. 결함들이 수정되어지면 다시 일정하게 낮아진다. 하지만 새로운 요구사항으로 인해 소프트웨어에 변경이 이루어지면 급격하게 고장률은 높아진다. 수정을 통해 곡선은 낮아지다가 안정적인 고장률로 돌아가기 전에 다른 요구사항으로 인해서 곡선은 뾰족하게 된다. , 변경과정에서 많은 에러를 동반한다. 이러한 반복으로 인해 전체적으로 고장률 수준이 올라가기 시작하면서 소프트웨어는 저하된다. 따라서 변경을 요하는 소프트웨어 유지보수 작업은 하드웨어 유지보수보다 상당히 복잡하다.

  소프트웨어공학 방법론에서는 소프트웨어 고장률 그래프에 변경으로 인해 고장률이 높아진 정도를 줄이기 위해 노력하고 있다.

 

1.2   소프트웨어 애플리케이션 도메인

  컴퓨터 소프트웨어는 넓게 7가지 범주로 나눌 수 있다.

Ÿ   시스템 소프트웨어(System software) : 컴파일러나 파일 관리 유틸리티와 같은 시스템 소프트웨어는 결정적(소프트웨어의 입력, 처리, 출력의 시간과 순서가 예측 가능)인 정보구조를 처리하고, 운영체제 컴포넌트, 드라이버, 원거리 통신 처리기와 같은 시스템 소프트웨어는 비결정적인 데이터를 처리한다.

Ÿ   애플리케이션 소프트웨어(Application software) : 특수한 업무상의 요구를 해결해 주는 독자적인 프로그램이다.

Ÿ   공학/과학용 소프트웨어(Engineering/scientific software) : '수 처리' 알고리즘으로 사용되는 것들로, 천문학부터 화산학, 자동차 스트레스 분석부터 우주 왕복선 궤도 역학 등 다양하게 응용된다.

Ÿ   임베디드 소프트웨어(Embedded software) : 제품이나 시스템에 내정되어 있으면서 시스템 자체를 위한 특징적인 기능만 구현하고 제어하는 데 사용된다. 예를 들어 전자레인지나 밥솥에 내장된 소프트웨어를 말한다.

Ÿ   프로덕트라인 소프트웨어(Product-line software) : 많은 고객들이 사용할 수 있는 특수한 기능을 제공하기 위하여 설계되어지며, 제한적이고 개인적인 프로덕트나 또는 대규모 고객을 위한 프로덕트에 주안점을 두고 개발할 수 있다.

Ÿ   /모바일 애플리케이션(Web/mobile applications) : 네트워크 중심 소프트웨어의 범주에는 다양한 응용 분야가 있을 수 있으며, 브라우저 기반의 앱들과 모바일 기기들에서 동작하는 소프트웨어들을 모두 포함한다.

Ÿ   인공지능 소프트웨어(Artificial intelligence software) : 계산이나 직접적인 방법으로는 분석할 수 없는 복잡한 문제를 해결하기 위해 비수치적 알고리즘을 사용한다. 로보틱스, 패턴인식, 인공신경망 등을 분야로 들 수 있다.

  일부 새로운 시스템이 만들어지고 있지만, 대부분, 기존 애플리케이션이 수정되고, 적용되며, 개선되고 있다. 이처럼 지난 세대의 소프트웨어 종사자들이 각 범주 별로 유산을 남겨두었다. , 재사용성이 가능하도록 하여 새로운 시스템을 개발하는데 있어서 부담을 덜 수 있게 되었다.

 

1.3   레거시 소프트웨어

  레거시 소프트웨어란 과거에 개발되어 현재에도 사용 중인 낡은 소프트웨어를 말한다. 이는 현대까지도 남아 쓰이는 기술일 수도 있고, 쓰이지 않더라도 현대의 기술에 영향을 주는 경우도 있다. 보통 레거시 소프트웨어는 오래 전에 개발되어서 품질이 낮은 경우가 많다. , 확장 불가능한 설계, 매우 복잡한 코드, 문서화가 되어있지 않은 경우, 변경에 대한 기록이 없는 경우이다. 이 시스템이 "사업의 핵심 기능을 지원하며 사업상 꼭 필요한 것이다."라고 하면 어떻게 할 것인가?

  이 질문에 대해서 한 가지 적합한 해결책은 아무것도 하지 않는 것이다. 만약 레거시 시스템이 사용자의 요구를 만족시키고 믿을 수 있게 작동한다면 이 시스템은 고장 난 것이 아니며, 고칠 필요가 없다. 하지만 레거시 시스템은 다음과 같은 이유로 계속 진화한다.

Ÿ   새로운 컴퓨팅 환경이나 기술이 필요한 경우 소프트웨어가 이를 만족시키기 위해 적응 되어야만 한다.

Ÿ   사업상 새로운 요구를 만족시키기 위해 기능이 향상되어야 한다.

Ÿ   새로운 시스템이나 데이터베이스와 상호 운용될 수 있도록 소프트웨어가 확장되어야 한다.

Ÿ   진화하는 컴퓨팅 환경에서 실행 가능하도록 하기 위해 소프트웨어는 재설계되어야 한다.

  이런 식으로 점진적인 진화가 이루어지면 레거시 시스템은 새로운 환경에 맞게 재공학되어야 한다. 현대의 소프트웨어공학의 목표는 "진화 기초를 둔 방법론은 고안하는 것"이다. 진화 개념이란 소프트웨어는 계속적으로 변화한다는 것으로, 예전 소프트웨어와 새로운 소프트웨어 모두 서로 상호운용되어야 하고 서로 협력해야 한다는 것이다.

 

2.   소프트웨어 본질의 변화


  산업계를 지배하며 진화하고 있는 소프트웨어에는 네 가지 범주가 있고, 10여 년 전까지 초기 단계에 머물러 있었다. 하지만 오늘날 급격하게 변화하였으며 각각의 범주는 다음과 같다.

 

1.1           웹앱

  월드 와이드 웹은 하이퍼텍스트라는 기능에 의해 인터넷상에 분산되어 존재하는 온갖 종류의 정보를 통일된 방법으로 찾아볼 수 있게 하는 광역 정보 서비스 및 소프트웨어이다. 초기 단계에는 텍스트와 한정된 그래픽만을 사용하여 구성되어 있었다. 시간이 흘러, HTML(HyperText Markup Language)은 개발도구에 의해 확대되어 졌고, 정보 컨텐츠와 함께 계산 기능을 제공하는 것을 가능하게 하였다. 그로 인해 웹 기반 시스템과 응용프로그램(웹앱)들이 생겨났다.

  지난 10여 년 동안, 씨맨틱 웹(Semantic Web) 기술들(종종 Web 3.0으로 표현됨)은 계속 진화해왔다. 그로 인한 정교하고 복잡한 관계형 자료 구조는 이전에는 불가능했던 상이한 정보들에 대한 접근을 가능하게 함으로써, 완전히 새로운 웹앱을 만들 수 있는 길을 열어주었다.

 

  시맨틱 웹(Semantic Web) '의미론적인 웹'이라는 뜻으로, 현재의 인터넷과 같은 분산환경에서 리소스(웹 문서, 각종 화일, 서비스 등)에 대한 정보와 자원 사이의 관계-의미 정보(Semanteme)를 기계(컴퓨터)가 처리할 수 있는 온톨로지형태로 표현하고, 이를 자동화된 기계(컴퓨터)가 처리하도록 하는 프레임워크이자 기술이다. 웹의 창시자인 팀 버너스 리가 1998년 제안했고 현재 W3C에 의해 표준화 작업이 진행 중이다.

- '시맨틱 웹', 위키백과

 

1.2           모바일 앱

  (app)이란 모바일 플랫폼에서 동작하도록 제작된 소프트웨어를 뜻한다. 모바일 앱과 모바일 웹 응용프로그램 사이의 차이점을 인식하는 것은 중요하다. 모바일 웹 응용프로그램(WebApp)은 모바일 디바이스로 하여금 모바일 플랫폼의 장단점을 포함하도록 디자인된 브라우저를 통해 웹 기반의 컨텐츠에 대한 접근을 가능하게 해준다. , 모바일 브라우저를 통해서 실행되는 응용프로그램을 말한다. 반면에 모바일 앱은 특정 모바일OS에서 구동되는 것으로 하드웨어 특징들에 대한  직접적인 접근이 가능한 것을 말한다. 하지만 오늘날, 기술의 발전으로 브라우저들이 디바이스를 컨트롤 가능하게 되었기 때문에 모바일 앱과 모바일 웹 응용프로그램 간의 차이는 점점 흐려지고 있다.

 

1.3           클라우딩 컴퓨팅

  클라우딩 컴퓨팅은 모든 사용자들이 장소에 구애 받지 않고 광범위한 범위에서 컴퓨팅 장치를 사용하여 컴퓨팅 자원들을 공유하게 하는 인프라스트럭처 또는 "생태계"를 포함한다.

  클라우드 컴퓨팅의 구현은 프론트앤드와 백앤드 서비스들을 포함하는 구조의 개발이 필요하다. 프론트앤드는 클라이언트 디바이스와 백앤드 서비스에 대한 접근을 가능하게 해주는 응용 소프트웨어를 말한다. 백앤드는 서버와 관련 컴퓨팅 자원들, 데이터 저장 시스템, 서버에 상주하는 응용프로그램, 그리고 관리 서버들을 포함한다.

  클라우드 컴퓨팅은 소프트웨어가 전달되는 방식과 존재하는 환경을 바꿀 것이다.

 

1.4           프로덕트 라인 소프트웨어

  카네기 멜론 대학의 소프트웨어공학 연구소는 소프트웨어 프로덕트 라인을 "특정 시장 분야 또는 임무에 필요하며, 공통으로 관리되는 특징들을 공유하고, 규정된 방식에 따라 핵심 자산들로부터 개발된 일련의 소프트웨어 집약 시스템"으로 정의했다. , 프로덕트 라인 내의 모든 프로덕트들 사이에서 공통적인 컴포넌트, 아키텍처, 모델 등을 활용하여 재사용하고 개발 기간을 단축시켜 생산성을 높이고 품질이 좋은 소프트웨어를 개발할 수 있게 됨을 의미한다.


 

온도계 만들기

온도계 센서도 사용하고 세그먼트도 사용해보았다. 이제 두개를 이용하여 온도계를 만들어보고자 했다. 간단하게 생각하고 있었는데 문제는 브레드보드와 연결하는 중에 생각났다. 아두이노에 두개의 세그먼트를 연결할 핀이 부족했다.

7-세그먼트 2개를 이용해 2자리 숫자 출력하기

먼저 생각한 것은 논리회로 시간에 하던 것 처럼 진리표를 그려서 간략화 시켜서 해야겠다는 생각을 하였다. 하지만 기본키트에는 AND, OR게이트를 도와줄 칩이 없어서 할 수 없었고, 인터넷을 찾아보던중 한 동영상을 찾았다.

아두이노 강좌 - 8강-2 7 세그먼트 컨트롤하기(2자리 컨트롤 하기)

여기서는 두개의 세그먼트 가지고 반복적으로 출력함으로써 눈속임을 이용하였다. 이 코드를 이용해 조금 더 바꾸어서 다음과 같이 작성하였다.

byte seven_seg_digits[10][7] = { 
  { 0,0,0,0,0,0,1 },  // = 0
  { 1,0,0,1,1,1,1 },  // = 1
  { 0,0,1,0,0,1,0 },  // = 2
  { 0,0,0,0,1,1,0 },  // = 3
  { 1,0,0,1,1,0,0 },  // = 4
  { 0,1,0,0,1,0,0 },  // = 5
  { 0,1,0,0,0,0,0 },  // = 6
  { 0,0,0,1,1,1,1 },  // = 7
  { 0,0,0,0,0,0,0 },  // = 8
  { 0,0,0,1,1,0,0 }   // = 9
 };

void setup() {
  int pinNum = 2;
  // segment init
  for (pinNum = 2; pinNum < 10; pinNum++) {
    pinMode(pinNum, OUTPUT);
  }

  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);

  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
}

// 세그먼트에 한개의 숫자를 출력하는 함수
void sevenSegWrite(byte digit) {
  byte pin = 2;
  for (byte segCount = 0; segCount < 7; ++
    segCount) {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
}

// show number
// 0부터 99까지 출력하는 함수.
// 1번 세그먼트와 2번세그먼트를 반복적으로 
// 보여줌으로써 눈속임을 이용해 2자리 숫자를 나타낸다.
void showDigite(byte pNum) {
  int num1 = pNum / 10;
  int num2 = pNum % 10;
  int cnt = 100;

  if (num1 == 0) {
    while(0 < cnt--) {
      digitalWrite(0, HIGH);
      digitalWrite(1, LOW);
      sevenSegWrite(num2);
    }
  } else {
    while(0 < cnt--) {
      digitalWrite(0, LOW);
      digitalWrite(1, HIGH);
      sevenSegWrite(num1);
      delay(10);
      digitalWrite(0, HIGH);
      digitalWrite(1, LOW);
      sevenSegWrite(num2);
      delay(10);
    }
  }
}
void loop() {
  showDigite(80);
}

showDigite() 함수가 2자리 수를 출력하는 함수이다. 원리는 간단하다. 두개의 세그먼트가 같은 숫자를 보여주지만 한번은 왼쪽 세그먼트를 끄고, 또 한번은 오른쪽 세그먼트를 끄고 출력하여 그것을 반복하여 눈속임을 하는 것이다. 그것을 함수로 작성하려고하니 눈속임을 할 수 있을 정도 한번 보여줄때 100번 반복을 통해 두자리인것 마냥 보여준다.

디지털 온도계 만들기


위 사진은 회로도이다. (Fritzing 라는 프로그램으로 편하게 작성할수 있다. 링크)두 개의 세그먼트를  5V에 주지 않고 0번과 1번 핀에 주어진 것을 볼 수있다. 다음으로 온도값을 가져오면 된다. 이것은 센서를 이용하여 간단하게 알 수 있기때문에 어려움은 없었다. 센서를 연결하고 loop()에 다음과 같은 코드만 추가시켰다.

아두이노 온도 센서사용하기


int val = 0;

void loop() {
  int reading = analogRead(0);
  
  val = (reading * 500.0) / 1024.0;
  showDigite(val);
  
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  delay(1000);
}

결과 영상

마지막으로

보완해야할 점이 매우 많았다. 선을 너무 많이 사용해서 복잡한것도 있었고, 눈속임을 통해 보여주는 것이라 반복문을 돌고있는 중에는 다른 작업을 할수 없는것도 문제점이었다. 나중에 제대로 디지털온도계를 만들 때는 세그먼트 두개에 간략화를 해서 사용하던지, 그냥 2digit segment 를 사용해야겠다. 회로 연결하는 것은 어렵지 않았으나 코드를 작성할때 생각처럼 간단하지 않았던 실험이었다.


전체코드

Temperature.c


"본 제품은 아이씨뱅큐 무상체험단 21기 활동의 일환으로 체험 제품을 제공받아 작성되었습니다."

하나의 액티비티에 적용

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

전체 적용

<uses-permission android:name="android.permission.WAKE_LOCK"/>


7-세그먼트(SR-1056A) 사용하기

세그먼트 사용법을 알아보고자 한다. 먼저 사용되는 세그먼트는 SR-1056A로 다른 세그먼트와 핀이 다를 수도 있다. 세그먼트에 관한 정보는 링크를 통해서 확인하기 바란다.


출처 링크


회로 구성



프로그램 코드

byte seven_seg_digits[10][7] = { 
  { 0,0,0,0,0,0,1 },  // = 0
  { 1,0,0,1,1,1,1 },  // = 1
  { 0,0,1,0,0,1,0 },  // = 2
  { 0,0,0,0,1,1,0 },  // = 3
  { 1,0,0,1,1,0,0 },  // = 4
  { 0,1,0,0,1,0,0 },  // = 5
  { 0,1,0,0,0,0,0 },  // = 6
  { 0,0,0,1,1,1,1 },  // = 7
  { 0,0,0,0,0,0,0 },  // = 8
  { 0,0,0,1,1,0,0 }   // = 9
 };

void setup() {
  int pinNum = 2;
  // segment init
  for(pinNum = 2; pinNum < 10; pinNum++) {
    pinMode(pinNum, OUTPUT);
  }
  writeDot(0); // start with the "dot" off
}

void writeDot(byte dot) {
  digitalWrite(9, dot);
}

void sevenSegWrite(byte digit) {
  byte pin = 2;
  for (byte segCount = 0; segCount < 7; ++segCount) {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
}

void loop() {
  for (byte count = 10; count > 0; --count) {
    delay(1000);
    sevenSegWrite(count - 1);
  }
  delay(4000);
}


실험결과

0부터 1까지 카운트하는 코드로, 아주 잘 출력되었다. 2자리 숫자를 표현하려고했는데 핀에 꼽을 선이 너무많아 다른 방법을 찾아보아야겠다.


"본 제품은 아이씨뱅큐 무상체험단 21기 활동의 일환으로 체험 제품을 제공받아 작성되었습니다."

+ Recent posts