Posts tagged ‘Programming’

Magic of NSLog

การ Log ที่ดี ก็มีผลให้การทำงานเราสะดวกรวดเร็วขึ้นนะครับ แน่นอน การใส่สัญลักษณ์ไว้ใน Log ก็เป็นวิธีการแบบลูกทุ่งๆอย่างนึงที่ใช้ง่ายและได้ผล แต่เยอะๆเข้าแทนที่จะช่วยให้เร็วขึ้นมันจะเป็นตรงกันข้าม เพราะลายตากับ Log ไปหมด หรือจะให้ระบุรายละเอียดกันทุกบรรทัด ก็เสียเวลาเกินไป ใน Entry นี้ ผมเอา Trick การ Log ให้มีประสิทธิภาพมากขึ้นมาฝากครับ

Trick #1 : รู้รึเปล่า ว่าการทำงานพร้อมกับการ Log ค่าไปด้วย ทำให้เป็นการลดประสิทธิภาพการทำงานของ App ลงไปเยอะเลย ก่อน  Submit app ขึ้น App store เราควรจะ remove log ของเราออกไปด้วย …จริงอยู่ว่า App ทั่วไปอาจไม่มีผลต่อประสิทธิภาพโดยนัย แต่ถ้าเป็นเกม …มีนัยครับ ดังนั้น เราจะสร้าง Log ของเราเองขึ้นมา ที่ให้ Log ค่า ตอนที่ XCode ตั้งค่าเป็น Debug mode เท่านั้น ใส่โค้ดพวกนี้ในไฟล์ xxx_Prefix.pch ของโปรเจค เพื่อให้มีผลกับทั้งโปรเจคครับ

#ifdef DEBUG
# define JELog(fmt,...) NSLog(@"%@",[NSString stringWithFormat:(fmt), ##__VA_ARGS__]);
#else
# define JELog(...)
#endif

อธิบายโค้ดดังกล่าวได้ว่า เราสร้าง JELog ขึ้นมาเพื่อให้มันทำงานเหมือน NSLog เลย แต่จะพิมพ์ออกทางหน้าจอเมื่อ Preprocessor Macro ถูกเซตคำว่า DEBUG เอาไว้ แต่ถ้าไม่ได้เซตก็ไม่ต้องทำอะไร

ส่วนการเซตค่า  Preprocessor Macro ไปเลือกที่ Project->Edit Project Settings เลือก Debug ในช่อง Configuration และใส่ค่า DEBUG (หรือคำอื่นๆที่นิยามไว้) ใน Preprocessor Macro เซคชั่น GCC 4.2 – Preprocessing

…แค่นี้แหละครับ เสร็จแล้ว คราวนี้เรา Build ในโหมด Release ก็ไม่มี Log มาบั่นทอนประสิทธิภาพ App เราแล้ว

Trick #2: จะดีแค่ไหน ถ้าการ Log ทำให้เรารู้ได้ว่า มันโดน Log มาจาก Function อะไร และบรรทัดไหน เราสามารถเพิ่มมันได้เอง ในรูปแบบที่เราต้องการ และไม่ต้องเหนื่อยมาใส่แบบลูกทุ่งทีละบรรทัดทีละ Log ด้วย ทำได้ง่ายๆแบบนี้ครับ

#define JELog(fmt,...) NSLog((@"%s-%d:" fmt),__PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

เพียงเท่านี้ เราก็ Log สิ่งที่เราต้องการพร้อมชื่อ Function และบรรทัดนั้นได้ง่ายๆแล้วครับ นอกจากนี้ยังมี __FILE__ เพื่อ log ชื่อไฟล์ชื่อนั้นอีก แต่ผมไม่ใส่เพราะผมไม่ใช้ อิอิ

ครับ สำหรับ Entry นี้ก็คงกล่าวถึงแค่นี้ ส่วนถ้าใครยังไม่สะใจอยากแต่งอยากเติมอีก ก็เข้าไปดูในเครดิตครับ มีคนทำไว้หลายแบบเหมือนกันสำหรับผม แค่นี้ก็สบายแล้ว หุหุ …ว่าแล้วก็จบเท่านี้ดีกว่า Happy Logging นะครับ ;)

Credits:

@memogames
iphoneprogrammingfordummies.blogspot.com
Stack Overflow : NSLog Tip & Trick

มีนาคม 24, 2011 at 5:23 pm ใส่ความเห็น

อยากจะบอก Coder รุ่นน้องว่า… (from @rawitat)

อ่านทวิตเตอร์เมื่อกี้ ในไทม์ไลน์เจอทวิตชุดใหญ่ของ พี่เดฟ @rawitat ว่าด้วยเรื่องของ “อยากจะบอก Coder รุ่นน้องว่า…” ซึ่งคิดว่ามาประโยชน์มาก น่าจะเอามาลงใน Blog นี้ (ขออนุญาตเรียบร้อย)เพื่อเตือนตัวเองและบอกหลายๆคนที่อาจผ่านมาเห็น Entry นี้และเป็น Coder เหมือนกัน ได้ลองเช็คกันดูว่า ในการทำงานผ่านๆมา ได้ทำสิ่งเหล่านี้กันบ้างรึเปล่าเอ่ย? (ในที่นี้ ผมก็เป็น “Coder รุ่นน้องๆ เหมือนกันครับ)”

