sensebench

윈도우 10에서 시작메뉴 검색이 안될 때

이것저것

윈도우10을 쓰다보면 어느 순간 시작메뉴(코타나)에서 검색이 안될 때가 있다.


되긴 되는데 리스트가 안뜰 때도 있고. 이럴 땐 검색로딩바가 움직일 때 엔터를 치면 뭔가 실행이 되긴 한다.


이럴 때 해결방법을 찾았다.


출처:

https://answers.microsoft.com/en-us/windows/forum/windows_10-win_cortana/cortana-not-finding-desktop-apps-when-searching/f612e995-6664-4b91-b6ae-96790e763858

https://superuser.com/questions/950009/cortana-search-is-not-finding-applications-on-windows-10


1. 관리자 권한으로 PowerShell을 실행한다.

(Windows키 + X -> A를 눌러서 실행. cmd라면 powershell 입력해서 실행)


2. 명령어 입력

Get-AppXPackage -Name Microsoft.Windows.Cortana | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}


3. 실행이 완료될 때 까지 대기



다시 시작메뉴에서 검색해보면 잘 작동하는 것을 볼 수 있다.


Glosbe for Wox

활동/개발활동

런처 프로그램으로 Hain 을 잘 쓰고 있고, 특히 네이버 사전 플러그인을 정말 유용하게 쓰고있었다.


그런데 무슨이유인지 몇몇 컴퓨터에서 Hain의 동작이 굉장히 말도안되게 느렸다.


그래서 새로운 런처프로그램을 찾았고, Wox라는 녀석을 알게되었다.


Wox는 아예 .NET으로 만들어져서인지 작동상 큰 문제가 없었다.



문제는, Wox에는 한국어 사전 플러그인이 없었다.

중국어 사전이나 영영사전만 있더라. (아쉽게도 Wox는 중국산이었다)

기껏해야 구글 translator정도인데, 나는 단어 사전이 필요하지 번역기가 필요한게 아니었다.



그래서 오픈 사전인 Glosbe의 API를 이용해서 플러그인을 대충 만들었다.


http://www.wox.one/plugin/189

좀 피곤했어서 술기운을 빌려 대충 세시간동안 뚝딱거려서 만들었다.

사실 플러그인 가이드문서가 좀 빈약해서 헤맸었다. (내가 가이드문서를 못찾은걸수도 있고)


https://github.com/ciiwol/GlosbeDictForWox

깃허브인데 누군가 보고 풀리퀘 날려줬으면 좋겠다. 기능 잘 추가해서.



끝.

Observer 패턴

프로그래밍놀이터/Design pattern
옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다. -위키피디아

역시 개요만 봐선 뭔소린지 못알아듣겠다. 위키백과를 잘 보면 다이어그램과 구현 예시가 나와있긴 한데, 알고 보면 정말 설명을 잘 해놓았지만 모르고 보면 이게 뭐지 싶다. 대부분의 블로그들 강좌를 보면 위키백과 내용과 크게 다르지가 않다. 그래서 역시 이게 뭐지 싶다. (그나마 어떤 분은 팬과 아이돌의 관계로 설명을 해주셨다)

Add인지 구독인지 뭔지를 하고..발행을 하고..관찰자를 객체에 붙여...상태 변화...끝나면 언레지스터...콜백....이것이 바로 감시자 패턴입니다!!

Observer패턴에 대해 처음 알아봤을 때 위와 같은 내용을 읽었고 도데체 이게 뭐하는거지라는 생각밖에 안들었다. 발행/구독은 또 뭐고 옵저버를 등록한다는데 그럼 옵저버는 뭐고 객체의 상태 변화는 또 뭐하는거지.

옵서버 패턴 할 때 Observer는 여러분이 알고있는 스타의 그 옵저버가 맞다. 한국어로는 '감시자' 또는 '관찰자'정도로 번역이 되며, 정식적인 한국어 표기는 '옵서버'라고 하는게 맞다고 한다. 진짜 그대로 설명하면, 어떤 객체의 상태 변화를 감지하는 감시자를 옵저버 리스트에 등록하고, 상태 변화가 일어나면 리스트의 옵저버들에게 통보를 하는 패턴이 Observer패턴이다.


.....


