วันเสาร์ที่ 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 ที่ใช้อยู่ มีโมดูลนี้ติดตั้งให้แล้ว ถึงตอนพัฒนาจะติดตั้งยากหน่อยก็เถอะ

วันอาทิตย์ที่ 24 พฤศจิกายน พ.ศ. 2556

Python กับ Package Management


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

การติดตั้งเองทุกขั้นตอน 

วิธีการลงมือเองทุกอย่าง ก็ไม่ยากถ้ามีความคุ้นเคยส่วนใหญ่ก็จะทำตามวิธีนี้
  1. ดาวน์โหลด Package ที่ต้องการใช้งานมาจากอินเตอร์เน็ต
  2. สั่งติดตั้งด้วยคำสั่ง python setup.py install จาก โฟลเดอร์ของ Package
วิธีการนี้ดีตรงที่ไม่ต้องใช้อะไรเพิ่มเติมยกเว้นโมดูล distutils ที่มากับไลบราลี่พื้นฐานของ Python อยู่แล้วส่วนข้อเสียก็อยู่ตรงที่ถ้าหาก Package นั้นต้องการโมดูล หรือ Package อื่น ๆ (dependencies) เพื่อติดตั้งคุณจะต้องไปไล่ติดตั้งโมดูล หรือ Package เหล่านั้นตามลำดับเอง และถ้าหากจะถอนการติดตั้งก็ต้องถอนเอง ซึ่งสำหรับมือใหม่ก็คงไม่ง่ายนัก

วิธีการ easy_install

เพื่อให้การติดตั้ง Package ง่ายขึ้นไม่ต้องทำเองทั้งหมดจึงมีเครื่องมือช่วยติดตั้งเกิดขึ้นมามีชื่อว่า Setuptools และ eays_install ตัว Setuptools เองก็เป็น Package นึงทำหน้าที่อ่านไฟล์เซ็ตอัพและตั้งค่าของ Package ที่ต้องการติดตั้ง (.egg) ส่วน easy_install ก็ทำหน้าที่ดาวน์โหลดและติดตั้ง Package พร้อมด้วยการติดตั้ง Package ที่เป็น dependencie ให้อัตโนมัติด้วย เวอร์ชั่นก่อน ๆ จะต้องติดตั้งผ่าน Package distribute สำหรับเวอร์ชั่นล่าสุดสามารถไปดาวน์โหลด ez_setup.py จาก https://pypi.python.org/pypi/setuptools แล้วสั่งรันเพื่อติดตั้งได้เลย จะได้ easy_install.exe อยู่ในโฟลเดอร์ของ Python ที่ติดตั้งไว้ในเครื่องเลย อย่าลืมเพิ่มโฟลเดอร์ที่ไฟล์อยู่ไปที่ path ของระบบด้วยเพื่อจะได้เรียกใช้ได้ง่าย ๆ ด้วยการเรียกใช้งานก็ง่ายมากสามารถสั่ง easy_install Package_Name ได้เลย

คำตอบสุดท้าย pip

เหนือกว่า easy_install ยังมี pip  เจ้า pip นี่จะทำหน้าที่ช่วยจัดการ Package ต่างได้อย่างง่ายขึ้นลองดูข้อดีของ pip กัน
  1. ดาวน์โหลดไฟล์ Package ที่จำเป็นทั้งหมดมาให้ก่อนติดตั้ง ป้องกันการติดตั้งไม่สำเร็จ
  2. ตรวจสอบ dependencies ของ Package ที่จะติดตั้งและติดตั้ง Package ที่ต้องการทั้งหมด
  3. แสดงข้อผิดพลาดที่เกิดขึ้นช่วยให้แก้ปัญหาการติดตั้งได้ง่ายขึ้น
  4. ช่วยเรื่องการถอนการติดตั้ง Package
การติดตั้ง pip
  1. ติดตั้ง Setuptools ก่อน
  2. ดาวน์โหลด get-pip.py 
  3. สั่งรัน python get-pip.py เพื่อติดตั้ง pip
