반응형

이번에 루나X를 구입과 실사용을 하게 되면서 기존에 가지고 있던 리디페이어3과 비교를 해보려고 한다.

새로운 이북리더기를 구매한 이유는?

 
리디셀렉트를 구독중인 나는 리페삼에 매우 만족하며 잘 사용하고 있었다.
리디셀렉트에서 읽을 수 있는 책은 그렇게 많지 않지만 오히려 그 안에서 골라야 한다는 점 때문에 독서 편식을 줄일 수 있다는 점이 장점이라고 생각되었다. 하지만 최근 회사에서 밀리의 서제를 지원하면서 다른 이북어플도 지원하는 이북리더기의 필요성 생겼다...
 

그렇다면 왜 루나X를 구입하게 되었는가?

 
특별히 알아보지는 않았고 처음에도 생각없이 구매한 리페삼에 매우 만족해서 사용하고 있었기 때문에 적당히 아무거나 사도 크게 상관없을 것이라고 판단했었다. 마침 회사 복지 사이트에서 루나X를 판매하고 있어서 고르게 되었다.

 

그래도 루나X를 고르게 된 최소한의 조건

나름대로 리페삼을 사용하면서 겪었던 불편을 보완한 제품을 고르고 싶었다.  C type 충전을 지원하지 않는다는 점. 리페삼을 구매한 것이 거의 5년은 된 것 같으니 어쩔 수 없다고도 생각하지만 마이크로 usb 충전은 다소 불편했다.
 
그렇게 오늘 루나X를 하루종일 가지고 다니면서 밀리의 서제를 사용해본 후기를 정리하면 다음과 같다.
 

타사 어플 설치 가능

 
우선 당연하게 독자적인 어플이 아닌 다른 서점의 어플도 설치 가능하다는 점이다.
이거 하나만 보고 20만원이 넘는 기기를 추가로 구매를 했다.
 

가벼움

 
리페삼과 비교하여 확연하게 무게가 가벼운 것을 느낄 수 있다.
리페삼은 누워서 한손으로 들고 계속 책을 읽기엔 다소 무리가 있는 무게이다.
물론 종이책보다는 훨씬 편하고 가볍지만.
 
다음으로는 바로 단점을 적는 다면

리페삼 SD카드 삽입
SD 카드 삽입이 불편함

 
리페삼의 경우 마이크로 SD를 그냥 구멍에 똑딱하고 넣으면 되었지만
루나X의 경우는 아이폰 유심처럼 핀을 꼽아서 넣어야한다.
 

물리 버튼이 없음

 
리페삼에서는 당연하게 존재하던 물리버튼이라서 루나X 구매시 크게 신경을 안썼지만
리페삼에서 물리 버튼을 강조했던 이유가 있었다. 생각보다 없으니 불편하다.
 


 


 

반응형
반응형
  이름 재료1 재료2 토핑
No. 01 아이스커피      
No. 02 아이스 에스프레스 원두 원두  
No. 03 아이스 카페오레 우유    
No. 04        
No. 05        
No. 06 아이스 팥소 커피 팥소    
No. 07 아이스 비엔나커피     생크림
No. 08        
No. 09        
No. 10 커피      
No. 11 에스프레스 원두 원두  
No. 12 카페오레 우유    
No. 13 카페라떼 원두 우유  
No. 14 아메리카노 원두 미네랄워터  
No. 15 에그커피 노른자    
No. 16 팥소 커피 팥소    
No. 17 비엔나커피      
No. 18 카페모카 원두 원두 초코 시럽
 No. 19 캐러멜 마키아토 원두 원두 캐러멜 시럽
