สรุปงาน .NET Conf TH 2022

สรุปอาจจะมืนๆนิดนึงครับ วันศุกร์มีไปฉีดวัคซีนมาครับ ถ้ามีอะไรตกหล่นไป แนะนำกันได้ครับ

การเดินทาง
  • รู้สึกเหมือนอยู่คนละซีกโลก ปกติผมจะมาทำงานแถววงเวียนใหญ่-คลองสาน ไม่เคยข้างฟากไปทางฝั่งโน้นเหมือนกัน พอมานั่งรถเมล์ ตอนแรกที่ Plan ไว้ว่าจะนั่ง 4-53 (149) มาลงแถวนั้น แล้วเดินมานิดหน่อย แต่รอรถนานเกิ้น สุดท้ายได้เป็น Solution 4-39 (40) ต่อรถกระป้องไป BTS วงเวียนใหญ่ แล้วมา BTS ช่องนนทรี ต่อครับ ออกทางที่ 2 ตึกสาธรธานีได้เลยครับ
  • ระหว่างทางตั้งแต่ทางเชื่อม BTS มีป้ายบอกมาเรื่อยๆ จนมาถึง Glowfish Sathorn หาทางเข้าไม่เจอ 555 ผมเดินวนอยู่แถวนั้น 55 //ตอนแรกคิดว่ามันเป็นกระจกเฉยๆ ไม่คิดว่าจะเป็นประตู
What's new in C# 11
  • Raw String literal - Print String ให้ออกมาเหมือน Code ที่ระบุไว้ เพื่อให้อ่านง่าย แต่ต้องระวัง อักษระพิเศษ เช่น “ $ //ส่วนตัวมองว่า มันคล้ายเขียน PowerShell ใน Jenkin Pipeline
  • Generic Attribute
  • Static Abstract Members - ลดการใช้ reflectionc ลง มันจะพังตอน runtime และ แต่ถ้าใข้Generic มากขึ้น และเจอปัญหาตอน Complie Time
  • Generic Math เพิ่ม INumber<T> ช่วยให้ Code Logic เหมือนกัน แต่ต่าง DataType ไม่ต้อง copy แปะ //อันนี้ดีย์
  • Required Members - ถ้ากำหนด property required แล้ว ตอน object initalizers มันจะตรวจตอน complie time ให้ตอน new object
  • List Pattern Matching - ถ้าแบบเดิม วน loop ยาว อันนี้มากับตัวภาษาแบบ Python เลย ,หรือจะเอามา format string ได้
  • UTF-8 String Literals - ปกติ C# string เป็น utf-16 ระบบอื่นๆยังใช้ utf-8 กัน ของเดียวต้องมาเขียนแปลวกันยาว อันใหม่ ใข้ u8.toArray()
  • nameof -extend scope
  • Auto default construct
  • File Local Type เพิ่ม keyword file ตอนสร้าง class ช่วย Source Code Generation
  • Pattern Match Span
  • Improved performance of method group conversion to delegate
  • Numeric int pointer alias
  • Low-level Struct Improvements
  • Honorable Mention: Detect multiple enumerations of IEnumerable

สำหรับ Session มีตัว C# Notebook แบบ jupyter notebook ให้ลอง Execute กันด้วยครับ

Resource: What's new in C# 11 - C# Guide | Microsoft Learn

Containerize .NET applications to Azure Kubernetes Service
  • K8S สั้นๆ - Open-Source Container Management Tools ตัว Master Node มาจัดการ Worker Node ข้าวใน worker node มี pod ตัว Container เราก็ Run อยู่ในนี้แหละ ซึ่งทาง Azure มี Service AKS ให้ใช้เหมือนกัน
  • แล้วที่นี้ .NET7 มีของเล่นใหม่ ตอนที่ Publish Project เราสามารถให้มันสร้าง docker image ได้เลย โดยการ Reference Microsoft.NET.Build.Containers และ ตอน Publish จะกำหนด PublishProfile=DefaultContainer
