สรุปงาน .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 containerdotnet add package Microsoft.NET.Build.Containers# publish your project for linux-x64dotnet 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)
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 ด้านล่างเพิ่มได้ครับ https://medium.com/codex/what-is-a-paved-path-b2294463a3a9
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 FactoryUnpredictable 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.0func new --name DotNet7 Function - template "HTtP trigger"func start Start with Aws Lamda Amazon.Lambda.Tools (Dotnet CLI) dotnet tool install-g Amazon.Lambda.Toolsdotnet new-i Amazon.Lambda.Templatesdotnet new lambda.NativeAOT name LambdaNativeAOT Start with GCP Google.Cloud.Function.Templates (Dotnet CLI) dotnet new-i Google. Cloud.Functions.Templatesdotnet 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
นอกจากนี้มีตัวอื่นๆด้วยนะ อย่าง .NET MAUI / Blazer ที่มีพัฒนามาด้วย เป็นต้น
Resource:
Entity Framework คือ อะไร ?
Object–relational mapping framework (ORM) สร้าง Object มา Map กับ Database ช่วยที่งาน Simple CRUD ง่ายขึ้น มี Migration Support ตอน Schema Change ด้วย Entity Framework Core 7 Improvement ใช้กับ .NET6 ได้ด้วยนะ
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 #dotnetconfth #ITSeminar2022 #Net #NETCore #dotnet #dotnetconf