No. 20        
No. 21 진저브레드 라떼 우유 생강  
No. 22 아이스티      
No. 23 아이스 밀크티      
No. 24        
No. 25        
No. 26        
No. 27        
No. 28        
No. 29 아이스 말차 라떼      
No. 30 아이스 레몬티 레몬    
No. 31 홍차      
No. 32 밀크티      
No. 33 스파이스티      
No. 34        
No. 35 마살라차이      
No. 36        
No. 37 말차      
No. 38        
No. 39 레몬티 레몬    
No. 40 생강 홍차 생강    
No. 41 아이스 코코아 코코아파우더    
No. 42 우유      
No. 43 밀크셰이크      
No. 44 맛있는 물      
No. 45 프루트 주스      
No. 46 믹스 주스      
No. 47 소다      
No. 48 레몬스쿼시      
No. 49        
No. 50        
No. 51 애플 사이다 탄산수 사과  
No. 52 사과 주스 사과    
No. 53 레몬수 레몬    
No. 54 복서 스페셜 노른자 노른자  
No. 55 아이스 다크 코코아 코코아파우더    
No. 56 코코아      
No. 57 핫 밀크      
No. 58 핫 밀크셰이크 우유 노른자  
No. 59 따뜻한 물      
No. 60 핫 진저에일      
No. 61 핫 레모네이드 레몬 벌꿀  
No. 62 단팥죽 팥소    
No. 63 다크 코코아 코코아파우더    

 

반응형
반응형

Slider를 꾸밀 수 있는 여러 방법에 대해서 공부를 해보자

horizontal orientation을 기준으로 진행을 할거다

먼저 기본적인 slider의 모습은 다음과 같다

사실 Mac OS 환경에서는 기본 슬라이더가 제일 이쁘다. 하지만 리눅스 환경에서는...

다음으로는 PyQT 홈페이지에서 제공하는 예제를 보자.

https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qslider

 

Qt Style Sheets Examples | Qt Widgets 5.15.16

 

doc.qt.io

위의 예제코드에서 vertical만 horizontal로 바꾼 것이다.

간단하게, handle은 초록색, 진행된 곳은 분홍색, 진행되지 않은 곳은 흰색으로 되는 코드이다.

QSlider::groove:vertical {
    background: red;
    position: absolute; /* absolutely position 4px from the left and right of the widget. setting margins on the widget should work too... */
    left: 4px; right: 4px;
}

QSlider::handle:vertical {
    height: 10px;
    background: green;
    margin: 0 -4px; /* expand outside the groove */
}

QSlider::add-page:vertical {
    background: white;
}

QSlider::sub-page:vertical {
    background: pink;
}

하지만 내가 만들고 싶은 것은 handle의 위치와 상관없이 slider의 배경 생각을 자유롭게 바뀌는 slider이다. 이를 위해서는 stylesheet을 사용하는 것이 아닌 다음과 같이 custom slider class를 만들어야한다.

class CustomSlider(QSlider):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        
    def paintEvent(self, event):
        painter = QPainter(self)
        groove_rect = QRect(self.rect().x(), self.rect().y(), self.rect().width(), self.rect().height())
        add_page_width = int(self.value() / (self.maximum() - self.minimum()) * self.rect().width())
        add_page_rect = QRect(self.rect().x(), self.rect().y(), add_page_width, self.rect().height())
        sub_page_rect = QRect(add_page_width, self.rect().y(), self.rect().width() - add_page_width, self.rect().height())
        
        # 그루브
        groove_color = QColor("#dddddd")
        painter.fillRect(groove_rect, groove_color)
        
        # add-page
        add_page_color = QColor("#b5b5b5")
        painter.fillRect(add_page_rect, add_page_color)
        
        # sub-page
        sub_page_color = QColor("#dddddd")
        painter.fillRect(sub_page_rect, sub_page_color)
        
        # handle
        handle_center = QPoint(self.sliderPosition() * self.width() / self.maximum(), self.height() / 2)
        handle_radius = 10
        handle_color = QColor("#eeeeee")
        painter.setBrush(handle_color)
        painter.drawEllipse(handle_center, handle_radius, handle_radius)

위 코드를 빌드하면 다음과 같은 slider가 나온다. 아직은 이전 코드와 같은 기능만 가능하다.

 

