2018년 11월 28일 수요일

운영체제 정리

운영체제

컴퓨터의 사용자와 하드웨어 사이에서 중재자 역할을 하는 프로그램
자원(cpu, 메모리, 하드)를 효율적으로 관리, 입출력 제어

유저 - 응용프로그램 - 운영체제 - 하드웨어

일괄 프로그램 처리 시스템

한번에 모어서 실행함 -> idle 상태가 많아짐
상호작용 (게임, 잦은 입출력)이 필요없는 큰 단위의 작업에서 수행


다중 프로그램 처리 시스템

cpu가 수행할 작업을 항상 가짐
하드나 ssd에서 여러개의 프로그램을 ram에 올리고 차례대로 실행( idle상태일 때 까지)


시분할 시스템

다중 프로그래밍을 확장함, 아주 짧은 주기로 cpu를 각각의 프로그램에 할당함
(리눅스에서 여러 사용자가 동시에 프로그램을 실행함)
현재 운영체제는 다중과 시분할이 적절히 사용됨


단어 

프로세스 - 실행중인 프로그램
idle - cpu가 쉬는 상태
작업 스케줄링 - 보조기억장치(하드, ssd)에 프로그램이 저장되어 있고 일부를 선택해서 메모리에 적재하는 전략
cpu 스케줄링 - 메모리에 올라온 작업들 중에서 무엇을 실행할지 고르는 전략


다중 처리 시스템 

cpu가 여러개, cpu끼리 통신

대칭적 다중 처리 - 각 cpu가 동등한 위치, 하나가 고장나도 속도가 느려질뿐
비대칭적 다중 처리 - 각 cpu마다 역할이 있고, 메인 cpu가 시스템을 제어

분산 처리 시스템

네트워크를 통해 작업을 처리, 각 cpu는 메모리를 공유하지 않않음, 속도 신뢰 증가
(클라이언트 - 서버, p2p시스템)

클러스터 시스템 

물리적으로 많은 cpu를 한곳에 모아 특정한 작업을 수행, LAN으로 서로 연결됨
대칭적, 비대칭적 특징을 가짐

실시간 시스템 

cpu 동작을 즉시 처리할 때 ( 명령을 했을 떄 우선순위에 밀리지 않음)
연성 실시간 시스템 - 우선순위를 가지로 빠르게 계산, 절대적으로 시간만을 중요시하지 않음
( 음악을 들을 때 렉이 걸려도 음악은 계속 재생 )
경성 실시간 시스템 - 빠른시간이 절대적으로 요구되는 시스템 ( 무기, 의학 )


컴퓨터 작동 과정


cpu와 각 장치들은 서로 연결되어 메모리를 공유
각각의 장치는 장치제어기가 작업을 도와주며 모든 기계들은 동기화됨

1. 전원이 켜질 떄 ROM에 저장된 초기 프로그램 실행
2. 초기 프로그램은 메모리, cpu 레지스터 등을 초기화
3. 운영체제를 메모리에 적재
4. 운영체제는 첫 번째 프로세스를 실행
5. 인터럽트가 발생하면 cpu가 각종 작업을 처리

인터럽트 
입출력 종료, 예외, 서비스를 요구할 때 발생하는 이벤트
인터럽트가 발생하면 cpu는 현재 일을 중단하고 인터럽트를 처리함 -> 서비스 루틴
시스템 스텍에 현재 하던 일을 저장하고 인터럽트를 처리함
( 키보드 입력, 마우스 입력 등등)

인터럽트는 서비스 루틴의 주소를 가리키는 포인터로 구성된 벡터 테이블을 참조함
참조된 포인터가 가리키는 인터럽트 처리 루틴을 호출하여 인터럽트 처리

인터럽트가 실행되고 있을 때 다른 인터럽트가 발생하면 대기 시킴
( 우선순위로 대기하고 있는 인터럽트 순서를 조절)


입출력 시스템

