2017년 7월 12일 수요일

IoT 사물인터넷 : PaaS 01(클라우드 기반 개발인프라)

PaaS (클라우드 기반 개발인프라)
: 가상으로 저장공간을 생성해놓고 저장공간을 활용하는 방법.
개발시 네트워크 연결 인프라부터 어프릴케이션 실행을 위한 런타임까지 제공되며,
사용자는 어플리케이션과 데이터만 관리합니다.

대표 PaaS 서비스 종류

서비스






IBM Bluemix
Azure(MS)
Amazon
WebService의
(AWS Beanstalk)
Google
Cloud Platform의
(Google App Engine)
설명
개발회사에
충실히
제공해주는
플랫폼
 
대학생들 교육용으로 출발
기업들에게 마케팅
클라우드 장비대여로 시작
기업위주의 서비스 제공
 
장비부터
시작하다보니
기반이
튼실하지만
비용이 높음
 
현재 클라우드 시장 1등 기업
 
구글 자체의 언어를 사용함에도 불구하고
이미지 효과를
잘 활용하여
국내의 회사들이 다수 사용 중.
사후처리도 양호.

+
서비스
 
 
 
CloudFoundry
OpenShift
Docker
설명
VMWare사에서 처음 시작한 프로젝트로 제품자체는 오픈소스지만 컨트롤하기 어려워서 Pivotal PCF/PWS에서 기능을 추가해서 유료로 판매.
레드햇에서 만든 것으로 무료로 제공.
VMWare의 단점을 보완하기 위해 
만들어진 것으로 하나의 os를 공유해서 쓴다.
, 리눅스만 지원함.
(리눅스의 같은 파일시스템의 환경을 들고 와서 쓸 수 있다는 말.)


