물론 앞으로 내 길이기도 하지만

일단은 자바 스프링을 까먹기 전에 최대한 flask와 비교하는 것을 작성해보려 함..

시간 나는 대로 튜토리얼을 따라하며 spring과 비교 후 기존에 내 서비스를 flask로 리팩토링 하는게 목표.

기간은 무한대...

'파이썬 > flask' 카테고리의 다른 글

sqlalchemy 간략 정리  (0) 2018.09.02


1. ls -al과 ls -l의 차이점 : 숨겨진 파일을 보여주는가 아닌가



2. cp와 mv의 차이점: cp는 파일을 복사해가고 mv는 잘라넣기 한다(mv는 dos상에서 move)


3. apt-get update는 기존의 apt 목록을 최신화 하는 것이고 upgrade는 말 그대로 업그레이드 하는 것

htop를 찾아서 실행하고 업그레이드 하고 삭제하는 사진..



4. wget -o 파일명 src

특정 파일명으로 다운 받고 있음.



5. git clone 명령으로 react 전부를 react_src 폴더에..



6. >, < 방향을 통해서 output을 조절할 수 있다.

linux.txt > one.txt를 통해서 결과물을 txt로 바꾸는 모습.(기존에는 화면에 출력함)



7. >>. <<를 통해서 추가한 모습

ls -al >> result.txt를 통해서 기존에 result.txt에 내용을 추가하였다(원래는 덮어쓰기)

'Study)Hoguz > 8월)리눅스_생활코딩' 카테고리의 다른 글

리눅스, 생활코딩, 10, 11회차  (0) 2018.08.15

1. 책 두권 읽고 정리

2. 스터디 : 리눅스, 생활코딩

3. 파이썬 플라스크

Nebo - Test - Page 4

1장

  1. 1 수정하기 안좋은 코드

메뉴 클릭에 따른 행동이 있을 이를 if / else 처리하게 되면 요구사항 추가 때마다 코드가 늘어남.

1.2 수정하기 좋은 코드
비슷한 동작을 찾자.
클릭,
보여주기

  • interface 하고 implements.

1.3 소프트웨어란...
여러 요구사항이 계속 추가됨.

  • 변화가능한 유연한 구조를 만들자.

2장 객체지향

  1. 절차지향과 객체지향
  2. I 절차지향
  3. procedure 프로그램을 구성
  4. 하지만 데이터가 많아질수록 감당 x

1.2 객체지향
객체 단위로 묶는다.

  • 데이터 변화가 발생해도 해당

객체만 변화가 발생

  1. 객차

21 객체의 핵심은 기능을 제공

  • 소리크기 제어 객체
  • 데이터 타입 안중요

소리 증가, 감소, 음소거 등의 기능

22 인터페이스와 클래스

  • 객체가 제공하는 기능 = operation

객체는 operation 으로 정의

  • 객체가 제공하는 operation 집합 = 인터페이스
    (일종의
    명세서나 규칙)
  • 실제 구현은 클로니스가 한다.

2.3 메시지

  • 오퍼레이션의 실행을 요청 = message
    = 메서드를 호출하는 .

  1. 객체의 책임과 크기.
  2. 객체는 기능으로 정의
    = 객체마다 자신만의 책임이 있다.
  • 객체의 책임을 결정짓는 것이 객체지향설계의 출발점
  • 처음에는 필요 기능을 정리.

. 기능을 할당하는 가장 어려움. 다만 책임의 크기는 작을수록 좋다.

  • 파일을 읽고 이를 암호화 한뒤 파일을 쓰는 경우
  • 흐름제어, 파일 읽기, 파일쓰기, 암호화
  • 기능이 많다 = 관련 데이터도 많다 = 절차지향식 구조

  1. 의존
  2. 한객체가 다른 객체를 생성, 호출 =

의존

  • 부른 객체가 사용하려는 객체에 의존

  • 파라미터로 받아도 의존임.

. A B c
(
B에, B가 A에 의존하고 있다. A가 변경된다면 B, c 모두 영향

  1. I 의존의 양면성

. 내가 변경되면 나에게 의존하고 있는 코드에 영향을 준다.

  • 나의 요구가 변경되면 내가 의존하고 있는 타입에 영향을 준다.

  1. 캡슐화.
  2. 변경이 다른곳에 가하지 않게.

. 내부의 기능이 어떻게 구현하는지 감추는 .

  1. I 절차지향적 코드

. 데이터를 중심으로 작성

  • 데이터 변화시 이를 사용하는 코드도 연쇄적으로 수정

5.2 캡슐화코드

  • 요구사항 변경에도 변화없음.

) 회원가입 만료를 계산할때 절차: 여성, vip 데이터에 집중

  • 고쳐야할 많다.