1. cpu가 장치 제어기의 레지스터에 명령을 적재 ( scanf 업무 부여 )
2. 장치 제어기는 레지스터 내용을 읽고 수행할 동작 검사 ( scanf 업무 읽음)
3. 레지스터에서 읽기 명령이 내려오면 입력 장치에게 읽기 신호를 보냄( 키보드에 신호)
4. 입력 장치는 데이터를 읽어서 버퍼에 저장 (데이터를 읽고 버퍼에 저장)
5. 제어 부분은 cpu에 인터럽트를 발생시킴 (인터럽트를 발생 시켜 cpu가 버퍼를 읽도록함)
6. cpu가 버퍼에서 데이터를 읽음 (cpu가 데이터를 읽음)


저장장치 구조

주기억장치(RAM)
프로세스가 올라가는 공간, cpu가 접근할 수 있는 대량 저장 장치
워드는 cpu가 한번에 처리할 수 있는 단위
(32bit운영 체제는 워드의 단위가 32bit)
cpu는 레지스터와 RAM만 접근이 가능함(저장장치 중)

보조기억장치(하드,ssd)
데이터를 영구히 저장
프로그램을 실행하면 필요한 부분을 RAM에 적재
https://wkdtjsgur100.github.io/os-summary-process/
http://luckyyowu.tistory.com/134?category=751813
http://ournotes.tistory.com/58























2018년 11월 27일 화요일

정렬 알고리즘

https://github.com/kimdonwon/Algorithm

삽입정렬

시간 복잡도 n*n
n*n 정렬준 가장 효율이 좋음
정렬이 어느정도 되어있는 상태는 삽입 정렬이 가장 빠름

퀵 정렬

시간 복잡도 n*logn
정렬 중에 평균적으로 가장 빠름 (logn은 거의 상수)

이미 정렬이 된 배열은 최악의 경우 n^2이 나옴
정렬이 어느정도 되어있으면 삽입 정렬이 더 빠름
-> 그냥 sort함수가 제일 빠름

1. 첫번 째 값을 기준으로 정함
2. 기준보다 큰 값을 왼쪽에서부터 찾음
3. 기준보다 작은 값을 오른쪽에서부터 찾음
4. 찾은 값들이 엇갈리지 않았으면 값 끼리 바꿈
5. 엇갈렸으면 작은값과 기준을 바꿈
6. 기준으로 왼쪽은 작은값 오른쪽은 큰값으로 정렬됨
7. 기준으로 왼쪽과 오른쪽을 다시 퀵 정렬


합병 정렬


시간 복잡도 n*logn 을 보장함
일단 반으로 쪼개고 나중에 합침

1. 배열의 요소가 1개가 될 때까지 반으로 계속 쪼갬
2. 배열의 두 덩어리를 비교하고 합침
3. 반복


힙 정렬


시간 복잡도 n*logn을 보장함
1. 힙 구조로 만든 후 첫번째 값과 마지막 값을 바꿈
2. 반복

힙 - 완전 이진트리에서 최대힙, 최소힙을 적용한 것
최대힙 - 부모가 자식보다 큼
최소힙 - 부모가 자식보다 작음

힙 생성 알고리즘 - 힙을 만들어줌, 전체에 절반만 확인하면 됨, logn















2018년 11월 26일 월요일

자바 스프링 프레임워크

스프링 프레임워크

자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케션 프레임워크

DI

의존성 주입 ( 클래스에 다른 객체를 만들지말고 생성자로 입력 받음 )
의존성 내용을 xml에 저장하고 자바에서는 xml를 파싱함
      • 생성자를 이용한 의존성 삽입
        • 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통해 의존성 주입
        • 생성자에 파라미터를 만들어 주고 이를 통해 DI 컨테이너가 의존할 오브젝트 레퍼런스를 넘겨주는 방식
                                     
      • setter() 메소드를 이용한 의존성 삽입
        • 의존성을 입력받는 setter 메소드를 만들고 이를 통해 의존성을 주입
        • Spring에서 지지하는 DI 방식
                                    


