Lua ใน Redis (redis script) by heha
Jul0
วันหนึ่งผมได้ค้นพบความเทพของ redis นั่นคือมันสามารถเขียน script เข้าไปในตัว redis เองได้ครับ โดยจะใช้ได้ตั้งแต่ Redis 2.6 ขึ้นไป ซึ่งตัวภาษาจะเป็น lua ถามว่าเขียนได้แล้วดียังไง? ก็คือเราสามารถสร้างคำสั่ง Redis อันสุดแสนประหลาดได้ด้วยตัวเองโดยไม่ต้องง้อให้ Redis ออก function ใหม่มาอีกต่อไป อยากได้อะไรก็เอา function ใน redis เดิมมาต้มยำทำแกงออกมาเป็นคำสั่งใหม่ได้ตามใจเล้ย!!
สำหรับการใช้งาน จะเรียกใช้ผ่าน eval ตัวอย่างเช่น
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
ตรงนี้จะมี parameter ที่ส่งเข้าไปสองแบบคือแบบ key และแบบ argument ซึ่งแบบ key (ในที่นี้คือ key1, key2) จะใช้สำหรับส่งชื่อ key ที่ต้องการจะทำงานด้วยเข้าไปโดยเฉพาะ ส่วน argument (first, second) คือค่าอื่นๆ ที่ต้องการส่งเข้า script ซึ่งส่วนมากมักจะเป็น value ที่ต้องการ set เข้าไป บางคนอาจจะสงสัยว่าทำไมต้องแยกเป็นสองประเภท? คนสร้าง redis บอกว่าเพื่อให้ตัว redis รู้ว่าอะไรเป็น key แล้วจะส่งไปให้ redis อีกตัวเวลาใช้งาน redis cluster (ที่ยังไม่ออกตัวเสถียร) ได้ ดังนั้นหากคุณไม่ได้วางแผนจะใช้งาน redis มากกว่า 1 process ก็อาจจะไม่ต้องสนใจในส่วนนี้ก็ได้
สำหรับ parameter จริงๆ มี 3 ตัวเป็นอย่างน้อยได้แก่
- ตัว lua script คำสั่งต่างๆ
- ตัวเลขบอกว่าจะมี key กี่ตัว (ใส่ 0 ได้หากไม่ต้องการส่ง key เลย)
- ตั้งแต่ตัวที่ 3 เป็นต้นไปจะเป็น keys ต่อด้วย argument (ARGV) เช่น ใส่เลขในข้อสองไปว่า 1 จะทำให้ parameter ตัวนี้คือ KEYS[1] ส่วน parameter ตัวที่ 4 คือ ARGV[1]
ตัวอย่างการใช้งานจริงเช่น
eval "return redis.call('set','mykey',ARGV[1])" 0 value
ตัวอย่างนี้แสดงการสั่งคำสั่ง set แบบบังคับว่า key ชื่อ mykey เท่านั้น ส่วน value ส่งจากนอก script เข้าไปทำงาน อาจเกิดข้อสงสัยอีกข้อว่าในเมื่อเราส่งคำสั่ง eval เป็นตัว script lua ตรงๆ ซึ่งเราสร้าง string ส่งเข้าไปเอง ทำไมยังต้องมี argument ส่งเข้าไปอีก? คำตอบคือ redis มีคำสั่ง evalSha ซึ่งเราสามารถเรียก script ที่ “cache” เอาไว้ได้ เพื่อประสิทธิภาพสูงสุดครับ (ใช้ SCRIPT LOAD ในการสั่ง cache ครั้งแรก)
สำหรับอีกตัวอย่างที่ใช้งานจริงได้ เช่นผมอยากสร้างคำสั่ง myhset ซึ่งคำสั่งนี้จะเช็คค่า key ที่ชื่อว่า serverStatus ว่าเป้น open อยู่หรือเปล่า ถ้า open ถึงจะอนุญาตให้เซ็ตได้ ไม่งั้น return redis error มาจะเขียนดังนี้
local serverStatus = redis.get('serverStatus')
if serverStatus == 'open' then
return redis.call('hset', ARGV[1], ARGV[2])
else
return redis.error_reply("serverIsClosed")
end
จบบทความวันนี้ครับ
เปลี่ยนสีวัตถุแบบเร่งด่วน [Ai] by Amp3r3
Jul0
หลายครั้งที่ต้องเสียเวลากับการเปลี่ยนสีวัตถุที่มีรายละเอียดเยอะ
มีวิธีง่ายๆที่จะเปลี่ยนสีวัตถุเหล่านั้นได้อย่างรวดเร็ว
ลองมาเปลี่ยนสีปลาตัวนี้กัน!!!
ขั้นแรกเรียกคำสั่ง Swatches ขึ้นมา
Selection ที่ตัวปลา แล้วคลิก New Color Group ที่อยู่ด้านล่าง Swatches
จากนั้นให้กด Edit or Apply Color Group
1.กด Edit เพื่่อเปลี่ยนสี
2.กด Unlink hanomy colors เพื่อปลดล็อกสี ทำให้เปลี่ยนสีได้สะดวกขึ้น
เมื่อเปลี่ยนสีจนพอใจแล้ว ไปคลิก New Color Group
Set สีใหม่ที่เราเพิ่งทำการเปลี่ยนไปก็จะถูกเพิ่มเข้าไปใน Swatches
วิธีการจัดการ ไฟล์ unit test by voratep
Jul0
ในการ เขียน งานขึ้นมาสักงานหนึ่ง ไม่มีทางที่จะเขียนทุกอย่างๆลง ไฟล์ๆ เดียวได้ ต้องมีการแยกหมวดหมู่ออกมาโดยในที่นึ้
เราใช้วิธีการ เขียนแบบ MVC
เพราะฉะนั้นตัวไฟล์ของ unit test นั้น ก็ควรที่จะแบ่งเขียนออกมาตาม class เพื่อให้ง่ายต่อการเรียกใช้งาน ดังรูป
แต่จะมีปัณหาเมื่อผู้ใช้ต้องการที่จะรันทุกไฟล์ เพื่อตรวจสอบการทำงานของโปรแกรมทั้งหมดจะให้รันทีละไฟล์ก็เหนื่อยไป เราสามารถแก้ปัณหานี้ได้โดย
เอาทุกไฟล์มารวมไว้อยู่ใน โฟว์เดอร์เดียวกัน ในที่นี้ ใช้ testall
และผู้ใช้ก็สามารถใช้ คำสั่ง mocha ชื่อโฟว์เดอร์ ที่ต้องการ ได้เลยครับ ไม่จำเป็นต้อง ทีละไฟล์ แล้วสะดวกไหมล่ะครับ ^^
[Technique] การทำเงาให้วัตถุด้วย Distort by Lord_Jack
Jul0
การทำเงาวัตถุด้วย Distort
นำภาพที่วาดเสร็จแล้วมาDuplicate layer เพิ่มแล้วนำlayer นั้นมา Free transform
แล้วคลิกขวา เลือก Distort เราก็จะสามารถดัดตัวละครหรือวัตถุนั้นๆได้ตาม จุดหรือมุมต่างๆ
ดัดให้เป็น perspective ที่เข้ากับพื้นที่ตัวละครหรือวัตถุนั้นอยู่ได้ตามตต้องการ
*กรณีนี้สามารถใช้ได้แค่พื้นที่เป็น plane เรียบ ถ้ามีความโค้งหรือขรุขระสามารถใช้ warp ช่วยได้อีกที
ดัดเสร็จก็เอา layer นั้นไว้ข้างหลังแล้วก็เปลี่ยนสีเป็นสีและopacity ของเงาตามที่ต้องการ จบแล้ว เจ๋งชะมัด