반응형
반응형

이제 원하는 폴더만 출력될 수 있도록 filter를 설정해보자. 기본적으로 설정할 수 있는 filter 리스트는 아래 페이지에서 확인할 수 있다.

https://doc.qt.io/qtforpython-5/PySide2/QtCore/QDir.html

 

QDir — Qt for Python

QDir The QDir class provides access to directory structures and their contents. More… Synopsis Functions Static functions Detailed Description A QDir is used to manipulate path names, access information regarding paths and files, and manipulate the under

doc.qt.io

기본적으로 QFileSystemModel에 설정되어있는 filter는 아래와 같다.

If a filter has not been set, the default filter is AllEntries | NoDotAndDotDot | AllDirs.

여기서 우리는 원하는 조건의 폴더만 출력해보자.

먼저 나는 폴더만 출력하고 싶기 때문에 QDir.Dirs 필터를 걸겠다. 아래와 같이 폴더만 불러오게 되었지만 쓸때 없는 ., ..와 같은 표시도 나타나게 되었다. default filter가 사라졌기 때문이다. 다시 QDir.NoDotAndDotDot filter도 설정해주자.

이제 아래와 같이 깔끔하게 폴더명만 나타가게 되었다.

여기서 더 나아가 name filter도 사용해보자. A로 시작하는 폴더명만 보여주는 필터는 다음과 같이 정의할 수 있다.

nameFilters = ['A*']

이에 대한 결과는 다음과 같다. name filter에 걸리지 않은 폴더들은 다음과 같이 비활성화되었다. 비활성화된 폴더들은 선택을 할 수 없게 된다.

이에 대한 코드는 아래와 같다. 객체를 생성해서 함수를 사용할 수도 있지만 나는 CustomFileSystemModel을 정의하고 싶었기에 다음과 같이 사용을 하였다. 

class CustomFileSystemModel(QFileSystemModel):
    def __init__(self):
        super().__init__()
        nameFilters = ['A*']
        self.setNameFilters(nameFilters)
        self.setFilter(QDir.Dirs | QDir.NoDotAndDotDot)

또한 treeview가 펼쳐진 상태로 시작되었으면 한다면 다음과 같은 함수를 사용하면 된다.

self.tree.expandAll()

 

반응형
반응형

어느 정도 사용하는 파일 경로가 정해져 있지만 그때그때 사용하고 싶은 폴더를 여러개 선택할 수 있는 기능을 만들고 싶어졌다.

따라서 QTreeView와 QFileSystemModel을 사용해서 이러한 기능을 만들어보려고 한다.

참고로 PyQt5를 기준으로 구현을 진행하였다.

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

먼저 간단하게 QFileSystemModel을 상속받는 CustomFileSystemModel을 정의해주었다.

class CustomFileSystemModel(QFileSystemModel):
    def __init__(self):
        super().__init__()

그리고 이러한 CustomFileSystemModel를 QTreeView로 불러와 준다.

        self.model = CustomFileSystemModel()
        self.model.setRootPath(QDir.currentPath())

        self.tree =  QTreeView()
        self.tree.setSelectionMode(QAbstractItemView.MultiSelection)
        self.tree.setModel(self.model)

        vbox = QVBoxLayout()
        vbox.addWidget(btn1)
        vbox.addWidget(self.tree)

한번에 여러 아이템을 선택할 수 있도록 MultiSelection 모드로 설정해준다. 또한 간단하게 현재 선택한 아이템 정보를 다이나믹하게 읽을 수 있도록 간단한 버튼을 만들어주었다. 그럼 다음과 같은 화면으로 프로그램이 실행된다.

개인적으로 폴더나 파일의 이름만 불러왔으면 좋겠다. Size, Kind, ... 이런 것들이 뜨지 않게 해보자.

다음과 같이 필요없는 column을 숨겼다. 

        self.tree.hideColumn(1)
        self.tree.hideColumn(2)
        self.tree.hideColumn(3)

