블로그 이미지
This blog covers the latest technologies in Microsoft .Net. In 2020, I will be talking about Uno Platform frequently. http://youtube.com/FutureOfDotNet kaki104

카테고리

List All (615)
Uno Platform (3)
Visual Studio (7)
Blazor (2)
Windows App(Universa.. (106)
Xamarin Forms (4)
Bot Framework (19)
Azure (10)
Windows 10 (53)
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 (13)
Total558,034
Today25
Yesterday135

How to deploy UWP apps
- Microsoft Store
- App Installer
  . After Windows 10 version 1803
  . Can be installed Local, Shared Folder, or on the Web

For developers
- Settings -> Update & Security -> For developers -> Sideload apps
- Sideload apps must be selected in order to install apps outside of the Microsoft Store.

Install Windows 10 apps with App Installer

Create an App Installer file with Visual Studio
- Doc
  . Windows 10 version 1803 or higher
  . Visual Studio 2017 version 15.7 or higher
  . Create sideload apps that can be automatically updated using .appinstaller files
  . UWP TargetPlatformMinVersion version 1803 or higher
- Work
  . Windows 10 version 1909
  . Visual Studio 2019 version 16.5.4

Demo
- Create UWP app

Package
- UWP app project -> Right-click -> Publish -> Create App Packages…
- Click the Create button to create a test certificate
- Enter additional simple information
- Enter additional simple information

Select and configure packages
- Choose the platform you want to support
- For release of the full version, please select a Release

Configure update settings
- Installer location
  . Enter the location to copy the installation files
  . You can enter the web path, shared folder path, and local folder path.
  . Copy the completed distribution package to the folder you just entered.
  Ex) Web https://hellobotstorage.z12.web.core.windows.net/apps
  Ex) Local c:\install
  Ex) Shared Folder \\kakiserver\home\apps

Finished creating package
- Output location
  . This is where the package was created.
  . Click the link to open the folder with File Explorer.
  . Copy files to the installer location

Install apps from web
- I use Static Web in Azure
https://hellobotstorage.z12.web.core.windows.net/apps

Installation failed
- Either you need a new certificate installed for this app package…
- If you buy a signed certificate and use it, this is not necessary.
- Certificate Sales Site I Know

Install Certificate
- Additional Links -> Publisher Certificate
- Install Certificate… -> Local Machine -> Place all certificates in the following store -> Trusted Root Certification Authorities -> OK
- Next -> Finish

Update app on the web
- Create an updated version and copy it to the installation location
- Run the installed apps (check for update version existence)
- App exit
- Re-run the app(update progress)

 

https://youtu.be/uedWhxNSs3Y

 

'Windows App(Universal App) > Beginner' 카테고리의 다른 글

Install and update UWP apps from the Web  (0) 2020.04.25
LINQ - Join Operations - part5/5  (0) 2020.04.15
LINQ part 4  (0) 2020.02.11
LINQ part 3  (0) 2020.02.04
LINQ part2  (0) 2020.01.31
LINQ part1  (0) 2020.01.29
Posted by kaki104

댓글을 달아 주세요

https://youtu.be/bA3oTTVseiE

LINQ 마지막 강의 입니다.

고생하셨습니다~

 

1. Conversion operators
- LINQ Result =} IEnumerable{T}
- ToArray()
  var doublesArray = sortedDoubles.ToArray();
- * ToList()
  var wordList = sortedWords.ToList();
- ToDictionary()
   var scoreRecordsDict = scoreRecords.ToDictionary(sr =} sr.Name);
- * OfType{T}()
  var doubles = numbers.OfType{double}();


2. Element operators
- First()
  (from p in products where p.ProductID == 12 select p) .First();
  .Single() ?
- * FirstOrDefault()
  int firstNumOrDefault = numbers.FirstOrDefault();
  .SingleOrDefault() ?
- Last()
- LastOrDefault()
- ElementAt()
  (from n in numbers where n } 5 select n).ElementAt(1);


3. Generators operators
- Range()
  From n in Enumerable.Range(100, 50) select (Number: n, OddEven: n % 2 == 1 ? "odd" : "even");
- Repeat()
  var numbers = Enumerable.Repeat(7, 10);


4. Quantifiers
- * Any()
  bool iAfterE = words.Any(w =} w.Contains("ei"));
- All()
  bool onlyOdd = numbers.All(n =} n % 2 == 1);


5. Aggregate Operators
- * Count()
  int uniqueFactors = factorsOf300.Distinct().Count();
- Sum()
  double numSum = numbers.Sum();
- Min()
  int minNum = numbers.Min();
- Max()
  int maxNum = numbers.Max();
- Average()
  double averageNum = numbers.Average();
