Using Spring RestTemplate with Client Certificate

To configure Spring RestTemplate to use a client certification in a HTTPS connection, you can follow these steps:

  1. Defines and loads a KeyStore to store a client certificate. In this example, the certificate stored in a PKCS12 archive.
  2. Defines a SSLContextBuilder to custom and build the SSL context to be used with the RestTemplate. In this example, we need to connect to the host with self-signed certificate, so we have to load TrustSelfSignedStrategy() in the loadTrustMaterial() method.
  3. Defines a SSLConnectionSocketFactory with the SSLContextBuilder from step 2.
  4. Defines a ClosableHttpClient using HttpClients builder class and set SSLSocketFactory using SSLConnectionSocketFactory from step 3.
  5. Defines a HttpComponentsClientHttpRequestFactory using ClosableHttpClient  from step 4, and configure timeout values.

  6. Finally, create a RestTemplate using HttpComponentsClientHttpRequestFactory from step 5.
  7. To summarize.

     

ความรู้สึกของเช้าวันจันทร์

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

ถ้าคุณมีความรู้สึกเหล่านี้ เป็นความรู้สึกแรกในเช้าวันจันทร์ คุณควรตั้งคำถามกับตัวเองว่า งานที่ทำอยู่ เป็นงานที่ใช่สำหรับคุณแล้วจริงๆ หรือไม่

  1. คุณนอนหลับเต็มอิ่มแล้ว แต่ยังรู้สึกเหนื่อยล้าอยู่ นั่นเป็นสิ่งที่แสดงให้เห็นอย่างชัดเจนว่าปัญหาไม่ได้อยู่ที่การนอน แต่มันอยู่ที่คุณไม่ได้มีความรู้สึกกระตือรือล้นที่จะไปทำงาน
    เคยสังเกตมั๊ยว่าเวลาที่ไปเที่ยวแล้วต้องทำกิจกรรมทั้งวันจนนอนดึก ทำไมเราถึงสามารถตื่นเช้าได้โดยที่รู้สึกสดชื่น และกระตือรือล้นที่จะไปทำสิ่งต่างๆ ซึ่งนั่นมันควรจะเป็นสิ่งที่คุณรู้สึกในทุกๆ วัน
  2. คุณไม่ได้ใช้เมื่อวาน เพื่อเตรียมความพร้อมให้กับวันนี้ ดังประโยคที่ว่า “การล้มเหลวที่จะเตรียมพร้อม คือการเตรียมพร้อมที่จะล้มเหลว” และคนส่วนใหญ่เลือกที่จะไม่เตรียมพร้อมสำหรับวันจันทร์ นั่นเพราะว่ามันไม่ใช่สิ่งที่พวกเขามีความสุขที่จะทำ
  3. ใครๆ ก็เกลียดวันจันทร์ เพราะมันเป็นสิ่งที่ง่ายนะ ที่จะเกลียดในสิ่งที่คนอื่นก็เกลียดเหมือนกัน
  4. คุณไม่ได้กำลังทำงานที่คุณรัก น่าแปลกใจมากที่คนจำนวนมากเลือกทำงานที่รู้สึกสบายๆ และคุ้นเคย แต่ไม่ได้รักที่จะทำมันจริงๆ
  5. Social media เกลียดวันจันทร์ คุณอาจจะเห็นรูปภาพใน facebook หรือ instagram มากมายที่มี caption ไปในทำนองที่ว่าไม่รู้สึกสุนทรีย์นักกับเช้าวันจันทร์
  6. เพื่อนร่วมงานทำให้คุณไม่มีความสุข แม้คุณจะได้ทำงานที่คุณชอบ แต่เพื่อนร่วมงานที่ไม่สร้างพลังงานในทางบวก ก็อาจจะทำให้คุณไม่มีความสุขในการทำงานได้ รวมถึงตัวคุณเองในทางกลับกันด้วย
  7. วันจันทร์คือจุดสิ้นสุดของชีวิตที่คุณชอบ และจุดเริ่มต้นของชีวิตที่คุณไม่ชอบ นั่นเป็นเพราะคุณมีชีวิตเพียงเพื่อที่จะมีความสุขในวันสุดสัปดาห์ และชีวิตนั้นก็มีเวลาเพียงแค่ 48 ชั่วโมง ยังไงล่ะ
  8. เพราะวันจันทร์หมายถึง “ทำมัน(งาน)ทั้งหมดอีกครั้ง” ในมุมมองของการพัฒนาซอฟต์แวร์ ถ้าสมมุติว่าการทำงานในแต่ละสัปดาห์คือ 1 sprint (วงรอบของการพัฒนาซอฟต์แวร์) และคุณต้องอดทน เพื่อที่วันหนึ่งคุณจะรู้สึกว่างานมันเสร็จสมบูรณ์ และคุณจะได้มีความสุขและผ่อนคลายเมื่อถึงจุดๆ นั้น นั่นเป็นสิ่งที่ผิดอย่างมหันต์ คุณกำลังละเลยสิ่งที่เกิดขึ้นในระหว่างการเดินทาง(การทำงาน) ของคุณทั้งหมด และคุณกำลังตั้งเป้าหมายที่มันไม่มีอยู่จริง
    ความสุขที่แท้จริงมีอยู่ในระหว่างการเดินทาง ไม่ใช่เพียงแค่จุดหมายปลายทาง

