<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Sopana Thitipariwat on Medium]]></title>
        <description><![CDATA[Stories by Sopana Thitipariwat on Medium]]></description>
        <link>https://medium.com/@sopanathitipariwat?source=rss-ec691621afd0------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*yARYcUJN4ZAUg_SQ.</url>
            <title>Stories by Sopana Thitipariwat on Medium</title>
            <link>https://medium.com/@sopanathitipariwat?source=rss-ec691621afd0------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 17:39:39 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@sopanathitipariwat/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Let’s play with `DispatchGroup`]]></title>
            <link>https://medium.com/@sopanathitipariwat/lets-play-with-dispatchgroup-acca253fdeb7?source=rss-ec691621afd0------2</link>
            <guid isPermaLink="false">https://medium.com/p/acca253fdeb7</guid>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[swift]]></category>
            <dc:creator><![CDATA[Sopana Thitipariwat]]></dc:creator>
            <pubDate>Thu, 17 Sep 2020 07:48:58 GMT</pubDate>
            <atom:updated>2020-09-17T07:50:43.390Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*IaPrqkzUo3yG63dP" /><figcaption>Photo by <a href="https://unsplash.com/@thaiscord?utm_source=medium&amp;utm_medium=referral">Thais Cordeiro</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>เราเจ็บปวดกันมากี่ครั้งแล้ว กับ…..</p><pre><strong>func</strong> doSomething() {</pre><pre>  ...<br>  <strong>requestAPI</strong> {<br>    ...<br>    <em>print(&quot;1&quot;)</em><br>    ...<br>    <strong>requestAPI</strong> {<br>      ...<br>      <em>print(&quot;2&quot;)</em><br>      ...<br>      <strong>requestAPI</strong> {<br>        ...<br>        <em>print(&quot;3&quot;)</em><br>        ...<br>        <strong>requestAPI</strong> {<br>          ...<br>          <em>print(&quot;Done&quot;)<br>          ...</em><br>        }<br>      }<br>    }<br>  }</pre><pre>}</pre><p>มีอยู่วันนึงเราทนไม่ไหว พยายามหาวิธีที่จะหลีกเลี่ยงการทำอะไรแบบนี้<br>และแล้วก็มีผู้เบิกทางสว่างให้รู้จักกับวิธีการอัศจรรย์ ด้วยDispathGroup ค่า</p><blockquote>see <a href="https://stackoverflow.com/a/42484670">https://stackoverflow.com/a/42484670</a></blockquote><p>โอ้โห…เปิดโลกมาก ทำให้ชีวิตสบายขึ้นเยอะเลย<br>จาก code ตัวอย่างที่เป็น chain แบบ pyramid ก็สามารถแก้เป็นแบบข้างล่างนี้ได้</p><pre><strong>func</strong> doSomething() {</pre><pre><strong>  let</strong> group = DispatchGroup()<br>  group.enter()</pre><pre>  ...<br>  <strong>requestAPI</strong> {<br>    <em>print(&quot;1&quot;)</em><br>    group.leave()<br>  }</pre><pre>  group.wait()<br>  ...</pre><pre>  group.enter()<br>  <strong>requestAPI</strong> {<br>    <em>print(&quot;2&quot;)</em><br>    group.leave()<br>  }</pre><pre>  group.wait()<br>  ...</pre><pre>  group.enter()<br>  <strong>requestAPI</strong> {<br>    <em>print(&quot;3&quot;)</em><br>    group.leave()<br>  }</pre><pre>  group.wait()<br>  ...</pre><pre>  group.enter()<br>  <strong>requestAPI</strong> {<br>    <em>print(&quot;Done&quot;)<br>    </em>group.leave()<br>  }</pre><pre>}</pre><p>และแล้วปีระมิดก็หายไปแล้ว … เย้ ^^</p><p>หวังว่าจะเป็นประโยชน์ให้คนที่มีปัญหาแบบเดียวกันนะคะ ❤</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=acca253fdeb7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Amazing `enum` in Swift]]></title>
            <link>https://medium.com/@sopanathitipariwat/amazing-enum-in-swift-159a1fbff18?source=rss-ec691621afd0------2</link>
            <guid isPermaLink="false">https://medium.com/p/159a1fbff18</guid>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[enumeration]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Sopana Thitipariwat]]></dc:creator>
            <pubDate>Wed, 26 Feb 2020 15:48:56 GMT</pubDate>
            <atom:updated>2020-02-27T00:17:05.125Z</atom:updated>
            <content:encoded><![CDATA[<p>ห่างหายไปนานกับการเขียน blog วันนี้นึกขึ้นได้ ลงมือทำสักหน่อยละกันเนอะ !!!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*DnQkDFcth14xyaWH" /><figcaption>Photo by <a href="https://unsplash.com/@guibolduc?utm_source=medium&amp;utm_medium=referral">Guillaume Bolduc</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>`enum` คือ อะไร?</h3><p>enum เป็นการกำหนดค่าคงที่ขึ้นมาชุดหนึ่ง เพื่อให้สะดวกต่อความเข้าใจในการเขียนโปรแกรม</p><p>เช่น</p><p>ถ้าเราเขียนบัญชีรายรับรายจ่าย ในแต่ละรายการจะสามารถเป็นได้อย่างใดอย่างใน คือ รายรับ หรือ รายจ่าย ดังนั้นเราจะ กำหนดง่ายๆแบบนี้ว่า</p><p>1 = รายรับ, 2 = รายจ่าย</p><p>ถ้าเราไม่ใช้ enum ก็จะเป็นประมาณนี้</p><pre><strong>struct</strong> Revenue {<br>    <strong>var</strong> title: String<br>    <strong>var</strong> type: Int<br>}</pre><pre><strong>let</strong> salary: Revenue = Revenue(title: “Salary”, type: 1)<br><strong>let</strong> coffee: Revenue = Revenue(title: “Coffee”, type: 2)</pre><p>งั้นมาประกาศ enum กัน ใน Swift จะได้แบบนี้</p><pre><strong>enum</strong> Revenue : Int {<br>    <strong>case</strong> income = 1<br>    <strong>case</strong> expense = 2<br>}</pre><p>ลองแก้ code ข้างบนเป็น enum จะเป็นแบบนี้</p><pre><strong>struct</strong> Revenue {<br>    <strong>var</strong> title: String<br>    <strong>var</strong> type: RevenueType<br>}</pre><pre><strong>let</strong> salary: Revenue = Revenue(title: “Salary”, type: .income)<br><strong>let</strong> coffee: Revenue = Revenue(title: “Coffee”, type: .expense)</pre><p>ที่นี้ code ก็ดูเข้าใจง่ายขึ้นแล้ว ไม่ต้องเดาว่า 1 คืออะไร 2 คืออะไรอีกต่อ …​แต่ ไม่ใช่แค่นั้น เราสามารถใช้ enum กับข้อมูลอื่นๆ เช่น String ก็ได้ โดยส่วนใหญ่ที่นิยมใช้กันก็คือ CodingKeys ที่ใช้แปลงข้อมูลของ JSON เป็น model object ผ่าน protocol Decodable</p><pre><strong>enum</strong> CodingKeys : String {<br>    <strong>case</strong> customerData = <em>“customer_data”</em><br>    <strong>case</strong> items<br>}</pre><p>หรือจะประกาศ enum โดยไม่ต้องมีประเภทข้อมูลเลย ก็ยังได้ เช่น</p><pre><strong>enum</strong> Result {<br>    <strong>case</strong> success<br>    <strong>case</strong> error<br>}</pre><p>และการประกาศแบบนี้ยังมีลูกเล่นอย่างอื่นอีกเพียบเลย เดี๋ยวจะเล่าให้ฟังน้า</p><h3>`enum` มีดีอะไร?</h3><p>แน่นอนว่านอกจาก enum จะทำให้ชีวิตในการอ่าน code ดีขึ้นแล้วมันยังดีต่อการเขียน condition ต่างๆ อีกด้วย เช่นถ้าเรามี flag หลายตัว ที่ต้องเขียน if-else หลายชั้น เราสามารถใช้ enum แทนได้ เช่น</p><pre><strong>let</strong> myFile: MyFile = MyFile()</pre><pre><strong>if</strong> myFile.canRead {<br>    // do something…<br>}</pre><pre><strong>if</strong> myFile.canWrite {<br>    // do something…<br>}</pre><p>…ลองเปลี่ยนมาใช้ enum จะได้แบบนี้</p><pre><strong>enum</strong> FilePermission {<br><strong>    case</strong> readOnly<br><strong>    case</strong> readWrite<br>}</pre><pre><strong>switch</strong> myFile.permission {<br><strong>    case</strong> .readOnly:<br>        // do something…<br><strong>    case</strong> .readWrite:<br>        // do something…<br>}</pre><p>น่าจะช่วยให้การทำงานของพวกเราสะดวกขึ้นกว่าเดิมมากเลยทีเดียวนะ</p><h3>ความเก๋ของ `enum`</h3><p>ทีนี้เรามาเข้าเนื้อหาจริงๆกัน (สักที 555+) หลังจากอารัมภบทมาประมาณนึงแล้ว</p><p>อย่างที่ได้บอกไปตอนต้นแล้วว่า enum สามารถมีลูกเล่นได้อีกมากมายเรามาเริ่มกันเลยดีกว่า</p><blockquote>1) enum สามารถแนบข้อมูลไปใน case นั้นๆได้ (Associate values)</blockquote><pre><strong>enum</strong> Result {<br><strong>    case</strong> success<br><strong>    case</strong> error(Error)<br>}</pre><p>เวลาใช้งานก็จะช่วยให้สะดวกมากขึ้น เช่น ตอนเรียก API แล้วได้ error กลับมา เราจะสามารถนำ error ไปใช้งานต่อได้เลย</p><pre><strong>switch</strong> result {<br><strong>    case</strong> .success:<br>        // do something…<br><strong>    case</strong> .error(<strong>let</strong> error):<br>        // do something…<br>}</pre><p>หรือใน Alamofire เราก็น่าจะเคยเห็นผ่านตากันมาบ้าง ในที่นี้เค้าใช้ Generic มาช่วยในการส่งประเภทข้อมูลแบบ dynamic type ซึ่งจะอธิบายให้ฟังในวันหลังนะคะ</p><blockquote>Generic หมายถึง ตรง Value ที่แทนคำนี้ด้วยชื่อ class ที่ต้องการใช้งานได้เลย</blockquote><pre><strong>public</strong> <strong>enum</strong> Result&lt;Value&gt; {<br><strong>    case</strong> success(Value)<br><strong>    case</strong> failure(Error)</pre><pre>    . . .<br><strong>    public</strong> <strong>var</strong> value: Value? {<br><strong>        switch</strong> <strong>self</strong> {<br><strong>            case</strong> .success(<strong>let</strong> value):<br><strong>                return</strong> value<br><strong>            case</strong> .failure:<br><strong>                return</strong> <strong>nil<br></strong>        }<br>    }<br>}</pre><blockquote>2) enum สามารถมี function ของตัวเองได้เหมือนกันนะ</blockquote><pre><strong>enum</strong> OrderStatus : String {<br><strong>    case</strong> unknown = “”<br><strong>    case</strong> ordered<br><strong>    case</strong> paid<br><strong>    case</strong> shipped<br><strong>    case</strong> delivered</pre><pre><strong>    func</strong> label() -&gt; String {<br><strong>        switch</strong> <strong>self</strong> {<br><strong>            case</strong> .ordered:<br><strong>                return</strong> “Pending payment”<br><strong>            case</strong> .paid:<br><strong>                return</strong> “Ready for shipment”<br><strong>            case</strong>.shipped:<br><strong>                return</strong> “Order has been shipped”<br><strong>            case</strong> .delivered:<br><strong>                return</strong> “Success”<br><strong>            default</strong>:<br><strong>                return</strong> “Unknown status”<br>        }<br>    }</pre><pre>}</pre><pre><strong>let</strong> myOrder: Order = getMyOrder()<br><strong>let</strong> orderStatusLabel: String = myOrder.status.label()</pre><p>ในกรณีข้างบนนี้ เราสามารถระบุ text label สำหรับสถานะแต่ละสถานะของ order ได้ว่าต้องการให้แสดงผลอะไร โดยเรียกใช้ผ่านตัว enum ได้เลย</p><blockquote>3) enum จะแสดงประสิทธิภาพสูงสุดเมื่อใช้งานคู่กับ switch-case</blockquote><p>ปฏิเสธไม่ได้เลยว่า enum กับ switch-case นี่มันของคู่กัน บางครั้งเราอาจจะนอกใจไปหา if-else บ้าง แต่สุดท้ายสิ่งที่ส่วนมากจะตอบโจทย์ได้ดี ก็ต้อง switch-case นะ</p><p>เราสามารถใส่เงื่อนไขลงไป สำหรับ enum ที่เราใช้งานได้ เช่น</p><pre>switch result {<br>    case .success:<br>        // do something…<br><strong><em>    case .error(let error) where error.code == 404:<br></em></strong>        // do something…<br>    default:<br>        // do something…<br>}</pre><p>หรือใช้ fallthrough เพื่อทำงาน case ถัดไปได้</p><p>เช่น</p><pre>switch result {<br>    case .success:<br>        // do something…<br><strong><em>     case .error(let error) where error.code == 401:<br></em></strong>        // do something…<br>        <strong>fallthrough<br>    case .error(let error):<br></strong>        // do something…<br>}</pre><p>โดยปกติ switch-case ใน swift จะต้องระบุอย่างน้อย 1 statement เสมอ จะไม่ข้ามไป case ถัดไปอัตโนมัต ดังนั้นเมื่อจบ case เราไม่ต้องกลัวจะลืมเขียน break</p><blockquote>อ้างอิงจาก <br><a href="https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html">https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html</a></blockquote><blockquote>In Swift, switch statements don’t fall through the bottom of each case and into the next one. That is, the entire switch statement completes its execution as soon as the first matching case is completed. By contrast, C requires you to insert an explicit break statement at the end of every switch case to prevent fallthrough. Avoiding default fallthrough means that Swift switch statements are much more concise and predictable than their counterparts in C, and thus they avoid executing multiple switch cases by mistake.</blockquote><p>หมดแต่เพียงเท่านี้สำหรับลูกเล่นของ enum ใน swift ครั้งหน้าถ้านึกอะไรออกจะมาเขียนใหม่นะคะ … แล้วเจอกันใหม่ครั้งหน้าฮะ 😅</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=159a1fbff18" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Smart watch ในชีวิต (2014–2019) — Part 3]]></title>
            <link>https://medium.com/@sopanathitipariwat/smart-watch-%E0%B9%83%E0%B8%99%E0%B8%8A%E0%B8%B5%E0%B8%A7%E0%B8%B4%E0%B8%95-2014-2019-part-3-f7fa77fd5d09?source=rss-ec691621afd0------2</link>
            <guid isPermaLink="false">https://medium.com/p/f7fa77fd5d09</guid>
            <category><![CDATA[smartwatch]]></category>
            <category><![CDATA[inbody-watch]]></category>
            <category><![CDATA[michael-kors-watches]]></category>
            <dc:creator><![CDATA[Sopana Thitipariwat]]></dc:creator>
            <pubDate>Mon, 27 May 2019 10:00:04 GMT</pubDate>
            <atom:updated>2019-05-27T10:00:04.889Z</atom:updated>
            <content:encoded><![CDATA[<h3>Smart watch ในชีวิต (2014–2019) — Part 3</h3><p>…หายไปนาน กับกาลเวลา 🎵 กลับมาแล้วจ้า เรามาเริ่มกันต่อเถอะเนอะ</p><h3>3) Michael Kors — 2017</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*i85LEcC2auE8SSGB4rU_uw.jpeg" /><figcaption>MICHAEL KORS ACCESS</figcaption></figure><p>กลับมาอีกครั้งกับการต่อจากตอนที่แล้ว ด้วยนาฬิกาจากแบรนด์ MICHAEL KORS ตัวนี้ คือ Android wear ค่ะ ซื้อมาด้วยอารมณ์ล้วนๆ เพราะนางสวยดี คือไม่ได้สนฟีเจอร์ใดๆของนางเลย เพราะเดิม Apple watch ก็อยู่ได้วันเดียวอยู่แล้ว เลยสั่งมาด้วยความรวดเร็ว</p><p>แต่โชคดีที่นางใช้กับ iPhone ได้ เราก็เลยรอดไป (เพิ่งจะมาคิดได้ตอนจ่ายเงินไปแล้ว) พอของมาถึงแล้วลอง sync ดู ความตื่นเต้น drop ลงไป 20% เลย เพราะว่ามันยุ่งยากนิดหน่อย ไม่ง่ายแบบตอนใช้ Apple Watch (ก็แน่สิ มันไม่ใช่ค่ายเดียวกัน)</p><p>แต่หลังจากทำความคุ้นเคยกับนางไปสักพักก็ อืมม…. ดีนะ สวยดี หนักมากเว่อ แต่ก็ชอบตรงที่มีความเหมือนนาฬืกาดี ให้นางได้เป็นที่สองรองจาก Apple watch เพียงแค่เรื่องความหนักเท่านั้นเลย เพราะเราใส่ออกกำลังกายได้ไม่สะดวก (ถึงแม้ช่วงนั้นจะไม่ได้ออกกำลังกายเลยก็ตาม…. แหะๆ)</p><p>ตัวหน้าปัทเป็น Touch screen ที่จอไม่สวยมาก แต่ก็สวยดี ส่วนการทำงานกับนิ้วมือเรานั้นก็ค่อนข้างจะดื้อดึงพอสมควร แต่ก็พอไปได้ มีหน้าปัทให้เลือกหลายแบบ ใช้งานร่วมกันกับ Google Fit อยากได้อะไรก็จิ้มๆเอา</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*waiX-QawxZeMjm9AuEzmxA.jpeg" /></figure><p>ความเก๋อีกอย่างของนางคือ นางสามารถมีกำไลร่วมด้วยได้ เพราะแบรนด์นี้มันผู้หญิงๆ เนอะ ก็จะตามมาด้วย accessory มากมายที่ดูดีทีเดียว (เลยเว่ย แก) ใส่ไปแล้วก็ชอบใจ แค่ได้นั่งมองก็มีความสุข …. แต่เท่าที่จำได้เหมือนว่านางไม่ได้วัด HR นะ</p><p>ช่วงหลังๆ เริ่มใช้คู่กับมือถือ Android แทนก็อาการ sync ดีขึ้น เอ๋อน้อยลง (แต่ก็ยังคงเอ๋อ) พยายามต่อสู้กับนางอยู่นาน เพราะนางสวย แต่ก็ถือว่าเป็นตัวที่ใส่นานพอๆกับ Apple watch เลย</p><h3>4) inBody watch — 2016</h3><p>อาจจะมีคนสงสัย (หรืออาจจะไม่มี 555) ช่วงระหว่างหลังจากใช้ Apple watch ก่อนจะมาเป็น Michael Kors เนี่ย นิ่มก็มีไปแอบใช้นาฬิกาแบบสำหรับ track ร่างกายแบบจริงจังมาพักนึงเหมือนกัน นั่นก็คือ…. inBody watch นั่นเอง</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/980/1*yn_yZuuh_7S5swooIVjCAA.png" /><figcaption><a href="https://www.inbody.com/global/product/InBodyBAND_2.aspx">https://www.inbody.com/global/product/InBodyBAND_2.aspx</a></figcaption></figure><p>ตัวแรกที่เคยใส่จะหน้าตาประมาณนี้ วัด HR ได้ และนางวัดไขมันได้ด้วย แต่ไม่แม่นเท่าตัววัดไขมันในเครื่องชั่งน้ำหนักหรอกนะ เพราะนิ่มลองวัดคู่กันตลอด (ปล. เครื่องชั่งน้ำหนักตอนนั้นใช้เป็น TANITA แบบที่วัดไขมันได้ด้วย)</p><p>ตัวแอพฯที่ใช้เป็นภาษาไทย ใช้งานง่ายดี มีเมนูอาหารพร้อมแคลให้หรอกไปด้วยเลยทำให้มีวินัยในการควบคุมน้ำหนักอยู่พอสมควร ส่วนวิธีใช้งานนาฬิกาก็กดปุ่มข้างๆเอาได้ ใส่นอนได้ด้วย แบตก็ทนอยู่ได้หลายวันอยู่เหมือนกัน ไม่ต้องชาจทุกวัน</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/834/1*TngjwtDC1X7Sgr6ThjqF2g.png" /><figcaption><a href="http://www.bodykey.co.th/th_th/products/product-3.html">http://www.bodykey.co.th/th_th/products/product-3.html</a></figcaption></figure><p>ไม่นาน นางก็ออกรุ่นใหม่ ไฉไลกว่าเดิม เป็นหน้าปัทกลม และก็เป็น touch screen ด้วย ตัวนี้ดีหน่อยตรงที่นางมีความคล้ายนาฬิกามากขึ้นละ แถมสายก็สามารถเปลี่ยนเอาสายนาฬิกาทั่วไปมาใช้ด้วยกันได้ด้วย ส่วนเรื่องอื่นๆในการวัดค่าต่างๆนั้น เราว่าดีกว่ารุ่นแรกนิดหน่อย แต่ไม่ต่างกันมาก</p><p>รายละเอียดก็คล้ายกับนาฬิกาตามท้องตลาดทั่วไป ราคาไม่แพง ใช้ track กิจกรรมได้ดี ถือว่าโอเคสมราคาอยู่ ใครงบจำกัดก็ลองจัดหากันมาได้</p><p>ครั้งหน้าเราจะมาต่อกันด้วย Garmin และ Withings ส่วนวันนี้ก็ต้องขอลาไปก่อน</p><p>บายค่ะ….</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f7fa77fd5d09" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Smart watch ในชีวิต (2014–2017) — Part 2]]></title>
            <link>https://medium.com/@sopanathitipariwat/smart-watch-%E0%B9%83%E0%B8%99%E0%B8%8A%E0%B8%B5%E0%B8%A7%E0%B8%B4%E0%B8%95-2014-2017-part-2-699945dae51b?source=rss-ec691621afd0------2</link>
            <guid isPermaLink="false">https://medium.com/p/699945dae51b</guid>
            <dc:creator><![CDATA[Sopana Thitipariwat]]></dc:creator>
            <pubDate>Thu, 12 Oct 2017 01:53:03 GMT</pubDate>
            <atom:updated>2017-10-12T01:53:03.281Z</atom:updated>
            <content:encoded><![CDATA[<h3>2) Apple Watch — 2015</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/490/1*b_nji1Uw2S3B6oAgXmFtHg.jpeg" /><figcaption><a href="https://www.apple.com/lae/apple-watch-series-3/">https://www.apple.com/</a></figcaption></figure><p>หลังจากที่มี Smart watch จำนวนไม่น้อยเข้าสู่ตลาดกันอย่างต่อเนื่อง ทางด้าน Apple ก็ไม่น้อยหน้าปล่อย Apple Watch ออกสู่ตลาดเช่นเดียวกัน ซึ่งในแรกพบของเรานั้นเราไม่ชอบมากๆ เพราะว่ามันต้องชาร์จทุกวัน &gt;&lt;” (โอ้โห)</p><p>แต่ด้วยความที่ตอนนั้นเป็นฟรีแลนซ์เต็มตัว ลูกค้าเพิ่งซื้อมาแล้วเอามาให้ลองเล่นนู่นเล่นนี่ โอ้โห…..มันดีนะ ตอนนั้น Speech to text ก็รองรับภาษาไทยแล้วด้วยนิ่มถูกใจมากเพราะว่าตอนนั้นใช้เวลาบนรถค่อนข้างนาน คุยงานอะไร หรือคุย Line มักจะเกิดขึ้นตลอดเวลา ขับรถอยู่จะพิมก็ไม่ได้อีก ก็เลยเริ่มสนใจขึ้นมา</p><p>พอมีเวลาว่างนิ่มก็เดินแวะดูสักหน่อย iStudio ผู้โชคดีในวันนั้นคือ SPVi สาขา เซ็นทรัลแจ้งวัฒนะ โดยก่อนที่นิ่มจะเข้าไปได้ลองท้าทายตัวเองว่า ถ้าคนรอเยอะเข้าคิวานก็จะไม่ซื้อ และถ้าพนักงานสามารถทำให้ใจอ่อนจนซื้อเนี่ยก็ต้องเป็นตัวถูกสุดเท่านั้น และต้องเป็นสีที่ต้องการเท่านั้น ถ้าไม่ใช่ก็จะไม่เอา …. (นี่…เด็ดขาดน่าดู)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*p9-lQ3SimWi69TbNoSCw4A.jpeg" /><figcaption><a href="http://www.spvi.co.th/">http://www.spvi.co.th</a> — SPVi สาขา เซ็นทรัลแจงวัฒนะ</figcaption></figure><p>พอเดินไปถึงหน้าร้านปุ้บ … โอ้โหคนอย่างโล่งอะ ตกใจเลย ก็เลยเดินโฉบเข้าไปหน้าร้านนิดนึง พนักงานนี่รีบวิ่งมารับตั้งแต่ประตู นิ่มนี่งงเลยค่ะ เพราะว่าไม่เคยเจอแบบนี้ในไทยมาก่อนเลยนะ ตอนมาดูแมคมาดูไอโฟนก็ไม่เคยมาเจอแบบนี้อะ แปลกมาก</p><p>พนักงานพาไปโซน Apple Watch แล้วก็หยิบทุกโมเดลที่เป็นตัวโชว์มาให้ดูทีละอันๆ แล้วก็อธิบายสรรพคุณอีกร้อยแปดอย่างให้ฟัง …. ซึ่งเราก็ประทับใจนะ ถามอะไรไปตอบชัดเจนดี ไม่ได้ก็บอกเลยว่าทำไม่ได้ไม่มีลังเลอะไรเลย เอาใจไปเลยจ้ะ</p><p>แน่นอนเราก็เลยเหลือไม้ตายสุดท้าย ระบุสีและรุ่นไปว่ามีมั้ย ??? …… แล้วคำตอบก็คือ ??? … มีของเฉยเลยอะ นี่คือต้องซื้อแล้วสินะ ก็เลยรูดบัตรเครดิตไปแบบงงๆกลับบ้านไปทั้งอย่างงั้น</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1G4sjvHUB2717DO-_JFw6Q.png" /><figcaption><a href="https://www.apple.com/lae/apple-watch-series-3/">https://www.apple.com/lae/apple-watch-series-3/</a></figcaption></figure><p>ในส่วนของการทำงานของ Apple Watch คือดีมากมันรองรับไอโฟนได้ดีมากจริงๆ ทั้งฟังเพลง หรือ track การเคลื่อนไหว … วัด Heart rate ได้ จับเวลาได้ ลงแอพเพิ่มได้ และแอพที่สำหรับออกกำลังก็มีเยอะมาก คือตอนนั้นเราใส่เล่นฟิตเนสมันก็รู้หมดว่าเรากำลังออกกำลังกาย พอออกกำลังกายเสร็จมันก็รู้อีกว่าเราใช้ชีวิตปกติแล้ว นอกจากนี้ก็มี Maps และมีการเชื่อมต่อกับไอโฟนที่ดี คุยโทรศัพท์ได้ แชทได้โดยเฉพาะอย่างยิ่งใช้ตอนขับรถได้ไม่ต้องมองจอเลยดีมากกก …. แต่ว่ารุ่นแรกที่เราซื้อนี่ลงน้ำไม่ได้นะ …. คือ อาบน้ำได้แต่ว่ายน้ำไม่ได้อะ</p><p>ตัวนี้ซื้อมาก็ไม่ค่อยรู้สึกผิดบาป เพราะว่ามันทำอะไรได้หลายอย่างมากๆคุ้มราคา ส่วน Misfit ของเดิมก็ยังใช้คู่กันได้ เพราะว่าอันนี้พอจะนอนก็ต้องถอดมาชาจ เราก็ใส่ Misfit เพื่อ track การนอน ส่วนตอนจะลงน้ำก็ถอดเก็บในล๊อคเกอร์ แล้วก็เอา Misfit ใส่ลงน้ำแทน … มันก็ดูยุ่งยากไปหน่อยแต่ก็ไม่ได้แย่อะไร</p><p>และแน่นอนตัวนี้ไม่รองรับการทำงานคู่กับ Android นะคะ ต้อง iPhone เท่านั้น ส่วนรายละเอียดว่าต้องเป็น iPhone รุ่นไหนอันนี้ไปถาม iStudio ใกล้บ้านท่านได้เลยค่ะ เพราะว่าเค้ามีข้อมูลที่ถูกต้อง และเป็นล่าสุดรอมาเล่าให้ทุกคนฟังอยู่นะ อิอิ</p><p>ในหมู่นาฬิกาท้ังหมดในครอบครองของนิ่ม นิ่มให้ Apple Watch เป็นที่หนึ่งค่ะเลยในแง่ฟีเจอร์และการทำงาน นิ่มชอบมากจริงๆ … อย่างเดียวที่ไม่ชอบเลย นิ่มว่ามันไม่สวยอะ คือมันก็สวยนะ แต่ว่าไม่ได้สวยโดนใจขนาดแบบ เห้ย…สวย ไรงี้</p><p>… ก็เลยมีนาฬิกาอันที่สามตามมา เพราะความไม่รู้จักพอของตัวเอง (555) คราวนี้เป็นฝั่งของ Android wear บ้าง เพราะมันใช้ได้ทั้ง iOS และ Android นิ่มจะมาเล่าในมุมของ User ที่ใช้ Android wear บน iOS ก็แล้วกันนะคะ เจอกันตอนหน้าค่า :))</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=699945dae51b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Smart watch ในชีวิต (2014–2017) — Part 1]]></title>
            <link>https://medium.com/@sopanathitipariwat/smart-watch-%E0%B9%83%E0%B8%99%E0%B8%8A%E0%B8%B5%E0%B8%A7%E0%B8%B4%E0%B8%95-2014-2017-part-1-3f14aceeb619?source=rss-ec691621afd0------2</link>
            <guid isPermaLink="false">https://medium.com/p/3f14aceeb619</guid>
            <category><![CDATA[misfit]]></category>
            <category><![CDATA[smartwatch]]></category>
            <dc:creator><![CDATA[Sopana Thitipariwat]]></dc:creator>
            <pubDate>Wed, 11 Oct 2017 01:51:41 GMT</pubDate>
            <atom:updated>2017-10-11T01:55:58.724Z</atom:updated>
            <content:encoded><![CDATA[<p>หลายคนน่าจะเคยลองเล่น Smart watch กันมาบ้างแล้ว หลายคนก็มีในครอบครอง โดยคนที่เป็น iOS dev จำนวนไม่น้อยก็จะใช้ Apple watch แน่ๆอยู่แล้ว แต่บางคนก็ต่างออกไปแล้วแต่การใช้งาน แล้วแต่กิจกรรมต่างกันไป :)</p><p>ส่วนนิ่มเองใช้ smart watch ครั้งแรกเพราะว้าวตรงที่มันสวย (5555 แค่นั้นหรอ?) คือนาฬิกาทั่วไปมันก็จะมีเข็ม ไม่ก็มีตัวเลขแตกต่างกันไปตามแต่ละยี่ห้อแต่ละรุ่น จนมาสะดุดตาตรง Misfit เนี่ยแหละ เพราะว่ามันสวยจริงๆ(ในตอนนั้น) และเล็กดีด้วยถูกใจสุดๆ</p><h3>1) Misfit — 2014</h3><p>อันนี้ชอบมาก เวลาจะดูเวลาเอานิ้วแตะที่หน้าปัดสองคร้ังแล้วมันจะกระพริบสองจุด จุดแรกเป็นชั่วโมง จุดต่อมาเป็นนาที …. โอโห ล้ำมากสำหรับนิ่มตอนนั้นตื่นเต้นสุด ^^</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/575/1*GlHMl7tUwlxFK-H20NC4Xg.jpeg" /><figcaption><a href="https://www.indiegogo.com/projects/misfit-shine-an-elegant-wireless-activity-tracker#/">https://www.indiegogo.com/projects/misfit-shine-an-elegant-wireless-activity-tracker#/</a></figcaption></figure><p><a href="https://misfit.com/products/misfit-shine?color=grey">Misfit Shine Fitness + Sleep Tracker - Misfit</a></p><p>จุดเด่นอีกอย่างคือมันมีตัวคลิบมาให้ด้วย คือวันไหนนิ่มอยากใส่นาฬิกาปกติก็ถอดสิ่งนี้ออกแล้วก็หนีบกับเสื้อไว้มันก็ยังจะ track การเคลื่อนไหวได้เหมือนเดิม ไม่ต้องใส่นาฬิกาสองอันให้ดูแปลกด้วย …. และที่สำคัญมันลงน้ำได้สามารถใส่ลงน้ำ หรือหนีบไว้กะชุดว่ายน้ำแล้ว track การออกกำลังกายได้ …. เจ๋งมาก ชอบๆ</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QVc8oVDXG_t0UGKtE8CknA.jpeg" /><figcaption><a href="http://blog.misfit.com/swimmers-its-your-time-to-shine-introducing-speedo-shine/">http://blog.misfit.com/swimmers-its-your-time-to-shine-introducing-speedo-shine/</a></figcaption></figure><p>ไม่ใช่แค่นั้น…..</p><p>เนื่องด้วยมันเป็นนาฬิกาที่ใส่ถ่านนาฬิกา ดังนั้นมันไม่ต้องชาร์จไฟใดๆ ใช้วิธีเปลี่ยนถ่านเอา …. คือไม่มีเหตุผลใดๆให้ถอดออกเลยถ้าไม่จำเป็น ก็เลยสามารถ track ได้เกือบจะทุกกิจกรรมรวมถึงการนอนด้วย ….แต่ว่าวัด Heart rate ไม่ได้นะจ๊ะ</p><p>Misfit ตัวนี้ใช้การเชื่อมต่อแบบ Bluetooth ทำให้สามารถใช้ได้ทั้งบน iOS และ Android ผ่านแอพของ Misfit เลย โดยในแอพก็จะมีรายละเอียดมากมายว่านาง track อะไรได้ยังไง มีถ้วยรางวัลแล้วก็มี ranking เทียบกับเพื่อนๆได้ด้วย …. และที่สำคัญที่เราแนะนำเลย คือ มีเสียงฝน เสียงทะเล เสียงป่าไม้ให้ฟังเพลินก่อนนอนด้วยนะ เพลินมากหลับสบายเลยยยย ~~~</p><p>ครั้งหน้าเรามาดู Apple watch ในตำนานกัน … ขอเกริ่นไว้ก่อนเลยว่าตอนเปิดตัวนิ่มไม่ชอบเลย ไม่ชอบมากๆ ทั้งบ่น (ปนด่า) และไม่ได้อยากได้เลยสักกะนิด เหตุผลก็เพราะมันต้องชาร์จไฟ … แต่ เอ้ะ??? แล้วนิ่มเผลอไปซื้อมาได้ยังไง เดี๋ยวตอนหน้ามาเล่าให้ฟังค่ะ :))</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3f14aceeb619" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ตั้งแต่มี iPhoneOS 3 จนถึง iOS 10 เกิดอะไรกับชีวิต developer อย่างเราบ้าง Part 2/2]]></title>
            <link>https://medium.com/@sopanathitipariwat/%E0%B8%95%E0%B8%B1%E0%B9%89%E0%B8%87%E0%B9%81%E0%B8%95%E0%B9%88%E0%B8%A1%E0%B8%B5-iphoneos-3-%E0%B8%88%E0%B8%99%E0%B8%96%E0%B8%B6%E0%B8%87-ios-10-%E0%B9%80%E0%B8%81%E0%B8%B4%E0%B8%94%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%8A%E0%B8%B5%E0%B8%A7%E0%B8%B4%E0%B8%95-developer-%E0%B8%AD%E0%B8%A2%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B9%80%E0%B8%A3%E0%B8%B2%E0%B8%9A%E0%B9%89%E0%B8%B2%E0%B8%87-part-2-2-c688936eaa82?source=rss-ec691621afd0------2</link>
            <guid isPermaLink="false">https://medium.com/p/c688936eaa82</guid>
            <dc:creator><![CDATA[Sopana Thitipariwat]]></dc:creator>
            <pubDate>Sat, 21 Jan 2017 03:59:20 GMT</pubDate>
            <atom:updated>2017-01-21T03:59:57.720Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*HtD1UwPjoYVgCR-7LjWPXg.jpeg" /><figcaption>Photo by <a href="https://www.flickr.com/photos/janitors/">Kārlis Dambrāns</a> from <a href="https://flic.kr/p/fXj9Pk">Flickr</a></figcaption></figure><h3>iOS 7</h3><p>อันนี้เป็นอะไรที่ช้อกโลกของนิ่มมากค่ะ คือแบบทุกอย่างมันเปลี่ยนจากหน้ามือไปหลังมือเลย แอพที่เพิ่งทำเสร็จก่อนเปิดตัวกลายเป็นโบราณในทันที แต่เรื่องนึงที่นิ่มชอบมากๆคือการทำ background app refresh ที่กินแบตมากเลยทีเดียวค่ะ (ฮา) แต่ชอบแนวความคิดนี้มากๆเลย เพราะว่าของบางอย่างเราก็อยากทำให้มันสดใหม่เสมอ พร้อมใช้ แต่ก็อย่างที่หลายคนเคยประสบพบเจอกัน ก็น่าจะเข้าใจว่าการจัดการแอพตอนอยู่ background ของ iOS ค่อนข้างจะยากลำบากพอสมควร คือทำได้ก็ต้องใช้พลัง</p><p>นอกจากนี้ยังมีการนำเสนอ NSURLSession แทน NSURLConnection อีกด้วย ที่จะเข้ามาช่วยเรื่องการเก็บ cache, การจัดการ protocol, cookie, และ credential policies ให้ทำงานได้ดียิ่งขึ้น</p><p>และแน่นอนเมื่อออกมาใน Concept flat design มันก็เลยสามารถที่จะ Customize UI ได้อย่างสนุกสนานทีเดียว แอพเราสามารถดูสวยงามได้อย่างง่ายดาย ใช้ไฟล์รูปน้อยลง แอพขนาดเล็กลง ให้ OS วาดให้มันก็จะทำให้แอพดูทำงานเร็วขึ้นมานิดนึงค่ะ</p><h3>iOS 8</h3><p>หลังๆมานิ่มเริ่มรู้สึกว่า Apple เริ่ม Update version บ่อยไปนะ คือนิ่มเองก็เริ่มตามไม่ทันค่ะ เพราะว่ายัง Migrate แอพที่เป็น iOS 6 มา 7 ยังไม่ครบดีก็มี 8 ออกมาอีกแล้ว ตอนแรกนิ่มก็เฉยๆ แต่มาว้าวตรง HealthKit และ Apple watch เพราะเคยลองใช้นาฬิกาและแอพเจ้าอื่นมาแล้ว ก็เลยรู้สึกได้เลยว่า Apple ทำออกมาได้ค่อนข้างดีกว่า ซึ่งก็น่าจะเป็นเพราะทำเป็นของอุปกรณ์ตัวเอง การใช้ Technic อะไรต่างๆถึงทำได้ดีกว่า Third party</p><p>ส่วนที่สองที่เราต้องทำการแก้ไขก็คือการขอ Remote Notification ที่มีวิธีการประหลาดกว่าเดิมนิดหน่อย แต่ก็ไม่มากเท่าไหร่นักแค่เปลี่ยน method และ flow ในการขอ Notification นิดหน่อย เพราะว่าตอนนี้ต้องขอ permission ในส่วนของ UILocalNotification ด้วย แต่ก่อนไม่ต้องทำก็ได้</p><p>ความเก๋ไก๋อีกอย่างของนาง คือ นางมี Extension ค่ะคุณผู้ชม เราสามารถใส่ความสามารถเล็กๆน้อยๆของแอพเราแนบไปในส่วนต่างๆของ iOS ได้เลย เช่น Widget , Custom keyboard, Share ฯลฯ</p><p>นอกจากนี้ยังมี Launch Screen .xib ที่เป็นประโยชน์ในยุคสารพัดขนาดหน้าจอมาก คือไม่ต้องมานั่งเตรียมรูปหลายขนาดแล้ว วางลงไปเลยใน nib file แล้วใส่ AutoLayout เอา เพียงเท่านี้ชีวิตก็ดีขึ้นมากแล้วค่ะพี่น้องงงงง</p><p>ส่วนสุดท้ายที่เรานึกออกก็คือ UIAlertViewController อันนี้รักมากเลย เพราะว่ามันรวมร่างระหว่าง UIAlertView และ UIActionSheetController และตอนจะเพิ่ม/ลดปุ่ม ก็ใช้วิธีเพิ่ม block action ลงไปได้ง่ายๆ …. โหว ดีอะ สะดวกสบายจริง</p><h3>iOS 9</h3><p>ผ่านมาไม่ทันไร อ้าวปีใหม่ก็มาอีกแล้วค่ะ iOS 9 เรานี่แบบ ห๊ะ … อะไรนะ มาอีกแล้วหรอ รีบมากหรอคะป้าทิม …. โอเคในเมื่อเปิดตัวแล้ว ในฐานะ developer ก็ต้องรับผิดชอบในการลองเล่นต่อไปอย่างไม่หยุดยั้ง แล้วชีวิตเราจะแย่ลงอีกมั้ยนะ (ฮา)</p><p>เท่าที่เราจำได้ตอนนั้น ไม่ค่อยมีอะไรที่กระทบชีวิตรุนแรงขนาด iOS 7 แล้วล่ะ แต่ว่าก็มีเรื่องดีๆเกิดขึ้น เช่น SFSafariViewController เราเข้าใจว่าเอามาเล่นกับเรื่อง Hand-off ได้ แล้วก็อีกอย่างที่น่าสนใจคือ iCloud drive ที่ดูดีกับชีวิตอยู่ คือเราสามารถเก็บข้อมูลในแอพบางอย่างขึ้นคลาวด์ไปเลยได้ แต่ก็ยังไม่ได้ลองเล่นจริงจังเลยค่ะอันนี้</p><p>ส่วนอื่นๆที่เป็นฟีเจอร์หลักของ iOS 9 เราก็ไม่ได้เล่นเพราะว่ามันไม่เปิดใช้ เช่น Apple Pay แต่อันนึงที่น่าลองก็คือส่วนของ Apple Music น่าลองเล่นดูว่ามันไรได้มั่ง ใครลองแล้วบอกเม้ามอยให้ฟังด้วยนะคะ</p><h3>iOS 10</h3><p>และแล้วก็มาถึง iOS 10 กันแล้ว เหมือนว่าจะไม่ได้มีอะไรแตกต่างมาก เพราะนิ่มไม่ค่อยมีเวลาได้ลองเล่นจริงจัง &gt;&lt;” เปิดตัวมาในช่วงเวลาที่งานยุ่งมากจริงๆ แต่อย่างนึงที่นิ่มประสบพบเจอคือเรื่อง Notification อีกแล้ว</p><p>เมื่อตอน iOS ก่อน ตรง Notification มันเริ่มทำการรับ Action บางอย่างจาก User ได้บ้างแล้วแทนที่จะเป็นการแสดงข้อความอย่างเดียว ในเวอร์ชันนี้ก็ทำได้มากขึ้นอีก ส่วนจะทำอะไรได้มากน้อยแค่ไหนนั้น นิ่มก็ต้องไปลองเล่นจริงจังมาก่อน ถึงจะมาเล่าให้ฟังได้ แต่เท่าที่ดูคือเราสามารถส่งรูปแปะใน Notification ได้แล้วค่ะ ดีงามมาก</p><p>นอกจากนี้เรายังสามารถทำให้ Siri รู้จักแอพเราได้มากขึ้นอีกด้วย เวลา User ใช้งาน Siri ก็สามารถทำให้ Siri มาเรียกใช้แอพเราได้ ดูดีเชียว</p><h3>…</h3><p>สุดท้ายนี้ในฐานะ developer ตัวน้อย ก็ขอเป็นกำลังใจให้ developer สู้ต่อไปนะคะ ถึงแม้ว่า Apple จะออก iOS มาอีกกี่เวอร์ชัน เราก็จะต้องเปลี่ยนโลกใบนี้ให้ดีขึ้นให้ได้ 5555 ดูเวอร์ไปนิด แต่ก็สู้ๆนะคะ</p><p>ปล. วันที่ 31 มกราคมนี้ นิ่มไปงาน iOS Meetup ด้วยนะคะ ใครเจอก็ทักได้นะคะ นิ่มจะมึนๆ งงๆ หน่อย อย่าได้ถือสานะคะ :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c688936eaa82" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ตั้งแต่มี iPhoneOS 3 จนถึง iOS 10 เกิดอะไรกับชีวิต developer อย่างเราบ้าง Part 1/2]]></title>
            <link>https://medium.com/@sopanathitipariwat/%E0%B8%95%E0%B8%B1%E0%B9%89%E0%B8%87%E0%B9%81%E0%B8%95%E0%B9%88%E0%B8%A1%E0%B8%B5-iphoneos-3-%E0%B8%88%E0%B8%99%E0%B8%96%E0%B8%B6%E0%B8%87-ios-10-%E0%B9%80%E0%B8%81%E0%B8%B4%E0%B8%94%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%8A%E0%B8%B5%E0%B8%A7%E0%B8%B4%E0%B8%95-developer-%E0%B8%AD%E0%B8%A2%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B9%80%E0%B8%A3%E0%B8%B2%E0%B8%9A%E0%B9%89%E0%B8%B2%E0%B8%87-part-1-2-c5eec1d27ba9?source=rss-ec691621afd0------2</link>
            <guid isPermaLink="false">https://medium.com/p/c5eec1d27ba9</guid>
            <dc:creator><![CDATA[Sopana Thitipariwat]]></dc:creator>
            <pubDate>Sat, 14 Jan 2017 07:51:56 GMT</pubDate>
            <atom:updated>2017-01-14T08:11:00.327Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*UqaqQYe7K0KMBWAutUeD5Q.jpeg" /><figcaption>Photo by <a href="https://www.flickr.com/photos/gonzalobaeza/">Gonzalo Baeza</a> from <a href="https://flic.kr/p/dCPzuE">Flickr</a></figcaption></figure><p>ก่อนอื่นต้องขอแนะนำตัวกันก่อนนะคะ เราชื่อ “นิ่ม” เริ่มศึกษาเขียนโปรแกรมเกี่ยวกับ iPhone มาตั้งแต่สมัยเรียน รู้สึกว่าตอนนั้นเป็น iPhoneOS 3.2 มั้งถ้าทำไม่ผิด สาเหตุก็น่าจะคล้ายกับหลายๆคน คือ รู้สึกว่ามันเจ๋ง อะ ก็เลยเกาะติดอยู่แต่ iPhone มาตลอดไม่หนีไปไหน</p><p>นิ่มเลยจะเอาประสบการณ์ของตัวเองคร่าวๆมาเล่าสู่กันฟังสั้นๆ ว่าแต่ละเวอร์ชันมีความแตกต่างกันยังไงบ้าง อาจจะไม่ครบทุกอย่างในเวอร์ชันนั้น แต่ก็มี Timeline ให้พอเข้าใจได้ว่าแต่ละเวอร์ชันนั้นผ่านอะไรมาบ้าง กว่าจะฝ่าฟันมาจนถึง iOS 10 ทุกวันนี้</p><h3>แล้วก่อน iPhoneOS 3 นี่มันมี 1 กับ 2 มั้ย ?</h3><p>แน่นอนค่ะ ตามหลักการเรียงเลขเวอร์ชันมันก็ควรจะเป็นแบบนั้นแหละ แต่นิ่มเกิดไม่ทัน ก็เลยต้องไปขอยืมบทความของ คุณ <a href="http://kinja.com/darrenorf">Darren Orf</a> ที่เขียนไว้ใน <a href="http://gizmodo.com/a-brief-history-of-ios-1780790760">http://gizmodo.com/a-brief-history-of-ios-1780790760</a> มาเล่าให้ทุกคนฟังแทน</p><p>คือ Apple เริ่มเปิดตัว Operating System ที่มาพร้อมกับ iPhone ที่เรียกว่า iPhone OS เมื่อปี 2007 ซึ่งท่านศาสดาของพวกเรา หรือ Steve Jobs ได้บอกว่ามันมีแก่นมาจาก OSX เลยนะ แล้วยังมี Multi Touch อีก พร้อมทั้งไอเดียการเข้าถึงฟังชันต่างๆที่ติดมากับ OS ไม่ว่าจะเป็น iPod , กล้อง ฯลฯ ที่มีความสามารถเยอะแยะมากมายที่สามารถพกพาใส่ในกระเป๋าได้</p><p>ต่อมาในปี 2008 ทาง Apple ก็ปล่อยเวอร์ชัน 2 ที่มี SDK เปิดช่องทางให้ Third party ได้ทำแอพลงไปใน App store ได้ โดยในปีนี้ได้ออก iPhone 3G ที่มี GPS มาด้วย ทำให้มีลูกเล่นเพิ่มขึ้น ทำแอพได้อย่างหลากหลาย โดยทำการ dev ผ่าน XCode 3.1 เป็นต้นไป</p><h3>iPhoneOS 3</h3><p>หลายคนคงจะคุ้นเคยหน้าจอ Spring board ของ iPhone ที่เป็นพื้นสีดำแล้วมี icon วางเรียงกันแถวละ 4 แอพ ซึ่งตอนที่นิ่มเริ่มหัดเขียนแอพ นิ่มก็เพิ่งได้เริ่มหัดใช้ iPod Touch ครั้งแรกแล้วตื่นตาตื่นใจมากเลยค่ะ 555+ เพราะว่าตอนนั้นแปลกใจกับแอพต่างๆที่มีอยู่ใน App store ที่มันหลากหลายมาก โดยเฉพาะอย่างยิ่งพวกเกมส์ที่เล่นกับ Tilt Gesture ได้เช่น Doodle jump และจริงๆก็ตื่นเต้นแม้กระทั่งการทำงานของ Cydia ที่ต้องผ่านการ Jailbreak ก่อนเพราะว่าเราสามารถ Customize เครื่องให้ทำงานได้ตามที่เราต้องการ ซึ่งมันว้าวมากในสมัยนั้น *0*</p><p>ตอนที่หัดเขียนแอพนิ่มก็ทำแค่แอพที่ใช้ UITableView ธรรมดา ที่ทำงานร่วมกับ SQLite คือตอนนั้นยังใช้ CoreData ยังไม่เป็นเลยค่ะ แต่จำได้ว่า Xcode 3 ตอนนั้นยังไม่รวม Interface Builder เข้ามาเป็นแอพเดียวกันเลยค่ะ ซึ่งสมัยนั้นนิ่มก็นิยมวาด UI กันด้วย Code มากกว่าเพราะว่าสะดวกกว่าตรงที่เปิดแอพเดียวก็พอ เพราะถ้าใช้ nib ก็ต้องมาผูกกันอีกอยู่ดี แล้วตอนนั้นการ Customize UI มันไม่สะดวกเหมือนตอนนี้ค่ะ</p><p>แต่เรื่องการจัดการ memory ต้องทำเองหมดเลย เช่น retain, assign, copy, release</p><h3>iOS 4</h3><p>ตอนหัดเขียนไม่นาน Apple ก็ปล่อย iOS 4 โดยเปลี่ยนชื่อจาก iPhoneOS มาเรียกรวมกับ iPod, iPhone, iPad เป็น iOS แทนค่ะ โดย Version นี้เพิ่ม Multitasking เข้ามา หรือการกดปุ่ม Home ติดกัน 2 ครั้ง เพื่อสลับไปแอพอื่นได้ โดยเราสามารถ pause การทำงานบางอย่างไว้ได้ แล้วสามารถกลับมาทำงานต่อได้ใน applicationDidBecomeActive ค่ะ</p><p>ความสะดวกอีกอย่างนึงที่เพิ่มเข้ามาก็คือ การประกาศตัวแปรด้วย @property ที่เราสามารถประกาศเพียงบรรทัดเดียวก็เพียงพอ ไม่ต้องทำการประกาศ Local variable และ Synthesize อีก ประหยัดเวลาได้เยอะเหมือนกันค่ะ</p><h3>iOS 5</h3><p>ในเวอร์ชันนี้ เราเริ่มจะทำการ Customize UI ได้สะดวกขึ้นกว่าเดิมผ่าน UIAppearance แล้วค่ะ เช่นการใส่รูป background ของ Navigationbar หรือการเปลี่ยนสี ฯลฯ ไม่เพียงเท่านั้น iOS 5 ยังมาพร้อมกับ Twitter Account ให้สามารถทำการเรียก Authen ผ่านทาง OS ได้เลย ไม่ต้องไปผ่าน Webview ให้ซ้ำซ้อน ทำให้ User สามารถแชร์ได้สะดวกขึ้น ไม่ต้องกรอก Username กับ Password หลายๆแอพ</p><p>แต่เรื่องที่เด็ดที่สุดก็คงไม่พ้น ARC (Automatic Reference Counting) ที่ทำการเพิ่ม code ส่วนของการ retain, assign, copy, release ให้เราได้เลย รวมไปถึงส่วนของการเรียก dealloc ให้อัตโนมัติตอนทำการ compile เราไม่ต้องมานั่งเรียงใส่เอง</p><h3>iOS 6</h3><p>เวอร์ชันนี้มาพร้อมกับเครื่อง iPhone 5 ที่ยาวขึ้น ก็เลยมี Autolayout เข้ามาด้วย ซึ่งสะดวกสบายกว่า Auto resizing ของเดิมอย่างยิ่ง แต่กว่าจะทำความเข้าใจได้นี่ก็ปรับสมองอยู่หลายรอบเหมือนกัน 555+ เพราะว่ามันไม่คุ้นเลยการทำ UI เพื่อให้รองรับหลายหน้าจอ ค่อนข้างจะเป็นเรื่องประหลาดสำหรับชีวิตอยู่พอสมควรเลยทีเดียว</p><p>เดี๋ยวครั้งหน้านิ่มจะมาเล่าให้ฟังต่อว่า ตั้งแต่ iOS 7 จนถึง iOS 10 มันเกิดอะไรขึ้นกับชีวิต developer อย่างพวกเราอีกบ้างค่ะ …. สำหรับตอนแรกนี้ขอพักไว้เท่านี้ก่อนที่มันจะยาวเกินไป</p><p>ยินดีที่ได้รู้กจักทุกคนค่ะ</p><p>Happy Coding :) NiM /.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c5eec1d27ba9" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>