การใช้งานก็สามารถใช้คำสั่ง pip install Package_Name ได้เลยไม่ยาก ของแบบนี้ต้องลอง แต่กว่าจะทำสำเร็จเองนี่ใช้เวลาเหมือนกันนะลองมาหลายอย่างตั้งแต่ลง distribute เลยลองไปลองมาก็ได้ใช้ pip ในที่สุด แต่การติดตั้งแบบตัวอย่างนี้จะมีข้อเสียสำหรับการพัฒนาอยู่ตรงที่วิธีการนี้เป็นการติดตั้งแบบ global ทำให้ถ้าการพัฒนางานหลายงานที่ใช้ Package เวอร์ชั่นไม่เท่ากันจะทำไม่ได้ ถ้าจะให้สะดวกจะต้องเพิ่ม Package อีตัวนึงคือ virtualenv เพื่อจัดการให้แต่ละงานแยกส่วน environment กันไปและแยก Package แต่ละเวอร์ชั่นออกจากกันจะสะดวกกับการพัฒนางานมากกว่า ถ้าหากท่านใดได้ลองอ่านบทความนี้แล้ว ดีหรือไม่ดีอย่างไรสามารถแสดงความเห็นได้นะ

การใช้ Constants, User Defined Data Type, และ Enumerations ในภาษา Python

เนื่องจากไม่ค่อยได้เขียนโปรแกรมเป็นเรื่องเป็นราวเท่าไหร่ พอได้เริ่มเขียนภาษา Python ก็เลยนึกถึงวิธีประกาศค่าต่าง ๆ จากที่เคยเขียนมา แต่สิ่งที่แตกต่างก็คือส่วนใหญ่ที่เขียนมาจะต้องมีการประกาศชนิดของข้อมูลที่จะจัดเก็บก่อนที่จะนำไปใช้เสมอ หรือที่เรียกว่า Static Type แต่พอมาคราวนี้สามารถใช้งานจัดเก็บข้อมูลได้ทันทีโดยไม่ต้องประกาศอะไรเลย หรือที่เรียกว่า Dynamic Type เรื่องข้อดีข้อเสียคงไม่ต้องกล่าวถึง เนื่องจากถึงจะอยากใช้ Static Type ไปก็ใช้ไม่ได้เนื่องจากตัวภาษา Python ไม่สนับสนุนนั่นเอง แต่อย่างไรก็ดี ด้วยความอยากใช้เลยต้องไปค้นหาวิธีที่จะใช้งานบางคุณสมบัตินั่นคือ Enumeration, Constant และ User-Defined Type เรามาเริ่มกันเลย

Enumeration

คุณสมบัตินี้มีใน Python เกือบจะดีใจละ แต่ว่าเริ่มมีในเวอร์ชั่น 3.4 ตาม PEP 435 ซึ่งไม่ใช่เวอร์ชั่นที่กำลังใช้อยู่ เฮ้อ....เศร้า แต่ยังไงก็ต้องเปลี่ยนไปใช้รุ่นใหม่อยู่ดี ตอนนี้ขอรอ Package หรือ Module ต่าง ๆ ที่มีสามารถทำงานได้บนรุ่น 3 เยอะ ๆ ก่อนค่อยย้ายไป แล้วถ้างั้นตอนนี้ทำยังไงดีล่ะ 

ตัวอย่างการใช้งาน Enumeration ในรุ่น 3.4
from enum import Enum
    Animal = Enum('Animal', 'ant bee cat dog')
หรือจะเขียนแบบข้างล่างนี้ก็ได้
class Animals(Enum):
    ant = 1
    bee = 2
    cat = 3
    dog = 4

ในเวอร์ชั่น 2.7 มี Python Package(PyPi) ที่ชื่อว่า enum ให้ใช้ แต่ว่าเหมือนทำงานได้เป็นแบบ Automatic Enumeration แต่ลองค้นไปเจอในเว็บ Stackoverflow มีคนถามเรื่องนี้อยู่เหมือนกันแถมมีทางออกให้ด้วย ... ง่ายเลยไม่ต้องคิด (เอ..... ดีหรือไม่ดีเนี่ย)
def enum(**enums):
    return type('Enum', (), enums)
การใช้งาน
Numbers = enum(ONE=1, TWO=2, THREE='three')
Numbers.ONE #ได้ค่าเป็น 1
Numbers.TWO # ได้ค่าเป็น 2
Numbers.THREE # ได้ค่าเป็น 'three'
ถ้าจะทำเป็น Automatic Enumeration ก็จะเป็น
# ใช่ * คือส่งค่าเป็น tuples ส่วนน ** เป็นการส่งค่าแบบ dictionary
def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    return type('Enum', (), enums)
การใช้งาน
Numbers = enum('ZERO', 'ONE', 'TWO')
Numbers.ZERO #ได้ค่า 0
Numbers.ONE #ได้ค่า 1
การแปลงจากค่าไปเป็นชื่อก็สามารถทำได้ดังนี้
def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    reverse = dict((value, key) for key, value in enums.iteritems())
    enums['reverse_mapping'] = reverse
    return type('Enum', (), enums)
