<?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: Pronto Tools</title>
    <description>The latest articles on DEV Community by Pronto Tools (@prontotools).</description>
    <link>https://dev.to/prontotools</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%2Forganization%2Fprofile_image%2F662%2F6855aafa-3452-4457-b38e-a430d48e0fe9.png</url>
      <title>DEV Community: Pronto Tools</title>
      <link>https://dev.to/prontotools</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prontotools"/>
    <language>en</language>
    <item>
      <title>Set a fire in your heart with CODE MANIA 🔥</title>
      <dc:creator>praewpraew-p</dc:creator>
      <pubDate>Fri, 03 Jan 2020 07:42:20 +0000</pubDate>
      <link>https://dev.to/prontotools/set-a-fire-in-your-heart-with-code-mania-od9</link>
      <guid>https://dev.to/prontotools/set-a-fire-in-your-heart-with-code-mania-od9</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;🌈 Code Mania 1010: All About Passion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;วนเวียนมาเจอกันอีกครั้งสำหรับงาน &lt;strong&gt;Code Mania&lt;/strong&gt; ซึ่งครั้งนี้มีชื่อตอนว่า &lt;strong&gt;Code Mania 1010: All About Passion&lt;/strong&gt; แค่ฟังก็รู้สึกว่า Passion ในตัวมันฮึกเหิมขึ้นมาทีเดียว 🔥&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_uKXsWAo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/6.jpg%3Ftoken%3DAGZNXF4Q6RZTHN6S7FJ3QXS6B3CR4" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_uKXsWAo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/6.jpg%3Ftoken%3DAGZNXF4Q6RZTHN6S7FJ3QXS6B3CR4" alt="CodeMania1010"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ป้ายชื่อ&lt;/th&gt;
&lt;th&gt;กำหนดการ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--71kjOuuo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/1_1.jpg%3Ftoken%3DAGZNXFZIGQMX6RT4C27OU2C6B3N6S" alt="CodeMania1010"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0OLPHv5A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/2_2.jpg%3Ftoken%3DAGZNXFY2T7QSJWPKIHZCIQS6B3NTO" alt="CodeMania1010"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;อันดับแรกพอเข้าไปในงานก็ว้าวก่อนเลย ว้าวกับ True Digital Park 55555 ตึกสวยสุดๆ ที่งานมีบริษัทหลายบริษัทมาออกบูธกันด้วย ทั้งแนะนำบริษัท รับสมัครงาน เยอะแยะมาก แล้วแต่ละบูธก็มีของมาแจกเพียบ เราก็เลยพลาดไม่ได้ที่จะไปล่าของแจกมาด้วยย แน่น๊อนน ได้มาเพียบเลยล่ะ!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h-8GC3vf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/9.jpg%3Ftoken%3DAGZNXF5E4N76WFKCH5IFATC6B3UKK" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h-8GC3vf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/9.jpg%3Ftoken%3DAGZNXF5E4N76WFKCH5IFATC6B3UKK" alt="CodeMania1010"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oTEJ6Ztt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/4.jpg%3Ftoken%3DAGZNXF6NFXWXMOLWES5GTP26B3SVE" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oTEJ6Ztt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/4.jpg%3Ftoken%3DAGZNXF6NFXWXMOLWES5GTP26B3SVE" alt="CodeMania1010"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ช่วงงานเริ่มจะมี speaker ขึ้นมาพูดในหลากหลายหัวข้อ ซึ่งแต่ละหัวข้อมันเป็นอะไรที่สุดยอด ตื่นเต้นสุดๆ เลยที่ได้มานั่งฟังอะไรใหม่ๆ ที่นี่ หลังจากนั้นช่วงใกล้พักอาหารกลางวันก็จะมีกิจกรรม &lt;strong&gt;Connection Activity&lt;/strong&gt; ขอบอกว่า แอบมาคนเดียวก็ไม่ต้องกลัวเหงาเลยค่ะ เพราะกิจกรรมนี้ก็เพื่อให้ผู้ที่สนใจแลกเปลี่ยนความคิดเห็นในเรื่องเดียวกัน ได้มีโอกาสนั่งคุยกันนั่นเอง ซึ่งก็มีหลากหลายหัวข้อเลยเลยทีเดียว ตั้งแต่ Blockchain ไปจนถึง Video Games เลยค่ะ แต่ถ้าใครมีหัวข้ออื่นที่อยากจะแลกเปลี่ยน ก็เสนอไปได้เลย! 🙌&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--REu45mep--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/8.jpg%3Ftoken%3DAGZNXF6LRXQPID5P2TOLCYK6B3USM" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--REu45mep--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/8.jpg%3Ftoken%3DAGZNXF6LRXQPID5P2TOLCYK6B3USM" alt="CodeMania1010"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fiQOcQCz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/5.jpg%3Ftoken%3DAGZNXF2X3D2IPKQT2NXZDFC6B3P6Y" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fiQOcQCz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/praewpraew-p/blog_images_repo/master/codemania1010/5.jpg%3Ftoken%3DAGZNXF2X3D2IPKQT2NXZDFC6B3P6Y" alt="CodeMania1010"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ในช่วงบ่ายก็จะแบ่งการเข้าฟังบรรยายเป็นหัวข้อ แต่ละหัวข้อก็จะมี speaker มาให้ความรู้เยอะแยะเลย ทั้งหัวข้อเกี่ยวกับ Serverless, DevOps, Blockchain หรือจะเป็นฝั่งของ Machine Learning และ Testing อีกด้วย อีกทั้งยังมี workshop เล็ก ๆ ซึ่งจะถูกจัดที่ห้อง Workshop Room มีทั้ง Flutter สำหรับสายโมบายแอป หรือจะเป็น สร้างแบงค์บน Ethereum ด้วย Smart Contract ใครสนใจเรื่องไหน อยากเข้าฟังอะไรเชิญตามสบายค่ะ&lt;/p&gt;

