블로그 이미지
* Microsoft MVP - Windows Development 2014 ~ 2020 http://youtube.com/FutureOfDotNet kaki104

카테고리

List All (601)
Visual Studio (6)
Blazor (2)
Windows App(Universa.. (100)
Xamarin Forms (4)
Bot Framework (19)
Azure (9)
Windows 10 (52)
WPF (7)
Facebook News & Tips (158)
Windows 8&8.1 (113)
Windows Phone 8 (42)
Silverlight (37)
HTML5 & MVC4 (16)
Portable Class Library (2)
Uncategorised Tips a.. (3)
Kinect for Windows (2)
ETC (12)
kaki104 Scrap (4)
App News (11)
Total543,763
Today11
Yesterday62


기본 사용방법 설명

Constructor Injection – 생성자 주입

- Resolve시에 기본으로 사용하는 방식
- private readonly T _instance; 를 이용해서 내부에서 사용
- Multiple Parameters
  public Driver(ICar car, ICarKey key)
  private readonly ICar _car;
- Multiple Constructors
  [InjectionConstructor] public Driver(ICar car)
  public Driver(string name)
- Primitive Type Parameter
  public Driver(ICar car, string driverName)

 

https://youtu.be/UHrrIDBubdg

 

UnityContainer Detail & Examples - Prism으로 시작하는 UWP app part15 - 2

 

Property Injection

- Attribute를 이용해서 Injection
- public T Instance { get; set;} 을 이용
- Dependency Attribute
  [Dependency] public ICar Car { get; set; }
- Named Mapping
  [Dependency("MyCar")] protected ICar Car { get; set; }
- Run-time Configuration
  public ICar MyCar { get; set; }
  unityContainer.RegisterType<IDriver, UWPDriverRuntime>(new InjectionProperty("MyCar", new BMW()));


Method Injection

- Attribute를 이용해서 Injection
- private readonly T _instance; 를 이용해서 내부에서 사용
- 생성자를 이용할 수 없는 경우 사용
- InjectionMethod Attribute
  [InjectionMethod] public void UseCar(ICar car) { _car = car; }
- Run-time Configuration
  public void MyCar(ICar car) { _car = car; }
  unityContainer.RegisterType<IDriver, UWPDriverRuntimeMethod>(new InjectionMethod("MyCar", new Audi()));


Overrides

- 등록된 Type이외의 Type을 Injection 시키는 방법
- ResolverOverride를 이용해서 등록된 Type을 재정의 할 수 있음
- ParameterOverride
  unityContainer.Resolve(
  new ParameterOverride("car", new BMW()));
  Override Multiple Parameters
  new ParameterOverrides {  { "car1", new Audi() },
                         { "carKey1", new AudiKey() }, 
                         { "car2", new BMW() },                 
                         { "carKey2", new BMWKey() }}
- PropertyOverride
  unityContainer.Resolve(new PropertyOverride("Car", new BMW()));
- DependencyOverride
  unityContainer.Resolve(new DependencyOverride(typeof(ICar), new BMW()));


Lifetime Manager

- UnityContainer에 등록된 객체에 대한 수명을 관리하는 방법을 지정할 수 있음
1. TransientLifetimeManager
   기본 수명 관리 방법, Resolve호출시 새로운 객체를 생성해서 반환
2. ContainerControlledLifetimeManager
   처음 Resolve시 싱글톤 객체를 생성하고, 이후 Resolve할 때마다 반환 
3. HierarchicalLifetimeManager
   2 항목과 동일, 추가로 하위 컨테이너가 자체 단일 객체를 만들어 반환 – 상위 컨테이너와 하위 컨테이너가 서로 다른 객체 관리
4. PerResolveLifetimeManager
   1 항목과 동일, 재귀호출시 생성된 객체는 재사용함
5. PerThreadLifetimeManager
   스래드당 단일 객체를 생성
6. ExternallyControlledLifetimeManager
   생성된 객체에 대한 약한 참조만 유지. 사용자 정의 수명관리자를 만들어서 사용할 수 있음

 

https://youtu.be/fQunFpAvTsg

소스

https://github.com/kaki104/PrismSample2019

Posted by MVP kaki104

댓글을 달아 주세요

1. IoC, DIP, DI, IoC Container

- IoC(Inversion of Control)
    클래스간의 느슨한 결합(loose coupling)을 만들기 위해 OOP에서 제어를 뒤집을 것을 권장하는 디자인 원칙(principle)
- DIP(Dependency Inversion Principle)
    클래스간의 느슨한 결합(loose coupling)을 만들기 위한 원칙(principle) 중 하나
    고수준 모듈(High-level)이 저수준 모듈(Low-level)에 의존해서는 안된다는 원칙. 둘다 추상화(예: interface)에 의존해야 함
- DI(Dependency Injection)
    IoC 원칙을 구현하는 디자인 패턴
    종속 객체를 주입
- IoC Container
    어플리케이션 전체에서 자동 종속성 주입을 관리하는 프레임워크
    Unity, Ninject, StructureMap, Autofac 등
- 위의 내용들을 관통하는 핵심
    가능한 모든 클래스는 Interface를 이용해서 추상화하고 Container를 이용해서 Injection 해서 사용한다.

2. Prism Framework features

- EventAggregator
    응용 프로그램에서 느슨하게 결합된 (loosely coupled) 구성 요소 간의 통신을 가능하게하는 이벤트 메커니즘(PubSubEvent)을 제공  
- UnityContainer
    가볍고 확장 가능한 종속성 주입 컨테이너 (Dependency Injection Container) 
- Region
    런타임에 느슨하게 결합된 (loosely coupled) UI로 구성된 레이아웃을 만들기 위한 방법
- Modules
    관련된 기능이나 UI를 내포한 클래스 라이브러리들을 느슨하게 결합 (loosely coupled) 하기 위한 방법
- UWP에서 사용가능한 버전
    Prism.Unity 6.3, Prism.Core 6.3
    UWP에서는 Region 기능 사용 못함


3. UnityContainer Overview

- 가볍고 확장 가능한 종속성 주입(Dependency Injection) 컨테이너 
- 특징
Interface Type이나 기본 Type에 대한 단순 맵핑 등록
기존 인스턴스 등록 지원
디자인 타임 등록은 물론 코드 등록 지원
생성자, 속성 또는 메서드를 통해 등록된 Type을 자동으로 주입
지연(deferred) 솔루션 지원
중첩 컨테이너 지원
수명 관리자를 이용해서 인스턴스를 자동으로 disposing
서비스 위치 기능 지원
Type 차단 및 인스턴스 차단을 지원


4. UnityContainer 사용하기(RegisterType)

UnityContainer.RegisterType Method
Type 맵핑을 위한 메소드
대표적인 Type등록 방법 및 예제
unityContainer.RegisterType();
unityContainer.RegisterType(); //생략가능
unityContainer.RegisterType<Interface, T>();
unityContainer.RegisterType<IAddPerson, AddPersonControl>();
unityContainer.RegisterType<Interface, T>(string);
unityContainer.RegisterType<IAddPerson, AddPersonControl>(“Control”);
unityContainer.RegisterType<IAddPerson, AddPersonPage>(“Page”);


5. UnityContainer 사용하기(Resolve)

UnityContainer.Resolve Method
컨테이너로부터 Type을 인스턴스 시켜주는 메소드
대표적인 Resolve 방법 및 예제
var t = unityContainer.Resolve();
var t = unityContainer.Resolve();
var t = unityContainer.Resolve();
var t = unityContainer.Resolve();
var t = unityContainer.Resolve(string);
var t = unityContainer.Resolve(“Page”);

https://youtu.be/8L9lBghcFbc

 

Prism으로 시작하는 UWP app 개발 Part1-14.pdf
1.89MB

Posted by MVP kaki104

댓글을 달아 주세요

UWP 앱에서 Cookie 관리하는 방법에 대해서 알아 보도록 하겠습니다.

 

* Cookie
클라이언트 컴퓨터에 저장된 작은 정보입니다.
클라이언트 컴퓨터에 Username, Password, City, PhoneNo 등의 사용자 환경 설정 정보를 저장하는 데 사용됩니다.
Persist Cookie : 만료되는 시간이 없는 지속형 쿠키
Non-Persist Cookie : 만료시간이 존재하는 비 지속형 쿠키

 

* HttpBaseProtocolFilter
Sharing Sessions Between HttpClient and WebViews on Windows Phones
HttpBaseProtocolFilter 클래스는 HttpClient 인스턴스에서 사용하는 기본 필터 또는 처리기를 제공합니다. 추가 필터가 HttpClient 인스턴스에 추가되지 않으면 HttpBaseProtocolFilter 개체가 유일한 필터가됩니다.
HttpBaseProtocolFilter 클래스는 여러 가지 저수준 HTTP 스택 동작을 전환하기위한 속성 집합을 제공합니다.

 

https://youtu.be/cr-sduHHiAs

소스

https://github.com/kaki104/PrismSample2019

Posted by MVP kaki104

댓글을 달아 주세요

Prism으로 시작하는 UWP app Part12
UWP에서 Script 직접 호출과 팝업 처리

UWP 앱에서 Script를 직접 호출하는 방법과 window.alert, window.confirm 등의 팝업 처리에 대해서 알아보도록 하겠습니다.


* InvokeScriptAsync
특정 인수를 사용하여 현재로드된 HTML에 지정된 스크립트 함수를 실행 합니다.
InvokeScript() 메소드는 Windows 8.1 이후 변경되거나 사용할 수 없습니다.
리턴 타입이 string이라는 점을 유의하시기 바랍니다.


* window.alert(), window.confirm() 사용 불가?

UWP의 MessageDialog()를 이용해야 합니다.
Package.appxmanifest - Content URIs
notify를 허용할 Uri 주소를 입력합니다.
window.external.notify()
var messageDialog = new MessageDialog(e.Value);
await messageDialog.ShowAsync();

 

https://youtu.be/ioDI03iXYy0

 

소스 : https://github.com/kaki104/PrismSample2019

Posted by MVP kaki104

댓글을 달아 주세요

WebView - Async, EventAggregator - Prism으로 시작하는 UWP app Part11

 

JavaScript에서 Async 메소드를 호출하고 결과를 처리하는 방법
Windows Runtime Component에서 비동기 메소드를 처리하는 방법
IEventAggregator를 이용해서 UWP나 다른 프로젝트로 이벤트를 넘기는 방법 등에 대해서 다루고 있습니다.

 

* Async : Windows Runtime Component에서 async Task 메소드 사용 방법
* IEventAggregator : 개념 및 사용 방법

 

https://youtu.be/LBS-UJtG2PQ

소스

https://github.com/kaki104/PrismSample2019

Posted by MVP kaki104

댓글을 달아 주세요

WebView 컨트롤에서 JavaScript와 연동을하는 기본적인 방법을 설명합니다.

 

* GitHub에서 소스 다운로드 받고, Branches에서 Part9 소스 싱크하기
* Windows Runtime Component 설명
* Examples

 

https://youtu.be/R89emHtaFvU

 

Posted by MVP kaki104

댓글을 달아 주세요

기존 VS 2017 개발 환경을 VS 2019 환경, Nuget package 업그레이드를 했습니다.
또한, WebView를 추가하고, User-Agent를 변경하여 모바일 브라우저로 인식이 되도록 하는 방법을 설명합니다.

* 개발 환경 설명
* 따라하기 위해서 GitHub에서 소스를 어떻게 받아서 사용하는지 설명
* WebView 페이지 추가
* User-Agent란
* UserAgentHelper 추가하고 사용하기

 

https://youtu.be/pou8078vX2w

 

소스 : https://github.com/kaki104/PrismSample2019

Posted by MVP kaki104

댓글을 달아 주세요

WinForms, WPF 프로젝트에서 Windows 10 API를 사용하는 방법과 MSIX 패키징을 만들어서 배포하는 방법등을 설명합니다.

 

* 환경
* Microsoft.Windows.SDK.Contracts
* Microsoft.Toolkit.Wpf.UI.Controls
* XAML Islands Components Future
* Seamless application deployment, updates, and optimized for DevOps
* MSIX Core
* 트러블슈팅

 

https://youtu.be/oVJJMGlc_Ew


* 소스 :

https://github.com/kaki104/WpfTest

Posted by MVP kaki104

댓글을 달아 주세요

* Prism 앱의 레이어에 대해 설명합니다.


. 재정의 불가능 영역 : Popup, ContentDialog, MediaElement
. 재정의 가능 영역 : 일반 Page
. 기타 영역 : MessageDialog

 

 

 

* 소스 : https://github.com/kaki104/PrismSample

Posted by MVP kaki104

댓글을 달아 주세요


나만의 AI Speaker 만들기


라즈베리파이, UWP, Microsoft Azure 서비스를 이용해서 한글을 지원하는 AI Speaker를 만드는 과정을 설명드릴려고 합니다.

총 9개의 동영상으로 구성할 예정입니다.



PDF 등록했습니다!!

AISpeaker.pdf



Part1

. Smart Speaker, AI Speaker란
. AI Speaker 종류(국내, 해외)
. AI Speaker 관련 기사 및 사이트
. System diagram
. Microsoft Harman Kardon Invoke with Cortana
. Microsoft Suface Headphone
. 준비물

. Part1 동영상 바로가기



Part2

. Bot 생성 및 배포
. NuGet packages설치
. Azure에 Publish
. Channel 생성 및 연결
. DirectLine 추가
. Bot 연결 테스트
. Part2 동영상 바로가기


. Part2까지 소스 - 모든 개발이 완료되면 전체 소스를 Git에 업로드하도록 하겠습니다.

KakiAISpeaker.Bot_part2.zip



Part3

. 클라이언트 프로젝트 추가
. NuGet packages 추가
. MainPage.xaml 코드 추가
. MainViewModel.cs 코드 추가
- DirectLineClient 생성 및 연결
- WebSocketClient 연결
. 클라이언트 실행해서 연결 테스트

- Part3 동영상 바로가기




. 모든 개발이 완료되면 전체 소스를 Git에 업로드하도록 하겠습니다.

KakiAISpeaker_part3.zip



Part4

* Client 
. 음성 인식 기능 추가
. SRGS.xml 파일 추가
. Direct Line을 이용해서 start 메시지 전달
* Bot
. start 메시지 수신 후 start conversation 메시지 회신

- Part4 동영상 바로가기




. 모든 개발이 완료되면 전체 소스를 Git에 업로드하도록 하겠습니다.

KakiAISpeaker_part4.zip


yj님께서 달아주신 댓글입니다.


Client의 MainViewModel.cs에 있는 코드

//음성 인식 초기화 - 한글을 지원하지 않기 때문에 영문으로 인식하도록 함

var supportedLanguages = SpeechRecognizer.SupportedGrammarLanguages;

var enUS = supportedLanguages.FirstOrDefault(p => p.LanguageTag == "en-US")

?? SpeechRecognizer.SystemSpeechLanguage;

await InitializeRecognizerAsync(enUS); //enUS가 계속 null이라고 안되는데 잘모르겠어요..ㅠ


혹시 고민하실까봐 댓글 달아 둡니다.

null뜬 이유는 window설정을 미국?이나 영어권으로 해야되는 것 같더라고요.

혹시나 모르실분들을 위해서 추가해주면 좋을 것 같습니다^^



Part5
음성명령 녹음하고 전송하기
- 녹음을 위한 MicrophoneHelper추가
- 녹음 시작, 끝내기
- 사용자 음성인지 확인하기
- 저장된 음성 파일 Bot에 전송하기

* ClientStates를 이용한 제어 개요
* ClientStates 변화과정과 관련 소스 살펴보기

- Part5 동영상 바로가기



KakiAISpeaker_part5.zip



Part6

건강이 나빠져서 동영상 제작이 좀 늦어졌습니다. 다음편은 빨리 올리도록 하겠습니다.


* 서비스 추가하기
- Azure
    . Speech Service 추가
    . Storage 추가
- AWS
    . Polly Service 추가
- Part6 동영상 바로 가기



Part7


- 수신된 음성 명령 확인
- Speech Service 헬퍼 추가, 인증 클래스 추가
- Polly Service 헬퍼 추가
- Blob Service 헬퍼 추가
- 결과 클라이언트에 반환하기
- appsetting.json에 키 값 사용하기
- Microsoft.Extension.Http nuget 사용하기

** 소스 : https://github.com/kaki104/KakiAISpeaker

- Part7 : 동영상 바로 가기


Part8

Part9



2019-04-17 업데이트


Visual Studio 2019 기준으로 스크린샷을 다시 만들었습니다.



설치를 완료하기 위해서는 Visual Studio 2019를 재시작 해야합니다.


설치완료 후 Visual Studio 2019를 시작하시고, 시작 창에서 Create a new project를 선택하시고 bot으로 검색을 하시면 아래와 같은 프로젝트 목록을 보실 수 있습니다. 여기서 EchoBot을 선택하시면 될 것 같습니다.



프로젝트 생성 후 IIS로 실행하기를 하니 정상적으로 봇 프로젝트가 실행되는 것을 확인했습니다.

참고하세요


Posted by MVP kaki104

댓글을 달아 주세요

  1. 2019.03.30 20:05  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 2019.04.01 22:10 신고 MVP kaki104  댓글주소  수정/삭제

      문의하신 내용에 헤더 파일을 읽어 오지 못한다고 하시는 걸 봐서는 c++인 것 같습니다. 제가 c++을 못해서 정확한 내용은 알기가 힘드네요, 에러메시지(영문)과 툴체인과 크로스컴파일러를 설치하라는 검색 결과의 링크를 알려주시면 찾아 보도록 하겠습니다.

  2. 2019.04.11 11:38  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. 2019.05.08 11:59  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 2019.05.08 12:11 신고 MVP kaki104  댓글주소  수정/삭제

      메모리가 부족해서 생기는 문제는 아닌것 같습니다.
      Visual Studio 2019 커뮤니티 버전으로 작업하신 것인지 다시 확인해주시고,
      템플릿 설치가 완료되었는지도 확인해 주시고, Extensions은 Visual Studio를 종료해야지만, 설치 메시지 창이 출력되니, 종료하시고 설치 확인시 예~를 눌러주시고, 다시 비주얼 스튜디오를 실행해서 확인해 주세요.

    • 2019.05.08 12:14 신고 MVP kaki104  댓글주소  수정/삭제

      이레저레 확인해도 이상이 없다면, 윈도우부터 새로 설치하고 비주얼스튜디오를 다시 설치하는 방법도 고려해 보면 좋을 것 같습니다. ;;;

  4. 2019.05.08 15:34  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 2019.05.09 16:05 신고 MVP kaki104  댓글주소  수정/삭제

      음 될 수 있으면 Visual Studio 2019 버전을 사용하시기를 권장합니다. 현재 MS Build 2019 행사가 끝나서 대부분의 오픈 소스들이 Visual Studio 2019버전에 맞춰서 수정이 되어 있는 상태라 그럴 수도 있을 것 같기 때문입니다.

    • 2019.05.09 16:12 신고 MVP kaki104  댓글주소  수정/삭제

      그리고 될 수 있으면 영문 오류 메시지를 알려주시면 제가 좀더 구체적인 방법을 알려드릴 수 있을 것 같습니다.

      윈도우를 영어를 기본 언어로하고, 비주얼 스튜디오의 언어도 영문으로 하면 오류 메시지가 영어로 나옵니다.

  5. 2019.11.22 02:51  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  6. 2019.11.23 18:37  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 2019.11.26 22:03 신고 MVP kaki104  댓글주소  수정/삭제

      전 이것을 토대로 ai speaker 을 만드려고 합니다. 이 파트 순서대로 만들면 ai speaker를 만들 수 있나요??
      -> 상업용으로 판매하는 정도는 아니라도 혼자 사용하거나 교육용으로 사용하는 것은 가능하다고 생각됩니다.

      또한, luis나 qnamaker를 토대로하여 화자의 의도를파악해 따른 질문이나 답변을 하고 싶습니다.
      또한 필요한 정보를 azure 계정 database에 저장하려합니다.
      이러한 코딩을 어떻게 해야하는지 알 수 있나요??
      ==>>이러한 것은 제가 공부해서 할 수 있는지 기한은 11월 28일 전까지 짜는 것 입니다.
      빠른 답변이나 도움이 될만한 자료를 알려주시거나 하면 감사하겠습니다!!!
      -> 시간이 너무 지나버렸네요..23일날 달아주셨는데..28일전까지라면 시간이 너무 촉박하네요
      가능은 하겠지만 쉽지는 안을것 같습니다.

  7. 2019.11.23 20:35  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다