캡슐: member 클래스에 is Expired 메서드 기능 수정.

5.4 캡슐화 2개 규칙

  • Tell, Don't ASK
    데이터를 묻지 않고 기능을 실행
  • 만료일자를 가져와서 확인 x 만표확인 미서드를 불러 .
  • 데미테르의 법칙
  • 메서드에서 생성한 객체의 메서드 호출
  • 파라미터로 받은 객체의 메서드만 호출.
  • 필드로 참조하는 객체의 메서드만 호출.

member.get Some ().get Some x

  • 결국은 기능중심.

  1. 객체지향설계과정
  2. 기능, 세분화, 객체에 할당
  3. 최대한 캡슐화.
  4. 어떻게 메시지 받을지 구상
  5. 반복

3장 다형성과 추상타입.

  1. 상속개요.
    Pass

  1. 다형성과 상속.
  2. 다형성 = 여러 가지 (poly) 모습 (morph)
  3. 기능요청에 따라서 서로 다른 타입이 나옴.

. Turbo Plane extends Plane implements Turbo
= Plane 되고 Turbo 된다.

  1. 추상타입과 유연함.
  2. 추상화: 데이터, 프로세스 등을

의미가 비슷한 개념이나 표현으로 정의.
.
FTP에서 파일 다운로드,소켓에서 데이터 읽기,
DB 테이블에서 데이터를 조회

  • 로그 수집
    상세 구현은 알수없다.

  1. I 추상타입과 실제 구현의 연결.
  2. 추상클래스는 상속을 통해 연결.
  • Log Collector CO = create(); CO. collect ();
    이렇게 가능
    create () 생성하는 타입에 따라 달라진다.
    (아래
    클래스를 콘크리트 클래스라 부른다)

3.2 추상 E1 입자 교체의 유연함
.
콘크리트 직접 사용?

  • 수정사항 발생시 if l else 계속추가
  • 공통된 기능을 interface 화시키고 이를 관리하는 클래스를 따로 만들어

책임을 분리시킨다.

  1. 3 변화되는 부분을 추상화하기
  2. 변화되는 부분을 추상화
  3. 주로 if / else 구조로 등장
  4. 데이 형태에 따라 다른 결과 = 데이터 형태를 추상화

3.4 인터페이스에 대고 프로그래밍

  • program to interface
  • 변화 가능성이 높은 곳에 인터페이스 사용

3.5 인터페이스는 인터페이스 사용자 입장에서 만들기

  • Data를 읽는 인터페이스
  • File Data Reader x

사용자: Flow Con 이므로 Bk Source 좋음.
(
그러면 모든 소스가 file로 부터 오는줄 )

3.6 인터페이스와 테스트

  • 콘크리트 클래스를 사용하면

test 할때도 완성까지 기다려야 .

  • 인터페이스와 mock 활용하면 빠르게 테스트 가능

4장 재사용: 상속보단 조립.

  • 상속에는 몇가지 문제가 존재

1.1 상위클래스 변경 어려움

  • 상속이란 의존.
    그렇기에 아래로 변화가 내려

1.2 클래스 불필요 증가

  1. 조립을 이용한 재사용
  2. 조립은 다른 객체를 참조하는 방식
  3. 다른 객체를 조립해서 필드로

갖는다 = 다른 객체 사용

  • 상속보다 객체조립을 먼저 고민

2.1 위임
.
내가 일을 다른 객체에게 넘김

5장 설계원칙, DI

  1. Single responsibility principle
  2. 클리이스는 개의 책임을 가져야 한다
  3. 클래스를 변경하는 이유는 한개

1.1 SRP 위반시 문제

  • 데이터를 읽는 책임과 보여주는 책임으로 구성시 데이터를 읽는 방식이 변경시 보여주는 방식도 수정됨.

1.2 책임이란 변화에 대한

  • 책임의 단위는 변화와 관련
  • 데이터 읽기 기능 변경이 데이터 보여주는 기능에도 영향을 끼치지 않음.
  • 메서드 실행주체가 누구인가
  • 클래스 사용자들이 서로 다른

메서드 사용시 메서드는 각각 다른 책임 속할 가능성이 높다.


위에 내용을 적용한 코드는 아래와 같다.