เหมาะกับการนำชื่อ enum นั้นออกมาแสดงผลแต่อาจเกิดข้อผิดพลาด KeyError ถ้าค่าที่ให้หาไม่ได้ถูกแมพไว้กับชือ
Numbers.reverse_mapping['three'] #ได้ชื่อ 'THREE'
เมื่อลองดูแล้วก็ค่อนข้างงงกับความยืดหยุ่นของ Python อยู่เหมือนกันที่สามารถเขียนได้ทั้งรูปแบบ Functional และ Object แต่ได้ class ออกมาเหมือนกัน เอาเป็นว่าทำได้ละกัน

Constant

การประกาศค่าคงที่ก็ไม่สามาถทำได้ตรง ๆ ใน Python เช่นกัน แต่ถ้าต้องการใช้งานก็ยังสามารถประยุกต์ให้เราสามารถสร้างค่าคงที่ได้ในโปรแกรมโดยสร้างโมดูลดังนี้
#สร้าง constant.py ด้วยโค้ดต่อไปนี้
class _const:
    class ConstError(TypeError): pass
    def __setattr__(self, name, value):
        if self.__dict__.has key(name):
            raise self.ConstError, "Can't rebind const(%s)"%name
        self.__dict__[name]=value
import sys
sys.modules[__name]=_const()
จากโมดูลข้างต้นจะสามารถสร้างค่าคงที่ได้ดังนี้
#ในไฟล์ที่ต้องการใช้งานให้เรียกใช้โมดูลที่สร้างไว้ก่อนหน้า
import const
#ประกาศค่าคงที่โดยใช้คำสั่ง
const.magic = 23
#ถ้ามีการประกาศค่าซ้ำโปรแกรมจะขึ้น Error (const.ConstError) โดยลองประกาศค่าซ้ำ
const.magic = 88 

User-Defined Data Type 

เรื่องนี้ก็เช่นเดียวกับเรื่องก่อนหน้าคือ Pyhton ไม่มีให้ประกาศกันตรง ๆ ต้องใช้การเลี่ยงไปใช้ dictionary หรือใช้ class คล้ายกับข้างบน ถ้าหากใช้ dictionary ก็จะได้
Person = {'firstname':None, 'lastname':None}
การใช้งานทำได้โดย
Person['firstname']="firstname"
Person['lastname']="lastname"
ถ้าจะใช้้ class สำหรับปัญหานี้จะออกมาในรูปแบบ
class Person(object):
    firstname=None
    lastname=None
การใช้งานจะเป็นดังนี้
Person.firstname="firstname"
Person.lastname="lastname"
ก็ต้องขอขอบคุณแหล่งข้อมูลต่าง ๆ ที่ยกตัวอย่างมา เป็นประโยชน์อย่างมาก สำหรับบทความนี้ก็ขอจบไว้แต่เพียงเท่านี้

วันอาทิตย์ที่ 10 พฤศจิกายน พ.ศ. 2556

แหล่งเรียนรู้ python


การเรียนรู้ภาษาโปรแกรม Python นั้นสามารถบอกได้เลยว่าแหล่งข้อมูลในอินเตอร์เน็ตมีเยอะมากทั้งภาษาไทยและภาษาอังกฤษ แต่ของไทยจะเป็นแบบพื้นฐานซะมากตามลิ้งก์ด้านล่างเลย

ผลลัพธ์การค้นหาคำว่า "สอน Python" จากกูเกิล

หรือชอบแบบหนังสือเล่มแบบจับต้องได้ก็ต้องเล่มนี้เลย คู่มือเรียน เขียนโปรแกรม PYTHON (ภาคปฏิบัติ) ส่วนภาษาอังกฤษมีทั้งหนังสือและเว็บมากมายยิ่งกว่าภาษาไทยอีกลอง

ผลลัพธ์การค้นหาเว็บที่สอน Python จากกูเกิล

