รวบรวมเรื่องเล่าเกี่ยวกับการเขียนโปรเกรมต่าง ๆ ในแต่ละภาษา ที่ได้เขียนในชีวิตประจำวัน
Python เป็นภาษาหนึ่งในการเขียนโปรแกรม ที่ผมว่าน่าจะครอบจักรวาลเลยก็ว่าได้
นอกจากจะเขียนง่ายแล้วยังทำได้เกือยทุกอย่าง อย่าตอนนี้ที่จะลองใช้กัน พอดีต้องเขียนโปรแกรม
เพื่อติดต่อกับ Serial Port หรือ Com Port นั่นเอง จริง ๆ อาจมีหลายภาษาที่ทำได้เหมือนกัน
แต่เราจะมาลองเขียนด้วย Python บน Windows กันครับ (จริง ๆ Linux ก็น่าจะได้เหมือนกัน)
โปรแกรมที่ต้องใช้
1. Python 2.5 เป็นตัวแปลภาษาของ python ครับ ดาวน์โหลดได้จาก http://www.python.org/download/ [2]
2. PyWin32 เป็น extension สำหรับการติดต่อบน Windows ดาวน์โหลดได้จาก http://sourceforge.net/projects/pywin32/ [3]
3. PySerial เป็น extension สำหรับติดต่อกับ Serial Port พระเอกของเราในครั้งนี้ครับ ดาวน์โหลดได้จาก http://sourceforge.net/projects/pyserial/ [4]
เมื่อ โหลดมาแล้ว เราก็มาลองทดสอบกัน โดยที่ http://pyserial.sourceforge.net/ [5] ก็มีตัวอย่างให้ครับ
#!C:/Python25/python.exe
import serial
ser = serial.Serial(0) # เปิดพอร์ต serial พอร์ต 0 หรือพอร์ตแรก
print ser.isOpen()
ser.close()
เมื่อลองรันดู ผมที่ได้คือ
>> True
หมายถึงพอร์ตเปิดแล้ว
ยังมีคำสั่งอื่น ๆ ให้ใช้อีกมากมายครับ เช่น
setRTS(level=1) #set RTS line to specified logic level
setDTR(level=1) #set DTR line to specified logic level
getCTS() #return the state of the CTS line
getDSR() #return the state of the DSR line
getRI() #return the state of the RI line
getCD() #return the state of the CD line
สำหรับผม ใช้คำสั่ง setRTS() เพื่อกำหนดให้วงจรปิดเปิดไปทำงาน ตอนนี้ถือว่าใช้ได้เลยทีเดียว ง่ายและรวดเร็ว
ส่วน Front-End ก็อาจจะใช้ PyGTK ก็ได้ครับ
หลาย ๆ คนอาจจะรู้จักแล้ว ว่า cURL คืออะไร แต่ส่วนตัว เพิ่งเคยใช้นี่ละ :P
cURL เป็น tool ที่ใช้สำหรับในการ transfer ข้อมูลของ protocol ต่าง ๆ อย่าง HTTP HTTPS FTP SSH เป็นต้น
ตัวอย่างการใช้งานที่ผมจะลองใช้คือ มีเว็บนึง ต้องการการ login ก่อน จากนั้นจะสามารถเข้าใช้งานฟังก์ชันต่าง ๆ ในเว็บได้
ผมจะลองใช้ cURL ในการเรียกใช้ครับ ตัว cURL จะทำหน้าที่คล้าย ๆ เป็น web browser หรือ client ที่ browse ไปยังหน้าต่าง ๆ ให้
สำหรับ หน้า aspx จะมี FIELD ที่ชื่อ __VIEWSTATE อยู่เป็น ID ประจำหน้า ซึ่งก็ไม่รู้เหมือนกันมันคืออะไร
เพราะไม่สันทัด แต่เอาเป็นว่า ต้องใส่ละกัน
<?php
// สร้าง cookie
$cookie_file_path = "/path/to/cookie.txt";
$LOGINURL = "http://www.example.com/login.aspx";
$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)";
// ทำการ login
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$LOGINURL);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
$result = curl_exec ($ch);
curl_close ($ch);
unset($ch);
// ค้นหา view state ปัจจุบัน
preg_match('/<input type="hidden" name="__VIEWSTATE" value="([^";]*?)"; \/>/', $result, $matches);
$viewstate = $matches[1];
$viewstate = urlencode($viewstate);
//ทำการเรียกใช้งานฟังก์ชั่นที่ต้องการ
$POSTURL = "http://www.example.com/main.aspx";
$reffer = "http://www.example.com/main.aspx";
$POSTFIELDS = "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=$viewstate&txtARG1=$arg1&txtARG2=$arg2";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$POSTURL);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$POSTFIELDS);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_REFERER, $reffer);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
$result = curl_exec ($ch);<br /><br />curl_close ($ch);
unset($ch);
echo $result;
// ค้นหา view state ปัจจุบัน
preg_match('/<input type="hidden"; name="__VIEWSTATE" value="([^"]*?)"; \/>/', $result, $matches)
$viewstate = $matches[1];
$viewstate = urlencode($viewstate);
//Log out
$LOGOFFURL = "http://www.example.com/logOff.aspx";
$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$LOGOFFURL);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path)
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
$result = curl_exec ($ch);
curl_close ($ch);
unset($ch);
?>
แค่นี้เราก็สามารถเรียก wrapper สำหรับ ใช้กับเว็บเราได้แล้วครับ :D
จริง ๆ แล้ว หลาย ๆ คนอาจจะได้ยินมาว่า python เป็นภาษา OO อีกภาษาหนึ่ง ซึ่งก็จริงครับ เพราะจะว่าไปแทบทุกภาษาเขียนแบบ OO ได้ แต่ python มีความ OO ที่เขียนได้สั้น เพราะเป็นภาษา script แบบนึง เราจะมาลองดูหน้าตากัน
ผลลัพธ์ :
>>> This is init your money = 1000 your money = 1500
อธิบายโปรแกรม :
เราสร้าง class ชื่อ MyBank ใน python มี constructor ได้เพียงอันเดียวครับ คือ __init__(self) ซึ่งจะยกตัวอย่างต่อไป ทุก method ต้องมี self เพื่อให้สามารถ access attribute หรือ instance ของ class ได้ self.money เป็น instance ของ class self ก็ คล้าย ๆ กับ this ในภาษาจาวาครับ สังเกตว่า print "your money = " + str(self.money) ต้อง ทำ type casting จาก integer ไปเป็น string ก่อน ซึ่งเราไม่จำเป็นต้องประกาศชนิดก่อน ซึ่งต่างจาก php ที่เราสามารถเปลี่ยน type ได้เลยครับ python มี constructor ได้เพียงอันเดียวครับ ซึ่งจะใช้อันล่างสุดที่ประกาศ
เมื่อสร้างobject ด้วย bank = MyBank() จะเกิด error
>>> Traceback (most recent call last): File "C:/Documents and Settings/S@ke [10].EN39/Desktop/myoo2.py", line 23, in ? bank = MyBank() TypeError: __init__() takes exactly 3 arguments (1 given)
ต้องสร้างด้วย bank = MyBank(1000,500) ซึ่งมี 2 argument + self เป็น 3 ครับ ผลลัพธ์:
>>> your money = 500
ใครมีข้อเสนอแนะนำมือใหม่อย่างผมก็ช่วยชี้แนะด้วยครับ
ไฟล์แนบ | ขนาด |
---|---|
![]() | 30.2 KB |
ปกติ เราสามารถเขียน Google map ได้ง่าย ๆ โดยใส่ไว้ในเว็บเรา
โดยที่ชุด Google Map API นั้น เป็น Java Script อยู่แล้ว เราจึงสามารถ include ได้
โดย link ไปยังเว็บที่ google กำหนด โดยเราต้องนำ URL ของหน้าเพจที่เราจะใช้
ลงทะเบียน โดยลงได้ที่ http://code.google.com/apis/maps/signup.html
ใส่ URL ลงไปก็จะได้ key สำหรับใช้งานต่อไปครับ
ตัวอย่างที่ยกมา เป็นของ IPStar ครับ ที่วงเขตบีมให้บริการไว้จากนั้นเราเริ่มทำการเขียน html ตามนี้ครับ
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>IPStar Coverage Region</title>
<script src="http://maps.google.com/maps?file=api&v=2&key=YourKey"
type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
var map = null;
var marker = null;
function load() {
if (GBrowserIsCompatible()) {
map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(10.833306, 103.75488), 5);
map.addControl(new GMapTypeControl());
map.addControl(new GLargeMapControl());
// Add KMZ overlay
var geoXml = new GGeoXml("http://sake.in.th/files/ipstar-th-beams.kml");
map.addOverlay(geoXml);
geocoder = new GClientGeocoder();
}
}
function showAddress(address) {
if (geocoder) {
geocoder.getLatLng(
address,
function(point) {
if (!point) {
alert(address + " not found");
} else {
map.setCenter(point, 9);
marker = new GMarker(point);
map.addOverlay(marker);
marker.openInfoWindowHtml(address);
}
}
);
}
}
//]]>
</script>
</head>
<body onload="load()" onunload="GUnload()">
<h3>IPStar Coverage Region</h3>
<p>Search for locations on the map below to find out is it in coverage region.</p>
<form action="#" onsubmit="showAddress(this.address.value); return false">
<p>
<input type="text" size="60" name="address" value="" />
<input type="submit" value="Find Location" />
</p>
</form>
<div id="map" style="width: 650px; height: 550px"></div>
</body>
</html>
หวังว่าจะอ่าน code พอเข้าใจนะครับตัวอย่างที่ได้ :
หลาย ๆ คนอาจจะทราบกันดีว่า Python สามารถรันบนมือถือได้ ซึ่งที่จริงก็มีหลายแพล็ตฟอร์มที่สนับสนุน
พอดีได้ ฤกษ์เปลี่ยนมือถือใหม่ เลยไปซื้อ Nokia 6630 ซึ่งเป็น Symbian Series 60 Feature Pack 2
เพราะ N Series ตอนนี้แพงเกิน 6630 มือ 2 ต่อเหลือ 5000 เพราะขี้เกียจไปเดินหาละ เลยเอาก้อเอา ดีที่ได้การ์ด 1GB
กับอุปกรณ์ครบ อืม ชักนอกเรื่องละ เอาเป็นว่าเรามาทดสอบกันดีกว่า
ขั้นแรกไปที่ http://wiki.opensource.nokia.com/projects/Installing_PyS60 [13] เลือกดาวน์โหลดรุ่นโทรศัพท์ที่ต้องการ
ซึ่งจะประกอบไปด้วย Library และตัว Python shell
สำหรับ 6630 จะโหลด PythonForS60_1_3_21_2ndEdFP2.SIS และ PythonScriptShell_1_3_21_2ndEdFP2.SIS
ทั้งนี้ทั้งนั้น ก็สามารถเข้าไปดูว่าโทรศัพท์คุณเป็นรุ่นไปนที่เว็บโนกียได้ครับ
จากนั้นติดตั้งโดยอาจใช้สาย USB Data Link หรือ Bluetooth ตามสะดวกครับ
เมื่อติดตั้งแล้ว จะปรากฏไอคอน Python ดังนี้
เมื่อเปิดโปรแกรมขึ้นมาจะพบกับ Python
จากนั้นสั่ง Run shell ขึ้นมา
เอาล่ะ พร้อมเขียนโปรแกรมแรก Hello World ตามระเบียบ
ตอนนี้ก็พร้อมที่จะพัฒนาโปรแกรมแล้ว
จริง ๆ แล้วมี Emulator และข้อมูลมากมาย เอาไว้ศึกษามากกว่านี้จะเอามาเขียนไว้ละกันครับ.
ตัวอย่าง Turorial :
http://www.mobilenin.com/pys60/menu.htm [14]
Python เป็นภาษาหนึ่ง ที่เป็น interactive script ซึ่งสามารถใช้งานได้หลากหลาย รวมทั้งการประมวลผลไฟล์ XML ด้วย
ซึ่งสามากทำได้ง่ายดาย โดยใช้ module PyXML
1. ติดตั้ง PyXML
อันดับแรกเราต้องติดตั้ง Python InterPretter ก่อนครับ สามารดาวน์โหลดได้จาก http://www.python.org/ [17] ซึ่งผมขอข้ามละกัน
เ มื่อติดตั้งแล้ว สำหรับ Windows อาจต้อง set path ให้เรียก python interpreter ใช้งานได้ ส่วน linux ใช้ apt-get install ก็รอใช้งานได้แล้วครับ
อันดับต่อมาก็โหลด PyXML ซึ่งเป็น module ที่ใช้ประมวลผล XML ครับ โหลด source ได้ที่
http://sourceforge.net/projects/pyxml/ [18]
จากนั้น unzip แล้วติดตั้ง โดยเรียกคำสั่ง
# python setup.py install
จากนั้นระบบจะทำการ install ให้
ซึ่งสำหรับ window บางครั้งอาจต้องติดตั้ง .NET SDK เพื่อ compile module ด้วย
ใช้แบบ binary จะสะดวกกว่า
สามารถทดสอบได้ โดยเข้าไปที่ interpreter ดังนี้
>>> import xml
>>> xml.__version__
'0.8.4'
ถือว่าใช้ได้ครับ
2. ลงมือเขียน parser
เมื่อลง python จะมี IDLE ซึ่งเป็น IDE ที่ติดตั้งมาให้เหมาะสำหรับการใช้งานพอสมควร เราจะใช้ IDE ตัวนี้เป้นหลักครับ
อันดับแรกสร้าง xml ไฟล์ที่จะตัดก่อน สมติชื่อ contents.xml
สำหรับที่จะทดสอบเขียน เราจะทดสอบโดยการใช้ DOM และ SAX ครับ
เลือก File >> New Window
จากนั้น save file เป็น .py
จากนั้นเลือก F5 สำหรับ รัน module
จริง ๆ แล้ว เราสามารถพิมพ์คำสั่งที่ละบรรทัดที่ interpreter เลยก็ได้ครับ แต่ผมชอบเขียนเป็นไฟล์มากกว่า เพราะแก้ไขสะดวก
ผลลัพธ์จะได้เอกสาร XML ข้างต้นออกมา
หากต้องการหา element ก็สามารถหาได้โดยคำสั่ง
ยังมีที่น่าสนใจอีกมากมาย สำหรับวันนี้ขอพอแค่นี้ก่อนครับ
::ข้อมูลเพิ่มเติม ::
http://pyxml.sourceforge.net/topics/howto/xml-howto.html [19]
http://www.xml.com/pub/a/2002/09/25/py.html [20]
วันนี้เขียนจาวาอยู่ เจอปัญหาภาษาไทยเหมือนเดิม อันนี้ก้อบมาคับ ใช้งานได้ดี เหอ ๆ
การเก็บภาษาไทยใน MySQL จะเก็บเป็น ASCII ครับดังนั้นจะต้องมี method ที่จะเปลี่ยนให้เ UNICODE ให้เป็นรหัส ASCII ก่อน insert อะครับ
public class ThaiUtil {
/** Creates a new instance of ThaiUtil */
public static String Unicode2ASCII(String unicode) {
StringBuffer ascii = new StringBuffer(unicode);
int code;
for(int i = 0; i < unicode.length(); i++) {
code = (int)unicode.charAt(i);
if ((0xE01<=code) && (code <= 0xE5B ))
ascii.setCharAt( i, (char)(code - 0xD60));
}
return ascii.toString();
}
public static String ASCII2Unicode(String ascii) {
StringBuffer unicode = new StringBuffer(ascii);
int code;
for(int i = 0; i < ascii.length(); i++) {
code = (int)ascii.charAt(i);
if ((0xA1 <= code) && (code <= 0xFB))
unicode.setCharAt( i, (char)(code + 0xD60));
}
return unicode.toString();
}
}
ข้อมูลจาก : http://www.narisa.com/forums/index.php?showtopic=2738 [23]
Links
[1] https://sake.in.th/tags/sitetags/programming
[2] http://www.python.org/download/
[3] http://sourceforge.net/projects/pywin32/
[4] http://sourceforge.net/projects/pyserial/
[5] http://pyserial.sourceforge.net/
[6] https://sake.in.th/category/sitetags/python
[7] https://sake.in.th/tags/sitetags/serial-port
[8] https://sake.in.th/category/sitetags/php
[9] https://sake.in.th/category/sitetags/curl
[10] mailto:S@ke
[11] https://sake.in.th/files/ipstar-th-beams.kml
[12] https://sake.in.th/category/sitetags/google-map-api
[13] http://wiki.opensource.nokia.com/projects/Installing_PyS60
[14] http://www.mobilenin.com/pys60/menu.htm
[15] https://sake.in.th/category/sitetags/mobile
[16] https://sake.in.th/category/sitetags/symbian
[17] http://www.python.org/
[18] http://sourceforge.net/projects/pyxml/
[19] http://pyxml.sourceforge.net/topics/howto/xml-howto.html
[20] http://www.xml.com/pub/a/2002/09/25/py.html
[21] https://sake.in.th/category/sitetags/xml
[22] https://sake.in.th/blogs/sake
[23] http://www.narisa.com/forums/index.php?showtopic=2738
[24] https://sake.in.th/category/sitetags/mysql
[25] https://sake.in.th/category/sitetags/java