วันพฤหัสบดีที่ 7 พฤษภาคม พ.ศ. 2558

หัดเขียน Swift ตอนที่ 5 - Array



Collection พื้นฐานในภาษา Swift ที่จะพูดถึงในวันนี้ ก็คือ Array และ Dictionary ครับ มาเริ่มกันเลย!


Array

สำหรับอาเรย์ในภาษา Swift สามารถประกาศและเรียกใช้ได้ โดยมีวิธีดังตัวอย่างต่อไปนี้



จากภาพตัวอย่าง เรา กำหนด ค่า  [1,2,3,4,5]  ซึ่งเป็นข้อมูลที่มีรูปแบบโครงสร้างของอาเรย์ในภาษา Swift ดังนั้น ตัวแปรที่ชื่อ array จึงเป็นอาเรย์ ที่เก็บข้อมูลตัวเลข 1 ถึง 5 ตามลำดับ (ลำดับมีความสำคัญ)

หรือเราจะกำหนดชนิดของข้อมูลที่ต้องการเก็บลงอาเรย์ไว้ตอนประกาศเลยก็ได้ ดังนี้


          จากภาพตัวอย่าง จะเห็นว่าเราสามารถกำหนดให้อาเรย์ เก็บได้เฉพาะข้อมูลที่เป็น Interge เท่านั้น 

ดังนั้น พอผมทำการเพิ่มข้อมูลชนิด String ลงไปในอาเรย์ด้วยเมดตอด append() จึงเกิด Error ขึ้นครับ

แถม :


        จากภาพเป็นการเพิ่มข้อมูลตัวเลขลงในอาเรย์ทีละหลายๆตัวในคำสั่งเดียว โดยใช้เมดตอดชื่อ extend()



ทั้งหมดนี่ก็เป็นการใช้ Array อย่างง่ายๆนะครับ ยังมีmethod อีกหลายตัวที่ผมไม่ได้ใช้ให้ดู และถ้าถามว่า อาเรย์ในภาษา Swift นั้น  มีวิธีที่สามารถเก็บค่าแบบหลายๆชนิด ในอาเรย์ชุดเดียวกันได้ไหม ตอบว่า ได้นะครับ แต่ไว้ผมจะพูดถึงทีหลังครับ :3  ในบทความต่อไป เราจะไปต่อกันเรื่อง Dictionary นะครับ





วันพุธที่ 6 พฤษภาคม พ.ศ. 2558

หัดเขียน Swift ตอนที่ 4 - Optionals , Forced Unwrapping , Implicit Unwrapping



นบทความที่ผ่านๆมา เราได้ก็รู้พื้นฐานต่างๆของ Swift ไปบ้างแล้ว ได้แก่ ตัวแปร , ค่าคงที่ , ชนิดตัวแปร , สตริง และพวก control flow ต่างๆ (loop , if else , switch case) ดังนั้น ในบทความนี้ ผมจะเขียนถึงพื้นฐานที่ Advance ขึ้น ( อย่าเพิ่ง งง คำว่า พื้นฐานแบบ Advance 5555+ คือผมจะบอกว่า มันคือพื้นฐานของเจ้าภาษานี้ แต่ภาษาอื่นผมยังไม่เคยเห็นเค้าใช้กัน ) ซึ่งก็คือ Optionals , Forced unwrapping และ Implicit Unwrapping 

nil , Null หรือ NULL คำนี้ทุกคนคงรู้จักกันอยู่แล้ว แต่บางคนไม่รู้จักอันตรายของมัน คนที่เขียนโปรแกรมไม่รอบครอบ(อย่างผม) ก็มักจะโดนเจ้าค่า nil นี้ทำงานของผม บุ้ง! กลายเป็นโกโก้ครั้นไปหลายครั้งแล้วครับ เช่น API ภายนอกที่โปรแกรมของผมใช้งานอยู่ เกิดล่ม หรือมีการปรับเปลี่ยน ทำให้โปรแกรมผมได้ค่า nil เอาไปใช้ แล้วไม่ได้มีการดักเรื่องเหตุการณ์นี้เอาไว้ โปรแกรมผมก็เลยแครช!   (ดีนะยังไม่ตกงาน) ดังนั้นในภาษา Swift นี้ เค้าจะให้ความสำคัญกับเรื่องนี้มากๆ หากไม่มีความจำเป็นจริงๆ ก็ไม่ควรมีค่า nil เก็บอยู่ในตัวแปรเลยหล่ะครับ 0_0    งั้นเอาเป็นว่า เรามาเริ่มกันเลยดีกว่าครับ



จากภาพ ผมลองประกาศตัวแปร str เป็น String ซึ่งให้เก็บค่า nil ผลที่ได้ก็คือ Error ครับ เพราะใน Swift นั้น String ต้องเก็บ String value ครับ ส่วน nil มันไม่ใช่ String


แล้วถ้าผมอยากเก็บ nil จริงๆ ล่ะ เพราะบางทีเราไม่รู้ค่าในตอนเริ่มต้น แต่อยากประกาศมันไว้ก่อน ซึ่งก็ทำได้ครับ แต่คุณจะต้องใช้ ”Optional”  ซึ่งหมายถึง จะมีค่าอยู่ หรือไม่มีค่าอยู่ ก็ได้ (“have a value” or “may have a value”)  ซึ่งในภาษาอื่นๆ เรามักจะใช้ค่า -1 หรือ 0 เพื่อบอกว่า ไม่มีค่าเก็บอยู่ 



วิธีการใช้ Optionals

แบบง่ายสุดเลย คือเพิ่มเครื่องหมายคำถาม “?” ไว้ที่หลังชนิดตัวแปร เช่น




จากภาพตัวอย่าง จะเห็นว่า  str ตัวแรกที่ไม่ได้ประกาศเป็น Optional และไม่มีการกำหนดค่าเริ่มต้นให้ จะมี Error เกิดขึ้น แต่กับ str2 ดันไม่มี Error และยังสามารถเก็บค่า nil ได้ด้วย เพราะว่า str2 ประกาศเพิ่มไว้ว่าเป็น Optional นั่นเอง



