<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Atthaphon Urairat</title>
    <description>The latest articles on DEV Community by Atthaphon Urairat (@uatthaphon).</description>
    <link>https://dev.to/uatthaphon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F40629%2Fad0212f4-1fb7-4a7b-8182-71a25321b1a0.jpeg</url>
      <title>DEV Community: Atthaphon Urairat</title>
      <link>https://dev.to/uatthaphon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/uatthaphon"/>
    <language>en</language>
    <item>
      <title>ใช้ ChatGPT Plus แทน AI Agent ยังไง</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Mon, 26 May 2025 16:38:21 +0000</pubDate>
      <link>https://dev.to/uatthaphon/aich-chatgpt-plus-aethn-ai-agent-yangaing-jmo</link>
      <guid>https://dev.to/uatthaphon/aich-chatgpt-plus-aethn-ai-agent-yangaing-jmo</guid>
      <description>&lt;p&gt;ช่วงหลัง ๆ นี้ AI กลายเป็นผู้ช่วยที่ขาดไม่ได้ในชีวิตผมไปแล้ว โดยเฉพาะ ChatGPT Plus ที่ผมจ่ายเงินสมัครใช้งานทุกเดือน ถึงแม้ในตลาดจะมี AI Agent ทางเลือกใหม่ ๆ ออกมามากมาย แต่ผมยังเลือกอยู่กับ ChatGPT เพราะมันตอบโจทย์ทั้งในแง่ความสามารถและความคุ้มค่า และที่สำคัญ ผมสามารถปรับวิธีใช้งานให้มัน “รู้จักโปรเจกต์ผม” ได้ดีขึ้นเรื่อย ๆ&lt;/p&gt;

&lt;p&gt;วันนี้เลยอยากมาแชร์แนวทางที่ผมใช้ให้ ChatGPT ทำงานได้เหมือน AI Agent ส่วนตัว — โดยไม่ต้องจ่ายเพิ่ม&lt;/p&gt;




&lt;h2&gt;
  
  
  จุดเริ่มต้น: จากคนที่ใช้ AI ช่วยแค่เรื่องเล็ก ๆ
&lt;/h2&gt;

&lt;p&gt;ตอนแรก ผมใช้ AI แค่ช่วยเขียนอีเมลภาษาอังกฤษ หรือหาสาเหตุเวลาเจอ error แปลก ๆ แทนที่จะเปิด Google, Stack Overflow หรือดู Issue ใน Github โดยไล่หาด้วยตัวเอง ซึ่งก็ช่วยประหยัดเวลาไปได้เยอะ&lt;/p&gt;

&lt;p&gt;ต่อมาเริ่มใช้เขียนโค้ดแบบจริงจัง — ตั้งแต่ยุค GitHub Copilot จนตอนนี้มาจบที่ ChatGPT Plus ซึ่งกลายเป็นเครื่องมือที่ใช้ทุกวัน ไม่ใช่แค่ตอนเขียนโค้ด แต่รวมถึงงานอื่น ๆ อย่าง:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เขียนสคริปต์หรือเทสเคสให้ทีม QA&lt;/li&gt;
&lt;li&gt;แนะนำไอเดียเวลาตัน&lt;/li&gt;
&lt;li&gt;ช่วยสอนการบ้านลูก 😄&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ทำไมยังไม่เปลี่ยนไปใช้ AI Agent อื่น?
&lt;/h2&gt;

&lt;p&gt;AI Agent หลายตัวมีฟีเจอร์น่าสนใจ แต่ส่วนใหญ่ต้องจ่ายเพิ่มหรือซื้อเครดิตเพิ่ม ซึ่งโดยส่วนตัวแล้ว ผมคิดว่า ChatGPT Plus ก็เพียงพอแล้ว — โดยเฉพาะถ้ารู้จักใช้ให้ถูกวิธี&lt;/p&gt;

&lt;p&gt;อีกอย่างคือ ChatGPT ใช้ร่วมกับ extension บน VS Code ได้ และตอนนี้มันก็สามารถจำ session ได้ดีขึ้นมาก แถมรองรับการอัปโหลดไฟล์เพื่อช่วยวิเคราะห์ context ของโค้ดเราได้แล้ว&lt;/p&gt;




&lt;h2&gt;
  
  
  วิธีที่ผมเปลี่ยนการใช้งานโดย เขียน &lt;code&gt;PROJECT.md&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;ผมค้นพบว่า การมีไฟล์สรุปโปรเจกต์ (ในรูปแบบ markdown) ช่วยให้ ChatGPT เข้าใจงานเราได้ลึกขึ้น และติดตามความคืบหน้าได้เหมือนเป็นเพื่อนร่วมงานจริง ๆ&lt;/p&gt;

&lt;p&gt;ในไฟล์นั้นจะมี&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เป้าหมายของแอป&lt;/li&gt;
&lt;li&gt;เทคโนโลยีที่ใช้&lt;/li&gt;
&lt;li&gt;โครงสร้างโฟลเดอร์&lt;/li&gt;
&lt;li&gt;ฟีเจอร์ที่ทำเสร็จแล้ว / วางแผนไว้&lt;/li&gt;
&lt;li&gt;และโน้ตอื่น ๆ ที่อยากให้ ChatGPT ช่วย&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ทุกครั้งที่เริ่ม session ใหม่ ผมจะส่งไฟล์นี้ให้ก่อน แล้วจึงค่อยคุยหรือให้มันช่วย implement ทีละฟีเจอร์&lt;/p&gt;




&lt;h2&gt;
  
  
  ปัญหาที่เจอ และวิธีแก้ ผมใช้ zip code ก่อนเริ่มงาน
&lt;/h2&gt;

&lt;p&gt;แม้จะมี &lt;code&gt;PROJECT.md&lt;/code&gt; แล้ว แต่เมื่อห่างจากงานไปนาน ๆ ผมก็ยังเจอว่าเจ้า ChatGPT จำอะไรไม่ได้เท่าที่ควร&lt;/p&gt;

&lt;p&gt;ทางออกของผมคือ &lt;strong&gt;zip โค้ดโปรเจกต์ แล้วอัปโหลดให้ ChatGPT วิเคราะห์เอง&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ผมสร้าง CLI เล็ก ๆ ที่ชื่อว่า &lt;a href="https://github.com/uatthaphon/chatpack" rel="noopener noreferrer"&gt;&lt;code&gt;chatpack&lt;/code&gt;&lt;/a&gt; ซึ่งจะ zip เฉพาะไฟล์ที่จำเป็น (โดยใช้ &lt;code&gt;.chatpackignore&lt;/code&gt;) พร้อมกับรวม &lt;code&gt;PROJECT.md&lt;/code&gt; เข้าไปใน zip นั้นด้วย&lt;/p&gt;

&lt;p&gt;พอเปิด session ใหม่ ก็แค่อัปโหลด zip นั้นให้กับ ChatGPT แล้วมันจะช่วยผมทำงานต่อได้เหมือนเดิม&lt;/p&gt;




&lt;h2&gt;
  
  
  ตัวอย่าง: ChatGPT ช่วยอัปเดต &lt;code&gt;PROJECT.md&lt;/code&gt; เอง
&lt;/h2&gt;

&lt;p&gt;อีกไอเดียที่ผมใช้คือ ให้ ChatGPT เป็นคนอัปเดตไฟล์ &lt;code&gt;PROJECT.md&lt;/code&gt; ให้เองหลังจากทำ feature เสร็จ เช่น&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"ช่วยเพิ่ม section สำหรับฟีเจอร์ &lt;code&gt;Apply Tracking&lt;/code&gt; ที่เพิ่งทำเสร็จเมื่อกี้ลงไปใน &lt;code&gt;PROJECT.md&lt;/code&gt; ด้วย"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;แบบนี้เวลาผมกลับมาทำงานวันถัดไป ก็เหมือนมีบันทึกย่อพร้อมให้เริ่มทำงานต่อทันที&lt;/p&gt;




&lt;h2&gt;
  
  
  แล้วเรื่องความปลอดภัยล่ะ?
&lt;/h2&gt;

&lt;p&gt;นี่เป็นสิ่งที่ผมระวังมาก เพราะบางโปรเจกต์เป็นของบริษัทหรือมีข้อมูลที่ต้องปกปิด&lt;/p&gt;

&lt;h3&gt;
  
  
  ผมจัดการความเป็นส่วนตัวยังไง:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ปิดการแชร์ข้อมูลกับ OpenAI&lt;/strong&gt;&lt;br&gt;
ไปที่ &lt;code&gt;ChatGPT → Settings → Data Controls&lt;/code&gt; แล้วปิด &lt;code&gt;Improve the model for everyone&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ระวังไม่ใส่ข้อมูลสำคัญใน zip&lt;/strong&gt;&lt;br&gt;
ใช้ &lt;code&gt;.chatpackignore&lt;/code&gt; เพื่อไม่ให้ zip พวก &lt;code&gt;.env&lt;/code&gt;, API key, customer data หรือ credentials ต่าง ๆ เข้าไป&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ใช้แค่ environment local&lt;/strong&gt;&lt;br&gt;
สำหรับพวกไฟล์ config ผมมักจะเก็บไว้เฉพาะในเครื่อง ไม่รวมไว้ใน repo ด้วยซ้ำ&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  สรุป
&lt;/h2&gt;

&lt;p&gt;ถ้าคุณใช้ ChatGPT อยู่แล้ว ลองใช้แนวทางนี้ดูครับ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เขียน &lt;code&gt;PROJECT.md&lt;/code&gt; ช่วยให้ AI เข้าใจ context&lt;/li&gt;
&lt;li&gt;zip เฉพาะไฟล์ที่จำเป็นด้วยเครื่องมือแบบ &lt;code&gt;chatpack&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;เริ่มต้นทุกวันด้วย context ที่พร้อมใช้งาน&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;และที่สำคัญ...คุณไม่จำเป็นต้องจ่ายแพงขึ้น เพื่อให้ได้ AI Agent ที่รู้จักคุณมากขึ้น — แค่ใช้ ChatGPT ให้ “ฉลาดขึ้น” ก็พอแล้ว&lt;/p&gt;




&lt;p&gt;หากใครสนใจลอง &lt;code&gt;chatpack&lt;/code&gt; เข้าไปดูได้ที่&lt;br&gt;
🔗 &lt;a href="https://github.com/uatthaphon/chatpack" rel="noopener noreferrer"&gt;https://github.com/uatthaphon/chatpack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ผมเขียนให้ใช้ได้ง่าย และรองรับทุกคนที่ใช้ ChatGPT เป็นผู้ช่วยในงานแบบจริงจังครับ&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>ai</category>
      <category>productivity</category>
      <category>thai</category>
    </item>
    <item>
      <title>MariaDB ROW_NUMBER() ช่วยได้</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Mon, 24 Jan 2022 15:56:06 +0000</pubDate>
      <link>https://dev.to/uatthaphon/mysql-rownumber-chwyaid-16ge</link>
      <guid>https://dev.to/uatthaphon/mysql-rownumber-chwyaid-16ge</guid>
      <description>&lt;p&gt;วันนี้มาแชร์ปัญหาที่เจอตอนทำงานและวิธีแก้ไข เรื่องมีอยู่ว่า เรามีข้อมูลที่ต้องแก้ไข ซึ่งข้อมูลชุดนี้มีการจัดเรียง priority ตามลำดับแบ่งตาม group id ต่างๆ และดาต้าเบสที่เราใช้คือ MariaDB&lt;/p&gt;

&lt;h3&gt;
  
  
  ความเป็นมา
&lt;/h3&gt;

&lt;p&gt;ปัญหาที่เจอเป็นเรื่องของข้อมูลที่ผิดเพี้ยนไป เนื่องจากตัวระบบมีการอัพเดตข้อมูลผิดพลาด ตัวอย่างชุดข้อมูลจะเป็น&lt;/p&gt;

&lt;p&gt;Table &lt;code&gt;property_informations&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;group_id&lt;/th&gt;
&lt;th&gt;priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Condo floor 1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Condo floor 2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Condo floor 3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;House room 1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;House room 2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;House room 3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;House room 4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;ตอนนี้ปัญหาคือ ข้อมูลมีการเรียง &lt;code&gt;priority&lt;/code&gt; ผิดพลาด ซึ่งถ้าชุดข้อมูลที่มีปัญหามีน้อย เราก็สามารถที่จะแก้ไขข้อมูลแบบ manual ได้ไม่เสียเวลานัก แต่เหตุการณ์จริงคือ ชุดข้อมูลที่ต้องการแก้ไขมีเยอะๆๆๆ มาก&lt;/p&gt;