def solution(n, works):
    tot_left_time = sum(works) -n; # 총 일해야하는 시간 - 남은 시간을 뺀것, [4,3,3], 4 이면 6이 나옴
    avg_part_time = round(tot_left_time / len(works)) # 야근해야하는 시간을 종류의 갯수로 남아서 반올림함, 6 / 3 이므로 2
    # 평균값에 근접하도록 각 종류를 바꾸는게 포인트
    ans = 0;
    if tot_left_time < n: # 야근할 필요가 없으니 0
        return 0;
    elif avg_part_time == 1: # [2,1,2], 1 의 경우 1이 평균값이므로 1,1,2 이렇게 구성이 되어야함.
        ans = (len(works) - 1) + (tot_left_time- ((len(works)-1)))**2
        return ans
    elif (tot_left_time) % avg_part_time == 0: # 야근해야하는 총시간이 6시간이고 temp가 2시간이면
        return avg_part_time**2 * len(works)
    else: # 7시간 야근해야하고 종류가 4개인 경우, 2,2,2,1 이렇게 해야함
        ans = (tot_left_time - avg_part_time * (len(works)-1))**2 + avg_part_time**2 * (len(works)-1)
    return ans

위에 처럼 해서 끝이나면 정말 아름다웠을 것이다..

하지만 이러한 풀이 방법 역시 제대로 적용되지 않는다..

왜냐하면 최초의 야근 양이 평균값보다 작을경우 오히려 일을 늘리는 경우가 발생하기 때문..

(4,2,1이 주어지고 평균이 2가 나왔다고 가정하면 1이 오히려 2가 되는 기이한 상황이 발생)

그렇기에 이를 해결하기 위해선 처음부터 다시 생각해봐야한다...




def solution(str):
    lst = []
    for i in range(len(str)):
        for j in range(i+1, len(str)+1):
            ans = str[i:j];
            print(ans)
            if ans == ans[::-1]:
                    lst.append(len(ans))
    return max(lst)
def solution(s):
    return max([len(s[i:j+1]) for i in range(len(s)) for j in range(i, len(s)) if s[i:j+1]==s[i:j+1][::-1]])


위 코드와 아래코는 똑같은 내용인데 축약형에 대해 정리하려고 두개 다 넣었다.

위 코드 기준 A-B-C 순의 코드를 축약할 경우 C-B-A로 쓸줄 알았는데 동일하게  A-B-C로 사용한다.

물론 제일 아래 마지막부분은 제일 앞에 나와있다.



구입목적 : 내가 작성한 내용을 텍스트로 바꾸기 위함.

가격: 약 7천원

사용기간: 약 일주일

사용평: 필기감은 굿노트와 비슷하거나 살짝 안좋다. 잘 안써지는것 같기도 함.

다만 텍스트 인식률은 상당히 높다. 흘려쓰거나 뭉쳐쓰지만 않으면 거의 대부분 다 인식함.

물론 인식을 안하고 그냥 일반 노트 앱처럼 사용할 수도 있지만 이 앱의 목적 자체가 텍스트 전환이니까..


제일 신기한 점은 HTML로도 내보낼수가 있다는점.

그렇기에 앞으로 책의 내용을 정리할때 사용하려고 함.

텍스트로 정리해야할 내용등이 있다면 네보 어플을 사용하는것이 좋아보임.

(손으로 쓰고 나중에 키보드로 옮기는 중복작업을 피하고 싶다면...)


추천여부 : 무언가 정리할때 손으로 쓰는 것을 선호 하면서 동시에 텍스트로도 남기고 싶으신 분들

'생활리뷰(아이패드 악세사리 등..)' 카테고리의 다른 글

분노의 리뷰 : LG HBS-S80  (0) 2018.06.18
분노의 리뷰 : 카미노  (0) 2018.06.09
Nebo - Test - Page 4

1장

  1. 1 수정하기 안좋은 코드

메뉴 클릭에 따른 행동이 있을 이를 if / else 처리하게 되면 요구사항 추가 때마다 코드가 늘어남.

1.2 수정하기 좋은 코드
비슷한 동작을 찾자.
클릭,
보여주기

  • interface 하고 implements.

1.3 소프트웨어란...
여러 요구사항이 계속 추가됨.

  • 변화가능한 유연한 구조를 만들자.

2장 객체지향

  1. 절차지향과 객체지향
  2. I 절차지향
  3. procedure 프로그램을 구성
  4. 하지만 데이터가 많아질수록 감당 x

1.2 객체지향
객체 단위로 묶는다.

  • 데이터 변화가 발생해도 해당

객체만 변화가 발생

  1. 객차

