เพิ่งไปอบรม SCJP @ CSIT-NU (สนับสนุนโดย SIPA สาขาเชียงใหม่)

ในช่วง 4-5 วันที่ผ่านมาไม่ได้ทำอะไรเลย งานการไม่ได้ทำ เพราะเอาเวลาไปอบรม Sun Certified Java Programmer (SCJP) ซึ่งในวันจันทร์ที่ผ่านมา (วันที่ 16 ตุลาคม 49) เป็นวันทดสอบ Pre-Test เพื่อลองเชิงว่ามีคุณสมบัติพอที่จะสอบหรือไม่ โดยมีคำถาม 15 ข้อ ทำให้ได้ไม่ต่ำกว่า 8 ข้อก็ผ่านแล้ว โดยตัวข้อสอบที่ให้ทำเป็นการไล่ตัว code ของโปรแกรมที่เขียนด้วยภาษา Java ทั้งหมดเลย โดยให้ตอบว่าผลการทำงานจะออกมาเป็นอะไร ซึ่งตัวข้อสอบไม่ได้ให้หาผลอย่างเดียว แต่ยังมีข้อให้เลือกว่ามันจะมี Compilation Fails หรือ Runtime Error หรือไม่ด้วย ซึ่งทั้งสองแบบก็มีอยู่หลายข้อเหมือนกัน

โดยในวันนั้นใช้เวลาสอบไม่เกิน 30 นาที ซึ่งถือว่าเวลาน้อยสำหรับคนที่นั่งไล่โปรแกรม เพราะแต่ละข้อนั้นกว่าจะไล่ตัวโปรแกรมเสร็จก็ปาไป 2-3 นาทีต่อข้อแล้ว แถมบางข้อยาวเสียด้วย ซึ่งการสอบเราต้องทำตัวเป็น compiler เพื่อจับผิดตัว code โปรแกรมต่าง ๆ ซึ่งสอบเสร็จก็ทำถูกไปได้ 13 ข้อ ส่วนอีก 2 ข้อเนี่ยมั่วไป แบบว่าตอนนั้นเวลามันไม่ทันแล้วต้องส่งแล้วด้วย แต่ดันมั่วไม่ถูกอีก เซง ๆ (ตอนตรวจเสร็จแล้วขอดูได้ว่าเราผิดข้อไหนด้วย)