สิ่งที่พี่เดฟบอก มีดังนี้ครับ

“อยากบอก coder รุ่นน้องๆ ทุกคนครับ ว่า “write clearly. don’t be too clever” ยังคงใช้ได้เสมอ”

– หนังสือ Clean Code และ ประสบการงานเร่งก็สอนผมอย่างนี้

“อยากจะบอก coder รุ่นน้องๆ ว่า อย่าเร่งไปที่ coding มากมายนัก ทำความเข้าใจ concept พื้นฐานให้มากๆ”

– คุยกับคนที่บ้า Implement มากกว่าบ้า Concept ก็เหนื่อยจริงๆแหละครับ

“อยากจะบอก coder รุ่นน้องๆ ว่า “อย่าบ้าวนลูป” ไม่ใช่คิดอะไร เอะอะก็จะวนมันท่าเดียว”

– ทุกวันนี้วนลูปยังขี้เกียจเลยครับ หาคำสั่งอัตโนมัตดีกว่า อะฮิๆๆ

“อยากจะบอก coder รุ่นน้องๆ ทุกคนว่า ถ้าไม่มีปัญหาเรื่อง performance จริงๆ ก็อย่าเล่นท่ายาก ไม่มีประโยชน์”

– บางทีก็เล่นท่ายากไม่เป็นคับ แหะๆ

“อยากจะบอก coder รุ่นน้องๆ ทุกคนว่า “จงหัด refactor code” เขียนไปสักพัก ก็ refactor มันไปเถอะ”

– ตั้งแต่โปรเจคจบจนถึงตอนนี้ก็ทำอยู่ครับ :)

“อยากจะบอก coder รุ่นน้องๆ ว่า “หัดเขียน changelog ให้เป็น” ต่อให้ไม่ใช่ version control ก็เถอะ”

– ต่อไปจะหัดเขียนครับ T_T

“อยากจะบอก coder รุ่นน้องๆ ว่า “หัดอ่าน code ให้เป็น อ่านให้คล่อง และหา concept ข้างหลัง code ให้ได้”

– ทำได้แล้วดีกว่าก๊อบโค้ดจริงๆคับ :)

“อยากบอก coder รุ่นน้องๆ ว่า “หัดอ่าน code เหมือนอ่านนิยาย อย่าอ่านแค่เป็นตัวอย่างในการเขียน” (เพราะลอกนิยายบางประโยค ไม่ได้แน่)”

– อย่างเดียวกับข้อบนเลย

“อยากจะบอก coder รุ่นน้องๆ ว่า หัดอ่าน doc หัดอ่าน reference ให้เป็น อย่าคิดว่าทุกอย่างต้องมีตัวอย่างม มี tutorial”

– เริ่มสำนึกตั้งแต่ไป Training ที่ ภูเก็ตกับพี่เดฟนี่แหละ มันช่วยได้เยอะจริงๆนะ

“อยากจะบอก coder รุ่นน้องๆ ว่า กรุณาสร้าง coding style ที่คงเส้นคงวาสำหรับตัวเอง ไม่ใช่เปลี่ยนไปทุกครั้งที่ลอกตัวอย่าง code”

– เริ่มเป็นแบบของตัวเอง 80% เห็นจะได้แล้ว

“อยากบอก coder รุ่นน้องๆ ว่า บางครั้งหัดโยนวิชาการแบบอุดมคติที่เรียนๆ มาทิ้งซะบ้าง”

– 80% ของงานทุกวันนี้ มีจากห้องเรียน 20% นอกนั้นประสบการณ์จากการลงมือเขียนทั้งนั้น จริงๆนะ ไม่ได้พูดเอาเท่

“อยากบอก coder รุ่นน้องๆ ว่า “จงหัดเขียน multi-thread” ขอร้องเถอะ(โว้ย)”

– ผมจะพยายามทำให้ดีขึ้นครับ!! T_T

“อยากจะบอก coder รุ่นน้องๆ ว่า “อย่าคิดนะ ว่ามี memory เหลือเฟือ” และ “อย่าคิดนะ ว่า GC มันเจ๋ง”

– ไม่เคยคิดครับ เพราะมีก็ไม่ได้ใช้ Cocoa Touch มันใช้ไม่ได้อยู่แล้ว -_-“

“จริงๆ มีอีกหลายอย่าง …​ แต่อย่างสุดท้าย อยากจะบอก coder รุ่นน้องๆ ทุกคนว่า “อย่าเชื่อผมมากนะ” “

– …

“ลืมไปอีกอย่างสองอย่างที่สำคัญมาก”

“อยากบอก coder รุ่นน้องๆ ว่า “ต้อง” หัดใช้ debugger หัดไล่ stack trace และหัด log การทำงานโปรแกรม”

– ได้ใช้แล้วครับ Debugger, Instrument แต่ยังไม่คล่องเท่าไหร่ ต้องฝึกอีก

จะว่าไปผมก็ทำได้หลายๆอย่างแล้ว ค่อยยังชั่วแฮะ (หรือไม่ก็ยังทำไม่ได้ แต่ดันคิดว่าทำได้ไปแล้ว …ไม่น่าจะเป็นอย่างนั้นนะ) ส่วนที่ยังไม่ได้ก็จะฝึกต่อไป แล้วคนอื่นละครับ ทำได้ทุกข้อรึยัง? ลองเช็คตัวเองกันดูนะครับ :D