# add a reference to a package that creates the container
dotnet add package Microsoft.NET.Build.Containers

# publish your project for linux-x64
dotnet publish --os linux --arch x64 -c Release -p:PublishProfile=DefaultContainer
  • เมื่อได้ Package ทำตาม push docker image ขึ้น Azure Container Repository (ACR)
  • สร้าง AKS และ Link เชื่อมให้ AKS รู้จัก Repository ACR
  • สุดท้ายกำหนด YAML ขึ้นมาสำหรับ Deploy

ส่วนตัวชอบเรื่อง มัน Build Image ได้เลยนี่แหละ แต่ที่ดูน่าจะเหมาะกับส่วน Develop อยู่ ถ้างานที่ใช้ตัว docker file มี step ซับซ้อน อาจจะต้องใช้แบบเดิมนะ

Resource: Announcing built-in container support for the .NET SDK - .NET Blog (microsoft.com)

What's New in .NET 7 for Authentication and Authorization

Default Authentication Scheme (.NET7)

  • Recap Authentication - Who you are
    - Authentication Scheme - วิธีที่ใช้ Identity ซึ่งมีตัว Authentication Handler ที่มาคู่กันด้วย มองเป็น Interface / Implement อาทิ เช่น Cookie / JWT เป็นต้น
  • Default Authentication Scheme เป็น Breaking Change ของ .NET7 มี Default ให้เลย ถ้าใส่ Scheme มาอันเดียว ช่วยลด Code ที่มาเขียนจัดการเรื่องนี้ด้วย

dotnet user-jwts (.NET7)

  • Command Line Tools ที่เอามาสร้าง Token สำหรับในช่วง Development โดยมันจะเข้าไปเขียนตัวไฟล์ app
  • NOTE ถ้าอยากใช้ JWT Ref Microsoft.AspNetCore.Authentication.JwtBearer ก็ใช้ได้เลย

Policy-Based Authorization for Specific End Point (.NET7)

  • Recap Authorization - Which resource can you access
  • Recap
    - ClaimPrincipal - มองว่าเป็นตัวเรา ที่สามารถถือบัตรแสดงตัวตน (ClaimIdentiy) ได้หลายอย่าง เช่น ใบขับขี้ บัตรประชาชน
    - ClaimIdentity - บัตรแสดงตัวตน
    - Claim - ข้อมูลในบัตร (ClaimIdentity)
  • Recap Policy-Based Authorization - ปกติเราต้องไปกำหนดที่ Builder >Add Policy + UseAuthorization และที่ Controller มาใส่ Attribute Authorize (Policy ที่ต้องการ)
  • Policy-Based Authorization for Specific End Point - เขียนง่ายสะดวก และค้นหาได้ง่าย เพราะไม่ต้องไปทำ Policy เพิ่ม
app.MapGet("/special-secret", () => "This is a special secret!")
    .RequireAuthorization(p => p.RequireClaim("scope", "myapi:secrets"));

Demo

Resource: ASP.NET Core updates in .NET 7 Preview 5 - .NET Blog (microsoft.com)

