SOLID Principles คืออะไร

SOLID คือ หลักการในการออกแบบซอฟต์แวร์ที่ดี ที่ช่วยให้โครงสร้างของโปรแกรมที่เขียนนั้นมีความชัดเจนและดูแลรักษาได้ง่ายในอนาคต SOLID ย่อมาจาก

  • S = Single Responsibility Principle (SRP)
  • O = Open-Closed Principle (OCP)
  • L = Liskov Substitution Principle (LSP)
  • I = Interface Segregation Principle (ISP)
  • D = Dependency Inversion Principle (DIP)

Continue reading

Javascript มี -0 (Negative Zero) ด้วยนะ

เนื่องจากไม่เชี่ยวชาญ Javascript ถึงจะรู้ว่ามันไม่เหมือนภาษาทั่วๆไปอยู่หลายอย่าง แต่สิ่งที่เจอมาล่าสุดมันแปลกมาก คือ สั่งให้แสดงค่าตัวเลขออกมาแล้วเจอว่ามันแสดงผลเป็น -0 เข้าใจถูกแล้วครับ มันมีเครื่องหมายลบหน้าเลขศูนย์ด้วย ซึ่งมันอาจจะแปลกๆเวลาให้คนที่มาดู ว่ามันต่างจาก 0 ธรรมดาอย่างไร

พอจะรู้อยู่บ้างว่าตัวแปรชนิด Number ใน Javascript นั้นเก็บได้ทั้งจำนวนเต็มและจำนวนแบบมีทศนิยม เหตุการณ์ที่เกิดขึ้นนี้ เกิดจากการใช้ฟังก์ชัน Math.round(ตัวเลขติดลบที่จริงๆแล้วน่าจะเป็นค่าศูนย์) เช่น Math.round(-0.0000123) เอาไปลองใน Chrome Console ดูได้เลย

พอจะต้องแก้ให้ตรวจว่าถ้าเจอ -0 ก็ต้องแสดงผลเป็น 0 จึงได้เจอหนังสือเล่มหนึ่งสรุปไว้ให้แล้วว่านี่คือกลไกใน Javascript จริงๆ!!!

Continue reading

9 featureใหม่ใน Java 9

หลังจาก Java 8 release ได้ 3 ปี กำหนดการ release Java 9 คือ 21 กันยายน 2560 นอกเหนือจากระบบ module ที่เป็นของใหม่และมีการพูดถึงมากที่สุดแล้ว ก็ยังมีหัวข้ออื่นๆอีก รวมเป็น 9 ข้อด้วยกัน

Continue reading

มีอะไรใหม่ใน C# 7

ภาษา C# version ใหม่ ได้เปิดให้ใช้งานตั้งแต่เดือนมีนาคม 2017 แล้ว และพร้อมใช้งานใน Visual Studio 2017

ใน C# 7 นั้นได้เพิ่มความสามารถของภาษาเพื่อให้เขียนโค้ดได้สั้นลง และรองรับการเขียนโปรแกรมสมัยใหม่ เช่น tuple ซึ่งลดข้อจำกัดของการคืนค่าของฟังก์ชันได้มากกว่า 1 ค่า หรือการใช้งานฟังก์ชันในลักษณะของตัวแปร คล้ายกับของ Javascript

รายการ feature ใหม่ใน C# 7 มีดังนี้

Continue reading

REST API กับ HTTP Method

การออกแบบ Web API ในปัจจุบัน ส่วนใหญ่จะเป็นแบบ RESTful ที่รับส่งข้อมูลแบบ JSON ไปหมดแล้ว การออกแบบ API ให้ผู้อื่นใช้งานง่ายจึงมีความสำคัญมากขึ้น

โดยทั่วไป การ request ไปหา API จะอยู่ในรูปแบบ GET ไม่ก็ POST โดยขึ้นกับว่าจะเป็นการรับ หรือส่งข้อมูล การออกแบบ API แบบง่ายที่สุดก็คือใช้ชื่อ ในการบ่งบอกว่า API นั้นทำอะไร เช่น /getproduct หรือ /updateproduct

แต่พอเป็นการใช้งาน API เพื่อทำงานแบบ CRUD นั้น สามารถใช้ HTTP Method หรือ Verb เข้ามาเพื่อให้ API ดูชัดเจนมากขึ้นได้ ถึงจะไม่ได้เป็นกฎตายตัว แต่ถ้าเราทำตาม มันก็จะช่วยให้ผู้ใช้งานเข้าใจได้เร็วขึ้น ยิ่งถ้าเป็น public API ด้วยแล้ว ก็แทบจะไม่ต้องเขียน document อธิบายใดๆเลย