Credit : พี่เดฟ @rawitat (http://www.twitter.com/rawitat)

สิงหาคม 10, 2010 at 5:25 pm ใส่ความเห็น

Why I choose XCode4 Even it still preview ?

ห่างหายไปนานกับการเขียน Blog เกี่ยวกับ iPhone Development ของผม ตอนนี้ต้องเปลี่ยนเป็น iOS Development แล้วละมั้ง ถึงจะถูก เพราะ iPhone ได้เลื่อนสภาพกลายเป็น Platform อีก 1 Platform ของ Apple ไปเป็นที่เรียบร้อยแล้ว

เกี่ยวกับ Entry นี้ หัวข้อก็คงบอกได้ชัดเจนว่าจะเขียนถึงเรื่องอะไร? ใช่แล้ว !! XCode4 นั่นเอง

เพิ่งเปิดให้ Download ไปลองใช้กันสดร้อนๆ แค่วันสองวันที่ผ่านมา(จากวันที่เขียน Entry นี้นี่เอง) หลังจากที่ได้เห็นการ Demo ในวิดีโอของงาน WWDC’10 เชื่อว่าหลายคนน้ำลายหก อยากลองของเล่นตัวนี้กันแน่นอน ส่วนตัวผมได้ลองมาตั้งแต่ Preview 1 แล้ว (เวอร์ชั่นที่แจกในงาน) บั๊กเยอะมาก มากจนไม่สามารถเอามาทำเป็นงานหลักได้ ก่อนหน้านี้ ผมจึงไม่ Review อะไรใดๆเกี่ยวกับการใช้ XCode4

ส่วนตัว Preview 2 ที่ออกมาให้ Download นั้นแก้บั๊กต่างๆไปเยอะแล้ว แต่เวอร์ชั่น Preview ก็คือ Preview ไม่มีทางสมบูรณ์และราบรื่นได้เหมือนตัวเต็ม และไหนจะเรื่อง Learning Curve ที่คงจะค่อนข้างสูงแน่นอน เพราะความต่างระหว่าง XCode3 และ 4 นับว่าต่างกันจนไปแทบไม่เป็น

ว่ากันตามตรง ถ้าอยากให้งานเสร็จเร็ว ใช้ XCode3 ไปก่อนดีกว่าครับ สาเหตุหรือปัญหาต่างๆที่ยังเจอใน XCode4 Preview 2 มีมากมายเอาเรื่อง ตั้งแต่

  • ปัญหาเรื่อง Key ลัด – กับ User ไม่น่ามีปัญหา แต่กับ Programmer ผมเชื่อว่าไม่ใช่ และเป็นเรื่องใหญ่ซะด้วย Key ลัดต่างๆที่ใช้อยู่บ่อยๆ ใน XCode3 เช่น Toggle ระหว่าง .h กับ .m (cmd+shift+up arrow) หรือสุดยอดคีย์ลัดขาประจำอย่าง Comment (cmd+/) มันหายไปครับ ยังไม่สามารถใช้ได้ใน version นี้
  • ปัญหาเรื่อง Code Sense, Auto Complete – ยังไม่ฉลาดเท่าที่ควร ผมเชื่อว่าการที่คุณกด nsl แล้วกด esc คุณหวังว่า กด Enter แล้วจะได้ NSLog มาใช้ เสียใจครับ คุณจะได้ NSLock มาใช้แทน นอกจากนั้น Snippet ต่างๆที่เราคาดหวังว่าจะขึ้นมาอย่างรวดเร็วอย่าง if (กด if แล้วกด esc จะได้ snippet มาใช้ได้ทันที) ก็จะยังไม่มีอีกเช่นกัน ถึงจะสามารถเพิ่มเองได้อย่างไม่ยากอีกต่างไป (แถมเท่อีกตะหาก เพิ่มใน IB) แต่เชื่อว่า คุณไม่อยากนั่งเพิ่มอะไรที่เคยใช้ได้โดยไม่ต้องมานั่งกรอกเองหรอก
  • ปัญหาเรื่อง Speed – ถ้าใครใช้ Mac รุ่นเก่าประมาณ 2-3 ปีลงไป ทำใจนะครับ เล็งหาเครื่องใหม่กันเถอะ (ผมด้วย) เพราะกิน Resource เอาเรื่องเลย อาจจะไม่ถึงกับรันไม่ได้ แต่การทำงานก็ไม่ลื่นปรื๊ดปร๊าดเหมือนใน XCode3 แน่นอน ตัวอย่างเช่น ตอนลาก Outlet ใน IB ไปลงใน Code ใน Demo มันดูน่าประทับใจมาก แต่ในโลกแห่งความเป็นจริง(ของเครื่องเก่าๆ) มันงดงามดังวิดีโอซักเท่าไหร่ วิธีที่พอจะช่วยได้บ้างก็คงเป็นการปิด Safari ที่เปิด tab ไว้เยอะๆ ละมั้งครับ คงพอช่วยได้
  • บั๊กจุกจิกเล็กน้อยที่จะฟ้องขึ้นมาเรื่อยๆ ให้ได้รำคาญเป็นระยะๆเวลาทำอะไร ท่องไว้ละกันครับ ว่า..มัน..pre..view

จากข้างต้น จะเห็นได้ว่าบั๊กมันไม่น้อยเลย แต่บอกเลยว่าไม่ใช่ไม่ดีนะครับ มันดีมากๆ แต่ยังไม่สมบูรณ์เท่านั้นเอง ถึงอย่างนั้น ผมเองก็ยังดึงดันจะใช้ XCode4 ไปเลย แทนที่จะใช้ XCode3 อย่างที่บอกผู้อ่าน …เพราะอะไร?

…เพราะ XCode3 with iOS SDK3 กับ XCode3 with iOS SDK4 มันทำงานไม่เข้ากันน่ะสิครับ ถ้าคุณต้องเขียน App ที่ support ทั้ง SDK3 และ SDK4 เป็นเรื่องน่าตลกปนเศร้าที่เราต้องลง SDK ถึง 2 ตัว เพราะ SDK4 ไม่มี Lib iOS3 (ไม่นับ 3.2 ที่เป็น iPad) และ SDK3 ไม่มี lib iOS4 สาเหตุที่ต้องแยกกันแบบนี้ เชื่อว่าเป็นเพราะ Simulator + ต้องการ Force ให้ Programmer พัฒนา App base เป็น SDK4 ทั้งหมด

หารู้ไม่ว่าในหมู่ผู้ใช้ Base ของ iOS version มันขึ้นกับว่า “Jailbreak ได้ถึงเวอร์ชั่นไหนแล้ว” และผมก็ต้องอิง Base นั้นซะด้วย

แม้ว่าผมจะต้องยอมเสีย พื้นที่ HDD และ Ram ให้กับ XCode 2 ตัวพร้อมกัน แต่ก็ไม่ได้หมายความว่า “ปัญหามันจะไม่มี” ปัญหาที่ว่า เช่น

  • Simulator มึน – อย่างที่บอกไปข้างต้น ว่า Simulator น่าจะเป็นสาเหตุนึง เพราะเมื่อ Launch Simulator ที่เป็น iOS3 แล้ว จะรัน Simulator ที่เป็น 4 ซ้ำไม่ได้ เพราะมันมองว่าเป็น Process เดียวกัน แล้วถึงแม้ว่า จะปิดตัวที่ Launch อยู่ มันก็จะยังมึนและมองว่า Simulator ยังถูก Launch อยู่ วิธีแก้ไขที่ผมพบคือ “ปิด XCode แล้วเปิดใหม่” ก็พอแก้ไขได้ แต่คุณอยากเปิดๆปิดๆ XCode อยู่เรื่อยๆมั้ยล่ะ (วิธีการ Kill Process ก็น่าจะช่วยได้ แต่มันก็ยุ่งยากมานั่ง Kill ทุกครั้งอีกนั่นแหละ)
  • Developer Bundle ID ค้าง – อันนี้คงเป็นปัญหาใน XCode3 SDK iOS4 ถ้าคุณเปิด Project ด้วย iOS SDK4 จากนั้น Copy Source ของต้วเองไปวางที่เครื่องอื่น ผลคือ มันจะ Compile ไม่ได้ เพราะเครื่องอื่นจะไม่มี private key ของเครื่องก่อนหน้านั้น ถึงจะเปลี่ยนไปใช้ของเครื่องใหม่ก็ยังค้างและถามถึง private key ของเครื่องเก่าอยู่ (ผมโดนอันนี้เข้าไป เกือบส่งงานไม่ได้) วิธีการแก้ไข มี 2 แบบ คือ 1. Export private key ของเราไปลงเครื่องที่จะใช้โค้ดนั้น ถ้าไม่ได้ซีเรียสว่าจะโดนเอาไปใช้เรื่องไม่ดีก็ใช้ทำได้ หรือ 2. ดิบๆเลย Create Project ใหม่แล้ว Copy Source ไปวาง
  • IB เน่า – อันนี้ไม่แน่ใจว่าเฉพาะผมคนเดียวหรือเปล่า แต่ไฟล์ .xib ตัวเดียวกัน แต่เปิดจาก iOS SDK3 แล้วสลับไป iOS SDK4 “File Owner จะไม่เจอ Action/Outlet ที่กำหนดไว้ใน Class เลย แต่ App ยัง Launch ได้อยู่แค่จะเพิ่มอะไรลงไปไม่ได้เท่านั้นเอง วิธีก็เหมือนแก้ปัญหา Simulator ครับ Restart XCode

ที่หนักๆเลยก็คงเป็นปัญหาพวกนี้ครับ เพราะผมไม่รู้ต้อง Restart XCode อีกซักกี่ครั้ง ดังนั้น ผมขอไปเจอบั๊กของ XCode4 ดีกว่าครับ สำหรับใครที่พัฒนาโดยไม่ได้ซีเรียสเรื่องต้อง Support 3 และ 4 ด้วยก็ไม่ต้องตกใจกับ Bug ต่างๆที่เขียนไว้นะครับ มันเป็นบั๊กที่ผมเจอในการทำงานร่วมกันของ XCode พร้อมกัน 2 ตัวเท่านั้น เชื่อว่าถ้าใช้แค่ตัวเดียวก็คงไม่เกิดปัญหาเหล่านี้

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

…Happy XCoding ครับ

กรกฎาคม 28, 2010 at 3:40 pm ใส่ความเห็น

iPhone’s project multi-target programming

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

ในการพัฒนา App ไม่ว่าจะบน Mac หรือ iPhone ก็ตาม คงจะเคยเห็นกันว่าบาง App มีหลายเวอร์ชัน เช่น Lite, Standard, Full, Pro, etc.. ซึ่งความแตกต่างส่วนมากก็มักจะเป็นเรื่องของการจำกัด Feature หรือ App บางตัวที่อยู่บน Platform Mac ก็มาอยู่บน iPhone ต่อ อย่างเช่นเกม plant vs zombie หรือ twitter client อย่าง echofon เป็นต้น

ถ้าถามหลายๆคนถึงวิธีการ Develop App พวกนี้ให้เป็นหลายๆเวอร์ชั่นดังกล่าว หลายๆคนอาจจะใช้วิธีการ Duplicate project โดยการ Copy file ทั้งโปรเจคมา แล้วเข้าไปแก้โค้ด ตัด feature ไปตามเวอร์ชั่นๆไป (ดูไม่ make sense เท่าไหร่ แต่ผมเชื่อว่ามี และเยอะด้วยที่ทำแบบนี้) ผมเองก็เคยเช่นกันครับ ทำ App 8 เวอร์ชั่นเลยทีเดียว(จริงๆก็ไม่ได้เห็นด้วย แต่เขาสั่งมาก็ต้องทำ) ปัญหาที่เจออย่างหนักหน่วงเลยก็คือ “การแก้ไข Bug ยุ่งยากและเสียเวลาเป็นที่สุด” เพราะบั๊ก 1 จุดต้องใช้เวลาเพิ่มเป็น 8 เท่าและความแน่นอนว่าการแก้แบบเดียวกันกับโปรเจคเวอร์ชั่นต่างๆกัน มันอาจใช้ไม่ได้ผลซะด้วย

ดังนั้นการทำ App หลายๆเวอร์ชั่นด้วยวิธีการ Duplicate project ไม่น่าจะเป็นทางเลือกที่ควรนัก สำหรับการทำโปรเจคหลายๆเวอร์ชั่น โดยเฉพาะตอนที่ iPad มันเริ่มเข้ามาแล้วอย่างเช่นตอนนี้ ตามจริงมันก็ไม่ควรเป็นแบบนั้นอีกเช่นกัน ในเมื่อ XCode มี Target ให้ใช้อยู่ แล้วทำไมเราถึงไม่ใช้มันล่ะ

Target คืออะไร? Target เปรียบเสมือนพิมพ์เขียวที่กำหนดค่าต่างๆในขั้นตอนการ build ผลก็คือ เราสามารถกำหนดได้ว่าตั้งแต่ target ไหนชื่ออะไร ใช้ไอค่อนตัวไหน ไฟล์ไหนบ้างที่จำเป็นต่อการ build ยันรูปแบบผลที่ได้ว่าต้องการเป็น Application หรือ static library

เวลาเรา Create project ขึ้นมาซักตัว Target จะมีมาให้โดยปรกติเลย 1 ตัว ซึ่งจะอยู่ใน Section Targets ซึ่งเราสามารถเพิ่มได้ตอนไหนก็ได้ โดยการไปที่ Menu Project > New Target… จากนั้นจะขึ้น Window ขึ้นมาให้เลือก Target แบบที่เราต้องการ จากนั้นก็ตั้งชื่อ Target ที่สร้างขึ้น กด Finished ก็เป็นอันเสร็จเรียบร้อย (ตอนนี้เรากำหนดรูปแบบได้แล้ว)

ผลที่ได้จะได้ Target อันใหม่มา 1 อันและ Plist สำหรับ Target นั้นอีก 1 ไฟล์ Plist ก็เป็นที่รู้กันว่าไว้สำหรับการตั้งค่าต่างๆเช่น icon, bundle id, bundle name, etc… ซึ่งเราก็สามารถกำหนดได้ตามต้องการ Target ตัวใหม่ก็เช่นกันเราสามารถกำหนด Framework ที่ใช้ product name, platform ของ Application, etc… ตั้งค่าได้ทั้งหมดราวกับว่ามันเป็นคนละโปรเจคนั่นแหละครับ

องค์ประกอบของ Target ก็มีต่างกันไป ใน Entry นี้ขอพูดถึงแต่แบบ Application เท่านั้นนะครับ Application จะประกอบด้วย 3 ส่วนคือ

component.png

  1. Copy Bundle Resources – เป็นส่วนของ Resource ต่างๆใน Project พวก รูปภาพ, ไฟล์เสียง, วิดีโอ, ฯลฯ
  2. Compile Sources – เป็น Source code ล้วนๆครับ เอาแต่ไฟล์ .m เท่านั้น แล้วก็สำหรับ project จะต้องมี main.m ด้วยนะครับ อย่าลืม ไม่งั้น App จะรันไม่ได้นะครับ สำคัญมาก!!
  3. Link Binary With Libraries – เป็น Framework ที่ใช้ร่วมครับ ปรกติก็จะมี UIKit.framework ตัวนึงละ (สำหรับ iPhone/iPad) หรือไม่ก็ Cocoa.framework (สำหรับ Mac App)

วิธีการก็คือ Target ไหนใช้อะไร Compile บ้างก็ลากใส่เข้าไปตามหมวดหมู่ที่บอกข้างต้นครับ ไม่มีอะไรมาก หรือเวลาที่เรา Add ไฟล์อะไรก็ตามเข้ามาใน Project จะมี Sheet ขึ้นมาถามเราว่า ไฟล์นั้นจะ Copy หรือไม่ จะ link กับ Project อะไรยังไง ก็ให้ลองสังเกตด้านล่างครับ ว่าจะมีถาม Target ไหนด้วย เราก็สามารถเพิ่ม Resource ให้กับแต่ละ Target ผ่านทางนี้ได้เช่นกัน

addtoproj.png

อันนี้เป็นผลพลอยได้ของการสร้าง Target ตั้งแต่แรกๆครับ ส่วนถ้าไม่ได้ทำไว้แต่แรกก็ต้องมาลกาเพิ่มเอาเอง หรืออีกวิธีนึงคือ Duplicate target เอาแล้วค่อยเพิ่ม/ตัดออก เอาก็ยังได้ แต่วิธีนี้ต้อง config อะไรเยอะหน่อยเพื่อไม่ให้มันทับกัน และผมจะไม่ขอพูดถึงในที่นี้นะครับ มันค่อนข้างเยอะ

ต่อไปเป็นวิธีการเลือก Target วิธีการไม่ยากเลย กำหนดเอาที่ปุ่มด้านซ้ายบน กดแล้วจะขึ้น Menu ขึ้นมา ก็เลือก Target ที่ต้องการ build แค่นี้แหละครับ เสร็จแล้ว ง่ายจัง

settarget.png

เราได้ Target ใหม่แล้วสามารถ Config ได้ตามต้องการ คราวนี้เราจะสามารถใช้ source code เดียวกันแต่กำหนดการทำงานให้ต่างกันตาม target ได้หรือไม่ เพราะไม่งั้นการสร้าง target ก็ไม่มีประโยชน์อะไรเท่าไหร่ เพราะต้องเขียน class มากกว่ารอบเดียวขึ้นไปอยู่ดี ? คำตอบคือ “ได้ครับ” วิธีการที่ผมใช้ก็คือ “การตั้ง Tag ให้ Target แล้วเขียน source code กำหนดไปแต่ละ target โดยดูค่าจาก tag นั่นแหละ” (งงมั้ยเนี่ย)

ขั้นตอนก็คือ ไปตั้ง Tag ให้ Target โดยการ Double click ที่ target ที่ต้องการตั้ง tag (ขอเรียกแบบนี้แล้วกัน) ไปที่ Tab build แล้ว search Setting ว่า Other C Flags (อยู่ใน GCC 4.2 Language ครับ) ตั้งค่าเป็น “-DTARGET_NAME=1” ค่าหลังเครื่องหมาย = ก็แล้วแต่จะตั้งนะครับ

targetname.png

จากนั้นในส่วนของ Source code ที่ต้องการให้มีความแตกต่างในแต่ละ Target ก็จะใช้คำสั่ง #if เข้ามาช่วยครับ คำสั่งนี้จะเป็น if ในระดับของการ build เท่านั้น ไม่เกี่ยวกับ application logic ครับ ตัวอย่างการโค้ดก็เป็นแบบนี้

// Implement for each target

#if TARGET_NAME == 1
[aButton setHidden:NO];
[bButton setHidden:NO];
#elif TARGET_NAME == 2
[aButton setHidden:YES];
[bButton setHidden:NO];
#else
[aButton setHidden:YES];
[bButton setHidden:YES];
#endif

จากโค้ดตัวอย่างเป็นการ implement ง่ายๆนะครับ แค่ทำให้ดูว่า คำสั่ง #if, #elif, #endif รูปแบบเป็นไงบ้าง น่าจะพอเห็นภาพนะครับ

สำหรับ Entry นี้ก็คงจะพอแค่นี้นะครับ Entry หลังๆเกี่ยวกับ Target และ iPad ไว้ได้ลองของจริงแล้วจะเอามาแชร์ให้กันอีกนะครับ ตอนนี้ก็ happy coding สวัสดีครับ ;)