นอกจากการสอนในเว็บต่าง ๆ แล้ว คู่มืออย่างเป็นทางการของ Python เองก็เขียนออกมาได้ดี แต่การนำเสนออาจไม่ค่อยดึงดูดให้อ่่านเท่าไหร่ ดังนั้นขอใช้การอ่านคู่มือการสอนทั้งภาษาไทยและภาษาอังกฤษในเว็บจากผลการค้นหาไปพลาง ๆ ก่อนโดยไม่เขียนการเขียนโปรแกรมพื่นฐานซ้ำอีกรอบที่บล๊อคนี้ เพราะว่าวิธีการนำเสนอก็คงไม่มีอะไรแปลกใหม่ไปกว่าเดิมสำหรับเรื่องพื้นฐาน ไว้เจอเรื่องไหนที่น่าสนใจจะนำมาลงทีละหน่อยละกัน อีกนิ๊ดนึงสำหรับมือใหม่ ๆ ถ้ามี cheat sheet หรือ quick reference ติดตัวไว้เวลาเขียนโปรแกรมจะช่วยได้มากเลยมีตัวที่เห็นแล้วอ่านง่าย ๆ อยู่ 4 ตัวด้วยกันตามนี้เลย

http://rgruet.free.fr/#QuickRef
http://sleet.aos.wisc.edu/~gpetty/wp/wp-content/uploads/2011/10/Python_qr.pdf
http://www.cheatography.com/davechild/cheat-sheets/python/
http://cloud.github.com/downloads/tartley/python-regex-cheatsheet/cheatsheet.pdf

งั้นตอนนี้ขออนุญาตไปศึกษาเพิ่มเติมก่อนน๊ะ

วันเสาร์ที่ 2 พฤศจิกายน พ.ศ. 2556

เลือกภาษาโปรแกรมที่ถูกใจ แต่จะถูกกับงานหรือเปล่าไม่รู้


เมื่อกำหนดเงื่อนไขการเลือกภาษาโปรแกรมไว้แล้วว่าต้อง ฟรี, ใช้งานได้หลายแพลตฟอร์ม(Multi Platform), อ่านง่าย, มีเครื่องมือเยอะ, ผุ้ใช้เยอะ ทีนี้เลยต้องสำรวจก่อนว่าปัจจุบันนี้ภาษาไหนที่เค้านิยมใช้กัน ก็เลยลองถามอากู๋ดู ได้ผลเป็นเว็บจัดอันดับภาษาโปรแกรมมาเป็น TIOBE Index, Langpop.com ฯลฯ และพวกสังคมนักพัฒนา เช่น github, stack overflow ฯลฯ เท่าที่ดูภาษาที่อยุ่ในอันดับแรก ๆ ที่คัดมาคือ

  • C
  • C++
  • Java
  • C#
  • Objective-C
  • PHP
  • Python
  • Javascript
  • Shell
  • Ruby
  • Visual Basic
  • Perl
ลองดูตามเงื่อนไขแต่ละข้อเลยละกัน เรื่องแรกคือฟรี จากรายการทั้งหมดทุกภาษาามารถหามาใช้งานได้ฟรีทั้งหมดเลย ถัดมาก็เป็นเรื่องสามารถทำงานได้หลายแพลตฟอร์ม ขอยึดแพลตฟอร์มหลัก ๆ ก่อนละกันพวก Windows, Linux, Mac, Web, Mobile ตัวเลือกที่หายไปคือ PHP ที่ออกแบบมาให้เป้น Server Side Script เป็นหลัก กับ Javascript ที่เน้นเอามาทำเป็น web script ถึงแม้ว่าจะมี Framework หลายตัวที่สามารถพัฒนา Javascript ให้รันบน Mobile หรือ OS อื่น ๆ แต่ก็ยังใช้ฟังก์ชั่นได้ไม่เต็มที่เท่าไหร่ นอกนั้นสามารถใช้งานได้ข้ามแพลตฟอร์มได้อย่างเต็มทีเลย อ้อ อีกภาษานึงก็คือ Objective-C นี่ที่จริงก็สามารถใช้บน Windows หรือ Linux ได้เหมือนกัน แต่ติดตรงที่ว่าถ้าหากจะใช้พัฒนาอะไรที่เป้นมือถือของแอปเปิ้ลพวก iPhone, iPad พวกนี้จำเป้นต้องใช้ Framework ที่มีบน Mac OSX เท่านั้น ก็คงไม่เหมาะที่จะใช้ เนื่องจากไม่มีเครื่อง Mac นั่นเอง

