วันอาทิตย์ที่ 26 มิถุนายน พ.ศ. 2559

JavaScript Pattern : Constructor Pattern



จากตอนที่แล้ว ยังไม่ได้เขียนเรื่องของ JavaScript DataStructure ต่อเลยครับ ขอมาเขียนเรื่อง Pattern สลับกันไปก่อน

เรื่องแรกวันนี้เป็นเรื่อง Constructor Pattern ครับ ขออธิบายสั้นๆคร่าวๆให้รู้ Concept พอนะครับ ละเอียดกว่านั้นขอไม่พูดถึงก่อน

ใน Object-Oriented Programming Language แบบดั้งเดิมเลยนั้นจะมี Constructor เป็น Special Method ที่จะถูกใช้ในการ Initial Value ต่างๆให้กับ Object หรือ Instance ที่จะถูกสร้างขึ้นมาจาก Class แม่ (ถูก Allocated ลงไปที่ Memory) ใน JavaScript ก็เช่นกันครับ เพราะเกือบทุกอย่างเป็น Object และคนส่วนใหญ่ก็จะให้ความสนใจกับ Constructor ของ Object กัน โดยเราสามารถสร้าง Object ได้ 3 รูปแบบดังนี้

var newObject = {};
var newObject = Object.create(Object.prototype);
var newObject = new Object();


เราลองมาดู Basic Constructor แบบแรกกันครับ


จากโค้ดด้านบนนั้น toString() จะถูก redefined ใหม่ทุกครั้งที่สร้าง Object ตัวใหม่ขึ้น
จึงต้องปรับมาใช้ Pattern นี้ครับคือ Constructor with Prototype ตามรูปด้านล่าง


Function เกือบจะทั้งหมดใน JavaScript นั้นจะมี Object อยู่ตัวนึงครับ คือ "Prototype" object เมื่อเราเรียก JavaScript Constructor เพื่อจะสร้าง Object ใหม่นั้น Properties ทุกอย่างของ Prototype ของ Constructor จะติดไปที่ new Object ด้วย

วันจันทร์ที่ 29 กุมภาพันธ์ พ.ศ. 2559

JavaScript DataStructure & Algorithms : List ADT


ช่วงนี้กระแส Javascript ของปี 2016 มาแรงมากมาย คงจะมีหลายคนที่อยากจะฝึกเขียน Javascript แต่เริ่มต้นไม่ถูก จะฝึกเขียนโปรแกรม ก็ไม่รู้จะเริ่มฝึกจากเขียนอะไร ไม่รู้จะตั้งโจทย์อะไร หรือเขียนไปแล้วไม่รู้จะเอาไปใช้ประโยชน์อะไร นึกภาพไม่ออก

เอางี้ครับ คือการที่เราจะเขียนโปรแกรมภาษาใดภาษาหนึ่งได้อย่างลึกซึ้ง เราต้องรู้จัก Data Structure ของแต่ล่ะภาษากันก่อน และเรียนรู้การเขียน Algorithm ในภาษานั้นๆด้วย เพราะแต่ล่ะภาษาจะมีลักษณะเฉพาะของมันเอง ซึ่งเราควรจะเขียนให้คล่อง โดยใช้ Algoritm นี่แหละครับเป็นโจทย์ของเรา

วันนี้ฝากตัวอย่าง Class List ไว้ก่อน (มันเป็น Class แบบสมมตินะครับ ของจริงต้อง ECMAScript6)  เดี๋ยวจะมาอธิบายอีกทีว่ามันคืออะไร ทำงานยังไง
(ไม่ได้เขียนเรื่อง Javascript ไว้แต่แรก บังเอิญจะทำเป็นข้อมูลเก็บเอาไว้พอดี ไหนๆก็ไหนๆ เอามาลง Blog ซ่ะเลย ฮ่าๆๆ)

วันพุธที่ 12 ตุลาคม พ.ศ. 2554

Google Maps Markers with Ajax & JQuery ตอนที่ 1