จากตัวอย่าง เราประกาศ Optional ให้ str ไว้ ซึ่งพอ str เรียกใช้ method ชื่อ uppercaseString ดันเกิด Error ขึ้นดังภาพ ทั้งที่ปกติตอนไม่ได้ประกาศOptional ก็ใช้ได้นี่หว่า สาเหตุที่เป็นเช่นนี้ ก็เพราะว่า String กับ String? ถือเป็นคนละตัวกันจึงใช้ต่างกัน (String? สามารถเก็บได้ทั้ง String และ nil) ซึ่งตัว String? ไม่มี Method ชื่อ uppercaseString เหมือน String ครับ   ส่วนสาเหตุนั้นผมคิดว่า สมมุติว่าถ้า String? เก็บค่า nil อยู่ แล้วเราไปเรียกใช้ method  uppercaseString (แปลงเป็นตัวอักษรพิมพ์ใหญ่) มันก็จะมีปัญหาน่ะสิครับ เพราะแปลง nil เป็นอักษรพิมพ์ใหญ่ไม่ได้!   ซึ่งถือเป็นข้อดีที่ทำให้โปรแกรมของเรามีประสิทธิภาพกว่าเดิม ลดจำนวน Bug ที่อาจจะเกิดขึ้นได้ในอนาคต :)

จาก Error ดังกล่าว ถ้าเราอยากแปลงเป็นตัวพิมพ์ใหญ่ล่ะ ทำยังไง?  ไม่ยากครับ เราแค่ทำการตรวจสอบค่าก่อนใช้งาน ดังนี้


จากภาพ เรา assign ค่าของ str ไปไว้ที่ตัวแปร unwrappedStr ก่อน ซึ่งหากค่าที่ได้ ไม่ใช่ค่า nil (เป็น String Value) เงื่อนไข if ก็จะเป็นจริง จากนั้นค่อยเรียกใช้method uppercaseString ครับ  แต่ถ้า เป็น nil ก็จะไปเข้า Else แทนครับ ซึ่งเราจะไม่ยอมให้เรียกใช้ method uppercaseString โดยเด็ดขาด (เสี่ยงต่อการแครชมาก)  ดังนั้น นี่จึงเป็นวิธีที่เราควรใช้!  


Forced unwrapping

ส่วนอีกวิธีหนึ่งที่สามารถทำให้ Optional สามารถเรียกใช้ method ของ String ได้ โดยไม่ต้องตรวจสอบ if - else ก่อนเหมือนข้างบน คือ ใช้ Forced unwrapping ครับ คำว่า Forced ก็เหมือนกับการบังคับให้ทำไม่ว่ายังไงก็ตาม คล้ายกับ Force Close หรือบังคับปิดโปรแกรมแบบ ใช้ Ctrl+Alt+Delete แบบนั้นเลย ซึ่งถ้าเรามั่นใจว่าจะไม่เกิดปัญหาภายหลัง ก็ใช้ได้ครับ แต่ถ้าไม่ ก็อย่าใช้ไปเด็ดขาด! ดังนั้น Forced unwrapping จะใช้เมื่อตัวแปรนั้นมีค่าเก็บอยู่ 100% ถ้าเป็น nil จะ Error ครับ ดังนั้นเมื่อแน่ใจว่าจะมีค่าเก็บอยู่แน่ๆแล้ว มันก็เลยยอมให้เราเรียกใช้ Method uppercaseString ได้

วิธีการใช้ Force Unwrapping ก็เพียงแค่เติมเครื่องหมายตกใจ “ ! ” ต่อท้ายชื่อตัวแปร ครับ ดังนี้



 จากภาพ เรามั่นใจว่า ถึง str จะประกาศเป็น Optional แต่ไม่ได้เก็บค่า nil แน่นอน เพราะเรากำหนดค่า String ไว้แล้ว จึงสามารถบังคับให้ใช้ method uppercaseString ได้ (ปกติ Optional เรียกใช้ method นี้ไม่ได้)


Implicitly Unwrapped Optional

ทวนเรื่องเก่าสักนิดนะครับ 
Optional เป็นการอนุญาติให้ตัวแปรที่เราสร้างสามารถเป็น nil ได้ ซึ่งก่อนใช้งานตัวแปร เราสามารถใช้ if ตรวจสอบว่ามีค่าว่างก่อนใช่งาน หรือถ้าเรามั่นใจว่าไม่เป็นค่า nil แน่ๆ เราก็ใช้ Forced unwrapping (“!”) ได้เลย

แต่ในบางครั้ง เรามั่นใจเสมอว่า Optional ที่เราสร้างขึ้น หลังจากที่เราได้ค่าออกมาใช้งานในครั้งแรกแล้ว ตัวแปรนี้จะไม่เป็นค่า nil อีกต่อไป เราก็สามารถกำหนดได้ว่า ตัวแปรนี้ จะไม่มีวันเป็นค่า nil ตลอดไป ซึ่งจะเป็น optional ที่มีค่าเก็บอยู่ 100% โดยปกติเราจะใช้เครื่องหมาย ! ตอนเรียกใช้งานตัวแปรทุกครั้ง ซึ่งบางทีมันก็เสียเวลาใช่ไหมครับ ทั้งที่เรามั่นใจว่า ไม่ใช่ค่า nil แน่ๆ แต่ต้องมาใส่ “!” ทุกครั้งเลย   เพราะเหตุนี้จะมีวิธีให้เรายกเลิกการใช้เครื่องหมาย ! ทั้งหมดได้โดยง่าย ซึ่งจะถูกเรียกว่า Implicitly Unwrapped Optional
โดยที่ตอนที่สร้าง optional เราจะไม่ใช้เครื่องหมาย ? เพื่อสร้าง optional แต่เราจะใช้ ! ตั้งแต่ตอนสร้างเลย ยกตัวอย่างเช่น



เพื่อให้เห็นตัวอย่างชัดเจน มาดูเปรียบเทียบแบบใช้ Implicitly Unwrapped Optional กับแบบไม่ได้ใช้กันดีกว่า ดังนี้





สำหรับบทความนี้ จบเพียงเท่านี้นะครับ ขอให้ผู้อ่านพยายามอ่านเรื่องนี้ให้เข้าใจ เพราะจะต้องเจอต้องใช้มันบ่อยมาก ซึ่งตอนผมเห็นพวกนี้ครั้งแรก ผมก็งงเป็นไก่ตาแตกเหมือนกันครับ Xcode มันบอกให้ผมเติมเครื่องหมายพวกนี้ ผมก็เติมตามที่มันบอก โดยไม่รู้ว่ามันคืออะไร 555+ ไว้เจอกันใหม่ในบทต่อไป เรื่อง Array นะครับ ^_^