&lt;p&gt;โจทย์คือ จากชุดข้อมูลที่เรามี เราต้องการเรียง &lt;code&gt;priority&lt;/code&gt; ใหม่ทั้งหมดให้ถูกต้อง โดยอิงจาก &lt;code&gt;group_id&lt;/code&gt; และเรียง order ตาม &lt;code&gt;id&lt;/code&gt; แบบ asc ได้เลย&lt;/p&gt;

&lt;p&gt;น้อง บูมสุดหล่อ ที่ทำงานด้วยกันแนะนำ &lt;code&gt;ROW_NUMBER()&lt;/code&gt; เพื่อนำมาใช้แก้ไขปัญหา ซึ่งก็ได้ผลดีและเร็วมากทั้งกับการเช็คข้อมูล และ การแก้ไข &lt;/p&gt;

&lt;h3&gt;
  
  
  SELECT QUERY เริ่มต้นการสร้าง Query เพื่อตรวจสอบ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;property_informations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;property_informations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;property_informations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;property_informations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;current_priority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_property_informations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_priority&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;property_informations&lt;/span&gt;
&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; 
        &lt;span class="n"&gt;ROW_NUMBER&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;PARTITION&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;group_id&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;asc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;new_priority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;id&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;property_informations&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;sub_property_informations&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;sub_property_informations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;property_informations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่อเรา run คำสั่ง sql เราจะผลลัพธ์เพื่อตรวจเหมือนในตาราง&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;group_id&lt;/th&gt;
&lt;th&gt;current_priority&lt;/th&gt;
&lt;th&gt;new_priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Condo floor 1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Condo floor 2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Condo floor 3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;House room 1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;House room 2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;House room 3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;House room 4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;เมื่อดูที่ column &lt;code&gt;current_priority&lt;/code&gt; และ &lt;code&gt;new_priority&lt;/code&gt; จะเห็นได้ว่า ส่ิงที่เราต้องการที่จะอัพเดตหน้าตาจะเป็นอย่างไร&lt;/p&gt;

&lt;h3&gt;
  
  
  UPDATE QUERY จัดการอัพเดตรวดเดียวไปเลย
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;
  &lt;span class="n"&gt;property_informations&lt;/span&gt;
  &lt;span class="k"&gt;JOIN&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt; 
      &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ROW_NUMBER&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;PARTITION&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;group_id&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;asc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;new_priority&lt;/span&gt; 
      &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;property_informations&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;sub_property_informations&lt;/span&gt;
  &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;sub_property_informations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;property_informations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; 
  &lt;span class="n"&gt;property_informations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sub_property_informations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_priority&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่อรัน update query ด้านบน ข้อมูลจะถูกอัพเดตเป็น&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;group_id&lt;/th&gt;
&lt;th&gt;priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Condo floor 1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Condo floor 2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Condo floor 3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;House room 1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;House room 2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;House room 3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;House room 4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;เท่านี้เราก็สามารถแก้ไขข้อมูลปริมาณเยอะๆ ได้ในคราวเดียว แต่เวลาใช้ก็อย่าลืม Backup ข้อมูลไว้ก่อนด้วยนะครับ&lt;/p&gt;

</description>
      <category>mariadb</category>
      <category>mysql</category>
      <category>database</category>
      <category>ไทย</category>
    </item>
    <item>
      <title>Laravel Package Starter Kits</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Thu, 20 May 2021 10:33:13 +0000</pubDate>
      <link>https://dev.to/uatthaphon/laravel-package-starter-kits-3fn7</link>
      <guid>https://dev.to/uatthaphon/laravel-package-starter-kits-3fn7</guid>
      <description>&lt;p&gt;เอา Repository มาแชร์ครับ พอดีช่วงนี้ดูทรงแล้วน่าจะได้เขียน package เรื่อยๆ เลยทำตัว starter kits เอาไว้เลย ก็เลยอยากเอามาแชร์เผื่อเป็นประโยชน์กับเพื่อนๆ ครับ&lt;/p&gt;

&lt;p&gt;เข้าไปดูดได้จาก &lt;a href="https://github.com/uatthaphon/laravel-package-starter-kits" rel="noopener noreferrer"&gt;https://github.com/uatthaphon/laravel-package-starter-kits&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ไปดูกันเลยครับ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table of contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Laravel Package Starter Kits

&lt;ul&gt;
&lt;li&gt;Directory Structure 🗂️&lt;/li&gt;
&lt;li&gt;Package Skeleton 🦴&lt;/li&gt;
&lt;li&gt;Development Environment 🌱&lt;/li&gt;
&lt;li&gt;การ import package ที่เรากำลังพัฒนาเข้าไปใน laravel project ซึ่งอยู่บนเครื่องของเราแบบ locally 🏠&lt;/li&gt;
&lt;li&gt;สิ่งที่ต้องปรับเปลี่ยนก่อนทำการ Coding ✅&lt;/li&gt;
&lt;li&gt;License&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Laravel Package Starter Kits
&lt;/h1&gt;

&lt;p&gt;ชุดตั้งต้นใช้สำหรับการเริ่มสร้าง Laravel Package&lt;/p&gt;

&lt;h2&gt;
  
  
  Directory Structure 🗂️
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- src
- tests
CHANGELOG.md
README.md
LICENSE
composer.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Package Skeleton 🦴
&lt;/h2&gt;

&lt;p&gt;สำหรับการเริ่มต้นสร้าง package เราไม่จำเป็นที่จะต้องวาง package ของเราเอาไว้ใน laravel project folder ก็ได้&lt;/p&gt;

&lt;p&gt;ผมแนะนำให้เราสร้าง folder package วางไว้ในระดับเดียวกันกับ folder ของ laravel project ที่เราจะเอาไว้ใช้ทดสอบ package ของเรา&lt;/p&gt;

&lt;p&gt;ตัวอย่างเช่น ผมสร้าง package เอาไว้ที่ &lt;code&gt;~/packges/&lt;/code&gt; โดยที่ตัว folder ของ laravel ผมก็วางเอาไว้ที่ระดับเดียวกันกับ package ก็ได้ &lt;code&gt;~/laravel-website&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Development Environment 🌱
&lt;/h2&gt;

&lt;p&gt;ให้เราปรับแก้ไฟล์ต่างๆ ที่มีอยู่ใน Directory Structure ตามความต้องการได้เลย&lt;/p&gt;

&lt;h2&gt;
  
  
  การ import package ที่เรากำลังพัฒนาเข้าไปใน laravel project ซึ่งอยู่บนเครื่องของเราแบบ locally 🏠
&lt;/h2&gt;

&lt;p&gt;ตัวอย่างเช่น ในกรณีที่เราวาง package ที่เราสร้างไว้ในระดับเดียวกันกับ laravel project ที่เรากำลังพัฒนา&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/packages/my-package
/laravel-website
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เราสามารถเรียก package ที่อยู่บนเครื่อง local ของเราได้ตามตัวอย่างด้านล่างนี้ได้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;laravel-website/composer.json&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nl"&gt;"repositories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"../packages/my-package"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นเราต้องทำการเรียกคำสั่ง composer require เพื่อเพิ่ม package ที่เรากำลังทำการพัฒนาให้เข้ามารวมอยู่ใน autoload ด้วยคำสั่งด้านล่างนี้ครับ &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ชื่อของ pacakge ก็ตามที่เราตั้งเอาไว้ใน &lt;code&gt;composer.json&lt;/code&gt; เลยครับ เช่นของผมตั้งไว้ว่า &lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;laravel-website/composer.json&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uatthaphon/packagename"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผมก็รันคำสั่งเรียกเป็น&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;comsopser require uatthaphon/packagename
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  สิ่งที่ต้องปรับเปลี่ยนก่อนทำการ Coding ✅
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] แก้ข้อมูลใน &lt;code&gt;LICENSE&lt;/code&gt; ไฟล์
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;// LICENSE

Copyright (c) Atthaphon Urairat &amp;lt;- เปลี่ยนตรงนี้ครับ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;[ ] แก้ข้อมูลใน &lt;code&gt;composer.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// pacakges/my-package/composer.json

