สรุปขั้นตอนพบแพทย์โรงพยาบาลตากสิน(กรณีมีใบนัด)

คำเตือน

  • การเดินทางไปตรวจของ Blog นี้ เป็น Flow ชั่วคราวที่ทางโรงพยาบาลได้กำหนดขึ้นระหว่างช่วงปี 2563 – 2566 ในระหว่างที่มีการสร้างตึกแห่งใหม่ครับ
  • สำหรับ Flow ที่ผมบันทึก เกิดจากความเข้าใจส่วนตัวของผมล้วนๆนะครับ ผู้อ่านท่านอื่นๆ อาจจะนำไปปรับใช้วางแผนได้ครับ โดยมีการอธิบายที่ละส่วนครับ

05:40 เริ่มต้นที่ห้องบัตร

  • เริ่มต้นที่ห้องบัตร – เข้ามาจุดคัดกรอง ตรวจสอบโควิต แล้วยื่นใบนัด (กรณีมาตรงนัด) สำหรับกรณีอื่นให้แจ้งเจ้าหน้าที่ครับ เมื่อเราผ่านส่วนของห้องบัตรไปแล้ว เราจะมีข้อมูลในระบบ เพื่อส่งต่อไปยังแผนกอื่นๆครับ
    • ของผมกรณีมาเช้ามาๆอยู่ตรงแผนกประชาสัมพันธ์เดิมนะครับ
    • ได้ข่าวว่าหากหลัง 08:30 สามารถไปห้องบัตรที่ชั้น 2 อาคารสมเด็จพระเจ้าตากสินมหาราช ได้ครับ
  • อย่างเคสของผมเป็นผู้ป่วยเดิมที่ต้องการมาตรวจไขมันฟอกตับ โดยต้องมีงานย่อยๆ 2 งาน ได้แก่
    • เจาะเลือด
    • พบหมอแผนกอายุรกรรม
  • ตรงจุดนี้สิ่งที่เราต้องรู้ครับ ไปที่ไหน อะไร อย่างไรครับ เพราะตึกเดิม โดนทุบทิ้งเรียบร้อยแล้วครับ แต่โชคดีของผมงานเจาะเลือด และพบหมอแผนกอายุรกรรมอยู่ที่ชั้น 3 ของอาคารสมเด็จพระเจ้าตากสินมหาราชครับ

05:58 คิวเจาะเลือด !!!

  • สำหรับงานนี้ ถ้ามาถึงแล้วต้องรีบไปกดบัตรคิวนะครับ เพราะ งานในส่วนนี้คนเริ่มมารอคิวตั้งแต่ตี4-5 แล้วครับ ถ้าไปสายกว่าจะได้คิวเจาะเลือดนี่ยาวเลยครับ อย่างวันนี้ผมออกจากบ้านช้าไป 10 นาที ปกติจะได้คิวที่ 30 ตอนนี้ได้คิวที่ 99 เลยครับ
  • ได้คิวแล้ว ต้องตาดูป้าย และหูฟัง ด้วยนะครับ เนื่องจากเป็นโถงใหญ่ที่งานหลายส่วนรวมกันครับ ทั้งเจาะเลือด / อายุรกรรม / ศัลยกรรม / การเงิน ครับ เพราะ ถ้าเลยคิวไปแล้ว อันนี้ต้องกดบัตรคิวใหม่เลยครับ
  • 06:49 ได้เจาะเลือดสักที เจ็บมากกกกก พยาบาลหาเส้นเลือดไม่เจอ T__T

07:27 เติมพลัง

  • หลังจากเจาะเลือดเสร็จ ถ้าหมอไม่ได้สั่งอะไรมาก็สามารถไปหาอะไรกินรองท้องได้ครับ โดยโรงอาหารของโรงพยาบาลตั้งอยู่ที่ชั้น 4 ของอาคารธนบุรีศรีมหาสมุทร (อาคาร 20 ชั้น)
  • มันมีทางลัดจากห้องเจาะเลือดครับ โดยไปทางฝั่งห้องน้ำชายครับ จะพบทางเชื่อมระหว่างชั้น 3 อาคารสมเด็จพระเจ้าตากสินมหาราช กับ ชั้น 4 อาคารธนบุรีศรีมหาสมุทรครับ
  • กินข้าวเติมพลังครับ – ต้องรอพบหมออีกครับ ^__^

07:47 รอพบแพทย์อายุรกรรม

  • งานในส่วนนี้ต้องวางแผนจัดการดีๆนะครับ เนื่องจากส่วนงานอายุรกรรม จะอนุญาตให้คนที่ผ่านการคัดกรองแล้ว เข้าไปรอพบแพทย์ด้านในได้นะครับ
  • แผนกอายุรกรรมอยู่ข้างห้องเจาะเลือดเลยครับ
  • จุดที่ 0 เวลา 05:59 ผมนำใบนัดไปวางที่ตะกร้าตามเวลาที่หมอนัด อย่างเคสของผมนัด 9 โมง ผมใส่ไว้ตะกร้าเวลานัด 9 โมง – 10 โมงครับ และรอคิวเจาะเลือด
  • จุดที่ 1 วัดความดัน และน้ำหนัก และแจ้งกับพยาบาลคัดกรอง ของผมระหว่างรอเจาะเลือดนี้ ผมได้เข้าไปวัดความดันรอไว้ (ค่าปกติความดัน ห้ามเกิน 140 ครับ ไม่งั้นต้องไปวัดใหม่อีกรอบครับ) และชั่งน้ำหนัก
  • จุดที่ 2 รอพยาบาลคัดกรอง เรียกชื่อตามเวลานัดครับ (จริงๆแล้วจุดที่ 2 มันอยู่จุดเดียวกับจุดที่ 0 นะครับ) และต้องมีข้อมูลความดัน น้ำหนัก และส่วนสูง จากจุดที่ 1 เรืยบร้อยก่อนนะครับ เมื่อถูกพยาบาลเรียกชื่อ เราจะได้ธงนำทางมาครับ
  • จุดที่ 3 ซักประวัติ พยายาลจะสอบถามอาการ + โควิตนิดหน่อยครับ จากนั้นพยาบาลบันทึกข้อมูลเข้าระบบงานของทางอายุรกรรมครับ และได้คิวพบหมอมาครับ
  • จุดที่ 4 รอพบหมอ ตรงนี้ระหว่างที่รอจุดนี้จะดีกว่าพื้นที่เดินครับ มีแอร์ครับ แลัวระบบคิวตามหน้าจอครับ โดยมี 2 จอ
    • ป้ายแสดงคิวพบหมอ โดยจะแยกตามห้องเลยครับ ถ้าเราได้คิว 1105 หมายความว่า พบหมอที่ห้อง 11 ลำดับที่ 5 ครับ
    • ป้ายแสดงคิวผลตรวจเลือดครับ การจะพบหมอได้ ต้องมีผลเลือดก่อนครับ ถ้าถึงคิวแล้ว แต่ผลเลือดยังไม่ออกจาก Lab เคสนี้ระบบจะข้ามไปก่อนครับ เมื่อได้ผลเลือดแล้วระบบจะแทรกคิวเรากลับคืนครับ
    • สำหรับผมจุดที่ 4 รอนานสุดเลยครับ กว่าจะได้พบหมอ ตอน 10:47 แล้วครับ รอผลตรวจเลือดนานครับ จากนั้นได้พบหมอ และผลเลือดค่าตับลดลงครับ จุดพลุฉลองครับ โดยทางคุณหมอได้นัดผมอีกครั้งตอนช่วงเดือนกันยายนปี 64 ครับ มีงานลำดับ 3 งาน
      1. วันแรก อัลตร้าซาวน์ตับ
      2. วันสอง เจาะเลือดช่วงเช้ามืด + พบหมอตอน 8:30 ครับ
  • จุดที่ 5 หลังพบหมอเสร็จ ต้องเอาผลจากหมอมาแจ้งทีจุดที่ 5 ครับ เพื่อให้ระบบทำการนัดครั้งถดไป หรือทำเอกสารเบิกจ่ายยาครับ โดยที่ ห้องที่ 1-7 ไปหาพยาบาลฝั่งซ้าย และห้องที่ 8-13 ไปหาพยาบาลฝั่งขวา

