23.7.09

ตัวอย่างการใช้งาน ChartDirector (ตอนที่ 2)

     จากใน ตอนที่1 เราได้ทราบหลักการทำงานของ ChartDirector ไปแล้ว ขอสรุปให้ฟังอีกครั้งว่าการทำงานของ Chartdirector มันจะเริ่มจากตอนไหน ส่วนเพื่อนๆที่เพิ่งเปิดเข้ามา ยังไม่ทราบว่า ChartDirector ติดตั้งอย่างไร ขอให้กลับไปอ่านบทความ "มาสร้างกราฟให้ PHP ด้วย ChartDirector กันเหอะ" กันก่อนนะครับ  ส่วนตัว library ChartDirector ก็หาได้จากโฆษณาที่ขึ้นอยู่ตามเว็บนี้เลยนะครับ อันเดียวกัน ไม่ต้อง ไป search ไป  hack  ไป crack ที่ไหนหรอกครับ จัดหามาให้แล้ว

ขั้นตอนการทำงานคร่าวๆ
1. user ส่ง request เข้าไปหา web server โดยผ่านหน้าเว็บที่เราเขียน script PHP เอาไว้
2. Web server รับ request เข้ามาประมวลผล อาจจะทำการค้นหาข้อมูลที่ดาต้าเบส หรือ text file
3. PHP script ทำการสกัดข้อมูลออกมา เพื่อจัดข้อมูลก่อนส่งเข้าไปใน function ของ ChartDirector
4. ChartDirector ทำการส่ง output ออกมาเป็น image file สังเกตที่บรรทัดล่างสุดของตัวอย่าง ChartDirector
    header("Content-type: image/png");
    print($c->makeChart2(PNG));
5. Web server ทำการส่ง Respond กลับไปหา user ในรูปแบบ image

จริงๆแล้ว มันเหมือนกับเราเปิดดูรูป ตามเว็บที่เค้าทำ link ไว้ให้นั่นแหละ ต่างกันตรงที่ รูปที่เราเปิดนั่นมันสามารถเปลี่ยนแปลงได้ (dynamic) ตลอดเวลา ขึ้นอยู่กับเงื่อนไขที่ user ส่งเขาไปหา seerver ซึ่งทั้งหมดนี้  มันขึ้นอยู่กับการออกแบบและวาง algorithm ในการให้ script ทำงานตามที่เราต้องการ

ต่อไปเรามาลองสร้างตัวอย่างง่ายๆเพื่อให้เกิดความเข้าใจในการนำ ChartDirector ไปใช้งานกันดีกว่า โดยผมจะแยกการทำงานของ script PHP ออกเป็นสองฝั่ง แต่ script ทั้งหมดก็ยังอยู่บน server นะครับ อย่าสับสนนะครับ (เพราะ PHP เป็น server side script) โดยทั้งหมดวางไว้ตาม folder ที่ผมกำหนดไว้นะครับ แล้วก็เรียก http://localhost/simple/ เมื่อทุกอย่างถูกติดตั้งเรียบร้อยแล้ว

image

ก่อนอื่นขอแนะนำให้ไปสร้างข้อมูลไว้ในดาต้าเบสก่อนนะครับ แล้วจัดการเรื่องของ user/password ที่เอาไว้ connect กับดาต้าเบสให้เรียยบร้อย ให้เหมือนกับโค๊ดที่เขียนไว้ให้ดู ไม่งั้นมันจะรันไม่ออกนะครับ โดยเฉพาะ ถ้ามีการ error ใน file chart.php มันจะไม่โชว์ error ในบางครั้ง เพราะมันเป็นรูปภาพหน่ะครับ ให้ระวังตรงนี้ด้วย

โค๊ดในการสร้าง table สำหรับเก็บข้อมูล ผมเขียนนไว้ให้แล้ว เพื่อนๆสามารถนำไปวางไว้ที่ phpMyadmin ได้เลย หรือจะใช้ mysql front ก็ได้ ถนัดแบบไหนก็เลือกเลยนะครับ ในที่นี้ผมสร้างตาราง simple ไว้ในดาต้าเบส test ด้วย mysql front  ดูตามรูปประกอบนะครับ

image

โค๊ดการสร้างตาราง simple และใส่ข้อมูล

#
# Table structure for table 'simple'
#

CREATE TABLE IF NOT EXISTS simple (
  Xyear varchar(4) ,
  Xvalue int(6) unsigned DEFAULT '0'
);

#
# Dumping data for table 'simple'
#