การกำหนดจุด Markers บนแผนที่ Google Maps นั้นหากเราเขียนโดยกำหนดจุดเป็นพอยต์ๆไป โค๊ดมันก็จะดูเยอะมากๆ แล้วถ้าเราเก็บข้อมูลของ Markers ไว้ใน database เวลาเราจะกำหนด Markers นั้นๆลงใน Google Maps เราก็จะต้องให้ server ส่งข้อมูลมาเก็บไว้ที่ฝั่ง client เสียก่อน แล้วลองคิดดูว่าถ้าข้อมูลของ Markers ใน Database มีหลาย categories และมีขนาดใหญ่มากๆ เราก็จะต้องโหลดข้อมูลทั้งหมดลงใน Database ซึ่งเป็นการส่งข้อมูลที่เยอะมากๆ ผมก็เลยทำให้การกำหนดจุด Markers นั้นเป็นแบบ Ajax แทนแบบปกติทั่วไป เพื่อลดการส่งข้อมูลทีละเยอะๆ โดยใช้การส่งข้อมูลในรูปแบบ XML ที่ return ค่ามาจาก server (ในที่นี้ผมใช้ php เป็นภาษาฝั่ง server side) โดยใน database นั้นจะเก็บข้อมูลชื่อของ Point และ Point ต่างๆ แล้วใช้ php เจนโค๊ด (XML Code Generator) ออกมาเป็น XML โดย XML ของผมมีรูปแบบที่ผมกำหนดไว้แบบนี้คับ

markers
  marker id="..."
    name .... /name
    latlng .... /latlng
  /marker
/markers

ส่วนใน php code ผมก็จะมีวิธีการส่งข้อมูลออกมาดังนี้คับ

วันจันทร์ที่ 26 กันยายน พ.ศ. 2554

Socket

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

InetAddress

ใน java.net package มีคลาส InetAddress สำหรับเก็บแสดง IP address ซึ่่งใช้ได้กับทั้ง TCP และ UDP protocols โดยปกติใน instance ของคลาส InetAddress จะมีข้อมูลเกี่ยวกับ IP address และอาจจะมี domain name ของ IP address นั้นด้วยก็ได้ ขึ้นกับว่า instance นั้นถูกสร้างขึ้นโดยมี domain name กำหนดให้หรือไม่ การที่ Java ใช้ InetAddress แทน IP address ในการอ้างอิงถึงเครื่องๆหนึ่ง ก็เพื่อให้โปรแกรมไม่ขึ้นกับ IP address ให้สามารถรองรับจำนวนเครื่องคอมพิวเตอร์ที่เพิ่มมากขึ้น เมื่อถึงเวลานั้นคลาส InetAddress จะถูกเปลี่ยนแปลงให้สนับสนุนมาตรฐานใหม่นั้น โดยที่โปรแกรมของเราไม่ต้องถูกเปลี่ยนแปลง

ในคลาส InetAddress นั้นไม่มี public constructor แต่มี public static factory methods สำหรับสร้าง instance ของคลาส เช่น
public static InetAddress getLocalHost() throws UnkhowHostException;
ซึ่งจะให้ InetAddress ของเครื่องที่ทำงาน หลังจากนั้นอาจจะใช้

public String getHostName();
public String getHostAddress();

Tomcat Http Server and Servlet Container

ปกติแล้ว servlet จะต้องทำงานอยู่ภายใต้ servlet container แต่เวลาเราจะเรียกใช้งาน มักจะเรียนผ่าน http server ดังนั้น servlet container จึงต้องทำงานร่วมกับ http servers โดยที่ http server จะรับ requests มาจาก client ก่อน หากตรวจสอบแล้วเป็นการ request ไปที่ servlet แล้ว server ก็จะส่ง request ต่อไปที่ servlet containner ที่ทำงาน servlet นั้นๆ

โดยทั่วไป servlet containers แบ่งออกเป็น 2 ประเภท ตามความสัมพันธ์กับ http server คือ
1. Standalone Servlet Container เป็น Servlet Container ที่ติดมากับ http server นั้นเลย
2. Add-on Servlet Container เป็นโปรแกรม Servlet Container ที่เราสามารถ plug-in กับ http server ที่ไม่มี servlet container โดยตรง เช่น Tomcat servlet container