출처: http://jinpyo900.tistory.com/55 [Computer Science ]

IOC

제어역전, 작은 부품부터 큰 부품으로 만듬 ( 작은 부품으로 조립함 )

AOP

관점 지향 프로그래밍 ( 객체 결합도를 낮춤 )


Spring MVC

  • 일반적인 MVC 구조와 Spring MVC 구조는 다르다 ==> DispatcherServlet
  • Spring MVC는 DispatcherServlet 등장으로 web.xml의 역할이 축소
    • DispatcherServlet이 해당 어플리케이션으로 들어오는 요청을 모두 핸들링하기 때문
  • DispatcherServlet을 이용한다는 것은 Spring에서 제공하는 @MVC를 이용하겠다는 뜻
    • Model, View, Controller 설계영역을 노골적으로 분할하여 사용자가 무조건 MVC로 어플리케이션을 설계하게 끔 유도
    • @MVC라는 이름 하에 DispatcherServlet 클래스를 web.xml에 등록하는 방식으로 사용
      • @MVC는 설계 자체를 model1 방식으로 할 수 없게 만드는 데다, model2 방식을 쉽게 만들 수 있도록 환경 구성
               
    • 1. 처리요청 (URL)
      • 클라이언트가 해당 어플리케이션에 접근하면, 접근한 URL 요청을 DispatcherServlet이 가로챔
      • web.xml에 등록된 DispatcherServlet의 <url-pattern>이 ‘/‘와 같이 해당 어플리케이션의 모든 URL로 등록되어 있기 대문에 요청을 가로챌 수 있다
    • 2. 요청 URL과 매핑되는 Controller 검색
      • 가로챈 정보를 HandlerMapping에게 보내 해당 요청을 처리할 수 있는 Controller를 찾아냄
    • 3. 처리요청
      • HandlerMapping이 해당 요청을 처리할 Controller를 찾아냈다면, 요청을 Controller에게 보내줌
      • 이 Controller는 사용자가 직접 구현해 주는 부분
    • 4. ModelAndView 리턴
      • 해당 요청을 처리한 후, Controller는 요청을 응답받을 View의 이름을 리턴
    • 5. ViewResolver
      • 4번에서 View의 이름을 리턴할 때, View 이름을 ViewResolver가 먼저 받아 해당하는 View가 존재하는지 검색
    • 6. 응답출력
      • 해당 View가 있다면 처리 결과를 View에게 보냄
    • 이후
      • 이 결과를 다시 DispatcherServlet에 보낸 후, DispatcherServlet은 최종 결과를 Client에 전송


출처: http://jinpyo900.tistory.com/55 [Computer Science ]