INSERT INTO simple VALUES("1990", "1600");
INSERT INTO simple VALUES("1991", "1950");
INSERT INTO simple VALUES("1992", "850");
INSERT INTO simple VALUES("1993", "500");
INSERT INTO simple VALUES("1994", "800");
INSERT INTO simple VALUES("1995", "500");
INSERT INTO simple VALUES("1996", "450");
INSERT INTO simple VALUES("1997", "560");
INSERT INTO simple VALUES("1998", "630");
INSERT INTO simple VALUES("1999", "800");
INSERT INTO simple VALUES("2000", "1100");
INSERT INTO simple VALUES("2001", "1350");
INSERT INTO simple VALUES("2002", "1600");
INSERT INTO simple VALUES("2003", "1950");
INSERT INTO simple VALUES("2004", "2300");
INSERT INTO simple VALUES("2005", "2700");
INSERT INTO simple VALUES("2006", "630");
INSERT INTO simple VALUES("2007", "800");
INSERT INTO simple VALUES("2008", "1100");
INSERT INTO simple VALUES("2009", "1350");

ฝั่ง user
มีหน้าที่ในการส่ง request เข้าไป เราจะสร้าง หน้าเว็บขึ้นมา 1 หน้าเพื่อให้ user ส่ง request เข้ามา ในตัวอย่างนี้เราจะทำกันแบบง่ายๆนะครับ
ไฟล์ที่เกี่ยวข้องคือ index.php และ display.php มีโค๊ดดังต่อไปนี้

index.php :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Simple Bar Chart</TITLE>
</HEAD>

<BODY bgcolor="#CCFFFF">
<TABLE width="1003" border="1" cellspacing="0" cellpadding="0">
<TR>
    <TD height="100" align="center" bgcolor="#99CCFF">
    <FORM METHOD=GET ACTION='display.php' METHOD='GET' TARGET="FrameChart">
    <SELECT NAME="YEAR" width="200">
        <OPTION VALUE="1990">1990</OPTION>
        <OPTION VALUE="1991">1991</OPTION>
        <OPTION VALUE="1992">1992</OPTION>
        <OPTION VALUE="1993">1993</OPTION>
        <OPTION VALUE="1994">1994</OPTION>
        <OPTION VALUE="1995">1995</OPTION>
        <OPTION VALUE="1996">1996</OPTION>
        <OPTION VALUE="1997">1997</OPTION>
        <OPTION VALUE="1998">1998</OPTION>
        <OPTION VALUE="1999">1999</OPTION>
        <OPTION VALUE="2000">2000</OPTION>
        <OPTION VALUE="2001">2001</OPTION>
        <OPTION VALUE="2002">2002</OPTION>
        <OPTION VALUE="2003">2003</OPTION>
        <OPTION VALUE="2004">2004</OPTION>
        <OPTION VALUE="2005">2005</OPTION>
        <OPTION VALUE="2006">2006</OPTION>
        <OPTION VALUE="2007">2007</OPTION>
        <OPTION VALUE="2008">2008</OPTION>
        <OPTION VALUE="2009">2009</OPTION>
    </SELECT>
    &nbsp;&nbsp;&nbsp;<INPUT TYPE="submit" value="Click">
    </FORM>
    </TD>
</TR>
<TR>
    <TD height="400" bgcolor="#000099">
    <iframe id='FrameChart' name= 'FrameChart' width='100%' height='500' frameborder='0' src='display.php' scrolling='auto'></iframe>
    </TD>
</TR>
</TABLE>
</BODY>
</HTML>

display.php :

<?php

$year = $_GET['YEAR'];

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
</HEAD>

<BODY>
<TABLE width="100%">
<TR>
    <TD align="center">
        <IMG SRC="chart.php?YEAR=<?php echo $year;?>" BORDER="0">
    </TD>
</TR>
</TABLE>
</BODY>
</HTML>

ฝั่ง server รับ request จาก user แล้วไปค้นหาข้อมูลในดาต้าเบสแล้วทำการจัดข้อมูลส่งเข้าไปใน function ของ ChartDirector แล้วทำการวาดรูปส่งกลับมาให้ user (กลับมาที่หน้า display.php บริเวณที่เป็น iframe อีกครั้ง) ไฟล์ที่เกี่ยวข้องได้แก่ chart.php

chart.php :

<?php
require_once("../ChartDirector/lib/phpchartdir.php");

if(isset($_GET['YEAR'])){
    $year = $_GET['YEAR'];
}else{
    $year = date("Y");
}

$hostname = "localhost";
$user = "root";
$password = "merlin";
$dbname = "test";
mysql_connect($hostname,$user,$password) or die("Can't connect database ".mysql_error());
mysql_select_db($dbname) or die("Can't select database ".mysql_error());

$sql = " SELECT * FROM simple where Xyear <= '$year' order by Xyear asc limit 1,10 ";
$db_query=mysql_db_query($dbname,$sql);
$num_rows=mysql_num_rows($db_query);
for($i=0;$i<$num_rows;$i++){
    $row=mysql_fetch_array($db_query);
    $Ayear[] = $row['Xyear'];
    $Avalue[] = $row['Xvalue'];
}