วันอังคารที่ 17 มีนาคม พ.ศ. 2558

หัดเขียน Swift ตอนที่ 3 - Control Flow


สวัสดีครับเพื่อนๆ บทความที่แล้ว ผมได้เขียนเกี่ยวกับ Numeric type และ Conversion ไปแล้ว
และในวันนี้เอง ผมจะเขียนสรุปเรื่อง Control Flow หรือ Loop , If และ Switch case !! มาเริ่มกันเลยครับ

1) Loop For อย่างง่ายนั้น เขียนง่ายมากครับ ใช้ ... แทน "i++" และเงื่อนไข  ตัวอย่างเช่น


หรือจะเขียนแบบนี้ก็ได้ครับ เผื่อมีหลายLoop แล้วใช้เงื่อนไขเดียวกัน เราสามารถเอาเงื่อนไขการวน เก็บลงตัวแปรก็ได้ครับ เช่น

2) หากต้องการแสดงCharacter แต่ละตัว ใน String โดยใช้ Loop  ก็สามารถเขียนได้ง่ายมาก ดังนี้


3) While Loop ก็เขียนง่ายๆ คล้ายๆแบบเดิม ดังนี้


4) If หรือเงื่อนไข ก็ไม่ต่างจากแบบเดิมเท่าไหร่ครับ ตามนี้
จากตัวอย่างเป็นการวน Loop โดยตั้งเงื่อนไขให้การวนรอบสุดท้ายนั้น แสดง String ออกมาในรูปแบบตัวพิมพ์ใหญ่ทั้งหมด (Upper case)


5) Switch Statement ก็เช่นเดียวกัน รูปแบบคล้ายกับภาษาเดิมครับ (ต้องมี default ด้วยนะครับ ไม่งั้น Error)




และหากต้องการกำหนดเงื่อนไขหลายเงื่อนไขใน case เดียว ก็สามารถทำได้ง่ายๆ ดังนี้

เท่านี้ยังไม่พอ หากจะกำหนดเงื่อนไขเป็นช่วงของตัวเลขก็ได้ !!  ดังนี้




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

Good Bye

หัดเขียน Swift ตอนที่ 2 - Numeric type , Conversion


      สวัสดีครับเพื่อนๆ วันนี้ผมจะสรุปเรื่อง Numeric type และ Conversion นะครับ มาเริ่มกันเลย!!

1) Range ของ Interger type  มีขนาด 8 Bit (Signed Interger) และ  16 Bit (Unsigned Integer) ซึ่งส่วนใหญ่ ที่เราคุ้นเคยคือ Int มักจะมีขนาด 4 bit ในภาษาอื่นๆใช่ไหมครับ :) แต่ภาษา swift ไม่ใช่ 4 นะครับ ^_^

 2) สามารถแทรก เครื่องหมาย Underscore ( '_' ) เข้าไปในตัวเลขแบบนี้ได้ด้วย !!!!! เพื่อช่วยโปรแกรมเมอร์อย่างเราให้อ่านเลขได้ง่ายขึ้น และป้องกันการผิดพลาดในการอ่านหรือพิมพ์เลขด้วยครับ เจ๋งไปเลย :3


3) สามารถหาเรียกดูค่าสูงสุดของแต่ละชนิดตัวแปรนั้นๆ ได้ง่ายๆ ตัวอย่าง เช่น


ในบรรทัดที่ 2 จะเห็นว่า หากมีการกำหนดค่าที่มีขนาดเกินกว่าที่ชนิดตัวแปรนั้นๆจะเก็บได้ ก็จะเกิดการ overflow ขึ้น

4) ตัวแปร ชนิด Booleans ก็ไม่ต่างจากภาษาเดิมครับ คือ เก็บค่า true หรือ false


5) อันนี้อาจจะยังไม่เคยเห็นกันนะครับ นั่นก็คือ Tuple ซึ่ง Tuple คือชนิดตัวแปรอย่างนึง ที่เป็น grouping of multiple values into a single type หรือ กลุ่มของค่าหลายๆค่า ที่เก็บอยู่ในตัวแปรตัวเดียว (มันไม่ใช่ Class และ Structs นะ) ผมมองว่าเหมือน Tuple ใน Table ของฐานข้อมูลมากกว่า ซึ่งแต่ละแถวในtable ก็สามารถมีค่าได้หลายค่า


บรรทัดแรก คือการสร้างตัวแปรที่มี type เป็น tuple ครับ โดยเก็บค่า2ชนิด ที่เป็น int และ string 
บรรทัดที่ 2-3 เป็นการแสดงค่าของตัวแปร address ที่ประกาศเป็นชนิด tuple ซึ่งเราสามารถบ่งบอก index ที่ต้องการให้แสดงได้
บรรทัดที่ 4 เป็นการกำหนดค่าให้ใหม่สำหรับค่าในตำแหน่งแรก  หากไม่อยากให้เปลี่ยนแปลงค่าได้ ก็ให้กำหนดบรรทัดแรกใหม่ เป็น let หรือค่าคงที่ แทน var  นั่นเองครับ :)


หรือเพื่อนๆอยากจะประกาศตัวแปร tuple โดยวิธีอื่น ก็ทำได้หลายวิธี 

เช่น หากต้องการสร้างตัวแปร tuple โดย เก็บค่า 2 ค่า เป็นชนิด Double และ String ตามลำดับ ก็สามารถทำได้ ดังนี้ครับ



นอกจากนี้ หากต้องการกำหนดค่าให้ตัวแปรหลายๆตัว มีค่าเท่ากับ ค่าในแต่ละใน indexของtuple ก็สามารถเขียนแบบสั้นๆ ได้ ดังนี้ (ง่าย และยืดหยุ่น จนผมจำไม่ได้ละครับ)


จากภาพ เป็นการกำนหนดให้ตัวแปร house มีค่าเท่ากับ address4 ใน index แรก และกำหนดให้ตัวแปร street มีค่าเท่ากับ address4 ใน index ที่สอง ตามลำดับ