&lt;p&gt;แต่ไม่ต้องกลัวนะคะว่าเราจะได้มาเลือกปุบปับหน้างานว่าจะเข้าอะไรดี ก่อนวันงานทางผู้จัดได้อัพโหลดตารางกิจกรรมให้ทุกคนได้ทราบเพื่อที่จะได้ตัดสินใจกันก่อนอยู่แล้ว ใครที่อยากจะเข้าเวิร์คช็อปจะได้เตรียมแล็ปท็อปมาให้พร้อม 👩‍💻 &lt;br&gt;
&lt;em&gt;(ติดตามข่าวสารได้ที่ &lt;a href="https://www.facebook.com/ThaiProgrammerSociety"&gt;facebook page: สมาคมโปรแกรมเมอร์ไทย&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ช่วงโหวต Session ที่ชอบที่สุด ! ❤️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ถ้าจะต้องเลือกที่ชอบมากจริงๆ ฟังเพลินๆเลยก็จะเป็น &lt;code&gt;Myths of Software Testing&lt;/code&gt; ค่ะ แต่ไม่ได้หมายความว่า session อื่นไม่สนุกน้า อันนี้เราก็ต้องมีเอนเอียงตามความชอบนิดหน่อย แหะๆ จากการฟังก็ทำให้รู้ว่า จริงๆแล้วเนี่ยเรื่องของเทส มันไม่ได้เกี่ยวกับ Tester เพียงคนเดียวค่ะ &lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Software Testing != Tester’s Job”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;ทุกๆคนในทีมต่างก็ต้องมีส่วนร่วมในการเทส เพื่อให้เราได้ซอฟต์แวร์ที่มี quality สูงสุดนั่นเอง &lt;em&gt;ว่าแต่คนในทีมจะช่วยได้ยังไงบ้างนะ ?&lt;/em&gt; ยกตัวอย่างกับการทำ unit test เลยค่ะ หลายๆคนพอลงท้ายด้วยคำว่าเทสปุ๊บ อ้ะ หน้าที่ Tester 😢 แต่ถ้ามาดูกันจริงๆแล้ว การทำ  unit test เนี่ย เราต้องการทดสอบส่วนของฟังก์ชันที่ถูกพัฒนาขึ้นโดย Developer ใช่มั้ยคะ มันจะดีกว่ามั้ยถ้าคนที่เขียนโค้ดเหล่านั้นขึ้นมา เป็นคนเขียนเทสเพื่อทดสอบมัน เพราะคงไม่มีใครรู้จักโค้ดเหล่านั้นได้ดีกว่าคนที่เขียนแน่นอน &lt;/p&gt;

&lt;p&gt;โอ้โห นี่แค่น้ำจิ้มจาก session นี้นะคะเนี่ย ยังมีอีกหัวข้อที่น่าสนใจสำหรับผู้เขียน ก็คือ &lt;code&gt;DevOps&lt;/code&gt; นั่นเอง ตอนแรกนี่เดินเข้าไปด้วยความคิดที่ว่า ‘DevOps’ คืออะไร? ได้ยินมาก็บ่อยแต่จริงๆ มันคืออะไรกันนะ? พอเข้าไปฟังก็ทราบทั้งหมดเลย ทั้งความหมายของ DevOps หลักการ แนวคิด และอื่นๆ อีกมาก เป็น DevOps101 จริงๆ ใครที่ไม่มีพื้นฐานมาก่อนไม่ต้องกลัวเลย เพราะ speaker อธิบายตั้งแต่เริ่มต้น ทำความเข้าใจได้ง่ายมากค่ะ &lt;/p&gt;

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

</description>
      <category>codemania</category>
      <category>codemania1010</category>
      <category>community</category>
      <category>passion</category>
    </item>
    <item>
      <title>Python101: น้องงูและถิ่นที่อยู่ 🐍</title>
      <dc:creator>praewpraew-p</dc:creator>
      <pubDate>Wed, 11 Dec 2019 10:09:34 +0000</pubDate>
      <link>https://dev.to/prontotools/python101-4ghb</link>
      <guid>https://dev.to/prontotools/python101-4ghb</guid>
      <description>&lt;p&gt;ก่อนอื่นเลย ก็ต้องแนะนำตัวกันก่อน เพราะนี่เป็นบทความแรกของพวกเรา #ppbb👩‍💻&lt;br&gt;
ใช่ บทความนี้ถูกเขียนโดยเราสองคน ซึ่งได้เข้ามาเป็น intern ที่ Pronto tools 💙&lt;br&gt;
จากเวลาครึ่งวันที่พี่ได้สอน python ฉบับเริ่มต้นให้กับพวกเรา ก็ทำให้บทความนี้ถือกำเนิดขึ้นนั่นเอง !&lt;/p&gt;
&lt;h4&gt;
  
  
  💙 มาทำความรู้จักกับ Python Interpreter
&lt;/h4&gt;

&lt;p&gt;น้องงูของเราเนี่ยถูกพัฒนาขึ้นมาให้เป็นภาษาที่อ่านง่าย ไม่ซับซ้อน แล้วก็มีข้อยกเว้นน้อยกว่าตัวภาษาอื่น ๆ &lt;/p&gt;
&lt;h5&gt;
  
  
  : Python have battery includeeee !
&lt;/h5&gt;

&lt;p&gt;ทำไม python ถึงถูกเรียกว่า Battery include ? เป็นเพราะว่า python เป็นภาษาที่สามารถขับเคลื่อนได้ด้วยตัวของมันเอง กล่าวคือ มี library ในตัวเองมากพอที่จะไม่จำเป็นต้อง import มาจากที่อื่น ฉันสามารถอยู่ได้ด้วยตัวเองนะ!&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_Ll0DHUw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/bimmin/python101/master/py1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_Ll0DHUw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/bimmin/python101/master/py1.png" alt="alt text" title="python101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;😎 ความลับ (ที่ไม่ลับ) ของ python อีกอย่างหนึ่ง: ตัว interpreter ของ python นั้นสามารถเรียกใช้ script หรือ function บน command line ได้เลย&lt;/p&gt;
&lt;h4&gt;
  
  
  💙 Pip
&lt;/h4&gt;

&lt;p&gt;คำสั่งที่คนทั่วไปมักจะคุ้นเคยในการลง module ของ python เพียงแค่พิมพ์ pip install … module ทั้งหลายที่ต้องการก็จะโผล่พรึบมาอยู่ในเครื่องอย่างง่ายดาย~&lt;/p&gt;

&lt;p&gt;ถามว่า ถ้าเราต้องการ ‘ยืม’ library สำเร็จรูปที่คนอื่นเคยเขียนไว้แล้วมาใช้ได้มั้ย?&lt;br&gt;
  ตอบเลยว่าสำหรับ python นั้น ได้!&lt;/p&gt;

&lt;p&gt;เรามีสิ่งที่เรียกว่า PyPi คือเว็บที่ทุกคนสามารถอัพโหลด package/module ของตัวเองให้เป็นสาธารณะและทุกคนสามารถใช้ร่วมกันได้ เหมือนเขียนหนังสือของตัวเองแล้วไปวางไว้ที่ห้องสมุด เจ๋งสุดๆ ไปเลย!&lt;/p&gt;

&lt;p&gt;แล้วระบบจัดการตัวเองของ python เนี่ย ถือว่าฉลาดมากๆ เลยนะ มันจะไม่ให้ตัวเองทำงานหนัก ทรัพยากรตัวไหนที่สามารถใช้ซ้ำได้มันก็จะใช้ตัวนั้นแหละ พูดง่ายๆ ก็อย่างเช่น &lt;/p&gt;

&lt;p&gt;โปรเจกต์ monday มีการใช้งาน module drinkbeerwithme🍻 อยู่ แล้วโปรเจกต์ friday มีการใช้งาน module sleeplikecrazy🛌 กับ module drinkbeerwithme🍻, python ก็จะไม่ลง module drinkbeerwithme🍻 ใหม่นะ มันจะไปใช้ module ร่วมกับโปรเจกต์ monday เลย ว้าว!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip freeze and pip list
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ทั้งสองคำสั่งให้ผลลัพธ์และการแสดงผลคล้ายๆ กัน ต่างกันที่รูปแบบ pip list จะแสดงผล module ทั้งหมดภายในเครื่องในรูปแบบที่เข้าใจง่าย user สามารถดูได้รู้เรื่อง ในขณะที่ pip freeze ก็ใช้ในการแสดงผล module ด้วยเช่นกัน แต่จะอยู่ในรูปแบบของ requirements format แทน&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lUOQdQpc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/bimmin/python101/master/py2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lUOQdQpc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/bimmin/python101/master/py2.png" alt="alt text" title="python101"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install -r requirement.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;คำสั่งนี้ใช้ในกรณีที่ต้องการลง module หลายๆ ตัวพร้อมกัน โดยสามารถเขียน module และเวอร์ชันที่ต้องการด้วย format เดียวกับ pip freeze ลงในไฟล์ .txt แล้ว install ทีเดียวได้เลย&lt;/p&gt;

&lt;h4&gt;
  
  
  💙What is Virtualenv ?
&lt;/h4&gt;

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

&lt;p&gt;เจ้าตัว virtualenv นี่แหละที่จะเข้ามาช่วยในการจัดการกับ environment ของเรา โดยเราสามารถแบ่ง environtment ของเราไว้ให้สำหรับแต่ละโปรเจกต์ใช้อีกที ซึ่งก็จะทำให้การจัดการกับ library ในแต่ละโปรเจกต์ของเราเป็นเรื่องง่ายขึ้นนั่นเอง ! ลองมาดูรูปนี้กัน&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UzlfWqGt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/bimmin/python101/master/venv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UzlfWqGt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/bimmin/python101/master/venv.png" alt="alt text" title="python101venv"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;จากรูปเราจะเห็นว่ามี 2 โปรเจกต์ที่มีความต้องการใช้ library ที่แตกต่างกัน เราจึงจำเป็นที่จะต้องใช้ virtualenv ในการจัดการกับ environment ให้กับทั้งสองโปรเจกต์นั่นเอง&lt;/p&gt;

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

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python -m venv xPronto
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;สิ่งที่เราจะได้ก็คือ มันจะทำการสร้าง folder สำหรับ environment นี้ขึ้นมา โดยใช้ชื่อว่า &lt;br&gt;
xPronto นั่นเอง&lt;/p&gt;

&lt;p&gt;วิธีเรียกใช้ล่ะ? เราต้องทำการ activate มัน โดยใช้คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source /path/to/ENV/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ซึ่งหน้าตาหลังจาก activate ก็จะมีหน้าตาแบบนี้นี่เอง คือจะมี (env) เพื่อบอกเราว่าตอนนี้เราอยู่ใน environment นี้แล้วนะ แล้วเราก็จะสามารถลง library ที่เราต้องการสำหรับโปรเจกต์นี้ได้เลย !&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5Yf1UVL8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/bimmin/python101/master/py3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5Yf1UVL8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/bimmin/python101/master/py3.png" alt="alt text" title="python101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ส่วนการจะออกจาก environment เราก็แค่ใช้คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deactivate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  💙Pyenv
&lt;/h4&gt;

&lt;p&gt;ทีนี้เราจะมาทำความรู้จักกับอีกหนึ่งพระเอกของเราก็คือ Pyenv มันก็คือตัวที่เอามาช่วยในการจัดการกับ python version ของเรา ที่ก็มีออกมาหลาย version ซะเหลือเกิน &lt;/p&gt;

&lt;p&gt;โดยเราก็จะทำการติดตั้งก่อน โดยใช้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install pyenv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;และเพื่อให้มั่นใจว่า system จะทำการเรียกใช้ pyenv โดยอัตโนมัติเมื่อเราเปิด terminal เราจะทำการแก้ไขไฟล์ .zshrc (อันนี้ขึ้นอยู่กับ shell ของแต่ละคนเลยค่ะ) โดยเพิ่มคำสั่งข้างล่างนี้ลงไป&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# PYENV INIT
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(command pyenv init - --no-rehash zsh)"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;เท่านี้การติดตั้ง pyenv ของเราก็จะเสร็จเรียบร้อย เราจะมาลองเรียกใช้เจ้าตัว pyenv กัน โดยใช้คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyenv global    
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ตามชื่อของมันก็บอกเลยว่าเป็น global เพราะฉะนั้น python version ที่ปรากฏก็คือ version ของ system นั่นเอง &lt;/p&gt;

&lt;p&gt;ทีนี้ถ้าเราจะลง python ผ่าน pyenv ก็แค่ใช้คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyenv install version
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;แล้วถ้าเราอยากจะเปลี่ยน version ให้กับ system ของเครื่อง หรือโปรเจกต์ที่ต้องการล่ะ ? pyenv สามารถจัดการได้ง่ายๆเลย โดยใช้คำสั่งดังนี้เลย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyenv global version
#กำหนด python version ให้กับ system ของเรา

pyenv local version
#กำหนด python version ให้กับ project ของเรา
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;มาลองดูตัวอย่างข้างล่างนี้กัน เราจะทำการกำหนด python version ให้กับโปรเจกต์ที่มีชื่อว่า changev เราก็จะเข้าไปที่ folder นั้นก่อน แล้วลองตรวจสอบ version ด้วย pyenv version ก่อน ซึ่งจะเห็นว่าเป็น version 3.8.0 &lt;/p&gt;

&lt;p&gt;ทีนี้เราจะกำหนด version ของโปรเจกต์นี้เป็น 3.7.4 แทน จึงใช้คำสั่ง pyenv local 3.7.4 พอลองเรียกใช้ python ดู ก็เป็นอันเสร็จเรียบร้อย !&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wnDVQiZg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/bimmin/python101/master/py4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wnDVQiZg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/bimmin/python101/master/py4.png" alt="alt text" title="python101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;จบไปแล้วกับ python101 ของเรา หลาย ๆ คนก็อาจสงสัยว่าทำไมเราถึงจัดให้มันเป็นส่วนแรกที่จะต้องให้ความสำคัญก่อนการเขียนโค้ด ในกรณีที่เป็นโปรเจกต์เล็ก ๆ อาจจะยังนึกภาพกันไม่ค่อยออก &lt;br&gt;
แต่ถ้าลองนึกถึงโปรเจกต์ที่ใหญ่ขึ้น มีการทำงานร่วมกับหลายทีม ปัญหาในการจัดการกับ library สำหรับทีมนั้นทีมนี้ อื้อหืออ ไม่อยากจะนึกภาพความยุ่งเหยิงพวกนั้นเลย &lt;/p&gt;

&lt;p&gt;วิธีที่ดีที่สุดคือ วางโครงสร้าง และแบ่ง environment ให้กับแต่ละโปรเจกต์ก่อนเลยค่ะ ทีนี้เราก็สามารถเขียนโค้ดได้อย่างสบายใจ โดยไม่ต้องมากังวลกับการนั่งอัพเดต library ทีหลังเลย! 👩‍💻💙&lt;/p&gt;

</description>
      <category>python</category>
      <category>pipenv</category>
      <category>productivity</category>
      <category>virtualenv</category>
    </item>
    <item>
      <title>มา Optimize docker builds ด้วย multi-stage กันเถอะ</title>
      <dc:creator>pop</dc:creator>
      <pubDate>Mon, 28 Oct 2019 17:27:38 +0000</pubDate>
      <link>https://dev.to/prontotools/optimize-docker-builds-multi-stage-27e3</link>
      <guid>https://dev.to/prontotools/optimize-docker-builds-multi-stage-27e3</guid>
      <description>&lt;h3&gt;
  
  
  Multi-stage  คือ
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;เทคนิคที่ช่วยให้เราสามารถ optimize ระยะเวลาในการ build image ซ้ำ แทนที่เราจะ มา build image ใหม่ทุกครั้ง ก็เปลี่ยนมาใช้การ copy image ที่เคย build ไปแล้วมาใช้กับ stage ใหม่แทน &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Multi-Stage  สามารถใช้งานได้กับ Docker edge version เวอร์ชั่น v17.05.0ce ขึ้นไป&lt;/p&gt;

&lt;p&gt;หากเปรียบเทียบกับความเป็นจริง Multi-Stage ก็คล้ายกับแก้วใบหนึ่งที่เป็นเหมือน blue print(พิมพ์เขียว) ให้เราสามารถนำมา Reuse ได้ แทนจะเราจะผลิตแก้วกระดาษที่ซ้ำทุกครั้ง &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fp772tftgdhvfgy3s8p5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fp772tftgdhvfgy3s8p5x.png" alt="compare with the real world"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ลองกันเลย 🚩
&lt;/h3&gt;

&lt;p&gt;เริ่มต้นด้วยการสร้าง Dockerfile สำหรับ dev และDockerfile สำหรับ production&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhjbhd6v5xqgcvoridoiy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhjbhd6v5xqgcvoridoiy.png" alt="ฺBuild without multi-stage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;หลังจากนั้นลองสั่ง build ทั้งสอง images โดยใช้คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t demo-dev -f Dockerfile-dev .
docker build -t demo-prod -f Dockerfile-production .
&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 plaintext"&gt;&lt;code&gt;| Docker Tags     | Size   |
|-----------------|--------|
| demo-dev        | 994MB  |
| demo-prod       | 996MB  |
| Summary         | 1.99GB |

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

&lt;/div&gt;



&lt;p&gt;หลังจากนั้นเราลองมาใช้ &lt;strong&gt;Multi-Stage&lt;/strong&gt; กันบ้าง ✨&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Foy3e4e2soplepz0z5aym.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Foy3e4e2soplepz0z5aym.png" alt="DockerfileMuti-stage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ลองสั่ง build images โดยใช้คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t demo-multi-stage -f Dockerfile-muti-stage .
&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 plaintext"&gt;&lt;code&gt;| Docker Tags      | Size   |
|------------------|--------|
| demo-multi-stage | 1.01GB |

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

&lt;/div&gt;



&lt;p&gt;จะเห็นได้ว่าขนาด image ที่ถูก build ลดลงไปถึง &lt;strong&gt;0.98 GB&lt;/strong&gt; 🎉 &lt;/p&gt;

&lt;p&gt;โดยวิธีการ เขียน docker multi-stage ง่ายมาก เพียงแค่ใช้คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copy --from=&amp;lt;index stage or stage name&amp;gt; &amp;lt;destination path&amp;gt; &amp;lt;original path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcvrwiwyfkyh25g3otoi7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcvrwiwyfkyh25g3otoi7.png" alt="Syntax Multistage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Muti stage เป็นอีกหนึ่งวิธีที่จะช่วยเพิ่มทางเลือกให้กับคุณในการ ลดขนาดของ image ที่จะช่วยให้ image ของคุณ lean ขึ้นและยังช่วยลดระยะเวลาในการ build image ได้อีกด้วย&lt;/p&gt;

&lt;p&gt;Ref:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/saowaluck/Demo-docker-multistage" rel="noopener noreferrer"&gt;github code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/develop/develop-images/multistage-build/" rel="noopener noreferrer"&gt;https://docs.docker.com/develop/develop-images/multistage-build/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.somkiat.cc/docker-with-multi-stage-build/" rel="noopener noreferrer"&gt;http://www.somkiat.cc/docker-with-multi-stage-build/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