Building a paved path for your engineers
  • ปัญหาที่เจอมา เรียกว่าทุกคนอยากไปทาง monolithic แล้ว monolithic ปัญหาของมัน มีอะไรบ้าง
    - Large Code Base พอเยอะ แล้วจำนวน Test ก็ ถ้าทำครบหมด มันจะ Run ได้ช้าด้วย
    - Test flakiness (Test ที่ผลไม่น่าเชื่อถือลูกผีลูกคน) ถ้าเราบอกว่าระบบของเรา Stable 99% จำนวน Test ที่เชื่อถือได้ ให้เอา 0.99 x จำนวน Test ทั้งหมด
    - ใช้ Lead Time ที่มากขึ้นตาม Code ที่เยอะ
    - การ Upgrade ยากด้วย เพราะ Code มันใหญ่ และอาจจะทำไม่ได้ทีเดียว เหมือนจะเอา mono repo มาช่วยเรื่อง Stack ที่มีหลายส่วน แต่ไม่ Work (ไม่แน่ใจว่าฟังผิดไหมนะ)
    - พวก IDE ทำพัง เวลา Build แล้วติด ตอน IDE แนะนำอาจะต้องทำความเข้าใจก่อนนะ //ส่วนตัวตอน Review Code จะเคย Code ที่มัน Reference ข้าม Layer ADO เรียก Service ได้ พอสอบถามเจ้าตัวคนที่ผิด Visual Studio 555
  • ทำไมคนถึงอยากทำ Monolithic
    - เพราะ มันไม่ต้องมาวุ่นวายอะไรเลย มี Stack พร้อมหมด ไม่ต้องมีสิ่งที่ต้อง Concern ถ้าทำใหม่ในหัวจะมี keyword อีกมากมาย
  • แก้ปัญหายังไงหละ ?
    - ทำให้การสร้างใหม่ มันง่าย และสะดวก โดยใช้ dotnet new <template> เตรียมสิ่งเหล่านั้นมาให้พร้อมตอนสร้าง Project นอกเหนือจากสร้าง Ecosystem / สาย Support สอนในองค์กร และ Resource ต่างๆให้ศึกษา
  • จากทั้งหมดนี่สรุปว่า Paved Path เป็น Scaffold Tech Stack ที่ช่วยให้เราหนีห่างจาก monolithic เพราะการที่เรายังไม่ออกจาก Stack เดิม เพราะ Stack เดิมมันง่ายกว่าการเพิ่ม Feature ถ้าไปทำใหม่ มันเสียเวลา ซึ่งถ้ามีตัว Paved Path เตรียมไว้ จะช่วยเริ่มต้นได้ง่าย ไม่ว่าจะ Project ใหม่ หรือสอนคนใหม่ ถ้า Platform/Ecosystem มันดี คนจะมาใน Way ของ Microservice ได้ง่ายขึ้น และช่วยให้ Tech Stack ขององค์กรเดินไปในทิศทางเดียวกัน ถ้าสนใจเรื่อง Paved Path ลองอ่าน Blog ด้านล่างเพิ่มได้ครับ
  • Session นี้ยกตัวอย่างของคำสั่ง dotnet new <template> ที่เอามา Implement ตัว Paved Path เอาจริงๆ เพิ่งรู้ว่ามันมีนะ ปกติ ผมจะทำ PowerShell แปะใน Wiki เตรียมไว่ อันนี้เหนือกว่านะ ตอนนี้ที่ Hit น่าจะเป็นตัว xxx As a Code แต่ฟัง Session นี้ นึกถึง Session BACKSTAGE ของงาน DevMountain เลย
  • แต่การใช้ Paved Path มีประเด็นที่ต้องดูด้วยว่า
    - มันใช่สิ่งที่ดีที่สุดตอนนั้นไหม อาจจะเปิด repo แล้วให้คนที่อยากปรับปรุง มาเปิด PR แทน
    - และรอบการ Upgrade Dependency เป็นต้น

Resource: dotnet new <TEMPLATE> - .NET CLI / What is a Paved Path?. I’m going to explain to you the concept… | by Matt Stine | CodeX | Medium

Augmented Reality and Machine Learning

Augmented Reality (AR) - สร้าง Object บนสภาพแวดล้อมจริงๆ เช่น Pokemon GO
Machine Learning (ML) - การให้เครื่องเรียนรู้ และหาคำตอบมาให้เรา