{
    "name": "uatthaphon/package-name", &amp;lt;- เปลี่ยนตรงนี้ครับ

    ...

    "authors": [
        {
            "name": "Atthaphon Urairat", &amp;lt;- เปลี่ยนตรงนี้ครับ
            "email": "u.atthaphon@gmail.com" &amp;lt;- เปลี่ยนตรงนี้ครับ
        }
    ],

    ...
    "autoload": {
        "psr-4": {
            "Uatthaphon\\PackageName\\": "src" &amp;lt;- เปลี่ยนตรงนี้ครับ
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Uatthaphon\\PackageName\\Tests\\": "tests" &amp;lt;- เปลี่ยนตรงนี้ครับ
        }
    },

    ...

    "extra": {
        "laravel": {
            "providers": [
                "Uatthaphon\\PackageName\\PackageNameServiceProvider" &amp;lt;- เปลี่ยนตรงนี้ครับ
            ]
        }
    },
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;[ ] แก้ชื่อไฟล์ตั้งต้น และ &lt;code&gt;namespace&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ชื่อของไฟล์ที่ต้องเปลี่ยน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;src/PackageNameServiceProvider.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;namespace ที่ต้องเปลี่ยน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;// src/PackageNameServiceProvider.php

&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Uatthaphon\PackageName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;เปล&lt;/span&gt;&lt;span class="err"&gt;ี่&lt;/span&gt;&lt;span class="n"&gt;ยนตรงน&lt;/span&gt;&lt;span class="err"&gt;ี้&lt;/span&gt;&lt;span class="n"&gt;คร&lt;/span&gt;&lt;span class="err"&gt;ั&lt;/span&gt;&lt;span class="n"&gt;บ&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Happy Coding ครับ 🥰🥰🥰&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;อีกนิดครับ ใน &lt;code&gt;composer.json&lt;/code&gt; มี script ที่เอาไว้รัน test แล้วครับ ดังนั้นเราไม่ต้องเพิ่มคำสั่งยาวๆอย่าง &lt;code&gt;./vendor/phpunit/phpunit/phpunit&lt;/code&gt; เพื่อทำการเทสนะครับ ให้ใช้คำสั่งนี้ก็พอ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer &lt;span class="nb"&gt;test

&lt;/span&gt;composer testUnit

composer testFeature

composer testVerbose

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;The MIT License (MIT). Please see &lt;a href="https://dev.toLICENSE"&gt;License File&lt;/a&gt; for more information.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>package</category>
      <category>php</category>
      <category>thai</category>
    </item>
    <item>
      <title>รัน Laravel 8 ด้วย Sail บน Mac M1</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Sat, 24 Apr 2021 10:05:49 +0000</pubDate>
      <link>https://dev.to/uatthaphon/laravel-8-sail-mac-m1-471e</link>
      <guid>https://dev.to/uatthaphon/laravel-8-sail-mac-m1-471e</guid>
      <description>&lt;p&gt;ผมเพ่ิงได้ใช้ Macbook Air ซึ่งใช้ M1 chip มาครับ และก็ได้เจอปัญหาตอนที่ลองใช้ Docker ในการใช้งาน laravel นิดหน่อย เลยอยากจะมาแชร์ให้ฟังเผื่อคนที่เจอปัญหาเดียวกันจะได้นำไปแก้ไขได้ครับ&lt;/p&gt;

&lt;p&gt;ต้องขอบอกก่อนว่าตอนที่ผมใช้นั้น Docker Desktop รองรับการใช้งาน M1 Chip แล้วนะครับ แต่ปัญหาจะอยู่ที่ Image บางตัวที่อาจจะยังไม่รองรับเท่านั้น เอาล่ะมาดูกันเลยครับ&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นแรกเลยให้เราติดตั้ง Laravel ด้วยคำสั่ง
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# เปลี่ยน "my-app" ให้เป็นชื่อโปรเจ็คที่เราต้องการ&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://laravel.build/my-app | bash 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;การใช้คำสั่งนี้แทนที่จะใช้คำสั่ง &lt;code&gt;composer&lt;/code&gt; ในการสร้างโปรเจ็คนั้นจะทำให้เราได้ ไฟล์ Dockerfile และ Default setting สำหรับ Docker มาโดยอัตโนมัติ โดยที่เราไม่ต้องมานั่ง setup docker เองให้เสียเวลา แต่สำหรับ M1 เมื่อดาวโหลด laravel ด้วยคำสั่งนี้จะติดปัญหาที่ตัว MySQL ครับ&lt;/p&gt;

&lt;h2&gt;
  
  
  แก้ไขปัญหาเพื่อทำให้ MySQL สามารถทำงานได้
&lt;/h2&gt;

&lt;p&gt;ปัญหาตอนนี้คือ ณ ปัจจุบัน MySQL ไม่สามารถทำงานร่วมกันได้กับสถาปัตยกรรม arm ของ M1 การแก้ไขอาจทำได้มากกว่า 1 วิธี เช่นการเปลี่ยนไปใช้  MariaDB image แทน แต่วันนี้จะขอแสดงวิธีแก้ไขด้วยการเพิ่ม platform &lt;code&gt;linux/x86_64&lt;/code&gt; แทนครับ&lt;/p&gt;

&lt;p&gt;ให้เราเปิดไฟล์ &lt;code&gt;docker-compose.yml&lt;/code&gt; ขึ้นมาและเพ่ิม &lt;code&gt;platform: 'linux/x86_64'&lt;/code&gt; ตามตัวอย่างด้านล่างได้เลยครับ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mysql:8.0'&lt;/span&gt;
    &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;linux/x86_64'&lt;/span&gt;
    &lt;span class="s"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ในส่วนของด้าน performance แล้วการเพ่ิม emulator linux/x86_64 เข้ามาจะมีผลทำให้เ MySQL ช้าลง แต่อย่างไรก็ดี การทดลอง โปรแกรมในเครื่อง local โดยมากก็ไม่ได้ใช้ข้อมูลทั้งหมดเหมือนใน production ดังนั้นการใช้งาน docker ที่เครื่อง local แบบนี้ก็ไม่น่าจะเป็นประเด็นเท่าไหร่นัก เว้นเสียแต่คุณจะ deploy setting นี้ขึ้น production&lt;/p&gt;

&lt;h2&gt;
  
  
  หลังจากนั้นก็ทดสอบการใช้งาน Laravel ได้เลย
&lt;/h2&gt;

&lt;p&gt;ทำการ spin up container ด้วยคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./vendor/bin/sail up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้น รอสักพัก เพื่อให้มันทำการ build เสร็จแล้วก็ไปทดสอบโดยคลิ๊กเข้าไปที่ลิงค์ &lt;a href="http://localhost" rel="noopener noreferrer"&gt;http://localhost&lt;/a&gt; ได้เลย&lt;/p&gt;

</description>
      <category>docker</category>
      <category>sail</category>
      <category>laravel8</category>
      <category>thai</category>
    </item>
    <item>
      <title>MAMP ตั้งค่า Virtual Hosts</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Sun, 17 Nov 2019 06:20:39 +0000</pubDate>
      <link>https://dev.to/uatthaphon/mamp-virtual-hosts-4e16</link>
      <guid>https://dev.to/uatthaphon/mamp-virtual-hosts-4e16</guid>
      <description>&lt;p&gt;ผมหาบทความการตั้งค่า Virtual Hosts ในภาษาไทยได้ยากเหลือเกินเมื่อตอนเริ่มทดลองใช้งาน แต่ในส่วนบทความภาษาอังกฤษก็พอมีอยู่บ้าง และหลังจากที่ได้ทดลองกับตัวเองเป็นที่เรียบร้อยแล้วก็เลยอยากเอามาแชร์ให้เพื่อนๆที่กำลังหาวิธีติดตั้ง Virtual Hosts ได้ใช้เป็นบทความอ้างอิงเอาไว้ใช้ในยามจำเป็น&lt;/p&gt;

&lt;h2&gt;
  
  
  MAMP คือ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MAMP&lt;/strong&gt; คือโปรแกรมที่ใช้ในการจำลอง Web Server บนเครื่องคอมพิวเตอร์ของเรา ซึ่งเราสามารถเลือกได้ว่าจะใช้ PHP version ไหน หรือจะเลือก Web Server เป็น Apache หรือ Nginx และ MySQL ซึ่งมี Interface ที่ใช้งานได้ง่ายมากๆ ดูเพิ่มเติมที่ &lt;a href="https://www.mamp.info/en/"&gt;MAMP&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Virtual Hosts คือ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Virtual Hosts&lt;/strong&gt; คือการจำลอง host เพื่อให้รันได้กับหลายๆเว็บ เพราะโดยปกติ Web server จะใช้ได้กับ เว็บเดียวต่อ server แต่ถ้าทำ Virtual Hosts ก็จะสามารถใช้งานแยกได้หลายๆ เว็บด้วยการทำงานจาก web server ตัวเดียวกัน&lt;/p&gt;




&lt;p&gt;บทความนี้จะไม่ขอพูดถึงเรื่องการคิดตั้ง MAMP นะครับ เพราะมันง่ายมากๆ เพียงแค่เพื่อนๆ ดาวน์โหลดมาติดตั้งและดับเบิ้ลคลิก ไอคอนขึ้นมาเราก็สามารถใช้งานได้แล้วครับ เราจะมาพูดเรื่องที่มันน่าสนใจมากกว่านั้น นั่นคือการตั้งค่า Virtual Hosts&lt;/p&gt;

&lt;h2&gt;
  
  
  อนุญาตให้สามารถใช้งาน Virtual Hosts
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Mac
&lt;/h4&gt;

&lt;p&gt;เปิดไฟล์ &lt;code&gt;Applications &amp;gt; MAMP &amp;gt; conf &amp;gt; apache &amp;gt; httpd.conf&lt;/code&gt; จากนั้นลองหาบรรทัดที่เหมือนกับโค้ดด้านล่าง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Virtual hosts&lt;/span&gt;
&lt;span class="c"&gt;#Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;เมื่อเจอแล้วก็ให้ทำการ uncomment ดังเช่นโค้ดตัวอย่างด้านล่าง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Virtual hosts&lt;/span&gt;
Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  อนุญาต SymLink Override
&lt;/h2&gt;

&lt;p&gt;เปิด &lt;code&gt;httpd.conf&lt;/code&gt; ไฟล์และมองหา&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;Directory /&amp;gt;
    Options Indexes FollowSymLinks
    AllowOverride None
&amp;lt;/Directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;จากนั้นให้ทำการเปลี่ยน &lt;strong&gt;None&lt;/strong&gt; เป็น &lt;strong&gt;All&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;Directory /&amp;gt;
  Options Indexes FollowSymLinks
  AllowOverride All
&amp;lt;/Directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  เพิ่มโปรเจคที่ต้องการทำ Virtual host
&lt;/h2&gt;

&lt;p&gt;ปรกติที่อยู่ของโปรเจคที่เราต้องการเพิ่มจะอยู่ใน &lt;code&gt;Applications &amp;gt; MAMP &amp;gt; htdocs&lt;/code&gt; ซึ่งถือเป็นค่าเร่ิมต้น แต่เมื่อเราต้องการเพิ่มโปรเจคที่เก็บไว้ในโฟลเดอร์อื่น เราก็สามารถที่จะทำได้เช่นเดียวกัน&lt;/p&gt;

&lt;p&gt;เรามาลองเพิ่มกันเลย เริ่มจากเปิดไฟล์ &lt;code&gt;extra/httpd-vhosts.conf&lt;/code&gt; จากนั้นเราก็ทำการเพิ่มโค้ดลงไปในบรรทัดสุดท้ายของไฟล์&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;VirtualHost &lt;span class="k"&gt;*&lt;/span&gt;:80&amp;gt;
  ServerName example.localhost
  DocumentRoot &lt;span class="s2"&gt;"/path/to/project_directory"&lt;/span&gt;
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;ให้เราทำการเปลี่ยน &lt;code&gt;DocumentRoot&lt;/code&gt; ให้เป็นที่อยู่ของโปรเจคที่เราต้องการทำ virtual host ได้เลยครับ&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;อย่างเช่น โปรเจคของผมเก็บไว้ใน &lt;code&gt;/Users/uatthaphon/websites/myproject&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;/Users/uatthaphon/websites/myproject
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;จากนั้นก็ทำการ restart server ของ MAMP เพื่อทำให้เซิร์ฟเวอร์ รับรู้การแก้ไขที่เกิดขึ้น&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  การตั้งชื่อโดเมนในเครื่องหรือใน local
&lt;/h3&gt;

&lt;p&gt;เปิดไฟล์ hosts ด้วย text editor ที่เราถนัดได้เลยครับ ของผมใช้ sublime ซึ่งได้ทำการสร้างทางลัด (symlink) เอาไว้แล้ว ถ้าใครสนใจการสร้าง symlink ของ sublime สำหรับเปิดจาก commandline ก็สามารถเข้าไปดูได้จาก &lt;a href="https://www.sublimetext.com/docs/3/osx_command_line.html"&gt;Sublime OS X Command Line&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;subl /etc/hosts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;จากนั้นผมก็จะทำการเพิ่มโดเมนที่ใช้ใน local ของตัวเองเข้าไปเหมือนในตัวอย่างด้านล่างนะครับ&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dHZnc4ba--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/a49zkn45wj2txw3p0xe5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dHZnc4ba--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/a49zkn45wj2txw3p0xe5.png" alt="setup domain hosts"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;จะเห็นได้ว่าในบรรทัดที่สิบ ผมได้ทำการเพิ่ม domain ใหม่เข้าไป และทำให้เครื่องคอมพิวเตอร์ของผมจดจำชื่อโดเมนนี้เอาไว้ ซึ่งจะทำให้ผมสามารถเปิดมันได้จากหน้าเว็บเบราว์เซอร์จากเครื่องคอมของผมเอง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;127.0.0.1     example.localhost
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ใกล้เสร็จแล้วครับ ทีนี้เราก็เหลืออีกเพียงไม่กี่ขั้นตอนแล้วครับ&lt;/p&gt;

&lt;p&gt;ต่อเลยนะครับ &lt;/p&gt;

&lt;p&gt;ต่อไปเราต้องทำการ Restart MAMP server อีกครั้งหนึ่ง เพื่อทำให้มันจดจำการอัปเดตของเราครับ หลังจาก Restart เรียบร้อยแล้วให้เราลองเปิด &lt;code&gt;example.localhost&lt;/code&gt; ในหน้าเว็บเบราว์เซอร์ กันเลยครับ&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y8Ca6H3G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/f22r7q7r1tcc13huljpv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y8Ca6H3G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/f22r7q7r1tcc13huljpv.png" alt="Browser"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ผมสร้างไฟล์ &lt;code&gt;index.php&lt;/code&gt; ซึ่งใส่ &lt;code&gt;echo "Hello world!!! Atthaphon is here!!!";&lt;/code&gt; เอาไว้ในโฟลเดอร์ &lt;code&gt;/Users/uatthaphon/websites/myproject&lt;/code&gt; ครับ&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;เรียบร้อยแล้วครับ&lt;/strong&gt; จากนั้นถ้าหากว่าเราต้องการเพิ่มโปรเจคและโดเมนใหม่ก็ให้ทำตามขั้นตอนเดิมได้เลยนะครับ โดยการเพิ่มโปรจเจ็คอื่นๆ ต่อท้ายไฟล์ไปเรื่อยๆ ครับและถ้าหากต้องการเพิ่มโดเมนใหม่ก็ให้ไปเพิ่มที่ &lt;code&gt;hosts&lt;/code&gt; ไฟล์ได้เลยครับ&lt;/p&gt;

</description>
      <category>mamp</category>
      <category>virtualhosts</category>
      <category>php</category>
      <category>ไทย</category>
    </item>
    <item>
      <title>คนรู้จักแทงบน 3 ตัวตรง แต่ลืมกลับเลขเลยถูกกิน</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Thu, 11 Jul 2019 02:11:09 +0000</pubDate>
      <link>https://dev.to/uatthaphon/3-bgh</link>
      <guid>https://dev.to/uatthaphon/3-bgh</guid>
      <description>&lt;h1&gt;
  
  
  เสี่ยงโชค
&lt;/h1&gt;

&lt;p&gt;"โชคร้ายพี่ลืมกลับเลข ไม่งั้นล่ะก็นะ~~~~" เสียงบ่นจากพี่ที่ผมรู้จัก ซึ่งเป็นเหมือนคำพูดติดปากของแกในทุกวันที่ 1 และวันที่ 16 ของทุกเดือน เอาล่ะครับผมว่าหลายคนก็พอที่จะเดาออกว่ามันเป็นคำบ่นเกี่ยวกับเรื่องอะไรใช่ไหมครับ😂 พี่แกเล่นทียาวเป็นหางว่าวเลย🤭 &lt;/p&gt;

&lt;p&gt;ในใจผมก็คิดไปหลายอย่าง ไม่ว่าจะเป็นสงสารที่แกเฉียดตลอดไม่โดนเต็มๆ สักทีจะมีก็แต่ถูกเขากิน แต่อีกใจก็คิดว่าพี่ไม่น่าเล่นเลยเสียดายตังค์เปอร์เซ็นถูกมันน้อย ผมว่าเล่นหุ้นยังจะดูมีลุ้นมากกว่าเพราะ อย่างน้อยๆ ก็มีข้อมูลให้เราได้เลือกตัดสินใจ&lt;/p&gt;

&lt;p&gt;แต่สิ่งนี้ก็เหมือนจะเป็นส่วนหนึ่งของสังคมบ้านเราไปเสียแล้ว และผมก็เชื่อด้วยว่าทั่วโลกก็เล่นกัน สำหรับผมนานๆ ทีก็มีซื้อสลากกินแบ่งรัฐบาลบ้าง เอาไว้ให้ได้ฝันดีก่อนวันประกาศผล เอาไว้คุยกับครอบครัวว่าจะเอาเงินไปทำอะไรบ้าง ให้ได้พอยิ้มกัน&lt;/p&gt;

&lt;h2&gt;
  
  
  สร้างฟังก์ชั่นแก้ปัญหา
&lt;/h2&gt;

&lt;p&gt;เมื่อผมมองว่ามันเป็นปัญหาที่หลายคนน่าจะเคยเจอเหมือนๆ กัน ผมเลยเอามันมาแปลงเป็นโจทย์เพื่อ exercise ตัวเองสักหน่อย &lt;/p&gt;

&lt;p&gt;วันนี้เราจะมาลองสร้าง ฟังก์ชั่นความน่าจะเป็น สำหรับเลขท้าย 2 ตัวและ 3 ตัวกัน โดยจะใช้หลัก &lt;strong&gt;ความน่าจะเป็น&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ตัวอย่าง&lt;/strong&gt; สมมุติว่าพี่เขาทำการซื้อเลข 2 ตัว คือ &lt;strong&gt;12&lt;/strong&gt; โดยมากแล้วคนส่วนใหญ่จะซื้อเลขกลับด้วย ซึ่งนั่นก็คือ &lt;strong&gt;21&lt;/strong&gt; ดังนั้น สรุปได้ว่าเมื่อพี่เขามีเลข 2 ตัวที่ชอบอยู่แล้ว พี่เขาก็มักจะซื้อเลขกลับด้วย ดังนั้นพี่เขาก็จะทำการซื้อเลข &lt;strong&gt;12&lt;/strong&gt; และ &lt;strong&gt;21&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;เข้าใจง่ายใช่ไหมครับ แต่ถ้ามันเป็นเลข 3 ตัวล่ะ และในกรณีที่พี่เขาไม่ได้ซื้อเลขโต๊ด แล้วเลขที่พี่เขาซื้อมันออกรางวัลด้วยเพียงแต่พี่เขาไม่ถูกเพราะเลขที่ออกกับเลขที่พี่เขาซื้อมันสลับตำแหน่งกันล่ะ!! เฮ้อ~ มันก็คงจะวนเข้าลูปเดิมเช่นเคย คือ บ่นว่าเฉียดแค่นิดเดียว แต่ถ้าพี่เขาไล่ซื้อเลขกลับของ เลข 3 ตัวทั้งหมดไปแล้วถึงแม้ว่ามันไม่ถูกมันก็อาจไม่ทำให้พี่เขารู้เสียดาย เพราะอย่างไรเสียพี่แกก็เล่นซื้อยาวเป็นหางว่าวอยู่แล้ว🤭&lt;/p&gt;

&lt;h3&gt;
  
  
  โจทย์ 👩‍🏫
&lt;/h3&gt;

&lt;p&gt;ดังนั้น เราก็จะได้โจทย์ในการ exersice คือ จงสร้างฟังก์ชั่นสำหรับกลับเลข 2 สองตัว และเลข 3 ตัว เพื่อหาชุดเลขจากความน่าจะเป็นทั้งหมด เพื่อที่ว่าพี่เขาจะได้ไม่ต้องมานั่งเสียใจทีหลัง เมื่อเลขที่พี่เขาซื้อมันเฉียดแต่ไม่ถูกรางวัล&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ตัวอย่าง&lt;/strong&gt; พี่เขาได้เลย เด็ด 2 ตัว และ 3 ตัว มาจากการไปถูกต้นไม้ศักดิ์สิทมาจากวัดนั่งเทียน จังหวัด เขียนเอา โดยที่เลข 2 ตัวที่ได้มาจากการโรยแป้งและถูต้นไม้ พี่เขาเห็นเป็นเลข 64 และเลข 639 งวดนี้พี่เขาเห็นได้อย่างชัดเจนอย่างที่ไม่เคยเป็นมาก่อน ดังนั้นพี่เขามั่นใจว่าต้องถูกแน่นวล~ แต่ด้วยความที่เราเป็นห่วงพี่ ดังนั้นเราเลยต้องเขียนฟังก์ชั่นเพื่อช่วยกลับเลขที่พี่เขาไปได้มาดังนี้&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ต้องขอขอบคุณ &lt;a href="https://stackoverflow.com/questions/5506888/permutations-all-possible-sets-of-numbers" rel="noopener noreferrer"&gt;Permutations - all possible sets of numbers&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;pc_permute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$perms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$items&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$return&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$perms&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$return&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nv"&gt;$newitems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$items&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nv"&gt;$newperms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$perms&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$foo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_splice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$newitems&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="nb"&gt;array_unshift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$newperms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$foo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="nv"&gt;$return&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$return&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;pc_permute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$newitems&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$newperms&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;สำหรับโค้ดตัวด้านบนนั้นเป็นฟังก์ชั่นที่เอาไว้สำหรับหา ชุดตัวเลขที่เป็นไปได้ทั้งหมด จากตัวเลขเด็ดที่เราได้มา โดยจะรับค่าในรูปแบบ อาเรย์ ในชื่อ &lt;code&gt;$item&lt;/code&gt; ส่วน &lt;code&gt;$perms&lt;/code&gt; ให้ปล่อยว่างไว้ เพราะมันเอาไว้ใช้สำหรับการเรียงสลับชุดตัวเลขที่เราจะทำการค้นหาความเป็นไปได้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;all_possibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$digits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pc_permute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$number&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$digits&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;implode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_unique&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nb"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เราสร้างฟังก์ชั่นอีกฟังก์ชั่นหนึ่งขึ้นมาเพื่อจัดการข้อมูล input และ output และเพื่อให้ง่ายต่อการป้อนข้อมูล เพราะฟังก์ชั่น &lt;code&gt;pc_permute&lt;/code&gt; ของเรานั้นรับค่าเป็น อาเรย์ ในการค้นหาค่าที่เป็นไปได้ทั้งหมดและคืนค่าออกมาในรูปแบบอาเรย์ ที่ย่อยตัวเลขออกเป็นชั้นๆอีกที ถ้าหากสงสัยหรือนึกภาพไม่ออก ก็ลองเอาฟังก์ชั่น &lt;code&gt;pc_permute&lt;/code&gt; ไปรันเพื่อดูผลลัพธ์ก่อนได้ครับ &lt;/p&gt;

&lt;p&gt;เท่านี้เราก็จะได้ฟังก์ชั่นหาค่าที่เป็นไปได้จากการสลับตำแหน่งไปมาของเลขเด็ดที่เราได้มาแล้วครับ ฟังก์ชั่นตัวนี้เป็นการหาค่าความน่าจะเป็นทั้งหมดของตัวเลขที่เราป้อนเข้าไป แต่สิ่งที่ผมต้องการคือแค่หาค่าของเลขสามตัว เพราะเลขสองตัวเราก็สามารถกลับเลขได้เองง่ายๆ อยู่แล้วใช่ไหมล่ะครับ แต่ถ้าเป็นเลขสามตัวก็อาจต้องใช้กระดาษหรือเวลาเพิ่มขึ้นหน่อย แต่เมื่อมีฟังก์ชั่นนี้ก็จะทำให้การซื้อเลขของคุณง่ายมากยิ่งขึ้นครับ&lt;/p&gt;

&lt;h3&gt;
  
  
  ทดสอบกับเลข 2 ตัว ที่พี่เขาไปได้มาจากต้นไม้ศักดิ์สิทธิ์
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// เมื่อเราทำการรันเลข 64&lt;/span&gt;
&lt;span class="nf"&gt;all_possibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ผลลัพธ์ที่ได้ก็จะเป็น&lt;/span&gt;
&lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;46&lt;/span&gt;
  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ทดสอบกับเลข 3 ตัว ที่พี่เขาไปได้มาจากต้นไม้ศักดิ์สิทธิ์
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// เมื่อเราทำการรันเลข 639&lt;/span&gt;
&lt;span class="nf"&gt;all_possibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;639&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ผลลัพธ์ที่ได้ก็จะเป็น&lt;/span&gt;
&lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;369&lt;/span&gt;
  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;396&lt;/span&gt;
  &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;639&lt;/span&gt;
  &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;693&lt;/span&gt;
  &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;936&lt;/span&gt;
  &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;963&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;คราวนี้ถ้าเลขมันออกตามที่พี่เขาซื้อไว้เพียงแต่มันสลับตำแหน่งกัน พี่เขาก็จะได้เต็มๆ (บางคนคงสงสัยว่าทำไมไม่โต๊ด เอาเป็นว่าพี่เขาไม่ชอบซื้อโต๊ดก็แล้วกันครับ) ดังนั้นจึงสรุปได้ว่าพี่เขาอาจไม่ต้องมานั่งเสียใจ และเสียโอกาสในการเป็นเศรษฐีในงวดที่กำลังจะมาถึงนี้นั่นเอง &lt;/p&gt;

&lt;p&gt;จบแล้วครับ&lt;/p&gt;

</description>
      <category>php</category>
      <category>probability</category>
      <category>พีชคณิต</category>
      <category>ไทย</category>
    </item>
    <item>
      <title>Git Rebase คอมมิทที่ push ขึ้นไปแล้ว</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Tue, 02 Jul 2019 12:49:48 +0000</pubDate>
      <link>https://dev.to/uatthaphon/git-rebase-push-4g5</link>
      <guid>https://dev.to/uatthaphon/git-rebase-push-4g5</guid>
      <description>&lt;p&gt;วิธีง่ายๆ ในการกรุ๊ปรวมคอมมิทหลายๆ ตัวให้เป็นตัวเดียว และยังสามารถทำได้แม้ในกรณีที่เรา push  คอมมิทเหล่านั้นขึ้นไปยัง git server เรียบร้อยแล้วด้วย&lt;/p&gt;

&lt;p&gt;Git สามารถที่จะกรุ๊ปรวมคอมมิทให้กลายเป็นคอมมิทเดียวได้ด้วยคำสั่ง &lt;code&gt;git rebase --interactive HEAD~[N]&lt;/code&gt; หรือสั้นๆ &lt;code&gt;git rebase -i HEAD~[N]&lt;/code&gt; โดยที่ [N] คือจำนนวนคอมมิทก่อนหน้านี้ &lt;/p&gt;

&lt;p&gt;อธิบายเพิ่มเติมในส่วนของ &lt;code&gt;HEAD~[N]&lt;/code&gt; ยกตัวอย่างง่ายๆ ในกรณีที่ตอนนี้เราอยู่ที่คอมมิทล่าสุด และถ้าหากเราต้องการกรุ๊ปรวมคอมมิทก่อนหน้านี้ 3 คอมมิท เราสามารถที่จะเพิ่มอาร์กิวเมนต์ต่อท้าย &lt;code&gt;git rebase -i&lt;/code&gt; เพื่อที่จะนำคอมมิทก่อนหน้านี้มา 3 ตัวเพื่อนำมากรุ๊ปรวมให้เป็นคอมมิทเดียว ซึ่งเราสามารถเพิ่มอากิวเมนต์ได้โดยเพิ่มคำสั่ง &lt;code&gt;HEAD~4&lt;/code&gt; ต่อท้าย แต่เมื่อนับรวมกับคอมมิทล่าสุดของเราด้วยแล้วก็จะกลายเป็นว่าเราจะมีคอมมิทที่จะนำไปแก้ไขทั้งหมด 4 ตัว เพื่อให้เข้าใจได้ง่ายขึ้นเดี๋ยวเรามาลองดูโค้ดตัวอย่างกัน&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอน 👩‍🏫
&lt;/h2&gt;

&lt;p&gt;ก่อนที่เราจะทำ &lt;code&gt;rebase&lt;/code&gt; เรามาดูคอมมิทที่เรามีกันก่อน เราสามารถเช็คคอมมิทได้จากหน้าต่างเครื่องมือช่วยอย่าง &lt;a href="https://www.sourcetreeapp.com/" rel="noopener noreferrer"&gt;Sourcetree&lt;/a&gt; หรือจะใช้ command line อย่าง &lt;code&gt;git log&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commit 1e3399... (HEAD -&amp;gt; master, origin/master)
Author: Atthaphon Urairat &amp;lt;xxx@xxxxx.com&amp;gt;
Date:   Wed Jun 26 09:27:07 2019 +0700

    Completed B

commit 729dad...
Author: Atthaphon Urairat &amp;lt;xxx@xxxxx.com&amp;gt;
Date:   Wed Jun 26 09:21:11 2019 +0700

    add more option for header

commit f7375b...
Author: Atthaphon Urairat &amp;lt;xxx@xxxxx.com&amp;gt;
Date:   Wed Jun 26 09:06:29 2019 +0700

    disable cache

commit 256bbc...
Author: Atthaphon Urairat &amp;lt;xxx@xxxxx.com&amp;gt;
Date:   Wed Jun 26 08:54:46 2019 +0700

    corrected method

commit f62f5f...
Author: Atthaphon Urairat &amp;lt;xxx@xxxxx.com&amp;gt;
Date:   Tue Jun 25 18:42:33 2019 +0700

    Completed A

...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หรือถ้าหากว่าเราต้องการดู log แต่ละคอมมิทในบรรทัดเดียว เราก็สามารถเพิ่มอาร์กิวเมนต์ &lt;code&gt;git log --pretty=oneline&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1e3399... (HEAD -&amp;gt; master, origin/master) Completed B    &amp;lt;&amp;lt;&amp;lt; คอมมิทล่าสุด
729dad... add more option for header
f7375b... disable cache
256bbc... corrected method
f62f5f... Completed A                                    &amp;lt;&amp;lt;&amp;lt; คอมมิทเก่ากว่า
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากตัวอย่างข้างต้น ตอนนี้เราอยู่ที่คอมมิทแรก &lt;code&gt;1e3399... (HEAD -&amp;gt; master, origin/master) Completed B&lt;br&gt;
&lt;/code&gt; และต้องการที่จะกรุ๊ปคอมมิทก่อนหน้านี้สามตัวถึงคอมมิทที่ชื่อ &lt;code&gt;256bbc... corrected method&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ผลลัพธ์ที่เราคาดหวังไว้คือการกรุ๊ปรวมคอมมิทให้เป็นดังนี้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1e3399... (HEAD -&amp;gt; master, origin/master) Completed B
f62f5f... Completed A
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;นั่นคือการกรุ๊ปรวมคอมมิททั้งหมดที่อยู่ระหว่าง Completed B และ Completed A ให้เหลือเพียงคอมมิทดังตัวอย่างก่อนหน้านี้ ต่อไปเราก็มารันคำสั่งกันเลย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git rebase -i HEAD~4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;คำเตือน&lt;/strong&gt; เมื่อเรารันคำสั่งไปแล้ว ต่อจากนั้นหน้าจอก็จะเปลี่ยนเป็นตัว editor เพื่อโชว์คอมมิทที่เราต้องการจะทำการกรุ๊ปรวม &lt;strong&gt;แต่!!&lt;/strong&gt; มันจะถูกแสดงออกมาในลำดับการจัดเรียงกลับหลัง ซึ่งต่างจากการรันคำสั่ง &lt;code&gt;git log&lt;/code&gt; ของเราก่อนหน้านี้&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TIP 💡 ในกรณีที่เรามีคอมมิทที่ต้องการจะกรุ๊ปรวมเยอะ และการนับคอมมิทเพื่อเอาเลขมาใส่ท้าย &lt;code&gt;HEAD~&lt;/code&gt; มีความยุ่งยากหรืออาจเกิดข้อผิดพลาดได้ง่าย เราก็สามารถที่จะใช้เลขคอมมิทแทนการใช้ &lt;code&gt;HEAD~[N]&lt;/code&gt; ได้ดังนี้ &lt;code&gt;git rebase -i [commit-number]&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git rebase -i f62f5fd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลลัพธ์ของการรันทั้งสองคำสั่งก็จะได้ค่าออกมาเหมือนกันดังที่แสดงในตัวอย่างด้านล่างนี้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pick f62f5fd corrected method            &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; คอมมิทเก่ากว่า
pick f7375bf disable cache
pick 729dad4 add more option &lt;span class="k"&gt;for &lt;/span&gt;header
pick 1e3399c Completed B                 &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; คอมมิทล่าสุด

&lt;span class="c"&gt;# Rebase f62f5fd..1e3399c onto f62f5fd (3 commands)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นเราก็ทำการ เปลี่ยน &lt;code&gt;pick&lt;/code&gt; เป็น &lt;code&gt;squash&lt;/code&gt; หรือสามารถเขียนสั้นๆ &lt;code&gt;s&lt;/code&gt; ก็ได้เพื่อทำการกรุ๊ปรวมคอมมิทจากเก่าสุดเพื่อให้รวมกับคอมมมิทล่าสุด&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pick f62f5fd corrected method            &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; คอมมิทเก่ากว่า
s f7375bf disable cache
s 729dad4 add more option &lt;span class="k"&gt;for &lt;/span&gt;header
s 1e3399c Completed B                    &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; คอมมิทล่าสุด

&lt;span class="c"&gt;# Rebase f62f5fd..1e3399c onto f62f5fd (4 commands)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นเมื่อเราทำการเซฟไฟล์แล้ว editor ก็จะพาเราไปอีกหน้าซึ่งเป็นหน้าสำหรับ commit msg ใหม่ แต่จะมีข้อความเริ่มต้นให้เราแบบด้านล่างนี้ แต่เราสามารถลบและใส่ข้อความใหม่ได้ หรือจะใช้ข้อความที่มีมาให้ก็ได้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# This is a combination of 3 commits.&lt;/span&gt;
&lt;span class="c"&gt;# This is the 1st commit message:&lt;/span&gt;

corrected method

&lt;span class="c"&gt;# This is the 1st commit message #2:&lt;/span&gt;

disable cache

&lt;span class="c"&gt;# This is the 1st commit message #3:&lt;/span&gt;

add more option &lt;span class="k"&gt;for &lt;/span&gt;header

&lt;span class="c"&gt;# This is the 1st commit message #4:&lt;/span&gt;

Completed B

...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผมจะทำการลบข้อความทั้งหมดให้เหลือเพียงคำว่า &lt;code&gt;Completed B&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Complete B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หลังจากทำการเซฟและออกจาก editor แล้วก็จะปรากฏข้อความแสดงความยินดี ซึ่งแสดงว่าเราทำการรวมคอมมิทให้กลายเป็นคอมมิทเดียวได้สำเร็จแล้ว 🥳🥳 ❤️🎉 (หรืออาจเป็นข้อความ ตอกย้ำก็ได้ในกรณีที่เราทำผิดพลาด 😫😫)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[detached HEAD 1bc71e4] Completed B
 Date: Wed Jun 26 08:54:46 2019 +0700
 4 files changed, 11 insertions(+), 21 deletions(-)
Successfully rebased and updated refs/heads/master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นเราก็จะได้ คอมมิทใหม่มาซึ่งกรุ๊ปรวมคอมมิททั้งหมดที่เราได้ทำไปก่อนหน้านี้มาเป็นที่เรียบร้อยแล้ว &lt;/p&gt;

&lt;p&gt;สุดท้ายนี้ ก็ทำการ push ขึ้นไปยัง git server ของเราอีกครั้งแบบ force push ด้วยคำสี่ง &lt;code&gt;git push origin master --force&lt;/code&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;เตือน&lt;/strong&gt; ❗️ ตั้งสติก่อนสตาร์ท เอ้ย!! โทด โทด ตั้งสติก่อน push ครับ 🤣🤣 เพราะการทำ force push มันถือว่าเป็นความเสี่ยง ดังนั้นเราควรแน่ใจกับ commit ของเรา หรืออาจสร้าง branch ไว้เป็น backup ก่อน ทำการ force push ไว้ดีกว่าครับ &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;วันนี้จบแล้วครับ ขอบคุณที่ติดตามอ่านจนจบครับ หวังว่าจะเป็นประโยชน์กับใครบ้างสักคนบ้างนะครับ&lt;/p&gt;

</description>
      <category>git</category>
      <category>commandline</category>
      <category>ไทย</category>
    </item>
    <item>
      <title>สร้าง PHP pacakge สำหรับ Composer</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Sat, 29 Jun 2019 03:09:51 +0000</pubDate>
      <link>https://dev.to/uatthaphon/php-pacakge-composer-21no</link>
      <guid>https://dev.to/uatthaphon/php-pacakge-composer-21no</guid>
      <description>&lt;p&gt;เมื่อเราสามารถสร้าง Repository ไม่ว่าจะใน Github หรือ Bitbucket สำหรับ PHP code เป็นที่เรียบร้อยแล้ว จากนั้นเราก็สามารถที่จะใช้ &lt;code&gt;git clone&lt;/code&gt; เพื่อดึง Project repository ที่เราได้สร้างไว้เพื่อเอามาใช้กับโปรเจ็คอื่นๆ ได้โดยง่าย แต่เพื่อที่จะให้ง่ายไปยิ่งกว่านั้น และเพื่อซัพพอร์ต Package management ซึ่งถูกใช้กันอย่างแพร่หลายในปัจจุบัน ถ้าหากว่า Repository ที่เราสร้างไว้ไม่ซัพพอร์ตมันแล้วล่ะก็ มันก็คงจะดูไม่ค่อยคูลสักเท่าไหร่ใช่ไหมล่ะครับ 😋&lt;/p&gt;

&lt;p&gt;ด้วยเหตุฉนั้น จึงเป็นสาเหตุที่ทำให้เราต้อง เพิ่ม PHP Repository ของเราเข้าไปใน &lt;a href="https://packagist.org/" rel="noopener noreferrer"&gt;Packagist&lt;/a&gt; เพื่อทำให้ Repository คูลๆ ของเราสามารถเรียกใช้งานด้วย &lt;code&gt;composer&lt;/code&gt; ได้ครับ อย่างเช่น &lt;code&gt;composer require yourname/coolcool&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ขั้นตอน
&lt;/h1&gt;

&lt;p&gt;เรามาเริ่มกันเลยดีกว่าครับ ด้วยความหวังว่าจะมีใครสักคนเห็นว่าเราพยายามหรือไม่ได้ทำงานแบบขอไปที "อู้ว~ แพคเกจของคนนี้เขาใช้ composer ได้ด้วย ดีดี เดี๋ยวกดดาวให้สักหน่อย" ในใจของเราคงหวังไว้อย่างนี้ใช่ไหมครับ อิอิ หรือแม้ว่าเพื่อนๆ ที่เข้ามาอ่านจะไม่ได้คิดแบบนี้ แต่ผมว่าคงมีใครสักคนล่ะที่คิดประมาณนี้ อย่างน้อยก็ผมคนนึงล่ะที่หวังไว้แบบนี้ เพราะอยากได้ดาวกับเขาบ้าง ฮ่าๆ เข้าเรื่องครับ มาเริ่มกันเลยดีกว่า&lt;/p&gt;

&lt;p&gt;1) สร้าง &lt;code&gt;composer.json&lt;/code&gt; ไฟล์ในโปรเจ็คที่เราสร้าง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uatthaphon/g-crawler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A simple php Web Scraper that wrap up Guzzle and DomCrawler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"scrap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dom-crawler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"guzzle"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"library"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MIT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"authors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Atthaphon Urairat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"u.atthaphon@gmail.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"homepage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://atthaphon.urairat.com/"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"require"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"php"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^7.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/dom-crawler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"guzzlehttp/guzzle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^6.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/css-selector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.2"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"require-dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"phpunit/phpunit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^8.1"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"autoload"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"psr-4"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"GCrawler\\"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"autoload-dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"psr-4"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"GCrawler\\Tests\\"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tests/"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) สร้าง Repository ใน &lt;a href="https://github.com/new" rel="noopener noreferrer"&gt;Github&lt;/a&gt; หรือ &lt;a href="https://bitbucket.org/repo/create" rel="noopener noreferrer"&gt;Bitbucket&lt;/a&gt; จากนั้นก็ push โปรเจ็คขึ้นไป หรือถ้าหากว่าสร้างไว้แล้วก็คูลเลยครับ&lt;/p&gt;