เมษายน 10, 2010 at 4:57 pm ใส่ความเห็น

Array in Objective-C & How to shuffle members

Class Array container ในภาษา Objective-C คือ NSArray และ NSMutableArray (จริงๆมีอีกอย่างคือ NSArrayController แต่ตอนนี้ยังมีอยู่ใน Cocoa เท่านั้น ไม่มีใน iPhone) ซึ่งความต่างระหว่าง NSArray และ NSMutableArray ก็คือ “ความสามารถในการแก้ไขภายหลังการ Initialize แล้ว” พูดง่ายๆ NSArray มี access attribute เป็น read-only แต่ NSMutableArray เป็น read-write นั่นเอง

คำถามต่อมาคือ “แล้วใช้ตัวไหนดี?” คำตอบก็คือ “ใช้ได้ทั้งคู่ครับ แตกต่างกันที่ Performance เล็กน้อยเท่านั้น” โดยส่วนตัวผมใช้ตามความสะดวก ถ้าจำเป็นต้อง read-write ก็ใช้ NSMutableArray ซึ่งการใช้งาน NSMutableArray ก็ดูตาม Document ได้เลย

อย่างที่บอกว่า NSMutableArray สามารถแก้ไขหลังจาก Initialize ได้ ดังนั้นแน่นอนว่า “ต้อง sort ได้ด้วย” ซึ่งใน Entry นี้ผมจะนำเสนอการ sort แบบ Random ผมต้องการ sort members ใน mutable array แบบสุ่ม ผมสามารถทำได้ดังนี้