ตัว AR + ML มันเกี่ยวข้องกับเรายังไงบ้าง โดย Use-Case การทำ Hand Tracking ตามมือ จับท่าทาง / Face Tracking โดยถ้าจะเริ่มมี Tools แนะนำ 3 ตัว

  • MediaPipe Customizable ML Solution for live and streaming media มันดีตรงที่มี dataset ให้ Train และมี Model สำหรับคนนะ ถ้าเอาน้องหมา แมว มาต้องเตรียม Training Set + สร้าง Model กันใหม่ และตัวมันเอามีรองรับหลายภาษานะ เช่น Python / C++ แต่ไม่มี .NET C# 555 ตัว Action ที่มันสามารถจับได้ อาทิ เช่น
    - Instance motion tracking: MediaType มีจุดเด่นตรวนี้ แม่ว่า object คล้ายกับพื้นผิว มันจับได้
    - Objectron: จับ object แบบ realtime
    - Holistic: จับการเคลื่อนไหวของคน รวม hand tracking + Pose + Face Tracking
    - Pose: จับท่าทาง เช่น วิดพื้น ได้ถูกไหม
  • Unity - cross platform game engine ที่คนนิยมมาทำ AR ได้ด้วย
  • MediaPipeUnityPlugin - มาช่วยให้ Unity ที่ทำ AR ใช้ความสามารถด้าน ML ของ MediaPipe ได้

พอเอา AR + ML มาช่วย เรามีกล้องตัวเดียว ทำ Motion Tracking / Capture ได้แล้ว ไม่ต้องมีใส่ชุดพิเศษเข้ามาเพื่อจับ ลด cost ชัดเจนเลย

Deploying .NET Workloads on Red Hat OpenShift
  • OpenShift - k8s pre-integrated and other tools by red Hat
  • Azure มี red hat OpenShift นะ โดยมีแยก 2 ส่วนนะ Administrator Portal กับ Developer Portal
    • ที่นี้ในส่วนของ Develop ตอน deploy เริ่มจาก git (เข้าใจว่ามีแต่ Code นะ เดียวมันจะ Build ยัดลง UBS ให้) / pre-build container / YAML File
    • ตัว Open Shift มี Stack หลายส่วนที่อยู่บน Ecosystem มัน อย่างเรื่อง Monitor มีนะในส่วน Observable หรือใช้ RedHat OpenShift Service Mesh
    • ถ้าอันไหนไม่มี ไปดูที่ operatorHub
  • Demo จะเป็นการ Deploy Sample App .NET ขึ้นไป โดยถ้าขึ้นไปเสร็จจะมีแสดงให้เห็นในส่วน Topology
  • ถ้าใครสนใจตัวฟรีของ OpenShift หรือ Upstream Project จะมีตัว OKD.io - OKD.io และ แนะนำ document

ที่ดูมามันเหมาะกับตอน Re-Location มากเลย จาก On-Premised > Cloud A > Cloud B เป็นต้น นอกจากใช้ RedHat + Podman มีอีก Keyword OpenShift มาใหม่

Resource: Strategies for Moving .NET Workloads to OpenShift Container Platform (redhat.com)

Serverless with .NET

When-เมื่อไหร่เราควรใช้งาน Serverless ?

  • Platform Support - function as a service (faas) อย่าง Azure / AWS / GCP รอบรับ .NET หมดนะ
  • Asynchronous Task - โดยจะเป็นงานในกลุ่ม Queuing / Event Streaming ปรับ State ของ Event เล็กๆน้อยๆ หรือ Data Processing - transform data ก่อนส่งให้ Azure Factory
  • Unpredictable Traffic Patterns เพราะบางครั้งไม่มี request เลย หรือมี spikes ถ้าไปเปิด Container Service อาจจะเสีย Cost มากเกินไป

Getting Start

  • จะเริ่ม faas ไหม หรือใช้ Container ถ้ามี Image พร้อมอยู่แล้วใช้ Container แต่ถ้าเป็นงานใหม่ ก็ลุยเลย
  • Application State - Stateless ถ้าจะเก็บต้องไปหาที่ทด
  • กรณีต่อ External Service ต้องเพิ่ม Retry mechanism สำหรับ handle case ด้วยนะ
  • DevOps
  • Execution Duration งานเล็กๆ ไม่ใหญ่มากนะวิ
  • Start with Azure Functions
func init -worker-runtime dotnet-isolated -target-framework net7.0
func new --name DotNet7 Function - template "HTtP trigger"
func start
  • Start with Aws Lamda Amazon.Lambda.Tools (Dotnet CLI)
