วันเสาร์ที่ 14 ธันวาคม พ.ศ. 2556

Sikuli ทางเลือกของ AutoIT และ Auto Hotkey ในแบบของ Python


สำหรับสคริปต์สั่งให้เครื่องทำงานอัตโนมัติต้องยอมรับเลยว่า AutoIt กับ Auto Hotkey นั้นทำงานในหน้าที่ที่ถูกออกแบบมาได้ดีมาก ใช้งานได้สะดวกมาก ตัวภาษาที่ใช้สั่งงานก็ไม่ได้ยากมากไปนัก จะหาสคริปต์ในอินเตอร์เน็ตก็มีให้ดูเป้นตัวอย่างเยอะ แต่ว่าช่วงนี้กำลังเน้นเรื่องการเรียนรู้ Python จึงขอนำเสนอตัวโปรแกรมที่ใช้ภาษา Python เป็นภาษาสคริปต์ ฟังก์ชั่นการทำงานก็ทำได้ไม่น้อยหน้าโปรแกรมที่ยกตัวอย่างไป แต่จะแตกต่างที่วิธีคิด การออกแบบโปรแกรมที่แตกต่างกันไปคนละแนวเลยทีเดียวแต่ผลลัพธืการทำงานได้เหมือนกัน โปรแกรมที่ว่าคือ Sikuli

ความแตกต่างของ Sikuli กับโปรแกรมอื่นที่ชัดเจนที่สุดคือการทำงานหลักจะใช้วิธีการที่โปรแกรมตรวจจับภาพจากหน้าจอแล้วจึงสั่งการทำงานไปยังเครือ่งโดยผ่านการกดคีย์บอร์ดหรือกดเมาส์หรือจะใช้สคริปต์ภาษา Pyhon สั่งให้เครื่องทำงานอื่น ๆ ได้อีกมากมายเหมือนเรานั่งอยู่หน้าจอ ตัวโปรแกรมเริ่มพัฒนาจาก User Interface Design Group ที่ MIT ส่วนในปัจจุบันดูแลโดย Raimund Hocke หรือ Raiman

ข้อดีอีกอย่างของ Sikuli ก็คือทำงานได้หลายแพลตฟอร์มเนื่องจากทำงานบน Java ส่วนสคริปต์ที่ใช้ก็จะเป้น Python แต่เป็นการใช้ Jython (Python ที่ทำงานบน Java) ส่วนประกอบการทำงานก็จะมี 2 ส่วนด้วยกันคือส่วนที่ใช้รันสคริปต์กับส่วนที่ใช้พัฒนาสคริปต์ เป็นเครื่องมือแยกออกมาที่เรียกว่า SikuliX-IDE หรือจะใช้เครื่องมือพัฒนาที่คุ้นเคยตัวอื่นเช่น Eclipse หรือ Netbeans ก็ได้ ลองมาดูตัวอย่างกัน

การใช้ Sikuli เพื่อดาวน์โหลดไฟล์แบบคลิ๊กลิ้งก์อัตโนมัติ
(บางคนอาจจะคิดว่าใช้ iMacros ก็ได้แต่ตัวอย่างนี้ใช้ Sikuli)

ตัวอย่างนี้เป็นการเล่นเกมชู้ตบาสของกูเกิล
การใช้ควบคุมการทำงานของ Photoshop

หรือแม้แต่ใช้เล่นเกมจับคู่

ก็นับเป้นโปรแกรมที่น่าสนใจนำมาประยุกต์ใช้งานอัตโนมัติต่าง ๆ เป้นทางเลือกนอกจาก AutoIt, Auto Hotkey หรือแม้แต่ iMacros ยิ่งสำหรับการเขียน Python คงมีประโยชน์เพิ่มประสบการณ์การเขียนได้บ้าง


วันอังคารที่ 10 ธันวาคม พ.ศ. 2556

การใช้งาน MySQL

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

  1. MySQLdb การติดตั้งที่ MySQLdb ต้องติดตั้ง MySQL บนเครื่องที่พัฒนาด้วยเพื่อให้เรียกใช้ไลบราลีของ MySQL หรือต้องเรียกใช้ C API เพื่อเชื่อมต่อ
  2. Connector/Python เป็นโมดูลที่ทาง MySQL ทำออกมาเอง ไม่จำเป็นต้องติดตั้ง MySQL ในเครื่องที่พัฒนา เพราะเขียนด้วย Python ล้วน ๆ

การเรียกใช้งานจะคล้ายกันแต่จะต่างกันนิดหน่อย  ไม่ว่าจะใช้วิธีใดเชื่อมต่อสิ่งหนึ่งที่จะต้องพิจารณาคือ โปรแกรมที่พัฒนาขึ้นมานั้นจะนำไปใช้ที่ไหน ถ้าเป็นโปรแกรมที่เราติดตั้งในเครื่องที่เราควบคุมได้ทุกอย่างหรือบนเครื่องเซิร์ฟเวอร์แบบ VPS หรือ Decdicated Server จะใช้ตัวไหนก็ได้เพราะสามารถควบคุมสิทธิ์ต่าง ๆ ได้เต็มที่ แต่ถ้าจะนำไปใช้บนเครื่องเช่าแบบแชร์ (Shared Hosting) ก็ต้องอ่านรายละเอียดกันก่อนนะว่า มีโมดูลไหนเกี่ยวกับ Python ให้เราใช้ได้บ้างไม่งั้นมัวทำไป กลายเป็นพอจะเอาขึ้นกลับใช้ไม่ได้เนื่องจากติดตั้งบางโมดูลที่ต้องการไม่ได้จะหาว่าไม่เตือน โดยเฉพาะโฮสในไทยจะไม่ค่อยจะมี Python แต่ถ้าเป็นต่างประเทศมักจะมี Python มาให้ใช้

ตัวอย่างการเชื่อมต่อฐานข้อมูล MySQL ด้วย MySQLdb

#สำหรับ MySQLdb
import MySQLdb as mdb
import sys

try:
    con = mdb.connect('yourhost', 'yourusername', 'yourpassword', 'yourdb');
    cur = con.cursor()
    cur.execute("SELECT VERSION()")
    ver = cur.fetchone()
    print "Database version : %s " % ver
except mdb.Error, e:
    print "Error %d: %s" % (e.args[0],e.args[1])
    sys.exit(1)
finally:
    if con:
        con.close()

ตัวอย่างการเชื่อมต่อฐานข้อมูลด้วย Connector/Python
#สำหรับ Connector/Python
import mysql.connector
from mysql.connector import errorcode
try:
    con = mysql.connector.connect(host='yourhost',
                                user='youruser',
                                password='yourpassword',
                                database='yourdb')
    cur = con.cursor()
    cur.execute("SELECT VERSION()")
    ver = cur.fetchone()
    print "Database version : %s " % ver
except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("Something is wrong with your user name or password")
    elif err.errno == errorcode.ER_BAD_DB_ERROR:
        print("Database does not exists")
    else:
        print(err)
    else:
       con.close()
จะเห็นว่าการใช้งานก็จะคล้ายกัน ถ้าให้เลือกใช้เองตอนนี้คงต้องเลือก MySQLdb เพราะว่า shared host ที่ใช้อยู่ มีโมดูลนี้ติดตั้งให้แล้ว ถึงตอนพัฒนาจะติดตั้งยากหน่อยก็เถอะ