&lt;p&gt;3) เพิ่ม Repository ของเราใน &lt;a href="https://packagist.org/packages/submit" rel="noopener noreferrer"&gt;Packagist&lt;/a&gt; เพิ่ม Repository url เพื่อเช็คและกด Submit ได้เลยครับ&lt;/p&gt;

&lt;p&gt;4) หลังจากที่ Packagist เพิ่มโปรเจ็คเราเข้าไปในระบบเป็นที่เรียบร้อยแล้วเราก็จะสามารถใช้ &lt;code&gt;composer require yourname/coolcool&lt;/code&gt; ได้แล้วครับ&lt;/p&gt;

&lt;p&gt;สุดท้ายนี้ใครที่กำลังทำ scrap ข้อมูลด้วย php อยู่ ก็สามารถลองดึง Repository &lt;a href="https://github.com/uatthaphon/g-crawler" rel="noopener noreferrer"&gt;g-crawler&lt;/a&gt; ของผมมาใช้ได้นะครับ เป็น โปรเจ็ค Wrap up &lt;code&gt;symfony/dom-crawler&lt;/code&gt;,&lt;code&gt;symfony/css-selector&lt;/code&gt; และ &lt;code&gt;guzzlehttp/guzzle&lt;/code&gt; ที่ทำไว้เพื่อให้เรียกใช้งานได้ง่าย ไม่ต้องไปเพิ่มโปรเจ็คเองเยอะแยะและทำให้ Config ง่ายและเร็วขึ้นครับ ผมหวังว่าบทความและ Repo ของผมคงจะมีประโยชน์สำหรับคนอื่นบ้างไม่มากก็น้อยนะครับ&lt;/p&gt;