ควรใช้ HTTP Verb คู่กับ operation CRUD ดังนี้

  • GET = R(etrieve)
  • POST = C(reate)
  • PUT = U(pdate)
  • DELETE = D(elete)

หน้าตาของ API endpoint เช่น เราต้องการสร้าง API สำหรับดึงข้อมูลสินค้า ก็จะเป็นลักษณะนี้

  • GET /product/1 คือ ดึงข้อมูลสินค้าที่รหัสสินค้า = 1
  • POST /product คือ เพิ่มข้อมูลสินค้า โดยส่งข้อมูลสินค้าเข้ามาใน body
  • PUT /product/1 คือ แก้ไขข้อมูลสินค้าที่รหัส = 1 โดยใช้ข้อมูลจาก body
  • DELETE /product/1 คือ ลบข้อมูลสินค้ารหัส = 1 ออกจากระบบ

ในด้านผู้ใช้ จะเห็นว่าถ้าจะใช้งาน API นี้ รู้เพียงแค่ endpoint คือ /product ก็สามารถเดาได้เลยว่าจะจัดการข้อมูลสินค้าอย่างไร ผ่านการใช้ HTTP Verb จึงง่ายกว่าเมื่อเทียบกับ /getproductbyid /productnew /updateproduct ว่า Verb กับ Entity อยู่ตรงไหนและใช้ keyword อะไรกันแน่

สแลช (SLASH)

ส่ง message ข้าม process ด้วย NetMQ (ZeroMQ)

blog-netmq

NetMQ เป็นไลบรารีในการส่ง message ข้ามโพรเซส (process) เพื่อแลกเปลี่ยนข้อมูล มีหลายวิธีในการรับส่ง ทั้งแบบ Request-Response, Publish-Subscribe หรือ Push-Pull ซึ่งในแต่ละภาษาก็จะมีไลบรารีที่ทำงานในลักษณะนี้อยู่

NetMQ นั้นเป็นไลบรารีแบบพอร์ต (native port) จาก ZeroMQ โดยใช้ภาษา C# ในที่นี้ ขอยกตัวอย่างการทำงานแบบ Publish-Subscribe หรือเรียกย่อๆว่า PubSub ซึ่งจะมีโพรเซสที่เป็นผู้ส่งข้อมูล (Publisher) กับ ผู้รับข้อมูล (Subsccriber) โดยจะใช้สื่อกลางคือ Topic เปรียบเทียบได้กับการติดตามข่าวสาร ถ้าเราสนใจหัวข้อใดๆ ก็จะไปติดตามเรื่องนั้นๆ จนกว่าจะหยุดการติดตาม หรือเทียบได้กับการปิดโพรเซสไปนั่นเอง

Topic ก็คือชื่อที่ตกลงกันล่วงหน้าระหว่าง Publisher กับ Subscriber เท่านั้น ซึ่งเราสามารถจะจัดโครงสร้างได้ด้วย เช่น ใช้สแลช ( / ) ในการระบุหัวข้อย่อย ในลักษณะเช่น “Music/Rock” โพรเซสที่ subscribe ที่ Topic “Music” จะได้รับข้อความจาก Publisher ที่ส่งมายัง Topic “Music” และ “Music/Rock”

วิธีการเขียนโปรแกรมก็ไม่มีอะไรซับซ้อนมาก ดังนี้

Continue reading

การจับ Exception จาก Task ที่ไม่ได้ catch ไว้ใน C#

slash-blog-c-exception

ในการเขียนโปรแกรมภาษา C# ให้ทำงานในเธรด (thread) ถ้าเกิดเอ็กเซ็พชัน (exception) ขึ้น จะตรวจสอบได้จาก Task.IsFaulted() ซึ่งเราต้องเก็บตัวแปรทาสค์ (task) ไว้

แต่การเขียนให้ตรวจสอบสถานะของทาสค์นั้น อาจไม่สะดวกและทำให้โปรแกรมซับซ้อน ใน C# 5.0 ขึ้นไปที่รองรับการใช้ async/await จะทำให้เขียนได้ง่ายขึ้นมาก โดยจับ exception เสมือนว่าทำงานแบบ synchronous ได้เลยดังนี้