ตอนที่ servlets ถูกพัฒนาขึ้นเป็นรุ่น 1.0 นั้น http server ส่วนใหญ่ยังไม่มี servlet container จึงยังไม่สามารถทำงาน servlet ได้ ดังนั้น Sun microsystem จึงต้องสร้าง Java Web Server ออกมาเป็นแม่แบบของ http server ที่มี servlet container แบบ standalone ให้นักพัฒนาโปรแกรมใช้สร้างและทดสอบ servlet รวมท้้งเป็น http server ที่ใช้งานได้จริงด้วย และต่อมาได้พัฒนาโดยโครงการ Jakarta-Tomcat ได้พัฒนา Tomcat ซึ่งเป็น servlet container แม่แบบสำหรับ servlet รุ่น 2.0

วันพุธที่ 22 มิถุนายน พ.ศ. 2554

Derivation

การพิสูจน์ว่า "ประโยคใดๆเป็นสมาชิกของไวยากรณ์ภาษา G หรือไม่" ใช้หลักการของการกระจายโปรดักชั่น เพื่อผลิตประโยคที่ต้องการตรวจสอบ ซึ่งมีรายละเอียดดังนี้
  1. นำสัญลักษณ์เริ่มต้น(start symbol) S เป็นจุดเริ่มต้นของการกระจายวากยสัมพันธ์ และกำหนดให้สายสัญลักษณ์บนตัวขวามือของโปรดักชั่น S เป็น "สายอักขระก่อกำเนิด" (สายอักขระก่อกำเนิด อาจประกอบด้วย Terminal Symbol หรือ Non-Terminal Symbol)
  2. ดำเนินกิจกรรมกระจายสายอักขระก่อกำเนิด โดยการเลือกโปรดักชั่น A-->aBb ที่สอดคล้องกับสัญลักษณ์ไม่สิ้นสุด A บนสายอักขระก่อกำเนิด เพื่อนำตัวประกอบขวามือของโปรดักชั่นมาแทนที่สัญลักษณ์ A บนสายอักขระก่อกำเนิด
  3. ดำเนินกิจกรรมกระจายสายอักขระจนกระทั่งไม่สามารถนำโปรดักชั่นใดมากระจายสายอักขระได้อีก จากนั้นตรวจสอบว่า สายอักขระที่ถูกผลิดตรงกับประโยคที่นำมาตรวจสอบหรือไม่

Java Thread

Thread เป็นการทำงานพร้อมกันหลายๆงาน เพื่อประมวลผลพร้อมกันได้ ซึ่งในภาษาจาวานั้น จะมี method พิเศษทีชื่อว่า run ในการกำหนดการทำงานของ thread ถ้าเรานำ thread ไปใช้กับโปรแกรมด้าน network ก็จะใช้ในการประมวลผลของ server ที่มีเครื่อง client หลายๆเครื่องพร้อมกัน เมื่อเราเรียกใช้ method run แล้วมันก็จะแยกการทำงานแบบอัตโนมัติ ซึ่งในการเรียกใช้งาน method run นั้นจะต้องเรียกใช้โดย method start และในการใช้งาน thread นั้นจะต้องมีการเรียกใช้ method sleep เพื่อหยุด thread บางตัวเพื่อไม่ให้ทำงานที่ขัดแย้งกัน
public class ThreadShowName extends Thread{
public static void main(String args[]){
ThreadShowName thread1,thread2;
thread1 = new ThreadShowName();
thread2 = new ThreadShowName();
thread1.start();
thread2.start();
}
public void run(){
int pause;
for(int i=0;i<10;i++){
try{
System.out.println(getName()+" being executed.");
pause = (int)(Math.random()*3000);
sleep(pause); //0-3 seconds
}
catch(InterruptedException interruptEx){
System.out.println(interruptEx);
}
}
}
}

วันอาทิตย์ที่ 19 มิถุนายน พ.ศ. 2554

The Lexical Analysis Driver (Scanner)

For lexical analysis , we can consider  the input  source program as a long sequence of characters with two pointers:  a current pointer and a lookahead pointer.

1

When lexical analysis begins to find the next token, current and lookahead both point to the same character:

2

In the algorithm , four actions will be performed on these pointers:

1.GetChar : Moves the lookahead pointer ahead one character and returns.

1

2.Retract : Moves the lookahead pointer back one character.

3

4

3.Accept : Moves the current pointer ahead to the lookahead pointer.

5

4.Return : Returns a token consisting of a class and value , as well as performs any actions associated with that state , e.g., installing an identifier into the name table.