ซึ่งเราก็ผ่านการทำสอบ Pre-Test เราเลยมีสิทธิ์ในการเข้าอบรมโดยเค้าจะมีเอกสารและมีวิทยากรมาอบรมให้ โดยวิทยากรที่มาอบรมก็เป็นคนที่สอบ SCJP มาก่อนเป็นรุ่นแรก ๆ และทำงานสายนี้มาก่อนอยู่แล้ว ซึ่งสอนได้ดี และละเอียด รวมถึงเป็นกันเองมาก เลยหล่ะ โดยอบรมให้เราเป็นเวลา 5 วัน ตั้งแต่เวลา 9.00 – 16.00 (ไม่รวมพักเที่ยง)  ซึ่งถือว่าทรหดมาก แต่โดยรวมก็มันดี ได้แนวคิดในการเขียนของ Java มาเยอะ และทำให้เรารู้ว่าภาษา Java นี่มันมีความหยุ่มหยิ่มในการเขียนมาก แถมใช้ความเคยชินจาก C/C++ มาเขียนบางครั้งก็ไม่ได้ด้วย
โดยในการอธิบายกลไกการจัดการ Object ใน Java แล้วก็อึ้ง ๆ อยู่ในหลาย ๆ เรื่องคือเรื่องของ String Pool หรือพวกระบบการสร้าง Object ของมันที่สลับซับซ้อนมาก แถมในตัวข้อสอบที่จะต้องไปสอบมันมีถามด้วยดิว่าเราเขียนโปรแกรมมาแบบนั้นแบบนี้ มันสร้าง Object มากี่ตัว หรือสร้าง Refference variable มากี่ตัว อะไรแบบนี้ ซึ่งมันดูเหมือนไม่มีประโยชน์ในการเขียนโปรแกรม แต่ถ้าลองใช้ลึก ๆ แล้วน่าจะทำให้เราจัดการหน่วยความจำได้ดีมากขึ้น ซึ่งการอบรมนั้นมีหัวข้อหลัก ๆ ดังนี้

  • Java Platform Architecture
  • Declarations, Initialization and Scoping
  • Flow Control (if or switch statement, loops and iterators, assertions, exceptions and exception handling , etc)
  • API Contents (Primitive wrapper classes, String VS StringBuffer, etc )
  • Concurrency (Thread and Runnable)
  • OO Concepts (encapsulation, access modifiers, inheritance superclass, overridden, overloaded ,is-a" and/or "has-a" relationships, polymorphism, etc)
  • Collections / Generics (hashCode and equals, Data Structure, etc )
  • Garbage collection
  • Fundamentals (primitive data types, arithmetic operators, access modifiers, package declarations, and import statements, etc )

จริง ๆ มันมีมากกว่านี้ครับ แต่เอาย่อ ๆ ประมาณนี้แล้วกัน โดยรวมทำให้เรารู้เลยว่าการทำงานของ Garbage collector ใน Java นี่มันเป็นไปตามใจของ JVM จริง ๆ คิดจากที่ได้อบรมมา เรื่องการเอา Object ที่ไม่ได้ถูกใช้งานแล้วออกจากหน่วยความจำนี่บังคับไม่ได้เลย คือแล้วแต่อารมณ์ของ JVM มาก ๆ คือ Object ไม่ได้ถูกอ้างถึงอีก มันก็ยังคงลอยหน้าลอยตาอยู่ในหน่วยความจำ Garbage collector มันก็มองว่า Object นั้นเข้าข่ายที่จะถูกลบไปได้ แต่มันจะลบหรือไม่ก็อีกเรื่อง แถม Garbage collector เนี่ยมันจะทำงานเมื่อไหร่ก็ไม่รู้ -_-‘ เราไปปลุกมันก็ไม่ได้ ได้แต่ร้องขอไป ถ้ามันอยากทำงานเดี่ยวมันก็ทำงานเอง ถ้ามันไม่ทำ ก็คือไม่ทำ (ใครจะทำไม) เป็นซะอย่างงี้อีก ไม่รู้ว่า 1.6 มันจะเป็นแบบนี้หรือเปล่านะ โดยรวมนี่ก็อึ้ง ๆ มึนๆ กับเรื่องนี้มาก เดี่ยวว่าจะหาอ่านเรื่อง Garbage collection ทบทวนน่าจะ ok ไม่รู้ว่าภาษาอื่น ๆ มันเป็นแบบนี้หรือเปล่า -_-‘

ส่วนต่อมาก็เรื่องของ Data type ที่ในภาษา Java นี่ stric มาก จนน่ารำคาญอย่างแรง คืออย่างเราเอา ข้อมูลที่เป็นชนิด short กับ short มาบวกกันมันออกมาเป็น integer ซะอย่างงั้นอ่ะ นี่ยังไม่รวม byte อีกนะ เออ ก็แปลงดี ต้อง casting กันให้วุ่นวายไปหมด แถมในการสอบก็มีให้เห็นกันแบบนี้อีก แถมมีการเอาชนิดข้อมูล char มาใช้เป็นตัวเลขได้ด้วย โดยไม่ต้อง casting อีก โอ้วววว สับสนใช้ได้เลย เรื่องของพวก Data type นี่เป็นอะไรที่สับสนงงงวงมาก แถมการประกาศ String s = "xyz"; กับ String s = new String("xyz"); นี่ได้ Object ไม่เท่ากัน ด้วย แบบแรกจะได้ String pool 1 ตัว โดยมี s เป็น reference 1 ตัว ซึ่งมันชี้ไปที่ String Pool แต่ในแบบที่สอง มี Object 1 ตัว และ String pool 1 ตัว โดยมี s เป็น reference อีก 1 ตัว โดยที่มันจะไปชี้ Object แล้ว Object จะชี้ไปที่ String pool อีกที (เราต้องมองว่า String pool คือ 1 ตัวคือ 1 Object ด้วยนะ) ซึ่งนี่แหละทำให้ งง กันไปพักนึง โดย String pool ใน Java นี่เป็นเหมือน Database สำหรับเก็บ String ที่สร้างขึ้นมา โดยที่ String ที่สร้างขึ้นนี้จะไม่มีทางถูกแก้ไขอีกถ้าสร้างมาแล้ว แถมถ้าไอ้ตัวที่สร้างมาแล้วมีตัวที่เหมือนกันจะสร้างซ้ำ มันก็จะไม่ให้สร้างซ้ำมันจะเอา reference ที่จะสร้างซ้ำนั้นน่ะมาชี้มาที่ String pool index ที่ซ้ำกันอยู่ทำให้ข้อมูลของ String 1 pool มี reference variable 2 ตัวชี้มาที่เดียวกัน เพื่อลดการใช้งานหน่วยความจำ แต่ถ้าใครอยากได้ String แบบที่เปลี่ยนแปลงค่าได้ก็ต้องใช้ StringBuffer แทน

เฮ้อ ….. นี่แค่เรื่องเล็ก ๆ ในช่วง 4-5 วันที่ได้อบรมนะ เดี่ยวจะมาเล่าต่อว่ามีอะไรอีกบ้าง ;)

