Posts

เมื่อวันสิ้นปีมาถึง Happening in 2015

Image
1. #วืด และคนอยากกล่าวถึง           ความทรงจำสีจาง ในครั้งแรกที่เรา 6 คนเจอกัน "เปียโน สิงโต บีม พลอย แคท และเรา" เหมือนว่าจะมาคุยกันเรื่องพลอยอยากทำ Planney (และสุดท้ายก็ไม่ได้ทำ) เราเป็นกลุ่มที่ว่างตรงกันยากมาก เนื่องจากทุกคน มาจากการที่ทุกคนมีกลุ่มเพื่อนอยู่แล้ว เจอกันบ้าง ไม่เจอกันบ้าง แต่ก็พยายามหาเวลามาเจอกัน แอบรู้สึกได้ว่าจะเป็นกลุ่มเพื่อนที่น่าจะอยู่ด้วยกันไปอีกสักพักเลยล่ะ...           หลายๆ คนก็กลับมาเจอกัน สนิทกัน ในปีนี้ จริงๆ "ทูน น้ำ บาส" นี่คุยกันตลอดอยู่แล้วนะ แต่ปีนี้ เราได้ไปเที่ยวด้วยกันด้วยนะ เป็นทริปแรกที่เราเดินทางกับเพื่อน ดีใจครั้งแรก ได้เที่ยวกับเพื่อนที่เรียกได้ว่าสนิทที่สุด (จริงๆ ไอสองคนนี้แหละ ที่เกิดปัญหา ทำให้เราต้องเดินทางคนเดียวตอนไปญี่ปุ่นปีที่แล้ว) คุยกันได้ทุกเรื่องในชีวิต           เพื่อนการเดินทางในปีนี้ไม่ได้มีอะไรพิเศษมาก หลายๆ คนที่เจอในทริป ก็คุยกันแบบผ่านๆ แต่คนเข้ามาอยู่ในความทรงจำคงเป็น Staff ที่ Toco: Tokyo Heritage Hostel ที่ผ่านมา ซึ่งเป็น Hostel ท...

ป่ะ ไป BarCamp Bangkhen ปีนี้กัน

Image
ขอเชิญผู้สนใจทุกท่านร่วมงาน BarCamp Bangkhen 2015 > บาร์แคมป์คืออะไร? บาร์แคมป์เป็นงานชุมนุมรวมกลุ่มสำหรับผู้ที่สนใจแบ่งปันความรู้ ประสบการณ์ หรือเรื่องราวต่างๆให้ผู้ร่วมงานคนอื่นๆ ได้ฟังกัน งานนี้ไม่มีการกำหนดหัวข้อเอาไว้ล่วงหน้า ผู้ร่วมงานทุกคนจะเป็นผู้กำหนดหัวข้อในงาน > ใครคือผู้ร่วมงาน คุณไงละ! งานของเราจะขาดคุณซึ่งเป็นผู้แบ่งปันเรื่องราวดีๆไปไม่ได้ > จัดที่ไหน เมื่อไหร่ ยังไง จัดขึ้นในวันอาทิตย์ที่ 22 พฤศจิกายน พ.ศ.  2558 ณ อาคารนานาชาติ 17 (IUP) คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเกษตรศาสตร์ หรือดูแผนที่จาก Google Map ได้เลย > ทำไมต้องมาด้วยล่ะ? เราไม่จำกัดหัวข้อในการนำเสนอ ถ้าคุณมีเรื่องราวที่สนใจอยากพูดคุย คุณสามารถเสนอหัวข้อที่ต้องการได้เลย แต่หากคุณยังคิดไม่ออก คุณก็สามารถเลือกหัวข้อที่คนอื่นเสนอ และเข้าไปร่วมพูดคุยได้ หัวข้อในงานของเรามีความหลากหลายแตกต่างกันไป หัวข้อที่ถูกเลือกอาจจะเกี่ยวกับเทคโนโลยี, ทริปท่องเที่ยว, สอนธุรกิจ, รีวิวเกมส์, เอาตัวรอดในดินแดนซอมบี้ และอื่นๆอีกมากมาย สามารถลงทะเบียนร่วมงานได้ที่  www.barcampbangkhe...

