Install lua php extension อย่างไร? by

26
Oct
0

เนื่องจากเกมผมมีการใช้งาน Lua ทั้งฝั่ง Unity (C#) และ php จึงต้องหาทาง install lua ที่ใช้ php รันให้ได้ ค่อนข้างวุ่นวายหลายอย่าง มั่วอยู่นาน ก็ได้ขั้นตอนมาดังนี้

  1. apt-get install lua5.2 – install ตัวรัน lua จริงๆ
  2. apt-get install liblua5.2 – install source code lua เพื่อช่วย compile lua php extension
  3. apt-get install php5-dev – install ตัว compile php extension ต่างๆ
  4. เข้า https://github.com/laruence/php-lua ไป download หรือ clone code php extension ตัวล่าสุดมาลงและแกะ zip ให้เรียบร้อย
  5. เข้า dir ที่แกะแล้วจากข้อ 4 แล้วรัน phpize
  6. ./configure –with-php-config=/usr/bin/php-config –with-lua=/usr –with-lua-version=5.2
    (ควรรัน which php-config เพิ่อ check path ของ php-config อีกทีเพื่อความชัวร์สำหรับ os ที่ลงอาจได้ path ไม่เหมือนกัน)
  7. nano /etc/php5/fpm/conf.d/lua.ini สร้างไฟล์ขึ้นมา (หรืออาจเป็น php.ini ก็ได้ในบาง os) แล้วพิมพ์ไปว่า extension=lua.so
  8. restart php5-fpm หรือ apache ตามแต่ web server ที่ Install ไว้
  9. ใช้งานได้เล้ย!

วิธีใช้งานก็ประมาณนี้


$lua = new Lua();
$lua->include($path);
$result = $lua->myFunction($param);

[Lua] การทำ เซ็ทแบบไม่เรียง จาก Table by

31
Jul
0

การทำ เซ็ทแบบไม่เรียง จาก Table นั้นทำมาเพื่อความประหยัดการประมวลผล ซึ่งโดยปกติแล้วถ้าเราใช้ Table เวลาเราจะดึงข้อมูลเราจะวน For จนกว่าจะเจอสิ่งที่เราต้องการแล้วค่อยดึง ทำให้ใช้การประมวลผลจำนวนมากกว่า การทำ Set ซึ่งจะเข้าถึง Index โดยตรง ซึ่งวิธีทำก็ไม่ยาก ใช้ 3 ฟังก์ชั่นด้านล่าง input ตัวแรกจะเป็น table ที่เราสร้างขึ้นมา ส่วนตัวที่สองก็เป็น key ที่เราจะใช้ในการเพิ่มลดหรือค้นหานั่นเอง

function addToSet(set, key)
set[key] = true
end
function removeFromSet(set, key)
set[key] = nil
end
function setContains(set, key)
return set[key] ~= nil
end

credits: http://stackoverflow.com/questions/2282444/how-to-check-if-a-table-contains-an-element-in-lua

วิธีการ Build ไฟล์ Lua ใน Windows (เพื่อเช็คบัคหรืออะไรก็แล้วแต่) by

31
May
0

หลังจากที่ใช้ภาษา Lua มาได้สักพักแล้วก็ยังหา Tools ในการเขียนโค้ดที่ดีที่สุดและสามารถ Build ได้นั้นไม่เจอ เลยต้องเขียนโค้ดใน Editor ทั่วๆไปแล้วค่อย Copy ไป Debug / Test ใน Web ที่สามารถ Run ได้เอา (เช่น repl.it Lua) ซึ่งก็ค่อนข้างลำบาก จนในที่สุดก็ได้ค้นพบวิธีที่ทำให้ Editor ของผม (Sublime) สามารถ Run/Build ได้แล้ววว ซึ่งวิธีการมีหลายวิธีจะมาบอกวิธีที่สะดวกที่สุดละกันนะครับผม

 

1. ดาวน์โหลดและติดตั้ง “Sublime”

เข้าไปโหลดได้ที่เว็ปหลักได้เลย sublimetext
ซึ่งถ้าเราติดตั้งเสร็จก็สามารถใช้แก้ไขไฟล์ Lua ได้เลยแต่ยัง Build ไม่ได้นะครับ

หน้าตาพื้นฐานของ Sublime

 

2. ติดตั้ง “Package Control”

ถัดมาเราต้องติดตั้ง Package Control ซึ่งตัวนี้จะทำให้ Sublime ได้รับพลังมากขึ้นครับ ซึ่งไอเจ้าตัวนี้มันจะสามารถทำให้เราค้นหา Package ดีๆ (หรือเรียกตามธรรมดาก็คือ Plug in นั่นเอง) ได้โดยไม่ต้องไปหาที่อื่น แค่ค้นหาจากตัว Package นี้เองได้เลยทันที วิธีลงมีสองวิธี คือ

  • ใช้ Console
    • เปิดเมนู View > Show Console ขึ้นมา จากนั้นคัดลอกด้านล่างนี้ไปใส่แล้ว Enter เพื่อรันครับ
      import urllib2,os,hashlib; h = 'eb2297e1a458f27d836c04bb0cbaf282' + 'd0e7a3098092775ccb37ca9d6b2e4b7d'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')
    • เมื่อรันเสร็จแล้วก็ทำการปิด Sublime แล้วเปิดใหม่ 1 ครั้งเป็นอันเสร็จครับ

      ลงด้วย Console

  • ลงใส่ในโฟลเดอร์ Package เอง
    • เปิดเมนู  Preferences > Browse Packages
    • โปรแกรมจะเปิดโฟลเดอร์ที่ไว้ใส่ Package ต่างๆมาให้
    • ดาวน์โหลด Package Control.sublime-package แล้วคัดลองโฟลเดอร์ไปใส่ในโฟลเดอร์ขั้นตอนก่อนหน้านี้
    • ทำการปิด Sublime แล้วเปิดใหม่ 1 ครั้งเป็นอันเสร็จครับ

เมื่อลงเสร็จแล้วจะมีเมนูดังรูป

 

3. ติดตั้ง และใช้งาน Package “Lua Dev”

ให้เรากดที่ Package Control ในรูปก่อนหน้านี้ หรือกด Ctrl+Shift+P แล้วพิมพ์ Package Control จากนั้นจะมีเมนูของ Package Control ขึ้นมาให้เลือก ให้เราเลือก Install Package จากนั้นพิมพ์ Lua เข้าไปแล้วเลือกกดที่ Lua Dev ครับ Package Control จะลง Lua Dev ให้ในทันที สบายสุดๆ

เลือก Lua Dev ดังรูป

จากนั้นเราต้องใช้งานมันก่อนโดยปกติโปรแกรมจะเห็น Syntax ของเราเป็น Lua ให้เราทำการเปลี่ยนเป็น Lua Dev เพื่อเพิ่มประสิทธิภาพครับ มีสองวิธีคือ

  • กดที Lua ขวาล่างของจอเราแล้วเลือก Lua Dev
  • เปิดเมนู เลือก View > Syntax แล้วเลือก Lua Dev

ถ้าสำเร็จทางขวาล่างจอเราจะกลายเป็น Lua Dev แทน Lua แล้วล่ะครับ

จุดแสดงถึงตัวอ่าน Syntax ที่เลือกใช้อยู่

ซึ่งมาถึงจุดนี้เจ้า Lua Dev จะพร้อมให้ทำการ Build แล้ว แต่ว่า! เรายังไม่มีตัว Build ซึ่งต้องทำการลงเพิ่มในขั้นถัดไปครับ

 

4. ดาวน์โหลดและติดตั้ง Lua Build

เข้าไปที่เว็ป luabinaries แล้วเลือกเวอร์ชั่นของ Lua ที่เราจะใช้ หรือดาวน์โหลดเวอร์ชั่นล่าสุดเลยได้ที่ลิงค์นี้ > Click

จากนั้นให้เราแกะ Zip ไว้ในที่ๆเราต้องการ ซึ่งจะมีไฟล์สำคัญสองตัวที่เราจะใช้คือ lua##.exe และ lua##.dll [## แทนเลขเวอร์ชั่นของเรา เช่น lua53]

ตัวอย่างโฟลเดอร์ Lua

เมื่อเราทำการแกะเสร็จแล้ว ทีนี้เราก็ต้องมาแก้ Config ของ Lua Dev ให้ทำการเรียกเจ้าตัวนี้ โดยการกลับไปที่ Sublime แล้วเปิดเมนูของ Package Control ขึ้นมา (วิธีตามข้อ 3) แต่ทีนี้ให้เราเลือก List Package แล้วเลือก Lua Dev

เลือก Package Lua Dev

จากนั้นโปรแกรมจะเปิดโฟลเดอร์ Package Lua Dev ขึ้นมา ให้เราทำการแก้ไขไฟล์ Lua.sublime-build ดังนี้

{
"cmd": ["lua53", "$file"],
"file_regex": "^(?:(?:\t)|(?:.+: ))(.+):([0-9]+): (.*)$",
"selector": "source.lua",
"path": "C:\\Program Files\\Sublime Text 2\\Lua"
}

ตรง cmd ให้ใส่ชื่อไฟล์ .exe ของเรา เช่น lua53 และตรง path ให้ใส่ path เต็มของโฟลเดอร์ที่เราลงไว้

 

5. Build ได้แล้ว รันดูได้เลย!!

รันโดยการ กด Ctrl+B หรือเปิดเมนูแล้วกด Tools > Build เท่านี้แหละครับผม

ปล. ถ้ามี Error สามารถดับเบิลคลิกเพื่อไปบรรทัดนั้นๆได้เลยด้วยนะครับ ซึ่งตัวรันบนเว็ปทำไม่ได้ล่ะเออ!

รันได้แล้ว ไร้บั๊ค ฟัคเย่!

credits : https://packagecontrol.io/installation#st2

[Lua] ฟังก์ชั่นรีเทิร์นหลายค่าและฟังก์ชั่นแบบรับค่าไม่ต้องครบตาม Arguments by

31
Mar
0

เนื่องจากเพิ่งมาเขียน Lua เดือนนี้ ก็มีโค้ดที่เกี่ยวกับฟังก์ชั่นที่ช่วยให้การทำงานสะดวกสบายขึ้นมานำเสนอฮะ

อันแรก ฟังก์ชั่นในลัวร์รีเทิร์น 2 ค่า อันนี้ไม่แน่ใจว่าภาษาไหนทำได้บ้างแต่จากที่เคยเขียนมาเพิ่งเจอในภาษานี้ครับ อเมซซิ่งมากๆ
local a,b = 1,2
function test2Params(x,y)
return x+1,y+2 --รีเทิร์นสองพารามิเตอร์
end
print('local a,b:'..a..','..b)
a,b = test2Params(a,b)
print('test2Params(a,b):'..a..','..b)

ถัดมาอันนี้เป็นวิธีอ้อม เนื่องจากเราไม่สามารถกำหนด Default Parameter ลงไปในการประกาศฟังก์ชั่นตรงๆ แบบ PHP/AS3 ได้ และยังไม่สามารถ Override ฟังก์ชั่นแบบ C# ได้ แต่สามารถรับไม่ครบมาเช็คค่าด้านในแบบนี้ดื้อๆได้เลยครับ
function testOptionalParams(x,y) -- รับสองตัวแปร
if (y == nil ) then -- ถ้าส่งมาแค่ x (y ไม่ส่งมา) ก็ให้ y เป็นสักค่า
y = 0;
end
return x+y
end
a = testOptionalParams(a)
print('testOptionalParams(a):'..a)
a = testOptionalParams(a,b)
print('testOptionalParams(a,b):'..a)

จากโค้ดทั้งสองชุดด้านบน รันแล้วจะได้ผลลัพธ์ดังนี้ครับ

local a,b:1,2
test2Params(a,b):2,4
testOptionalParams(a):2
testOptionalParams(a,b):6

Lua ใน Redis (redis script) by

31
Jul
0

วันหนึ่งผมได้ค้นพบความเทพของ 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 ตัวเป็นอย่างน้อยได้แก่

  1. ตัว lua script คำสั่งต่างๆ
  2. ตัวเลขบอกว่าจะมี key กี่ตัว (ใส่ 0 ได้หากไม่ต้องการส่ง key เลย)
  3. ตั้งแต่ตัวที่ 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

จบบทความวันนี้ครับ :)

 เราชนะรอบ 4 | ยืมเงิน 3000 ด่วน | แอพกู้เงิน | แอพเงินด่วน | สินเชื่อออนไลน์อนุมัติทันที | Site Map | กู้เงินก้อน | กระเป๋าตัง | thisshop และ ยืมเงินฉุกเฉิน 5000 ด่วน