The driver program scans the input program and consults the entry at Table[State,InputChar] for the new state. The entry at Table[State,InputChar] consists of a new state and perhaps an action to be performed before moving to the new state:

Algorithm : Driver for Lexical Analysis

WHILE there is more input

     InputChar := GetChar

     State := Table[0,InputChar]

     WHILE State <> Blank

          InputChar := GetChar

          State := Table[State,InputChar]

     ENDWHILE

     Retract

     Accept

     Return token = (Class,Value)

ENDWHILE

In the algorithm for the lexical analysis driver , retract is neccessary when a token is found because the algorithm will have scanned one character too far.

วันอังคารที่ 14 มิถุนายน พ.ศ. 2554

CWM?

CWM คือตัวอักษรย่อมาจาก Clock Work Mod โดยสำหรับท่านที่กำลังจะเริ่มเล่น CWR สิ่งที่ต้องมีในเครื่องท่านก็คือ MAGLDR 1.13 ในเครื่องก่อน และอีกอันนึงที่สำคัญสำหรับการอัพรอมคือ CWR Partition Size แล้วเราจะรู้ได้ยังไงว่า รอมที่เราจะลงใช้ Partition Size เท่าไหร่ ก็ดูตามนี้เลย หลักๆมันมี 3 แบบ (ยกเว้นแต่บางอันคนทำรอมจะกำหนดเป็นแบบอื่นซึ่งเค้าจะต้องบอกไว้)

  1. Partition Size 150 MB เหมาะสำหรับพวก Base Rom ทั้งหลาย เช่น CyanogenMod , AOSP และ MIUI
  2. Partition Size 250 MB เหมาะสำหรับพวก Standard SENSE Rom ทั้งหลาย เช่น Rom ที่ได้มาจาก HTC Desire หรือ Evo
  3. Partition Size 400 MB เหมาะสำหรับพวก Rom ขนาดใหญ่ เช่น Rom ที่ได้มาจากรุ่น Desire HD รวมถึงรอมที่ต้องการ data2sd

ส่วนวิธีการติดตั้งก็คือ

  1. โหลด Partition Size ที่ต้องการจะติดตั้งมา
  2. แตกไฟล์ไว้ในเครื่องและเข้า USB Flasher ใน MAGLDR 1.13 เอาไว้
  3. รัน DAF.exe แล้วทำตามขั้นตอน
  4. หาโหลด rom ที่ต้องการแบบ zip มาแล้วโยนลง SD
  5. หลังจากติดตั้งเสร็จเครื่องจะรีบูทใหม่,กดปุ่ม Power ค้างไว้ และเลือก AD Recovery จากหน้าเมนู
  6. Recovery ก็จะโหลดขึ้นมาแล้วหล่ะ
*Credit PDAMobiz.com

วันศุกร์ที่ 29 เมษายน พ.ศ. 2554

Function สำหรับการกำหนดค่าเบื้องต้นใน OpenGL

ก่อนที่เราจะเริ่มเขียนโปรแกรมที่จะต้องใช้งาน OpenGL นั้นจะต้องกำหนดค่าเริ่มต้นให้กับมันก่อนคับ เช่นการกำหนดสีของ Background ของwindow ซึ่งค่า default จะเป็นสีดำหรือการกำหนดขนาดของจุดที่ต้องการจะplotลงไปต่างๆนั้นจะมีการกำหนดค่าเริ่มต้นเอาไว้ใน function ซึ่งในที่นี้ผมจะใช้ init() และจะมีคำสั่งที่อาจจะมีใน function ต่างๆดังนี้คับ

  • glClearColor()  เพื่อกำหนดสี Background ของ window
  • glPointSize() เพื่อกำหนดขนาดของจุด
  • glLineWidth() เพื่อกำหนดขนาดความหนาของเส้น
  • glColor3f() ใช้กำหนดสีของ object ซึ่งเราอาจจะกำหนดไว้ใน myDisplay() ก็ได้
  • glMatrixMode(GL_PROJECTION) เพื่อกำหนดพารามิเตอร์สำหรับการมองภาพโดยใช้งานร่วมกับ glOrtho()
  • gluOrtho2D() หรือ glOrtho() เพื่อฉายภาย2 หรือ 3 มิติลงบนจอภาพโดยใช้การแปลงMatrixเชิงตั้งฉาก (Orthogonal Transformation)
  • glEnable(GL_DEPTH_TEST) เรียกว่า Hidden-Surface Removal เป็นการเปิด Depth Buffer ซึ่งใช้เก็บความลึก z ที่แต่ละ Pixel ของจอภาพเพื่อเปรียบเทียบและป้องกันการวาง Object ซ้อนผิดลำดับ