int randomSort(id obj1, id obj2, void *context ) {
    // returns random number -1 0 1
    return (arc4random()%3 - 1);
}

- (void)shuffle {
    // call custom sort function
    NSMutableArray *puzzles = [NSMutableArray arrayWithObject:@"1", @"2", @"3", @"4", @"5", nil];
    [puzzles sortUsingFunction:randomSort context:nil];

    NSLog(@"Members after shuffle = %@", puzzles); 
}

จากโค้ด ผมสร้าง mutable array ขึ้นมา 1 ชุดแล้วสั่งให้ sort ด้วยฟังก์ชั่น randomSort ซึ่งใน randomSort จะทำการสุ่มค่า 3 ค่า คือ -1, 0, 1 ซึ่ง -1 หมายถึง การเรียงแบบตามลำดับ(NSOrderAscending) 0 หมายถึง การเรียงแบบปกติ (NSOrderSame) และ 1  หมายถึงการเรียงแบบกลับด้าน(NSOrderDescending) ซึ่งฟังก์ชั่น sort จะจัดลำดับของ member แต่ละตัวจากผลที่ได้จากสุ่มนั่นเอง

ส่วน arc4random เป็นฟังก์ชั่นสุ่มของ ภาษา C ครับ การใช้คำสั่ง rand() หรือ random() มันเป็นการสุ่มที่ไม่ dynamic เท่าไหร่นัก ผลลัพธ์ที่ได้จากการสุ่มจะเหมือนกันทุกครั้ง