Continue reading

ระบบ Log ใน Java แบบเปลี่ยน implementation ได้ภายหลังด้วย SLF4J

slf4j-logo

จริงๆแล้ว จาวาเองก็มีระบบ log ของตัวเองอยู่แล้ว แต่ถ้าจะใช้งานหนักๆอย่างเช่น การเปลี่ยนรูปแบบข้อความที่จะ log นั้น ต้องสร้างคลาสขึ้นมาเพื่อปรับรูปแบบ เท่าที่สังเกต ส่วนมากจึงเลือกใช้เฟรมเวิร์ก (logging framework) แทน เช่น log4j หรือ jakarta-logging

ปรากฏว่าในเวลาต่อมา log4j ที่ได้รับความนิยมสูงสุดเองก็หยุดพัฒนา โดยผู้เริ่มต้นพัฒนาเองเปลี่ยนไปทำ logback แทน แม้ว่าการใช้งานจะคล้ายๆเดิม แต่ก็มีรายละเอียดบางอย่างที่เปลี่ยนไป

SLF4J เป็นจาวาไลบรารี่ที่ทำหน้าที่เป็นหน้าด่าน (facade) ที่ทำให้นักพัฒนาใช้งานระบบ log ด้วยเอพีไอ (API) เดียวกัน แต่สามารถเปลี่ยน implementation ได้โดยไม่ต้องแก้ไขโปรแกรม เพียงแค่เปลี่ยนไลบรารี่ที่ใช้ พร้อมกับคอนฟิกของแต่ละค่ายเท่านั้น นอกจากนี้ยังสามารถเพิ่มเติมให้รองรับการทำงานมากขึ้นได้ เช่น เพิ่มระดับการ log ได้

จุดเด่นอีกอย่างของ SLF4J คือ parameterized message ซึ่งเป็นเอพีไอที่ช่วยเพิ่มประสิทธิภาพในการทำงาน เพราะไม่ต้องสร้างสตริงจากการต่อสตริงกับออบเจ็กต์ (object) ก่อน แม้ว่าจะไม่ต้อง log ก็ตาม

Continue reading

Test Java App Server ด้วย IntelliJ IDEA Community Edition + Tomcat

idea-tomcat

IntelliJ IDEA สนับสนุนการเทสต์กับแอพเซิร์ฟเวอร์เฉพาะบน Ultimate Edition เท่านั้น จึงทำให้ไม่สามารถใช้งานร่วมกับ Apache Tomcat บน Community Edition ได้

แต่สำหรับโปรเจคที่พัฒนาบนเมเว่น (Maven) มี 2 ทางเลือก เพื่อใช้งาน Tomcat บน Community Edition ได้ สามารถนำวิธีนี้ไปประยุกต์ใช้ทูลส์อื่นๆ เช่น Gradle ได้:

Continue reading

ใช้ phpMyAdmin เข้าถึง MySql บน Azure

featured-image-21

เมื่อติดตั้งฐานข้อมูล MySql บนแอชเชอร์ (Azure) ไมโครซอฟต์จะติดตั้งไปยัง ClearDB ซึ่งเป็นบริการฐานข้อมูลบนคลาวด์ การเข้าถึงข้อมูลจะต้องใช้งานผ่านเว็บไซต์ ClearDB แต่ผู้ใช้งานส่วนใหญ่น่าจะคุ้นเคยกับหน้าจอและเมนูของ phpMyAdmin มากกว่า

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

แต่มีอีกวิธีซึ่งง่ายกว่าและไม่ต้องสร้างเว็บแอพเพิ่ม คือติดตั้งผ่านทูลส์บนแอชเชอร์เอง ซึ่งในเว็บแอพแต่ละตัวจะมีทูลส์ให้ใช้งานอยู่แล้วคือ Kudu

Kudu คือทูลส์ที่รวบรวมโปรแกรมต่างๆที่ช่วยให้การจัดการเว็บไซต์ทำได้ง่ายขึ้น โดยการติดตั้ง extension ซึ่งมีให้เลือกใช้มากมาย และมี phpMyAdmin เป็นหนึ่งในนั้นด้วย

สำหรับ phpMyAdmin นั้น แอชเชอร์มีเมนูสำหรับติดตั้งผ่านเว็บพอร์ทอล (portal) ได้เลย ซึ่งเบื้องหลังคือไปติดตั้งบน Kudu อีกที

Continue reading