ในการใช้งานFunction ต่างๆนั้นเดี๋ยวไว้คราวหน้าจะมาอธิบายกันอีกทีว่าใช้ยังไงละกันนะคับ สำหรับวันนี้ต้องขอตัวไปนอนก่อนละ ฝันดีนะคับ อิอิ

วันศุกร์ที่ 1 เมษายน พ.ศ. 2554

การ Setting Netbeans สำหรับเขียน PHP ภาค 2

ต่อไปเราจะมาทำการติดตั้ง PHP Engine กันนะคับ โดยเราสามารถไป Download ได้เลยคับที่ PHP engine โดยให้เลือกตัว Download ที่เป็นแบบ Thread แล้วก็เข้าสู่ขั้นตอนการติดตั้งกันเลยยย..

1

การ Setting Netbeans สำหรับเขียน PHP ภาค 1

การเขียน PHP กับ Netbeans นั้น ก่อนอื่นเราจะต้องติดตั้ง Software พวกนี้เข้าไปให้สมบูรณ์ก่อนคือ

  1. Netbeans IDE (ต้องเป็นตัวที่สามารถเขียน phpได้)
  2. PHP engine Version 5
  3. Web Server : Apache HTTP Server 2.2 (แนะนำตัวนี้)
  4. MySQL Database Server
  5. PHP debugger : XDebug 2.0 หรือใหม่กว่า

สมมติว่าเราได้ติดตั้ง Netbeans เป็นที่เรียบร้อยแล้วนะคับ ก็จะมาเริ่มกันที่ขั้นตอนการติดตั้ง Apache HTTP Server 2.2 กันเลย โดยให้เราไป Download ได้ที่ Website ตาม Link ด้านบนเลย แล้วก็เข้าสู่ขั้นตอนการติดตั้ง

1

 

วันพฤหัสบดีที่ 10 กุมภาพันธ์ พ.ศ. 2554

ADB (Android Debug Bridge) คืออะไรหว่าาา??

หลังจากที่ผมลง Android ใน HTC HD2 แล้วนั้น ปรากฏว่ากล้องไม่สามารถปรับขนาดให้เต็มหน้าจอได้ ก็เลยไปค้นหาข้อมูลตามเว็บต่างๆมา ก็ไปเจอวิธีแก้โดยให้ลงไฟล .apk แถมยังต้องไปพิมพ์อะไรใน command prompt อีก วันนี้เราดูกันว่าเจ้า ADB มันคืออะไรกันแน่ อิอิ

ABD คือ?

Android Debug Bridge เป็นเครื่องมือที่ติดมาพร้อมกับตัว Android SDK เพื่อที่จะใช้คำสั่งบางอย่างที่เกี่ยวข้องกับเครื่อง Android หรือจะพูดอีกอย่างนึงก็คือ ADB เป็นตัวเชื่อมระหว่าง Android Phone กับ Computer นั้นเอง

แล้วเจ้า ADB มันทำอะไรได้บ้างล่ะ?

  • ติดตั้ง recovery image
  • uninstall application ที่ไม่สามารถเอาออกได้ด้วยวิธีปกติ
  • รูทเครื่อง เพื่อให้ได้สิทธิเป็น root ของระบบ
  • ดึง System File
  • Install program
  • Screen Capture

คำสั่งเบื้องต้นของ ADB

  • adb devices : ใช้ดูว่า pc ของเรามองเห็น android ของเราหรือยัง
  • adb shell reboot : ใช้ restart เครื่อง
  • adb shell reboot recovery : ใช้ restart เข้า recovery mode
  • adb install xxx.apk : ติดตั้ง xxx.apk ไปใน android โดยที่ไฟลนั้นจะต้องอยู่ในโฟลเดอร์ tools
  • adb push [ชื่อไฟล์]/sdcard/[ชื่อไฟล์] : ใช้ copy file ไปยัง sdcard
  • adb remount : ทำให้ /system ของ android สามารถเขียนไฟล์ลงไปได้