아래와 같이 깔끔하게 원하는 이름만 나오는 것을 확인할 수 있다.



이제 선택된 아이템들의 경로를 확인해보자. 버튼을 이용해서 선택된 아이템들의 경로를 print하는 기능을 추가하였다.

    def print(self):
        for idx in self.tree.selectedIndexes():
            print(self.model.filePath(idx))

아래와 같이 여러 개의 아이템을 선택한 후 button1을 누르면 해당 파일의 절대 경로가 나오게 된다.

아래와 같은 절대 경로가 출력된다.

/Library/Apple
/Library/Image Capture

반응형
반응형

 개인적으로 논문을 읽을때 논문의 전체적인 완성도를 중요하게 생각하는 편이다. 물론 아닌 논문들도 있다는 것을 알지만, 논문을 읽으면서 논문의 전체적인 완성도가 좋지 않으면 논문의 내용도 별로일 것이라는 편견을 가지고 읽게 된다. 반대로 완성도가 좋은 논문들은 좋은 인상을 가지고 읽기 시작하고 대체적으로 내용도 훌륭하다고 인식하게 된다. 따라서 논문의 완성도에 주요한 요인 중 하나로 들어가는 Figure를 잘 그리고 싶다는 생각을 항상하고 있었는데 이번 기회에 한번 정리를 해보려고 한다. 본 글의 중점은 이쁜 Figure 그리기!

 

이번에 사용한 python 라이브러리는 matplotlib으로 데이터 시각화에 널리 사용되는 라이브러리 중 하나이다. 설치 방법은 다음 두가지 중 하나를 본인의 환경에 맞게 선택해서 설치하면 된다.

conda install matplotlib
pip install matplotlib

 

matplotlib 라이브러리는 일반적으로 다음과 같이 정의해서 사용한다.

from matplotlib import pyplot as plt

 

 

그래프 색상표 Graph color platettes

 그래프를 그리다보면 하나의 figure에 여러 개의 그래프를 합쳐서 그려야할 때가 있다. 그런 경우에는 각각의 색상들이 명확하게 구분이 가능해야한다. 심지어 흑백으로 프린트해서 보더라도! (심사하는 사람들이 흑백으로 뽑아서 볼 수도 있으니까) 따라서 어느정도 조화로우면서도 흑백으로 봤을때도 구분이 가능한 색상 팔랫트를 추천하고자 한다.

plt.bar(a1, b1, color=['#1D5B79', '#468B97', '#e9c46a', '#f4a261', '#e76f51'])

 

color=['#abc4ab', '#a39171', '#dcc9b6', '#727d71', '#6d4c3d']

 

color=['#16697a', '#489fb5', '#82c0cc', '#ede7e3', '#ffa62b']

 

color=['#8cb369', '#f4e285', '#f4a259', '#5b8e7d', '#bc4b51']

 

color=['#d88c9a', '#f2d0a9', '#f1e3d3', '#99c1b9', '#8e7dbe']

 

color=['#ed6a5a', '#f4f1bb', '#9bc1bc', '#5ca4a9', '#e6ebe0']

 

color=['#f79256', '#fbd1a2', '#7dcfb6', '#00b2ca', '#1d4e89']

막대 그래프 패턴 넣기 Add hatch style for bar graph

막대 그래프에 색상을 넣는 것이 부담스럽다면 패턴을 넣는 방식으로 구분하는 것도 가능하다. hatch라는 키워드를 사용해서 검색을 하면 나오는데 색상 없이 그냥 패턴만 넣는 것도 가능하지만 다음과 같이 색상과 패턴을 함께 사용하는 것도 가능하다.

plt.bar(a1, b1, color=color, hatch=['/', '//', '|', '+', 'x'])

하지만 난 개인적으로 패턴을 넣는 막대 그래프는 하얀색 배경을 사용하는 것이 깔끔해 보인다고 생각한다. (그래프가 작을때 더 이쁜듯)

 

