오늘 한일

플러터 1/4/7/14 앱: 메인화면

test('create and find', () async {
    var key = await store.add(db, {'name': 'ugly'});
    var record = store.record(key);
    expect(record.key, 1);

    var value = await record.get(db);
    expect(value, {'name': 'ugly'});

    var records = await store.find(db, finder: Finder(filter: Filter.matches('name', '^ugl')));
    expect(records[0].value, value);
});

test('create and update', () async {
    // put
    var key = await store.add(db, {'name': 'ugly'});
    expect(key, 1);
    var record = store.record(key);

    // update
    expect(await record.update(db, {'new': 2}), {'name': 'ugly', 'new': 2});
    expect(await record.update(db, {'new': FieldValue.delete, 'a.b.c': 3}), {
        'name': 'ugly',
        'a': {
            'b': {'c': 3}
        }
    });
});

위의 코드는 sembast nosql을 테스트해본 코드다. 위젯에 적용하다가 도메인 객체로 변환하기가 귀찮아서 그냥 sqflite라는 in-momery db와 jaguar_orm을 사용하기로 했다. 근데 이것도 사용법이....

IT인프라

  • 물리 서버
    • 서버 설치 시 중요한 정보는 크기, 소비 전력, 중량
    • 서버 내부 구성
      • 전원, 메모리, CPU, PCI, NIC, HDD 등 PC와 비슷
    • CPU, 메모리, 지역성과 캐시 등

리팩토링

  • 추상화 악취 1가지, 캡슐화 악취 1가지 복습
    • 중복된 추상화
    • 부족한 캡슐화
  • 누설된 캡슐화
    • 구현 세부 사항을 공개 인터페이스로 외부에 공개 혹은 누설할 때
    • 추상화의 구현와 인터페이스 측면을 각각에서 포착하고 분리해야 한다
    • 내부에서 사용하는 컬렉션의 완전 복사본, 불변객체 타입의 컬렉션의 복사본이 아닌채로 공개하는 경우
    • 알고리즘의 이름을 누설하는 경우
    • 인터페이스를 사용하여 구현이 노출되지 않도록 리팩토링 해야한다
  • 누락된 캡슐화
    • 계층 내부나 추상화 내부에서 캡슐화하지 않을 때
    • 캡슐화 원칙을 적용하는 요소 기술은 변형 감추기
    • OCP 위반, 구현에서 타입이나 계층 변형을 독자적으로 캡슐화하지 못함
    • 관심사 변경에 대한 인식이 부족하여 관심사를 뒤섞은 경우에 주로 나타난다
    • 알고리즘의 경우 전략 패턴, 알고리즘과 대상이 섞인 경우 가교 패턴과 유사한 구조를 사용하여 두 관심사에서 독자적으로 변형을 캡슐화하도록 리팩토링 해야한다

운영체제

  • day2, day5, day7 복습

    • day2: 운영체제의 개념과 발전 목적, 운영체제의 기능, 운영체제의 발전 과정과 유형,
    • day5: 스레드의 개념과 상태 변화, 스레드의 구현
    • day7: 상호배제와 동기화
  • day8 학습

    • 상호배제 방법들

    • 데커의 알고리즘

      • 두 프로세스가 동시에 임계 영역에 들어가려고 시도하면 순서에 따라 오직 하나만 들어가도록
      • 진입 순서 변수와 자신의 임계 영역 진입 여부를 나타내는 플래그를 사용
    • 그 외

      • 다익스트라
        • 실행 시간이 가장 짧은 프로세스에 프로세서를 할당하는 세마포 방법
      • 크누스
        • 이전 알고리즘 관계를 분석, 일치하는 패턴을 찾아 패턴의 반복을 줄여서 프로세스에 프로세서를 하당하는 방법
      • 램포트
        • 번호표를 받고 기다리는 개념을 활용하여 우선순위가 가장 높은 프로세스에 먼저 프로세서를 할당하는 방법
      • 핸슨
        • 실행 시간이 긴 프로세스에 부리한 부분을 보완하는 것, 대기시간과 실행 시간을 이용하는 모니터 방법
    • TestAndSet 테스 명령어

      • 메모리 영역의 값에 대해 검사와 수정을 원자적으로 수행할 수 있는 하드웨어 명령어
      • 명령어를 수행하면 lock을 걸고, lock의 이전 상태를 반환
      • wating 배열을 이용하여 여러 프로세스에 적용 가능
    • 세마포

      • 앞서 등장한 방법들은 진입 조건이 true가 될 때까지 반복적으로 조사하는 바쁜 대기를 하게 되어 프로세스를 낭비
      • 세마포 S의 정수값을 P(S) : (wait)-, V(S): (signal)+하는 연산을 통해 임계영역을 구현하거나 스케줄링 제약 조건을 시행할 수 있음
      • P(S): S 값을 검사하여 양수이면 1을 감소
      • V(S): S를 1만큼 증가
      • 세마포가 0일 때, lock 또는 사용 중, 그렇지 않을 때 양의 값은 세마포를 사용할 수 있다는 의미
      • 특정 유형의 공유 자원에 접근하려는 프로세스를 관리하는데 유용
      • 1, 0의 값을 사용하는 이진 세마포, count 변수를 사용하는 계수 세마포
      • 프로세스 중단(일시정지), 신호를 보내 프로세스 실행, 준비 큐를 이용하여 세마포를 구현할 수 있다
      • 세마포의 주요 특징
        • 원자(단위)적 수행, 두 프로세스가 동시에 동일한 세마포에서 wait, signal 연산을 할 수 없도록 해야 한다
        • wait, signal 연산을 생략하면 상호배제 문제가 발생
        • wait 연산 때문에 대기하는 프로세스들이 교착 상태에 빠질 수 있음

백준 DP: 계단 오르기, 제곱수의 합

계단 오르기는 이전에 풀었던 문제와 비슷해서 금방 풀 수 있었다. 제곱수의 합은 약간 수학적인 지식이 필요한 문제라 조금 오래걸렸다. 통과하긴 했는데, 첫 번째 풀이가 O(N * N / 2) 복잡도로 인해 속도가 다른 사람들에 비해 안좋게 나왔다. 그래서 다른 사람의 풀이를 참고해서 해석하고 풀이를 별도로 포스팅했다.

오늘 느낀점

쿼리를 작성할 필요도 없고, 테이블을 만들 필요도 없으니 nosql이 편하긴 한 것 같다. 근데 key-value 저장소에서 꺼내온 value를 도메인으로 변환해야 하는가가 의문이다. 데이터셋이 크다면 객체로 변환하는 비용 자체가 클 텐데.... 보통 map으로 사용하는 건가??

내일 할일

  • 플러터 1/4/7/14 앱
    • sqflite, jaguar_orm 적용
    • 과목 CRUD
  • IT인프라, 리팩토링, 운영체제 학습
  • 백준 DP 2문제 풀이