วันจันทร์ที่ 31 มกราคม พ.ศ. 2554

Auto Disconnecting Idle Data Connections in WM6

วันนี้ผมมีวิธีการตั้งค่า Auto Disconnect สำหรับ WM6 โดยที่ไม่ต้องพึ่งโปรแกรมเลย โดยให้เราเข้าไปแก้ไข Registry ใน WM โดยใช้โปรแกรม Registry Editor แล้วทำการแก้ไขโดย

1.เข้าไปที่ HKEY_LOCAL_MACHINE\Comm\ConnMgr\Planner\Settings\

2.ตรง SuspendResume จากเดิมคือ ~GPRS!  ให้แก้เป็น GPRS_bye_if_device_off

3.ตรง CacheTime = xxx  จากเดิมคือ 600(0x000258) ให้แก้เป็น xxx คือเวลาในหน่วยวินาที

เพียงเท่านี้เครื่องของเราก็จะ Auto Disconnect ให้โดยอัตโนมัติแล้วคับ อิอิ

วันศุกร์ที่ 8 ตุลาคม พ.ศ. 2553

The Lex & Yacc

compiler หรือ interpreter สำหรับภาษาโปรแกรม(programming language) นั้นโดยปกติแล้วจะแบ่งออกเป็น 2 ส่วนคือ

  1. ส่วนที่ใช้ในการอ่าน Source Program และตรวจสอบโครงสร้างหรือ Structure ของตัว Source Program
  2. เป็นส่วนที่ใช้จัดการกับ Structure ของ Source Program

สิ่งที่ Lex และ Yacc ทำคือ

  1. ตัดคำหรือแบ่ง Source file ออกเป็น token ย่อยๆ (Lex)
  2. ตรวจสอบไวยากรณ์ของภาษาโปรแกรม โดยวิเคราะจากโครงสร้างที่แตกย่อยออกมาของ program (Yacc)

Lex – A Lexical Analyzer Generator

Lex นี้จะช่วยตัดคำ(Token) ของ source program จากการกำหนดโดย regular expressions ที่ได้รับมาจาก input stream แล้วส่งไปให้ parser ทำงานต่อ โดย source ของ Lex นี้ก็คือตาราง regular expressions และ คำหรือ Token ต่างๆที่ถูกกำหนดเอาไว้ในภาษาโปรแกรมที่ออกแบบไว้ โดยตารางนี้จะถูก translated เป็น program ที่จะใช้ในการอ่านข้อมูลจาก input stream โดยจะตัดคำ(Token) ที่ตรงกับ expressions ที่ได้กำหนดเอาไว้ โดย expression นี้จะถูกกำหนดโดย DFA หรือ deterministic finite automaton generated โดย Lex

 Yacc: Yet Another Compiler-Compiler

Yacc คือ tool ที่ใช้สำหรับอธิบายข้อมูลอินพุทให้กับ computer program ซึ่งผู้ที่ใช้ Yacc นี้จะกำหนดโครงสร้าง(Structure) ของข้อมูล input รวมไว้กับ code ที่จะถูกเรียกเอาไว้สำหรับในแต่ละ structure ที่ตรงกันสำหรับจัดการกับข้อมูลอินพุท โดยจะแบ่งออกเป็น subroutine ย่อยๆเอาไว้

 

เนื่องจาก lex กับ yacc มันเก่าแล้ว ก็เลยมีคนพัฒนา tool ตัวใหม่ๆออกมาหลายตัวดัวยกัน แต่สำหรับเอง ผมใช้

  • flex อันนี้ใช้สำหรับ lex
  • bison อันนี้ใช้สำหรับ yacc

*flex = lex,bison = yacc

ซึ่ง tool สองอันนี้เป็น OpenSource จึงสามารถนำมา compile และติดตั้งบน Linux ได้โดยไม่มีปัญหา

Flex,A fast scanner generator