แค่นี้ยังไม่พอ!!!!!!  หากต้องการจะกำหนด index ให้เป็นข้อความ แทนที่จะเป็นตัวเลข ก็สามารถทำได้เช่นกัน  (โอ้ย โหดเกินไปแล้ว)  ดังนี้




สำหรับบทความนี้ ผมขอพอแค่นี้ก่อนนะครับ ไว้เจอกันในบทถัดไป ซึ่งผมจะเขียนเรื่อง Control flow หรือพวก Loop ต่างๆนั่นเอง

  สรุปว่า วันนี้พระเอกของเราคือ Tuple นะฮะ :3







วันพุธที่ 11 กุมภาพันธ์ พ.ศ. 2558

หัดเขียน Swift ตอนที่ 1 - Variables, Constants, String



          สวัสดีครับ ในบทความนี้ก็จะเป็นบทความถัดจาก บทความที่แล้ว ที่ได้มีการแนะนำเพื่อนๆให้รู้จักกับภาษา Swift และไฟล์สำหรับฝึกทดลองเล่นคำสั่งภาษา Swift อย่าง Playground ไปแล้ว ในบทความนี้ผมแนะนำเรื่องของ Variables , Constants และ String ในภาษา Swift กันครับ โดยใช้เจ้าตัว Playground นี่แหละครับ มาเริ่มกันเลยดีกว่า เพื่อจะได้ไม่เสียเวลาเน้อะ

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

1) เข้า Playgroud แล้วทดลองพิมพ์คำสั่งตาม ดังนี้


จะเห็นได้ว่า

- การประกาศตัวแปรนั้น เปลี่ยนไปนิดหน่อย โดยมีรูปแบบดังนี้

                   var [ชื่อตัวแปร]: [ชนิดของตัวแปร] = [value]

- สามารถ assign ค่าให้กับ ตัวแปร greeting ใหม่ได้ 

- การแสดงค่าของตัวแปรออกมา (Debug) จะใช้ฟังก์ชั่น println( )   
  ( มันก็คือ NSLog( ) ในภาษา  Objective-C  นั่นเอง )



2) ลองเอา ชนิดของตัวแปรออก และกำหนดค่าให้ greeting ใหม่ เป็นเลขจำนวนเต็ม ดังนี้


จะเห็นได้ว่า

- เราไม่จำเป็นต้องประกาศชนิดของตัวแปร ก็ได้ แต่ต้องมีการกำหนดค่าเริ่มต้นให้ ซึ่งตัว compiler จะทราบชนิดตัวแปรและกำหนดให้อัตโนมัติ โดยอาศัยดูจาก ค่าเริ่มต้นที่กำหนดให้ (initial assignment) จากตัวอย่างคำสั่งนี้ greeting จะมี type เป็น String เพราะ Hello อยู่ภายใต้เครื่องหมาย Double quotes ซึ่งหมายถึง Value ที่เป็นชนิด String นั่นเอง

- พบ Error ที่ คำสั่ง greeting = 2558 เนื่องจาก greeting เป็นตัวแปรชนิด String แต่เราไปกำหนดค่าใหม่ ที่เป็น Interger ดังนั้นในเรื่องนี้ มันจะไม่ยืดหยุ่นเหมือนในภาษา PHP ครับ


3) กำหนดค่าให้กับตัวแปร greeting ใหม่ ตามนี้เลย 



- ดูจาก Code และผลลัพธ์ แล้ว คงพอเดากันได้ ว่ามันคือการ "ต่อสตริง" นั่นเอง โอ้วว พระเจ้าจอร์จ การต่อสตริง ง่ายเหมือนกับในภาษา Javascript และ PHP เลยครับ ใช้แค่เครื่องหมาย + ในการเชื่อมต่อเท่านั้นเอง  หากคนที่เคยใช้ Objective-C มาก่อน คงจะดีใจน้ำตาไหลแน่ๆ เพราะของเดิมนั้น "โคตรยาว"


4) ลองเปลี่ยนการประกาศตัวแปร โดยใช้ var นำหน้า เป็น let แทน ดังนี้


- การใช้ let นำหน้าตัวแปร ขณะประกาศตัวแปร หมายถึง การกำหนดชนิดตัวแปรให้เป็น ค่าคงที่ หรือ Constant นั่นเอง  ดังนั้น เราจึงไม่สามารถไปเปลี่ยนแปลงค่าให้กับตัวแปร greeting ได้นั่นเอง จึงเกิด Error ขึ้นมาทันทีครับ

หมายเหตุ : พยายามกำหนดตัวแปรให้เป็น ค่าคงที่ เท่าที่จะเป็นไปได้ เพื่อจะได้ทำให้โปรแกรมของเรานั้นแข็งแกร่งยิ่งกว่าชัชชาติเสียอีก

5) ลองแก้โค้ดเป็นแบบนี้ดูครับ


จะเห็นได้ว่า

- String type มี API Method ให้เรียกใช้ด้วย อย่างเช่น capitalizedString และ append เพราะ String type ในภาษา Swift ก็เหมือนกับ NSString ใน Objective-C นั่นเอง หากคนที่เคยใช้Objective-C หรือพวกJava มาก่อน จะคุ้นเคยกับพวก method ต่างๆ เหล่านี้  เพราะ String ในภาษา Swift ไม่ใช่ Primative Data type เหมือนพวก int , float หรือ double  แต่เป็น Object type



ในบทความหน้า เราจะลุยกันต่อ ในเรื่องของ Numeric type และ Conversion  สวัสดีครับ :3