</description>
      <category>php</category>
      <category>composer</category>
      <category>github</category>
      <category>ไทย</category>
    </item>
    <item>
      <title>ต่อยอด Laravel Debugbar เพื่อดีบัก Rest API Routes</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Fri, 28 Jun 2019 02:45:55 +0000</pubDate>
      <link>https://dev.to/uatthaphon/laravel-debugbar-rest-api-routes-hca</link>
      <guid>https://dev.to/uatthaphon/laravel-debugbar-rest-api-routes-hca</guid>
      <description>&lt;h1&gt;
  
  
  ปัญหา 👹
&lt;/h1&gt;

&lt;p&gt;บทความนี้เขียนจากประสบการณ์จริง โปรเจ็คที่ผมทำอยู่มีปัญหาด้านความเร็วในการตอบสนอง เพราะ endpoint บางตัวใช้เวลาในการตอบสนองนานกว่า 10s ทำให้ไม่สามารถที่จะยอมรับได้ เพราะ &lt;strong&gt;ช้าเกินไปมากๆๆๆ&lt;/strong&gt; 😩😩😩 ถ้าเป็นคนที่ทำโปรเจ็คมาตั้งแต่ต้น การดีบักก็คงไม่มีปัญหา &lt;/p&gt;

&lt;p&gt;ผมลองจินตนาการดู ถ้าเราไม่ได้ทำโปรเจ็คต่อล่ะ สมมุติถ้าคนที่มาจับโปรเจ็คต่อไม่ได้มีงานแค่ตัวเดียวล่ะ เขาต้องมาเสียเวลาส่วนมากไปกับแก้ปัญหานิดๆ หน่อยๆ อย่างนั้นหรือ ดูไม่คุ้มเลย 😡&lt;/p&gt;

