Pranithan Thamcharoenporn

Pranithan Thamcharoenporn

Developer and Data Engineer Government Big Data Institute (GBDi)

บทความทั้งหมด

All Articles

Author Category Post Filter
การเข้ารหัสลับ (Encryption) เบื้องต้น สำหรับนักพัฒนา
บทความ “การเข้ารหัสลับ (Encryption) เบื้องต้น สำหรับนักพัฒนา” นี้ใช้แหล่งข้อมูลส่วนใหญ่จาก e-book ชื่อ Practical Cryptography for Developers อวจ: ที่อยู่ในบทความนั้นย่อมาจาก เอาไว้จำ จุดประสงค์ของผู้เขียนมีไว้เพื่อสรุปความสำหรับผู้อ่านที่มีความเข้าใจอยู่บ้างแล้ว หรืออ่านหัวข้อนั้นแล้วให้สามารถจำนิยามของหัวข้อนั้นได้ สาร ในบทความนี้ไม่ใช่ สารเคมี แต่เป็นข้อความ (message) ในปัจจุบันอินเทอร์เน็ตเข้ามาเป็นส่วนหนึ่งของชีวิตทุกคน แต่กระนั้นความสะดวกสบายที่มาพร้อมกับอินเทอร์เน็ต ก็ไม่ได้นำมาเฉพาะข้อดีเพียงอย่างเดียว หากมองในด้านความปลอดภัยด้วยนั้น อินเทอร์เน็ตจึงเป็นเหมือนดาบสองคม เนื่องจากว่าหากนักพัฒนา หรือผู้ใช้งานขาดความเข้าใจ ก็จะทำให้เกิดช่องโหว่ให้ผู้ไม่ประสงค์ดีโจมตีระบบ หรือเกิดการโจรกรรมทางไซเบอร์ได้ และหนึ่งในหัวใจสำคัญของการสื่อสารระหว่างผู้ใช้งาน (Client) กับแม่ข่าย (Server) นั่นก็คือ การเข้ารหัสลับ (Encryption) โดยบทความนี้จะค่อย ๆ ปูนิยามของศัพท์ต่าง ๆ ที่เกี่ยวข้อง เช่น การเข้ารหัส (Encoding), ฟังก์ชันแฮช (Hashing function) เป็นต้น จนนำไปสู่เรื่องการเข้ารหัสลับ (Encryption) ทีละหัวเรื่อง ดังต่อไปนี้ การเข้ารหัส (Encoding) อวจ: ด <-> d ; เสียง “ด” ในภาษาไทย คือเสียง “d” ในภาษาอังกฤษ ผู้เขียนใช้ภาษาไทยว่า การเข้ารหัส เพื่อแปลคำว่า Encoding และ การเข้ารหัสลับ เพื่อแปลคำว่า Encryption เนื่องจากทั้งสองสิ่งนี้แตกต่างกันอย่างมาก การเข้ารหัสนั้นไม่ได้ทำเพื่อรักษาความลับของสาร แต่ทำเพื่อความสะดวกในการรับส่งสาร หรืออ่านสารได้ง่ายขึ้น ตัวอย่างเช่น การแปลงเลขฐานสองเป็นฐานสิบ หรือการแปลงเลขฐานสิบเป็นสายอักขระ (byte array) หรือการแปลงสายอักขระเป็นสาร base64 เป็นต้น การเข้ารหัสนั้น สามารถย้อนกลับได้ง่ายด้วย การถอดรหัส (Decoding) ถ้าหากเรารู้ว่าสารที่เรารับมาถูกเข้ารหัสมาแบบใด เราก็จะสามารถถอดรหัสสารนั้นเป็นสิ่งที่เราต้องการได้ เช่น การแปลงสาร base64 เป็นสายอักขระ ตัวอย่าง การเข้ารหัสจากสายอักขระเป็นสาร base64 และถอดรหัสจากสาร base64 เป็นสายอักขระ ในภาษา python เกร็ด: ภาษาคาราโอเกะ ภาษาลู หรือคำผวน ก็เป็นการเข้ารหัสเช่นกัน 🙂 ฟังก์ชันแฮช (Hashing function) อวจ: คิดถึง -> 345e28e423062ecb7dad358f1b47e4abb836a0cd77cf9f47cf6e6478f8d43403 ; ให้แฮชของความคิดถึง แทนความซาบซึ้งในใจ (เพราะจำไม่ได้ 555) การแฮชนั้นคล้ายกับการเข้ารหัสตรงที่ ถ้าเรามีสาร และฟังก์ชันการแฮช เราก็สามารถ ผลิต เลขแฮชได้ แต่กลับกัน หากเราได้เลขแฮชมา เราจะไม่สามารถรู้ได้ว่า สารก่อนเข้าฟังก์ชันแฮชเขียนไว้ว่าอย่างไร ซึ่งจะนำไปสู่คุณสมบัติของฟังก์ชันแฮช คุณสมบัติของฟังก์ชันแฮชนั้นมีสองประการ คือ คำว่า แทบจะไม่มีสิทธิ์ชนกัน นั้น แน่นอนว่าอาจจะเกิดการชนกันได้ แต่เกิดขึ้นยาก อภิมหาโคตรยาก เรียกว่า การพยายามจะหาสารสองอันที่จะให้ผลลัพธ์เลขแฮชเดียวกัน ก็เหมือนกับการควานหาฝุ่นในจักรวาลก็ปานนั้น แต่ในอนาคตก็ไม่แน่ว่า Quantum Computer อาจจะทำให้ SHA-2 ที่ได้รับความนิยมอยู่ในปัจจุบันถูกโค่นลงได้สักวัน อันนี้ก็เป็นเรื่องของอนาคตที่เราต้องติดตามกันต่อไป ตัวอย่าง ฟังก์ชันแฮชในภาษา python ในที่นี้ ผู้เขียนขอใช้ตัวอย่างฟังก์ชัน sha256 หรือ SHA-2 มาเป็นตัวอย่าง เกร็ด: ยังมีกลุ่มฟังก์ชันที่มีแนวคิดคล้ายกับฟังก์ชันแฮชอีกสองอย่าง คือ check digit และ checksum แต่ต่างกันตรงความยากในการชนกัน เช่น หมายเหตุ: วิธีการคำนวน check digit นำมาจาก ที่นี่ จะสังเกตว่า การคำนวน check digit นั้นสามารถเกิดผลลัพธ์ที่ชนกัน (หรือเหมือนกันจากในตัวอย่างคือเลข หนึ่ง) ได้ค่อนข้างง่าย ส่วน checksum นั้นจะเกิดผลลัพธ์ที่ชนกันค่อนข้างยาก ตัวอย่างคือ SHA-1 ในอดีตฟังก์ชันนี้ถูกใช้เพื่อเป็นฟังก์ชันแฮชด้วย แต่ปัจจุบันมีผู้ที่สามารถหาผลลัพธ์ที่ทำให้เกิดผลลัพธ์ที่เหมือนกันได้แล้ว ดังนั้น SHA-1 จึงไม่ดีพอที่จะใช้เป็นฟังก์ชันแฮชเพื่อความปลอดภัยอีกต่อไป อย่างไรก็ดี SHA-1 นั้นยังมีการใช้เพื่อทำ checksum เพื่อตรวจสอบความถูกต้องของไฟล์อยู่ ฟังก์ชัน MAC อวจ: mac_func(สาร, รู้กันแค่เรา) -> ตัวเทียบว่าสารถูกต้อง ; นายเอส่งจดหมายรัก(สาร)หาน้องบีโดยใช้กระดาษสองแผ่นเสมอ(รู้กันแค่เรา) แต่วันหนึ่งไปรษณีย์ทำปลิวหายไปแผ่นหนึ่ง น้องบีจึงรู้ว่าจดหมายนั้นไม่ครบถ้วน(ไม่ถูกต้อง)เพราะไม่ครบสองแผ่น MAC ในที่นี้ย่อมาจาก Message Authenticaion Code ไม่ได้เกี่ยวข้องกับ MAC Address หรือ Media Access Control Address แต่อย่างใด MAC มีไว้เพื่อทำหน้าที่พิสูจน์ว่าสารที่เราได้รับมาถูกต้องสมบูรณ์หรือไม่ เนื่องจากการคำนวน MAC โดยวิธีใช้ hash_func(key + msg) นั้นไม่ปลอดภัยจากการโจมตีแบบ Length Extension Attack ดังนั้นฟังก์ชัน MAC ที่ปลอดภัยและได้รับความนิยมคือ HMAC (Hash-based MAC) โดยมีหน้าตาคือ mac = HMAC(key, msg, hash_func) ตัวอย่างฟังก์ชัน HMAC ในภาษา python ฟังก์ชัน KDF อวจ: kdf_func(เกลือ, รหัสผ่าน, อย่างอื่นถ้ามี) -> รหัสผ่านที่แปลงแล้ว KDF ย่อมาจาก Key Derivation Functions ฟังจากชื่อแล้วแอบน่ากลัวว่าจะเกี่ยวกับ Derivative ในคณิตศาสตร์ใช่ไหม แต่ไม่ใช่เช่นนั้น ฟังก์ชันนี้ไม่ได้เกี่ยวกับการคำนวน Derivative ผู้อ่านจึงไม่ต้องกังวล โดยในหัวข้อนี้จะพาผู้อ่านสู่ความเข้าใจ KDF ผ่านการจัดการรหัสผ่านระดับต่าง ๆ  ในการจัดการรหัสผ่าน (password) นั้นแน่นอนว่าเราไม่สามารถหลีกหนีเรื่องความปลอดภัยไปได้ และการเก็บรหัสผ่านของผู้ใช้ที่สามารถนำไปใช้งานกับระบบได้ทันทีก็เปรียบเสมือนการเก็บระเบิดเวลาไว้ในระบบ ผู้เขียนขอกล่าวถึง การจัดการรหัสผ่านโดยเริ่มตั้งแต่ระดับ อย่าหาทำ ไปจนถึงระดับ ควรทำ ระดับ อย่าหาทำ หรือเกรียนสุด วิธีการที่ง่ายสุด (และเกรียนที่สุดด้วย) นั่นคือการเก็บรหัสผ่านแบบ โต้ง ๆ ได้มาอย่างไรก็เก็บไปอย่างนั้นซะเลย ตัวอย่างเช่น ผู้ใช้งานกรอกรหัสผ่านตอนลงทะเบียนมาเป็น “hello123” ก็นำรหัสผ่านนี้เขียนลงในฐานข้อมูลตารางผู้ใช้เป็น “hello123” นั่นเอง แม้ว่าการจัดการรหัสผ่านของผู้ใช้โดยวิธีนี้จะไม่มีความซับซ้อน และไม่ต้องใช้...
27 May 2022
FHIR Server in action
*บทความนี้เหมาะสำหรับผู้มีพื้นฐานด้านการพัฒนา software มาบ้าง เช่นรู้จัก Git รู้จัก Docker เป็นต้น เกริ่นนำ ในระยะหลังมานี้สถานพยาบาลในเมืองไทยจัดการกับข้อมูลผู้ป่วยในรูปแบบ electronic มากขึ้น ไม่ว่าจะเป็นสถานพยาบาลของรัฐหรือเอกชน สังเกตจากเวลาเราไปหาหมอตามโรงพยาบาลใหญ่ ๆ ฝ่ายลงทะเบียนจะไม่ถามหาบัตรผู้ป่วยของสถานพยาบาลอีกต่อไปแล้ว แต่จะเป็นการถามหาบัตรประชาชนกับบัตรประกัน(ถ้ามี)แทน หลังจากนั้นพนักงานของแผนกลงทะเบียนก็จะป้อนข้อมูลเข้าสู่ระบบ HIS (Health Information System) เพื่อเพิ่มระเบียนการเข้าพบแพทย์ (Visit) และต่อจากนั้นระบบของสถานพยาบาลอาจจะออกบัตรคิวให้เราถือเพียงแผ่นเดียวเพื่อเดินไปยังแผนกต่าง ๆ ถึงตรงนี้อาจมีคำถามในใจหลายท่านว่า “แล้ว FHIR คืออะไร? ทำไมเราถึงต้องใช้ FHIR?” ก่อนจะตอบคำถามนี้ผู้เขียนต้องขอวาดผังนักแสดงในละครเรื่องนี้กันสักเล็กน้อย นี่คือภาพรวมของระบบ HIS ที่โรงพยาบาลหนึ่งตั้งขึ้นใช้งาน ผู้ป่วยเข้าพบบุคลากรทางการแพทย์ในแผนกต่าง ๆ และบุคลากรทางการแพทย์จึงเข้าใช้ระบบ HIS ผ่านเครื่อง HIS Client เพื่อจัดการข้อมูลผู้ป่วย จากนั้น HIS Sever จึงดำเนินการตามคำขอของ HIS Client ถึงตรงนี้จะเกิดอะไรขึ้นถ้า สถานพยาบาลที่ใช้ HIS ยี่ห้อหนึ่งต้องการแลกเปลี่ยนข้อมูลกับสถานพยาบาลที่ใช้ HIS อีกยี่ห้อหนึ่ง ทุกอย่างจะไม่มีปัญหาถ้า โครงสร้างของฐานข้อมูลของ HIS สองยี่ห้อนั้นหน้าตาเหมือนกันชื่อผู้ป่วยถูกจัดเก็บไว้ในตาราง ชื่อเดียวกัน columns ต่าง ๆ ใช้ชื่อเดียวกัน ซึ่งในโลกแห่งความเป็นจริงนั้น HIS เกิดขึ้นมานานก่อนที่มาตรฐานข้อมูลสุขภาพในประเทศไทยจะเป็นรูปเป็นร่าง และ HIS แต่ละเจ้าก็ต่างคนต่างทำเป็นสูตรของใครก็ของเจ้านั้น ดังนั้นถ้าหากเราต้องการแลกเปลี่ยนกันได้ก็จำเป็นต้องมี “คนกลาง” ในการพูดคุยกันระหว่าง HIS ยี่ห้อ ก. และ HIS ยี่ห้อ ข. ผู้เขียนขอกลับมาตอบคำถามว่า “FHIR คืออะไร?” FHIR (Fast Health Interoperability Resources) คือมาตรฐานข้อมูลสุขภาพซึ่งเขียนขึ้นโดยองค์กร HL7 คิดง่าย ๆ ก็คือ FHIR เป็น “คนกลาง”, “ล่าม” หรือ “วุ้นแปลภาษา” ให้ระบบที่มีโครงสร้างข้อมูลที่ต่างกันให้สื่อสารกันกายใต้โครงสร้างข้อมูล FHIR นั่นเอง ทีนี้สำหรับคำถาม “ทำไมเราต้องใช้ FHIR?” ในประเทศไทยเริ่มมีการใช้มาตรฐานข้อมูลสุขภาพขึ้นมาบ้างแล้ว เริ่มมีบทความเกี่ยวกับเรื่องนี้ขึ้น เช่น บทความ “4 ขั้นตอนสู่การแลกเปลี่ยนข้อมูลสุขภาพ ด้วย HL7 FHIR” โดยอาจารย์รัฐ ปัญโญวัฒน์ หรือแม้แต่โครงการระดับประเทศอย่างโครงการ Health Link เองก็มีการนำเอา มาตรฐาน FHIR มาใช้เช่นกัน ดังนั้นอาจจะตอบแบบกำปั้นทุบดินก็ว่าได้ว่า “ผู้บุกเบิกในด้านนี้ในเมืองไทยลองใช้มาก่อน” ลองเล่นกับไฟ (FHIR Server) ได้อ่านสิ่งที่ผู้เขียนเกริ่นมาพอจะทำให้ผู้อ่านมีไฟในการลองเล่นกับ “ไฟ” หรือไม่ครับ? หากเป็นเช่นนั้นแล้วเรามาทดลองดูกันครับว่าเราทำอะไรกับมันได้บ้าง ก่อนที่ผู้อ่านจะสามารถลองเล่นกับไฟได้ ก็ต้องจุดไฟก่อนครับ (ไม่ใช่ไฟนั้นน ><) ขอโทษครับไม่ใช่ไฟแบบนั้น (แต่ FHIR ออกเสียงว่า “ไฟร์” จริง ๆ นะเออ) เอาเป็นว่าขอให้ติดตั้งเครื่องมือดังต่อไปนี้บนเครื่องคอมพิวเตอร์ของผู้อ่านให้เรียบร้อยครับ ไปเอา Source Code จากนักพัฒนา หลังจากติดตั้งเครื่องมือด้านบนเรียบร้อยแล้ว ก็ถึงเวลาที่เราจะไปเอา Source Code จากนักพัฒนามาลองรันกัน โดยเจ้าที่ผู้อ่านจะแนะนำนั้นเป็นหนึ่งใน Software ที่พัฒนาให้เป็นไปตามมาตรฐาน FHIR มาอย่างยาวนานคือ HAPI FHIR เบื้องหลังของ Software ตัวนี้พัฒนาโดยใช้ Java (Springboot Framework) นะครับ ผู้อ่านสามารถเข้าไป clone ได้จาก repository นี้ ถ้าใช้ Command Line ก็คือ หลังจาก clone มาแล้ว เปิดเข้าไปใน folder ควรมีหน้าตาแบบนี้ครับ สร้าง DevContainer หลังจากที่เราเปิด Folder hapi-fhir-jpaserver-starter ขึ้นมาแล้วให้ Click ขวาเลือก Open with Code จาก Context Menu ครับ จากนั้นใน VSCode สร้าง Folder ชื่อ .devcontainer ขึ้นมา ใน Folder .devcontainer ให้สร้างไฟล์ขึ้นมาสามไฟล์ดังต่อไปนี้ และภายใน Folder .vscode (ซึ่งมีอยู่แล้ว) ให้สร้างไฟล์เพิ่มอีกสองไฟล์ดังนี้ สรุปไฟล์ที่เกิดขึ้นใหม่ใน Project จะมีตามนี้ครับ สุดท้ายภายในไฟล์ pom.xml ให้เพิ่ม Code ต่อไปนี้ ลงไปใน project/build โดยผลลัพธ์หลังแก้ไขจะเป็นแบบนี้ เมื่อถึงตอนนี้เราสามารถเปิด VSCode เข้าสู่ DevContainer ได้แล้วโดยการ Click ปุ่ม Open a Remote Window มุมล่างซ้ายของ VSCode และเลือก Reopen in Container ทดลองรัน FHIR Server บนเครื่อง localhost ภายหลังจากเปิด DevContainer ภายใน VSCode ขึ้นมาได้สำเร็จแล้ว ให้ผู้อ่านดูใน Tab Java Project และ หน้าต่าง VSCode Terminal ว่าเสร็จกระบวนการหรือยัง ขอ Internet Speed แรง ๆ ด้วยก็จะทำให้เสร็จเร็วขึ้นได้มากครับ ตรงนี้ใช้เวลานานนิดนึงนะครับ สำหรับการเปิดครั้งแรก เพราะ VSCode จะไปควานหา Maven Dependency มาให้เรา หากใครพบปัญหาว่ามันทำงานไม่เสร็จสักทีหลังจากที่รอนานมาก ๆ (ตัวเลข xxx/1000 ไม่ขยับ อาจจะด้วยเพราะการเปิดครั้งก่อนหน้า crash หรือ Internet ถูกตัดกลางคัน) ผู้อ่านแนะนำให้ปิด VSCode แล้วเปิดบน DevContainer ใหม่อีกครั้ง หลังจากผ่านกระบวนการ Importing Maven Project ไปแล้ว การเปิดครั้งต่อ ๆ ไปควรจะเร็วขึ้นอย่างเห็นได้ชัด เพราะใน...
4 November 2021
VSCode DevContainer: เครื่องมือพัฒนาสารพัดใช้
DevContainer คืออะไร? ผู้อ่านเคยประสบกับปัญหาการพัฒนาโปรแกรมแบบนี้บ้างหรือเปล่า? ทำไมกว่าจะ Build ได้มันยากจังง? ทำไมต้อง Install อะไรหลายอย่าง? Project นี้ Framework ใช้ Version อะไรนะ? เครื่องเพื่อน Build ผ่านทำไมเครื่องฉัน Build พัง? หากปัญหาที่กล่าวมาฟังดูคู้นนน คุ้น ผู้เขียนคิดว่า DevContainer จะเป็นตัวเลือกหนึ่งที่สามารถใช้แก้ปัญหาดังกล่าวได้ สำหรับบทความนี้ผู้เขียนขออนุมานก่อนว่าผู้อ่านคุ้นชินกับ Docker อยู่แล้วประมาณหนึ่ง (แต่ถ้ายังไม่เคยลอง ท่านผู้อ่านสามารถเริ่มทำความรู้จักกับ Docker ก่อนได้ที่นี่) สมมุติว่าเรามี Docker Container ซึ่งเราสามารถติดตั้งอะไรก็ได้ลงไปบน Container ตัวนี้ ทีนี้จะเกิดอะไรขึ้นถ้าเราติดตั้งชุดพัฒนาทุกอย่างที่เราต้องการบน Container ตัวนั้น? คำตอบคือเราจะสามารถ Build/Compile และ Run สิ่งที่เราเขียนได้นั่นเอง ทีนี้ลองคิดต่อจะเกิดอะไรขึ้นอีกถ้า VSCode มันสามารถต่อเข้าไปยัง Container ตัวนี้และใช้ Container ตัวนี้เป็น Workspace? นั่นคือเราใช้ VSCode เป็นตัวเขียน Code ซึ่งทำงานหลังบ้านใน (Dev)Container นั่นเอง… ขออนุญาตอ้างอิง(ไม่ได้ขโมยนะครับ) เอารูปจากเวป VSCode มาใช้ประกอบการอธิบายนะครับ จากรูปจะเห็นได้ว่ากรอบด้านซ้ายมือ Local OS เป็นตัวแทนของ OS บนเครื่องจริง ๆ ของท่านผู้อ่าน (โดยทั่วไปคงจะเป็น Windows) และซ้ายมือ Container นั่นคือ Docker Container ที่ VSCode จะใช้เป็น Workspace ในการพัฒนา ดังนั้นไม่ว่าผู้อ่านจะพัฒนาภาษาอะไร (หมายถึงภาษาคอมพิวเตอร์นะครับ ^_^’’’) ก็จะใช้เครื่องมือบนเครื่องอยู่เพียงสามสี่อย่างเท่านั้น นั่นก็คือ… เครื่องมือที่ต้องใช้ เพียงแค่ผู้อ่านติดตั้งเครื่องมือเหล่านี้ ก็สามารถลงมือพัฒนาได้เลย (สะดวกสบายมั้ย!) การทดลองใช้ หากผู้อ่านไม่มี Source Code หรือ Project อยู่ในมือเลย ก็สามารถเริ่มสร้างใหม่ได้จากศูนย์ โดยการใช้ VSCode ช่วย ให้ผู้อ่านทำตามขั้นตอนดังนี้ การแก้ไขไฟล์ภายใต้โฟลเดอร์ .devcontainer ที่มีอยู่ ภายใต้ Folder .devcontainer นั้นจะมีไฟล์หลักอยู่สามไฟล์ ได้แก่ devcontainer.json เป็นไฟล์หลักที่บ่งบอก VSCode ว่า Parent Folder นี้มี DevContainer อยู่ด้วย ภายในไฟล์นี้มีหน้าตาตั้งต้นดังนี้ คำอธิบาย Property docker-compose.yml เหมือนกับไฟล์ docker-compose.yml ธรรมดา ที่ใช้กับคำสั่ง docker compose โครงสร้างภายในคือ Docker Compose YAML เราสามารถทำทุกอย่างได้เหมือนกับ Docker Compose ปกติ (ตัวอย่างเช่น เพิ่ม Service ใส่ Volume หรือใส่ Environment Variable เป็นต้น) Dockerfile เหมือนกับไฟล์ DockerFile ธรรมดา ที่ใช้กับคำสั่ง docker build โครงสร้างภายในคือ Docker File เราสามารถทำได้เหมือนกับ Docker File ปกติเช่นกัน ทดลองสร้าง API Server ในห้วข้อนี้ผู้เขียนจะพาผู้อ่านทดลองการสร้าง API Server ขึ้นมาใน DevContainer ที่เราได้สร้างกันไว้ในหัวข้อ การทดลองใช้ ให้ผู้อ่านทำตามขั้นตอนนี้ได้เลยยย หาก Run สำเร็จ Terminal จะแสดงผลลัพธ์ดังนี้ การแก้ไขปัญหาเบื้องต้น ถ้าหาก VSCode ไม่สามารถสร้าง Docker Container ได้สำเร็จจะเกิด Message Box ขึ้นมาดังนี้ ผู้อ่านสามารถลองคลิกปุ่ม Retry หรือ Open docker-compose.yml Locally ก็ได้ ถ้าหาก Retry แล้วไม่สำเร็จให้ลองกดปุ่ม Open docker-compose.yml Locally แล้ว VSCode จะแสดงหน้าต่าง Log ขึ้นมา จากนั้นให้พิจารณา Log ที่เกิดขึ้น (ในที่นี้ผู้เขียนใส่ย่อหน้าใน docker-compose.yml ผิด) แล้วแก้ไขให้ถูกต้องแล้วลองคลิกเลือกเมนู Reopen in Container จะเอาไปใช้จริง ๆ ยังไงดี? อย่างที่ผู้เขียนเล่าไปแล้วว่า DevContainer นั้นใช้ docker-compose เป็นแกน ดังนั้นผู้อ่านอาจจะลองหา Framework ในเมนูดูก่อน เผื่อว่าอาจจะมีสิ่งที่ผู้อ่านต้องการจะสร้างอยู่ในนั้นแล้ว ถ้าเป็นแบบนี้ผู้อ่านไม่ต้องทำอะไรมาก แต่ถ้าหากผู้อ่านต้องการปรับเปลี่ยน Compose (ยกตัวอย่างเช่น เปลี่ยนจาก MongoDB เป็น MySQL เป็นต้น) อันนี้ก็สามารถเปลี่ยน docker-compose.yml ได้เลย ข้อสังเกตอีกประการหนึ่งก็คือ เมื่อเราใช้ DevContainer เราจะไม่ติดตั้งเครื่องมือที่เกี่ยวกับภาษา หรือ Framework ที่เราจะพัฒนา (เช่นถ้าผู้อ่านจะพัฒนา Node ผู้อ่านก็ไม่ต้องติดตั้ง Node บนเครื่อง) เพราะเครื่องมือต่าง ๆ นั้นอยู่ภายใน Container อยู่แล้ว สรุป DevContainer เป็นเครื่องมืออีกชิ้นหนึ่งที่ทำให้เครื่องผู้อ่าน ไม่รก และไม่ติดปัญหาตอน Build/Run สามารถจำลอง Database โดยไม่ต้องกังวลเรื่องข้อมูล (เพราะเริ่มต้นจาก Database เปล่า ๆ ได้) ทำให้ชีวิตง่ายขึ้น ลองเล่นกับมันดูนะครับ เนื้อหาโดย ประณิธาน ธรรมเจริญพรตรวจทานและปรับปรุงโดย พีรดล สามะศิริ
4 August 2021
การแสดงกราฟด้วยภาษา DOT
บทความนี้จะกล่าวถึงการแสดงกราฟด้วยภาษา DOT โดยพูดถึงหลักภาษา และตัวอย่างการเขียนและผลลัพธ์จริง
29 January 2021
สนามเด็กเล่นของโปรแกรมเมอร์ : ทดสอบโค้ดอย่างรวดเร็วด้วยเครื่องมือประเภทต่าง ๆ
สมัยก่อนตอนที่ผู้เขียนพึ่งจะเข้าวงการพัฒนาซอฟต์แวร์แรก ๆ นั้น ผู้เขียนประสบปัญหาใหญ่ปัญหาหนึ่งคือ เราจะทดสอบคำสั่ง หรือประพจน์ย่อย ๆ ที่เราเขียนขึ้นมาในภาษาต่าง ๆ ได้อย่างไร ซึ่งกว่าจะข้ามผ่านปัญหานี้ได้ก็ใช้เวลาพอสมควรเลยทีเดียว ผู้เขียนจึงอยากจะแบ่งปันประสบการณ์เล็ก ๆ น้อย ๆ กับในการทดสอบคำสั่งในบทความนี้
14 October 2020
PDPA Icon