ขอให้มีความสุข และมีพลังงานในทุกๆ เช้าวันจันทร์

Source: https://www.quora.com/How-do-people-deal-with-Monday-morning-blues/answer/Nicolas-Cole-1

นำ Redis มาใช้เป็น Cache ให้กับ Spring Boot Application

Remark: บทความนี้เขียนบน Spring Boot Version 1.5.10
Redis เป็น in-memory datastore ที่ได้รับความนิยมค่อนข้างมากในปัจจุบัน โดยใน blog entry นี้ เราจะนำ Redis มาใช้เป็น cache ให้กับ Spring Boot Application เพื่อช่วยลดการ query ข้อมูลจาก database หรือ get ข้อมูลจาก service อื่นๆ เพื่อมาใช้ในการประมวลผล การทำงานเบื้องต้นของ cache ที่เราจะใช้งานคือ

  1. ถ้าข้อมูลนั้นถูกเรียกใช้เป็นครั้งแรก จะถูกดึงมาจาก database หรือ external service และถูกเก็บลงใน cache
  2. การเรียกใช้ข้อมูลครั้งที่สองเป็นต้นไป ข้อมูลจะถูกดึงมาจาก cache
  3. ข้อมูลใน cache จะถูกลบในเวลาที่กำหนด และการทำงานจะกลับไปเริ่มที่ 1. อีกครั้ง
โดยมีวิธีการอย่างง่าย ดังนี้
  1. สร้าง class Message ขึ้นมาเพื่อเป็น model ของข้อมูลที่เราจะใช้งาน โดยในที่นี้เราจะใช้ project lombok ช่วยในการทำ getter, setter และ constructor
  2. สร้าง MessageService ที่ทำงานกับ model Message
  3. สร้าง controller และ API method ที่เรียกใช้งาน MessageService รวมถึง main class


    ตอนนี้เราจะได้ API ที่ทำงานกับ model Message โดยจะสร้าง object Message ขึ้นมาใหม่โดยมี property number และ text ตามที่เราส่งไปใน URL ที่เป็น GET method
    ในขั้นตอนต่อไปจะเป็นการใช้งาน Redis เพื่อเป็น cache ให้กับ application โดยมีการทำงานตามที่กล่าวไว้ด้านบน

    localhost:8080/send/100?text=mymessage

  4. เพิ่ม @EnableCaching เข้าไปใน main class ของ application เพื่อเปิดการใช้งาน cache ของ Spring Boot

  5. เพิ่ม configuration properties ที่จำเป็น เข้าไปใน application.properties

  6. เพิ่ม @Cacheable และกำหนด cache name ให้กับ method ที่ทำการดึงข้อมูลที่เราต้องการจะ cache

  7. สร้าง bean CacheManagerCustomizer เพื่อช่วยในการกำหนดการทำงานของ cache ให้เป็นไปตามที่เราต้องการ โดยเราต้องการกำหนดเวลาที่ cache จะ expire เพื่อที่จะไปดึงข้อมูลที่อัพเดทล่าสุดขึ้นมา

  8. ทำการทดสอบ จะได้ผลเป็นดังนี้
    8.1 เมื่อ call API ครั้งแรก method buildMessage() จะถูกเรียกใช้งานจริง และ println ข้อความที่เรากำหนดไว้

    localhost:8080/send/1000?text=mymessage1

    8.2 เมื่อ call API ครั้งถัดมา method buildMessage() จะ return ค่าที่ cache ไว้ สังเกตจาก ไม่มีการ println ข้อความที่เรากำหนด

    8.3 เมื่อครบกำหนดเวลาที่เราต้องการให้ cache expire ในตัวอย่างนี้คือ 20 วินาที แล้ว call API method buildMessage() จะถูกเรียกใช้งานจริง เนื่องจากข้อมูลที่ cache ไว้นั้น expire ไปแล้ว

    8.4 ถ้ามีการเปลี่ยนข้อมูลของ Message ที่ส่งไปกับ URL method buildMessage() จะถูกเรียกใช้งานจริง เนื่องจากข้อมูลใหม่นั้นยังไม่มีใน cache

    localhost:8080/send/1001?text=mymessage2



    เป็นอันเสร็จพิธี!