&lt;p&gt;ผมเลย install package Debugbar เผื่อไว้เพื่อทีจะเอาไว้ดีบัก แต่ติดที่ว่า debugbar ไม่สามารถโชว์ผลลัพธ์ใน api route ได้ 😭😭 เอาล่ะสิต้องพึ่งพา อากู๋ หน่อยล่ะ แล้วในที่สุดหลังจากการ research ผมก็ได้มาซึ่งสิ่งที่ต้องการ 🎉🎉🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Framework &amp;amp; Packages ⚙️
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/laravel/laravel/tree/5.4" rel="noopener noreferrer"&gt;Laravel 5.4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/barryvdh/laravel-debugbar/tree/2.4" rel="noopener noreferrer"&gt;Debugbar 2.4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dingo/api" rel="noopener noreferrer"&gt;Dingo Api&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# install laravel 5.4&lt;/span&gt;
composer create-project &lt;span class="nt"&gt;--prefer-dist&lt;/span&gt; laravel/laravel yourProjectName &lt;span class="s2"&gt;"5.4.*"&lt;/span&gt;
&lt;span class="c"&gt;# install debugbar 2.4 that compatible with laravel 5.4&lt;/span&gt;
composer require barryvdh/laravel-debugbar:~2.4
&lt;span class="c"&gt;# install dingo/api&lt;/span&gt;
composer require dingo/api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผมไม่ได้แสดงวิธี install ทุกขั้นตอนนะครับ เพื่อนๆ สามารถอ่านวิธีการ install และ config เบื้องต้นได้จาก link ที่ให้ไว้ได้นะครับ&lt;/p&gt;

&lt;h2&gt;
  
  
  วิธีทำ 👩‍🏫
&lt;/h2&gt;

&lt;p&gt;จากที่เห็น โปรเจ็คตัวนี้ใช้ laravel v5.4, debugbar v2.4 และ dingo api v1 ส่ิงที่เราต้องการคือ &lt;strong&gt;การโชว์ข้อมูลจาก debugbar เมื่อเราทำการ access api route จาก browser หรือ postman&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;เริ่มด้วยการสร้าง Middleware&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Http\Middleware&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Closure&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Dingo\Api\Http\Response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProfileDingoHttpResponse&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cd"&gt;/**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Closure&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;bound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'debugbar'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'debugbar'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isEnabled&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$queries_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;sqlFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'debugbar'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
            &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;morph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'_debugbar'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="s1"&gt;'total_queries'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$queries_data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="s1"&gt;'queries'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$queries_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'time'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'debugbar'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s1"&gt;'time'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="s1"&gt;'memory'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'debugbar'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s1"&gt;'memory'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * Get only sql and each duration
     *
     * @param $debugbar_data
     * @return array
     */&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;sqlFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$debugbar_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;array_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$debugbar_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'queries.statements'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;array_map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'sql'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;array_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'sql'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="s1"&gt;'duration'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;array_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'duration_str'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นทำการเพิ่ม middleware &lt;code&gt;ProfileDingoHttpResponse&lt;/code&gt; ที่เราเพิ่งสร้างไป ในไฟล์ &lt;code&gt;Kernel.php&lt;/code&gt; ซึ่งอยู่ใน &lt;code&gt;yourProjectName/app/Http/Kernel.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Foundation\Http\Kernel&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;HttpKernel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Kernel&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;HttpKernel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="mf"&gt;...&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$routeMiddleware&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="mf"&gt;...&lt;/span&gt;
        &lt;span class="s1"&gt;'profile-dingo-http'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;\App\Http\Middleware\ProfileDingoHttpResponse&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หลังจากที่เราเพิ่ม &lt;code&gt;'profile-dingo-http' =&amp;gt; \App\Http\Middleware\ProfileDingoHttpResponse::class,&lt;/code&gt; ไปใน &lt;code&gt;$routeMiddleware&lt;/code&gt; จากนั้นเราก็สามารถเพิ่ม middleware ได้แล้ว โดยในโปรเจ็คนี้เราใช้ Dingo api ซึ่งจะเห็นวิธีเพิ่ม middleware ได้จากตัวอย่างด้านล่าง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nv"&gt;$api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Dingo\Api\Routing\Router'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$api&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'v1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'middleware'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'profile-dingo-http'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="mf"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉🎉🎉 เสร็จแล้วครับ &lt;/p&gt;

&lt;h2&gt;
  
  
  ผลลัพธ์ 💯
&lt;/h2&gt;

&lt;p&gt;หลังจากทำการเรียก api จาก url เราจะได้ผลลัพธ์ซึ่งเป็นข้อมูลจาก debugbar ที่เราสร้างไว้ใน Middleware &lt;code&gt;ProfileDingoHttpResponse&lt;/code&gt; ห้อยท้ายมาด้วย&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehiv1ten3i31u5o75q8z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehiv1ten3i31u5o75q8z.jpg" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;นี่คือผลลัพธ์ที่ได้ห้อยท้ายเพิ่มเติมเมื่อเราเพิ่ม middleware เข้าไปครับ ถ้าหากไม่ชัดก็สามารถดูตัวอย่างจากด้านล่างได้ครับ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"_debugbar"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_queries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"queries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"sql"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"select `id`, `name`, `description` from `product` where `id` = '2' limit 1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14.01ms"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1561688591.7021&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1561688591.8966&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.19451189041138&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"duration_str"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"194.51ms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"measures"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Booting"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1561688591.7021&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"relative_start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1561688591.786&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"relative_end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1561688591.786&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.083874940872192&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"duration_str"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"83.87ms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"collector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Application"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1561688591.7738&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"relative_start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.071721792221069&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1561688591.8966&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"relative_end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0000050067901611328&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.12279510498047&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"duration_str"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"122.8ms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"collector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"memory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"peak_usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19660800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"peak_usage_str"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"18.75MB"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ด้วยเหตุฉนั้น เลยได้ผลลัพธ์ในแบบฉนี้ และแล้วในตอนนี้การ debug ก็จะง่ายขึ้นไม่ว่าจะสำหรับคนเก่าหรือใหม่ ซึ่งสามารถทำให้เราหาสาเหตุของสิ่งที่เราต้องการแก้หรือปรับปรุงได้ง่ายยิ่งขึ้น ขอบคุณครับ จบแล้วครับ 🥳 🥳 🥳 &lt;/p&gt;

&lt;h4&gt;
  
  
  Source &amp;amp; so much thanks ❤️🎉🥰
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/barryvdh/laravel-debugbar/issues/252" rel="noopener noreferrer"&gt;REST API profiling #252&lt;/a&gt;&lt;/p&gt;

</description>
      <category>debugbar</category>
      <category>tutorial</category>
      <category>api</category>
      <category>ไทย</category>
    </item>
    <item>
      <title>gowebexamples ภาษาไทย</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Thu, 27 Jun 2019 03:31:31 +0000</pubDate>
      <link>https://dev.to/uatthaphon/gowebexamples-3j9h</link>
      <guid>https://dev.to/uatthaphon/gowebexamples-3j9h</guid>
      <description>&lt;p&gt;Golang ได้ครับความนิยมากขึ้นในทุกชั่ววินาที เมื่อก่อนผมก็หาเวลาว่างในการศึกษาเพิ่มเติมเหมือนกัน แม้ตอนนี้จะแผ่วๆ ไปบ้าง (^_^)&lt;/p&gt;

&lt;p&gt;แต่ตอนที่ได้ทำการศึกษาภาษา Go อยู่นั้นก็ได้ไปเจอกับ &lt;a href="https://github.com/gowebexamples/gowebexamples" rel="noopener noreferrer"&gt;gowebexamples&lt;/a&gt; ที่อยู่บน github เลยเอามาลองแปล เพื่อที่จะได้เป็นการศึกษาเรียนรู้ และน่าจะมีประโยนช์สำหรับคนอื่นด้วย ตอนนี้ก็ได้ทำการแปลเสร็จเป็นที่เรียบร้อยแล้วครับ เลยเอามาแปะเผื่อจะเป็นประโยชน์สำหรับคนที่กำลังสนใจที่จะเรียนรู้ภาษ Go ครับ&lt;/p&gt;

&lt;p&gt;เข้าไปที่ &lt;a href="https://gowebexamples.urairat.com/" rel="noopener noreferrer"&gt;gowebexamples.urairat.com&lt;/a&gt; ได้เลยครับ&lt;/p&gt;

&lt;p&gt;เนื้อหาที่มี จะประกอบไปด้วย &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/hello-world/" rel="noopener noreferrer"&gt;Hello World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/http-server/" rel="noopener noreferrer"&gt;HTTP เซิร์ฟเวอร์&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/routes-using-gorilla-mux/" rel="noopener noreferrer"&gt;เร้าติ้ง (using gorilla/mux)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/templates/" rel="noopener noreferrer"&gt;เทมเพลต&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/forms/" rel="noopener noreferrer"&gt;รีเควสต์และฟอร์ม&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/static-files/" rel="noopener noreferrer"&gt;แอสเสทและไฟล์&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/basic-middleware/" rel="noopener noreferrer"&gt;มิดเดิลแวร์ - ขั้นพื้นฐาน&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/advanced-middleware/" rel="noopener noreferrer"&gt;มิดเดิลแวร์ - ขั้นสูง&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/sessions/" rel="noopener noreferrer"&gt;เซสชั่น&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/json/" rel="noopener noreferrer"&gt;เจสัน&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/websockets/" rel="noopener noreferrer"&gt;เว็บซ็อกเก็ต&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gowebexamples.urairat.com/password-hashing/" rel="noopener noreferrer"&gt;เข้ารหัสแบบแฮช (bcrypt)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;จากที่ผมได้ลองทำความเข้าใจและเปรียบเทียบกับบทความอื่นๆ gowebexamples อาจจะไม่ครอบคลุมเนื้อหาที่มีความ Advance หรือครอบคลุมกระบวนท่าทั้งหมดในการสร้างเว็บไซต์ แต่ก็ถือว่าเป็นจุดเร่ิมต้นที่ดีในการที่จะเรียนรู้ภาษา Go ผ่านโค้ดและการใช้งาน package พื้นฐานต่างๆ ที่มีในการสร้างเว็บไซต์ด้วยภาษา Go &lt;/p&gt;

