Published on Sake.in.th (https://sake.in.th)

หน้าแรก > หนังสือ > เรื่องเล่า - การเขียนโปรแกรม

เรื่องเล่า - การเขียนโปรแกรม

  • อ่าน 5821 ครั้ง
รวบรวมเรื่องเล่าเกี่ยวกับการเขียนโปรเกรมต่าง ๆ ในแต่ละภาษา ที่ได้เขียนในชีวิตประจำวัน
SiteTags: 
programming [1]

ติดต่อ Serial Port (ComPort) ง่าย ๆ ด้วย Python บน Windows

  • อ่าน 15921 ครั้ง

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 ก็ได้ครับ

 

 

SiteTags: 
programming [1]
Python [6]
Serial Port [7]

มาลองเขียน PHPCurl เรียกหน้า ASP แบบง่าย ๆ กัน

  • อ่าน 7757 ครั้ง

หลาย ๆ คนอาจจะรู้จักแล้ว ว่า 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=&amp;__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

SiteTags: 
programming [1]
PHP [8]
cURL [9]

วิธีเขียน Python แบบ Object Oriented

  • อ่าน 15506 ครั้ง

จริง ๆ แล้ว หลาย ๆ คนอาจจะได้ยินมาว่า python เป็นภาษา OO อีกภาษาหนึ่ง ซึ่งก็จริงครับ เพราะจะว่าไปแทบทุกภาษาเขียนแบบ OO ได้ แต่ python มีความ OO ที่เขียนได้สั้น เพราะเป็นภาษา script แบบนึง เราจะมาลองดูหน้าตากัน

  1. #/usr/bin/env python
  2. #สร้าง class ชื่อ MyBank
  3. #ระวังนิดนึงสำหรับมือใหม่ครับ python ใช้ tab ย่อหน้าเป็น token ในการเขียนโปรแกรมด้วย เพราะผมก็เจอ Error ตรงนี้ครับ
  4. class MyBank:# ย่อหน้าด้วย tab    
  5.  
  6.         def __init__(self):self.money = 0;  
  7.                 print "This is init"
  8.  
  9.         def deposit(self,money):
  10.                 self.money += money      
  11.                 print "your money = " + str(self.money)
  12.         def withdraw(self,money):
  13.                 self.money += money      
  14.                 print "your money = "+ str(self.money)
  15. #สร้าง Object ของ class Mybank
  16. bank = MyBank()
  17.  
  18. #เรียกใช้งาน
  19. bank.deposit(1000)
  20. bank.deposit(500)  

ผลลัพธ์ :

>>> 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 ได้เพียงอันเดียวครับ ซึ่งจะใช้อันล่างสุดที่ประกาศ

  1. #/usr/bin/env python
  2. class MyBank:
  3.         def __init__(self):
  4.                 print "This is init"
  5.  
  6.         def __init__(self,deposit,withdraw):
  7.                 money = 0;      
  8.                 money += deposit      
  9.                 money -= withdraw
  10.                 print "your money = " + str(money)
  11.                  

เมื่อสร้าง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

ใครมีข้อเสนอแนะนำมือใหม่อย่างผมก็ช่วยชี้แนะด้วยครับ

SiteTags: 
programming [1]
Python [6]

เขียน Google Map โดยใส่ไฟล์ kml จาก Google Earth

ไฟล์แนบขนาด
File ipstar-th-beams.kml [11]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&amp;v=2&amp;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 พอเข้าใจนะครับ

ตัวอย่างที่ได้ :

 


  • อ่าน 30167 ครั้ง
SiteTags: 
programming [1]
Google Map API [12]

เขียนโปรแกรม python บนมือถือด้วย PyS60

  • อ่าน 11629 ครั้ง

หลาย ๆ คนอาจจะทราบกันดีว่า 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 ดังนี้

pys60-1-screen001.gif

เมื่อเปิดโปรแกรมขึ้นมาจะพบกับ Python

pys60-1-screen002.gif

จากนั้นสั่ง Run shell ขึ้นมา

pys60-1-screen003.gif

pys60-1-screen004.gif

เอาล่ะ พร้อมเขียนโปรแกรมแรก Hello World ตามระเบียบ

pys60-1-screen005.gif

ตอนนี้ก็พร้อมที่จะพัฒนาโปรแกรมแล้ว
จริง ๆ แล้วมี Emulator และข้อมูลมากมาย เอาไว้ศึกษามากกว่านี้จะเอามาเขียนไว้ละกันครับ.

ตัวอย่าง Turorial :
http://www.mobilenin.com/pys60/menu.htm [14]

SiteTags: 
programming [1]
Mobile [15]
Python [6]
Symbian [16]

ประมวลผล XML ด้วย PyXML

  • อ่าน 7894 ครั้ง

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

  1.         <?xml version="1.0" encoding="tis-620"?>
  2.         <contents>
  3.         <title>นี่คือหัวเรื่อง</title>
  4.         <details>นี่คือรายละเอียดของ ไฟล์ xml</details>
  5.         </contents>

สำหรับที่จะทดสอบเขียน เราจะทดสอบโดยการใช้ DOM และ SAX ครับ
เลือก File >> New Window
จากนั้น save file เป็น .py

  1.         #!/usr/bin/env python
  2.         import os, sys
  3.         from xml.dom.ext.reader import Sax2
  4.         #เปิดไฟล์
  5.         f = open("contents.xml")
  6.         # สร้าง SAX Reader สำหรับอ่าน xml แล้วสร้างเป็น DOM tree
  7.         reader = Sax2.Reader()
  8.         # parse XML document
  9.         doc = reader.fromStream(f)
  10.         # ปิดไฟล์
  11.         f.close()
  12.         # พิมพ์ document ออกแบบจัดหน้าให้สวยงาม
  13.         PrettyPrint(doc)

จากนั้นเลือก F5 สำหรับ รัน module
จริง ๆ แล้ว เราสามารถพิมพ์คำสั่งที่ละบรรทัดที่ interpreter เลยก็ได้ครับ แต่ผมชอบเขียนเป็นไฟล์มากกว่า เพราะแก้ไขสะดวก
ผลลัพธ์จะได้เอกสาร XML ข้างต้นออกมา
หากต้องการหา element ก็สามารถหาได้โดยคำสั่ง

  1.         #หา element ชื่อว่า title
  2.         title_elem = doc.documentElement.getElementsByTagName("title")[0]
  3.         #เรียกดู data ใน element
  4.         title_string = title_elem.firstChild.data
  5.         #พิมพ์ออก
  6.         print(title_string)

ยังมีที่น่าสนใจอีกมากมาย สำหรับวันนี้ขอพอแค่นี้ก่อนครับ
::ข้อมูลเพิ่มเติม ::
http://pyxml.sourceforge.net/topics/howto/xml-howto.html [19]
http://www.xml.com/pub/a/2002/09/25/py.html [20]

SiteTags: 
programming [1]
Python [6]
XML [21]

การเก็บภาษาไทยใน MySQL โดยใช้ Java

  • บล็อกของ sake [22]
  • อ่าน 9447 ครั้ง

วันนี้เขียนจาวาอยู่ เจอปัญหาภาษาไทยเหมือนเดิม อันนี้ก้อบมาคับ ใช้งานได้ดี เหอ ๆ

การเก็บภาษาไทยใน 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]

Tags: 
programming [1]
Mysql [24]
Java [25]

Source URL (modified on 2008-02-16 06:03): https://sake.in.th/node/13

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