Akkkkkkk Final Exam !!!

ช่วงนี้ต้องเร่งปั่นงานเก่าให้เสร็จแถมรายงานที่ค้างอาจารย์ท่านไว้อีก 1 งาน ต้องปั่นให้เสร็จก่อนสอบ (ส่งรายงานก่อนวันพุธนี้ เพราะวันพุธสอบ Programming Lanugage แล้ว) ส่วนวันจันทร์ (ที่ 25 กันยายน 49) สอบ Computer Graphics เป็นวิชาที่เราเรียนแล้วรู้ว่าเอาไปทำอะไรยังไง แต่ไอเดียมันไม่เกิดเท่าไหร่ คือ concept น่ะได้ แต่เวลาสอบให้เขียนโค้ดเพียว ๆ ซึ่งผมเป็นพวกไม่ค่อยชอบจำเรื่องพวกนี้มาสอบ เพราะดูแล้วมันไม่มีประโยชน์อ่ะ อยากได้แนวที่เป็นไอเดียมากกว่าที่มานั่งจำ ๆ มาสอบ ส่วน วิชา Compilers นี่ไม่ค่อยหนักใจเท่าไหร่ เพราะว่าตั้งใจกับวิชานี้มาตัั้งแต่ต้น เลยทวนๆ เล็กน้อย แถมอาจารย์ให้โอเพ้นได้ แต่กลัวว่าโอเพ้นมันจะไม่ดีน่ะดิ เพราะว่าสิ่งที่สอบมันจะเป็นอะไรที่ประยุกต์มาก ๆ ซึ่งไอ้เราน่ะไม่เท่าไหร่ เพื่อนๆ เรามันจะไม่รอดเอา –-‘ ส่วน Programming language ก็กำลังนั่งอ่านและทำความเข้าใจอยู่ โดยรวมเป็นวิชาที่ดี เพราะทำให้เราเข้าใจรากเง้าของ concept การเขียนของแต่ละภาษาโปรแกรมมิ่งซึ่งเอามาใช้ในการเขียนตอนทำงานได้ เพิ่งรู้ว่า loop while ใน java มันเป็น chekc comparison และตรวจสอบออกมาเป็น boolean type ไม่ใช่ numeric type แบบ c/c++ หรือ php ซึ่งอย่าง c++ และ php เนี่ยเจ้า boolean type มันมีค่าเท่ากับ numeric type ที่ 0 และ 1 แต่ java มันแยกออกมาเลย ทำให้ 0 มันไม่เท่ากับ false และ 1 ไม่เท่ากับ true –-‘

class test2 {
    public static void main(String[] args) {
        int x = 1, y = 6;
        while (y--) {
            x++;
        }
        System.out.println("x=" + x + " y=" + y);
    }
}

ลองเอา code ด้านล่างไปลอง run ดูดิ มันไม่ทำงาน แต่ลองแปลงไปลง php กับ c++ นี่ผ่านอ่ะ –-‘ ถ้าคิดว่าเขียน style c/c++ มาจะเล่นกับ java คงต้องอ่านข้อยกเว้น หรือข้อกำหนดที่เค้าเน้นไว้เยอะ ๆ ไม่งั้น bug ตรึมแน่ ๆ นี่เจอในข้อสอบ SCJP มาหยอกๆ เช่นกัน –-‘ ชอบออกข้อยกเว้นมาให้เรามึนหัวเล่นๆ ซะงั้นอ่ะ T_T