หัดเขียน Swift ตอนที่ 0 - แนะนำให้รู้จัก ภาษา "Swift" [ฉบับย่อ]




 
(ภาพจาก หนังสือ Swift by Tutorials A Hands-on Approach by Ray Wenderlich)


          ครั้งนี้เป็นครั้งแรกที่ผมเขียนบทความเกี่ยวกับภาษา Swift ซึ่งก่อนอื่นผมต้องบอกก่อนเลยว่า ผมไม่ได้มีความเชี่ยวชาญเกี่ยวกับภาษา Swift เลย เนื่องจากภาษา Swift นั้น เพิ่งได้มีการแนะนำอย่างเป็นทางการในงาน WWDC 2014 ที่ Apple ได้จัดขึ้นครับ ดังนั้น สิ่งที่ผมจะเขียนต่อไปนี้จึงเป็นสิ่งที่ผมเพิ่งศึกษามาทั้งสิ้นครับ ดังนั้น เราจะเรียนรู้ไปพร้อมๆกัน อาจจะมีถูกบ้างผิดบ้าง ต้องขออภัยไว้ ณ ที่นี้ด้วยครับ

          ในงาน WWDC 2014 บริษัท Apple ได้มีการแนะนำ New Swift Language  ซึ่งตัวภาษา Swift นั้น ก็จะมี Syntax ที่สั้นกระชับมากกว่าภาษา Objective-C อยู่มาก นอกจากนี้ยังมีฟีเจอร์ใหม่ๆ สำหรับ นักพัฒนาตัว Mac และ iOS อีกด้วยครับ

          ก่อนที่จะมาเริ่มเรียนรู้เกี่ยวกับ Basic element ของภาษานั้น  Appleได้มีการแนะนำประเภทของไฟล์ชนิดใหม่ที่เรียกกันว่า playground ครับ ซึ่งจะเป็นไฟล์เดี่ยวๆไฟล์เดียว(Single Swift File) ซึ่งจะไม่เหมือนพวกกลุ่มไฟล์ตอนสร้างProjectใหม่ ที่จะมีหลายไฟล์ครับ

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

         ไฟล์ชนิด Playground นั้นเพื่อนๆสามารถสร้างได้ง่ายๆ โดยเลือกเมนู File จากนั้นเลือก New Playground จากนั้นเลือก iOS Plaform จากนั้นก็เลือก Save เป็นอันเสร็จเรียบร้อยครับ ^_^

       ในบทความหน้า ผมจะเริ่ม Basic ภาษา swift กันแล้วนะครับ โดยใช้เจ้าตัว Playground ในการทดลองคำสั่งครับ ไว้เจอกันใหม่ในบทความต่อไปครับ


ลิ้งสำหรับบทความถัดไป

หัดเขียน Swift ตอนที่ 1

http://tapepii-app.blogspot.com/2015/02/swift-1.html








วันเสาร์ที่ 31 มกราคม พ.ศ. 2558

การเขียนโปรแกรมแบบ MVC ( Model-View-Controller ) คืออะไร จะอธิบายให้ฟังแบบง่ายๆ



          สวัสดีครับผู้ที่เข้ามาอ่าน Blog  ทุกท่าน  เห็นหลายคนถามกันเยอะเหลือเกิน ว่า การเขียนโปรแกรมแบบ MVC มันคืออะไร ทำไมใครๆก็พูดถึงกันอยู่เรื่อย
      
        เอาเป็นว่า วันนี้ผมจะมาอธิบาย เจ้า MVC หรือ Model - View - Controller ให้เข้าใจกัน โดยจะขอยกตัวอย่างให้เห็นภาพกันเลยทีเดียว



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

      1) สร้างไฟล์มา 1 ไฟล์ (บางคนอาจจะสองไฟล์ แยกส่วนของ Header file ไว้อีกไฟล์นึง ก็แล้วแต่)

      2) นึกอะไรออก ก็เขียนลงไปในไฟล์นี้ให้หมด  ตั้งแต่รับข้อมูลตัวเลขเข้ามา  จากนั้นเอาไปคำนวณ พอคำนวณเสร็จ ก็สั่ง print ผลลัพธ์ออกมาเลย

      3) นำไฟล์ที่เขียนเสร็จ ไปคอมไพล์ และได้โปรแกรมเครื่องคิดเลขไปใช้งาน ดังรูป

      



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

       แต่! ถ้าเป็นโปรแกรมที่มีขนาดใหญ่ขึ้นล่ะ (โปรแกรมที่เขาขายๆกันนั่นแหละ ไม่ใช่โปรแกรมง่ายๆในรายวิชาโปรแกรมมิ่งนะจ๊ะ ) ยังจะดีอยู่ไหม ?

       ถ้าให้ผมเปรียบเจ้าเครื่องคิดเลขด้านบน เป็นสิ่งมีชีวิต  ก็คงเป็น "คนหนึ่งคน" ที่ทำทุกอย่างได้หมดเลย ตั้งแต่ คอยถามเลข input --> คิดคำนวณ และ --> บอกผลลัพธ์ ได้ ( มนุษย์เมพ )

       สมมุติว่าถ้าเราจ้างพนักงานคนนี้มาทำงานให้กับบริษัท แล้ววันนึง หัวหน้าบอกว่า....
      
      1) อยากได้คนที่หน้าตาดีกว่านี้เพื่อดึงดูดลูกค้า                  ทำไง?  --> หาคนใหม่สิ
      2) อยากได้คนที่ฉลาดกว่านี้เพื่อให้งานมีประสิทธิภาพ       ทำไง?  --> หาคนใหม่สิ
      3) อยากได้คนที่คุยภาษาคนรู้เรื่องกว่านี้                            ทำไง?  --> หาคนใหม่สิ
      
       จากตัวอย่าง เราจะเห็นว่า คนนี้ๆมีความสามารถเยอะแยะเลย มีข้อบกพร่องเพียงเล็กน้อยเท่านั้นที่ต้องปรับปรุง  แต่เรื่องแบบนี้มันปรับกันยาก สุดท้ายก็ต้องหาคนมาทำงานคนใหม่ที่มีคุณสมบัติตามที่เราต้องการ
( ไม่มีใครเพอร์เฟค )   

      ด้วยเหตุฉะนี้เอง ผมขอแนะนำทางเลือกใหม่ที่ดีกว่าคือ ใช้หลักการแบบ MVC สิครับ!!!!



     
         Model View Controller คืออะไร ?  ขอยกตัวอย่าง คล้ายๆแบบเดิมนะครับ เพื่อความเข้าใจง่าย ดังนี้


-  Model 

                            

     ผมเปรียบ Model ให้เป็น "ช่างเทคนิค" คนนึง (ใส่แว่นหนาเต๊อะ สิวเพียบ แถมอ้วนดำถึกอีกต่างหาก )    มีหน้าที่ คิดและวิเคราะห์วิธีการปัญหาอย่างเดียวก็เพียงพอ ไม่จำเป็นต้องไปพบลูกค้า
    