# The data for the bar chart
$data = $Avalue;

# The labels for the bar chart
$labels = $Ayear;

# Create a XYChart object of size 600 x 380 pixels. Set background color to brushed
# silver, with a 2 pixel 3D border. Use rounded corners of 20 pixels radius.
$c = new XYChart(600, 380, brushedSilverColor(), Transparent, 2);

# Add a title to the chart using 18pts Times Bold Italic font. Set top/bottom margins
# to 8 pixels.
$textBoxObj = $c->addTitle("Annual Revenue for Star Tech", "timesbi.ttf", 18);
$textBoxObj->setMargin2(0, 0, 8, 8);

# Set the plotarea at (70, 55) and of size 460 x 280 pixels. Use transparent border
# and black grid lines. Use rounded frame with radius of 20 pixels.
$c->setPlotArea(70, 55, 460, 280, -1, -1, Transparent, 0x000000);
$c->setRoundedFrame(0xffffff, 20);

# Add a multi-color bar chart layer using the supplied data. Set cylinder bar shape.
$barLayerObj = $c->addBarLayer3($data);
$barLayerObj->setBarShape(CircleShape);

# Set the labels on the x axis.
$c->xAxis->setLabels($labels);

# Show the same scale on the left and right y-axes
$c->syncYAxis();

# Set the left y-axis and right y-axis title using 10pt Arial Bold font
$c->yAxis->setTitle("USD (millions)", "arialbd.ttf", 10);
$c->yAxis2->setTitle("USD (millions)", "arialbd.ttf", 10);

# Set y-axes to transparent
$c->yAxis->setColors(Transparent);
$c->yAxis2->setColors(Transparent);

# Disable ticks on the x-axis by setting the tick color to transparent
$c->xAxis->setTickColor(Transparent);

# Set the label styles of all axes to 8pt Arial Bold font
$c->xAxis->setLabelStyle("arialbd.ttf", 8);
$c->yAxis->setLabelStyle("arialbd.ttf", 8);
$c->yAxis2->setLabelStyle("arialbd.ttf", 8);

# Output the chart
header("Content-type: image/jpeg");
print($c->makeChart2(JPG));
?>

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

อ่านเพิ่มเติม...

17.7.09

ตัวอย่างการใช้งาน ChartDirector (ตอนที่ 1)

เห็นถามกันมามาก หลังจากที่บทความเรื่อง “ มาสร้างกราฟให้ PHP ด้วย ChartDirector กันเหอะ ” ก็เลยอดไม่ได้ที่จะไม่เขียนต่อ เพราะถามกันมาเยอะมาก เอาเป็นว่าเรามาดูวิธีการใช้งานจริงๆ (เพราะผมทำอยู่เป็นประจำ) ของ ChartDirector กันดีกว่า เอาแบบทีละขั้นตอน หมดไส้หมดพุงไปเลย แต่ต้องขอออกตัวไว้ก่อนนะครับ ผมไม่ได้เป็นโปรแกรมเมอร์แต่กำเนิด ฉะนั้นบางครั้งโค๊ดของผม มันจะดูถึกๆ ไปบ้าง แต่อย่าได้ไปมองสาระตรงนั้น ผมอยากให้มองแนวคิดการเขียนโปแกรม และการนำไปใช้งานมากกว่า ก็อย่างที่บอก เรามัน “โปรแกรมเมอร์(จำเป็น)” นี่ครับ  ถ้าใครยังไม่ได้ติดตั้ง ChartDirector ก็ให้กลับไปอ่านบทความ “ มาสร้างกราฟให้ PHP ด้วย ChartDirector กันเหอะ ” ก่อนนะครับ  ผมทดลองแล้วใช้ได้ ติดตั้งได้จริง ส่วนตัว library ของ ChartDirector ก็หาดาวน์โหลดได้จากแบนเนอร์ที่ขึ้นตามอยู่ในเว็บนี่แหละครับ ไม่ต้อง search หาเอาใหม่ เจ้าของบริษัทเค้ามาเอง รับรองของแท้ ไม่ต้อง crack ไม่ต้อง hack จัดไปอย่ามัวลังเล ให้เสียของ

เรามาเริ่มต้นด้วยแนวคิดที่ว่า ผมมีงานประจำที่จะต้องดึงข้อมูลจาก Oracle server จากของบริษัทตัวเอง ซึ่งเป็นดาต้าเบสหลัก ดาต้าเบสใหญ่ แล้วเข้ามาเก็บไว้ใน ดาต้าเบส Mysql แผนกของตัวเอง ซึ่งวันหลังผมจะมาอธิบาย การใช้ PHP ติดต่อกับ Oracle server โดยให้ PHP ทำงานแบบเป็น period ดึงข้อมูลมาเป็นระยะๆ ส่วนเจ้าของเว็บก็นั่งกระดิกนิ้วรอ  ผิวปากด้วยอย่าลืม อิอิอิ.