SOLID 법칙




  • SRP - 단일 책임의 원칙 (Single Responsibility Principle)
    • 작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어 있어야 한다.
    • 즉, 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐 이어야 한다
  • OCP - 개방 폐쇠의 원칙 (Open Close Principle)
    • 변경을 위한 비용은 가능한 줄이고, 확장을 위한 비용은 가능한 극대화
    • 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다
    • OCP를 가능케 하는 중요 메커니즘은 추상화와 다형성
  • LSP - 리스코브 치환의 원칙 (The Leskov Substitution Principle)
    • 서브 타입은 언제나 기반 타입과 호환될 수 있어야 한다
  • ISP - 인터페이스 분리의 원칙 (Interface Segregation Principle)
    • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아햐 한다는 원리
    • 즉, 어떤 클래스가 다른 클래스에 종속될 때에 가능한 최소한의 인터페이스만을 사용
  • DIP - 의존성 역전의 원칙 (Dependency Inversion Principle)
    • Inversion of Control


  • 출처: http://jinpyo900.tistory.com/55 [Computer Science ]



    11/28
    스프링 세팅 완료... 이클립스에서 진행하려다가 실패해서
    STS 새로 깔고 했더니 됨.
    역시 환경세팅이 제일 어렵다.
    https://hanazuou.tistory.com/158?category=695437



    http://all-record.tistory.com/175

    junit 

    자바에서 테스트를 도와주는 프레임워크
    스프링에서 초기에 DB,myBatis를 연결할 때 테스트하기 위해 사용

    myBatis 

    JDBC 작업시 반복되는 코드를 줄이고 SQL문을 처리하기 위함

    스프링 패키지 설명

    VO - 데이터를 저장할 폼 (빈)
    DAO - 데이터를 실제로 처리함
    Service - 컨트롤러에서 넘겨 받아 DAO로 알맞게 전달
    Controller - 사용자의 요청에 맞게 Service를 실행
    mapper.xml - myBatis에 SQL 쿼리를 매핑함
    myBatis-config.xml - 기본 설정, VO 설정
    root-context.xml - DB,mybatis 기본 설정, mapper 위치 설정, sqlSession 설정
    sqlSession - 트랜잭션 관리함 , 개발자가 직접 DB연결, 종료를 관리할 필요가 없음















    2018년 11월 21일 수요일

    서블릿 정리

    WAS

    웹 애플리케이션 서버
    다양한 기능을 수행하는 로직을 담당하는 컨테이너(서블릿,jsp)를 분담
    (서블릿, JSP, ASP, PHP)

    서블릿

    자바플랫폼에서 컴포넌트(독립적 단위 모듈)를 기반으로하는 WAS의 핵심 기술

    특징
    - 생명주기 : init() 서블릿이 실행시 한번 실행
                    service() 사용자 요청시 매번 실행 (get, post)
                    쓰레드 단위로 실행 됨
    - 서버에서 컨테이너에 의해 실행

    GET
    정보를 헤더의 URI에 추가, 문자열 노출, 길이 제한, 한글 가능

    POST
    정보를 바디에 추가, 노출 X, 제한 X, 인코딩/디코딩이 필요

    필터
    클라이언트로 부터 서블릿이 요청되어 수행될 때 필터링(로그, 보안, 인증, 부가기능)
    서블릿이 호출되기 전 요청을 가로챔
    서블릿이 호출된 후 응담을 가로챔


    HTTP

    브라우저 <-> 서버 프로토콜
    Stateless - 처리가 끝난 데이터는 유지가 안됨 -> 저장기술 필요

    1. servletcontext
    서버 정보 추출, WAS 단위 정보 공유

    2. cookie
    클라이언트 단위 정보 공유, 클라이언트 쪽에 저장

    3. session
    상태정보를 서버에 저장, 유지, 브라우저에 세션 ID를 쿠키로 보냄


    JSP

    HTML과 같은 일반적인 텍스트 구조 (웹 개발자들이 이해하기 쉽게 하기위해 나옴)
    JSP 컨테이너에 의해 서블릿 형태의 자바 소스로 변환

    JSP -> .java -> .class -> 서블릿 컨테이너

    주석
    <%-- --%>


    JSP 자바빈즈
    JSP 표준 액션 태그, 폼 데이터 처리 용이



    JDBC

    java database connectivity
    다양한 종류의 RDB 자업할 때 사용하는 표준 API

    JDBC 프로그램  ->  JDBC인터페이스  ->  JDBC 드라이버  -> DB

    문제점 - connection 과정은 일정 시간이 필요, 서버 자원 낭비 증가

    connection pool - 웹 앱 전에 웹 서버에서 미리 준비, 필요할 때마다 사용
                            (connection 들을 관리하는 서버 자원)

    MVC

    view - 클라이언트가 보는 화면
    controller - 요청을 받아 유효성 검사 후 서비스로 넘김
    model - 서비스처리 및 DB처리

    Front Controller - 대표 controller가 모든 요청을 받음 ( 관리가 쉬워짐)



























    2018년 11월 18일 일요일

    백준 알고리즘 DP ( 11052 번)

    https://www.acmicpc.net/problem/11052


    문제 해결

    문제를 작은 문제로 쪼갤 수 있어야함

    각각의 가격은 a(i)
    n개의 가격의 최대값을 d(i)

    n개의 가격의 최대값은
    d(i) = MAX( a(j) + d(i-j) )

            for (int i=1; i<=n; i++) {
                for (int j=1; j<=i; j++) {
                    if (d[i] < d[i-j] + a[j]) {
                        d[i] = d[i-j] + a[j];
                    }
                }
            }

    d[1] 부터 최대값을 저장해감
    d[1]의 최대값은 d[0]+a[1]
    d[2]의 최대값은 d[1]+a[1] 또는 d[0]+a[2]
    d[3]의 최대값은 d[2]+a[1] 또는 d[1]+a[2] 또는 d[0]+a[3]
      .
      .
      .
    d[n]의 최대값은 d[n-1]+a[1] ... d[0]+a[n] 중 하나



    2018년 11월 12일 월요일

    ELK Stack 정리

    elasticsearch + logstash + kibana
    사용하여 데이터 분석 및 시각화

    1. Logstash 

    실시간 파이프라인 기능을 가진 오픈소스 ( 데이터를 모아 일레스틱서치에 저장함 )
    플러그를 사용해 웹, DB, 파일 등에서 데이터를 실시간으로 수집하고 전달함

    2. Elasticsearch

    분산형 Restful 검색 및 분석 엔진 (데이터 저장 및 탐색이 빠름)

    3. Kibana

    일레스틱서치로 분석한 데이터를 시각화 해줌




    11/12
    logstash로 csv파일을 읽어 elasticsearch에 형식에 맞게 저장함
    nori 플러그인을 사용하여 elasticsearch에서 형태소 분석함
    kibana에서 데이터 검색 및 보여줌

    현재 6만개의 영화 데이터를 넣음
    영화명에 nori 플러그인을 적용하여 검색할 때 형태소 분석을 해줌
    kibana에서 검색까지 성공


    11/13
    kibana로 데이터 시각화함



    매핑, 로그스태시 코드

    input {
      file {
        path => "/home/metanet/MOVIE.csv"
        start_position => "beginning"
       sincedb_path => "/dev/null"
      }
    }
    filter {
      csv {
          separator => ","
    #Date,Open,High,Low,Close,Volume (BTC),Volume (Currency),Weighted Price
         columns => ["영화명","영화명(영문)","제작연도","제작국가","유형","장르", "제작상태" ,"감독"]
      }
    }
    output {
       elasticsearch {
         hosts => "http://localhost:9200"
         index => "moviett"
      }
    stdout {}
    }









    curl -X PUT "localhost:9200/moviett" -H 'Content-Type: application/json' -d'
    {
      "mappings": {
        "_doc": {
          "properties": {
            "영화명":    { "type": "text","analyzer":"nori"  },
            "영화명(영문)":     { "type": "text"  },
            "제작연도":      { "type": "integer" }, 
            "제작국가":     { "type": "text"  },
        "유형":     { "type": "text"  },
        "장르":     { "type": "text"  },
        "제작상태":     { "type": "text"  },
        "감독":     { "type": "text"  },
        "제작사":     { "type": "text"  },
          }
        }
      }
    }
    '





    curl -X POST "localhost:9200/movies/_search?routing=이름" -H 'Content-Type: application/json' -d'
    {
        "query": {
            "match" : {
                "영화명" : "이름"
               
            }
        }
    }







    2018년 11월 10일 토요일

    파이썬 웹 크롤링

    requests 모듈을 사용하여 쉽게 크롤링 가능
    bs4를 사용하여 html 셀럭터로 접근 가능
    import requests
    from bs4 import BeautifulSoup



    웹 크롤링 할 때 그냥 보내면 네이버가 검색을 차단함
    그래서 검색하는 컴퓨터가 사람이라고 알려야함
    headers = {'User-Agent':'Mozilla/5.0', 'referer' : 'http://www.naver.com'}


    웹 크롤링 쓰레드 사용
    import threading

    t = threading.Thread(target=clickMe)
    t.start()



    랜덤 시간 만큼 멈춤
    from random import random

    n = random()
    time.sleep(n+0.4)




    11/11 -> user-agent 를 수정해도 결국 차단됨
    11/12 -> fake user-agent를 사용, 난수 사용 ( 아직 차단은 안 당했는데 테스트 더 해야함 )
    head = {'User-Agent': str(ua.random), 'referer': 'http://www.naver.com'}

    최종 -> fake user-agent 사용, referer 제거 ( 차단 안 당함)
    head = {'User-Agent': str(ua.random)}




    코드


    import time
    
    import requests
    from bs4 import BeautifulSoup
    from openpyxl import Workbook
    
    search = "취성패"start = 20181108end = 20181108batch = 2headers = {'User-Agent':'Mozilla/5.0', 'referer' : 'http://www.naver.com'}
    c = 1wb = Workbook()
    ws = wb.active
    ws['A1'] = '주소'wsc=2urldata = []
    def req(st,en,se,cc) :
        req = requests.get("https://search.naver.com/search.naver?f=&fd=2&filetype=0&nso=so%3Ar%2Ca%3Aall%2Cp%3Afrom"+str(st)+"to"+str(en)+"&query="+se+"&research_url=&sm=tab_pge&start="+str(cc)+"&where=webkr", headers=headers)
        html = req.text
        soup = BeautifulSoup(html, 'html.parser')
        return soup
    
    def getUrl(my_titles) :
    
        for title in my_titles:
            urldata.append(title.text)
    
    
    
    
    
    while start <= end :
        print("날짜 :" + str(start) + " 웹 크롤링 중")
        currentpage=1    soup =req(start,end,search,currentpage)
        count = soup.find('span', class_='title_num')
    
    
        if ('/' in count.text):
            c = int(count.text.split('/')[1].split('건')[0])
        else:
            c = 1
        while currentpage<=c :
            soup = req(start, end, search, currentpage)
            my_titles = soup.find_all('a', class_='txt_url')
            getUrl(my_titles)
            currentpage=currentpage+10        time.sleep(0.5)
    
        start = start + batch
        break;
    
    urldata=list(set(urldata))
    for data in urldata :
        ws['A'+str(wsc)]=data
        wsc=wsc+1
    wb.save('result.xlsx')

    2018년 11월 9일 금요일

    괄호 검사 기본문제

    괄호검사를 하는 알고리즘
    - stack으로 해결

    package test2;
    import java.util.Scanner;
    import java.util.Stack;
    public class Main {
     static int tree[][];
     static int t[][];
     static int n;
     static int check[];
     public static void main(String[] args) {
       
      Stack<Character> st = new Stack<Character>();
      Scanner sc = new Scanner(System.in);
     
      String temp = sc.next();
     
      for(int i=0;i<temp.length();i++) {
       if(temp.charAt(i)=='(')st.push('(');
       else {
        if(st.isEmpty()) {
         System.out.println("false");
         return;
        }
        st.pop();
       }
      
      }
      if(st.isEmpty())
      System.out.println("true");
      else System.out.println("false");
     
     
     
     }

    }

    시간 복잡도

    LogN
    큰 문제를 일정한 크기로 작게 쪼갤때 ( 검색알고리즘, 이진탐색 )

    NLogN
    일정한 크기를 갖는 문제로 쪼개고 다시 그것을 하나로 모음 (quick sort, heap sort)

    n제곱 이상으로 가면 시간이 급격하게 오래걸림

    2018년 11월 2일 금요일

    서버 정리

    scale-out
    여러개의 서버를 나눠 일을 하는 방법

    load balancing
    여러 대의 서버가 분산처리하여 해결해주는 서비스

    cluster
    여러 대의 컴퓨터를 병렬로 연결하여 하나의 컴퓨터 처럼 사용 (인프라)

    round robin
    스케줄링을 할때 우선순위를 두지않고 시간순으로 스케줄리해줌

    proxy
    프록시 서버는 다른 서버를 연결할 때 거쳐감

    도커 스웜 정리

    1. 서버 오케스트레이션


    여러 서버와 여러 서비스를 편리하게 관리해주는 작업
    스케줄링, 클러스터링, 서비스 디스커버리, 로깅, 모니터링

    오케스트레이션 툴
    - kubernetes
    - mesos
    - ecs
    - docker swarm

    - 로드밸런싱
    분산을 위해 가상 IP를 통해 여러 서버에 접속하도록 분배하는 기능
    - 클러스팅
    여러 개의 컴퓨터를 병렬로 연결해서 하나의 컴퓨터처럼 사용
    - 라운드 로빈 스케줄링
    프로세스들 사이에 우선순위를 두지 않고 순서대로 cpu 할당

    2. 도커 스웜


    스웜 - 클러스터
    노드 - 서버의 단위

    - docker compose


    하나의 애플리케이션으로 구동되는 경우 각각 컨테이너를 관리하기 힘듬
    -> 여러개의 컨테이너를 효율적으로 관리

    웹서버 컨테이너 + 디비 컨테이너
    웹 + 웹 + 디비


    - docker stack

    분산처리의 최상위 계층
    종속성을 공유하는 연관된 서비스의 그룹
    단일 스택은 전체 응용 프로그램의 기능을 정의하고 오캐스트레이션 할 수 있음
    swarm 을 시작하고 stack 으로 compose를 등록하면 swarm 등록된 컴퓨터에 분산시켜 compose를 실행

     

    -docker machine

    내부적으로 VM 사용
    클라우드를 포함한 원격지에 docker node를 구성
    가상 호스트에 docker 엔진을 설치하고 docker machine 명령으로 호스트를 생성과 관리할 수 있는 도구
    다양한 리눅스 환경애서 여러개의 원격 docker호스트를 프로비저닝 할 수 있다.


    docker swarm init
    분산 처리를 시작함 ( 인프라만 구축)
    docker service
    분산 처리에서 서비스할 것들 ( 실제 서비스 구축)




    11/8
    도커 스웜으로 로드밸런싱 할 때 DB를 어케해야할지 모르겠음 고민중임
    docker-compose로 연결해야되는데 그게 잘 안도니ㅗ다.
    해결 -> web 쪽에 depends_on 을 넣어줘야함









    docker build . -t ehddnjs0728/t:1.0

    docker stack deploy -c docker-compose.yml test
    docker stack rm test

    version: "3"
    services:
      web:
        # replace username/repo:tag with your name and image details
        image: ehddnjs0728/portfolio:1.5
        #container_name: server
        #build: ./files
        deploy:
          replicas: 2
          resources:
            limits:
              cpus: "0.1"
              memory: 50M
          restart_policy:
            condition: on-failure
        ports:
          - "80:80"
        environment:
                - DB_HOST=mongo
                - DB=test
        links:
          - mongo
        depends_on:
          - mongo       
        networks:
          - webnet
      mongo:
        image: mongo # alpine 이미지는 용량이 적어 사용하기 좋다.
        ports:
          - "27017:27017"
        volumes:
           - ./mongo:/data/db
        deploy:
          placement:
            constraints: [node.role == manager]
          restart_policy:
            condition: on-failure
      
        networks:
          - webnet
         
             
                   

      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          placement:
            constraints: [node.role == manager]
        networks:
          - webnet
    networks:
      webnet:




    flutter 기본 개념 1

      Scaffold  - 화면 뼈대 역할  - 기본적으로 AppBar body floatingActionButton 같은걸 배치해줌  return Scaffold (       appBar : AppBar ( title : const Text ...