- Controller 

    ผมเปรียบ Controller  เป็น "คนประสานงาน" ทำหน้าที่ประสานงาน ระหว่าง ช่างเทคนิค กับ คนที่มีหน้าที่ออกไปพบลูกค้าเท่านั้น


-  View
                                           
      
     ผมเปรียบ View ให้เป็น "พริตตี้ในงานมอเตอร์โชว์" ละกัน (ไม่ต้องฉลาดก็ได้ แต่ขอให้ สวย เซ๊กซี่ นมใหญ่ๆยิ่งดี) หน้าที่ของพริตตี้ ก็คือ "สวย" เพื่อดึงดูดลูกค้าให้อยากเข้ามาร่วมงาน และคอยตอบคำถามเกี่ยวกับข้อมูลของสินค้าแก่ลูกค้าฟัง    ซึ่งสิ่งที่พริตตี้พูดออกไปนั้น พริตตี้ไม่ต้องไปเข้าใจมันก็ได้ แค่ท่องๆจำๆมา แล้วเอามาพูดเลยก็ได้ 

     ถ้าคำถามไหนที่พริตตี้ไม่รู้ไม่ทราบจริงๆ จะทำอย่างไรดี  ?   เรายังจำ "ช่างเทคนิค" ได้ใช่ไหม (Model) เขาเป็นคนเดียวที่เข้าใจปัญหาอย่างละเอียด ดังนั้น ให้พริตตี้นำคำถามที่ลูกค้าถามมา มอบให้กับ "คนประสานงาน(Controller)"  จากนั้น คนประสานงานก็จะวิ่งไปถาม ช่างเทคนิคให้ และนำสิ่งที่ช่างเทคนิคแนะนำมา กลับไปบอกกับพริตตี้อีกที จากนั้นพริตตี้แค่ก็นำคำตอบ ไปบอกลูกค้า   จบ!!!


สรุปสั้นๆ เป็นภาพได้ดังนี้

Model   <---->  Controller   <----->  View    <-----> User


ทีนี้กลับมาปัญหาเดิม ถ้าหัวหน้าบอกว่า....
      
1) อยากได้คนที่หน้าตาดีกว่านี้ เพื่อดึงดูดลูกค้า                     ทำไง?  --> เปลี่ยนพริตตี้ใหม่ก็พอครับ
2) อยากได้คนที่ฉลาดกว่านี้ เพื่อเพื่มประสิทธิภาพของงาน    ทำไง?  --> เปลี่ยนช่างใหม่ก็พอครับ
3) อยากได้คนที่คุยภาษาคนรู้เรื่องกว่านี้                                ทำไง?  --> เปลี่ยนคนประสานงานก็พอครับ

เป็นอย่างไรกันบ้างครับ กับการทำงานแบบแบ่งหน้าที่กันเป็นส่วนๆ ที่ต่างคนก็ต่างทำงานที่ตัวเองรับผิดชอบไป อยากจะแก้ไขตรงไหน ก็ปรับเปลี่ยนเฉพาะส่วนได้  แถมถ้ามีงานใหม่ๆเข้ามา ส่วนไหนที่มันยังใช้ได้ดีอยู่ ก็เอากลับมาใช้ซ้ำได้อีก เจ๋งป่ะล่ะ !!!!!!!


ทีนี้ ก็ลองเอาวิธีการเขียนโปรแกรมแบบ MVC ไปลองใช้ดูนะขอครับ




        
      


วันพฤหัสบดีที่ 29 มกราคม พ.ศ. 2558

วิธีแอบดู Inbox การสนทนาใน Facebook ของคนอื่นนั้นง่ายนิดเดียว



วิธีแอบดู Inbox การสนทนาใน Facebook ของคนอื่นนั้นง่ายนิดเดียว




          เกริ่นนำก่อนนะครับ เรื่องมันมีอยู่ว่า วันนี้ผมไปเห็นรุ่นน้องของผมได้ทำการโพสข้อความลงในเฟสบุคของเขาเกี่ยวกับเรื่องนี้อยู่พอดี ซึ่งผมเองก็มีความคิดเหมือนกัน   และผมเองก็รู้สึกเศร้าใจทันที เมื่อเห็นปฎิกิริยาของผู้ที่มาอ่านคำเตือนหลายๆคน บอกว่า "ทำไม่ได้หรอก" , "อย่ากลัวเกินเหตุ"  , "จะเอาก็เอาไปสิ ไม่มีอะไรสำคัญให้หรอก"  ในฐานะที่ผมเป็นโปรแกรมเมอร์คนหนึ่งที่เคยพัฒนาแอพที่สามารถล้วงข้อมูลของผู้ใช้ได้ ( จริงๆแล้ว เรียกว่าล้วงก็ไม่ถูกต้องซะทีเดียว )  ผมก็เลยอยากมาเขียนบอกผู้ใช้ว่า "มันทำได้จริงๆนะ"  มาดูกัน


             เชื่อว่า หลายๆ คนนั้น คงต้องเคยเห็นหน้าต่างดังภาพด้านบน ประมาณนี้อยู่บ่อยๆครั้งจนชิน และเชื่อว่า ผู้ใช้ส่วนใหญ่จะไม่อ่านข้อความเหล่านี้เลย  หากคุณสังเกตดูที่ภาพของผม ผมสามารถเขียนโปรแกรมให้มันไปล้วงข้อความInbox ของ Account ผมเอง ได้ ซึ่งหากมีคนมาใช้ Facebook ก็จะต้องแจ้งเตือนแบบนี้ เพื่อขออนุญาตผู้ใช้ก่อนนั่นเอง และหากคุณกดปุ่ม "ตกลง" ไปแล้ว แสดงว่า ต่อไปนี้ Inboxของคุณจะไม่เป็นแค่ของคุณอีกต่อไปแล้วจ้าาาาา ( ยืนไว้อาลัย )



            สมมุติว่า ผมได้เผลอ "กดตกลง" ไปแล้วนะครับ คนที่เป็นเจ้าของแอพต่างๆอย่างเช่น เกมส์ทายใจ  เพื่อนสนิทของคุณคือใคร หรือแอพอื่นๆ ประมาณนี้แหละครับ เขาก็จะได้ข้อมูลInbox ของผมไปในที่สุด ดังภาพที่ 2 นั่นเอง ( เจ้าของบล๊อค แอบคุยกับกิ๊กคนไหน ก็รู้หมดเลย โอ้ววว T^T  )