เผลอแพล๊บเดียว โม้อีกแหละ เอาเป็นว่า พอเราได้ข้อมูลจาก Oracle server แล้วมาเก็บใน MySQL server แล้ว (ในส่วนของการออกแบบฐานข้อมูลในการเก็บ ไม่ขออธิบายนะ) เราก็จะทำการดึงข้อมูลจาก Mysq ให้มาทำการแสดงผล ตาม condition ที่ user หรือผู้ใช้งาน ทำการกำหนดจากการคลิ๊กเลือกว่าจะให้แสดงข้อมูลจากวันไหน เลือกดูค่าใดบ้าง ค่าไหนไม่ต้องการ ซึ่งข้อกำหนดที่ได้จาก user นั้น เราจะเอาไปเป็นตัว select ข้อมูลจาก MySQL server โดยใช้ความรู้ด้านภาษา SQL (ภาษาที่เอาไว้ค้นหาข้อมูลในดาต้าเบส) เมื่อเราได้ข้อมูลจากการ query (ค้นหา)  แล้ว ซึ่งข้อมูลที่ได้มักจะมาในรูป array (ข้อมูลที่มีมิติ)  เราก็จะอาศัยการจัดและสกัดข้อมูลออกมาจะ for loop while loop  if elese  อะไรก็ตามแต่ แล้วจับยัดใส่ไปใน function  ของ  ChartDirector เพียงเท่านี้ เราก็จะได้รายงานที่เหนือชั้นบนหน้า web application (ปลายปี ก็รอเลื่อนตำแหน่งได้เลยครับ พี่น้อง ได้มาแล้ว 2 ขั้น)

อธิบายด้วยคำพูด อาจจะงง มาดูรูปภาพประกอบกันดีกว่า มีคนเค้าบอกว่า “รูปหนึ่งรูปอธิบายได้มากกว่าคำพูดล้านคำ” (อยากให้เป็นอย่างงั้นมั่งจัง แต่ google ไม่ชอบแน่ๆ)

database_structure รูปนี้ เป็นฐานข้อมูลที่ผมวางโครงสร้าง โดยอาศัยข้อมูลหลักจาก Oracle server แล้วเอาบางส่วนของข้อมูลที่ต้องการมาเก็บไว้ที่เครื่องตัวเองที่เป็น MySQL

ในส่วนของหน้า web application ซึ่งเป็นส่วนที่ต้องทำการโค๊ดโปรแกรม PHP script ลงไป เพื่อทำการดึงข้อมูลจาก MySQL server ตาม condition ที่ user เลือกจากหน้าเว็บ แล้วส่ง request เข้ามาที่ Appache server ของเราให้ทำการ query ข้อมูล ตามที่ user ต้องการอยากดู ตรงจุดนี้ เป็นการออกแบบหน้าตา web application ว่าจะให้ user สามารถเลือกอะไรได้มั่ง อะไรเลือกถูกบังคับให้เลือก ต้องอาศัยศิลปะ เข้ามาเกี่ยวข้อง เพราะเราต้องทำให้ user ใช้งานได้ง่าย ไม่เกิดความสับสน

imageรูปนี้แสดงให้เห็นกระบวนการในการสร้างรายงานที่เป็นกราฟ 

เดี๋ยววันนี้ขอจบกระบวนการสร้างไว้ก่อน คราวหน้ามาว่ากันต่อ เรื่องของโค๊ดล้วนๆ เหนื่อยแหละ แล้วก็ใกล้จะสอบแล้วด้วย ขอตัวไปอ่านหนังสือก่อนแล้วกันครับ

อ่านเพิ่มเติม...

5.7.09

วิธี Download จาก MEGAUPLOAD

วันนี้มีเทคนิคเล็กๆน้อย มานำเสนอสำหรับขาโหลดทั้งหลายแล สำหรับท่านที่ชอบดาวน์โหลดใน MEGAUPLOAD

สำหรับเทคนิคนี้นะครับ ต้องใช้ FireFox เจ้าหมาย่าง ตัวเก่งมาช่วยซะแล้ว จะว่าไปแล้วผมก็ค่อนข้างชอบ FireFox เพิ่มขึ้นทุกวัน เพราะอะไรหน่ะเหรอครับ เพราะเจ้า add-on ที่เค้าทำออกมาให้ใช้หน่ะสิครับ ไม่ว่าจะเป็นงาน web developer หรืองาน debugging เจ้า add-on ของ FireFox มีให้ใช้เพียบ ใครยังไม่เคย ก็ไปโหลดมาลองซะ เดี๋ยววันหลังผมจะมาพูดเรื่องการปรับแต่งเจ้า FireFox ให้แรงสุดขั้วด้วย รับรองว่าลืม IE ไปเลยหล่ะกัน