반응형
반응형
반응형
반응형

출시된지 얼마 안되서 그런지 인터넷에 보스 공략이 아직 많이 없다. 대부분의 보스들이 공략이 필요없을 정도의 난이도이긴 하지만 한번 헤매기 시작하면 답답하기 때문에 나름대로 보스 공략을 적어보려고 한다. (틈틈히...)

 

거대 해파리

독을 쏘기 시작하면 보이는 붉은 눈을 박치기로 공격하면 된다. 총 3번 타격을 넣으면 되는데 독을 피하면서 타격을 넣어야하기 때문에 타이밍을 잘 잡아야한다. 개인적으로는 어느정도 해파리가 독을 다 쏜것같으면 빨리가서 타격을 넣는것을 추천한다.

헬리코프리온

수왐이 시키는 것처럼 열매를 쳐서 기절을 시킨 다음에 공격을 하면 된다. 생긴 것보다 쉬운 편에 속한다. 하지만 한번 맞으면 아프다.

크루노사우루스

스토리상 거대한 대포를 보조무기로 준다. 하지만 해당 무기를 일정 횟수 이상 맞추는 것이 클리어 조건이 아니고 데미지를 일정 수준 이상 넣어야하기 때문에 너무 대포에 집착하지는 말것! 열심히 공격하면 된다.

알유

반응형
반응형

작년쯤에 얼리액세스로 플레이할 수 있었던 데이브 더 다이버가 저번주에 정식 출시 하였다!

넥슨에서 만들었다고 하는데 한국에서도 이런 게임을 만들 수 있었나 싶을 정도로 최근 들어서 아주 만족스럽게 플레이하고 있는 게임이다.

픽셀 그래픽의 시뮬레이션, RPG 게임으로 게임의 전체적인 시나리오는 매우 간단하다. 다이브라는 다이버가 낮에는 바다에서 해산물을 채취하고 밤에는 초밥집을 경영하는 내용이다. 단순 반복적인 게임 플레이를 방지하기 위해서 중간중간 거대 해양생물을 잡는 보스게임도 있고 스토리를 따라가면 만나는 미니게임들도 있어서 반복성이 꽤나 적은 게임이다. 오히려 나는 밤에하는 초밥집 알바를 조금 더 하고 싶다는 생각이 들기도 했었다.

그래픽이 이쁘다

아직 게임 앤딩을 보지는 않았지만 거의 끝에 다다랐다는 생각이 들어서 리뷰를 쓰기 시작했다. 작년에 얼리액세스를 플레이하고 이번 정식 출시까지 꽤나 오랜시간을 기다렸지만 이정도 퀄리티라면 기다릴만 했다는 생각이 들었다. 아직은 출시된지 얼마되지 않아서 공략들이 많이 올라오지는 않았지만 난이도 밸런스를 잘잡은 게임이기 때문에 혼자서도 충분히 플레이해볼만 하다고 생각한다.

참고로 작년에는 윈도우 운영체제만 서비스를 제공하였지만 이번 정식 출시에서는 Mac OS에서도 플레이가 가능하다! 특히 나는 맥북으로 플레이를 하고 있는데 조작감이 살짝 아쉽지만 플레이에 크게 지장이 없을 정도로 충분하다. 아쉬운점은 특수키들이 왼쪽에 있는 키들만 사용이 가능해서 보스전과 같이 굳이 마우스가 필요없는 플레이에서는 오른쪽 키로도 즐기고 싶다는 점인것같다.

 

 

반응형

 

반응형
반응형
반응형

Active learning을 공부하게 되면서 현시점(23.05.03) SOTA 논문을 찾다가 발견한 논문이다. 아직 학회에서는 발표되지는 않은 것 같고 아카이브에 올라와있다. 기존의 MADA(ICCV 2021)을 쓴 저자와 같은 저자이다.