21 객체의 핵심은 기능을 제공

  • 소리크기 제어 객체
  • 데이터 타입 안중요

소리 증가, 감소, 음소거 등의 기능

2.2 인터페이스와 클래스

  • 객체가 제공하는 기능 = operation

객체는 operation 으로 정의

  • 객체가 제공하는 operation 집합 = 인터페이스
    (일종의
    명세서나 규칙)
  • 실제 구현은 클로니스가 한다.

2.3 메시지

  • 오퍼레이션의 실행을 요청 = message
    = 메서드를 호출하는 .

  1. 객체의 책임과 크기.
  2. 객체는 기능으로 정의
    = 객체마다 자신만의 책임이 있다.
  • 객체의 책임을 결정짓는 것이 객체지향설계의 출발점
  • 처음에는 필요 기능을 정리.

기능을 할당하는 가장 어려움. 다만 책임의 크기는 작을수록 좋다.

  • 파일을 읽고 이를 암호화 한뒤 파일을 쓰는 경우
  • 흐름제어, 파일 읽기, 파일쓰기, 암호화
  • 기능이 많다 = 관련 데이터도 많다 = 절차지향식 구조

  1. 의존
  2. 한객체가 다른 객체를 생성, 호출 의존
  • 부른 객체가 사용하려는 객체에 의존

  • 파라미터로 받아도 의존임.

. A B c
(
B에, B가 A에 의존하고 있다. A가 변경된다면 B, c 모두 영향

  1. I 의존의 양면성

. 내가 변경되면 나에게 의존하고 있는 코드에 영향을 준다.

  • 나의 요구가 변경되면 내가 의존하고 있는 타입에 영향을 준다.

  1. 캡슐화.
  2. 변경이 다른곳에 가하지 않게.

. 내부의 기능이 어떻게 구현하는지 감추는 .

  1. I 절차지향적 코드

. 데이터를 중심으로 작성

  • 데이터 변화시 이를 사용하는 코드도 연쇄적으로 수정

5.2 캡슐화코드

  • 요구사항 변경에도 변화없음.

) 회원가입 만료를 계산할때 절차: 여성, vip 데이터에 집중

  • 고쳐야할 많다.

캡슐: member 클래스에 is Expired 메서드 기능 수정.

5.4 캡슐화 2개 규칙

  • Tell, Don't ASK
    데이터를 묻지 않고 기능을 실행
  • 만료일자를 가져와서 확인 x 만표확인 미서드를 불러 .
  • 데미테르의 법칙
  • 메서드에서 생성한 객체의 메서드 호출
  • 파라미터로 받은 객체의 메서드만 호출.
  • 필드로 참조하는 객체의 메서드만 호출.

member.get Some ().get Some x

  • 결국은 기능중심.

  1. 객체지향설계과정
  2. 기능, 세분화, 객체에 할당
  3. 최대한 캡슐화.
  4. 어떻게 메시지 받을지 구상
  5. 반복



이번에 수정한 부분은 위와 같다.

chart 클래스가 버튼을 생성하고, 그 버튼의 값을 entry에 보여줘야 하므로

chart클래스가 entry타입을 받게끔 하였다.

그리고 버튼을 클릭하면 값이 보이게 하는 메서드를 밖으로 빼서 만들었다.

문제는 문장을 보여줘야하므로 바뀌는 값이 계속 저장되게끔 해야하는데 이 구성을 어떻게 매끄럽게 할지가 가장 큰 고민이다.


from tkinter import *;
from chart import *;
from display import *;

window = Tk();
window.title("Maplotlib Calc");
window.geometry("500x400");
# 결과들을 보여주는 아웃풋
output = display(window, 0, 0);
out_entry = output.make_Entry(0,0,70,"light green")
# class를 생성할시엔 무조건 frame row, col을 받게끔 해야함
chart = chart(window,2,0,out_entry); # 버튼을 만들기 위함
chart.make_button();
window.mainloop();