อันดับแรก ก็ไปโหลด FireFox มาก่อนเลย คลิ๊กซะสิ

ต่อมาก็ให้เข้าไปที่ http://addons.mozilla.org/firefox/59/ เพิ่มไปเพิ่ม add-on มาใส่ใน FireFox ของเรา หลังจากติดตั้งแล้ว ก็ให้ restart FireFox อีกครั้ง (ตามระเบียบ)

image

จากนั้นให้ไปตั้งค่าตามนี้ ที่เมนู Tool->User Agent Switcher->Options->Options 

image

Click User Agents->New แล้วเลือก New User Agent

image

จากนั้นให้เพิ่มค่า (เอาเฉพาะตัวหนา นะครับ)

+ Description: MEGAUPLOAD
+ User Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; FDM; MEGAUPLOAD 1.0

image

คงไม่ต้องบอกนะว่า ถ้าใส่ค่าเสร็จแล้ว ให้กด “ตกลง” ออกมาเลย

ต่อไป ถ้าต้องการดาวน์โหลดไฟล์ที่เค้าไปฝากไว้ที่ MEGAUPLOAD ก็ให้เลือกไปที่ Tools->User Agent Switcher->MEGAUPLOAD ได้เลย เพียงเท่านี้ เจ้า MEGAUPLOAD จะคิดว่า เครื่องคุณมี Alexa ซึ่งจริงๆแล้วเครื่องเราไม่มี เพียงแค่นี้ เราก็จะสามารถโหลดได้เรื่อยๆ ไม่จำกัด

อ่านเพิ่มเติม...

30.6.09

หัดคลาน Programming Algorithm

excel-vba-for-loop-do-while-loop-and-do-until-loop หลายๆคนที่เริ่มเขียนโปรแกรม แบบว่าเขียนตามหนังสือ หรือเขียนเพราะอยากเขียนเป็น จะเจอคำถาม คำถามหนึ่งที่บางครั้ง เราก็ลืมถามตัวเอง แล้วก็ไม่ได้หาคำตอบด้วยว่า เราจะวนลูปไปทำไม ทำไมต้องวนลูป for loop, while loop เอาไว้ทำไมหว่า !!!??? แล้วพวก if , else , else if มันเอาไว้ทำไมกัน ฉันจะใช้มันตอนไหนเนี่ย ???!!! เป็นคำถามที่เก็บเงียบสำหรับมือใหม่ ผมเองก็เคยเป็นเหมือน สมัยที่เริ่มเขียนโปรแกรมใหม่ๆ ยิ่งถ้าเป็นประเภทว่า อ่านตามหนังสือแล้วทำตามนะ แทบจะเลิกไปเลยหล่ะ มันแทบไม่ทำให้เราเข้าใจสักที ว่าเราต้องใช้พวกมันไปทำไม

วันนี้ผมจะมายกตัวอย่างให้เห็นกันแบบเป็นรูปธรรม เอาแบบว่ายกตัวอย่างในชีวิตประจำวันเรา กับขั้นตอนวิธีคิดการเขียนโปรแกรม (Algorithm) เพราะผมเห็นหลายๆคน เพื่อนๆหลายคนที่เรียนด้วยกัน เวลาเจอวิชาโปแกรมมิ่ง มักจะมาถามบ่อยๆว่าตรงนี้ทำได้งัย คิดยังงัย พอเราอธิบาย มันก็ทำหน้าเหมือนเข้าใจ แต่พอเวลาให้ไปimageเขียนเอง หรือต้องเขียนด้วยตัวเอง มักจะทำไม่ได้ เพราะว่าเค้ายังไม่เข้าใจว่า คอมพิวเตอร์มันคิดเองไม่เป็น ซึ่งบางคนอาจจะแย้งว่า computer AI ปัญญาประดิษฐ์ (Artificial Intelligence)  มันคิดเองเป็นนะ นั่นไม่ใช่มันคิดเป็นนะ เราสอนให้มันคิดต่างหากหล่ะ และพวกมันก็คิดได้เป็นเรื่องๆเท่านั้น หลายเรื่องพร้อมกัน ทำได้ยากมาก ถ้าทำได้ นั่นก็แปลว่าคนที่โปรแกรมให้มันเก่งกว่ามันต่างหาก 

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

 

"...... Algorithm : ขั้นตอนวิธี หรือ อัลกอริทึม (อังกฤษ: algorithm) หมายถึงกระบวนการแก้ปัญหาที่สามารถเข้าใจได้ มีลำดับหรือวิธีการในการแก้ไขปัญหาใดปัญหาหนึ่งอย่างเป็นขั้นเป็นตอนและชัดเจน เมื่อนำเข้าอะไร แล้วจะต้องได้ผลลัพธ์เช่นไร ซึ่งแตกต่างจากการแก้ปัญหาแบบสามัญสำนึก หรือฮิวริสติก (heuristic)