New way to deal with 'Forgot your password'

Image
จากงาน WWDC ปีนี้ 1 Feature บน iOS 9 ที่น่าสนใจและถูกใจใครหลายๆ คนมาก คือ Univeral Links บน iOS 9 SDK อธิบายง่ายๆ มันคือ Feature ที่ทำให้เราสามารถเปิดแอปของเราผ่าน URL ปกติที่เราใช้ทั่วไปได้นั่นเอง (HTTP, HTTPS Protocol) เช่น ถ้าคุณกดเข้าไปที่ https://twitter.com/imacbaszii แทนที่มันจะเปิด Safari ให้แต่มันกลับเปิด Twitter ในเครื่องให้เลย นั่นล่ะครับ Universal Links สำหรับเรื่องความปลอดภัย คุณจะต้องทำการโยนไฟล์ JSON ตามรูปแบบที่ Apple กำหนดไปใน Server ซึ่งจะมี App ID ประกอบอยู่ด้วย เพื่อตรวจสอบว่า URL นั้นเป็นของบริการของคุณจริงๆ ตัวอย่างเช่น Tweetbot (Twitter Client ชื่อดัง) จะไม่สามารถกระทำการใดๆ กับ link จาก twitter.com ได้ นอกเสียจากว่า Twitter จะอนุญาติและใส่ App ID ให้ Tweetbot บน Server ของตัวเอง สำหรับ 3rd Party App ก็อาจจะรู้สึกรำคาญใจกับการจัดการตรงนี้สักหน่อย ไม่มีทางที่ Twitter จะทำแบบนั้นให้ Tweetbot เด็ดขาด แต่ทั้งนี้ทั้งนั้นก็เป็นเรื่องของความปลอดภัย สำหรับ App ของตัวเองนั้น คุณต้องเข้าใจก่อนว่า Universal Links ไม่ได้ทำมาเพื่อแบรนด์ของคุณตรงๆ หรือเพิ่มความน...

Refactor Your iOS Test with Useful Technique

Image
เมื่อเราเขียน Test มากขึ้น Test ของเราก็มีขนาดใหญ่มากขึ้น และเมื่อเรา Refactor โค้ดได้ เราก็ควร Refactor Test ได้ด้วยเช่นกัน วันนี้มีตัวอย่างเล็กๆ มาให้ดูกัน เราคงคุ้นชินกับคำสั่ง Assertion ต่างๆ ที่เราใช้กันในเทส และมันจะดีมาก ถ้าเราสามารถเขียนโค้ดที่นำกลับมาใช้ใหม่ได้ กับพวกคำสั่ง Assertion ได้ ตัวอย่างที่ผมจะนำมาเล่าให้อ่านกันมาจากของใหม่บน Xcode 7 นั่นคือ UI Testing นั่นเอง Wait for the Code .... จากตัวอย่างคือการตรวจสอบว่า Element หรือ UI ที่เราต้องการทดสอบปรากฎอยู่บนหน้าจอภายใน 5 วินาทีหรือไม่ ซึ่งเป็นกรณีทั่วไปมากที่เราใช้ในการทำ Automated UI Testing ดังนั้น เราน่าจะ Refactor มันเป็นแบบนี้ได้ Wait for the Code .... คราวนี้เราก็สามารถเรียกใช้ผ่านฟังก์ชั่น waitForElementToAppear(app.cells["someElementIdentifer"]) ได้เลย แล้วจะเกิดอะไรขึ้นถ้าเทสเกิด Fail ขึ้นมา ? เราจะเห็นว่ามันดูไม่ค่อยดีเท่าไหร่ ที่มันดันไปพ่นข้อความของความผิดพลาดที่เกิดขึ้นตรง Helper Function เราซะงั้น ทำให้เราไม่รู้ว่า ตกลงมันเกิดความผิดพลาดจากตรงไหนกันแน่ จริงๆ แล้ว...