Observer패턴이 쓰일 수 있는 좋은 예를 하나 들어봐야겠다.
보통 파일을 인터넷에서 다운로드하면 다운로드바가 뜨고, 해당 파일을 얼마나 다운받았는지 시각적으로 표현한다. (50% 받았으면 막대의 절반이 차오르는 등), 그리고 그 옆에 정확히 몇퍼센트 받았는지 숫자로도 표기를 해준다. 어떤 웹브라우져는 다운로드 관리용 창이 또 있어서, 모든 다운로드중인 파일의 상태를 또 알려주기도 한다. 이럴 때, 얼마나 받았는지 표기하는 개체들(Progress bar, Text)들은 어떻게 실시간으로 다운로드 상태 정보를 갱신해서 보여줄까? 

다운로드 창(window)이 오직 1개라면, 다운로드 모듈과 개체들을 1:1로 연결해버리면 된다. 하지만 '하나의 다운로드'를 '여러 창'이 볼 수 있게 된다면 1:1로 연결할 수 없다.
여러 창이라는게 무슨말이냐면, 웹브라우져로 큰 파일 다운로드 하나 하고, 창을 여러개 띄운 후에 각 창에서 다운로드관리자를 켜보면 된다. 분명 다운로드는 1개만 되고 있는데, 띄워져있는 모든 창에서 다운로드 상태가 갱신이 된다.

이런 상황을 구현하기 위한 것이 바로 Observer패턴이다. '다운로드 모듈'안에 옵저버 리스트를 만들고, 1초마다 한번씩 옵저버 리스트 안의 옵저버들에게 다운로드 상태를 알려주는 것이다.
옵저버는? 각각의 창이 옵저버가 된다. 한 창이 켜질 때마다 그 창을 다운로드 모듈의 리스트에 추가한다. 창이 꺼지면 리스트에서 삭제한다. 이렇게 되면, 창이 켜질 때마다 다운로드 모듈의 리스트에 등록이 되고, 다운로드 모듈은 파일을 받을때마다 모든 창에게 다운로드 상태를 알려주게 된다.


컴퓨터에서 '알려준다'는 개념이 좀 이해가 안될 수 있다. 이 글에서 '알려준다'는, 그냥 '파라미터(매개변수)에 값을 넣어 함수를 호출한다'정도가 된다. 즉, 다운로드 모듈은 다운로드할 때마다 매개변수에 다운로드 상태를 담아서 리스트에 있는 객체들의 함수를 호출한다. 위 그림과 아래 그림은 똑같은 내용을 담고있다.

현실에서도 아주 굉장히 유사한 사례가 있다.

과제 공지용 단톡방을 생각해보자.

대학교에서 교수님이 '이제부터 모든 과제는 단체톡방을 이용하겠습니다. 톡방에 초대하겠습니다'라고 하셨다. 모든 학생은 단톡방에 초대가 되고, 교수님이 단톡방에 과제를 올리면 학생들은 톡방을 확인한 후 과제를 한다.
여기서, 톡방에 있는 학생 목록이 옵저버 리스트이며, 톡방에 글을 올리는 것은 '과제를 해라'라는 함수를 호출하는 것이다. 학생들의 핸드폰은 옵저버가 되며, 학생들은 옵저버를 통해 과제 상태 변화를 확인한 후 과제를 하는 것이다.