โดยทั่วไป ขั้นตอนวิธี จะประกอบด้วย วิธีการเป็นขั้นๆ และมีส่วนที่ต้องทำแบบวนซ้ำ (iterate) หรือ เวียนเกิด (recursive) โดยใช้ตรรกะ (logic) และ/หรือ ในการเปรียบเทียบ (comparison) ในขั้นตอนต่างๆ จนกระทั่งเสร็จสิ้นการทำงาน

ในการทำงานอย่างเดียวกัน เราอาจจะเลือกขั้นตอนวิธีที่ต่างกันเพื่อแก้ปัญหาได้ โดยที่ผลลัพธ์ที่ได้ในขั้นสุดท้ายจะออกมาเหมือนกันหรือไม่ก็ได้ และจะมีความแตกต่าง ที่จำนวนและชุดคำสั่งที่ใช้ต่างกันซึ่งส่งผลให้ เวลา (time) , และขนาดหน่วยความจำ (space) ที่ต้องการต่างกัน หรือเรียกได้อีกอย่างว่ามีความซับซ้อน (complexity) ต่างกัน

การนำขั้นตอนวิธีไปใช้ ไม่จำกัดเฉพาะการเขียนโปรแกรมคอมพิวเตอร์ แต่สามารถใช้กับปัญหาอื่น ๆ ได้เช่น การออกแบบวงจรไฟฟ้า, การทำงานเครื่องจักรกล, หรือแม้กระทั่งปัญหาในธรรมชาติ เช่น วิธีของสมองมนุษย์ในการคิดเลข หรือวิธีการขนอาหารของแมลง....."

ที่มา จากวิกิพีเดีย สารานุกรมเสรี

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

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

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

เห็นไหมหล่ะครับ ว่าขั้นตอน (Algorithm) มันประมาณนี้ แต่ถ้าเกิดมีคำถามเพิ่มขึ้นมาว่า คำว่า "Algorithm" มันอยู่บรรทัดไหนบ้าง เอาหล่ะสิ เพื่อนๆคิดว่าจะเพิ่มโค๊ดเข้าไปตอนไหน เพื่อนๆบางคนอาจจะคิดออกแล้ว ว่าจะต้องเพิ่มโค๊ดเข้าไปตรงไหน แต่สำหรับคนที่ยังคิดไม่ออก ไม่เป็นไรครับ ของอย่างงี้มันขึ้นอยู่กับการฝึกฝนครับ ฝึกมากๆ เก่งมากครับ

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

<?php
$handle = fopen("data.txt", "r");
$contents = '';
$ans = 0;
$lineNumber = 1;
while (!feof($handle)) {
    $contents = fgets($handle, 4096);
    $ans = $ans + substr_count($contents, "Algorithm");
    echo "บรรทัดที่ ".$lineNumber."  พบคำว่า Algorithm จำนวน   ".substr_count($contents, "Algorithm")."  คำ \n";
    $lineNumber++;
}
fclose($handle);
echo "\n";
echo "พบจำนวนคำว่า Algorithm ทั้งหมด ".$ans." คำ";
echo "\n";
?>

ผลลัพธ์ที่ได้จากการรัน PHP ผ่าน edit plus

image

อ่านเพิ่มเติม...

25.6.09

มาสร้างกราฟให้ PHP ด้วย ChartDirector กันเหอะ

          ในการสร้างรายงานบนเว็บ application นอกจากการใช้ php ดึงข้อมูลจากดาต้าเบส Mysql มาแสดงผลเป็นตารางโชว์บนหน้าเว็บแล้ว เรายังสามารถที่จะสร้างเป็นกราฟ ได้อีกด้วย โดยกราฟที่เราสร้างนั้น จะเป็นรูปภาพ (นามสกุล png) ซึ่งเราสามารถเปลี่ยนแปลงกราฟได้ ตามข้อมูลที่เราส่งให้มัน  บางคนอาจจะใช้ graphics module (GD library) ในการสร้าง image แบบ dynamic แต่วันนี้ ผมขอนำเสนอ library ตัวนึง ที่ผมใช้อยู่ประจำ นั่นก็คือ ChartDirector for PHP ซึ่งเป็นของบริษัท Advanced Software Engineering ตัว library ของ ChartDirector ก็หาดาวน์โหลดได้จากแบนเนอร์ที่ขึ้นตามอยู่ในเว็บนี่แหละครับ ไม่ต้อง search หาเอาใหม่ เจ้าของบริษัทเค้ามาเอง รับรองของแท้ ไม่ต้อง crack ไม่ต้อง hack จัดไปอย่ามัวลังเล ให้เสียของ