&lt;p&gt;ความเห็นส่วนตัวของผมคือ มันเป็นบทเรียนที่เหมาะสำหรับผู้เริ่มต้นที่พอมีพื้นฐานด้าน programming อยู่บ้าง เนื่องด้วยความง่ายต่อการทำความเข้าใจของโค้ดตัวอย่างที่มีให้ และการอธิบายที่กระชับครับ&lt;/p&gt;

</description>
      <category>go</category>
      <category>website</category>
      <category>ไทย</category>
    </item>
    <item>
      <title>Hugo + Firebase</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Sat, 22 Jun 2019 15:29:45 +0000</pubDate>
      <link>https://dev.to/uatthaphon/hugo-firebase-5dc9</link>
      <guid>https://dev.to/uatthaphon/hugo-firebase-5dc9</guid>
      <description>&lt;p&gt;เป็น Deveploper มาก็นานทำงานมาไม่ว่าจะเป็นงานบริษัท งานฟรีแลนซ์ หรือจะเป็นโปรเจ็คของตัวเองก็ดี แต่เพิ่งมานึกได้ว่าตอนนี้เรายังไม่มีเว็บ portfolio เป็นของตัวเองเลย&lt;/p&gt;

&lt;p&gt;เมื่อนึกได้ดังนั้นผมจึงตัดสินใจจะสร้างเว็บ portfolio แต่ถ้าทำมาแค่โชว์ผลงาน ผมก็ไม่ค่อยมีอะไรจะเอาออกมาโชว์เหมือนคนอื่นๆเขาซะด้วยสิ งั้นทำ blog ละกันจะได้ดูดีมีเนื้อหาสาระขึ้นมาหน่อย&lt;/p&gt;

&lt;p&gt;หลังจากการเซาะแสวงหาความรู้ใน internet ได้ซักพัก ก็ได้ข้อสรุป &lt;a href="https://gohugo.io/" rel="noopener noreferrer"&gt;Hugo&lt;/a&gt; + &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;Firebase&lt;/a&gt; เป็นบทสรุปที่ลงตัวสำหรับผม ณ ตอนนี้เป็นที่สุด&lt;/p&gt;

&lt;h2&gt;
  
  
  ทำไมต้อง Hugo + Firebase
&lt;/h2&gt;

&lt;p&gt;ก่อนการเซาะแสวงหาเครื่องมือ และ hosting ในการสร้างเว็บไซต์ในครั้งนี้ ผมได้ถามความต้องการของตัวเองก่อน ผมต้องการอะไรที่ง่ายๆ เพียงแค่สร้างเว็บ portfolio และเขียน blog ไปด้วย ซึ่งความต้องการของเว็บไซต์ที่ควรจะมีคือ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;โหลดเร็ว&lt;/li&gt;
&lt;li&gt;ง่ายต่อการเขียน blog แค่ &lt;a href="https://th.wikipedia.org/wiki/%E0%B8%A1%E0%B8%B2%E0%B8%A3%E0%B9%8C%E0%B8%81%E0%B8%94%E0%B8%B2%E0%B8%A7%E0%B8%99%E0%B9%8C" rel="noopener noreferrer"&gt;Markdown&lt;/a&gt; พอ&lt;/li&gt;
&lt;li&gt;ง่ายต่อการพัฒนา&lt;/li&gt;
&lt;li&gt;ง่ายต่อการบำรุงดูแลรักษาและจัดการตัวโค้ด&lt;/li&gt;
&lt;li&gt;ไม่ต้องปวดหัวเรื่องระบบความปลอดภัย&lt;/li&gt;
&lt;li&gt;Free hosting จัดการง่าย&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;นั่นคือที่มาของการเลือกเครื่องมือ ซึ่งนั่นก็คือ Hugo Static Site Generators + Firebase Hosting ในครั้งนี้&lt;/p&gt;

&lt;h2&gt;
  
  
  ทำไมต้อง Hugo
&lt;/h2&gt;

&lt;p&gt;เหตุผลหลักๆที่เลือกใช้ Hugo&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ความเร็วในการคอมไพล์ html&lt;/li&gt;
&lt;li&gt;ความเรียบง่ายของโครงสร้างในส่วนของการจัดการโปรเจ็ค&lt;/li&gt;
&lt;li&gt;ง่ายต่อการพัฒนาเช่นเมื่อเราทำการอัพเดต Theme เจ้า Hugo ก็จะทำการ refresh อัพเดตให้เราโดยอัตโนมัติเลย&lt;/li&gt;
&lt;li&gt;เอกสารที่เข้าใจง่าย&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;การติดตั้งในครั้งนี้ผมทำการติดตั้งในเครื่อง Mac หากว่าใครใช้ Window หรือ Linux ก็เข้าไปดูวิธีติดตั้งได้ใน &lt;a href="https://gohugo.io/getting-started/installing/" rel="noopener noreferrer"&gt;Install Hugo&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ติดตั้ง Hugo
&lt;/h3&gt;

&lt;p&gt;เริ่มกันเลย พร้อมแล้วก็เปิด iTerm หรือ Mac Terminal ขึ้นมา พิมพ์คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ติดตั้ง Hugo ด้วย Homebrew&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;hugo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;** หากใครยังไม่ได้ลง Homebrew ก็ให้ติดตั้งก่อนโดยพิมพ์คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หลังจากติดตั้งเรียบร้อยก็เช็คดูว่าการติดตั้งเรียบร้อยดีหรือไม่&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# เรียกดูเวอร์ชั่นของ hugo ที่ทำการติดตั้ง&lt;/span&gt;
hugo version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เพียงเท่านี้เราก็จะได้ Hugo มาไว้กำมือของเราแล้ว&lt;/p&gt;

&lt;h3&gt;
  
  
  สร้างเว็บด้วย Hugo
&lt;/h3&gt;

&lt;p&gt;พิมพ์คำสั่งเพื่อเริ่มสร้างโปรเจ็คใหม่กันเลย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hugo new site dejo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตอนนี้เราก็จะได้โปรเจ็คที่อยู่ในโฟลเดอร์ที่มีชื่อว่า dejo&lt;/p&gt;

&lt;h3&gt;
  
  
  เลือก Theme สำหรับโปรเจ็ค
&lt;/h3&gt;

&lt;p&gt;Theme สำหรับ Hugo มีให้เลือกเยอะมาก เราสามารถเข้าไปดูได้จาก &lt;a href="https://themes.gohugo.io/" rel="noopener noreferrer"&gt;https://themes.gohugo.io/&lt;/a&gt; สำหรับ Theme ที่เลือกมาใช้ในบทความนี้มีชื่อว่า &lt;a href="https://themes.gohugo.io/hyde/" rel="noopener noreferrer"&gt;Hyde Theme&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# เข้ามายังโฟลเดอร์ themes&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;dejo/themes/

&lt;span class="c"&gt;# โคลน Theme ที่ชื่อว่า hyde&lt;/span&gt;
git clone https://github.com/spf13/hyde.git

&lt;span class="c"&gt;# ทำการเพิ่ม Hyde Theme เข้าไปยัง config.toml&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'theme = "Hyde"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; config.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เท่านี้เราก็ได้ theme สวยๆมาใช้แล้ว&lt;/p&gt;

&lt;h3&gt;
  
  
  เพิ่มบทความให้กับ Blog ของเรา
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ทำการสร้างไฟล์ที่มีขื่อว่า first-post.md ในโฟลเดอร์ posts&lt;/span&gt;
hugo new posts/first-post.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หลังจากเขียนบทความแล้ว เราก็ดูว่าหน้าตาเว็บไซต์ของเราเป็นอย่างไร โดยพิมพ์คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# สร้าง server จำลองพร้อมทั้งเปิดใช้งาน draft โหมด&lt;/span&gt;
hugo server &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ส่วนที่เหลือก็อยู่ที่การตกแต่งต่อยอดเว็บไซต์ให้เป็นไปในสไตล์ที่เราชอบ และเพิ่มเนื้อหาของเว็บไซต์ของเรา&lt;/p&gt;

&lt;h2&gt;
  
  
  ทำไมต้อง Firebase
&lt;/h2&gt;

&lt;p&gt;เหตุผลหลักๆที่ผมเลือกใช้ Firebase ก็เพราะ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ง่ายต่อการเพิ่ม Custom domain อีกทั้งยังมี SSL ให้เราใช้ฟรีอีกด้วย&lt;/li&gt;
&lt;li&gt;ฟรี Worldwide CDN edge servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;เริ่มแรกเลย เราก็ต้องสร้างโปรเจ็คใน &lt;a href="https://console.firebase.google.com/" rel="noopener noreferrer"&gt;Firebase Console&lt;/a&gt; เพื่อทำการ Host เว็บไซต์ของเรา หรือถ้าหากยังไม่มี เราก็สามารถลงทะเบียนได้ฟรีโดยใช้บัญชี google ของเรา&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้นตอนการติดตั้งและใช้งาน
&lt;/h3&gt;

&lt;p&gt;หลังจากทำการสร้างโปรเจ็คใน Firebase Console เสร็จเรียบร้อยแล้ว เราก็ต้องทำการติดตั้ง  &lt;a href="https://firebase.google.com/docs/cli/" rel="noopener noreferrer"&gt;Firebase CLI Tool&lt;/a&gt; ซึ่งเราจำเป็นจะต้องทำการติดตั้ง &lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; ให้เรียบร้อยเสียก่อน หลังจากที่เราติดตั้ง Node.js เรียบร้อยแล้วก็ให้เราพิมพ์คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ติดตั้ง firebase tools ด้วย Node.js&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; firebase-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ต่อไปเราก็ต้องทำการเชื่อมต่อ Firebase Tools เข้ากับบัญชี Google ของเราด้วยคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firebase login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;คำสั่งนี้จะทำการเปิดเบราเซอร์เพื่อให้เราเลือกบัญชีและทำการล็อกอิน เราสามารถใช้คำสั่ง &lt;code&gt;firebase logout&lt;/code&gt; เพื่อทำการล็อกเอาท์ในกรณีที่เราทำการล็อกอินผิดบัญชี&lt;/p&gt;

&lt;p&gt;ใช้คำสั่ง &lt;code&gt;firebase list&lt;/code&gt; เพื่อดูรายชื่อทั้งหมดของโปรเจ็คใน Firsbase project ของเรา โดยที่รายชื่อทั้งหมดควรที่จะเหมือนกับรายชื่อโปรเจ็คที่อยู่ใน Firebase console ของเรา&lt;/p&gt;

&lt;p&gt;ให้เราทำการเปลี่ยนโปรเจ็คไดเรกทอรีที่เราต้องการติดตั้ง firebase ซึ่งในที่นี้ คือ dejo ที่เราได้สร้างไว้ และพิมพ์คำสั่งเพื่อทำการตั้งค่าเริ่มต้น&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากตรงนี้&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เลือก Hosting ใน feature question&lt;/li&gt;
&lt;li&gt;เลือก โปรเจ็คที่เราต้องการ ที่เพิ่งสร้างใน Firebase Console&lt;/li&gt;
&lt;li&gt;เลือก default สำหรับดาต้าเบส rules file&lt;/li&gt;
&lt;li&gt;เลือก default สำหรับ publish directory (public)&lt;/li&gt;
&lt;li&gt;เลือก “No” ถ้าเราทำการ deploy a single-page app, แต่สำหรับผมเลือก "Yes"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;จากนั้นเราจะได้ ไฟล์ใหม่ 2 ไฟล์อยู่ในโปรเจ็คโฟลเดอร์คือ &lt;code&gt;firebase.json&lt;/code&gt; และ &lt;code&gt;.firebaserc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;เราสามารถ ignore &lt;code&gt;.firebaserc&lt;/code&gt; ใน git ได้เพราะไฟล์ตัวนี้มีไว้เพียงเพื่อเก็บข้อมูลว่าโปรเจ็คที่เราใช้อยู่นั้น ใช้ firebase tool อะไรบ้าง ในส่วนของไฟล์ &lt;code&gt;firebase.json&lt;/code&gt; นั้นเอาไว้เพื่อทำการตั้งค่า Hosting&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"hosting"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"public"&lt;/span&gt;: &lt;span class="s2"&gt;"public"&lt;/span&gt;,
    &lt;span class="s2"&gt;"ignore"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
      &lt;span class="s2"&gt;"**/.*"&lt;/span&gt;,
      &lt;span class="s2"&gt;"firebase.json"&lt;/span&gt;,
    &lt;span class="o"&gt;]&lt;/span&gt;,
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตอนนี้เราก็พร้อมที่ทำการนำโค้ดในโปรเจ็คใหม่ของเราเข้าไปวางที่ Firebase Hosting ของเราแล้ว โดยให้เราพิมพ์คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firebase deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นก็รอ... เมื่อการโอนย้ายเสร็จสิ้น เพียงเท่านี้เราก็สามารถเข้าไปดูเว็บไซต์ใหม่ของเราด้วย URL ที่ได้จากหน้า Firebase Console ในส่วนของ  Hosting ได้เลย&lt;/p&gt;