Flex เป็น tool สำหรับสร้าง scanner (scanner generator) โดยprogramที่จะได้รับการยอมรับนั้นจะต้องตรงตาม lexical patterns โดยการทำงานของ flex นี้จะเริ่มจากการอ่านข้อมูล input จาก file เข้ามาหรือผ่านทาง stardard input ถ้าไม่มีการส่ง file name ให้กับ flex เพื่อใช้การอธิบายข้อกำหนดต่างๆ ก่อนที่จะทำการ generate scanner code ออกมา ดังนั้นก่อนที่จะใช้เจ้า flex นี้ได้ เราจะต้องมีการกำหนด regular expressions และชุดคำสั่งภาษา C ซึ่งเราจะเรียกว่า “RULES “ หลังจากที่กำหนด rules ต่างๆเรียบร้อยแล้วจึงใช้ flex นี้เป็น code generator ที่เราจะใช้เป็น scanner สำหรับตัดคำนั้นเอง โดย flex นี้จะ gen. ไฟล์ออกเป็นเป็นไฟล์ภาษา C ที่ชื่อว่า “lex.yy.c” ซึ่งใน file นี้จะมี routine ‘yylex()’ อยู่ภายใน จากนั้นก็เอาไฟล์ที่ได้มานี้ไปทำการ compile กับ c compiler ได้ออกมาเป็น executable ไฟล์สำหรับใช้งานอีกทีนึง

Bison, The Yacc-Compatible Parser Generator

Bison คือ parser generator ที่แปลงส่วนอธิบาย grammar ของ LALR context-free grammar (LALR parser generator เป็น software tool ที่ใช้ในการอ่าน BNF Grammar เข้ามาแล้ว generate code ให้เป็น LALR parser) ออกมาเป็น C program ที่ใช้ในการวิเคราะห์ไวยากรณ์

*Bison นี้ถูกพัฒนามาจาก Yacc ซึ่งการเขียน Yacc Grammar นี้จะสามารถนำไปใช้ได้กับ Bison ได้โดยไม่ต้องมีการเปลี่ยนแปลงเลย ซึ่งทำให้ผู้ที่มีความคุ้นเคยกับ Yacc นั้นสามารถเปลี่ยนมาใช้ Bison ได้โดยง่าย

วันนี้ง่วงนอนแระ เอาไว้รอบหน้าผมจะเอา Flex/Bison มาอธิบายให้ฟังกันอย่างละเอียดกันไปเลยทีเดียวละกันนะคับ อิอิ

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

วิธีกำหนด JFrame ให้อยู่กลางจอ

ถ้าเราจะจัดให้ JFrame ของเราอยู่กลางหน้าได้โดยเรียกใช้ Function getToolkit().getScreenSize() เราจะได้ขนาดของหน้าจอกลับมาในรูปของ Dimention Object (ไอ้เจ้าฟังก์ชั่น getToolkit() ของ JFrame นี้มัน inherit มาจาก Window) ลองมาดูตัวอย่างกันคับ

Dimension d = getToolkit().getScreenSize();

int screenWidth = d.width;

int screenHeight = d.height;

หลังจากนั้นเราก็มาหาตำแหน่งกึ่งกลางของจอโดยเอาค่าความกว้างกับความยาวมาหารด้วย2

int centerX = screenWidth/2;

int centerY = screenHeight/2;

แล้วก็มาหาตำแหน่งที่เราจะวาง JFrame เพื่อให้ frame นั้นอยู่กลางหน้าจอ เนื่องจากว่าเวลาเรากำหนดตำแหน่งของ frame ตำแหน่งที่เรากำหนดจะเป็นตำแหน่งของมุมซ้ายด้านบนของ frame มันเลยไม่อยู่ตรงกลางให้เรา (55+) ดังนั้นถ้าเราจะกำหนดตำแหน่งกึ่งกลางจอให้กับ JFrame ตรงๆนั้น frame ก็จะไม่ได้อยู่ตรงกลางเราจึงต้องคำนวนหาตำแหน่งของมันซะก่อน โดยลบค่าของ centerX และ centerY ด้วยขนาดครึ่งนึงของ frame ตามลำดับดังนี้

int xPos = centerX – frame.getWidth() / 2;

int yPos = centerY – frame.getHeight() / 2;

*สมมติให้ frame เป็น reference ของ JFrame

และแล้วเราก็จะได้ตำแหน่งที่จะต้องกำหนดให้กับ JFrame แว้ววว… ก็มาsetค่าตำแหน่งให้กับมันเลยคับ

frame.setLocation(xPos,yPos);

ก็เป็นอันว่า frame ของเราก็จะอยู่ตรงกลางเป็นที่เรียบร้อยละค๊าบบ.. มาดูตัวอย่างกันดีกว่า อิอิ