from tkinter import *;
class chart:
    def __init__(self, window, row, column, output_entry):
        self.window = window;
        self.pad = Frame(window);
        self.row = row;
        self.column = column;
        self.outentry= output_entry;
        self.pad.grid(row = self.row, column = self.column,sticky = W);

    def make_button(self):
        char_lst = ['LINE', 'SCATTER']
        r , c = 0,0
        for k, v in enumerate(char_lst):
            def inner(index = k):
                self.show(index)
            Button(self.pad, text = v, width =10, command = inner).grid(row = r, column = c)
            c +=1;

    def show(self, index): # 버튼만 보여주는 메서드
        button_pad = Frame(self.window)
        button_pad.grid(row =3, column =0, sticky = N);
        if index == 0:
            cr = {'black' : 'k', 'green':'g', 'red':'r'};
            ls = {'solid' : '-', 'dashed' : '--', 'dashed dot' : '-.'};
            marker = {'point' : '.', 'circle' : 'o', 'triangle_up' : '^'};
            category = [cr, ls, marker];
            r = 0;
            c = 0;
            record_lst = [];
            for i in range(len(category)):
                for key,value in category[i].items():
                    def inner(k = key, v = value, index =i):
                        print(i)
                        del record_lst[i:i+1];
                        record_lst.insert(i,{k,v});
                        self.button_action(k,record_lst);
                    Button(button_pad,text = i, width = 10, command = inner).grid(row = r, column=c);
                    c += 1;
                if c > 2:
                    c = 0;
                    r += 1;

    def button_action(self,key,lst):
        #str = "plt.plot([10, 20, 30, 40], [1, 4, 9, 16], c= '%s', ls='%s', marker='%s')" %(lst[0][key],lst[1][key], lst[2][key]);
        print(lst);
        self.outentry.delete(0, END);
        self.outentry.insert(END, "Test");


기존에 진행중이던 것들이 어느정도 끝났기에 얼른 이것을 마무리 하려한다.

지난번에는 main 클래스에 모든것을 다 넣고서 돌아가게끔 하는게 목적이었고 이번엔 지난번 것을 바탕으로

나름 클래스화 하여 구성해보려 한다.


메인 화면은 크게

1. 내가 선택한 파라미터 명령어가 나오게 하는 것

2. 차트 종류를 선택하면 그에 해당하는 파라미터가 등장

3. 파라미터 버튼 클릭시 1번 화면 업데이트

4. 생성 버튼 클릭시 matplot 화면을 보여줌

5. 파라미터 클릭시 실시간 변화...


이렇게 5개의 기능이 목표이다.



from tkinter import *;
from chart import *;
from display import *;

window = Tk();
window.title("Maplotlib Calc");
window.geometry("400x300");
# 결과들을 보여주는 아웃풋
output = display(window, 0, 0);
output.make_Entry(0,0,70,"light green")
# class를 생성할시엔 무조건 frame row, col을 받게끔 해야함
chart = chart(window,2,0); # 버튼을 만들기 위함
chart.make_button();
window.mainloop();

기본적으로 tkinter를 이용해 gui를 구성, 현재 위 메인단에서 클래스는 하나는 버튼용, 하나는 out풋 용으로 만들었다


from tkinter import *;
class display():
    def __init__(self, window, row,col):
        self.window = window;
        self.row = row;
        self.col = col;
        self.tpfr = Frame(window);
        self.tpfr.grid(row = self.row, column = self.col, sticky = N);

    def make_Entry(self, row, col, width, color):
        display = Entry(self.tpfr, width = width, bg=color)
        display.grid(row = row, column = col);

단순히 엔트리(녹색 입력창?) 을 만들기 위한 클래스, 모든 클래스는 frame 생성을 위해 row, col을 받게끔 설정


from tkinter import *;
class chart:
    def __init__(self, window, row, column):
        self.window = window;
        self.pad = Frame(window);
        self.row = row;
        self.column = column;
        self.pad.grid(row = self.row, column = self.column,sticky = W);

    def make_button(self):
        char_lst = ['LINE', 'SCATTER']
        r , c = 0,0
        for k, v in enumerate(char_lst):
            def inner(index = k):
                self.show(index)
            Button(self.pad, text = v, width =10, command = inner).grid(row = r, column = c)
            c +=1;

    def show(self, index):
        button_pad = Frame(self.window)
        button_pad.grid(row =3, column =0, sticky = N);
        print("show show", index)
        if index == 0:
            cr = {'black' : 'k', 'green':'g', 'red':'r'};
            ls = {'solid' : '-', 'dashed' : '--', 'dashed dot' : '-.'};
            marker = {'point' : '.', 'circle' : 'o', 'triangle_up' : '^'};
            category = [cr, ls, marker];
            r = 0;
            c = 0;
            for i in range(len(category)):
                for key,value in category[i].items():
                    Button(button_pad,text = key, width = 10).grid(row = r, column=c);
                    c += 1;
                if c > 2:
                    c = 0;
                    r += 1;

문제의 버튼 클래스, 처음에 차트 종류를 보여주고, 클릭하면 파라미터가 보여질수있게끔 코드를 짜다보디 이런모양이 되었다..

1234567···14

+ Recent posts