dotnet tool install-g Amazon.Lambda.Tools
dotnet new-i Amazon.Lambda.Templates
dotnet new lambda.NativeAOT name LambdaNativeAOT
  • Start with GCP Google.Cloud.Function.Templates (Dotnet CLI)
dotnet new-i Google. Cloud.Functions.Templates
dotnet new gcf-http

Performance Tips

  • NOTE: Warm (Ready) vs Cold (ใช้เวลา Initial Instance)
  • Remove Initialization Code จากตัว Serverless ของเรา เช่น Reuse Connection / Cache Data
  • Keep function warm - เอา ping test มาให้ serverless ของเรา พร้อมทำงาน เพราะถ้าทิ้งไว้นานๆ มันจะมีเวลา Start ขึ้นมาตอนมี request มาปลุกมันจาก Idle Mode
  • ทำ App ของเราให้เป็น Just In Time โดยใช้ MSIL หรือใช้ ตัว .NET7 AOT
  • NOTE: การเอา AOT มาใช้ พวก Dependency ต่างๆต้องรองรับด้วยนะ

ระหว่างเขียน Blog เจออันนี้น่าสนใจ แปะไว้นิดนึง Serverless architecture considerations - Serverless apps | Microsoft Learn

State of ASP.NET Core

สำหรับ Session นี้ ถ้าใครที่เคยฟังงาน dotnet conf ที่ผ่านมาจะเป็น ReCap 2 เรื่องนี้ครับ

ตอน ASP.NET Core มี Choice ให้เลือกใช้ในหลายๆด้านอยู่นะ

  • Web UI - mvc / razor (ไม่เคยลองเลย) / SPA / blazer (wasm)
  • Service - WebAPI (Http - RestAPI)/ SignalR / gRPC
  • Server - Kestrel / IIS / Http.sys หรือ Worker Service ก็ได้ << ปกติรู้แต่ว่าลง IIS / Pack เป็น Container

และมี option อื่นๆ ให้ใช้ในด้านต่างๆ เช่น Routing / Security และ Dependency Injection (ได่ยินมานานและ แต่ยังไม่ได้ใช้สักที 555 คิดว่าขยับ .NET6 แล้วคงได้เอา Castle.Core ออก) เป็นต้น

ต่อไปเป็นการขิงกันแล้วกัน .NET7 11x faster than Node.js แข่งกัน แข่งกัน คนใช้งานได้ประโยชน์ครับ

Ref: https://www.techempower.com/benchmarks/#section=data-r21&hw=cl&test=plaintext

ตอนนี้ในหลายๆ Service ของ MS แล้ว Upgrade มา .NET6 แล้วดีขึ้น เช่น Azure App Service / MS Team เป็นต้น ลดการใข้ CPU / Operational Cost เพิ่ม Efficiency

เกริ่นมานานต่อไปมาดูกันว่า ASP.NET Core7 มีอะไรมาใหม่บ้าง นอกจากเรื่อง Performance แล้วมีอีกหลายส่วน ตาม Keyword Fast / Modern / Simple และ Productive เลยครับ

  • ที่ชอบคงเป็นตัว Minimal API Code มันลดลง แต่ได้ Productive ขึ้น และ Test + Doc ได้ง่ายขึ้น (ตัวนี้มาตั้งแต่ .NET6 และนะ ตอน Migrate ผมตัดสินใจโละแบบเดิมเลย 5555)
  • และ Session เมื่อเช้าในส่วน Authentication and Authorization เป็นส่วนหนึ่งด้วยของการ Improvement รอบนี้

แต่ไม่แน่ใจว่าจดมาครบไหม เหมือนงานนี้จะมี Tools อีกอันนึงที่น่าสนใจ YARP: Yet Another Reverse Proxy (VDO) ที่มันจะเอา ASP.NET Core + YARP มาครอบ ASP.NET เดิม แล้วทำ Incremental Migrate ค่อยๆทยอยย้าย API ไป