(부가적인 설명 : http://www.insunginfo.co.kr/upfiles/PdsBoard/PdsFile/OpenCloud%EC%9D%B4%ED%95%B4(3).pdf, p.8)

PaaS란?
왼쪽부터 기존의 프로그램- IaaS-PaaS-SaaS순으로 나열되어 있고
그림에서 보는것과 같이 노란색으로 칠해진 부분이 개발자가 직접 설치/설정해야 하는 부분이다.

Standard는 처음부터 모두 설치하고 설정해주어야 한다.
IaaS는 VMware같은 존재로 위의 그림에서는 os가 빠져있지만 os까지 포함되어 지원되는 경우도 존재한다. 서비스마다 다르게 지원하기 때문이다.
PaaS는 어플리케이션 부분을 개발하는 부분이다. os는 당연히 신경쓰지 않아도 되는 공간이다.
SaaS는 왜 개발자가 실행하는 부분이 없는걸까? 바로 사용자의 공간이기 때문이다. 예시로는 이미 개발되어 사용자에게 제공되는 네이버, 다음의 이메일 서비스 같은 존재이다.

다음은 환경비교를 캠핑하는 경우로 비유를 한 모습이다.

Standard
IaaS
PaaS
SaaS
 

 무인도

 캠핑
 글램핑
호텔 

PaaS의 활용사례?
국내 : 레진코믹스, 사운드 그래프 -> 구글클라우드 기반의 PaaS를 사용한 사례
국외 : 위의 4대 업체 + 정부 공공기관(미국, 일본, 영국에선 정부중심의 클라우드서비스가 구축되어 제공되고 소비되고 있음) + (독일은 산업현장을 중심으로 빠른 전환이 일어나고 있음.)
∴ 우리나라는 정부차원에서 다음과 같은 PaaS-TA(파스타)가 구성되어 앞으로의 빅데이터 시대가 열릴 것으로 전망 됨

왜 PaaS를 쓰는 걸까?
위 그림과 같이 개발비용이 감소한다는 것을 알 수 있음

PaaS의 향후 전망

공공분야, 대기업
금융
산업현장
의료
서버 전산실을 유지하는데 잡아먹는 비용을 축소하기 위해 PaaS활용
금융회사 역시 서버 전산실을 유지하는데 잡아먹는 비용을 축소하기 위해 PaaS활용
스마트 팩토리 구축으로 인해 많은 데이터를 처리하는데 많은 비용이 들면서 PaaS활용
병원 역시 병원 내부의 서버가 존재하고 유지비용을 줄이기 위해 활용가능하고 환자들의 원격진료를 하기 위한 처리를 수월하도록 도와줌
PaaS환경을 이용한 IoT 어플리케이션 시연

본래는 측정장비에서 서버로 올라간 정보를 확인했다면, 서버로 올라간 정보를 클라우드로 올려서 동시에 여러명이 접근하여 확인할 수 있도록 만든 서비스


PaaS 기반 어플리케이션 개발 흐름
1. 사이트마다 다르지만 계정 생성을 통해 계정을 생성한다
(현재 글에서는 startiot.or.kr을 이용하도록 한다.)
2. 프로그램을 개발한다.
(언어는 많이 쓰는 언어들을 지원하는데 현재 일반적으로 사용하는 언어는 대부분 지원한다고 볼 수 있다. C, JAVA, Python 등등)
3. 배포과정을 통해 클라우드로 올려 사이트 주소로 외부에서도 접근가능해진다.


2017년 6월 30일 금요일

Python Programming Basic(파이썬 프로그래밍 기본) 01 : 함수, 임포트, 클래스


개발환경 : Window8.1, Python3.4.2, PyCharm CommunityEdition(64)

(1)프로젝트 생성
<ASCII(Python2), UTF-8(Python3)은 인코딩 선언없이 사용가능>
인코딩을 원하는경우, #-*-coding:utf-8-*-

1. SimpleGame01.py (기본소스)
1
2
3
4
5
6
7
8
print("hello")
= input("Guess the number: ")
guess = int(g)
if guess == 5:
    print("YOU WIN!")
else:
    print("YOU LOSE!")
print("GAME OVER!")
cs
2. SimpleGame02.py ( SimpleGame01 + 함수사용)
   : 추가된 내용은 뒤에 #new line을 추가 해놓았음.
     단순히 1번의 소스를 def안으로 넣어주면 끝!

1
2
3
4
5
6
7
8
9
10
11
def guess_number(): #new line
    print("hello")
    g = input("Guess the number: ")
    guess = int(g)
    if guess == 5:
        print("YOU WIN!")
    else:
        print("YOU LOSE!")
    print("GAME OVER!")
guess_number()#new line
cs


3. SimpleGame03.py(SimpleGame02 + 메인함수사용)
   : 추가된 내용은 뒤에 #new line을 추가 해놓았음.
    단순히 2번 내용에서 함수를 부르고 있는 부분을 main thread를 생성하는 부분에 넣어주면, 끝!
     C나 Java를 배웠다면, void main(), public static void main(String []argv)부분과 같다고 생각하고 넘어가자!
1
2
3
4
5
6
7
8
9
10
11
12
def guess_number():
    print("hello")
    g = input("Guess the number: ")
    guess = int(g)
    if guess == 5:
        print("YOU WIN!")
    else:
        print("YOU LOSE!")
    print("GAME OVER!")
if __name__ == "__main__"#new line
    guess_number()
cs

4. SimpleGame04.py (임포트하여 사용하는 방법)
   : Lesson01 패키지안의 SimpleGame02파일안의 guess_number. 즉 함수를 import시키는 문장으로 다음을 실행하게되면, guess_number()를 두번 실행하게된다.
1
2
3
4
from Lesson01.SimpleGame02 import guess_number
guess_number()
cs

왜나하면,SimpleGame02파일안을 보면, 마지막에 guess_number()를 부르고 있기 때문이다. 

1
2
3
4
5
6
7
8
9
10
11
def guess_number(): #new line
    print("hello")
    g = input("Guess the number: ")
    guess = int(g)
    if guess == 5:
        print("YOU WIN!")
    else:
        print("YOU LOSE!")
    print("GAME OVER!")
guess_number()#new line
cs
하지만, SimpleGame03을 부르면 main안에서 부르고 있기 때문에 한 번 더 실행되지 않는다. 즉, main안에서 호출하고 있는 부분은 함께 호출되지 않는다.
만약, 다음과 같이 작성해서 두 번째와 같이 import만 한다면, def guess_number()밑에서 호출하고 있는 guess_number()를 실행하고 프로그램이 종료된다.
그렇다면 guess_number()를 호출해보자면, 오류가 발생한다. 
즉, SimpleGame03코드를 최초 한 번씩 실행하지만, main은 무시 + 최초 이후로는 guess_number2()만 사용할 수 있다.
왜냐하면, guess_number2()만 import했기 때문에!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def guess_number():
    print("hello")
    g = input("Guess the number: ")
    guess = int(g)
    if guess == 5:
        print("YOU WIN!")
    else:
        print("YOU LOSE!")
    print("GAME OVER!")
guess_number()
def guess_number2():
    print("hello2")
    g = input("Guess the number: ")
    guess = int(g)
    if guess == 5:
        print("YOU WIN!")
    else:
        print("YOU LOSE!")
    print("2GAME OVER!")
if __name__ == "__main__"#new line
    guess_number()
cs

1
from Lesson01.SimpleGame03 import guess_number2
cs
1
2
3
from Lesson01.SimpleGame03 import guess_number2
guess_number() #ERROR
cs

5. SimpleGame05.py(SimpleGame03 + 클래스사용)
클래스를 적용하여 소스를 작성하였다. 다음의 소스는 맞는걸까? 정답은 "틀렸다."
다음과 같은 오류가 발생한다.






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ERROR SOURCE
class choose_numer():
    def guess_number(self):
        print("hello")
        g = input("Guess the number: ")
        guess = int(g)
        if guess == 5:
            print("YOU WIN!")
        else:
            print("YOU LOSE!")
        print("GAME OVER!")
if __name__ == "__main__"#new line
    choose_numer.guess_number()
cs

그렇다면, 어떻게 작성해야할까?

5-1. static method사용
     static method사용를 사용하면, self없이 같은 소스라도 실행이 가능하다.
     하지만, 추천하지 않는 방식이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class choose_numer():
    @staticmethod #new line
    def guess_number(): #new line
        print("hello")
        g = input("Guess the number: ")
        guess = int(g)
        if guess == 5:
            print("YOU WIN!")
        else:
            print("YOU LOSE!")
        print("GAME OVER!")
if __name__ == "__main__":
    choose_numer.guess_number()
cs

5-2. 클래스를 생성하고 부르는 방법사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class choose_numer():
    def guess_number(self):
        print("hello")
        g = input("Guess the number: ")
        guess = int(g)
        if guess == 5:
            print("YOU WIN!")
        else:
            print("YOU LOSE!")
        print("GAME OVER!")
if __name__ == "__main__"
    game = choose_numer() #new line
    game.guess_number() #new line
cs
위와 같이 간단히 def함수를 넣고 끝낼 수도 있지만, 처음 Python을 배우는 단계라면 class에 대해 좀 더 자세히 알아보자.

play2! + scala 개발환경 구축하기


1. database
이 부분은 헷갈릴 것 같아서 정리를 해두자.

먼저 개발환경은 Linux 16.04 , Xenial + Play!(2.2.6) + scala(version 2.11.6 )

+ mysql(ver 5.7.17-0ubuntu0.16.04.2 (Ubuntu))
+ mysql_connector(/usr/lib/jvm/java-8-oracle/lib) --> 나같은 경우는 이곳에 있지만, 각자 jvm아래의 java가 설치된 곳의 lib으로 들어가서 거기에 connector를 넣어주면 인식한다.

참고로 jdk도 설치해야 되는데 버전을 확인하는 특별한 방법은 없고 본인이 적용한 곳으로 가면되는데 일반적으로 jdk이므로 jvm 아래 어딘가에 있을 것이다.(ex . /usr/lib/jvm/)

mysql download :
$ sudo apt-get update
$ sudo apt-get install mysql
#root 비밀번호 설정하라는 창이 뜨면 설정해주고 "ok"

$ sudo mysql_secure_installation
설치후 이것을 통해 보안 정도를 결정할 수 있습니다. 각자 영어 설명을 보고 잘 선택해주세요. 참고로 비밀번호 설정보안을 너무 높여놓으면 사용자를 만들 때 괴롭습니다.

$ mysql -u root -p
$ CREATE USER 'haei'@'localhost' IDENTIFIED BY 'haei';
이런식으로 사용자를 만들어줍니다.
$ GRANT ALL PRIVILEGES ON * . * TO 'haei'@'localhost';


#참고로 위의 비밀번호 설정보안을 나중에하겠다고 본인은 중간에 강제종료 시켰는데 기본 설정으로 인해서 보안정도가 'MEDIUM'으로 설정되어 비밀번호 설정에 애를 먹었다.
만약 "ERROR 1819 (HY000): Your password does not satisfy the current policy requirements" 가 뜬다면, 다음의 명령어를 실행시킨다음, 다시 사용자를 만들어보자.

$ mysql -h localhost -u root -p
$ uninstall plugin validate_password;

이 사진과 같이 play new 로 생성한 프로젝트로 가면, build.sbt가 존재한다. 이를 다음과 같이 수정한다.


그리고 conf/application.conf 내용을 다음과 같이 수정해준다.참고로username과 password는본인의 정보로 바꾸도록한다.

만약 이렇게 하고 play run 에 문제가 없으면 db적용에는 문제가 없다는 의미이다.