- Aggregate()
  double endBalance = attemptedWithdrawals.Aggregate(startBalance, (balance, nextWithdrawal) =} ((nextWithdrawal {= balance) ? (balance - nextWithdrawal) : balance));


6. Sequence Operations
- Concat – 지연 실행 
  Var allNumbers = numbersA.Concat(numbersB);
  Union과 비슷하나 중복 제거를 안함
- Zip – 지연 실행
  Int dotProduct = vectorA.Zip(vectorB, (a, b) =} a * b).Sum();
  각 시퀀스에 인덱스를 이용해서 병합
- SequenceEqual
  bool match = wordsA.SequenceEqual(wordsB);


7. Query Execution
- Deferred Execution 지연 실행
  var q = from n in numbers select ++i;
  Foreach (var v in q) { Console.WriteLine($”v={v}, i={i}”); }
- Forcing Immediate Execution 바로 실행
  var q = (from n in numbers select ++i).ToList();
  Foreach (var v in q) { Console.WriteLine($”v={v}, i={i}”); }
- Reuse Query
  var lowNumbers = from n in numbers where n {= 3 select n;


8. Join Operations
- Cross Join
  from c in categories join p in products on c equals p.Category select (Category: c, p.ProductName);
- Group Join
  from c in categories join p in products on c equals p.Category into ps select (Category: c, Products: ps);
- Cross Group Join
  from c in categories join p in products on c equals p.Category into ps from p in ps select (Category: c, p.ProductName);
- Left Outer Join
  from c in categories join p in products on c equals p.Category into ps from p in ps.DefaultIfEmpty() select (Category: c, ProductName: p == null ? "(No products)" : p.ProductName);
- Right Outer Join? 다중키인 경우?
- 메뉴 항목 추가/삭제 화면에 등록 메뉴와 미등록 메뉴를 분리해서 보여주는 경우 사용

 

            var allMenus = CMenus.CMenuList;
            var regMenus = new List 
                {
                    new CMenu{ MenuId = 1, ParentId = 0, DisplayName = "Menu1"},
                    new CMenu{ MenuId = 3, ParentId = 0, DisplayName = "Menu3"},
                    new CMenu{ MenuId = 5, ParentId = 0, DisplayName = "Menu5"},
                    new CMenu{ MenuId = 12, ParentId = 1, DisplayName = "Menu12"},
                    new CMenu{ MenuId = 14, ParentId = 1, DisplayName = "Menu14"},
                };
            var unregMenus = from aMenu in allMenus
                             join rMenu in regMenus
                             on aMenu.MenuId equals rMenu.MenuId into joiner
                             from j in joiner.DefaultIfEmpty()
                             where j == null
                             select aMenu;

            foreach (var menu in unregMenus)
            {
                Console.WriteLine($"{menu.MenuId}, {menu.ParentId}, {menu.DisplayName}");
            }

 

 

'Windows App(Universal App) > Beginner' 카테고리의 다른 글

Install and update UWP apps from the Web  (0) 2020.04.25
LINQ - Join Operations - part5/5  (0) 2020.04.15
LINQ part 4  (0) 2020.02.11
LINQ part 3  (0) 2020.02.04
LINQ part2  (0) 2020.01.31
LINQ part1  (0) 2020.01.29
Posted by kaki104
TAG join, LINQ, linq101

댓글을 달아 주세요

* Groupings
- group
  - group n by n % 5 into g

* Set operation
- Distinct 중복제거
  - var uniqueFactors = factorsOf300.Distinct();
- Union 중복제거 결합
  - var uniqueNumbers = numbersA.Union(numbersB);
- Intersect 교집합
  - var commonNumbers = numbersA.Intersect(numbersB);
- Except 제외
  - IEnumerable aOnlyNumbers = numbersA.Except(numbersB);     

 

https://youtu.be/WR8p4bKuqyI

 

- 메뉴 모델과 데이터

CMenu.cs
0.00MB
LINQ part4.pdf
0.27MB

'Windows App(Universal App) > Beginner' 카테고리의 다른 글

Install and update UWP apps from the Web  (0) 2020.04.25
LINQ - Join Operations - part5/5  (0) 2020.04.15
LINQ part 4  (0) 2020.02.11
LINQ part 3  (0) 2020.02.04
LINQ part2  (0) 2020.01.31
LINQ part1  (0) 2020.01.29
Posted by kaki104

댓글을 달아 주세요

Partitions
- Take
    numbers.Take(3)
- Skip
    numbers.Skip(4)
- TakeWhile
    numbers.TakeWhile(n => n < 6)
- SkipWhile
    numbers.SkipWhile(n => n % 3 != 0)


Orderings
- OrderBy
    orderby word
- Custom Comparer
    words.OrderBy(a => a, new CaseInsensitiveComparer())
- OrderBy ~ Descending
    orderby d descending
- ThenBy
    orderby degit.Length, digit
    words.OrderBy(a => a.Length).ThenBy(a => a, new CaseInsensitiveComparer())
- Reverse
    .Reverse()

https://youtu.be/K8V7_UDWfQs

LINQ part3.pdf
0.18MB

'Windows App(Universal App) > Beginner' 카테고리의 다른 글

LINQ - Join Operations - part5/5  (0) 2020.04.15
LINQ part 4  (0) 2020.02.11
LINQ part 3  (0) 2020.02.04
LINQ part2  (0) 2020.01.31
LINQ part1  (0) 2020.01.29
UnityContainer Detail & Examples - Prism으로 시작하는 UWP app part15  (0) 2020.01.12
Posted by kaki104

댓글을 달아 주세요

Projections 
- select
- anonymous type
- tuple type
- where & select
- Multiple Sequences
- Child Sequence, Select Many
- Multiple where
- Indexed Select Many
- Practice
https://youtu.be/5Rq-ZvUvfOc

LINQ part2.pdf
0.19MB

'Windows App(Universal App) > Beginner' 카테고리의 다른 글

LINQ part 4  (0) 2020.02.11
LINQ part 3  (0) 2020.02.04
LINQ part2  (0) 2020.01.31
LINQ part1  (0) 2020.01.29
UnityContainer Detail & Examples - Prism으로 시작하는 UWP app part15  (0) 2020.01.12
UnityContainer - Prism으로 시작하는 UWP app part 14  (0) 2020.01.06
Posted by kaki104

댓글을 달아 주세요

What is LINQ
- Language Integrated Query
- 다른 소스 및 Type에서 데이터를 검색하고 활용하기 위한 표현식
- 컬렉션, Ado.NET, DataSet, XML Docs, 웹 서비스 및 MS SQL Server 및 기타 데이터베이스등 다양한 데이터 소스에서 검색 및 활용이 가능
- 101 LINQ samples

LINQ Basic


LINQ Basic Keywords
- from : 쿼리 표현식은 from으로 시작해야함
- in : 4가지 경우에 사용되며 일반적으로 from과 함께 사용
- let : 쿼리식에서 하위절의 결과를 저장하여 후속절에서 사용하는 것이 유용한 경우에 let 키워드를 사용하여 새로운 로컬 변수를 만들어서 다양하게 활용이 가능
- into : group, join or select 절의 결과를 저장하는 임시 식별자를 만들수 있음
- on : join 절에서 결합 조건을 지정하는데 사용
- equals : join 절에서 두 시쿼스의 요소를 비교하는데 사용

Restrictions 제한
- Where


https://youtu.be/ci2U1cG6TvI

 

LINQ part1.pdf
0.22MB

Posted by kaki104

댓글을 달아 주세요


기본 사용방법 설명

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 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 kaki104

댓글을 달아 주세요

 

https://youtu.be/3QhmCj5T3pA

 

1. Application Log, Logger 

- 참고
https://michaelscodingspot.com/logging-in-dotnet/
- Application Log
소프트웨어 응용 프로그램에서 오류, 정보, 이벤트 및 경고 등의 데이터를 기록한 어떤것(파일, 데이터 등)을 이야기 합니다.
- Logger
로그를 남기기 위한 클래스나 도구를 이야기합니다.
멀티 스레드 환경과 비동기 환경에서 로그를 남길 때 매우 유용

2. Where do you store the Logs?

- File system
- Database
- Searchable Solutions
- Logging to Standard Output (Console) and Debug Output (Trace)
- Logging to Event Viewer
- Log to Event Tracing for Windows(ETW)

3. Top NuGet Logging packages

- Serilog – 64.2M
- NLog – 40.2M
- Log4Net - 39.2M
- Splat – 2.99M
- …
- Serilog vs NLog 성능 비교
https://github.com/pcTOR/LoggingPerformance/issues/1#issuecomment-397869472

4. Log4Net
http://logging.apache.org/log4net/

- Features
  여러 프레임워크 지원
  다중 Targets 지원
  계층적 로깅 아키텍처
  XML Configuration
  Dynamic Configuration
  Logging Context
  Proven architecture
  Modular and extensible design

5. NLog
https://nlog-project.org/

- 손쉬운 구성
Configuration file and programmatically
- 템플릿 지원
Layout renders
- 확장성
Custom targets or pass custom values
- 구조화된 로깅

6. Serilog
https://serilog.net/

손쉬운 설정, 깔끔한 API, 모든 최신 .NET 플랫폼에 적용가능
강력한 구조화 된 이벤트 데이터

7. 소스
https://github.com/kaki104/LoggerExample

 

Posted by 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 kaki104

댓글을 달아 주세요