Clean Architecture

  • เมื่อไหร่ถึงต้องใช้
    - ทำ DDD เพื่อแยกว่าอะไรที่ควรอยู่ใน Core / Infra / UI
    - ต้องการ Testable Architecture ในส่วน Complex Business Logic //จะว่าไปเราเอาทำผิดไหมนะ Test ที Mock เยอะ
    - Architecture Enforce Policy ลดภาระของ Maintainer ตอน Merge
  • Key ที่สำคัญ ต้องการแยก
    - Core (Domain Business) อะไรที่เป็น Domain / Shared Kernel (องค์ความรู้ระหว่าง n Domain) เป็นต้น
    - Infra ต่อ DB เป็นต้น
    - UI ในที่นี้จะเป็น Web (ASP.NET Core)
    เพื่อให้มัน Test ได้ง่าย ไม่มี Dependency แบบว่า Test ต้องต่อ Database
  • มี Template ด้วยนะ ardalis/CleanArchitecture: Clean Architecture Solution Template: A starting point for Clean Architecture with ASP.NET Core (github.com)

นอกจากนี้มีตัวอื่นๆด้วยนะ อย่าง .NET MAUI / Blazer ที่มีพัฒนามาด้วย เป็นต้น

Resource:

Upgrade to EF Core 7 for fast query and better performance

Entity Framework คือ อะไร ?

  • Object–relational mapping framework (ORM) สร้าง Object มา Map กับ Database ช่วยที่งาน Simple CRUD ง่ายขึ้น
  • มี Migration Support ตอน Schema Change ด้วย

Entity Framework Core 7 Improvement ใช้กับ .NET6 ได้ด้วยนะ

  • JSON columns - ถ้า DB ไหนรองรับ JSON ใช้งาน
  • Bulk updates and deletes - ลด Round Trips ไม่ต้องมาอ่าน และสั่งต่อไปและ
  • Faster SaveChanges - เคส Insert เยอะอยู่ในนี้ด้วยนะ
  • Table-per-concrete-type (TPC) inheritance mapping - ตอน Gen SQL Create มันจะสร้าง Table ตาม Sub-Class ของ Model ที่ไม่มีการ Extend ต่อไป
  • Custom T4 templates for Database First
  • Stored procedure mapping for insert/update/delete
  • New and improved interceptors and events

Resource:

สำหรับผม Session นี้ เดี๋ยวต้องหาเวลาช่วงปีใหม่ลอง Clone มาเล่นดูครับ ว่า EF Core 7 ถ้ามันไปกับทาง DB2 มันจะช้าอืดเหมือนเดิมไหม ตอนสมัย .NET4 ผมจะเลือก Dapper เพราะ DB2 มันทำงานช้าโคตร ตัวงานมี Custom Query อยู่พอสมควรครับ และสุดท้าย DATABASE มันอยู่มาก่อน EF ถ้าปรับอะไรยาก

อื่นๆ
  • VDO ย้อนหลัง .NET Conf Thailand 2022 //Session ส่วนใหญ่นำเสนอด้วยภาษาอังกฤษ ยังดีที่มี VDO มาให้ลอง Skip ย้อนฟัง เพื่อความมั่นใจว่าแปล และเข้าใจถูกครับ
  • ตอนท้ายงานมีแจกเสื้อด้วย ได้เสื้อฟรีอีกแล้ว ^__^
  • Blog ตอนนี้เป็น Blog ที่สองที่ใช้วิธีตั้งโครงมาจาก Notion ซื้อตัว Pro มาแล้ว ต้องเริ่มใช้ให้คุ้ม 555 และหลาย Feature ผมเพิ่งรู้ในระหว่างที่ Draft Blog ในงานนี่แหละ อย่าง เช่น พอกด Gallery ของ Samsung เมื่อเปิดรูปมา พอ click ค้าง มันจะแปลงเป็น Text ให้เรา Copy ได้เลย ช่วยให้ Blog ไปไวขึ้นด้วย

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.