Using Cocoapods with watchOS 2

Image
ผมมีโปรเจคหนึ่งที่ต้องลองเล่นกับ Watch OS 2 ที่พึ่งออกอัพเดทมาในงานที่ผ่านมา และพบว่าใช้ Cocoapods เปลี่ยนไปไม่เหมือนเดิม ก็เลยต้องมานั่งแก้ปัญหา เลยอยากจะ Blog เก็บไว้หน่อย โดยการแก้ไขที่ออกมาตั้งแต่ Cocoapods 0.38 Beta 1 นะครับ (ปัจจุบัน 0.39 แล้วหล่ะ) สิ่งที่ต่างไปจากเดิมคือ Xcode จะมอง Watch OS เป็น Platform ที่แยกตัวออกมาต่างหาก เนื่องจากเมื่อก่อนนั้น Watch App เป็นเพียงแค่ Extension ของ App หลักเท่านั้น และใช้ Data Store ร่วมกัน แต่ตอนนี้มันแยกออกมาเลย ตัวโค้ดของ Watch Extension จะอยู่ในตัว Apple Watch ดังภาพ ดังนั้น ถ้าเราใช้ Cocoapods แบบปกติ ก็อาจจะเจอข้อความประมาณนี้ Target ‘Pods-MyWatchExtension’ of project ‘Pods’ was rejected as an implicit dependency for ‘Pods_MyWatchExtension.framework’ because it doesn’t contain platform ‘watchsimulator’ in its SUPPORTED_PLATFORMS ‘iphonesimulator, iphoneos’ และแน่นอนว่า Cocoapods จะมองไม่เห็น 3rd Party Library ของเรา คราวนี้วิธีการซ่อม เราต้องทำ 2 ขั้นตอนหลักคือ 1. ต้องให้ 3rd Party Library ทำการอัพเดท Podspec เพื่อใ...

Understanding Functors, Applicatives and Monads in Swift

Image
นี่คือตัวเลขธรรมดาๆ อาจหมายถึงค่าใดๆ (value) หรืออาจถูกชี้ด้วยสิ่งที่เราเรียกว่า "ตัวแปร" และพวกเรารู้วิธีการเรียกใช้ฟังก์ชั่นกับค่าดังกล่าว จากนั้น ลองคิดว่าค่าดังกล่าวอยู่ใน Context สักที่หนึ่ง (เราอาจจะจินตนาการเป็นกล่องที่มีค่าใดๆ อยู่ด้านในก็ได้) คราวนี้เมื่อเราพยายามจะเรียกใช้ฟังก์ชั่นกับค่าดังกล่าว เราอาจจะได้ผลลัพธ์ที่แตกต่างออกไปขึ้นอยู่กับ Context ที่มันอยู่ นี่คือพื้นฐานแนวคิดของ Functors, Applicatives และ Monads ซึ่ง Optional Type ใน Swift ประกาศ Context ไว้ 2 แบบนั่นคือ Coding .... อีกไม่นาน เราจะได้เห็นกันว่า .Some(T) กับ .None แตกต่างกันอย่างไร แต่ก่อนอื่นเรามาพูดถึง Functors กันก่อน Functors เมื่อค่านั้นๆ ถูกห่อหุ้มด้วย Context ใดๆ เราไม่สามารถที่จะนำค่านั้นมาใช้กับฟังก์ชั่นตรงๆ ได้ ดังนั้น map จึงเข้ามา (fmap ใน Haskell) map รู้วิธีว่าจะสามารถใช้ฟังก์ชั่นกับค่าที่อยู่ด้านในกล่องได้อย่างไร (ผมอาจจะพิมพ์ "กล่อง" กับ "Context" สลับไปมา ขอให้เข้าใจว่ามันคือสิ่งเดียวกัน) ตัวอย่างเช่น ถ้าเราต้องการใช้ฟังก์ชั่...