ถัดมาคือภาษาอ่านเข้าใจง่าย ข้อนี้ตัดทิ้งไปเยอะเลย ถ้าหากเป็นโปรแกรมเมอร์ทั่วไปคงชินกับ syntax ภาษาตระกูล C แต่สำหรับมือใหม่ syntax ภาษาแนว ๆ C จะต้องเรียนรู้ใหม่เยอะเหมือนกัน หลือแค่ Python, Ruby, Visual Basic 

เครื่องมือที่ใช้ ถ้าเริ่มเขียนก็น่าจะเหมาะกับ Text Editor ดี ๆ ก็น่าจะพอให้เรียนรู้ได้ หรือจะใช้ทำงานได้อยู่แต่ถ้ามี IDE (Integrated Development Environment) ที่มีคุณสมบัติช่วยเหลือการเขียนโปรแกรมเยอะ ๆ อย่าง Visual Studio ของ Microsoft นี่ก็จะดีสุด ๆ  หลังจากลองค้นหาเครื่องมือถ้าเป็น Text Editor นี่ทุกภาษาก็สามารถใช้งานได้ดีในทุกเครื่องมือเลย แต่ถ้าเป็น IDE นี่ ถ้าเป็นภาษาแนว Scripting เช่น Python, Ruby, Perl ก็สามารถใช้ IDE ที่เขียนภาษาอื่นแล้วเพิ่ม Plug-ins เข้าไปเช่น Eclipse, Netbeans, Visual Studio ก็สามารถใช้งานได้เหมือนกัน สรุปข้อนี้คือในระยะแรกนี้คงใช้ Text Editor ไปก่อนละกัน


ผู้ใช้เยอะข้อนี้คงต้องดูตามชุมชนนักพัฒนาขอดูหลัก ๆ สักสองที่ก็พอ คือ Stack Overflow ข้อนี้เป็นการดูจาก Tag ของคำถามที่ถูกตั้งขึ้นมา


  1. c# : 53x,xxx
  2. java : 5xx,xxx
  3. javascript : 47x,xxx
  4. php : 46x,xxx
  5. c++ : 23x,xxx
  6. python : 23x,xxx
  7. objective-c : 15x,xxx
  8. ruby & ruby on rails : 22x,xxx
  9. c : 11x,xxx
  10. vb.net : 5x,xxx


Github สำหรับที่นี่ก็เป็นสถิติจาก repositories ที่มีการเคลื่อนไหวที่อาจเป็นตัวเลขที่ไม่ตรงนักแต่ก็พอจะประมาณเอาได้ในระดับนึง

  1. JavaScript : 264131
  2. Ruby : 218812
  3. Java : 157618
  4. PHP : 114384
  5. Python : 95002
  6. C++ : 78327
  7. C : 67706
  8. Objective-C : 36344
  9. C# : 32170
  10. Shell : 28561

ส่วนเรื่องตำแหน่งงานที่มีประกาศคงไม่ต้องดูมากเนื่องจากคงไม่ไปหาสมัครงานแนวนี้อยู่แล้ว

จากการตัดสินตามความต้องการข้อมูลที่ลองศึกษาเบื้องต้นก็พอจะได้ข้อมูลในระดับหนึ่ง เพื่อความง่ายในการเริ่มต้นศึกษา ถ้าหากชำนาญการเขียนโปรแกรมขึ้น ภาษาที่เว้นไว้ค่อยกลับมาศึกษาเพิ่มเติมอีกที เราต้องพุ่งเป้าหมายไปที่ความสำเร็จที่ทำได้ง่ายก่อน แบบว่าสร้างกำลังใจ ภาษาแรกที่ตัดออกก่อนเลย
คือ PHP เนื่องจากเขียนโปรแกรมแนว Client-Server สร้าง GUI หรือแม้แต่พัฒนาโปรแกรมบน Mobile ที่เป็นกระแสแรง ๆ อยู่ได้ไม่สะดวก ถึงจะสร้าง Backend บริการต่าง ๆ บน Serverได้ดีและมีผุ้ใช้เยอะก็เถอะ
ต่อมาก็ Javascript เหตุผลก็คือ syntax ยากไม่สะดวกสร้างโปรแกรมแนว Application ธรรมดา Framework ที่ใช้ก็แตกต่างกันมาก บางตัวก็เสียเงิน สองภาษาแรกนี่สุดท้ายก็ต้องกลับมาศึกษาเพิ่มอยู่ดีเนื่องจากเป็นภาษาที่ใช้เยอะสำหรับการทำงานบนเว็บ