Bar-Chart_ChartDirector

ไม่ว่าจะเป็นกราฟเส้น กราฟแท่ง กราฟวงกลม หรือแม้กระทั่งเอามาผสมกันระหว่างกราฟแท่งและกราฟเส้น พี่แกก็ทำได้หมด นอกจากนี้ ยังมีลูกเล่นประเภท java script อีก เวลาเอาเม้าท์ไปชี้ แล้วขึ้นข้อมูลตัวเลข ตัวหนังสือ ก็ทำได้นะค่อนข้างสะดวกเลยทีเดียว (ลองนั่งเขียนเองสิ ตาตั้งเลยหล่ะ) นอกจากนี้ ยังมีกราฟที่ออกแนวEngineering ด้วยนะ ตัวอย่างเช่น surface chart, contour chart,  ดูๆไปแล้ว น้องๆ MATLAB เลยก็ว่าได้

Surface-Chart_ChartDirector 

มีลูกค้าดังหลายๆเจ้า ที่ใช้ ChartDirector ไม่ว่าจะเป็น Dell, SONY, IBM, Intel, Samsung, Philips, …etc  อีกมากมาย นั่นก็เป็นตัวที่การันตีได้ระดับนึงที่เราจะเลือกใช้ผลิตภัณท์ของ ChartDirector  ลืมบอกไปว่าตัวที่เราดาวน์โหลดมานี้ มันเป็นตัวทดลองใช้นะครับ ซึ่งเค้าให้ใช้ได้ฟรี แต่จะมีแบนเนอร์ของเค้าติดมาด้วยที่ด้านล่างของกราฟ แต่ผมมีเทคนิคเล็กๆน้อยๆ ในการปิดแบนเนอร์ของเค้า ซึ่งจะทำให้เราดูเหมือนใช้ตัวเต็มครับ

     ผมได้ทำการติดตั้ง ChartDirector ลงบน The AppServ Open Project - 2.5.6 for Windows  ซึ่งมี PHP Script Language Version 5.1.4 ติดมาด้วย

    หลังจากเพื่อนๆ ได้ทำการติดตั้ง The AppServ Open Project - 2.5.6 for Windows ลงบนเครื่องของตัวเองแล้ว ให้ทำการไปดาวน์โหลด ChartDirector for PHP  (ลิ้งค์ทางขวามือครับ) ในที่นี้ ผมเลือก ChartDirector for PHP - Software and CHM Doc (ดูตามภาพประกอบนะครับ) เพราะจะได้คู่มือที่เป็นไฟล์ CHM มาด้วย เปิดอ่านง่ายดี

ChartDirector-for-PHP