เพียงเท่านี้เราก็สามารถสุ่มสมาชิกใน mutable array ได้แล้ว นอกจากนี้ยังมีการ sort อื่นๆได้อีกนะครับ เจออันไหนน่าสนใจผมจะมาแนะนำอีกใน Entry ต่อๆไปนะครับ

#reference http://stackoverflow.com/questions/56648/whats-the-best-way-to-shuffle-an-nsmutablearray

กุมภาพันธ์ 4, 2010 at 12:45 am ใส่ความเห็น

XCode custom template

…กลับมาแล้วครับ

กลับมาแล้วสำหรับ Entry iPhone Development แต่คราวนี้จะกลับมาเขียนที่นี่ที่เดิม เพราะ Host ของเวบ i-gee กำลังจะหมดอายุแล้ว แล้วผมเองก็ไม่ได้ทำอะไรกับมันมากซะด้วย คิดว่าจะไม่ต่ออายุและปล่อยให้มันหมดไป ถ้าจะเปิด Web ใหม่อีกครั้ง คงหา Community ให้ได้ซักจำนวนหนึ่งก่อน แล้วมาช่วยๆกันเขียนดีกว่า ใครสนใจก็คุยกันได้นะครับ

กลับมาคราวนี้ เริ่มต้นกันที่เรื่องที่(ดูเหมือนจะ)ยาก แต่จริงๆแล้วง่ายมากๆ และใช้ประโยชน์ได้มากด้วยเช่นกัน เรื่องนั้นก็คือเรื่องของ Template