설명은 끝났다. 이제 이것을 Java를 이용해서 구현해보자. (C#은 나중에. 지금 프로젝트에서 Java를 하고있기도 하고, 요즘 대학교에선 취업시킨다고 Java기본문법만 4학년까지 주구장창 가르친다고 한다. C#은 Events와 Delegate를 사용해서 구현할 수 있다. 위키백과에 예제가 있음)

위에서 설명한 다운로드 모듈을 만들 것이다.
util.Observable을 쓰지 않고 Interface를 이용해서 구현해볼 것이다. 클래스와 인터페이스 포함 총 5개의 파일을 작성한다.
(다운로드모듈 class, 창 class, Main class, Observer interface, publisher interface)


1. 다운로드모듈 class (교수-학생 설명에서는 '교수님'에 해당하는 class)

import java.util.ArrayList;

public class DownloadModule implements IDownloadPublisher
{
	//옵저버 목록. 교수-학생 설명에서는 단톡방의 참가자 리스트에 해당된다.
    ArrayList<IDownloadObserver> observers;
    
    String filename;
    int percent;

    //생성자
    public DownloadModule(String filename)
    {
    	observers = new ArrayList<>();
        this.filename = filename;
        percent = 0;
    }

    //옵저버를 리스트에 추가한다. 교수-학생 설명에서는 단톡방에 학생이 들어오는 것에 해당된다.
    @Override
    public void add(IDownloadObserver observer)
    {
    	observers.add(observer);
    }

    //옵저버를 리스트에서 제거한다. 교수-학생 설명에서는 단톡방에서 학생이 나가는 것에 해당된다.
    @Override
    public void delete(IDownloadObserver observer)
    {
    	observers.remove(observer);
    }

    //옵저버들에게 상태를 알린다. 교수-학생 설명에서는 단톡방에 교수님이 '톡 보내기'버튼을 누르는 것에 해당된다.
    @Override
    public void update()
    {
    	for(IDownloadObserver observer : observers)
    	{
    		observer.update(filename, percent);
    	}
    }
    
    //상태를 업데이트한다. 교수-학생 설명에서는 교수님이 단톡방에 '과제하세요'라고 타이핑하는 것에 해당된다.
    public void updateState()
    {
    	System.out.println("Download state updated");
    	percent += percent<100?5:0;    //예시를 위해 상태가 갱신될 때마다 5%씩 증가하는걸로 한다.
    	update();
    }
}

2. 창 class (교수-학생 설명에서는 '학생'에 해당하는 class)

class Window implements IDownloadObserver
{
    String name;
    public Window(String windowName)
    {
        name = windowName;
    }

    //창의 상태를 업데이트한다. 교수-학생 설명에서는 학생들이 교수님의 톡을 본 후 행동하는 것에 해당된다.
    @Override
	public void update(String filename, int percent)
    {
        System.out.print(name + " - ");
        System.out.println(filename + " Downloading... " + percent + "%");
    }
}

3. Main class (실행용)

public class DownloadObserve { public static void main(String[] args) { //다운로드 모듈. (교수님) DownloadModule downModule = new DownloadModule("file1.zip"); //다운로드 상태를 받아볼 창 생성 (학생들) Window w1 = new Window("w1"); Window w2 = new Window("w2"); Window w3 = new Window("w3"); Window w4 = new Window("w4"); //각 창들을 옵저버 리스트에 등록 (학생들이 단톡방에 참가한다) downModule.add(w1); downModule.add(w2); downModule.add(w3); downModule.add(w4); //for문이 돌 때마다 다운로드모듈의 상태를 갱신시켜준다. (과제를 한다) for(int i=0; i<20; i++) downModule.updateState(); //다운로드가 완료되었으니 옵저버 해제 (과제를 끝냈으니 학생들이 단톡방에서 나간다) downModule.delete(w1); downModule.delete(w2); downModule.delete(w3); downModule.delete(w4); } }

4. Observer interface (교수-학생 설명에서는 단톡방->학생들의 폰에 해당하는 interface)

public interface IDownloadObserver
{
    public void update(String filename, int percent);
}

5. Publisher interface (교수-학생 설명에서는 교수님의 폰->단톡방에 해당하는 interface)

public interface IDownloadPublisher
{
    public void add(IDownloadObserver observer);
    public void delete(IDownloadObserver observer);
    public void update();
}


실행해보면, 리스트에 등록된 Window들이 모두 함수를 호출한다. 이렇게 어떤 한 개체의 상태 변화를 다른 개체들에게 바로바로 알리고 싶을 때 사용하는 것이 Observer 패턴이다.
Interface를 따로 구현한 이유는, 꼭 Window class가 아닌 다른 클래스를 사용하더라도 그 클래스에 해당 interface를 implements(구현)만 해준다면 된다. 즉, 한 개체의 상태 변화를 '다양한' 다른 개체에게 전달할 수 있어진다.

'프로그래밍놀이터 > Design pattern' 카테고리의 다른 글

Observer 패턴  (2) 2017.10.09
디자인 패턴  (0) 2017.10.09

디자인 패턴

프로그래밍놀이터/Design pattern

소프트웨어 개발 방법에서 사용되는 디자인 패턴은, 프로그램 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다. 알고리즘과 같이 프로그램 코드로 바로 변환될 수 있는 형태는 아니지만, 특정한 상황에서 구조적인 문제를 해결하는 방식을 설명해 준다. -위키피디아

말이 어렵다.
여러 백과사전 위키중에 위키피디아(위키백과)가 가장 말을 어렵고 정확하게 써놓는다.

소프트웨어를 개발하다보면 자연히 규모가 커질 것이고, 그 큰 소스코드들을 지속적으로 관리하고 효율적으로 개발하려면 코드 구조를 잘 설계해야된다. 스스로 코드 구조를 설계해도 좋지만 이미 세상에는 여러 사람들이 개발하면서 쌓은 설계 노하우를 정리하여 모아놓은 패턴이 있다. 이거를 디자인 패턴이라고 한다. 디자인 패턴은 소프트웨어의 '설계'에 들어가기 때문에 어떤 언어에 적용되는 그런 것이 아니다(언어마다 구현 방식이 다를 수는 있다).

좀 더 간단하게 말하자면, 예를 들어 C언어에서 두 변수의 값을 교체(swap)하는 방법 중 가장 흔하게 아는 방법은 아래와 같다.

int a = 10;
int b = 20;
int tmp;
//a: 10, b: 20

tmp = a;
a = b;
b = tmp;
//a: 20, b: 10

그리고, C언어에서 어떤 수의 1의 자리를 버리는 방법중 가장 흔한 방법은 아래와 같다.

int num = 1234;
//num: 1234

num = num / 10;
num = num * 10;
//num: 1230

이런 식으로, 어떤 복잡한 것을 구현하기 위해 통상 사용하는 규칙이나 방법같은게 있다. 이거를 소프트웨어 설계에 적용한 것이 디자인 패턴이다. (위에 두 코드는 디자인 패턴은 아니고 그냥 흔히 쓰는 방법)

디자인 패턴을 꼭 소프트웨어 개발에 적용할 필요는 없지만, 혼자 개발하는 것이 아닌 여럿이 개발하는 소프트웨어라면 당연히 개발 멤버들간에 정형화된 어떠한 규칙이 필요할 것이고, 가장 무난하게 쓰이는 것이 디자인 패턴이다. 뿐만 아니라 혼자 개발할 때에도 디자인패턴을 알아놓으면 소스코드의 구조를 파악하기가 쉬워지고, 특정 상황에서 문제 해결을 도와줄 것이므로 앵간하면 알아놓는 것이 좋다.

어쩌면 디자인패턴을 모르는 사람도 자신도 모르게 한두가지의 디자인패턴을 사용하고 있을 수 있다. 언어에서 문법적이나 API로 제공되는 것이 아닌 말 그대로 설계 규칙이기 때문이다.

디자인 패턴은 그 종류가 꽤 많은데, 대체적으로 24개정도를 많이 사용하는 것 같다. 위에서 언급했다시피 언어에 따라 디자인 패턴을 구현하는 방법이 다를 수 있다. (예를 들어 Observer패턴은 보통 Interface를 통해 구현하지만, Java는 util.Observable이 있고 C#엔 Events와 Delegate가 있어서 각자의 방법으로 구현할 수도 있다.)


디자인패턴은 알아놓으면 상당히 난감한 상황들을 상당히 간결하게 해결해 줄 수 있기 때문에 처음 만들 때 구조만 잘 짜서 적용하면 나중에 편해진다. 그래서 정리를 한번 해보려고 한다.

사실 인터넷에서 조금만 찾아보면 디자인패턴에 대해 정리가 아주 잘 되어있는데, 이게 원래 컴퓨터하는 사람들은 일부러 글을 어렵게 쓰는건지, 본인만의 세계가 있는건지, 아니면 내가 멍청한건지는 모르겠지만 한번에 잘 이해가 안됐다. 다들 클래스 다이어그램을 막 열심히 그리고 한두문단에 이어 코드하나 올려놓고 설명이 끝나버리는데, 사실 이런식의 설명은 매우 정확하고 이런 식의 설명을 읽고 이해하는 능력도 중요하다. 그런데 나는 아직 잘 안된다. 그래서 나도 공부할겸 나의 방식대로 내가 이해한 디자인패턴에 대해 글을 써보려고 한다. 가장 좋은 공부는 남에게 내가 아는 것을 설명하는 것이라고 하더라. 디자인 패턴이 뭔지 전혀 모르는 사람이, 디자인은 예체능 아니었나 생각이 드는 사람이 보고 이해할 수 있도록 쉽게 써보려고 한다(그래야 내가 나중에 다시 보고 이해함..)

한국식 단어를 최대한 안쓰려고 한다. 얘를 들면 'Observer패턴'은 '관찰자 패턴' 또는 '감시자 패턴'정도로 번역이 되는데, 번역해놓고 보면 뭔소린지 모르겠다. (거의 스타2가 처음 나왔을 때 드라군이 용기병이 된 느낌이다) 가급적이면 알파벳을 쓰겠지만 한글을 사용하더라도 완역이 아닌 음역으로 하려고한다.

'프로그래밍놀이터 > Design pattern' 카테고리의 다른 글

Observer 패턴  (2) 2017.10.09
디자인 패턴  (0) 2017.10.09

티스토리 툴바