import javax.swing.*;

import java.awt.*;

public class TestJFrame extends JFrame {

  public static void main(String[] agrs) {

    JFrame f = new JFrame(“Centering JFrame”);

    f.setSize(200,200);

    Dimension d = f.getToolkit().getScreenSize();

    int screenWidth = d.width;

    int screenHeight = d.height;

    int centerX = screenWidth / 2;

    int centerY = screenHeight / 2;

    int xPos = centerX – f.getWidth() / 2;

    int yPos = centerY – f.getHeight() / 2;

    f.setLocation(xPos,yPos);

    f.setVisible(true);

  }

}

วันจันทร์ที่ 26 กรกฎาคม พ.ศ. 2553

Style การเขียนโปรแกรมเมื่อใช้ &

โปรแกรมเมอร์ C++ บางคนชอบเขียนเครื่องหมาย & ต่อท้ายชนิดข้อมูลมากกว่าที่จะเขียนไว้หน้าตัวแปร เช่น

void swap(int& a,int& b);

และนอกจากนี้บางคนยังนิยมเขียนวิธีนี้กับ Pointer operator ด้วยเช่น

float* p;

จุดประสงค์เพื่อจะให้มีความแตกต่างว่าเป็นข้อมูลชนิดpointer แต่วิธีการนี้อาจก่อให้เกิดความสับสนกับการประกาศเพราะ & และ * ใช้กับลิสต์ของตัวแปรไม่ได้เช่น ถ้าต้องการประกาศตัวแปร Integer 2ตัว เป็นpointer

int* a,b;

จะทำไม่ได้เพราะ b จะเป็นตัวแปรแบบ Integer ธรรมดาไม่ใช้ตัวแปรแบบ Pointer เพราะ & และ * จะใช้ได้กับตัวแปรทีละตัวเท่านั้น

สำหรับการเขียน &,* นั้นจะเขียนแบบไหนก็ได้เพราะ compiler จะตีความหมายเหมือนกัน

วันอาทิตย์ที่ 25 กรกฎาคม พ.ศ. 2553

การคืนค่า Function แบบ References

     นอกจากจะใช้พารามิเตอร์ Reference ได้แล้ว ยังสามารถใช้วิธีการนี้กับการคืนค่าของfunctionได้ เราสามารถทำได้โดยใช้เครื่องหมาย & นำหน้าชื่อ function เช่น prototype ของ f() ที่คืนค่า Integer แบบ Refernce

int &f();

     ในfunctionที่คืนค่าแบบ Reference นั้น compiler จะรู้เองว่าต้องคืนค่าที่เป็น address ของ object แทนที่จะเป็นค่าของมัน เช่น

int &f(){

  int i;

  cin >> i;     // get a value for i

  return i;     // automaticity returns reference to i

วันจันทร์ที่ 19 กรกฎาคม พ.ศ. 2553

จัดไป1เพลง กับวันเหง๊าาาา….เหงา

 

 

 

 

 

 

 

 

 

 

 

ในยามที่เราได้พบกัน ฉันจะเปรียบเธอเป็นเช่นดอกไม้
ในยามที่เราได้รักกัน ฉันจะปลูกต้นรักไปทั้งใจ
เวลาที่มีหยาดฝนโปรยปราย ฉันจะปรากฏกายข้างเธอไม่ห่างไปไหน
เวลาที่มีเรื่องร้อนใจ ฉันจะปัดและเป่าให้เธอจนชื่นใจ

ถึงแม้วันใดไม่มีฉันอยู่ ให้เธอรู้ความรักคงอยู่ไม่ห่างไปไหน
ต้นรักที่ฉันปลูกไว้ข้างใน หากเธอคงรักนั้นไว้ คอยดูแลรักฉันไว้... โว๊ะ โอ โอะ..

ความรักที่มีให้กัน ถ้าเธอคอยรักและอยู่เคียงข้างกัน
แค่ให้ความอบอุ่น และรักที่มีนั้นช่วยพาเราไป โว๊ะ โอ โอะ..
ความรักส่งไปให้เธอ แด่เธอที่รัก มั่นคงไว้เสมอ
ด้วยความรักที่มีแค่เรา ข้างกันและกัน

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