&lt;h2&gt;
  
  
  ยังไงต่อล่ะทีนี้
&lt;/h2&gt;

&lt;p&gt;ในบทความนี้เราพูดถึงเรื่องของพื้นฐานการติดตั้ง Hugo และการเซ็ตอัพ Firebase hosting เพื่อการ deploy เท่านั้น&lt;/p&gt;

&lt;p&gt;ในส่วนตัวของผม นอกเหนือจากการตกแต่งและเพิ่มเนื้อหา ขั้นตอนต่อไปก็เห็นจะเป็น&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;การผูกโดเมนเข้ากับ Firebase hosting&lt;/li&gt;
&lt;li&gt;การเซ็ตค่า header ต่างๆให้กับโปรเจ็ค&lt;/li&gt;
&lt;li&gt;การทำ continuous integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;อู้หู!! เหลืออีกหลายอย่างเลยกว่าจะเสร็จตามต้องการ&lt;/p&gt;

</description>
      <category>hugo</category>
      <category>firebase</category>
      <category>tutorial</category>
      <category>ไทย</category>
    </item>
    <item>
      <title>Go สำหรับสร้าง Mobile Apps</title>
      <dc:creator>Atthaphon Urairat</dc:creator>
      <pubDate>Sat, 22 Jun 2019 15:28:56 +0000</pubDate>
      <link>https://dev.to/uatthaphon/go-mobile-apps-c37</link>
      <guid>https://dev.to/uatthaphon/go-mobile-apps-c37</guid>
      <description>&lt;p&gt;Go นับเป็นภาษาใหม่ที่น่าจับตามอง อีกทั้งยังเป็นที่สนใจของหลายๆคน&lt;br&gt;
โดยนอกเหนือจากความโดดเด่นในการสร้างเว็บไซต์ที่มีความเร็วในการประมวลผล&lt;br&gt;
และรองรับการใช้งานพร้อมๆกันได้ดีกว่าภาษาอื่นๆ&lt;br&gt;
อย่างเห็นได้ชัด ซื่งเราสามารถเห็นได้จากผลการทดสอบเปรียบเทียบในบทความต่างๆที่แพร่หลายอยู่ในขณะนี้&lt;/p&gt;

&lt;p&gt;ในตอนนี้ Go ก็ได้มีความพยายามพัฒนา Project&lt;br&gt;
ที่จะนำมาพัฒนาโปรแกรมมือถือซึ่งในขณะนี้ก็ถือว่ายังอยู่ในขั้นตอนของการพัฒนา&lt;br&gt;
ซึ่งการนำตัวโปรเจ็คมาใช้ก็อาจมีความเสี่ยงและพบปัญหาการใช้งานบ้าง&lt;br&gt;
ด้วยความที่ตัวโปรเจ็คกำลังอยู่ในขั้นตอนของการพัฒนา และยังไม่มีการซัพพอร์ตอย่างเป็นทางการ&lt;br&gt;
จากทั้งทาง Google และ Go team เพราะตอนนี้ Go team&lt;br&gt;
ก็กำลังพยายามเป็นอย่างมากในการปรับปรุงตัวโปรเจ็ค เราสามารถเข้าไปดูได้จาก &lt;a href="https://github.com/golang/mobile" rel="noopener noreferrer"&gt;github.com/golang/mobile&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;แต่สำหรับคนที่อยากลองของใหม่ก่อนใครเพื่อน ก็คงไม่ใช่ปัญหาใช่ไหมล่ะครับ&lt;br&gt;
ถ้าคุณเป็นอีกคนหนึ่งที่เชื่อว่า &lt;strong&gt;"มาก่อนได้ก่อน"&lt;/strong&gt;&lt;br&gt;
อย่ารอให้มันเป็นที่นิยมก่อนแล้วค่อยกระโดดเข้ามาเลยครับ&lt;/p&gt;
&lt;h2&gt;
  
  
  Go Mobile
&lt;/h2&gt;

&lt;p&gt;Go mobile เป็น repository ย่อย ของ Go project ที่รองรับระบบการทำงานของ Smart&lt;br&gt;
phone ทั้ง Android และ iOS และมีเครื่องมือช่วยสำหรับการ build โปรแกรมของเรา&lt;/p&gt;

&lt;p&gt;ในส่วนของการใช้งาน Go สำหรับสร้างแอพพลิเคชั่น นั้นสามารถแบ่งออกได้เป็น 2 แบบคือ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ใช้ Go ในการสร้าง แอพพลิเคชั่น หรือให้ Golang เป็น Native application&lt;/li&gt;
&lt;li&gt;ใช้ Go ร่วมกับ Native application หรือ SDK applications and generating bindings&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  เลือกใช้ Go เป็น Native หรือ ใช้ Go เป็น Package เสริมดี
&lt;/h3&gt;

&lt;p&gt;ในส่วนนี้ขึ้นอยู่กับลักษณะของโปรเจ็คที่เรากำลังทำ หรือกำลังจะทำ&lt;br&gt;
เราลองมาดูข้อดีข้อเสียหรือข้อจำกัดของทั้งสองแบบนี้กันดีกว่า&lt;/p&gt;
&lt;h4&gt;
  
  
  ใช้ Go ในการสร้าง แอพพลิเคชั่น หรือให้ Golang เป็น Native application
&lt;/h4&gt;

&lt;p&gt;ในส่วนของการที่เราจะใช้ Go เป็น Native นั้นหมายถีงการที่เราเลือกจะใช้ภาษา Go&lt;br&gt;
เป็นภาษาหลักในการสร้าง แอพพลิเคชั่น ซึ่ง ณ ตอนนี้ (29 Dec 2018) Go mobile ยังมี&lt;br&gt;
package ให้เราได้ใช้สำหรับสร้าง mobile แอพพลิเคชั่นไม่มากนักซึ่งก็จะมี&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App control and configuration&lt;/li&gt;
&lt;li&gt;OpenGL ES 2 bindings&lt;/li&gt;
&lt;li&gt;Asset management&lt;/li&gt;
&lt;li&gt;Event management&lt;/li&gt;
&lt;li&gt;Experimental packages include OpenAL bindings, audio, font, sprite and motion sensors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;เราสามารถเข้าไปดูตัวอย่างสำหรับ Go native application โค้ดได้ที่ &lt;a href="https://godoc.org/golang.org/x/mobile/example" rel="noopener noreferrer"&gt;golang.org/x/mobile/example&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  ใช้ Go ร่วมกับ Native application หรือ SDK applications and generating bindings
&lt;/h4&gt;

&lt;p&gt;ข้อดีของการใช้ Go ร่วมกับ Native application&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เราสามารถนำ Go package มาใช้ซ้ำได้โดยการเพิ่ม หรือ
เสริมเข้าไปในตัวโปรเจ็คที่มีอยู่แล้ว โดยที่เราไม่ต้องแก้ไขตัวโปรเจ็คที่มีอยู่แล้ว&lt;/li&gt;
&lt;li&gt;ตัว Go package เสริมที่เราสร้างไว้สามารถนำไปใช้กับ Native application
ไม่ว่าจะเป็น Android หรือ iOS ก็ได้&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ต่อไปนี้คือข้อจำกัดที่มี&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ตอนนี้สามารถรองรับ types ได้เพียงไม่กี่ชนิดเท่านั้น ดูได้จาก &lt;a href="https://godoc.org/golang.org/x/mobile/cmd/gobind#hdr-Type_restrictions" rel="noopener noreferrer"&gt;subset of Go types&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;การใช้ language binding จะมีปัญหาในเรื่องของการประมวลผล&lt;/li&gt;
&lt;li&gt;การเรียกใช้งาน APIs นั้นมีข้อจำกัด
ดังนั้นเราจำเป็นต้องศีกษาข้อจำกัดของตัวภาษาที่เราจะทำการใช้งานด้วย&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  ติดตั้งและทดลองรันโปรแกรม
&lt;/h2&gt;

&lt;p&gt;เรารู้แล้วว่าการใช้ Go ในการสร้าง Mobile application มีอยู่ด้วยกัน 2&lt;br&gt;
แบบหลักๆ ซึ่งในบทความนี้เราจะทำการติดตั้งและทดลองรันโปรแกรม ในแบบที่ใช้ Go เป็น&lt;br&gt;
Native application โดยจะทำการติดตั้งด้วยเครื่องมือที่ Go Mobile มีมาให้ และดาวน์โหลด&lt;br&gt;
Source code ตัวอย่างมาติดตั้งเพื่อทำการ build APK สำหรับ Android&lt;br&gt;
สำหรับทดสอบในมือถือกัน&lt;/p&gt;

&lt;p&gt;ถ้าเพื่อนๆต้องการดูตัวอย่างการติดตั้งในแบบอื่นๆ ก็สามารถเข้าไปดูได้ที่ &lt;a href="https://github.com/golang/go/wiki/Mobile" rel="noopener noreferrer"&gt;Go Mobile&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;สำหรับการใช้งาน Go mobile เราต้องทำการติดตั้ง &lt;a href="https://golang.org/dl/" rel="noopener noreferrer"&gt;Go 1.5 หรือเวอร์ชั่นที่สูงกว่า&lt;/a&gt; หรือย่างน้อยที่สุดต้องใช้ เวอร์ชั่น 1.7.4 ในกรณีที่คุณใช้ macOS sierra&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ขั้นแรกเราต้องทำการติดตั้ง tools กันก่อน โดยการรันคำสั้งต่อไปนี้ใน terminal หรือ iTerm&lt;br&gt;
ของคุณ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;go get golang.org/x/mobile/cmd/gomobile
&lt;span class="nv"&gt;$ &lt;/span&gt;gomobile init &lt;span class="c"&gt;# ใช้เวลาในการติดตั้งพอควร&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หลังจากเราทำการติดตั้ง gomobile เสร็จ&lt;br&gt;
เราก็ทำการดาวน์โหลดตัวอย่างมาไว้ในเครื่องของเราด้วยคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;go get &lt;span class="nt"&gt;-d&lt;/span&gt; golang.org/x/mobile/example/basic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ต่อไปเราก็จะทำการ build ตัวโปรเจ็คที่เราเพิ่งดาวน์โหลดมาเพื่อสร้างไฟล์ APK&lt;br&gt;
เพื่อที่จะทำการติดตั้งและทดสอบใน Smart phone ของเรา&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gomobile build &lt;span class="nt"&gt;-target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;android golang.org/x/mobile/example/basic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;ในกรณีที่เกิด error &lt;code&gt;gomobile: no Android NDK path is set. Please run gomobile init with the ndk-bundle installed through the Android SDK manager or with the -ndk flag set.&lt;/code&gt; แสดงว่า gomobile ของเราหา ndk ไม่เจอดังนั้นให้เราทำการรันคำสั่ง &lt;code&gt;gomobile init&lt;/code&gt; ใหม่อีกครั้งพร้อมทั้งพ่วง path ของ ndk-bundle เข้าไปด้วย&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gomobile init &lt;span class="nt"&gt;-ndk&lt;/span&gt; ~/Library/Android/sdk/ndk-bundle/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นให้รันคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gomobile build &lt;span class="nt"&gt;-target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;android golang.org/x/mobile/example/basic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ในที่สุดเราก็ได้ ไฟล์ APK มาแล้ว ต่อไปเราก็นำไฟล์ APK&lt;br&gt;
ที่ได้ไปติดตั้งและทดสอบในมือถือของเราได้แล้ว&lt;/p&gt;

</description>
      <category>go</category>
      <category>mobile</category>
      <category>ไทย</category>
    </item>
  </channel>
</rss>