โดยปกติแล้ว apple จะมี Template สำหรับการพัฒนา Application แบบต่างๆมาให้เราใช้ เช่นแบบ View-based, Tableview-based etc… ซึ่ง โดยปกติแล้ว เวลาเราเริ่มโปรเจคก็จะเริ่มกันจาก Template พวกนี้ แต่ถ้างานของเรามันนอกเหนือจาก Template ที่ Apple ให้มา

อย่างเช่นงานที่ผมทำอยู่ Application ของ True ทุกตัว จะมี Intro screen, Splash screen ของ Application (ซึ่งผิดหลัก HIG ของ Apple ทุกอย่าง) ซึ่งหมายความว่า ผมจะต้องใส่พวกนี้ซ้ำๆทุกครั้งที่มีการเริ่มโปรเจคใหม่ ซึ่งข้อเสียก็คือ 1) เสียเวลา 2) อาจจะลืมใส่หรือลืม Config ค่าบางอย่าง ซึ่งถ้าไอพวกที่ต้องใส่นี้ถูกใส่ไปตั้งแต่สร้างโปรเจค ปัญหาและ defect เรื่องเดิมๆพวกนี้ก็จะหมดไป

นอกจากนั้นยังมีประโยชน์แบบอื่นๆ (อย่างเช่นเรื่องของการทำ Test Case ที่ผมจะเขียนใน Entry หลังๆ) อีกครับที่ได้จากการทำ Template

ดังนั้น สร้าง Template ไว้ใช้เองกันดีกว่า

เริ่มจาก สำหรับ Snow Leopard ไฟล์ Template ของ XCode จะถูกเก็บอยู่ที่ /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode ภายใน Folder นี้ก็จะมี Template ต่างๆ ซึ่งที่เรากำลังจำทำเป็น Project Template ก็เข้าไปที่ Folder Project Templates/Application