ดังนั้น ก่อนจะเข้าไปเล่นอะไร ก็ควรอ่านคำเตือนทุกครั้งก่อนให้ดีนะครับ เพื่อความปลอดภัยของตัวเราเอง ^_^


เครดิตภาพ
http://www.campussafetymagazine.com/article/see_who_is_exhibiting_at_the_campus_safety_conference

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

UX Design เรื่องที่นักพัฒนามือใหม่มักมองข้าม !




ออกแบบอย่างไร ! ให้ผลิตภัณฑ์ของเราดูสวยงาม คนจะได้มาใช้กันเยอะๆ

หากคุณคิดเพียงเท่านี้ล่ะก็ คุณพลาดอย่างแรง




เวลาที่กำลังจะพัฒนาโปรแกรมขึ้นมาสักตัวนึง หรือสร้างผลิตภัณฑ์อะไรก็แล้วแต่  เชื่อว่า หลายคนมักจะสนใจเพียงแค่ว่า ออกแบบอย่างไรจึงจะสวย ดูเด่นกว่าคู่แข่ง  ( แต่อาจจะไม่น่าใช้ก็ได้นะ )

ยกตัวอย่างเช่น

หากคุณสร้างเว็บไซต์มาสักตัวนึง ซึ่งแน่นอนครับว่า เว็บของคุณนั้น สวยงาม เอฟเฟคอลังการไม่แพ้หนังยอดมนุษย์จากค่าย Marvel หรือซุปเปอร์ฮีโร่จากละครช่อง7(แซ่ว) เลยทีเดียว


แต่!! เรื่องต่อไปนี้ล่ะ  คุณได้สนใจบ้างหรือเปล่า



1)  ความคุ้นเคยของผู้ใช้งาน - หากคนที่ไม่เคยเข้าเว็บของเราเลย หากเขาเข้ามาครั้งแรก เขาจะเล่นเป็นทันที หรือเรียนรู้ด้วยตัวเองได้โดยใช้เวลาไม่นาน หรือเปล่า ?

ยกตัวอย่างง่ายๆ เช่น

เอาเว็บฟังเพลงธรรมดาๆนี่แหละ หากเขาอยากจะกดเล่นเพลง ถ้าเขาเห็นสัญลักษณ์ ปุ่ม Play ที่เป็นรูปสามเหลี่ยม เขาก็สามารถรู้เองได้ทันทีว่าเขาต้องกดตรงนี้นะ โดยที่ไม่ต้องใช้ความพยายามใดๆ

แล้วรู้ได้ยังไงล่ะ ?

ก็เพราะมันเป็นสิ่งที่คนทุกคนคุ้นเคย  ไม่ว่าจะเป็นเครื่องเล่นเทป เครื่องเล่นDVD หรืออุปกรณ์ที่เอาไว้ฟังเพลงอื่นๆ ก็มักจะใช้สัญลักษณ์แบบนี้กันทั้งสิ้น ดังนั้น ตาสีตาสาคนไหนมาเห็น เขาก็จะใช้เป็นทันที โดยไม่ต้องไปสอนเขาเลย   ดังนั้นให้ พยายามใช้สิ่งที่ผู้ใช้งานคุ้นเคยอยู่แล้ว




2) ผู้ใช้เขาไม่อยากเสียเวลานานๆ - เคยไหม จะใช้บริการอะไรสักอย่างหนึ่ง กว่าจะจบขั้นตอนได้ ทำเอาเบื่อไปเลย ไหนเราจะต้องเข้าหน้านี้ โผล่หน้าโน้น ออกหน้านั้น

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

ดังนั้น ให้นึกเสมอว่า ทำอย่างไร ? ให้ผู้ใช้งานได้สิ่งที่เขาต้องการโดยมีขั้นตอนน้อยที่สุด 




3) มอบสิ่งที่ผู้ใช้อยากได้ ไม่ใช่สิ่งที่เราอยากให้ - หลายคนคิดว่า เรามีของอะไร เรารู้อะไร ก็อยากจะใส่มันไปลงไปให้หมดให้ลูกค้าเห็น แต่รู้หรือไม่ว่า สิ่งที่เราคิดเนี่ย มันเป็นการสร้างความลำบากให้แก่ผู้ใช้งานขนาดไหน เพราะว่ามันเป็นการเพิ่มภาระให้ผู้ใช้งานที่จะต้องมากลั่นกรอง แยกแยะ หาสิ่งที่เขาอยากได้เอง ทำให้เสียเวลา และอาจทำให้เสียอารมณ์ไปเลยก็ได้นะ  ดังนั้น เราต้อง วิเคราะห์หาสิ่งที่ผู้ใช้อยากจะได้และมอบให้เขาแค่นั้นก็พอแล้ว





4) ลำดับความสำคัญ -  เชื่อว่าหลายคนเคยไปเดินที่ Super market เพื่อซื้อสินค้าลดราคา  ซึ่งเราจะเห็นว่า บางร้านเขาจะเอาสินค้าลดราคาหรือสินค้ายอดนิยมมาวางไว้ที่ด้านหน้าของร้านเลย ทำให้ลูกค้าไม่ต้องเสียเวลาเดินหาเอง  ดังนั้นให้เรา นำเสนอสิ่งที่สำคัญขึ้นก่อน

.
.
.
.

เป็นอย่างไรกันบ้างครับ พอจะรู้จัก UX Design กันบ้างหรือยังเอ่ย?

UX นั้นย่อมาจากคำว่า User Experience

ดังนั้น UX Design มันก็คือ "การออกแบบที่เน้นประสบการณ์ในการใช้งานที่ดีให้แก่ผู้ใช้งาน"

อารมณ์แบบ คุณไปทัวร์ต่างจังหวัดแล้วพบกับบริการที่สุดยอด อาหารรสเลิศ ที่พักผ่อนนอนแล้วไม่อยากตื่น  กลับมาด้วยรอยยิ้มและความประทับใจ เพราะได้ประสบการณ์ที่ดีกลับมา  แบบนั้นเลยยยยยยย




ทีนี้ รู้หรือยัง ?  

"เน้นสวย" กับ  "เน้นเป็นมิตรกับผู้ใช้" สำหรับคุณแล้ว อะไรสำคัญกว่ากัน ? 