เซต Editplus เพื่อ Compile และเปิดไฟล์ Java ให้ทำงาน

  1. ทำการลงโปรแกรม EditPlus และ SDK ของ JAVA ชื่อ J2SE Development Kit ลงในเครื่องก่อน เพื่อให้ในเครื่องมีตัว Compile และ Editor เพื่อใช้ในการทำงานเสียก่อน
  2. เปิดโปรแกรม EditPlus และไปที่ Tools และตามด้วยเมนู Configure User Tools
  3. ตัวโปรแกรมจะเปิดหน้าต่างใหม่ ที่ชื่อว่า Preferences และตัว Cursor อยู่ที่ User tools ให้คลิ้กที่ปุ่ม Groups Name เพื่อทำการเปลี่ยนชื่อ Groups เป็น JAVA ซึ่งระบบจะขึ้นหน้าต่าง Rename User Tool Group ให้กรอง และเมื่อกรองเสร็จแล้วกด OK ออกมา และเราจะเห็นชื่อ Group 1 จากของเดิม เปลี่ยนเป็น JAVA แล้ว
  4. ต่อมาเราจะมาทำการสร้างตัว Command ในการ Compile ในตัวโปรแกรม EditPlus โดยไปที่ปุ่ม Add Tools และไปที่ Program ซึ่งโปรแกรมที่เราจะ Add เข้านี้มีชื่อว่า JAVA Compiler หรือชื่อ javac.exe นั้นเอง โดยให้ Browse ไปที่อยู่ของ javac.exe ซึ่งส่วนมากจะอยู่ใน directory  bin ของ JAVA รุ่นนั้นๆ เช่น "C:\Java\jdk1.5.0_01\bin\javac.exe" ซึ่งแล้วแต่เราว่าเราจะเอาไว้ที่ไหนนั้นเอง เมื่อ Browse หาเจอแล้ว ตัว Path ของไฟล์ javac.exe จะถูกนำมาใส่ไว้ในช่อง Command ให้เราเลยทันที และใน Menu Text ให้ใส่ Compile เข้าไป
  5. จากนั้นในส่วนของช่อง Argument  จะใช้ในการใส่ค่าของชื่อไฟล์ของเรา ในที่นี้ให้ไปที่ปุ่ม   และเลือกที่ File Name ซึ่งตามหลักการ Compile ใน Command Prompt ใน Dos นั้นจะมีรูปแบบคือ "C:\javac HelloWorld.java" ตัวโปรแกรมจะทำการใส่ไปให้เราเองดังที่ได้กล่าวไปในตอนแรกแล้ว
  6. ในช่องของ Initial directory นั้นปกติใช้เพื่อทำการบอกตัวโปรแกรมว่าให้ทำการ compile ที่ไหน โดยไปทีปุ่มเครื่องหมายลูกศรชี้ลง แล้วเลือก File Directory เมื่อทำทั้งหมดเสร็จแล้วให้กด Apply
  7.  ต่อมาเราจะมากล่าวถึงในส่วนของการให้โปรแกรมที่เขียนด้วยภาษา JAVA นั้นสามารถทำงานได้หลังจากทำการ Compile แล้ว ให้ที่ไป Add Tools และไปที่ Program ซึ่งโปรแกรมที่เราจะ Add เข้านี้มีชื่อว่า JAVA Interpeter หรือชื่อ java.exe ซึ่งส่วนมากจะอยู่ใน directory  bin ของ JAVA รุ่นนั้นๆ เช่น "C:\Java\jdk1.5.0_01\bin\java.exe" นั้นเอง เมื่อ Browse หาเจอแล้ว ตัว Path ของไฟล์ java.exe จะถูกนำมาใส่ไว้ในช่อง Command ให้เราเลยทันที และใน Menu Text ให้ใส่ Run เข้าไป
  8. จากนั้นในส่วนของช่อง Argument  จะใช้ในการใส่ค่าของชื่อไฟล์ของเรา ในที่นี้ให้ไปที่ปุ่ม   และเลือกที่ File Name Without Extension ซึ่งตามหลักการ Interpeter Running ใน Command Prompt ใน Dos นั้นจะมีรูปแบบคือ "C:\java HelloWorld" ตัวโปรแกรมจะทำการใส่ไปให้เราเองดังที่ได้กล่าวไปในตอนแรกแล้ว
  9. เมื่อทำการติดตั้งเสร็จแล้ว เราก็จะได้คำสั่งในการ Compile และ Run ออกมา
  10. ทดสอบโดยการเขียนโปรแกรมทดสอบ HelloWorld
    class HelloWorld {
          public static void main(String[] args) {
               System.out.println("Hello World!");
          }
    }
  11. และทำการ Save เป็น HelloWorld.java (หรือให้ชื่อไฟล์เหมือนกับชื่อของ Class ที่ทดสอบ)
  12. เมื่อ Compile จะได้ผล
    ———- Compile ———-
    Output completed (1 sec consumed) – Normal Termination
  13. และเมื่อ Run จะได้ผล
    ———- Run ———-
    Hello World!
    Output completed (0 sec consumed) – Normal Termination
  14. เมื่อได้แบบนี้แล้วแสดงว่าติดตั้งแต่สมบูรณ์เรียบร้อย ……