ทำการ ดาวน์โหลดไฟล์ โดยไปวางไว้ที่ C:\Appserv\www\  เลยครับ  ซึ่งหลังจากที่เราดาวน์โหลดเรียบร้อยแล้ว ให้เราทำการ unzip ไฟล์ออก โดยเลือกให้แยกไฟล์ลงที่นี่เลยครับ มันจะสร้างโฟล์เดอร์ “ChartDirector” ให้เรา ซึ่งชื่อโฟล์เดอร์นี้ แนะนำให้เป็นชื่อนี้นะครับ มันจะได้ตรงกับใน script ไฟล์ข้างในเวลาที่เรา include เข้ามาจะได้ไม่มีปัญหา

     ขั้นตอนนี้เป็นการที่เราจะต้องทำการ config ให้ PHP รุ้จัก library ของ  ChartDirector ซึ่งขั้นตอนก็ไม่ได้ยุ่งยากจนเกินไปนัก ให้เราทำการ copy ไฟล์นามสกุล dll จากโฟล์เดอร์ C:\AppServ\www\ChartDirector\lib โดยไฟล์ dll ที่เราจะ copy นั้น จะต้องสัมพันธ์กับเวอร์ชั่นของ PHP ซึ่งสามารถดูได้จากตารางข้างล่างนี้ครับ ในที่นี้ผมได้ชื่อไฟล์ “ phpchartdir510.dll “ เพราะผมใช้ PHP version 5.1.4  ซึ่งติดตั้งอยู่บนระบบปฏิบัติการ Windows วิธีการดู version ของ php นะครับ ให้เขียนโค๊ดข้างล่างนี้ แล้ว save เป็นไฟล์ info.php (หรือไฟล์อะไรก็ได้ ที่จำได้) วางไว้ที่ C:\Appserv\www\ นะครับ แล้วเรียกที่ web browser ดูจะเห็น versionของ php (จริงๆแล้ว น่าจะเห็นตั้งแต่เราเรียก http://localhost แล้วหล่ะ )

<?php

phpinfo();

?>

PHP_version5.1.4

ChartDirector_list_dll

เราก็ทำการ copy file “phpchartdir510.dll”,”Chartdir.dll”,”phpchartdir.php” ทั้ง 3ไฟล์นี้ ไปวางไว้ที่ C:\AppServ\php5\ext (ซึ่ง path ตรงนี้ จะต้องเหมือนกับที่ config ไว้ใน php.ini ครับ)

File_ChartDirector   เมื่อเรา copy ไปวางเรียบร้อยแล้ว ให้ทำการเปิดไฟล์ C:\windows\php.ini ขึ้นมาด้วย notepad หรือ editor ตัวไหนก็ได้ แล้วทำการเพิ่มบรรทัด ลงข้างล่างต่อจากบรรทัดที่รวมรายชื่อ extension ทั้งหมดหน่ะครับ

;extension=php_pdo_sqlite.dll
;extension=php_winbinder.dll
extension=phpchartdir510.dll

แต่อย่าลืมเอาเครื่องหมาย “;” ออกหน้าบรรทัดด้วยนะครับ เพราะไม่งั้นจะกลายเป็นการ comment บรรทัดนั้นไป ซึ่งจะไม่ทำให้เกิดอะไรขึ้น  เมื่อเราวางแล้วก็ให้ทำกา save ไฟล์แล้วปิดไฟล์นั้น หลังจากนั้น ก็ให้ทำการ restart apache หนึ่งครั้ง ถ้าไม่มีข้อความอะไรโชว์ error ก็แปลว่า เราสามารถติดตั้ง extension ใหม่ได้สำเร็จ

      จากนั้นให้ทดลองเปิด IE ขึ้นมา แล้วเรียกไปยัง http://localhost/ChartDirector/phpdemo/ เพื่อทดลองดูว่า มันสามารถเรียกใช้ ChartDiretor ได้ไหม แล้วก็ลองเรียกหน้า page demo ขึ้นมาสัก page นึง ถ้าปรากฏกราฟขึ้นมา ก็แปลว่าเราทำสำเร็จแล้ว ขั้นต่อไปก็แค่ ดูตัวอย่าง source code แล้วทำการ modify ตามตัวอย่างเลยครับ แค่นี้ หน้าweb application ที่เคยรายงานตัวเลขเป็นตาราง ก็จะสามารถรายงานเป็นกราฟได้ด้วยครับ ดูมีราคาขึ้นมาเยอะ

     เวลานำไปใช้งานนะครับ ตรงนี้เป็นเทคนิคของผมเองครับ ผมมักจะใช้ iframe เป็นตัวกำหนดตำแหน่งการวางรูป (ลืมบอกไปครับ เวลาที่เราแทรก script การสร้างกราฟ output ที่ได้จะเป็น image นะครับ ดูได้จาก header ไฟล์ของมัน )

<td  align='center'>

     <iframe marginheight=0 frameborder="0" marginwidth=0 scrolling=no src="graph/count_bar.php?DD=<?php echo $DATE?>" name="graph"
                style="position:relative; width:960px; height:200px; visibility: visible; z-index:1;">
                Iframes are not supported by this browser.
     </iframe>
</td>

แล้วผมก็ไปกำหนดค่า $c = new XYChart(980, 215,0xFFFFFF ,0xffffff,1); ให้มันมีขนาดใหญ่กว่า iframe ของผมเล็กน้อย เพียงเท่านี้ คุณก็จะได้กราฟที่ไม่มีแบนเนอร์มาแสดง เป็นงัยหล่ะครับ แจ่มไหม

Bar-Chart-Sample

วันนี้ก็ขอจบเพียงเท่านี้หล่ะกัน คราวหน้าเรื่อง “ตัวอย่างการใช้งาน ChartDirector (ตอนที่ 1)”

อ่านเพิ่มเติม...
 

เกี่ยวกับฉัน(ไหมเนี้ย)

รายการบล๊อกอื่นๆ

  • Solved: error: 'TKD2' was not declared in this scope, LIFA_Base compile error - วันนี้ จะมาเล่าถึงปัญหาที่เจอในการเบิร์นโค๊ด LIFA_Base ที่เราใช้ในการทำให้ Arduino ของเราสามารถรับคำสั่งจาก LabVIEW ได้ ปัญหานี้ เริ่มเกิดขึ้นตอนที่ Ard...
  • Type-Fu : Typing practice game online - หากใครที่สนใจ หรือจะต้องทำงานเกี่ยวกับคอมพิวเตอร์ หนึ่งในความจำเป็นก็คือ จะต้องเรียนรู้ที่พิมพ์สัมผัสได้ เพราะการที่พิมพ์สัมผ้สได้ มันได้ประโยชน์หลายๆ อย...

Blog อื่นๆ ที่น่าติดตาม

เหล่าบรรดา Blogger