ต่อไปก็ C, C++, C#, Objective-C, Java, Perl ที่ใช้รูปแบบการเขียนคล้าย ๆ กันที่อ่านเข้าใจยากขอติดไว้ก่อนเหมือนกัน สำหรับ Shell นี่เป็นภาษาที่ใช้กันบน Shell ของ Unix liked OS บน Windows ใช้ไม่ได้พัฒนาอะไรได้ไม่กว้างขวางนัก สุดท้ายก็เหลือ Visual Basic, Python, Ruby ก็ต้องขอตัด Visual Basic ออกเนื่องจากการพัฒนาโปรแกรมไม่กว้างขวางนัก ทำให้ไม่สะดวกเท่าไหร่  เหมาะกับการพัฒนาอะไรที่เป็นแพลตฟอร์ม Windows สุดท้ายก็เหลือ Ruby กับ Python ที่เหมาะจะเริ่มเรียนรู้

Ruby ก็เป็นภาษาที่ใช้พัฒนาระบบงานที่ใช้ประจำอยู่ แต่ดันเป็น Ruby on Rails นี่สิตัวภาษา Ruby เองก็ไม่ค่อยมีแหล่งความรู้มากนัก เลขที่ออกก็คงมาลงที่ Python (ที่จริงในใจคิดไว้ว่าคงเป็นภาษา Python แต่แรก) ที่ร่ายยาวมาก็เพื่อหาข้ออ้างสนับสนุนแค่นั้นเอง ฮ่า ฮ่า ฮ่า

วันพฤหัสบดีที่ 24 ตุลาคม พ.ศ. 2556

โพสแรก รื้อฟื้นการเขียนโปรแกรม


ก่อนอื่นก็ต้องขอสวัสดีผู้อ่าน ทั้งที่ตั้งใจเข้ามาอ่าน หรือหลงเข้ามาอ่าน นอกจากโพสนี้จะเป็นโพสแรกของบล็อกนี้แล้ว ยังอยากจะขอประกาศความตั้งใจของผู้เขียนด้วย ว่าต้องการจะนำเสนอเนื้อหา เกี่ยวกับทางด้านการเขียนโปรแกรม(แบบไม่ใช่อาชีพ) ผ่านประสบการณ์การเรียนรู้ของผู้เขียนเอง และอาจรวมไปถึง เนื้อหาอื่น ๆ เกี่ยวกับเทคโนโลยีครอบคลุมหลาย ๆ ด้านแต่อาจเน้นด้านไอทีมากหน่อย เนื่องจากว่าทรัพยากรทางด้านนี้จะมีเยอะกว่านั่นเอง และอีกอย่างนึงก็คือผู้เขียนพยายามจะเขียนให้ต่อเนื่องมากที่สุดเท่าที่จะทำได้

การเขียนโปรแกรมนั้นผู้เขียนเองก็มีโอกาสได้เรียนรู้มาพอสมควรแต่เนื่องจากงานที่ทำไม่ได้ใช้ ทำให้ความรู้ที่เรียนมาก็เริ่มถดถอย อาคมเสื่อม ตอนนี้ก็จะมีเขียนโปรแกรมแบบลงมือโค้ดโปรแกรมเองอยู่บ้างนิดหน่อยโดยใช้ภาษา Visual Basic for Application(VBA) ที่มากับโปรแกรม Microsoft Office เขียนสูตรในโปรแกรม Crystal Report ภาษา SQL สำหรับการดึงข้อมูลต่าง ๆ จากระบบฐานข้อมูล นอกจากนั้นก็เป็นการสื่อสารกับทางโปรแกรมเมอร์ถึงความต้องการรูปแบบที่ต้องการแล้วก็รอรับโปรแกรม พอดีได้อ่านข่าวเรื่องการส่งเสริมการเขียนโปรแกรมของทางเว็บ code.org จาก blognone ที่จริงก่อนหน้านี้ก็ได้ดูวีดีโอโปรโมทเว็บนี้ไปบ้าง ก็กำลังคิด ๆ อยู่เหมือนกันว่าจะเขียนโปรแกรมอีกดีไหมนะ ในที่สุดก็ตัดสินใจจะรื้อฟื้นศึกษาการเขียนโปรแกรมอีกครั้ง เนื่องจากโดยส่วนตัววางโครงการที่จะใช้ทักษะนี้ทำอะไรบางอย่างเร็ว ๆ นี้