최근 읽은 논문들을 보면 Active learning과 Domain Adaptation 개념을 함께 사용하는 것이 대세인 느낌이다. Active learning의 기본적인 개념은 모델을 학습할 때 추가로 사용하는 데이터셋에서 전부를 annotation하지 않고 정보량이 많은 sample들을 선택적으로 annotation하여 효율적인 학습 dataset을 구축하는 것이다. 여기서 Domain Adaptation 개념을 사용하여 source domain 데이터셋(기존에 학습에 사용한 데이터셋)에 추가적으로 target domain 데이터셋(아직 annotation되지 않은 데이터셋)으로 학습을 가정하는 것이다. 

 

Overview of the MADAv2 framework

Multi-anchor based Active Sample Selection

Multiple Anchoring Mechanism

Active leaning에서 가장 중요한 부분이라고 할 수 있는 것은 Sample Selection이다. Active learning은 전체 데이터셋에서 추가적으로 학습을 할때 가장 효율적인 추가 데이터셋을 골라 학습을 하는 것이 목표이다. 때문에 어떤 데이터셋이 가장 효율적으로 모델을 학습시킬 수 있는 지를 확인하는 것이 중요하다. 본 논문에서는 이러한 데이터셋, 즉 Sample을 고르는 기준으로 Anchor라는 지표를 만들었다. 이 논문에서는 여러가지 카테고리의 feature들을 이미지 레벨의 연결된 vector로 연결한다. 이러한 vector들을 clustering하는데 이를 통해서 scene에 특정한 대표적인 분포들을 예측한다. 이것이 바로 Anchor다.

Active Target Sample Selection

일반적으로 한 개의 domain에서의 Active learning의 경우에는 Sample Selection을 위하여 불확실성 기반의 metric들을 사용한다고 한다. 본 논문에서는 목표로 하는 multi-domain에서의 Active learning에서는 source domain과 더 유사하지 않은 target-domain sample일 수록 segmentation network을 더 보완할 수 있다고 주장한다. 이를 위해서 기존 논문(MADA)에서는 target samples들과 source anchor과의 거리를 계산하여 unlabeled target sample들의 중요도를 평가하려고 하였다. 이에 추가적으로 본 논문에서는 source anchor과의 거리 뿐만 아니라 target anchor까지의 거리를 고려하려 한다. 이는 기존 방식의 문제점인 선택된 sample들이 target domain 위주로 분포될 수 있고 데이터가 충분하다면 semi-supervised learning을 통해서 target anchor에 근접한 분포에 대한 knowledge를 학습할 수 있다는 점에서 모델 학습의 중목을 피하기 위한 것이다. 따라서 Dual-Domain-Distance가 가장 큰 sample들을 선택함으로써 target-domain 분포에서 유니크한 특성을 학습할 수 있는 것이다.

 

Semi-supervised Domain Adaptation

Step-1: Injecting Target-domain Specific Knowledge : Fig (b)

선택된 target sample들(label된)과 source domain sample들을 함께 학습에 사용

Step-2: Constructing Target-domain Anchors and Psuedo Labels : Fig (c)

라벨링되지 않은 target 데이터를 최대한으로 활요하기 위해서 step-1에서 fine-tune된 모델을 라벨링되지 않은 target sample들의psuedo label과 target domain anchor를 계산하기 위해서 사용한다.

Step-3: Semi-supervised Adaptation

마지막으로 source 데이터와 라벨링된 target 데이터 그리고 라벨링되지 않은 target 데이터를 함께 semi-supervised training에 사용한다. 

 

References

https://github.com/munanning/MADAv2

 

GitHub - munanning/MADAv2: MADAv2: Advanced Multi-Anchor Based Active Domain Adaptation Segmentation

MADAv2: Advanced Multi-Anchor Based Active Domain Adaptation Segmentation - GitHub - munanning/MADAv2: MADAv2: Advanced Multi-Anchor Based Active Domain Adaptation Segmentation

github.com

 

반응형

+ Recent posts