11:02 จองคิวอัลตร้าซาวน์ตับ

  • จากจุดที่ 4 ของแผนกอายุรกรรม เราจะได้ใบขออัลตร้าซาวน์มาครับ และให้พยาบาลที่จุดที่ 5 ตรวจสอบเอกสารให้เรียบร้อยปั๊มตรา
  • ขั้นตอนถัดมาจองคิวอัลตร้าซาวน์ ที่อาคารธนบุรีศรีมหาสมุทร ชั้น 2 ครับ ปกติหมออัลตร้าซาวน์ นัดทำ 2-3 วันก่อนพบแพทย์ครับ
  • สุดท้ายแล้วหลังพบแพทย์เรียบร้อย ลืมไปภาพนี้น่าจะมีประโยชน์ครับ สำหรับสถานที่ต่างๆของอาคารธนบุรีศรีมหาสมุทรครับ

หลังพบแพทย์เรียบร้อบ เตรียมกลับมาแก้ปัญหา .NET Framework 4.7.2 > .NET Standard 2.0 กับตัว WinServ ต่อครับ

[CR] บันทึกการใช้งานหูฟัง realme buds q + ปัญหา

หลังจากผมซื้อหูฟังอันนี้มาจากงาน Thailand Mobile Expo 2020 มาแล้ว ได้ของอะไรบ้าง และหลังการใช้งานมา 3-4 เดือน มันดี หรือแย่อย่างไรครับ ตามมาอ่านกันครับ

แกะกล่องมาพบอะไรบ้าง

  • ตัวหูฟัง
  • กล่องใส่หูฟังที่เป็น Power Bank ในตัวครับ
  • สายชาร์จ
  • คู่มือ
  • จุกยางสำหรับเปลี่ยนให้เข้ากับขนาดของหูเราครับ
  • ส่วนตัว App realme link อันนี้ต้องไป Download เองครับ ซึ่ง App นี้จะช่วยตั้งค่าปุ่มสัมผัสต่างๆครับ

ความรู้สึกของผมเองหลังใช้งาน โดยรวมแย่ครับ เพราะอะไรมาดูกันครับ

  • หูฟังใช้่งานจริงๆอยู่ประมาณ 2 ชั่วโมงครับ ถ้าตามโฆษณา 20 ชั่วโมงนะ ถ้าจำไม่ผิด อันนี้น่าจะหมายถึงรวมใส่กล่องใส่หูฟังที่เป็น Power Bank ในตัวครับ แต่ผมลองใช้งานจริงๆแล้ว มันใช้ได้ประมาณ 5-6 รอบครับ
  • ตัว Control ที่เป็นแบบปุ่มสัมผัส มันไวเกินไป เดินๆอยู่ดี สั่งเพลงหยุดซะงั้น หมดอารมณ์ครับ
  • การเชื่อมของหูฟังซ้าย และขวา นานนนนโคตรครับ หูพังตัวเก่าผมไปเกิน 3 วินาที มันเชื่อมหูฟังซ้าย และขวาพร้อมใช้งานแล้วครับ แต่ของ realme buds q รอไปเถอะ 2-3 นาที ก็ไม่เชื่อมต่อกันเอง ต้องถอด และใส่กล่องสัก 4-5 นาที แล้วทำใหม่เสียเวลาครับ
  • บางครัี้่งต่อกับมือถือแล้วเสี่ยงดังข้างขวาข้างเดียว พอใช้งานแล้วโคตรหงุดหงิดเลยครับ
  • Game Mode ใช้แล้ว ผมไม่เห็นความแตกต่างเลย เหมือนเปิดไปแล้วกินแบตเล่นๆซะงั้น

สุดท้ายแล้วรีวิวนี้เป็นความคิดเห็นส่วนตัวของผมนะครับ ผมอาจจะได้ของที่ Jackpot แตก มีปัญหามาจริงๆ ทำให้การรีวิวจะแตกต่างไปจากเว็บอื่นๆครับ

Reference

[C#] GetHashCode() ไม่เท่ากับ Equals() นะ !!!

black and white piano keys

ช่วงนี้เห็น Rule นึงที่ SonarQube มันแจ้งเตือนมาครับ

“Equals(Object)” and “GetHashCode()” should be overridden in pairs ตัว Message มันหมายความว่าอย่างไรกันนะ หลังจากลองดูคำอธิบายอันนี้จะเป็นในมุมของ Security ครับ เค้าตั้งสมมติฐานว่า ถ้า

  • Object A และ B เมื่อเรียก Equals() แล้ว
  • ถ้าเอา Object A และ B เรียกใช้ GetHashCode() มันควรจะได้ผลลัพธ์ที่เหมือนกันครับ

เอาง่ายๆ ถ้า A และ B เรียก Equals() แล้วได้ true เมื่อไปเรียก GetHashCode() ควรจะได้ค่าเท่ากันครับ ที่ใช้คำว่าควรจะ เพราะจริงๆต้องบอกว่าสอดคล้องกันไปในทางเดียวกันมากกว่า เพราะ

  • Equals() วัดความเหมือน โดยมี Logic บอกว่า ถ้าจะเหมือนต้องดูที่ตรงไหน
  • GetHashCode() บอกความ Unique ของ Object นั้นๆครับ

อันนี้เป็นคำอธิบายในมุมของ Security นะครับ มาดูในของ C# นะครับ ทำไมเมื่อ Override Method GetHashCode() ถึงต้อง Override Method Equals() คู่กันด้วยครับ เหตุผลง่ายๆ คือ อยากให้ Concept เหมือนกันในแง่ Security ครับ เพราะ เจ้า GetHashCode() ใน

  • C# เค้าบอกว่า ถูกเรียกใช้ใน Data Structure ในกลุ่ม hash-based collection เช่น Dictionary ครับ
  • Method Equals() เอง โดยปกติ ไม่ได้แอบไปเรียก GetHashCode() ด้วยครับ

จุดนี้แหละเป็นที่หลายๆคนเข้าใจผิดกันครับ ดังนั้นถ้าจะทำให้ถูกเมื่อมีการแก้ไข Logic ของ Equals() ต้อง Override GetHashCode() ควบคู่กันไปด้วย หรือกลับกัน ถ้าแก้ GetHashCode() ต้อง Override Equals() ตามกันด้วยครับ ถ้าอยากอ่านเรื่อง GetHashCode() เพิ่มเติมสามารถดูใน docs.microsoft ได้เลยครับ

  • เพื่อให้พวก hash-based collection ดึงข้อมูลออกมาได้ถูกครับ และสอดคล้องกับ Equals() ครับ ยกตัวอย่าง เช่น Object 5125 แล้ว ใน Dictionary มันดึงมากันคนละตัวนี้ ได้ 7235 ตรงพิลึกแปลกนะครับ
  • ในแง่ Security ผมเห็นแววโกงแล้วครับ 555 จากตัวอย่างตะกี้ ผมปลอม Object 5125 แล้วทำอะไรที่ไม่ดีกับระบบได้ครับ

ต่อไป ถ้าว่างๆ ผมเขียน Blog เพื่ออธิบาย Code ในส่วนของ C# เพื่อลองทดสอบ เรื่อง GetHashCode() กับ Equals()

[CR] ลองเข้ามาใช้บริการห้องน้ำของ MRT-สายสีม่วงครับ

เนื่องจากช่วงนี้ผมได้เดินทางไปประชุมกับลูกค้าบ่อยๆ ครับ โดยขนส่งสาธารณะที่เหมาะสมที่สุด คือ รถไฟฟ้าครับ แต่ถ้าคุณเดินทางบนรถไฟฟ้าแล้วรถติดหละ ไม่มีปัญหาครับ เพราะ เคสนี้ ถ้าเป็นสถานีรถไฟฟ้ารุ่นใหม่ๆ อย่างสายสีม่วงทางนี้เค้าได้ออกแบบให้มีห้องน้ำ และเข้าได้ โดยประชาชนทั่วไปครับ

  • ไม่ไหวแล้วววววว ณ สถานีบางซ่อนครับ ผมได้เห็นน้องผู้หญิงคนนึงวิ่งเข้าที่น่าสงสัย ใช้แล้ว สถานที่แห่งความสุขครับ สุขานั้นเอง
  • อันนี้ดีครับ แยกส่วนของอ่างล่างมือจากห้องน้ำครับ
  • เมื่อลองเข้ามาดูด้านใน มีที่ให้วางของด้วยครับ
  • ห้องน้ำใน MRT สายสีม่วงขนาดใหญ่พอสมควรเลยครับ เพราะถูกออกแบบให้ทั้งคนปกติ และผู้พิการใช้งานด้วยกันได้ด้วยครับ
  • มีโถฉี่ สำหรับผู้ชายด้วยนะครับ

สำหรับรถไฟฟ้าสายสีอื่นๆ อย่าเพิ่งน้อยใจไปครับ จริงๆทุกสถานีมีห้องน้ำครับ แต่จะอยู่ในส่วนของห้องพักพนักงานครับ เวลาใช้งานอาจจะต้องแจ้งพนักงานก่อนครับ ^__^

[CR] “ปาท่องโก๋ การบินไทย” @ICON SIAM

สำหรับวันนี้ ถือว่าเป็นวันที่โชคดีมากๆอีกหนึ่งวันครับ เพราะ ได้ไปรับเข็มวิทยฐานะ จากสำนักทะเบียนจุฬาลงกรณ์มหาวิทยาลัยแล้ว ขากลับมาบริษัทก็มาเจอ ปาท่องโก๋ ของมีชื่อของการบินไทย มาเปิดบูธขายชั่วคราวที่ ICON SIAM ระหว่างวันนี้ จนถึงวันที่ 22 พฤศจิกายน 2563 ครับ โดยสามารถรับบัตรคิวได้ที่จุดแจกคิวตรง 7/11 ใน ICON SIAM ได้เลยครับ โดยมีรอบการแจกคิว ดังนี้ครับ

  • เวลา 10.00
  • เวลา 14.00
  • เวลา 17.00

หมายเหตุ สามารถซื้อได้คนละ 2 ชุดนะครับ

เข้าไปซื้อแบบงงๆ

หลังจากที่ได้บัตรคิวแบบงงๆ กันไปแล้ว ผมเดินตามเขาวงกตที่ทางห้างเตรียมไว้ให้ครับ จนมาถึงเจ้าหน้าที่ โดยปาท่องโก๋ที่ขายมีแบบเดียวนะครับ เป็นกล่อง กล่องละ 100 บาท โดยประกอบไปด้วย

  • ปาท่องโก๋ สูตรพิเศษของการบินไทย 6 คู่ (12 ชิ้น)
  • สังขยามันม่วง 1 กระปุก
  • และนมข้นหวาน 1 กระปุก

ความรู้สึกหลังกิน

  • ผมชอบสังขยามันม่วง มันอร่อยดีเข้ากับแป้งของปาท่องโก๋มากๆ ครับ รสชาติหวานมันกำลังดี
  • สำหรับตัวแป้งปาท่องโก๋หอม ไม่เหม็นหืน ไม่อมน้ำมัน นุ่มข้างใน เพราะใช้แป้งเค้กที่นวดจนพอดี (คนนวดต้องมีหัตถตะวันแน่ๆ 555 ถ้าใครดูการ์ตูนเจปังจะเข้าใจครับ) แต่ถ้าเทียบปาท่องโก๋เจ้าอื่นๆ น่าจะขาดในเรื่องของความกรุบกรอบ และความยืดของแป้งครับ ถ้าปาท่องโก๋มันจะเข้ากับนมข้นหวานดีมากๆครับ แต่ปาท่องโก๋ของการบินไทย ผมรู้สึกเฉยๆกับนมข้นหวานครับ

[VM] ใช้งาน Putty เชื่อมต่อกับ VM แบบ NAT) ใน VirtualBox กันครับ

ตอนนี้เพื่อนๆหลายท่าน น่าจะทำงานผ่านทาง VM โดยอาจจะรันผ่าน VMWare Workstation หรือ Virtual Box ครับ แต่การที่ต้องเข้าไปพิมพ์ Command ในแต่ละ VM มันอาจจะรู้สึกไม่สะดวกกับการสลับจอของ VM ออกมาที่เครื่องหลักครับ อย่างตัว VirtualBox

  • ปุ่ม Host Key + C หลายคนคงสงสัย Host Key คือ ปุ่มไหน
    • Windows – ปุ่ม Ctrl ฝั่งขวา (Right Ctrl)
    • Mac – ปุ่ม Command ฝั่งซ้าย (Left Command)
  • สำหรับ Windows หลายคน อาจจะใข้ท่าไม้ตาย Ctrl + Alt + Delete ครับ

กลับมาที่ฝั่งของผูใข้ Virtual Box กันบ้างครับ หลายคนสะดวกกับการเปิด VM แล้วเข้าไปใช้งานผ่าน Putty ครับ แต่มันมีข้อจำกัดอีก คือ

  • เราต้องรู้ IP ของ VM ครับ
  • กำหนด Network Card ของ VM ให้เป็นแบบ Bridge ครับ ซึ่งต้องมีอุปกรณ์ Network มาเกี่ยวข้องด้วยครับ

ถ้าอยากให้มันจบที่เครื่องคอมของเราได้ไหม คำตอบว่าได้ครับ โดยกำหนด VM ของเราให้มี Network แบบ NAT ครับ แล้วตัว Network ต้องมีการกำหนด Port Forwarding ออกมาที่เครื่อง Host ครับ สำหรับใน VirtualBox มีขั้นตอนง่ายๆ ดังนี้ครับ

  • ตรวจสอบ VM ของเราก่อนครับ ว่ากำหนด Network เป็นแบบ NAT ก่อนครับ
  • จากนั้นตรวจสอบ VM Guest ที่ต้องการ Putty เข้าไป
    • IP อะไร ? – ถ้ารู้แล้วจดไว้นะครับ
    • เปิด ssh ไว้ หรือยังครับ
  • กลับมาที่ Virtual Box ตรง Network Card ที่เป็น NAT การกำหนด Port Forwarding ตามขั้นตอน ดังรูปครับ
    • Host IP : เว้นว่าง
    • Host Port : กำหนด Port ที่ต้องการใช้งานกับ Putty ครับ ผมขอกำหนด Port 30 ครับ
    • Guest IP : IP ของ VM Guest
    • Guest Port : Port ที่ใช้ ssh เข้าไปครับ ปกติ Default เป็น Port 22
  • จากนั้นลองทดสอบเข้า VM ที่สนใจผ่านทาง Putty โดยกำหนด
    • Hostname : ใส่ localhost
    • Port : ใส่ Port ที่ Map ไว้จากช่อง Host Port ครับ จากข้อที่แล้วผมได้กำหนด Port 30 ไว้ครับ
  • ทดสอบเข้าใจงานจริงครับ

[CR] Starbucks-Almond Cream Croissant

วันนี้ผมมีลาหยุดครับ แต่มีเอางานมาทำด้วยครับ ลองอ่านเอกสาร Spec ของ CMMI 2.0 และรีวิวงานของน้องๆในทีมครับ และน้องเนยที่ขายประกันช่วงเย็นครับ ผมเลยเลือกที่มาปักหลักที่ Starbuck@Icon Siam ครับ

สำหรับ Starbucks@Icon Siam ผมว่าสถานที่มันเล็กไปนะ ถ้าเทียบกับสาขา Sena Fest ครับ (สาขานี้นั่งสะดวกสบายมากครับ) แต่วิวดีมากครับ ถ้ารถไฟฟ้าสายสีทองเปิดใช้งานจริงครับ ตอนนี้เข้าใจว่ากำลังอยู่ในช่วง UAT และเก็บงาน เพื่อพร้อมเปิดใช้งานในช่วงธันวา 2020 ครับผม

รถไฟฟ้าสายสีทอง

Almond Cream Croissant

  • ราคา 65 บาท
  • รสชาติ ส่วนตัวผมไม่ค่อยชอบนะ หวานมาก ซึ่งกว่าจะทานหมด 2-3 ชั่วโมง
    • ครัวซองท์สอดไส้ครีมโรยด้วยอัลมอนด์ ควรทานตอนยังอุ่นๆนะครับ
    • พอทิ้งไว้ไปนานๆ ผมรู้สึกว่าเหมือนโรตีทอดครับ 5555
    • ทานคู่กับกาแฟดำ หรือชาร้อนๆ เอาไว้ตัดเลี่ยน
  • พลังงาน 470++ แคลลอรี่ (ผมว่ามันน่าจะมากกว่า 470 เพราะมีครีมด้วย)
  • นั่งทานยาวๆ อ่าน Spec CMMI 2.0 ไปเกือบจบ ทานหมดพอดีครับ

Reference (พลังงานของ Almond Croissant)

[C#] ถ้า GroupBy โดยใช้หลาย Property แล้วห้ามใช้ตัวแปรชนิด var หละ

จาก Blog ตอนก่อนหน้า [C#] ถ้า GroupBy แล้วห้ามใช้ตัวแปรชนิด var มารับหละ ? ตัวอย่างที่ผมได้ยกไปเป็นการ Group By โดยใช้เพียง 1 Property เท่านั้นครับ แต่ใช้ชีวิตจริง มีการใช้งานมากกว่า 1 Property ครับ ยกตัวอย่าง เช่น

  • ก่อนปรับ : มีการใช้งาน 2 Property ครับ ได้แก่ ValueDate และ CashSecurityGroupCode ซึ่งมีชนิดข้อมูลเป็น DateTime และ String ตามลำดับครับ
var nostroForReportGroup = AMSDetaills.GroupBy(ds => (ds.ValueDate, ds.CashSecurityGroupCode));
foreach (var nostroForReportEntry in nostroForReportGroup)
{
    IList<DsetExpAMSDetailDTO> AMSbyGroupls = nostroForReportEntry.ToList(); //มี Select(a =>a) ซ้อนเสียเวลา Loop 1 รอบ
    //...
}

ถ้าเราจะเล่นมุกเดิมใน Blog ที่แล้ว มันจะใช้งานไม่ได้ครับ เพราะ IGrouping<TKey, TValue> รองรับ Parameter 2 ตัวครับ ได้แก่ TKey กับ TValue ปัญหาที่พบ คือ Tkey มันมี 1 ตัว แต่เรา Group By โดยใช้ 2 Key หรือ 2 Property ครับ คราวนี้ เราจะแก้ปัญหาอย่างไรครับ

  • วิธีแรก สร้าง Class ใหม่มาเลยครับ เพื่อรองรับ Property ที่เป็นเงื่อนไขของ GroupBy ครับ จากตัวอย่างที่ยกมาข้างตันเนี่ย ผมต้องสร้าง Class ใหม่ที่มี Property DateTime และ String แต่วิธีนี้อย่าหาทำครับ เพราะ มันจะได้ Class เยอะมากกกกกก ยากแก่การดูแลรักษาภายหลังครับ
  • วิธีสอง ทำ Key ที่ใช้ในการ GroupBy มาเป็น Turple สิ โดยเจ้า Turple เป็น Data Type ใหม่ใน C# 7 ที่มุมมองในลักษณะของแถวครับ จากตัวอย่างเรามี 2 Key เราสร้าง Turple(DateTime, String) ครับ

จากที่ได้รู้วิธีการแก้ไขไปแล้ว ผมเลือกวิธีที่ 2 ครับ วิธีแรกเอาไว้ใช้ในยามจำเป็นจริงๆครับ โดยผลลัพธ์ที่ได้หลังใช้ Turple มี ดังนี้ครับ

IEnumerable<IGrouping<(DateTime, String), DsetExpAMSDetailDTO>> nostroForReportGroup = AMSDetaills.GroupBy(ds => (ds.ValueDate, ds.CashSecurityGroupCode));
foreach (IGrouping<(DateTime, String), DsetExpAMSDetailDTO> nostroForReportEntry in nostroForReportGroup)
{
    IList<DsetExpAMSDetailDTO> AMSbyGroupls = nostroForReportEntry.ToList();
    //...
}

หวังว่าวิธีนี้มีประโยชน์สำหรับผู้อ่านทุกท่านที่ประสบปัญหา หรือ ต้องกาความท้าทายครับ ^__^

[ATH2020] Agile Thailand 2020

หลังจากห่างงานแนวๆนี้ไปนาน เพราะติดเรียน ป โท ครับ ตอนนี้เรียนจบ / รับปริญญา เรียบร้อยแล้ว

เดินทางมา SCB Academy อย่างไร ?

  • ตอนแรกว่านั่งรถไฟฟ้า BTS จากบางหว้า มาพหลโยธิน 24 แต่มันแพง 555
  • ผมเลยลอง Challenge โดยลองนั่งรถเมล์ครับ
    • สาย 539 จากชัยพฤกษ์ มา อนุสาวรีย์ 14 บาท
    • สาย 39 จากอนุสาวรีย์ มาถึงพหลโยธิน 24 10 บาท
  • พอตั้ง Challenge ไว้แบบนี้แล้วเลยมาถึงคนแรกเลย เพราะ เผื่อเวลาไว้เยอะหน่อยครับ
  • แต่มาถึงแล้วก็มาช่วย Review เล่ม Proposal ของรุ่นน้องต่อครับ จนถึงงานเริ่มครับ

เริ่มงาน

  • Theme งานปีนี้ “It’s Okay to Not Be Okay ตั้งวงเล่า เรื่องเศร้าอไจล์” – เพราะการนำ Agile มาใช้มันมีสำเร็จ และพัง
  • Check-in มีให้จับกลุ่มแนะนำตัวครับ รุ้จักบ้างไม่รู้จักบ้าง แต่เสียงดังไปนิดนครับ ผมเป็นคนที่ไม่ชอบที่เสียงดังๆเท่าไหร่ครับ
  • งานวันนี้เป็นเหมือนงาน Agile ครั้งก่อนๆครับ เป็นงานแบบ Unconference ครับ ไม่มีหัวข้่อ มีแต่ Slot เวลาเตรียมไว้ให้ครับ
  • กฏของ Conference นี้ครับ
  • จากนั้นเป็นหัวข้อของทาง SCB ครับ และหัวข้อที่แต่ละท่านมาแชร์ครับ เดี๋ยวผมจะเขียนในหัวข้อถัดไปครับ โดย VDO ของงานวันนี้ เข้าใจว่าจะถูกบันทึกลงใน Platform พลเมืองดีดิจิตอล ครับ

สรุปหัวข้อในงานที่ผมได้ฟังนะครับ

– Robinhood

เลือกรูปนี้ เพราะมี Code ส่วนลด ^__^
  • Platform ที่เสริมธุรกิจหลักของธนาคาร เป็น CRM ทางหนึงของธนาคารครับ จาก Pain Point
    • ค่าจุกจิกมากมาย เช่น GP ของร้าน 30% Rider 20%
    • Platform ที่มีอยู่เป็นของต่างชาติ
  • One Team
    • Humble ถ่อมตัว เน้นแนวคิด Idea ใหม่ๆ ไม่ยึดตามตำแหน่ง
    • Responsive ตอบสนองกับหน้าที่ ไม่มีโทษใคร ถ้าผิดพลาด
    • Collaborative นอกจากทีมพัฒนาแล้ว มีนำหน่วยงานอื่นมาร่วมด้วย เช่น พนักงานสาขา / Call Center เป็นต้น
  • Food Delivery มีความท้าทายต่าวกับ Mobile Bank
    • ร้านน้อย เพิ่มร้านยังไง
    • คน Rider น้อยไม่พอ บูตจำนวน Order ให้จูงใจ Rider ด้วย
    • ค่า GP
    • ส่งช้า
  • COVID เปลี่ยนทุกอย่าง ปกติงานธนาคาร ใช้เวลา 2 ปี 1 ปีทำเรื่อง 1 ปีพัฒนk แต่งานใช้เวลาภายใน 3 เดือนเน้นความเรียบง่าย(Simple) เน้น Feature เรียบง่าย สั่งอาหารได้ก็พอครับ
    • Idea Meeting พยายามทำให้จบใน 1 Meeting ไม่ให้เกิดการวน Loop
    • Food Delivery เป็น Tech ที่ใครอยู่ได้นานสุดชนะ
    • ทำอย่างไรมห้ลูกค้า Applicate กับ Product เรา
    • SCB เริ่มต้นโดยอาจจะไม่พร้อม อาทิ เช่น Rider หาผู้เชี่ยวชาญอย่า skootar เข้ามาร่วมมือแทน และมีการเข้า course เพื่อให้ประสิืทธิภาพการยบริการสูงสุด เพราะ พนักงานส่งเป็นคนคนเดียวที่ลูกค้าจะได้พบหน้า แก้ปัญหาเฉพาะหน้าได้ ให้ลูกค้่าประทับใจ
    • ส่วนที่ SCB พร้อม เช่น
      • พนักงานสาขามีให้ไปปรับตัวหาร้านอาหาร พร้อมช่วยสร้างร้านบน Platform
      • Call Center ปรับนอกจากรับเรื่องเงินๆทองๆ แล้วมารับร้องเรียนเรื่องเมนูอาหารด้วย

– GPO Go Agile

  • GPO = องค์การเภสัชกรรม เป็นองค์กรของรัฐ ทำงานเกี่ยวกับผลิต + ขายยา และเวชภัณฑ์ไม่ใช่ IT เลย น่าจะเป็นหน่วยงานของรัฐที่เอา Agile ไป Implement ครับ
  • ลูกค้าขององค์การเภสัชกรรม โรงพยาบาลรัฐ และยาในโครงการ 30 บาท ส่วนโรงพยายาลของทหาร หรือ เอกชน มีตลาดแยกไปอีกครับ
  • เดิมหน่วยงานรัฐทำตาม Process เป็น Waterfall แบบนึง และมี SILO ทำให้งานบางอย่างเชื่องช้า
  • เริ่มต้นจากผู้บริหารองค์กรเล็งเห็นถึงปัญหา เลยกำหนดทีมขึ้นมา เค้าน่าจะเรียกว่า Enablers นะ ถ้าจำไม่ผิด เป็นการคัดคนที่มีความสามารถของแต่ละหน่วยมาอบรมการใช้ Agile และทำงานร่วมกัน โดยให้ SCB Academy มาเป็น Coach เพื่อให้บรรลุ Goal / KPI ได้
    • Enablers มาจากพนักงานในองค์กร รวมเป็น Talent Team มีทั้งเภสัชกร นักวิจัย และ HR เป็นต้นครับ
    • หน่วยงาน หรือ คณะกรรมการ 10 คณะ โดยมองว่าประธานของคณะ เป็น Product Owner เป็นผู้ที่ใช้ Requirement ของชิ้นงานขึ้นมา
    • Enablers => ให้ไปเป็น Scrum Master ซึ้งมีหน้าที่ประสานงาน ลดความล่าช้าของแต่ละหน่วย อันนี้ทำได้ เพราะ ผู้ใหญ่ในองค์กรหนุนด้วยครับ (Leader Ship Support)
    • COVID ทำให้ Process เกิดการปรับเปลี่ยน จากเดิมที่มี Agile มาเร่งปรับกระบวนการแล้ว ยังมี COVID มาร่วมแจมด้วย อันนี้ผมว่าเสริมตัว Digital Transformation ครับ
    • Scrum Master ปรับ Mind Set ของในทีมให้ค่อยพร้อมรับกับ Agile โดยมีกลยุทธ์
      1. สู้ – ปรับให้ทุกคนมี Mind Set เหมือนกัน เห็นงานร่วมกัน
      2. ถอย – ผู้บริหารมี Style ไม่เหมือนกัน ต้องปรับตัว ต้องมี Network ช่วยประสาน
      3. หลบ – ช่วยแบบไม่ออกตัว หรือ วางยา จริงเป็นทักษะการสื่อสารพี่ค่ะ
      4. ปล่อย – ทำจนถึงที่สุด ปล่อยให้เค้าเรียนรู้ด้วยตัวเอง
    • เอา Agile มาใช้แล้ว Product ยา เวชภัณฑ์ต่างๆยังต้องตรงตามมาตรฐาน รวมถึงปรับตัวให้ทัน และพึ่งพาตัวเองได้
  • Culture Transformation
    • ทุกคนต้องเห็นงานทั้งหมดร่วมกัน และร่วมตัดสินในสถานะของงาน ใน Kanban Board ให้ผู้บริหารมีส่วนร่วมในการตัดสินใจขยับ Kanban เช่น จาก To Do > Doing > Done
    • นัดตามงานตามรอบ และสื่อสารกันผ่านช่องทางอื่นๆอกจากหนังสือราชการ
    • Sprint Review เพื่อให้ Stakeholders เห็นภาพ และร่วมมือด้วย
  • ผลงานที่ออกมาชัดเจน PPE รุ่นเราสู้ / Alcohol Gel / ปิดยอดขายได้
  • คหสต ของผมนะ ยังไม่ค่อยเห็นภาพของ Retrospective ลืมถามด้วยแหละ ว่าในหน่วยงานราชการ ถ้าเอา Agile มาใช้เป็นอย่างไร และการทำเป็นรอบๆ ที่ยังงงๆอยู่ครับ

– ผิดไหมที่จะรู้สึกไม่ดีกับคนในทีม

  • ผมเข้าหัวข้อนี้ เพราะไม่ได้มีปัญหากับคนในทีมหรอก แต่ข้ามแผนก และลูกค้า 555 จริงช่วงเวลานี้มีหัวข้อที่สนใจอยู่นะ Agile Testing กับ D.I.S.C กับการบริหารทีม เดวรอ Blog ของท่านอื่นๆครับ
  • Iceberg Theory
    • people สำคัญ และเราไม่สามารถ Deal ได้กับคนทุกรูปแบบ
    • เราต้องเข้าใจว่าทุกคนมาจากคนละที่ถูกหล่อหลอมมาไม่เหมือนกัน
    • บางครั้งเรามองแต่ Behavior ที่ทำให้เกิด Outcome ที่อยู่เหนือภูเขาน้ำแข็ง แต่ไม่ได้มองลึกลงไปถึงใต้ภูเขาน้ำแข็งว่าอะไรหล่อหลอมมันมาบ้าง
      • ประสบการณ์ เหตุการณ์ที่ผ่านมา (Experience)
      • ทำให้เกิดความเชื่อ (Belief)
      • ส่งผลต่อความคิด (Thinking) และความรู้สึก (Feeling)
      • ที่สะท้อนออกมาในรูปแบบของพฤติกรรม (Behavior) และผลลัพธ์ที่ได้
  • Johari Window – เป็นวิธีการที่ช่วยให้เราเข้าอกเข้าใจตัวเอง หรือผู้อื่นมากขึ้น
    • Open Area – ตัวตนเราที่ตัวเรา และที่คนอื่นเห็น
    • Blind Spot – ตัวตนที่เราอยู่ แต่คนอื่นไม่เห็น หรือ เข้าใจ สิ่งที่ช่วยได้ คือ การถาม (Asking for Feedback) ถามปลายเปิด เพื่อให้เข้าใจมาขึ้น
    • Hidden Area – เรารู้ แต่คนอื่นไม่เข้าใจ เช่น เราซีเรียสเรื่องเวลา แต่ที่คนอื่นเห้นชอบไปจี้ๆให้ทำงานเสร็จ สิ่งที่ช่วยได้ คือ การเปิดใจ ถึงจุดอ่อน (Disclosing Vulnerability) เพื่อให้อีกฝ่ายเกิดความเข้าใจ เอาใจใส่ (Empathy) เข้าใจสถานการณ์ของผู้เล่า ช่วยรับฟัง หรือ ถามเพื่อให้เค้าเปิดใจจนพอ
      • ผมว่า Blind Spot กับ Hidden Area บางครั้งมันมองคู่กันได้
    • Unknown – พื้นที่ที่เรา และคนอื่นก็ไม่รู้
  • 3E of Resonance
    • Emotion – เรารู้สึกอย่างไร
    • Experience – เรามีประสบการณ์อย่างไร
    • Expectation – เราคาดหวังอะไร ซึ่งส่งผลกับ Emotion
  • เหมือนผมจะได้ยินอีกคำด้วยนะ น่าจะเป็นคำว่า Sympathy = ความเห็นใจ สงสงสาร (ไม่แน่ใจว่าถูก หรือป่านะ)
  • จากนั้นมีกิจกรรมให้ลองเปิดใจ เล่าเรื่อง ระบาย ผมก้บ่นไปเยอะเหมือนกัน 5555
  • ผมอาจจะสรุปไม่ได้ครบถ้วนนะครับ ลองไปอ่าน

– มองวัฒนธรรมองค์กรผ่านมุมมอง The Platform

  • ผมขอสารภาพก่อน ผมเพิ่งรู้ว่า The Platform คือ หนังใน Netflix (เสียเงินไป 99 บาททุกเดือน เริ่มรู้สึกว่าไม่คุ้มและ ดูแต่การ์ตูน 555)
  • ก่อนจะเขียน Blog ผมเลยไปดูสปอย เพื่อความเข้าใจก่อน
  • อะไรที่ส่งผล หรือสะท้อนออกมาในรูปแบบวัฒนธรรมองค์กรได้
    • คน – ลักษณะส่วนตัว (Personal) / คนรอบข้าง เช่น เพื่อนร่วมงาน หัวหน้า
    • Process/Policy – เพื่อให้การทำงานมันมีระบบ ระเบียบ และช่องโหว่ (อันหลังผมเติมเองนะ เพราะมี Blog นึงที่เขียนดองไว้อยู่ กะว่าจะ Publish ปีหน้า อ่านทวนหลายๆรอบก่อน)
    • KPI – ต้องทำให้ได้ตามเป้าหมาย
    • โครงสร้างองค์กรที่เป็น Silo – ทำให้ทุกคนดูแปลกแยก
    • Corporate Value – ที่ตั้งมาแล้วแต่ระบบไม่เอื้อ เช่น โตไปไม่โกง แต่ระบบ หรือ สภาพแวดล้อมมันไม่เอื่อ คนโกงยังรอดไม่ถูกลงโทษ อะไรงี้

ผลประกอบการสะท้อนวิธีการทำงาน และวัฒนธรรมขององค์กร

ผมชอบคำนี้นะ
  • ปัญหาที่เกิดขึ้น ถ้าวัฒนธรรมองค์กรมันไม่เอื้อ
    • เมื่อเกิดข้อผิดพลาดให้ทำให้เกิดวัฒนธรรมการเอาตัวรอด – โยนขี้ โทษกันไปกันมา (Blaming Culture)
    • ขาดความเห็นอกเห็นใจ ก็งานในส่วนของ Sale ทำเสร็จแล้ว ทำไมต้องสนใจทีมข้างหลัง เป็นต้น
    • Silo ที่แยกหน่วยงานของใครของมัน
  • Communication – ไม่ใช่แต่เพียงการพูดคุย แต่เป็น Way of Work
  • การแก้ Culture ปรับให้มันดีขึ้นได้
    • เริ่มต้นที่ตัวเราก่อนเลย ถ้าจะเปลี่ยนระบบต้องกล้ามาก หรือ เอาตัวเองออกไป 555
    • มองคนอื่นให้มาขึ้น นึกถึงหัวข้อก่อนเลยที่ฟังเลย ผิดไหมที่จะรู้สึกไม่ดีกับคนในทีม ลดชั้น ถ้าในเรื่อง Platform ลดจำนวนขั้น
    • ปรับการทำงานขององค์กร ปรับ Policy ไม่ให้เกิดการโยนขี้
    • สร้าง Transparency – ความโปร่งใส จริงๆมองว่า ไม่ให้เกิดการเลือกข้างมากกว่า เช่น งบมาเท่านี้ ได้เครื่องคอมที่แรกที่สุด 1 เครื่อง ทีมมี 10 คน และเราควรใช้ใครได้ใช้งานมันหละ ?
    • สร้าง Trust – ทำให้คนในทีมเกิดความเชื่อมั่น
    • ทำให้ Free Space เพื่อให้ได้จาก Feedback ที่ตรงไปตรงมา
    • สุดท้ายการปรับตัวมาจากทั้งสองมุม
      • Top-Down : สิ่งที่ผู้บริหารต้องการสื่อ ต้องลงมาถึงพนักงานชัดเจนไม่บิดเบือน
      • Bottom-Up : เสียงจากพนักงานขึ้นไปถึงผู้บริหาร
  • พอดูสปอยเรียบร้อย ผมเข้าใจนะ ว่าสิ่งที่หนังจะสื่อ มันปรับตัวคุกเข้ากับโครงสร้างขององค์กรได้จริงๆนะ
    • พวกชั้นบนๆ ไม่รู้ว่าข้างล่างเป็นอย่างไร เอาสบายก่อน
    • คนที่จะเปลี่ยนระบบ มีบางคนที่ต้องท้อหมดหวัง และจากไปก่อน การจะโน้มน้ามใครมีเปลี่ยนยากพอตัวเลย
    • กฏเกณฑ์ของคุกที่เหมือน Process / Policy ขององค์กร ที่มันเกิดข้อผิดพลาด แต่ไม่มีใครสนใจ หรือแสดงให้เห็น ในสปอยมีนะความผิดพลาดของระบบ แต่ไม่รู้ว่าจะทำใ้เกิดการเปลี่ยนแปลงไหม

– Domain Driven Design for Agile

  • DDD vs TDD การเข้าใจสิ่งจะออกแบบขึ้นมา กับ การทดสอบสิ่งที่กำลังทำ
  • Domain Driven Design
    • Ubiquitous Language ความหมายของคำในบริบทต่างกัน เช่น context การเงิน par กับบ้าน   par พอมีคำพวกนึ้มาขึ้นจะกลายเป็น Domain ขึ้นมา
    • Bounded Context – กรอบของคำ ข้อมูล
    • Context Mapping – แต่ละ Bounded Context มันสื่อสารอย่างไร
  • Software ควรมีแผนผัง/ แผนที่นะ เรียกว่า Big Bold of Mud ก้อนโคลน
  • Microservice ทำให้ตัว Domain Driven Design กลับมาอีกครั้ง เพราะ ช่วยให้เราเลือกได้ว่า อะไร สิ่งทีควรทำ ควรจัดให้อยู่ด้วยกัน
  • Event Storming วิธีการ Implement DDD – เริ่มจาก Use Case กิจกรรม และสิ่งที่ควรได้ คือ Problem Space (Domain Modeling)
  • Problem Space การเข้าใจรูปแบบการทำงาน (แหมทำให้นึกถึงตอนเรียนวิชา RE 555)
    • ต้องผ่านกิจกรรม Event และ Product ที่ออกมา คือ อะไร (คนสอนเรียกว่า Aggregate เช่น ระบบ OPD เมื่อคนไข้ เข้ามาต้องได้ข้อมูลคนไข้ และ
    • เจ้า Aggregate ข้อมุลเล็กที่สุดที่จะ commit ได้
    • มันจะได้แผนที่ของระบบที่แสดงขอบเขตชัดเจน ผมเข้าใจว่าเป็น High Level Architecture นะ แต่ผู้พูดบอกถึง C4Model นะ
    • แยก Domain ให้ได้ โดยต้องพึ่งพา Domain Expert เข้ามาคุย และทำงานร่วมกันในทีม
    • จัดการความสัมพันธ์ระหว่างระบบ Bounded Context ก่อน
    • เมื่อแยก Domain ได้ แล้ว เราจะจัดลำดับความสำคัญได้
      • Core Domain – ส่วนสำคัญของระบบ ต้องทุ่ม Resource
      • Generic Domain – ส่วนที่ Common อาจจะหา Framework หรือ เครื่องมือมาช่วยได้
      • Support Domain – ส่วนที่เสริมการทำงาน อาจจะใช้ทีมงาน Outsource มาช่วย เป็นต้น
    • พอได้ Problem Space จุดที่เราจะดูได้ต่อ ถ้าจะแก้ไขมัน (Re-Model) อะไรกระทบบ้าง ผมนึกถึงภาพเกม Total war เหมือนเราต้องมาวางแผนของแผนที่ของปัญหา
  • Solution Space เอาสิ่งที่เป็น Problem Space ที่จัดกลุ่ม หรือ Domain อะไรเรียบร้อยจนรู้ถึงความสัมพันธ์แล้ว มาใช้ Technical Design เพื่อให้เกิดวิธีการแก้ปัญหาจริง ปัญหาอาจจะไม่ต้องทำระบบก็ได้นะ บางทีปรับวิธีการทำงานก็ได้แล้ว หรือ ถ้าเป็น Technical Design จริงๆ เช่น
    • CQRS (Command-Query Responsibility Separation) ตาม Blog นี้ไปเลยย
    • Event Sourcing
    • การตัดสินใจว่าข้อมูลไหนควรจะ Atomic Tx – Consistency หรือ Eventually Consistency ซึ่งมันจะส่งผลกับ Service ที่ทำเหมือนกัน ว่าจะ Scale ได้ไหม หรือ เกิด Dependency Hell
    • Design Pattern อันนี้ ผมเข้าใจเป็นวิธีการหนึ่ง Solution นะ แต่อาจจะเข้าใจผิดก็ได้

Blog หรือ Resource อื่นๆ

ปิดท้ายงาน

  • ขอบคุณผู้จัดงานที่ทำให้มีงานแชร์ดีๆเหล่านี้ขึ้นมานะครับ ทำใ้ห้แนวคิด หรือ Idea มากครับ
  • เห็นคน Non-IT เข้ามาฟังมาขึ้น แต่ผมยังรอดูต่อไปว่าจริงๆแล้ว Agile กับ Non-IT มีรูปแบบ หรือนิยามอย่างไรนะครับ คือ ตอนนี้ ผมยัมีคำถามในใจว่ามันต่างยังไงกับการปรับกระบวนการ (Process Improvement)
  • สรุปอาจจะขาด หรือ ไม่สมบูรณ์ขออภัยมาด้วยนะครับ ตอนเขียน Blog ยังเบลอๆ
  • ขากลับผมไม่ Challenge นั่งรถเมล์กลับนะ ลองรถไฟฟ้าแทน กลัวติดการชุมนุม
    • BTS พหลโยธิน 24 – หมอชิต 0 บาท ผมแปลกใจเหมือนกัน
    • MRT จตุจักร – บางขนนนท์ 35 บาท
  • อ้อเกือบลืมของในงานเสื้อวิ่งสวยมากครับ ใส่เอาไปวิ่งเรียบร้อยแล้ว
  • อาหารอร่อยครับ แต่ปีนี้ทานน้อยลดน้ำหนักอยู่ หวังว่าปลายปีจะต่ำกว่า 70 ยังอยู่ในวังวนของ 76-77 kg

มาลองเริ่มใช้ podman กันครับ

podman มันเกี่ยวอะไรกัน ipod หรือป่าว ขอตอบว่าไม่ใช่นะครับ เป็นตัว Container Engine ตัวนึงครับ แบบเดียวกับ docker เลยครับ แต่งานนี้มาจากทาง Linux ค่าย RedHat ครับ โดยใน blog นี้เป็นการสรุปจากการงมๆครับ โดยมองว่ามี Keyword ที่น่าสนใจ ดังนี้

  • podman ไม่จำเป็นต้องใช้ user ในกลุ่ม root ทำงาน เดี๋ยวผมลองใช้ user ในกลุ่ม non-root ทดสอบครับ เพื่อที่ run container ใน mode rootless ครับ
  • Container ถ้าถูกทำตามมาตรฐาน OCI ใช้งานได้เหมือนกันครับ
  • เนื่องจากเป็นการงมๆ ผมเลยของลองเล่น Opensource ที่มันจบ และเสร็จในตัวอย่าง Ghost ซึงเป็น CMS อีกค่านึงครับ ที่ไม่ใช้ฐานข้อมูลครับ
  • podman เป็น Linux Base Only – ค่ายอื่น อย่าง Windows อาจจะทำได้ แต่มีท่ายากขึ้นไปอีกครับ

มาลองกันครับ

  • ก่อนอื่นสิ่งที่ต้องมี OS Redhat ครับ โดยผมได้ใช้งาน redhat 8.2 และ ได้ register เป็น developer เพื่อใช้งานในการทดสอบครับ (ถ้าใครอยากลองเป็น redhat developer สามารถ เข้ามาได้ครับ)
    • เครื่อง หรือ VM ที่ใช้ทดสอบ อันนี้ต้องสามารถต่อ Internet ได้ด้วยนะครับ
    • ขั้นตอนในช่วงแรกใช้ root เพื่อติดตั้ง package ที่จำเป็นครับ
  • ติดตั้ง podman และ slirp4netns ด้วยคำสั่ง
sudo dnf install slirp4netns podman -y
  • อย่างมาในขั้นตอนนี้หลายคนน่าจะงงกันแล้ว ว่าทำไมต้องลง 2 ตัวด้วย
    • podman – เป็นต้ว Container Engine
    • slirp4netns – เป็นตัวที่สร้างช่องทางพิเศษที่เรียกว่า tap เพื่อให้ container ที่ run โดย user non-root สามารถต่อ network ได้
  • ลองเสร็จสิ้นกันแล้วลองมาตรวจสอบ version ของ podman ด้วยคำสั่ง
podman --version
  • อีกตัว version ของ slirp4netns ด้วยคำสั่ง
slirp4netns --version
  • ขยายขนาดของ user namespace ใน kernel มีขนาดสูงสุด ด้วยคำสั่ง
echo "user.max_user_namespaces=28633" > /etc/sysctl.d/userns.conf
  • บันทึกสิ่งที่แก้ไขไปใน /etc/sysctl.d/userns.conf ด้วยคำสั่ง
sysctl -p /etc/sysctl.d/userns.conf
  • ลองสร้าง user ขึ้นมาทดสอบ โดยกรณีนี้ ผมกำหนดว่าเป็น invsbch / invsoper ซึ่งเมื่อสร้าง user เสร็จตัว podman map ให้สามารถใช้งาน rootless container ได้อัตโนมัติครับ
useradd -u 1001 
echo invsbch:invsbch | chpasswd
useradd -u 1002 
echo invsoper:invsoper | chpasswd
  • เปิด putty อีก 1 session ครับ โดยใช้ user invsbch ที่ไม่ใช่ root
  • ค้นหา image จาก Ghost จาก docker hub ครับ
  • ตอนนี้เรารู้คำสั่งในการ pull image มาใช้่งานแล้ว แต่ผมอยากลองครับ 555
  • ลองหา image ghost ด้วยคำสั่ง podman search <ชื่อ image>
podman search ghost
  • ลองดึง image ghost มาด้วยคำสั่ง podman pull <ชื่อ image>
podman pulll ghost
  • รอมันดึงข้อมูลให้เสร็จครับ
  • ตรวจสอบ Mapping สำหรับ rootless container โดยการใช้คำสั่ง
podman unshare cat /proc/self/uid_map
[invsbch@localhost ~]$ podman unshare cat /proc/self/uid_map
         0       1000          1
         1     100000      65536
  • สำหรับผลที่ได้จากคำสั่ง podman unshare cat /proc/self/uid_map มี 3 Column ครับ ได่้แก่
    • Column แรก – ค่าเริ่มต้น (initial ID) ของ namespace
    • Column สอง – ค่าเริ่มต้น (initial ID) ของ parent namespace
    • Column สาม – ขนาดของ namespace
  • ทดสอบ run image ด้วยคำสั่ง (ผมเอาตัวอย่างมาจาก dockerhub นะครับ)
podman run -d --name testghost -e url=http://localhost:3001 -p 3001:2368 ghost
  • มาทดสอบหน้าเว็บ Ghost กันก่อนนะครับ เพื่อมาทดสอบดูว่า non-root ที่ run container ขึ้นมา มันมีศัพท์เฉพาะด้วยนะว่า rootless ว่าได้ไหม ถ้าจาก docker hub ของ Ghost ถ้าดูหน้าเว็บต้องใช้ url ดังนี้
    • หน้าเว็บ http://<<YOUR-IP>>:3001 ของผมใช้เป็น http://192.168.1.104:3001
    • หน้าเว็บ http://<<YOUR-IP>>:3001/ghost ของผมใช้เป็น http://192.168.1.104:3001/ghost
  • หลังจากดูแล้วว่า Ghost ทำงานได้สมบูรณ์แล้ว มาลองดูใน container กันครับ ตอนนี้เรายังใช้งาน user invsbch กันครับ มาลองดูว่ามี container ที่ run อยู่ครับ ด้วยคำสั่ง
  • เอาหละที่นี้ลองใช้ user invsoper มาลอง
  • คราวนี้มาลองใช้ user root ครับ
  • ตอนนี้เราเห็นว่า image มันแยกขาดกันเลยครับ

สรุป

  • podman เป็น Container Engine ที่ออกแบบมา เพื่อแก้ปัญหาของ docker ที่ต้องใช้ root ในการทำงานครับ
  • ไม่ใช้ root สามารถรัน image ได้ตามแนวคิดของ rootless ครับ แต่มีข้อจำกัดด้วย network ซึ่งทาง podman แก้ปัญหาโดยใช้ slirp4netns
  • ลองใช้คำสั่งกับ image เช่น search, pull, run พบว่ามันเหมือนกับ docker เลยครับ แค่เปลี่ยนคำว่า docker เป็น podman ครับ
  • เวลา run image เห็นว่ามันแยกกันชัดเจนครับ ขนาด root ยังไม่เห็น container ที่รัน โดย user อื่นครับ
  • สำหรับ Blog หน้าผมของลองเรื่องอื่นๆ เกี่ยวกับ podman เพิ่มเติมครับ