ก่อนอื่นเลยต้องขอเลือกภาษาที่จะศึกษาก่อน เพราะเดี๋ยวนี้ภาษาโปรแกรมสามารถแตกไปหลายแขนงเหลือเกินถ้าดูฝั่งที่มีการติดต่อกับผู้ใช้ทั่วไปโดยตรงก็จะสามารถเขียนทั้งแบบ เดสก์ทอป เว็บ มือถือ แทปเล็ต ทีวี ฯลฯ ไม่ต้องนับถึงการเขียนโปรแกรมระบบลึก ๆ ยาก ๆ กลัวจะท้อหมดแรงไปซะก่อน เอาละงั้นตั้งคุณสมบัติที่ต้องการไปก่อน

  • ฟรี

ภาษาโปรแกรมส่วนมากที่มีในโลกนี้มักจะแจกฟรีอยู่แล้ว ดังนั้นไม่ต้องห่วงเรื่องตัวแปลภาษาเลย ยกเว้นตัวแปลภาษาบางอย่างแค่นั้นเองที่ค่อนข้างเฉพาะตัว เช่นตัวคอมไพล์เลอร์ภาษาซีของอินเทล หรือ ตัวแปลภาษาของแมทแล็บ (MATLAB) เป็นต้นที่ต้องเสียเงินซื้อ ส่วนเครื่องมือที่ใช้ในการพัฒนาก็ควรต้องฟรีด้วย โดยตัวเครื่องมือก็มีให้เลือกตั้งแต่โปรแกรมแก้ไขเทกซ์ไฟล์ แบบฟรีก็พวก Notepad, Notepad++, VIM, Emac, Komodo Edit หรือพวกที่ขายแต่ให้ทดลองใช้ฟรีก็ Sublime Text และยังมีพวกเสียเงินอีกแต่คงไม่พูดถึงเพราะเราต้องการของฟรี ถ้าต้องการพวกเครื่องมือช่วยเขียนแบบเยอะหน่อยก็ต้องเป็นพวก IDE (Integrated Development Environment) แบบฟรีก็มีแต่ส่วนใหญ่จะเสียเงิน

  • ใช้ได้หลายแพลตฟอร์ม

ไหน ๆ ก็เรียนรู้แล้วก็อยากให้ตัวโปรแกรมที่เขียนสามารถนำไปรันที่ระบบได้หลาย ๆ แบบทั้ง Windows (อันนี้เป็นหลักเลย), Linux, OSX หรือจะรันบนพวก Embedded Device ไปจนถึงเว็บ มือถือ ทีวี หรืออุปกรณ์อื่น ๆ อีกถ้าเป็นไปได้ เผื่อโปรแกรมที่พัฒนาขึ้นมาอาจจะตามผู้ใช้ไปทุกหน้าจอ ที่จริงต้องการให้เขียนโค้ดน้อยครั้งหน่อยถ้าเขียนบนจอนึงแล้วอยากเอาไปใช้บนจออื่นด้วยแบบแก้น้อย ๆ หน่อย

  • ภาษาเขียน/อ่านง่าย

ข้อนี้ก็สำคัญ เพราะว่าไม่ค่อยได้เขียนโปรแกรมมานานถ้ารูปแบบของภาษายากเกินก็จำไม่ค่อยได้ เคยเจอภาษาที่ใช้สัญลักษณ์เยอะ ๆ ทำเอาตาลายไปเหมือกนัน ดังนั้นถ้าเป็นภาษาที่ออกแบบมาให้เหมือนภาษาอังกฤษ(จะหวังให้มีภาษาไทยก็คงเกินไป) ก็จะช่วยให้เรียนรู้ได้เร็วขึ้น

  • มีเครื่องมือเยอะ

แน่นอนว่าพวกไลบราลีหรือเฟรมเวิร์กของภาษานั้นก็จำเป็นเพราะบางทีถ้ามัวแต่เขียนเองทุกอย่างรับรองได้ว่าไม่ไปไหนเลิกเขียนซะก่อน ยิ่งมีเยอะก็จะมีตัวเลือกเยอะ หาตัวที่เหมาะสมกับงานได้ดีที่สุด หรือถ้าเก่งไปอีกหน่อยอาจจะเขียนไลบราลีขึ้นมาเองก็ได้ (ท่าจะยาก)

  • มีผู้ใช้เยอะพอปรึกษาได้

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