จะพบ Template หลายแบบมากมาย การจะสร้าง Template ของเรา วิธีที่ง่ายที่สุดของเราก็คือ “Copy” Template แบบที่ใกล้เคียงของเรามากที่สุดครับ จากนั้น ตั้งชื่อ Folder ก็จะเป็นการตั้งชื่อ Template ของเราแล้ว ตอนนี้ ถ้าลอง Create New Project ใน XCode ก็จะเจอ Template ของเราแล้วครับ

ให้เรา เปิดไฟล์ ___PROJECTNAME___.xcodeproj และแก้ไข Template ตามที่ต้องการครับ จะแอด Library, Framework, Config compiler ยังไงก็ตามต้องการเลย ส่วนตรงไหนที่ต้องการให้ Dynamic ตามชื่อของโปรเจคที่ถูกสร้างก็ใส่ prefix ชื่อ ___PROJECTNAME___ เข้าไปครับ

เท่านี้ก็เสร็จแล้ว หลังจากนี้ เราก็สามารถสร้าง Project ด้วย Template ของคุณเองได้แล้ว ง่ายมากเลยใช่มั้ยครับ แต่ถ้ายังไม่ทำให้คุณรู้สึกเป็นเจ้าของของมัน (เพราะแค่ Copy มาแล้วแก้เอา) คุณก็สามารถระบุ Description และเปลี่ยน Icon Image ได้ด้วย

วิธีการก็คือ ให้คลิกขวาที่ ___PROJECTNAME___.xcodeproj แล้วเลือก Show Package Contents คราวนี้ละครับ ถ้าต้องการเปลี่ยน Description ของ Template ของเรายังไง ก็เปลี่ยนในไฟล์ TemplateInfo.plist ได้เลย

ส่วนรูปภาพ ก็ให้ใช้โปรแกรม Icon Composer (อยู่ที่ /Developer/Applications/Utilities) สร้างไฟล์ icns ขึ้นมา วิธีการใช้โปรแกรมนี้ก็ง่ายมาก แค่เอารูปภาพที่มีขนาด 512×512 ใส่ลงไปในช่อง 512 หรือถ้ามีขนาดเล็กกว่านั้นก็ใส่ช่องเล็กกว่านั้นหรือใส่ช่องใหญ่ไปด้วยก็ได้ จากนั้นก็ Save as.. ที่ path ที่ต้องการ ซึ่งสำหรับ template ก็ตั้งชื่อเป็น “TemplateIcon.icns” ด้วย จากนั้นก็เอาไปใส่แทนรูป Logo template ที่เราต้องการจะเปลี่ยน แค่นี้ก็เรียบร้อยครับ

เป็นไงครับ ง่ายๆแต่ได้ผล แค่นี้เราก็มี Template ไว้ใช้เองแล้ว สำหรับ Entry นี้ก็ขอจบไว้แค่นี้ Happy coding with your template ครับ ;)

มกราคม 26, 2010 at 2:21 pm 2 ของความคิดเห็น

iPhone Train Center

ตอนนี้เห็นหลายๆคนถามผมว่า “รับ Train เขียน App บน iPhone มั้ยครับ” ซึ่งถ้าเป็นเมื่อก่อน(ที่ยังไม่ได้ทำงานประจำ)ก็คงจะรับ Train อยู่ แต่ตอนนี้ทำงานประจำแล้ว ก็คงต้อง “จำใจไม่รับ Train นะครับ” ต้องขออภัยจริงๆ เอาเป็นว่าผมเองก็คงช่วยได้จากการเขียนโพสเป็นหัวข้อใน Blog นี่ละกันนะครับ มีปัญหาอะไรก็โพสเข้ามาถามกัน จะพยายามช่วยหาคำตอบมาให้นะครับ อ้อ ถามใน www.i-gee.co.cc นะครับ เวบนั้นผมอยากให้มันเป็นศูนย์รวม iPhone Dev จริงๆ(ส่วนเรื่อง url ไว้จะเปลี่ยนมันทีหลังนะครับ)

จากหัวข้อเรื่อง ก็คือตอนนี้ถึงผมจะไม่ได้รับ Train iPhone Programming แต่ตอนนี้ก็มีที่ที่รับ Train นะครับ คือที่ทรู ตอนนี้เริ่มเปิด Training สำหรับผู้สนใจพัฒนา App บน iPhone แล้วนะครับ รายละเอียดดูได้ที่ http://www.trueappcenter.com/ โดยสิ่งที่ต้องมีคือ Mac (จริงหรือเถื่อนก็ได้ครับ) กับความรู้เรื่อง Objective-C สำหรับคนที่อยากได้ Training Course ถ้าสนใจก็ลองติดต่อไปทางทรูได้ครับ

ส่วนใครอยากศึกษากับผมก็ Train กันผ่าน Blog ก็แล้วกันนะครับ :P

มิถุนายน 24, 2009 at 11:46 pm ใส่ความเห็น

Older Posts


del.icio.us For iPhone dev

Post Calendar

กันยายน 2019
พฤ อา
« ธ.ค.    
 1
2345678
9101112131415
16171819202122
23242526272829
30