(แต่ทั้งสองอย่างก็ยังคงเป็นสิ่งที่โปรแกรมเมอร์อย่างเราควรจะใส่ใจทั้งคู่นะจ๊ะ)




วันอาทิตย์ที่ 11 มกราคม พ.ศ. 2558

ประสบการณ์และผลงานทางด้าน iOS ที่เคยทำมา


   
     สวัสดีครับเพื่อนๆพี่ๆหรือน้องๆทุกคนที่ได้เข้ามาอ่านบทความแรกของผมนะครับ ก่อนที่จะเขียนบทความเกี่ยวกับ iOS นั้น ในบทความแรกนี้ ผมขอเล่าเกี่ยวกับประสบการณ์ ด้าน Mobile Application (iOS) ก่อนนะครับ :)




       ผมเริ่มสนใจที่จะศึกษาการเขียนโปรแกรมทางด้าน iOS โดยใช้ภาษา Objective-C ในการพัฒนาในขณะที่กำลังศึกษาอยู่ที่ คณะวิทยาการสารสนเทศ สาขาวิทยาการคอมพิวเตอร์ มหาวิทยาลัยบูรพา ชั้นปีที่ 2 ครับ  แล้วจากนั้นก็เริ่มศึกษาอย่างจริงจังตอนอยู่ชั้นปีที่ 3  ซึ่งในช่วงที่กำลังศึกษาอยู่ในชั้นปริญญาตรีนั้น ตัวผมก็มีแอพที่เขียนขึ้นมาอยู่หลายตัว แต่ในที่นี้ผมขอเลือกเอามาเฉพาะตัวหลักๆละกันนะครับ ดังนี้ (อัพเดทล่าสุด วันที่ 01/02/2019)


1)  Hotline Thailand - เป็น Application ตัวแรกที่อัพขึ้น App Store
2) ฝึกอ่านจำนวนเลข - ช่วงนั้นข่าวรัฐบาลจะแจก Tabletให้แก่ เด็ก ป.1 กำลังดัง ผมก็เลยเลือกทำ Application สำหรับเด็ก แต่เสียดายที่ผมไม่ได้อัพขึ้น App Store เนื่องจากหาไฟล์เสียงดีๆมาใช้ประกอบไม่ได้ (หาคนเสียงเพราะๆไม่ได้ และในเวอร์ชั่นนี้ก็เป็นเสียงของกระผมเอง หึหึ) นอกจากนี้ผลงานตัวนี้ก็ยังเป็นส่วนหนึ่งของการบ้านในรายวิชา Algorithm analyst and design อีกด้วยครับ

3) School Report - แอพตัวนี้ ทีมของผมส่งเข้าแข่งขัน "การพัฒนาโปรแกรมคอมพิวเตอร์แห่งประเทศไทย" หรือ NSC เป็นครั้งแรก โดยมี อาจารย์ ดร.จักริน สุขสวัสดิ์ชน เป็นอาจารย์ที่ปรึกษา และผลงานตัวนี้ก็ได้ผ่านเข้าถึงรอบระดับภูมิภาค และได้รับเงินทุนสนับสนุนในงวดที่ 2 ครับ

     วิดีโอนำเสนอ : https://www.youtube.com/watch?v=mknyxlUnRRM



4) Smart Assistant Application for Traveller - แอพตัวนี้ ทีมของผมก็ส่งเข้าแข่งขันเช่นเดียวกันในปีถัดมา และในครั้งนี้ ผลงานของทีมผมได้ผ่านจนถึงรอบชิงชนะเลิศระดับประเทศเลยทีเดียว (แอบภูมิใจเล็กๆ) นอกจากใช้ส่งเข้าแข่งขันแล้ว ก็ยังใช้เป็นโปรเจคจบของผมอีกด้วยครับ โดยมี อาจารย์ ดร.จักริน สุขสวัสดิ์ชน เป็นอาจารย์ที่ปรึกษา
    
   วิดีโอนำเสนอ : https://www.youtube.com/watch?v=dxlODmli9Go




  5) 4DBOOK (e-Book Store Online)  -  4DBOOK เป็นผลงานล่าสุดของผมครับ ซึ่งก็เป็นร้านขายหนังสือและอ่านหนังสือ(e-book) เหมือนกับ AIS Book store ซึ่งผมโชคดีที่ได้รับโอกาสให้มาพัฒนาร่วมกับห้องปฎิบัติการ MSCIM มหาวิทยาลัยบูรพา ครับ 


     6) Banana Quiz - ทำเกมส์ตอบปัญหาง่ายๆ และจับเวลา เลียนแบบรายการ "ปริศนา ฟ้าแล่บ "

     7) Icegazine - นิตยสารแฟชั่นสำหรับวัยรุ่น (แอพนี้ มีรุ่นพี่ที่จบไปแล้ว จ้างให้ทำส่วนของ iOSครับ เพราะรุ่นพี่เขาทำ Android ไปแล้ว)


     8) E-learning - ตัวนี้มีรุ่นพี่ประกาศหาคนทำแอพ ก็เลยขออาสาเข้าไปพัฒนาร่วมกับLab MSCIM แต่ไม่รู้ว่าเกิดปัญหาอะไรขึ้น ทำให้ตอนนี้ขาดการติดต่อไปแล้วครับ :(
  8) CULI - แอพด้าน LMS ของ ศูนย์ภาษาจุฬาลงกรณ์มหาวิทยาลัย (CULI)



 8) แอพด้านการวิเคราะห์หุ้น - ยังไม่สามารถเปิดเผยข้อมูลได้



ทั้งหมดนี้ก็เป็นตัวอย่างบางส่วนของแอพที่ผมได้พัฒนาในช่วงระยะเวลา 4 - 5 ปีมานี้ครับ (บางโปรเจคก็ไม่สามารถนำมาแสดงในนี้ได้ เนื่องจากเป็นเงื่อนไขสัญญาของผู้ว่าจ้าง) ซึ่งในบทความต่อๆไป ผมจะขอแชร์เรื่องที่ผมสนใจ เอามาแบ่งปันเพื่อนๆ กันนะครับ ไว้เจอกันใหม่นะคร้าบ ขอบคุณที่อ่านจนจบนะครับ ฮิ้ววววว