สร้าง DNS Record สำหรับโฮสต์บน Google Cloud Platform

การสร้าง DNS Record สำหรับ map ชื่อโดเมน ที่เรา register ไว้แล้ว เพื่อมาใช้งานกับโฮสต์บน Google Cloud Platform มีขั้นตอนดังนี้

  1. ไปที่เมนู Products -> Networking -> Network Services -> Cloud DNS
  2. คลิ๊ก  CREATE ZONE
  3. กรอกข้อมูลของ DNS Zone ที่ต้องการสร้างให้ครบ แล้วกด Create
    – Zone name คือชื่อของ DNS Zone ที่เราต้องการสร้าง
    – DNS name คือชื่อโดเมนที่เราได้จดทะเบียนไว้แล้ว
    – DNSSEC คือระบบรักษาความปลอดภัยขอมูลของผู้ถือครองชื่อโดเมน (อ่านเพิ่มเติม https://www.thnic.co.th/th/dnssec/)
    – Description คือคำอธิบายของ DNS zone
  4. เมื่อกรอกข้อมูลครบถ้วนและกด Create แล้ว จะได้ DNS Zone configuration ดังนี้
  5. เลือก Add record set เพื่อสร้าง Record ที่จะ map ระหว่าง ชื่อโดเมน และ Google Compute Engine Instance และกรอกข้อมูลต่างๆ ที่สำคัญดังนี้
    – DNS name คือชื่อโดเมน
    – Resource Record Type คือประเภทของ DNS record (อ่านเพิ่มเติม https://en.wikipedia.org/wiki/List_of_DNS_record_types)
    – IPv4 Address คือ Static IP address ของ Google Compute Engine Instance
  6. เมื่อกด Create แล้วจะเห็น DNS record ใหม่ ถูกสร้างขึ้นมา
  7. หลังจากรอสักครู่ให้ DNS record ถูก propagate ออกไป ก็จะสามารถเข้าใช้งานได้ทันที โดยในตัวอย่างเป็น web server

ในเชิงวิวัฒนาการ การมีหมู่เลือดที่หลากหลายในมนุษย์ มีข้อดีข้อเสียอย่างไร?

Image from: https://bigpictureeducation.com/blood-cells-images

เคยสงสัยกันไหมครับ ว่าการที่คนเรามีหมู่เลือดที่หลายหลาย โดยแบ่งเป็น A, B, AB, O นั้นมีข้อดีอย่างไร โดยเฉพาะในเชิงวิวัฒนาการของมนุษย์ Suzanne Sadedin ผู้เชี่ยวชาญด้านชีววิทยาวิวัฒนาการได้อธิบายไว้ว่า ความหลากหลายของหมู่เลือดไม่ได้ดำเนินไปอย่างเป็นกลาง แต่มันดำเนินไปโดย “การเลือก” โดยมีทฤษฎีที่เกี่ยวข้อง 2 ทฤษฎี ดังนี้
1.  การเปลี่ยนแปลงในการเลือก (Variation in selection) ตัวอย่างของทฤษฎีนี้ เช่น การที่บุคคลที่หมู่เลือดต่างกัน มีภูมิต้านทานต่อโรคแตกต่างกัน เช่น หมู่เลือด AB มีภูมิต้านทาน แต่หมู่เลือด O กลับอ่อนไหวต่ออหิวาตกโรค ในทางกลับกัน หมู่เลือด O มีภูมิต้านทางต่อมาลาเรียที่ดีกว่า ซึ่งหากเกิดโรคระบาดข้างต้นทำให้แน่ใจได้ว่าจะมีมนุษย์ที่อยู่รอดจากโรคนั้นๆ
2. การเลือกโดยอ้างอิงกับสิ่งที่พบได้ไม่บ่อยครั้ง (Negative frequency-dependent selection) หมายถึงการที่บุคคลที่มีหมู่เลือดที่หายากถือเป็นข้อได้เปรียบ ตัวอย่างเช่น แบคทีเรีย จะปรับตัวเข้าหาโฮสต์ที่มันอาศัยอยู่ ดังนั้นมันจึงสามารถโจมตีโฮสต์ในประเภทเดียวกัน (หมู่เลือดเดียวกัน) ได้ดีกว่า หรือกับไวรัส ที่มันจะขโมยโปรตีนจากเนื้อเยื่อเซลล์ของโฮสต์ เพื่อใช้ในการพรางตัวจากระบบภูมิคุ้มกันของร่างกาย ซึ่งมีโอกาสที่ไวรัสจะนำแอนติเจน (antigen) จากโฮสต์ก่อนหน้า มาสู่โฮสต์ใหม่ด้วย ซึ่งหากระบบภูมิคุ้มกันในโฮสต์ใหม่พบว่าแอนติเจนนี้แตกต่างจากแอนติเจนของตน ก็จะสามารถตรวจพบและทำลายไวรัสได้
 
Reference: From an evolutionary perspective, why do we have multiple different blood types and what advantages or disadvantages does that entail?

สเต้กอ้วนผอม ตลาดสามย่าน | Ouan Pom Steak, Samyan Market


Date: February 2017
Device: Xiaomi Redmi Note 3 Pro
This moderate piece of T-bone steak with tasty pepper sauce along with french fries and vegetables salad for lunch can keep hunger away for the whole afternoon – 159 Baht. You can get this meal at Ouan Pom Steak on the second floor of Samyan market near Chulalongkorn University in the heart of Bangkok, Thailand.
สเต้กเนื้อทีโบนขนาดกลางราดด้วยซอสพริกไทยดำ เสิร์ฟพร้อมมันฝรั่งทอดและสลัดผักของร้านสเต้กอ้วนผอมในมื้อกลางวัน สามารถช่วยให้คุณอิ่มไปตลอดทั้งช่วงบ่ายของวัน ในราคา 159 บาท ร้านตั้งอยู่บนชั้นสองของตลาดสามย่าน ใกล้กับจุฬาลงกรณ์มหาวิทยาลัย
Location:

พระอาทิตย์ขึ้นที่ผานกแอ่น | Dawn at Nok Aen Cliff, Phu Kradueng National Park, Thailand


Date: December 2014
Device: Olympus E-PL2 + M.Zuiko 14-42
Amazing scene during the dawn at Nok Aen Cliff in Phu Kradueng National Park located in Loei in the North-East of Thailand. The distance to the cliff from Wang Kwang Camp (main camp in Phu Kradueng) is approximately 2 km. on foot. National park staffs will lead you the way to Nok Aen Cliff starting at 5 AM daily in travel season (October to April every year).
บรรยากาศที่สวยงามของพระอาทิตย์ขึ้น ณ ผานกแอ่น ในอุทยานแห่งชาติภูกระดึง จังหวัดเลย โดยผานกแอ่นอยู่ห่างจากศุนย์บริการนักท่องเที่ยววังกวางเป็นระยะทางประมาณ 2 กิโลเมตร นักท่องเที่ยวสามารถไปผานกแอ่นได้โดยจะมีเจ้าหน้าที่อุทยานนำทางให้ เริ่มเดินทางเวลาประมาณ ตี 5 ของทุกวัน ในช่วงที่เปิดให้ท่องเที่ยว ในเดือนตุลาคมถึงเมษายนของทุกปี
Location:

 

ก๋วยเตี๋ยวเป็ดตุ๋นยาจีนรสชาววัง (แยกพัฒนาการ) | Chinese-Style Stewed Duck Noodle (Pattanakarn Intersection)

Date: February 2017
Device: Xiaomi Redmi Note 3 Pro
Noodle with loads of duck stewed in the gravy (Thai called “pa-low: พะโล้”) for several hours, so it is easily to dispart and eat! – order extra size for 80 Baht. This duck-stewed-in-Chinese-style restaurant located near Pattanakarn 47 alley and Pattanakarn-Srinakarin Intersection. You can park your car in Pattanakarn 47 alley.
ก๋วยเตี๋ยวรวมเป็ดตุ๋นและเป็ดพะโล้ขนาดพิเศษ ให้เนื้อเป็ดตุ๋นจนเปื่อยชิ้นโต และเนื้อเป็ดพะโล้เต็มชาม – ขนาดพิเศษ 80 บาทไทย ร้านเป็ดตุ๋นยาจีนและเป็ดพะโล้นี้ตั้งอยู่ใกล้กับซอยพัฒนาการ 47 และแยกพัฒนาการ-ศรีนครินทร์ สามารถจอดรถได้ในซอยพัฒนาการ 47
Location:

บ้านรักไทย | Ban Rak Thai Village, Mae Hong Son, Thailand


Date: December 2016
Device: Xiaomi Redmi Note 3 Pro
View of Ban Rak Thai, a Yunnan Chinese village located in Mae Hong Son, near Thai-Myanmar border in the northern Thailand. Captured from the other side of the lake. You’ll see fog on the water surface which will usually appear when it is winter time in Thailand.
บรรยากาศของบ้านรักไทย หมู่บ้านจีนยูนนานที่ตั้งอยู่ใกล้กับเขตแดนไทย-พม่าในจังหวัดแม่ฮ่องสอน ภาพถ่ายจากบริเวณอีกฝั่งหนึ่งของทะเลสาบด้านตรงข้ามหมู่บ้าน โดยสามารถเห็นหมอกบางๆ อยู่บริเวณผิวน้ำของทะเลสาบในช่วงฤดูหนาว
Location: