By Arnon Puitrakul - 10 กันยายน 2021
Photo by Jay Ruzesky on Unsplash
เรื่องนี้อยู่ ๆ ก็นึกขึ้นได้ว่าเมื่อ 1-2 ปีก่อน ตอนอ่าน Release Note ของ Python 3.8 อ่าน ๆ ไปแล้วมันต้องสะดุด Feature นึงเลย คือ Walrus Operator คือเขียนโปรแกรมมา ยังไม่เคยเจอเลย อยู่ ๆ มันก็มาอยู่ใน Python คือ งง ไปเลย อ่านครั้งแรกคือ อิหยังว้าาาาา แต่พอมาดูในรายละเอียดมันทำให้การเขียน Script ของเราสั้นลงเยอะมาก วันนี้เราลองมาดูกันว่า มันคืออะไร และใช้ยังไง
Walrus Operator เป็นเครื่องหมาย ที่ทำหน้าที่แพค 2 ในตัวเดียวกันเลย คือ การ Assign ค่า เหมือนกับเท่ากับปกติที่เราใช้งานกัน และ ยัง Return ค่าออกไปอีกด้วย อ่านแล้วอาจจะ งง ลองดูตัวอย่างนี้ดู
a = 10
print(a)
ในตัวอย่างนี้ เรา Assign ให้ a เป็น 10 โดยใช้เท่ากับ และ เราก็ใช้คำสั่ง print() เพื่อเอา a ออกมาแสดงผลที่หน้าจอ ซึ่งแน่นอนละว่ามันก็ควรจะต้องออก 10 อยู่แล้ว นั่นไม่ใช่ประเด็น
print(a := 10)
เมื่อเราใช้ Walrus Operator มันก็จะย่อลงเหลือแค่บรรทัดเดียวเลย อย่างที่เราบอกว่า Walrus Operator มันจะทำการ Assign ค่า ในที่นี้มันจะเอา 10 ใส่เข้าไปใน a ในขณะเดียวกัน มันจะปล่อยเลข 10 ออกมาด้วย ซึ่งมันก็จะอยู่ในคำสั่ง print() สุดท้าย ทำให้เราได้ a เป็น 10 และนำเลข 10 ออกมาทางหน้าจอ เหมือนกับเป็นการรวม 2 บรรทัดที่เราทำก่อนหน้านี้เข้าด้วยกัน
เราว่าตัวอย่างเจ๋ง ๆ ของการใช้ Walrus Operator คือ ส่วนที่อยู่ใน Loop ทั้งหลาย ในตัวอย่างนี้ เราจะทำการเปิดไฟล์ขึ้นมาเพื่ออ่านทีละบรรทัด วนไปเรื่อย ๆ จนกว่าจะหมดไฟล์
sample_file = open('sample.txt', 'r')
inputs = []
line = sample_file.readline()
while line != '' :
inputs.append(line.rstrip())
line = sample_file.readline()
sample_file.close()
Code ด้านบน เป็นการอ่านไฟล์ทั่ว ๆ ไปเลย เราก็สร้าง List สำหรับการเก็บสิ่งที่อ่านมาได้ และใช้ While Loop มีเงื่อนไขว่า ถ้าบรรทัดที่เราอ่านเข้ามา มันไม่ได้เป็น String ว่างนั่นหมายถึง เมื่อเราอ่านจนสุดไฟล์แล้ว แล้วเราอ่านต่อ Python มันจะให้ออกมาเป็น String ว่าง ดังนั้น เราก็เช็คผ่านเงื่อนไขพวกนี้ได้เลย ภายใน Loop เราก็จะให้มันเอาสิ่งที่อ่านได้ ยัดลงไปใน List ที่เราสร้างไว้ ก็เป็นอันเรียบร้อย เราจะเห็นได้เลยว่า มันต้องใช้หลายบรรทัดเหมือนกันนะ ในการทำอะไรแค่นี้
sample_file = open('sample.txt', 'r')
inputs = []
while (line := sample_file.readline()) != '' :
input.append(line.rstrip())
sample_file.close()
ตัวนี้เราเปลี่ยนมาใช้ Walrus Operator เราจะเห็นได้เลยว่า Code มันหายไปเลย 2 บรรทัด และ อ่านแล้วน่าจะเข้าใจได้ง่ายขึ้นเยอะ จากเดิมที่ต้องมานั่งดูว่าอะไรนะ มันเป็น String ว่าง งง ไปหมด เราก็รวบมันมาอยู่บรรทัดเดียวไปเลยก็ทำให้เราอ่านได้ง่ายขึ้นเยอะมาก
ใน Document ของ Python เอง ก็มีตัวอย่างของตัว Python ที่ทำการเปลี่ยนมาใช้ Walrus Operator ด้วยเช่นกัน ลองไปดูได้ที่ Python Documentation
Walrus Operator เป็นเครื่องหมายใหม่ที่มาพร้อมกับ Python 3.8 ดูตอนแรกมันจะอิหยังวะมาก ๆ แต่พอได้ใช้ ๆ ไป มันก็เป็นเครื่องหมายที่ทำให้เราเขียน Script สั้นลงมาก ๆ อย่างไม่น่าเชื่อเลย สิ่งที่มันทำ มันเป็นการรวบ 2 ขั้นตอนเข้าด้วยกันคือ การ Assign ค่าตามการเป็นเครื่องหมายเท่ากับตามปกติ และ การ Return ค่าออกมา เพื่อนำไปใช้ต่อ อาจจะนำไปยัดใน Function ต่าง ๆ เพื่อให้เราสามารถ Assign ค่า และ ทำงานไปในบรรทัดเดียวกันเลยก็ได้
จากตอนที่แล้ว เราเล่าในเรื่องของการ Harden Security ของ SSH Service ของเราด้วยการปรับการตั้งค่าบางอย่างเพื่อลด Attack Surface ที่อาจจะเกิดขึ้นได้ หากใครยังไม่ได้อ่านก็ย้อนกลับไปอ่านกันก่อนเด้อ วันนี้เรามาเล่าวิธีการที่มัน Advance มากขึ้น อย่างการใช้ fail2ban...
SSH น่าจะเป็น Protocol ที่หลาย ๆ คนใช้ในการเข้าถึง Shell ของเครื่องปลายทาง สำหรับควบคุมการทำงานของเครื่องคอมพิวเตอร์ต่าง ๆ แต่มันไม่น่าจะดีเท่าไหร่ หาก SSH Server ไม่แข็งแกร่งมากเพียงพอ วันนี้เราจะมาแนะนำ 5 วิธีการที่จะช่วยลด Attack Surface ของ SSH Server ในเครื่องของเรากัน...
เราเป็นคนที่อ่านกับซื้อหนังสือเยอะมาก ปัญหานึงที่ประสบมาหลายรอบและน่าหงุดหงิดมาก ๆ คือ ซื้อหนังสือซ้ำเจ้าค่ะ ทำให้เราจะต้องมีระบบง่าย ๆ สักตัวในการจัดการ วันนี้เลยจะมาเล่าวิธีการที่เราใช้ Obsidian ในการจัดการหนังสือที่เรามีกัน...
หากเราเรียนลงลึกไปในภาษาใหม่ ๆ อย่าง Python และ Java โดยเฉพาะในเรื่องของการจัดการ Memory ว่าเขาใช้ Garbage Collection นะ ว่าแต่มันทำงานยังไง วันนี้เราจะมาเล่าให้อ่านกันว่า จริง ๆ แล้วมันทำงานอย่างไร และมันมีเคสใดที่อาจจะหลุดจนเราต้องเข้ามาจัดการเองบ้าง...