We use cookies to optimize your browsing experience and improve our website’s performance. Learn more at our Privacy Policy and adjust your cookie settings at Settings

Privacy Preferences

You can choose your cookie settings by turning on/off each type of cookie as needed, except for necessary cookies.

Accept all
Manage Consent Preferences
  • Strictly Necessary Cookies
    Always Active

    This type of cookie is essential for providing services on the website of the Personal Data Protection Committee Office, allowing you to access various parts of the site. It also helps remember information you have previously provided through the website. Disabling this type of cookie will result in your inability to use key services of the Personal Data Protection Committee Office that require cookies to function.
    Cookies Details

  • Performance Cookies

    This type of cookie helps the Big Data Institute (Public Organization) understand user interactions with its website services, including which pages or areas of the site are most popular, as well as analyze other related data. The Big Data Institute (Public Organization) also uses this information to improve website performance and gain a better understanding of user behavior. Although the data collected by these cookies is non-identifiable and used solely for statistical analysis, disabling them will prevent the Big Data Institute (Public Organization) from knowing the number of website visitors and from evaluating the quality of its services.

  • Functional Cookies

    This type of cookie enables the Big Data Institute (Public Organization)’s website to remember the choices you have made and deliver enhanced features and content tailored to your usage. For example, it can remember your username or changes you have made to font sizes or other customizable settings on the page. Disabling these cookies may result in the website not functioning properly.

  • Targeting Cookies

    "This type of cookie helps the Big Data Institute (Public Organization) understand user interactions with its website services, including which pages or areas of the site are most popular, as well as analyze other related data. The Big Data Institute (Public Organization) also uses this information to improve website performance and gain a better understanding of user behavior. Although the data collected by these cookies is non-identifiable and used solely for statistical analysis, disabling them will prevent the Big Data Institute (Public Organization) from knowing the number of website visitors and from evaluating the quality of its services.

Save settings
This site is registered on wpml.org as a development site. Switch to a production site key to remove this banner.