วันอาทิตย์ที่ 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 แต่แรก) ที่ร่ายยาวมาก็เพื่อหาข้ออ้างสนับสนุนแค่นั้นเอง ฮ่า ฮ่า ฮ่า