<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>nitpum</title>
    <link>https://nitpum.com/</link>
    <description>Recent content on nitpum</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 24 Sep 2026 20:22:45 +0700</lastBuildDate><atom:link href="https://nitpum.com/index.xml" rel="self" type="application/rss+xml" /><item>
			<title>Golden Kamuy เมะดีที่คนไม่ค่อยพูดถึง</title>
			<link>https://nitpum.com/post/golden-kamuy/</link>
			<pubDate>Thu, 24 Sep 2026 20:22:45 +0700</pubDate>
			
			<guid>https://nitpum.com/post/golden-kamuy/</guid>
			<description><![CDATA[<p>โพสต์นี้ขอเขียนแบบไวๆ ก่อนละกันนึกได้แล้วอยากพูดถึงอนิเมะเรื่อง Golden Kamuy สักหน่อยส่วนตัวมองว่าเป็นเมะดีแต่คนไม่ค่อยพูดถึงกัน (underrated) เชื่อว่าหลายคนได้ยินชื่อแล้วยังไม่รู้ด้วยซ้ำว่ามันคือเรื่องอะไร มีเรื่องนี้ด้วยเหรอ? หรืออาจจะเคยเห็นภาพปกหรือภาพในเรื่องแล้วไม่ได้สนใจ</p>
<p>ถ้าใครลองเอาชื่อไปค้นแล้วดูแต่ภาพจะเห็นว่าภาพมันไม่ได้อลังการหรือสวยอะไรมาก ออกจะแนวดูธรรมดาหรือให้อารมณ์แบบเมะเก่าด้วยซ้ำ</p>
<p>
	<figure>
		<img
			src="https://nitpum.com/post/golden-kamuy/./images/golden-kamuy.webp"
			alt=""
			loading="lazy"
			
			width="460"
			height="650"
			
		/>
		<figcaption class="text-center">ภาพจาก anilist.co</figcaption>
	</figure>

</p>
<p>ข้อดีของเรื่องนี้</p>
<ul>
<li>มีครบรสทุกอารมณ์ ตลก เศร้า จริงจัง ดุเดือด โรแมนซ์ เรียกว่าใส่มาให้หมดแล้วอาจจะไม่ได้สุดอัน แต่ใส่มาได้กลมกล่อม</li>
<li>ตัวละครเยอะ ทุกคนมีเรื่องราวมีปมของตัวเอง แถมยังกระจายบทได้ดี ไม่ค่อยเห็นเรื่องไหนทำแบบนี้ได้</li>
<li>เนื้อเรื่องน่าติดตาม มีการลำดับเรื่องที่น่าสนใจ มีความซับซ้อนแต่ก็เข้าใจได้ง่าย คนทั่วๆ ไปก็ดูเอาเพลินได้</li>
<li>มีสาระทางประวัติศาสตร์ ในเรื่องยังแอบสอดแทรกข้อมูลประวัติและวัฒนธรรมของเผ่าไอนุและญี่ปุ่นช่วงนั้นเข้ามาด้วย</li>
</ul>
<p>โดยรวมมองว่ากลมกล่อม มีส่วนผสมทุกอย่างแล้วเอามารวมกันได้อย่างลงตัว ถึงแม้จะไม่ได้ไปสุดทุกด้านแต่ไม่บ่อยนักที่จะเห็นเรื่องที่ยำของออกมาได้กลมกล่อมพอๆ กันทุกด้านได้แบบนี้ สำคัญเลยคือ ทำออกมาได้สนุกและน่าติดตาม</p>
<p>โพสต์นี้เอาไว้แค่นี้ก่อนละกันไว้เดี๋ยวถ้าขยันจะมาอัพเดทเพิ่มเติมละกันครับ</p>
]]></description>
		</item><item>
			<title>ซื้อ DRM-free E-book กับ Humble Bundle</title>
			<link>https://nitpum.com/post/humblebundle-ebook/</link>
			<pubDate>Sun, 23 Aug 2026 21:58:05 +0700</pubDate>
			
			<guid>https://nitpum.com/post/humblebundle-ebook/</guid>
			<description><![CDATA[<p>สวัสดีครับครั้งก่อนผมแนะนำวิธีซื้อเพลงแบบ DRM-free กับ <a href="/post/ototoy">Ototoy</a> ไปแล้ว ครั้งนี้มาแนะนำการซื้อไฟล์หนังสืออิเล็กทรอนิกส์ (e-book) แบบได้ไฟล์เอาไปเปิดบนเครื่องไหนก็ได้ ไม่ต้องโดนบังคับให้อ่านได้แค่เฉพาะแอพนั้นๆ กันครับ ซึ่งแน่นอนว่าจะเป็น e-book ภาษาอังกฤษครับ (น่าเสียดายที่ ณ เวลาที่เขียนโพสต์นี้ไทยยังไม่มีแอพไหนซื้อ e-book แบบ DRM-free ได้)</p>
<h2 id="humble-bundle">
	<a href="#humble-bundle" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Humble Bundle
</h2>
<p>หากใครไม่เคยรู้จัก <a href="https://www.humblebundle.com" target="_blank" rel="noopener">Humble Bundle</a> มาก่อน คือ เว็บไซต์รวมบันเดิ้ลเกมในราคาสุดคุ้ม ที่ซื้อหนึ่งบันเดิ้ลจะได้เกมทั้งหมดในบันเดิ้ลนั้นมาในราคาที่ถูกกว่าซื้อแต่ละเกมแยกเอง เช่น  บันเดิ้ลรวมเกมต่อสู้ได้ 5 เกมในราคา 500 บ. เป็นต้น ซึ่งเงินที่เราซื้อบันเดิ้ลส่วนหนึ่งจะถูกนำไปบริจาคให้มูลนิธิต่างๆ ด้วยครับ เรียกว่าได้ทั้งเกมในราคาสุดคุ้มแล้วก็ได้บริจาคเพื่อช่วยเหลือผู้อื่นด้วย</p>
<p>แต่ละบันเดิ้ลก็จะมีเวลาจำกัดพอหมดเวลาก็จะเปลี่ยนเอาบันเดิ้ลใหม่ที่เป็นคนละเกมเข้ามาครับ</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/humblebundle.webp"
  alt=""
  loading="lazy"
  
  width="1667"
  height="976"
  
/>

</p>
<p>แต่นอกจาก Humble Bundle จะขายเกมแล้ว จริงๆ ยังมีขายบันเดิ้ลอีก 2 ประเภทนั้นก็คือ E-book กับโปรแกรมครับ</p>
<p>ซึ่งในครั้งนี้ผมจะพูดถึงแค่ส่วน E-book นะครับ แต่จริงๆ ก็ไม่ต่างกันเท่าไรสามารถเอาข้อมูลของโพสต์นี้ไปใช้กับบันเดิ้ลประเภทอื่นได้เหมือนกันครับ</p>
<h2 id="เลอกดบนเดล">
	<a href="#%e0%b9%80%e0%b8%a5%e0%b8%ad%e0%b8%81%e0%b8%94%e0%b8%9a%e0%b8%99%e0%b9%80%e0%b8%94%e0%b8%a5" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		เลือกดูบันเดิ้ล
</h2>
<p>หน้าแรกของ <a href="https://www.humblebundle.com" target="_blank" rel="noopener">Humble Bundle</a> เข้ามาแล้วไม่เหมือนในรูปไม่ต้องตกใจ  หน้าตาอาจจะแต่ต่างกันไปตามแต่ละช่วงเวลา หรือโปรโมชั่นเทศกาลช่วงนั้นๆ นะครับ ให้เราไปที่เมูนด้านบนเอาเมาส์ไปชี้ตรง Bundles จะมีเมูนย่อยโผล่มาให้คลิก Books ครับ</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/humblebundle-homepage.webp"
  alt="ในหน้าแรกเมื่อเอาเมาส์ไปชี้ตรงเมนู Bundles จะมีเมนู Books โผล่ออกมา"
  loading="lazy"
  
  width="1692"
  height="976"
  
/>

</p>
<p>ตอนนี้เราจะมาอยู่ในหน้ารายชื่อบันเดิ้ลของ E-Book แล้ว รายชื่อบันเดิ้ลก็จะแตกต่างกันไปตามช่วงเวลาครับ บางครั้งก็จะมีมังงะบ้าง มีหนังสือสอนเขียนโปรแกรมบ้าง มีหนังสือการ์ตูนตะวันตกบ้าง มีหนังสือนิยายบ้าง บันเดิ้ลไหนหมดเวลาก็จะสลับเอาบันเดิ้ลใหม่เข้ามาครับ ทำให้รายชื่อเปลี่ยนไปตลอดอันนี้เราต้องคอยเปิดมาเช็คดูครับว่ามีหนังสือที่เราสนใจหรือเปล่า</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/book-buble-list.webp"
  alt="รายชื่อบันเดิ้ลหนังสือแสดงในรูปแบบตาราง"
  loading="lazy"
  
  width="1270"
  height="698"
  
/>

</p>
<p>ด้านขวาล่างของแต่ละบันเดิ้ลจะมีเวลาบอกอยู่ครับว่าบันเดิ้ลนี้จะหมดเวลาในอีกกี่วัน อันนี้คือเวลาที่เปิดให้เราซื้อได้ครับพอหมดเวลาเราจะซื้อไม่ได้แล้ว เพราะเขาจะเปลี่ยนเอาบันเดิ้ลใหม่มาแทน บันเดิ้ลไหนเราซื้อไว้เราจะกลับมาโหลดได้ตลอดครับ ยกเว้นบางบันเดิ้ลที่ได้เป็นคีย์หรือมีเงื่อนไขพิเศษเดี๋ยวจะบอกเพิ่มเติมต่อจากนี้ครับ</p>
<p>อันไหนใกล้หมดเวลาแล้วจะขึ้นเป็นสีแดงกับมีเวลานับถอยหลังให้ดูครับ โดยจะแสดงเป็น วัน:ชั่วโมง:นาที:วินาที</p>
<p>
	<figure>
		<img
			src="https://nitpum.com/post/humblebundle-ebook/./images/bundle-expiration.webp"
			alt="บันเดิลที่ใกล้หมดเวลาจะมีเวลานับถอยหลังบนพืนหลังสีแดงบอก"
			loading="lazy"
			
			width="483"
			height="365"
			
		/>
		<figcaption class="text-center">ตัวอย่างบันเดิ้ลใกล้หมดเวลา</figcaption>
	</figure>

</p>
<p>ลองหาอันที่สนใจแล้วกดเข้าไปดูสักอันครับ อย่างผมลองกดดูอันนี้ หลักๆ ตรงกลางจะมีฟิลเตอร์ระดับ (tier) ให้เลือกดู ด้านขวาก็เป็นสรุปรวมๆ ว่าบันเดิ้ลนี้เกี่ยวกับอะไร ซื้อแล้วจะได้ไฟล์แบบไหน ลองกดดูหนังสือแต่ละเล่มเพื่ออ่านรายละเอียดคร่าวๆ ดูได้ครับจะมีปุ่ม Preview กดแล้วอ่านตัวอย่างได้</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/example-bundle.webp"
  alt="หน้าข้อมูลบันเดิ้ลมีชื่อบันเดิ้ลอยู่ตรงกลางข้างใต้ชื่อจะมีเมนูฟิลเตอร์ระดับ (tier) ให้เลือกกด ด้านขวาเป็นคำอธิบายบันเดิ้ลพร้อมกับเมนูชำระเงิน"
  loading="lazy"
  
  width="1659"
  height="998"
  
/>

</p>
<h3 id="ประเภทไฟลทเราจะได">
	<a href="#%e0%b8%9b%e0%b8%a3%e0%b8%b0%e0%b9%80%e0%b8%a0%e0%b8%97%e0%b9%84%e0%b8%9f%e0%b8%a5%e0%b8%97%e0%b9%80%e0%b8%a3%e0%b8%b2%e0%b8%88%e0%b8%b0%e0%b9%84%e0%b8%94" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ประเภทไฟล์ที่เราจะได้
</h3>
<p>เปิดบันเดิ้ลมาดูเร็วๆ ว่าบันเดิ้ลนั้นส่วนใหญ่เราจะได้ไฟล์แบบไหนให้ดูที่ทางด้านขวามือครับ อย่างในรูปนี้จะได้แบบ DRM-free ส่วนไฟล์ที่ดาวน์โหลดได้จะเป็น PDF กับ ePUB</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/bundle-detail-file-type.webp"
  alt="ตรงคำอธิบายบันเดิ้ลมีส่วนที่เขียนว่า Use on Any Device ถัดไปด้านขวาเชียนว่า PDF and ePUB"
  loading="lazy"
  
  width="650"
  height="694"
  
/>

</p>
<h4 id="drm-free">
	<a href="#drm-free" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		DRM-free
</h4>
<p>ปกติแล้วถ้าขึ้นว่า Use on Any Device ก็คือ DRM-free ละครับ ด้านข้างก็จะบอกว่าในบันเดิ้ลโหลดไฟล์ฟอร์แมตไหนได้บ้าง</p>
<p>ส่วนใหญ่ถ้าเป็นหนังสือทั่วไปรวมถึงนิยายก็จะได้ฟอร์แมตเป็น PDF กับ ePUB ครับ แต่ถ้าเป็นคอมมิคหรือมังงะจะได้แค่ PDF ครับ (ส่วนใหญ่แล้วเขียนว่าได้แค่ PDF ก็จริงแต่ก็มี CBZ ให้โหลดครับ ซึ่งเป็นไฟล์ที่ออกแบบมาไว้ให้มังงะกับคอมมิคโดยเฉพาะทำให้อ่านสะดวกกว่า) ทั้งนี้ที่เห็นเป็นแค่สรุปภาพรวมคร่าวๆ ของบันเดิ้ลครับว่าได้ไฟล์อะไรบ้าง แนะนำให้กดดูหนังสือแต่ละเล่มเช็คดูอีกทีครับว่าได้ไฟล์แบบที่เราต้องการหรือเปล่า เพราะบางเล่มอาจจะไม่ได้เอาไฟล์ทุกฟอร์แมตมาให้</p>
<p>
	<figure>
		<img
			src="https://nitpum.com/post/humblebundle-ebook/./images/bookdetail-pdf-epub.webp"
			alt="เล่มนี้เขียนว่า Use on Any Device กับ PDF and ePUB"
			loading="lazy"
			
			width="967"
			height="703"
			
		/>
		<figcaption class="text-center">เล่มนี้ได้ทั้ง PDF และ ePUB</figcaption>
	</figure>

</p>
<p>
	<figure>
		<img
			src="https://nitpum.com/post/humblebundle-ebook/./images/bookdetail-pdf.webp"
			alt="เล่มนี้เขียนว่า Use on Any Device กับ PDF"
			loading="lazy"
			
			width="967"
			height="703"
			
		/>
		<figcaption class="text-center">ตัวอย่างจากอีกบันเดิ้ล เล่มนี้ได้แค่ PDF</figcaption>
	</figure>

</p>
<h4 id="แบบไดคย">
	<a href="#%e0%b9%81%e0%b8%9a%e0%b8%9a%e0%b9%84%e0%b8%94%e0%b8%84%e0%b8%a2" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		แบบได้คีย์
</h4>
<p>แบบที่อยากให้ระวังเลย คือ ซื้อแล้วได้แต่คีย์มาต้องเอาไปกรอกบนเว็บข้างนอกครับ ซึ่งจะเขียนว่า <code>Redeem on Other Platform</code></p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/bundle-redeem-on-other-platform.webp"
  alt="คำอธิบายเขียนว่า Redeem on Other Platform และมี Keys Expire. Please redeem before August 12, 2007 เขียนกำกับไว้"
  loading="lazy"
  
  width="565"
  height="159"
  
/>

</p>
<p>ที่อยากให้ระวังเพราะว่าเราจะไม่สามารถโหลดหนังสือตรงๆ จาก Humble Bundle ได้ครับ เราจะได้คีย์มาแล้วต้องเอาไปกรอกบนเว็บไซต์ด้านนอก ซึ่งบางครั้งคีย์ที่เราได้มามีวันหมดอายุหากลืมเอาไปใช้ก็จะทำให้เราเสียสิทธิ์ตรงนี้ไป อีกทั้งบางครั้งเว็บไซต์ด้านนอกจะไม่มีไฟล์หนังสือให้เราโหลดด้วยต้องอ่านผ่านเว็บหรือแอปที่เขากำหนดมาเท่านั้นไม่ได้เป็นแบบ DRM-free</p>
<p>
	<figure>
		<img
			src="https://nitpum.com/post/humblebundle-ebook/./images/redeem-has-expiration.webp"
			alt="เล่มนี้เขียนว่า Redeem on Other Platform"
			loading="lazy"
			
			width="596"
			height="207"
			
		/>
		<figcaption class="text-center">คีย์แบบมีวันหมดอายุ</figcaption>
	</figure>

</p>
<p>ทั้งนี้ไม่ใช่ว่าทุกอันที่เป็นคีย์จะไม่ใช่ DRM-free นะครับ สุดท้ายแล้วขึ้นอยู่กับผู้จัดจำหน่ายกับเว็บไซต์ด้วยว่าให้สิทธิ์แบบไหนมา อย่างในรูปนี้เป็นหนังสือของ Manning ได้คีย์มาก็จริง พอเอาไปกรอกในเว็บของ Manning เองเราจะได้สิทธิ์โหลดหนังสือแบบ DRM-free ผ่านเว็บของ Manning โดยตรงครับ</p>
<p>
	<figure>
		<img
			src="https://nitpum.com/post/humblebundle-ebook/./images/manning-redeem-on-other-platform.webp"
			alt="หนังสือของสำนักพิมพ์ Manning กำกับไว้ว่า Redeem on Other Platform"
			loading="lazy"
			
			width="967"
			height="703"
			
		/>
		<figcaption class="text-center">ได้เป็นคีย์ก็จริงแต่สามารถโหลดแบบ DRM-free ผ่านเว็บโดยตรงได้</figcaption>
	</figure>

</p>
<p>เราสามารถเช็คเว็บที่เราต้องเอาคีย์ไปใส่ได้ โดยกดดูตรงด้านขวามมือที่เขียนว่า <strong>Bundle Details</strong> กดขยายดู จะมีเขียนบอกตรง <strong>Redeem your keys</strong> ครับว่าคีย์ที่ได้มาต้องเอาไปใช้ที่ไหน</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/bundledetail-redeem-platform.webp"
  alt="คำอธิบายบันเดิ้ลมีกำกับไว้ว่า Redeem your keys. All keys can be redeemed on the Manning website"
  loading="lazy"
  
  width="670"
  height="840"
  
/>

</p>
<p>ที่เหลือเราต้องไปค้นต่อเองครับว่าเว็บน้้นๆ ให้เราโหลดไฟล์ออกมาแบบ DRM-free ได้หรือเปล่า โดยส่วนใหญ่แล้วเว็บใหญ่ๆ อย่าง Amazon, iBook, Google Book, Kobo และอื่นๆ จะโหลดแบบ DRM-free ไม่ได้ครับ</p>
<h3 id="ระดบ-tier">
	<a href="#%e0%b8%a3%e0%b8%b0%e0%b8%94%e0%b8%9a-tier" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ระดับ Tier
</h3>
<p>แต่ละบันเดิ้ลจะมีการแบ่งระดับ (tier) หนังสือที่จะได้แตกต่างกันไปครับ ส่วนใหญ่แล้วจะมีประมาณ 2 ถึง 3 ระดับ ซึ่งแต่ละระดับจะกำหนดหนังสือมาให้แล้วว่าจะได้เล่มไหนบ้างเราเลือกเองไม่ได้ และกำหนดขั้นต่ำที่เราต้องจ่ายเอาไว้เพื่อที่จะได้หนังสือในระดับนั้นๆ ครับ</p>
<p>เราสามารถกดดูจากเมนูฟิลเตอร์ได้ อย่างในรูปบันเดิ้ลนี้มีอยู่ทั้ง 3 ระดับ ตอนนี้ผมเลือกระดับสูงสุดอยู่ (ซื้อทั้งบันเดิ้ล) ต้องจ่ายขั้นต่ำ $18 จะได้หนังสือทั้งบันเดิ้ลเลยรวม 21 เล่ม</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/bundle-tier-max.webp"
  alt="มีสามระดับตอนนี้เลือกระดับสูงสุดอยู่คือ 21 เล่ม"
  loading="lazy"
  
  width="776"
  height="200"
  
/>

</p>
<p>หรืออย่างอันนี้ผมลองกดระดับต่ำสุดดู จะต้องจ่ายขั้นต่ำ $5 เพื่อที่จะได้ 3 เล่มนี้ครับ</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/bundle-tier-lowest.webp"
  alt="เลือกฟิลเตอร์ต่ำสุด 3 เล่ม"
  loading="lazy"
  
  width="879"
  height="719"
  
/>

</p>
<p>สาเหตุที่เป็นระบบจ่ายขั้นต่ำเพราะว่าเราสามารถกำหนดราคาที่ต้องการจ่ายเองได้ครับเด๊๋ยวจะกลับมาเรื่องนี้อีกทีในส่วนถัดไป</p>
<p>ตรงนี้ก็ลองกดไล่แต่ละระดับไล่ดูได้ครับว่าเล่มที่เราอยากได้อยู่ระดับไหน ซึ่งส่วนใหญ่หนังสือดีๆ ก็จะอยู่ระดับสูงๆ 😝</p>
<h2 id="ซอบนเดล">
	<a href="#%e0%b8%8b%e0%b8%ad%e0%b8%9a%e0%b8%99%e0%b9%80%e0%b8%94%e0%b8%a5" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ซื้อบันเดิ้ล
</h2>
<p>ก่อนซื้อบันเดิ้ลแนะนำให้สมัครสมาชิคและล็อคอินให้เรียบร้อยก่อนะครับระบบจะได้ผูกคำสั่งซื้อกับบัญชีเราตอนกลับมาโหลดจะได้หาง่ายๆ</p>
<p>พอเจอบันเดิ้ลกับหนังสือที่ถูกใจแล้วให้มาดูตรงส่วน checkout ด้านขวาเลยครับ ตรงนี้จะมีบอกว่าของทั้งหมดในบันเดิ้ลมูลค่ารวมเท่าไร แล้วเราอยากจ่ายให้เขาเท่าไรจิ้มตามปุ่มราคาได้เลย หรือถ้าตัวเลือกที่มีไม่ถูกใจก็กดตรง Custom    amount พิมพ์ราคาเอาเองได้เลยครั
แต่อย่าลืมเลือกราคาให้ถึงขั้นต่ำที่เราต้องการนะครับ ถ้าใครกลัวเลือกราคาผิดไปกดตรงฟิลเตอร์ระดับแทนก็ได้ ระบบจะมาเลือกราคาให้เราเองครับ</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/pay-what-you-want.webp"
  alt="เมนูราคามีที่ให้เลือก สามารถกำหนดปริมาณเองได้"
  loading="lazy"
  
  width="831"
  height="643"
  
/>

</p>
<p>เลื่อนมาข้างล่างอีกหน่อยจะเป็น Adjust Donation เอาไว้ปรับสัดส่วนเงินของเราที่แบ่งให้กับองค์กรการกุศล, แบ่งให้ผู้จัดจำหน่ายหนังสือและแบ่งให้กับ Humble Bundle ครับ</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/adjust-donation.webp"
  alt="ตัวเลือกส่วนแบ่งที่มีให้ โดยมี 3 แบบ 1. ค่าเริ่มต้น 2. เพิ่มให้ส่วนบริจาคเป็นพิเศษ 3. กำหนดเอง"
  loading="lazy"
  
  width="968"
  height="691"
  
/>

</p>
<p>ใครไม่ถูกใจสองตัวเลือกที่มีให้สามารถกด Custom amount เพื่อปรับสัดส่วนตามใจชอบได้เอง (แน่นอนว่าสัดส่วนที่แบ่งไว้ให้ Humble Bundle จะมีขั้นต่ำไว้เป็นค่าบริการ)</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/custom-donation-amount.webp"
  alt="สไลด์บาร์สำหรับปรับสัดแบ่ง"
  loading="lazy"
  
  width="732"
  height="434"
  
/>

</p>
<p>ถัดไปด้านล่างจะเป็นข้อมูลองค์กรที่จะได้รับเงินบริจาคจากเราและข้อมูลโครงการครับ ตรงนี่ใครสนใจว่าเงินของเราจะถูกนำเอาไปทำอะไรบ้างอ่านได้จากตรงนี้เลย</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/clarity-info.webp"
  alt="ข้อมูลมูลนิธิพร้อมลิงก์เพื่อกดอ่านข้อมูลเพิ่มเติม"
  loading="lazy"
  
  width="732"
  height="369"
  
/>

</p>
<p>ตรงนี้ถ้าเราพอใจกับราคาแล้วกดปุ่ม checkout เพื่อไปต่อหน้าสรุปตะกร้าได้เลย หน้านี้จะสรุปราคาที่เราต้องจ่ายกับบอกจำนวนเงินที่จะนำไปบริจาคตามที่เราได้เลือกไว้ก่อนหน้านี้ ตรง delivery information พร้อมทั้งอีเมลที่เราล็อคอินอยู่ถ้ายังไม่ได้ล็อคอินสามารถทำตรงขั้นตอนนี้ได้  ตรวจเช็คทุกอย่างให้เรียบร้อยถ้าทุกอย่างเรียบร้อยแล้วเลือกข่องทางจ่ายเงินได้เลย</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/checkout-detail.webp"
  alt="ข้อมูลสรุปชำระเงิน"
  loading="lazy"
  
  width="1436"
  height="701"
  
/>

</p>
<p>อันนี้เลือกช่องทางการชำระเงินได้ตามสะดวกเลยครับ  ณ ตอนที่เขียนโพสต์นี้จะมีเลือกทั้ง 3 แบบคือ</p>
<ol>
<li>Paypal</li>
<li>บัตรเครดิต / บัตรเดบิต</li>
<li>Alipay</li>
</ol>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/payment-method.webp"
  alt="เมนูเลือกช่องทางการชำระเงิน"
  loading="lazy"
  
  width="877"
  height="377"
  
/>

</p>
<p>ถัดมาอีกหน่อยตรงนี้จะเป็นตัวเลือกเสริมครับ จะเลือกก็ไม่เลือกก็ได้</p>
<ul>
<li>This purchase is a gift: ซื้อเป็นของขวัญให้คนอื่น</li>
<li>Include me in the Leaderboard: เอาชื่อเราไปแสดงในกระดานจัดอันดับการซื้อ</li>
</ul>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/additional-option.webp"
  alt="กล่อง checkbox ตัวเลือกเพิ่มเติมให้กดแยกตามความต้องการ"
  loading="lazy"
  
  width="812"
  height="291"
  
/>

</p>
<p>หากเลือกทุกอย่างเสร็จหมดแล้วกด Continue to payment ได้เลยเว็บจะพาไปยังหน้าจ่ายเงินตามช่องทางที่เราเลือกไว้ครับ ตรงส่วนนี้ผมขอข้ามละกันเพราะเป็นขั้นตอนการจ่ายเงินปกติอยู่แล้ว ถ้าใครเลือกบัตรเครดิต/เดรบิต ก็แค่กรอกข้อมูลบัตรตามปกติเลย</p>
<p>หลังจากจ่ายเงินเสร็จแล้วถ้าไม่มีอะไรผิดพลาดจะเจอหน้า Order complete ครับ เป็นการยืนยันว่าเราซื้อบันเดิ้ลเรียบร้อยแล้ว ตรงนี้สามารถกด Get your books เพื่อไปหน้าโหลดหนังสือได้เลย</p>
<p>
	<figure>
		<img
			src="https://nitpum.com/post/humblebundle-ebook/./images/purchase-complete.webp"
			alt="ข้อความบอกว่าซื้อสำเร็จแล้ว"
			loading="lazy"
			
			width="871"
			height="611"
			
		/>
		<figcaption class="text-center">หน้า Order complete ซื้อสำเร็จแล้ว</figcaption>
	</figure>

</p>
<h2 id="ดาวนโหลดหนงสอ">
	<a href="#%e0%b8%94%e0%b8%b2%e0%b8%a7%e0%b8%99%e0%b9%82%e0%b8%ab%e0%b8%a5%e0%b8%94%e0%b8%ab%e0%b8%99%e0%b8%87%e0%b8%aa%e0%b8%ad" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ดาวน์โหลดหนังสือ
</h2>
<p>อันนี้เป็นขั้นตอนสำหรับกลับมาหน้าดาวน์โหลดหนังสือภายหลังครับ ให้เราล็อคอินเข้าเว็บให้เรียบร้อยจากนั้นไปเอาเมาส์ไปชี้ด้านบนขวาตรงไอคอนโปรไฟล์ &gt; กด Purchases</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/purchase-menu.webp"
  alt="เอาเมาส์ไปชี้ตรงไอคอนโปรไฟล์จะมีเมูนโผล่มาให้กดเมนู Purchases"
  loading="lazy"
  
  width="728"
  height="574"
  
/>

</p>
<p>หลังจากกดแล้วจะมาโผล่หน้ารายชื่อบันเดิ้ลที่เราเคยซื้อไปทั้งหมดครับ ตรงนี้กดชื่อบันเดิ้ลที่เราอยากดาวน์โหลดได้เลย อย่างอันนี้บันเดิ้ลที่ผมซื้อคือ Humble Tech Book Bundle: Python, Rust, and Data by O&rsquo;Reilly</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/purchase-list.webp"
  alt="หน้า Purchases ที่จะมีรายการสั่งซื้อที่เราเคยซื้อไว้แสดงอยู่"
  loading="lazy"
  
  width="1534"
  height="547"
  
/>

</p>
<p>กดตรงชื่อบันเดิ้ล เว็บก็จะพาเราไปหน้ารายชื่อหนังสือในบันเดิ้ล ด้านขวามือจะเป็นประเภทไฟล์ที่เราโหลดได้และขนาดไฟล์ของแต่ละเล่มครับ ถ้าไม่อยากดาวน์โหลดทีละเล่มเองสามารถเลือกประเภทไฟล์ด้านบนแล้วกดปุ่ม Bulk download เพื่อโหลดทุกเล่มทีเดียวก็ได้ กดแล้วไม่มีอะไรเกิดขึ้นไม่ต้องงงนะครับรอเว็บประมวลสักครู่ก็เริ่มดาวน์โหลด หรือใครอยากโหลดผ่านทาง torrent ก็กดตรงปุ่ม BitTorrent ได้เหมือนกัน</p>
<p>
<img
  src="https://nitpum.com/post/humblebundle-ebook/./images/download-list.webp"
  alt="รายชื่อหนังสือในบันเดิ้ลเรียงกันเป็นแถว แต่ละแถวจะมีรูปปกหนังสือถัดจากรูปปกด้านขวาจะเป็นชื่อหนังสือและชื่อสำนักพิมพ์ ด้านขวามือของแต่ละแถวจะมีปุ่มให้ดาวน์โหลดไฟล์หนังสือเล่มนั้นๆ ตามฟอร์แมตที่มี"
  loading="lazy"
  
  width="1298"
  height="592"
  
/>

</p>
<p>เพียงเท่านี้เราก็ได้ไฟล์หนังสือแบบ DRM-free ที่สามารถเอาไปเปิดบนเครื่องไหนของเรากับแอปไหนก็ได้ละครับ ไม่จำเป็นต้องต่อเน็ตไม่โดนบังคับให้ลงแอปเฉพาะ แต่อย่าเอาไปแจกใครนะครับตามสิทธิ์คือใช้ได้แค่เราคนเดียว แนะนำให้แบ็คอัพไฟล์ไว้ด้วยก็ดีครับจะได้ไม่ต้องมาโหลดจาก Humble Bundle ตลอด ลดความกังวลเรื่องเว็บปิดกับรักษาความเป็นส่วนตัวไปด้วย</p>
]]></description>
		</item><item>
			<title>The Agentskills, The Claude Code and The ironly</title>
			<link>https://nitpum.com/post/agentskills-claude-code/</link>
			<pubDate>Sat, 25 Jul 2026 22:53:05 +0700</pubDate>
			
			<guid>https://nitpum.com/post/agentskills-claude-code/</guid>
			<description><![CDATA[<p>If you using Claude Code/Cursor/OpenCode,etc., you might see or write these files before <code>CLAUDE.md</code>, <code>.cursor/rules/</code>, <code>.github/copilot-instructions.md</code>, <code>.opencode/</code>, etc. This happened because at the early of adoption AI these is no standard for write AI intstruction file yet. So everyone come up with their idea and create their own specification.</p>
<p>Your project structure become a mess for support multiple tools</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>├── .cursor
</span></span><span style="display:flex;"><span>├── .github
</span></span><span style="display:flex;"><span>├── .opencode
</span></span><span style="display:flex;"><span>└── .windsurfrules
</span></span><span style="display:flex;"><span>...
</span></span></code></pre></div><p>Later on, it become <a href="https://agents.md/" target="_blank" rel="noopener">AGENTS.md</a> standard. No more need for a specific folder if your instructions are all same, you can just create a single <code>AGENTS.md</code> file and all tools will understand</p>
<p>Then in December 2025, Antropics <a href="https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills" target="_blank" rel="noopener">announced</a> a new concept Agent skills. A new way to give instruction more smarter. Their also published as an open standard</p>
<p><a href="https://agentskills.io/" target="_blank" rel="noopener">Agent skills</a> is now become an open standard that any agent can use. The goal is to make a skills more portable and sharable by standardize skill files into <code>.agents/skills</code> folder, so you don&rsquo;t need a separate folder per tool e.g. <code>.codex/skills/</code>, <code>.opencode/skills/</code>, etc.</p>
<p>All the popular tools support it, sounds happy right?</p>
<p>Except <strong>one</strong>&hellip; and only one</p>
<p>Claude code from <strong>Antropics</strong>&hellip;</p>
<p>Every others popular tools all supports it</p>
<ul>
<li>OpenAI Codex CLI</li>
<li>Cursor</li>
<li>Gemini CLI</li>
<li>OpenCode</li>
<li>Pi</li>
<li>Antigravity</li>
<li>List go on. You can see official list on <a href="https://agentskills.io/clients" target="_blank" rel="noopener">agentskills.io</a></li>
</ul>
<p><strong>Except one</strong> and only <strong>ONE</strong> that the most popular in developer environment (or at least what I think)</p>
<p>Claude code from Antropics, Is that ironly?</p>
<p>Antropics, who created Claude code and also created and published the Agent Skills open standard, yet hasn&rsquo;t implemented it in their own Claude Code</p>
<p>You might ask: &ldquo;Wait, Claude Code is support skill, what are you talking about?&rdquo;</p>
<p>That&rsquo;s right! Claude Code supports agent skills <strong>BUT</strong> in its own specific folder <code>.claude/skills/</code> not <code>.agents/skills</code> like other tools (<a href="https://github.com/anthropics/claude-code/issues/31005" target="_blank" rel="noopener">Github issues</a>)</p>
<p>It also don&rsquo;t supports AGENTS.md!!! (<a href="https://github.com/anthropics/claude-code/issues/31005" target="_blank" rel="noopener">same Github issues</a>)</p>
<p>Why Antropics, why?</p>
<p>I don&rsquo;t know what they&rsquo;re thinking, but looks like their&rsquo;re trying to be special by not supporting the standard. At least, please implement the one you created. Are they intentional not supporting all of these to make it harder for developer to migrate to other tools? I don&rsquo;t know. But, now they make everyone life</p>
<h2 id="workaround">
	<a href="#workaround" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Workaround
</h2>
<p>In the meantime, workaround is just copy or symlink from <code>.agents/skills</code> to <code>.claude/skills</code>.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>├── .agents
</span></span><span style="display:flex;"><span>│   └── skills <span style="color:#75715e"># source</span>
</span></span><span style="display:flex;"><span>└── .claude
</span></span><span style="display:flex;"><span>    └── skills <span style="color:#75715e"># symlink</span>
</span></span></code></pre></div><p>Here a command for create symlink whole skill folder</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#75715e"># Global skill</span>
</span></span><span style="display:flex;"><span>ln -s $HOME/.agents/skills $HOME/.claude/skills
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Project skill: run at root of project</span>
</span></span><span style="display:flex;"><span>ln -s .agents/skills .claude/skills
</span></span></code></pre></div><p>Create a symlink for AGENTS.md</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>ln -s AGENTS.md CLAUDE.md
</span></span></code></pre></div>]]></description>
		</item><item>
			<title>แอพธนาคารไหนย้ายเครื่องง่ายที่สุดในปี 2026</title>
			<link>https://nitpum.com/post/transfer-thai-banking-app-in-2026/</link>
			<pubDate>Sat, 04 Jul 2026 11:15:58 +0700</pubDate>
			
			<guid>https://nitpum.com/post/transfer-thai-banking-app-in-2026/</guid>
			<description><![CDATA[<p>สวัสดีครับพอดีช่วงที่ผ่านมาไม่นานนี้มีโอกาสได้ลองย้ายแอพธนาคารไปมือถืออีกเครื่อง โพสต์นี้เลยจะมาบันทึกไว้ว่าในปี 2026 นี้ แอพธนาคารไทยแต่ละเจ้าย้ายไปอีกเครื่องต้องใช้อะไรบ้างแล้วย้ายง่ายแค่ไหน</p>
<p>ทุกแอพผมใช้งานผ่านเน็ตซิมมือถือทั้งหมดไม่ได้ต่อ Wi-Fi เลยไม่ได้ทดสอบว่าแอพไหนต่อ Wi-Fi ใช้งานได้บ้าง แต่เข้าใจว่าส่วนใหญ่น่าจะไม่อนุญาตให้ใช้ดังนั้นเครื่องใหม่ที่เราจะย้ายควรใส่ซิมที่ใช้เน็ตได้ไว้นะครับ</p>
<p>ด้านล่างนี้เป็นตารางสรุปครับ</p>
<table>
  <thead>
      <tr>
          <th>แอพธนาคาร</th>
          <th>เลขบัตรประชาชน</th>
          <th>เลขบัญชี</th>
          <th>เบอร์โทรศัพท์มือถือ</th>
          <th>ยืนยัน OTP SMS</th>
          <th>แสกนหน้า KYC</th>
          <th>หมายเหตุ</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>SCB EASY</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
          <td>-</td>
      </tr>
      <tr>
          <td>K PLUS</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
          <td>-</td>
      </tr>
      <tr>
          <td>krungsri</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
          <td>ต้องออกจากระบบในเครื่องเดิมก่อนไม่งั้นจะต้องไปทำที่สาขาพร้อมบัตรประชาชน</td>
      </tr>
      <tr>
          <td>Krungthai NEXT</td>
          <td>✅</td>
          <td>-</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
          <td>-</td>
      </tr>
      <tr>
          <td>ttb touch</td>
          <td>✅</td>
          <td>-</td>
          <td>-</td>
          <td>✅</td>
          <td>✅</td>
          <td>-</td>
      </tr>
      <tr>
          <td>เป๋าตัง</td>
          <td>✅</td>
          <td>-</td>
          <td>✅</td>
          <td>✅</td>
          <td>🟨</td>
          <td>เลือกได้ว่าจะยืนยันด้วย KYC หรือยืนยันผ่านแอพ Krungthai NEXT</td>
      </tr>
  </tbody>
</table>
<p>จากตารางจะเห็นว่าแอพที่ย้ายไปเครื่องใหม่ได้ง่ายที่สุดจะเป็น ttb touch ครับ เรากรอกแค่เลขบัตรประชาชน ส่วน SMS OTP จะส่งมาให้เองด้วยเบอร์ที่เราเคยลงทะเบียนไว้</p>
<p>แอพที่ยากที่สุดจะเป็น krungsri ครับที่เราจำเป็นที่จะต้องออกจากระบบในเครื่องเก่าก่อนไม่งั้นจะย้ายไปเครื่องใหม่ไม่ได้ ถ้าเกิดใครมือถือพังหรือหายออกจากระบบไม่ได้ ต้องเดินทางไปทำที่สาขาครับ</p>
<p>ทั้งนี้ข้อมูลในตารางเป็นข้อมูลที่ผมทดสอบเองเฉพาะแอพธนาคารที่ได้ลองย้ายนะครับ หากขาดแอพธนาคารไหนไปอาจเพราะผมไม่ได้ย้ายแอพนั้นหรืออาจะไม่ได้ใช้แอพนั้นครับ และข้อมูลที่เห็นเป็นข้อมูลที่บันทึกจากช่วงเวลาหนึ่งเท่านั้น แอพมีการอัพเดทตลอดปัจจุบันอาจจะไม่ตรงกับข้อมูลในตารางแล้ว</p>
]]></description>
		</item><item>
			<title>เว็บจับใบดำใบแดง</title>
			<link>https://nitpum.com/post/blackredcard/</link>
			<pubDate>Sat, 18 Apr 2026 13:42:50 +0700</pubDate>
			
			<guid>https://nitpum.com/post/blackredcard/</guid>
			<description><![CDATA[<p>อันนี้ลองทำเว็บนับใบดำใบแดงดู จะได้ช่วยคำนวณโอกาสที่จะใบไหนได้ ใครต้องไปจับหรือไปเชียร์ญาติลองเอาไปใช้ดูได้ครับ <a href="https://blackredcard.nitpum.com/" target="_blank" rel="noopener">blackredcard.nitpum.com</a></p>
<div class="notice note">
  จริงๆ อันนี้เคยเอาไปโพสต์ที่อื่นมาแล้ว แต่รอบมาโพสต์ในแพลตฟอร์มของตัวเองบ้างจะได้ไม่หายไปไหน
</div>

<h2 id="เบองหลง">
	<a href="#%e0%b9%80%e0%b8%9a%e0%b8%ad%e0%b8%87%e0%b8%ab%e0%b8%a5%e0%b8%87" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		เบื้องหลัง
</h2>
<ul>
<li>เขียนด้วย HTML ไฟล์เดียว</li>
<li>ไม่ได้ใช้ AI ช่วยเลย ทำเองทั้งหมด (ใช้ในงานเยอะแล้ว อยากกลับมาเขียนอะไรเองบ้าง)</li>
<li>ลองเล่น <a href="https://alpinejs.dev/" target="_blank" rel="noopener">alpine.js</a> อยากลองมานานแล้ว เขียนสนุกดี</li>
<li>หลักๆ logic เขียนไม่นาน เสียเวลาส่วนใหญ่ไปดีไซน์หน้าเว็บมากกว่า</li>
<li>deploy ไว้บน Cloudflare Pages ไม่ต้อง host เองแถมได้พลัง CDN ด้วย</li>
</ul>
]]></description>
		</item><item>
			<title>บันทึก: Cups Proxmox ทำพรินเตอร์เซิฟเวอร์</title>
			<link>https://nitpum.com/post/cups-proxmox/</link>
			<pubDate>Sun, 15 Mar 2026 15:05:31 +0700</pubDate>
			
			<guid>https://nitpum.com/post/cups-proxmox/</guid>
			<description><![CDATA[<p>พอดีมีเหตุให้ต้องลง CUPS หรือ printer server บน Proxmox ไว้เลยจะมาเขียนบันทึกไว้สักหน่อยเผื่อตัวผมเองหรือใครมาอ่านจะได้พอทำตามได้</p>
<p>ที่ไปที่มาคร่าวๆ คือ อยากได้พรินเตอร์เซิฟเวอร์ตรงกลางเวลาจะสั่งพิมพ์อะไรจะได้ไม่ต้องยกเครื่องไปต่อสาย หรือใช้มือถือสั่งพิมพ์แบบไร้สายได้เลย</p>
<p>เลยไปค้นข้อมูลเจอว่าจริงๆ มีระบบนี้มานานแล้วชื่อ <a href="https://openprinting.github.io/cups/" target="_blank" rel="noopener">OpenPrinting CUPS</a> แค่เอาไปลงก็ใช้ได้เลย</p>
<h2 id="proxmox-lxc">
	<a href="#proxmox-lxc" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Proxmox LXC
</h2>
<p>พอดีมีเครื่องเซิฟเวอร์ที่ลง Proxmox ไว้อยู่แล้ว แล้วก็ไม่อยากเอา CUPS ไปลงตรงๆ บนเครื่องด้วยอยากเอาใส่ container มากกว่า เลยจบด้วยการเอาไปลงใน unprivileged LXC บน Proxmox แล้ว passthrough USB เข้าไปใน PXC เอา</p>
<p>ผมเลือก Debian มาลงเพราะคุ้นเคยสุด ลงเสร็จหัวใจหลักสำคัญคือต้องไปเซ็ต passthrough USB ทำได้ด้วยการแก้ config lxc ที่ <code>etc/pve/lxc/&lt;CTID&gt;.conf</code> ใส่ 2 บรรทัดนี้เพิ่ม</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>lxc.mount.entry: /dev/bus/usb dev/bus/usb none bind,optional,create=dir
</span></span><span style="display:flex;"><span>lxc.cgroup2.devices.allow: c 189:* rwm
</span></span></code></pre></div><p>จริงๆ ถ้าจะให้ดีควรจำกัด USB ที่ส่งไปให้เหลือแต่ของ printer เท่านั้นได้กำจัด scope การทำงานหรือถ้าเกิดโดนแฮคมาจะได้ไม่เสียหายอะไรมาก</p>
<p>พอ restart container แล้วเข้าไปพิมพ์คำสั่งใน container</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>lsusb
</span></span></code></pre></div><p>ควรจะเห็นรายชื่อ usb ที่ต่ออยู่ทั้งหมด หรือถ้ารัน <code>lpinfo -v</code> ก็จะได้ชื่อเครื่องพรินเตอร์เราอย่างของผมเป็น Brother ก็จะเห็นแบบนี้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>direct usb://Brother/&lt;Model-Code&gt;?serial<span style="color:#f92672">=</span>&lt;Serial&gt;
</span></span></code></pre></div><h2 id="ลง-cups">
	<a href="#%e0%b8%a5%e0%b8%87-cups" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ลง CUPS
</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>apt update
</span></span><span style="display:flex;"><span>apt install cups cups-client cups-filters printer-driver-all
</span></span></code></pre></div><p>เปิด service</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>systemctl enable --now cups
</span></span></code></pre></div><p>แก้ config เพื่อให้สามารถ access มาดูสถานะได้แบบไม่ต้อง login แก้ไฟล์ <code>/etc/cups/cupsd.conf</code>  ตามนี้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-txt" data-lang="txt"><span style="display:flex;"><span>Port 631
</span></span><span style="display:flex;"><span>Browsing On
</span></span><span style="display:flex;"><span>BrowseLocalProtocols dnssd
</span></span><span style="display:flex;"><span>DefaultShared Yes
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&lt;Location /&gt;
</span></span><span style="display:flex;"><span>  Order allow,deny
</span></span><span style="display:flex;"><span>  Allow @LOCAL
</span></span><span style="display:flex;"><span>&lt;/Location&gt;
</span></span></code></pre></div><p>แก้เสร็จสั่ง restart service</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>systemctl restart cups
</span></span></code></pre></div><p>ตอนนี้ควรจะเข้า url cups ได้แล้วลองเข้าไป <code>http://&lt;container-ip&gt;:631</code> พวกหน้า info ไม่ควรจะติดล็อคอิน</p>
<h2 id="ลง-driver">
	<a href="#%e0%b8%a5%e0%b8%87-driver" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ลง Driver
</h2>
<p>จริงๆ ขั้นตอนนี้ไม่จำเป็นต้องทำก็ได้นะครับถ้าลง CUPS แล้ว driver ที่มีให้มาสามารถใช้ได้เลย เผอิญว่าเครื่อง Brother รุ่นที่ผมใช้ดันไม่มี driver ใน CUPS เลยจำเป็นต้องลงเพิ่มครับ</p>
<p>วิธีการก็ง่ายๆ ครับไปโหลด driver จากเว็บของ Brother เอง <a href="https://support.brother.com/g/b/productsearch.aspx?c=us_ot&amp;lang=en" target="_blank" rel="noopener">https://support.brother.com/g/b/productsearch.aspx?c=us_ot&lang=en</a> ดีที่เขาทำ linux driver มาให้ด้วยแค่โหลด .deb มาลงก็ใช้ได้เลย</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>wget &lt;download-deb-url&gt;
</span></span><span style="display:flex;"><span>dpkg -i &lt;filename&gt;.deb
</span></span></code></pre></div><p>แต่จะติดตรง driver เป็น 32 bit แต่ระบบเป็น 64 bit เลยต้องทำให้ระบบรองรับ</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>dpkg --add-architecture i386
</span></span><span style="display:flex;"><span>apt update
</span></span></code></pre></div><p>พอลง driver เสร็จสั้ง restart อีกรอบ</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>systemctl restart cups
</span></span></code></pre></div><p>restart แล้วลองเข้าไปดู Web UI CUPS อีกทีดูตรง Manage printer จะขึ้นเครื่องพรินเตอร์ Brother มาให้เองเลยไม่ต้องทำอะไรเพิ่ม แต่ถ้าไม่ขึ้นก็กดเพิ่มไปตอนใส่ connection url ก็เอา <code>usb://Brother/&lt;Model-Code&gt;?serial=&lt;Serial&gt;</code> จากคำสั่ง <code>lpinfo -v</code> มา</p>
<h2 id="ทำ-auto-discovery">
	<a href="#%e0%b8%97%e0%b8%b3-auto-discovery" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ทำ Auto discovery
</h2>
<p>จริงๆ ถึงขั้นตอนนี้เราสามารถสั่งพรินเตอร์ได้แล้วแหละแต่ว่าคอมและมือถือเราต้องไปกดเพิ่มพรินเตอร์เองแล้วเอาไอพีไปใส่ รู้สึกไม่ค่อยสะดวกเท่าไรอยากให้แบบอยู่ใน Network ขึ้นพรินเตอร์แล้วสั่งได้เลย</p>
<p>ลงคำสั่งด้านล่างเสร็จแล้วคอมกับมือถือเราจะข้นเครื่องพรินเตอร์เลยครับไม่ต้องทำอะไรเพิ่ม</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>apt install avahi-daemon
</span></span><span style="display:flex;"><span>systemctl enable avahi-daemon
</span></span><span style="display:flex;"><span>systemctl start avahi-daemon
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>apt install cups-browsed avahi-utils
</span></span></code></pre></div>]]></description>
		</item><item>
			<title>วิธีโหลดแอพจาก Google play มาลงเครื่องที่ไม่มี Google play</title>
			<link>https://nitpum.com/post/install-playstore-app-on-none-playstore-device/</link>
			<pubDate>Sun, 22 Feb 2026 11:26:56 +0700</pubDate>
			
			<guid>https://nitpum.com/post/install-playstore-app-on-none-playstore-device/</guid>
			<description><![CDATA[<p>ผมมีเครื่อง e-reader รุ่น Boox Palma ที่เป็น Android อยู่ซึ่งก็มี Google play store ติดมาให้ในเครื่อง แต่ส่วนตัวแล้วไม่อยากล็อคอินบัญชี Google ทิ้งไว้</p>
<p>ด้วยความที่เป็นเครื่องไว้อ่านหนังสืออย่างเดียวไม่อยากให้มีข้อมูลส่วนตัวอะไรลิงก์ไว้เยอะ เวลาทิ้งไว้ที่บ้านหรือเอาให้ใครอ่านจะได้ไม่ต้องกังวลอะไรมาก ยิ่งเป็นบัญชี Google ที่มีข้อมูลเราค่อนข้างมากไหนจะผูกกับ Google Drive, Gmail, Youtube, ข้อมูลที่อยู่, ข้อมูลบัตรเราและอื่นๆ อีกมาก</p>
<p>อีกเหตุผลนึงก็ไม่อยากให้ Google ติดตามข้อมูลจากเครื่องนี้ด้วยอยากให้ข้อมูลการใช้งานบนเครื่องนี้เป็นส่วนตัวมากที่สุดเท่าที่จะทำได้ ไม่อยากให้มาติดตามดึงข้อมูลไปใช้ แต่ก็ยังอยากใช้งานแอพที่มีใน Google play store อยู่นะ 😝</p>
<p>โพสต์นี้เลยจะมาแนะนำวิธีที่ผมใช้ในการลงแอพจาก Google play store มาลงในเครื่องที่ไม่มี Google play store กันครับ สามารถใช้ได้กับ E-reader หรือไม่ใช่ E-reader ก็ได้ขอแค่เป็น Android ครับ</p>
<div class="notice note">
  ถึงแม้จะลงแอพได้แต่บางแอพที่พึ่งพาหรือใช้ Google play service เป็นหลักอาจจะใช้งานไม่ได้เต็มที่หรือใช้งานไม่ได้เลยขึ้นอยู่กับว่าแอพนั้นผูกกับระบบ Google play service มากแค่ไหน ตัวอย่างเช่นแอพ MangaPlus ที่ใช้ Google play service เช็คว่าเราจ่ายรายเดือนหรือเปล่า อันนี้ยังไงก็ต้องล็อคอินตัว Google play store ไว้ครับ ไม่งั้นใช้ไม่ได้เลย
</div>

<h2 id="ถางนกแคโหลดไฟล-apk-จากเวบนอกเอาส">
	<a href="#%e0%b8%96%e0%b8%b2%e0%b8%87%e0%b8%99%e0%b8%81%e0%b9%81%e0%b8%84%e0%b9%82%e0%b8%ab%e0%b8%a5%e0%b8%94%e0%b9%84%e0%b8%9f%e0%b8%a5-apk-%e0%b8%88%e0%b8%b2%e0%b8%81%e0%b9%80%e0%b8%a7%e0%b8%9a%e0%b8%99%e0%b8%ad%e0%b8%81%e0%b9%80%e0%b8%ad%e0%b8%b2%e0%b8%aa" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ถ้างั้นก็แค่โหลดไฟล์ APK จากเว็บนอกเอาสิ
</h2>
<p>สำหรับคนที่ไม่รู้ว่าไฟล์ APK คืออะไร อธิบายสั้นๆ มันคือไฟล์สำหรับลงแอพนั้นๆ ครับ ปกติเวลาที่เราลงแอพผ่าน Google play store ข้างหลังมันก็โหลดไฟล์ APK มาให้นี้แหละครับ แค่ระบบมันทำให้หมดเลยเราเลยไม่ได้เห็นไฟล์ APK หรือต้องติดตั้งเอง</p>
<p>จริงอยู่ที่เดี๋ยวนี้มีเว็บไซต์ที่แจกไฟล์ APK ของแอพต่างๆ ให้เราโหลดมาลงได้ง่ายๆ แต่เว็บพวกนั้นต้องอาศัยความเชื่อใจครับว่าไฟล์ที่แจกนั้นเป็นของจริงไม่ได้แอบยัดอะไรมาให้ด้วย</p>
<p>ยิ่งต้องโหลดไฟล์ APK แล้วเอามาลงบนเครื่องเราด้วย มันมีความเสี่ยงที่ไฟล์ที่โหลดมาจะโดนปลอมแปลงหรือแอบฝั่งอะไรไม่มีดีแถมมา  อาจจะโดนแฮคเครื่องหรือดูดข้อมูลได้ ขั้นตอนตรวจสอบไฟล์ก็ไม่สะดวก ผมเลยไม่ใช้วิธีนี้</p>
<h2 id="ใหอกเครองแชรไฟล-apk-มาให">
	<a href="#%e0%b9%83%e0%b8%ab%e0%b8%ad%e0%b8%81%e0%b9%80%e0%b8%84%e0%b8%a3%e0%b8%ad%e0%b8%87%e0%b9%81%e0%b8%8a%e0%b8%a3%e0%b9%84%e0%b8%9f%e0%b8%a5-apk-%e0%b8%a1%e0%b8%b2%e0%b9%83%e0%b8%ab" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ให้อีกเครื่องแชร์ไฟล์ APK มาให้
</h2>
<p>วิธีที่ผมใช้ คือ ผมจะใช้ Android เครื่องนึง(มือถือผม)ที่ล็อคอิน Google play store ไว้ โหลดแอพจาก store มาลงในเครื่องก่อนให้เสร็จ จากนั้นค่อยส่งไฟล์ APK ให้เครื่อง e-reader หรือเครื่องที่ไม่ได้ลง Google play store ครับ พออีกเครื่องได้ไฟล์ APK ไปก็จะสามารถลงแอพได้ วิธีนี้สามารถเอาไปใช้กับมือถือ, แท็บเล็ตและ e-reader ได้หมดเลยครับขอแค่เป็น Android</p>
<p>
<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/send-apk-from-google-play-device.png"
  alt="ภาพอธิบายใช้มือถือเครื่องที่มี Google play store ส่งไฟล์ APK ไปให้เครื่องที่ไม่มี Google play store"
  loading="lazy"
  
  width="1280"
  height="720"
  
/>

</p>
<p>หลายคนอาจจะงงว่า เอ๊ะ ปกติโหลดแอพจาก Google play store เราไม่ได้ไฟล์ APK มานิแล้วเราจะเอาไฟล์ APK จากไหน?</p>
<p>จริงๆ ก็มีอยู่หลายวิธีนะครับแต่จะขอแนะนำวิธีที่ง่ายและใช้ได้กับ Android ทุกยี่ห้อที่มี Google play store นั้นคือเราจะโหลดแอพ Files ของ Google มาใช้ครับ</p>
<h2 id="ใช-files-by-google-ดงไฟล-apk">
	<a href="#%e0%b9%83%e0%b8%8a-files-by-google-%e0%b8%94%e0%b8%87%e0%b9%84%e0%b8%9f%e0%b8%a5-apk" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ใช้ Files by Google ดึงไฟล์ APK
</h2>
<p>แอพนี้จริงๆ แล้วมันคือแอพจัดการไฟล์ในเครื่องเราครับ แต่ก็มีฟังก์ชันที่สามารถดึงไฟล์ APK จากแอพที่ลงในเครื่องเราออกมาส่งต่อได้</p>
<p>ใครยังไม่มีแอพให้ไปโหลดมาลงก่อนนะครับ <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.nbu.files" target="_blank" rel="noopener">Files by Google</a></p>
<p>
<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/file-by-google-play-store.png"
  alt="หน้าสโตล์ของ File by Google"
  loading="lazy"
  
  width="1390"
  height="914"
  
/>

</p>
<p>ส่วนวิธีการดึงไฟล์ APK ทำตามนี้ได้เลยครับ</p>
<ol>
<li>เปิดแอพ Files ขึ้นมา</li>
<li>กดตรง Apps

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/file_app_menu.jpg"
  alt=""
  loading="lazy"
  
  width="1079"
  height="770"
  
/>

</li>
<li>กดมาที่ Installed apps

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/file_tab_installed_app.jpg"
  alt=""
  loading="lazy"
  
  width="1080"
  height="676"
  
/>

</li>
<li>เลื่อนหาแอพที่เราต้องการจะเอาไปลงอีกเครื่องครับ อย่างตัวอย่างนี้ผมเลือก Meb:E-Reader</li>
<li>กดตรงเคบับเมนู (จุดสามจุด) แล้วกด Share ครับ

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/file_share_app.jpg"
  alt=""
  loading="lazy"
  
  width="1080"
  height="1313"
  
/>

</li>
<li>หน้าต่างแชร์ขึ้นมา ขั้นตอนนี้แล้วแต่ความสะดวกเลยว่าอยากส่งไฟล์ให้อีกเครื่องยังไง จะส่งผ่าน Bluetooth ก็ได้ หรือจะเลือกอัพขึ้น Google drive, Onedrive ไปก่อนแล้วค่อยโหลดมาลงก็ได้เหมือนกัน แต่ในตัวอย่างนี้ผมจะใช้วิธีส่งทาง Quick Share นะครับ เพราะเร็วกว่า Bluetooth และไม่ต้องใช้เน็ต
<div class="notice note">
  ตั้งแต่ขั้นตอนนี้ไปตัวหน้าตาอินเตอร์เฟสอาจจะไม่เหมือนกัน ขึ้นอยู่กับว่าใช้ Android ยี่ห้อไหนเวอร์ชันอะไรนะครับ
</div>


<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/quick_share_dialog.jpg"
  alt=""
  loading="lazy"
  
  width="1080"
  height="1144"
  
/>

</li>
<li>กดเลือก Quick share แล้วปล่อยทิ้งไว้แบบนั้นก่อน

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/quick_share_dialog_tap.jpg"
  alt=""
  loading="lazy"
  
  width="1080"
  height="1144"
  
/>

</li>
<li>มาเปิด Quick share อีกเครื่องกันครับ อินเตอร์เฟสของแต่ละยี่ห้อแต่ละรุ่นอาจจะไม่เหมือนกันนะครับ แต่หลักๆ จะคล้ายๆ กัน</li>
<li>ปัด Control enter ลงมา

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_control_center.png"
  alt=""
  loading="lazy"
  
  width="824"
  height="1648"
  
/>

</li>
<li>เลื่อนหาแล้วกด Quick share

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_control_center_quick_share.jpg"
  alt=""
  loading="lazy"
  
  width="824"
  height="867"
  
/>


ในขั้นตอนนี้ถ้าใครไม่มีปุ่ม Quick share ให้กดปุ่ม edit ที่เป็นรูปดินสอด้านบนดูก่อนนะครับเผื่อยังไม่ได้เพิ่มเมนูเข้าไป

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_control_center_edit.jpg"
  alt=""
  loading="lazy"
  
  width="824"
  height="876"
  
/>

</li>
<li>พอเข้ามาหน้า Quick share แล้วถ้ายังไม่ได้เปิด Location กับ Bluetooth จะมีมีปุ่มให้กดเปิดครับก็กดเปิดไป

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_quick_share_enable_location.jpg"
  alt=""
  loading="lazy"
  
  width="824"
  height="1595"
  
/>

</li>
<li>เสร็จแล้วไปที่ด้านขวาบนกดตรงเคบับเมนู(จุดสามจุด) &gt; กด Settings

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_quick_share_go_setting.jpg"
  alt=""
  loading="lazy"
  
  width="824"
  height="935"
  
/>

</li>
<li>กดตรง &ldquo;Who can share with you&rdquo;

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_quick_share_who_can_share.jpg"
  alt=""
  loading="lazy"
  
  width="824"
  height="1156"
  
/>

</li>
<li>กดเปิด &ldquo;Visible to nearby devices&rdquo;

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_quick_share_enable_visible.jpg"
  alt=""
  loading="lazy"
  
  width="824"
  height="1037"
  
/>

</li>
<li>เลือก &ldquo;Everyone for 10 minutes&rdquo;

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_quick_share_ten_min.jpg"
  alt=""
  loading="lazy"
  
  width="824"
  height="992"
  
/>

</li>
<li>เสร็จแล้วกดกลับมาหน้านี้รอไว้ก่อนครับ แล้วจำตรง &ldquo;You&rsquo;ll appear as&rdquo; ไว้นะครับตรงนี้มันจะเป็นชื่อเครื่องปลายทาง ใน ตย. นี้เครื่องปลายทางผมชื่อ Palma ครับ

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_quick_share_name.jpg"
  alt=""
  loading="lazy"
  
  width="824"
  height="1156"
  
/>

</li>
<li>กลับมาที่เครื่องต้นทางที่ใช้ส่งไฟล์รอสักพักนึงจะมีชื่อปลายทางขึ้น พอขึ้นแล้วก็กดได้เลย

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/quick_share_appear.jpg"
  alt=""
  loading="lazy"
  
  width="1080"
  height="2312"
  
/>

</li>
<li>กดแล้วรอแปปนึงรอจนมี PIN ขึ้นมาครับ พอขึ้นแล้วให้เรากลับไปที่เครื่องปลายทาง

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/quick_share_ping_appear.jpg"
  alt=""
  loading="lazy"
  
  width="1080"
  height="1229"
  
/>

</li>
<li>กลับมาที่เคลื่องปลายทางจะมีให้ยืนยันเลข PIN ครับ ถ้าเลขทั้งสองเครื่องตรงกันก็กด Accept ได้เลย

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_quick_share_confirm_pin.jpg"
  alt=""
  loading="lazy"
  
  width="824"
  height="972"
  
/>

</li>
<li>พอโหลดแล้วทีนี้ก็ถึงขึ้นตอนติดตั้งแล้วละครับ</li>
</ol>
<p>สำหรับการติดตั้งนั้น หลักๆ คือเปิดตัวจัดการไฟล์ขึ้นหาไฟล์ APK กดติดตั้งได้เลยครับ ตรงส่วนนี้เอง Android แต่ละยี่ห้อก็จะมีตัวจัดการไฟล์ที่ชื่อและหน้าตาไม่เหมือนกันแต่หลักการใช้แบบเดียวกันเลยครับ อย่างของ Samsung ก็จะเป็น &ldquo;My Files&rdquo; ของ Pixel จะเป็น &ldquo;Files&rdquo;</p>
<p>ในตัวอย่างนี้ของผมเป็น Boox ถ้าใครหน้าตาไม่เหมือนในรูปให้ลองกดๆ ดูของตัวเองที่คล้ายๆ เอานะครับ</p>
<ol>
<li>หาแอพจัดการไฟล์ของ Boox จะชื่อว่า Storage หน้าตาแบบนี้ครับ 
<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_storage_app_icon.jpg"
  alt="รูปแผ่นฟลอปปีดิสก์แบบมีเส้นขอบ"
  loading="lazy"
  
  width="226"
  height="232"
  
/>

</li>
<li>กดเข้ามาให้เลื่อนหาแล้วกดเมนู APK ครับ 
<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_storage_menu.jpg"
  alt="อินเตอร์เฟสของแอพ Storage ที่แสดงเมนูให้เลือกประเภทไฟล์ที่อยากดู"
  loading="lazy"
  
  width="824"
  height="1589"
  
/>

</li>
<li>เข้ามาจะมีรายชื่อไฟล์ APK ที่เรามีใครเครื่องครับ กด APK ที่เราต้องการจะติดตั้งเลยครับ ตัวอย่างนี้คือ Meb:E-Reader 
<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_storage_list_apk.jpg"
  alt="รายชื่อแสดงไฟล์ APK ที่มีในเครื่อง"
  loading="lazy"
  
  width="824"
  height="1586"
  
/>

</li>
<li>พอกดแล้วจะมีคำเตือนขึ้นมาเตือนครับว่าเรากำลังลงแอพนอกสโตล์นะอาจมีความเสี่ยงความปลอดภัย ตรงนี้ถ้าเป็นแอพที่เราส่งจาก Play store ตามขั้นตอนก่อนหน้ามาก็ไม่มีอะไรต้องกังวลครับกด Continue ไปต่อได้เลย

<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_install_app_warning.jpg"
  alt="หน้าต่างแจ้งเตือนว่ากำลังจะลงแอพนอกสโตล์อาจจะไม่ปลอดภัย ถือเป็นความรับผิดชอบของผู้ใช้งานเอง มีปุ่มยกเลิก และปุ่มให้ดำเนินการต่อ"
  loading="lazy"
  
  width="824"
  height="744"
  
/>

</li>
<li>ถัดมาจะเป็นหน้าถามว่าจะลงแอพไหมก็กด install ไปครับ 
<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_confirm_install_app.jpg"
  alt="หน้าต่างถามยืนยันว่าต้องการติดตั้งแอพใช่ไหม มีปุ่มยกเลิก และปุ่มติดตั้ง"
  loading="lazy"
  
  width="824"
  height="502"
  
/>

</li>
<li>พอลงเสร็จแล้วจะได้หน้าตาแบบ ลองกด Open เพื่อเปิดแอพได้เลย 
<img
  src="https://nitpum.com/post/install-playstore-app-on-none-playstore-device/./images/boox_app_installed.jpg"
  alt="หน้าต่างบอกว่าลงแอพเสร็จแล้ว มีปุ่มเสร็จสิ้นกับปุ่มเปิดแอพ"
  loading="lazy"
  
  width="824"
  height="504"
  
/>

</li>
<li>เท่านี้ก็เรียบร้อยแล้วครับ ใช้งานแอพได้เลย</li>
</ol>
<p>เท่าที่ผมลองมา Meb (ทั้งตัวธรรมดาและแบบ e-reader) กับ Kindle ลงด้วยวิธีนี้ใช้งานได้ไม่มีปัญหาเลยครับ ยังไงใครลองแล้วเจอว่าแอพไหนใช้งานได้ไม่ได้ฝากคอมเมนต์ทิ้งไว้หน่อยนะครับ คนที่ตามมาอ่านทีหลังจะได้รู้ว่าแอพไหนได้บ้าง</p>
<p>หวังว่าโพสต์นี้จะมีประโยชน์สำหรับใครที่ไม่ต้องการล็อคอิน Google ในเครื่องหรือเครื่องไม่มี Google play store นะครับ</p>
]]></description>
		</item><item>
			<title>มาซื้อไฟล์เพลงญี่ปุ่นถูกลิขสิทธิ์แบบ DRM-Free กันเถอะ! ด้วย Ototoy</title>
			<link>https://nitpum.com/post/ototoy/</link>
			<pubDate>Sun, 01 Feb 2026 10:52:43 +0700</pubDate>
			
			<guid>https://nitpum.com/post/ototoy/</guid>
			<description><![CDATA[<p>ปัจจุบันการฟังเพลงผ่านแฟลตฟอร์มออนไลน์ถือเป็นเรื่องปกติทั่วไปแล้ว ด้วยความเข้าถึงง่าย ฟังเพลงได้หลากหลาย ราคาถูก แต่ก็แลกมากับการที่เราจ่ายเงินไปแล้วไม่ได้มีสิทธิ์เป็นเจ้าของไฟล์เพลงนั้นจริงๆ ได้แค่สิทธิ์เข้ามาฟังเฉยๆ ถ้าเพลงโดนลบก็ฟังต่อไม่ได้ วันไหนบัญชีโดนแฮ็คโดนแบน หรือแอพปิดตัวลงก็จะฟังไม่ได้ อยากเอาไปเปิดบนเครื่องเก่าๆ ก็ทำไม่ได้เพราะแอพไม่รองรับ จะเอาไปเปิดบนแอพอื่นก็ทำไม่ได้เพราะเราเข้าไม่ถึงไฟล์เพลง</p>
<p>ส่วนใหญ่ถ้าเราอยากได้ไฟล์เพลงมาถ้าไม่โหลดเถื่อนที่ผิดลิขสิทธิ์ ก็ต้องซื้อแผ่นแล้วเอามา Rip CD เอง ต้องมีทั้งที่เก็บ ต้องมีทั้งเครื่องอ่าน ค่าส่งแผ่นจากต่างประเทศที่แพง แล้วไหนจะขั้นตอนตั้งแต่ซื้อยันเอาแผ่นมา Rip เองอีกค่อนข้างยุ่งยากและใช้เวลาพอสมควร</p>
<p>โพสต์นี้เลยจะมาแนะนำเว็บที่สามารถซื้อไฟล์เพลงญี่ปุ่นแบบถูกลิขสิทธิ์ สำหรับคนอยากได้ไฟล์เอาไปเปิดเล่นที่ไหนก็ได้ ไม่ว่าจะเครื่องเก่าหรือใช้แอพอะไร ขอแค่เล่นไฟล์เพลงดิจิตอลได้ก็พอแล้ว เพราะเราจะได้ไฟล์เพลงแบบ DRM-free มาครับ</p>
<h2 id="drm-free-คออะไร">
	<a href="#drm-free-%e0%b8%84%e0%b8%ad%e0%b8%ad%e0%b8%b0%e0%b9%84%e0%b8%a3" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		DRM-free คืออะไร?
</h2>
<p>DRM หรือชื่อเต็ม Digital right management คือ ซอฟแวร์ที่เอาไว้จัดการเช็คสิทธิ์การใช้งานไฟล์, โปรแกรม หรือเกม พูดง่ายๆ ก็คือมันเอาไว้กันการโหลดเถื่อนนั้นแหละ เวลาที่เราจ่ายเงินซื้อของที่มี DRM เราจะไม่ได้เป็นเจ้าของสิ่งนั้นจริงๆ แต่จะได้สิทธิ์การเข้าถึงหรือใช้สิ่งนั้นๆ แทน</p>
<p>ตัวอย่างเช่นเกมที่อยู่บน Steam เกมส่วนใหญ่จะเป็นแบบมี DRM ก่อนเล่นจะบังคับให้เราเข้า Steam และ login ให้เสร็จก่อนถึงจะเล่นได้ ถ้าไม่ login ก็จะเล่นไม่ได้แม้เป้นเกมออฟไลน์ก็ตาม ที่เป็นแบบนี้เพราะ Steam จะเช็คว่าเรามีสิทธิ์เล่นเกมนี้จริงๆ ไหม</p>
<p>หรือถ้าเป็น E-book หลายๆ แอพจะบังคับให้เราอ่านได้จากแอพที่เราซื้อ E-book เล่มนั้นๆ มาเท่านั้น ไม่สามารถโหลดไปอ่านที่แอพอื่นได้ หรือถ้าโหลดได้ก็จะมีข้อบังคับให้ยืนยันด้วยวิธีต่างๆ</p>
<p>สำหรับเพลงนั้นจะเรียกว่าแอพที่ให้บริการสตรีมมิ่งเป็น DRM ก็ได้ เพราะเราต้อง login เพื่อยืนยันสิทธิ์ในการฟังก่อน และไม่สามารถโหลดเพลงออกมาฟังที่แอพอื่นได้</p>
<p>ดังนั้นถ้าพูดถึง DRM-free คำว่า free ในที่นี้หมายถึง &ldquo;ปราศจาก&rdquo; หรือก็คือ ไม่มี DRM นั้นเอง ไฟล์เพลง, เกมหรือโปรแกรมที่เป็น DRM-free จะไม่บังคับเราให้ login จะเอาไฟล์ไปเปิดหรือเล่นที่ไหนก็ได้ไม่มีข้อบังคับ พูดง่ายๆ ก็คือเราซื้อไฟล์เพลงมาแล้ว เราได้เป็นเจ้าของไฟล์เพลงนั้นจริงๆ</p>
<h2 id="ototoy">
	<a href="#ototoy" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Ototoy
</h2>
<p>จริงๆ แหล่งซื้อเพลงดิจิตอลญี่ปุ่นก็มีหลายที่แต่โพสต์นี้ขอพูดถึงแหล่งที่สะดวกและซื้อง่ายก็ต่อการซื้อก่อนละกันนั้นก็คือ <a href="https://ototoy.jp" target="_blank" rel="noopener">ototoy.jp</a> นั้นเอง!</p>
<p>ในเว็บถ้าเข้ามาแล้วเป็นภาษาญี่ปุ่นให้เลื่อนลงไปด้านล่างสุดจะมีปุ่มให้เปลี่ยนภาษานะครับ</p>
<p>
	<figure>
		<img
			src="https://nitpum.com/post/ototoy/./images/language-switcher.jpg"
			alt="ปุ่ม 言語/Language เพื่อเปลี่ยนภาษา"
			loading="lazy"
			
			width="594"
			height="356"
			
		/>
		<figcaption class="text-center">ตรงส่วน footer ด้านล่างของเว็บไซต์จะมีปุ่มให้กดเปลี่ยนภาษา</figcaption>
	</figure>

</p>
<h2 id="ขนตอนการซอ">
	<a href="#%e0%b8%82%e0%b8%99%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%8b%e0%b8%ad" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ขั้นตอนการซื้อ
</h2>
<p>เว็บ Ototoy สามารถซื้อเพลงแบบไม่ต้องสมัครบัญชีได้แต่ก็จะมีข้อจำกัดบางอย่าง แนะนำให้สมัครสมาชิกไว้เลยดีกว่าครับ เพลงจะได้เข้ามาอยู่บัญชีเราเลยจะฟังจะโหลดจะได้ทำง่ายๆ  เมนูสมัครจะอยู่ด้านขวาบน Guest &gt; Sign Up วิธีการสมัครผมขอข้ามไปนะสมัครไม่ยากคิดว่าน่าจะทำกันได้อยู่แล้ว ขั้นตอนนี้เราสามารถทำได้เลยไม่ต้องใช้ VPN</p>
<ol>
<li>
<p>ถ้ามีบัญชีแล้วก็กด Sign In เข้าสู่ระบบมาเลยครับ</p>
</li>
<li>
<p>เลือกเพลงที่เราอยากจะซื้อ แต่ละเพลงจะมีให้เรากดทดลองฟัง ลองฟังดูก่อนได้</p>
</li>
<li>
<p>ดูข้อจำกัดของแต่ละเพลง บางเพลงจะมีข้อจำกัดบางอย่างตามนี้ครับ</p>
<p><strong>Audio format</strong></p>
<p>
<img
  src="https://nitpum.com/post/ototoy/./images/hi-res-vs-loessless.png"
  alt="รูปปกเพลงที่มีป้ายบอกว่าเป็น hi-res หรือ lossless"
  loading="lazy"
  
  width="665"
  height="330"
  
/>

</p>
<p>Audio format: Hi-res, Lossless</p>
<p>ผมไม่ค่อยมีคามรู้เรื่องเสียงเท่าไรเลยอธิบายมากไม่ค่อยได้ แต่ถ้าเอาแบบง่ายๆ ความต่างระหว่าง Hi-res กับ Loessless คือ Hi-res ความละเอียดเสียงจะสูงกว่าครับ แน่นอนว่าราคาก็จะแพงกว่าด้วย ซึ่งบางเพลงอาจจะไม่ได้มีให้เลือกเพราะทำมาแบบเดียว สำหรับใครที่หูไม่ได้เทพแยกเสียงได้ดีขนาดนั้นก็ไม่ต้องคิดมากก็ได้ครับเลือกมาสักอันก็พอ</p>
<p><strong>ประเภทไฟล์ที่จะได้</strong></p>
<p>
<img
  src="https://nitpum.com/post/ototoy/./images/file-format.jpg"
  alt=""
  loading="lazy"
  
  width="1088"
  height="699"
  
/>

</p>
<p>File type: alac, flac, wave, acc</p>
<p>แต่ละเพลงจะมีไฟล์ฟอร์แมตให้มาไม่เหมือนกันขึ้นอยู่กับว่าอัพโหลดฟอร์แมตไหนบ้าง แต่ส่วนใหญ่จะมี flac มาให้ซึ่งถือว่าครอบคลุมแล้ว ไม่รู้จะแบบไหนก็เลือก flac มาก่อนก็ได้ครับ ประเภทไฟล์เราสามารถกลับมาเปลี่ยนทีหลังได้ครับ</p>
<p><strong>จำนวนครั้งที่โหลดไฟล์ได้</strong></p>
<p>หลายๆ เพลงตัวเจ้าของลิขสิทธิ์จะจำกัดจำนวนครั้งที่โหลดไฟล์เอาไว้ ถ้าเพลงมีการจำกัดจำนวนดาวน์โหลดแนะนำว่าให้โหลดมาหนึ่งครั้งแล้วแบ็คอัพเก็บไว้ครับ อัพลง Google drive/Onedrive/Apple cloud ส่วนตัว หลังจากนั้นเวลาอยากจะโหลดมาก็โหลดจากไฟล์ที่อยู่ใน cloud ตัวเองครับ จะได้ไม่โดนนับครั้งโหลด</p>
<p>
	<figure>
		<img
			src="https://nitpum.com/post/ototoy/./images/download-limits.jpg"
			alt="รูปหน้าเว็บแสดงข้อมูลเพลงที่ด้านซ้ายจะมีบอกข้อมูลกำจัดครั้งดาวน์โหลด"
			loading="lazy"
			
			width="1088"
			height="673"
			
		/>
		<figcaption class="text-center">เพลงที่มีจำกัดดาวน์โหลดจะมีเขียนไว้ด้านข้าง</figcaption>
	</figure>

</p>
<p><strong>Region-lock</strong></p>
<p>บางเพลงจะซื้อนอกญี่ปุ่นไม่ได้ครับ
วิธีสังเกตง่ายๆ คือ ถ้าเข้าไปแล้วกดฟังเพลงไม่ได้หรือมีข้อความ &ldquo;We&rsquo;re sorry, this album is not available in your region&rdquo; จะเป็นแบบ Region-lock ครับ ซื้อได้แค่ที่ญี่ปุ่นเท่านั้น (แต่ใช้ VPN ช่วยได้)</p>
<p>
	<figure>
		<img
			src="https://nitpum.com/post/ototoy/./images/region-lock.jpg"
			alt=""
			loading="lazy"
			
			width="1088"
			height="673"
			
		/>
		<figcaption class="text-center">ขึ้นแบบนี้แสดงว่าซื้อได้แค่ที่ญี่ปุ่นครับ</figcaption>
	</figure>

</p>
</li>
<li>
<p>ถ้าเพลงที่เราจะซื้อติด region-lock เราต้องใช้ VPN ไปที่ญี่ปุ่นครับ ส่วนตัวผมใช้ <a href="https://pr.tn/ref/5DEAYTRT" target="_blank" rel="noopener">ProtonVPN</a> (เสียเงิน) หรือจะใช้ VPN ฟรีเจ้าอื่นก็ได้ครับขอแค่ต่อไปญี่ปุ่นได้</p>
<p>ต้องเปิด VPN ตั้งแต่หน้าเลือกเพลงนะครับไม่งั้นกดเลือกเพลงเข้าตระกร้าไม่ได้ ใครเปิด VPN ทีหลังให้ refresh หน้าหนึ่งทีครับกดเลือกตระกร้าถึงจะกดได้</p>
<div class="notice note">
  VPN ใช้แค่ตอนเลือกเพลงเข้าตระกร้าจนถึงตอนจ่ายเงินเสร็จเท่านั้นครับ หลังจากนั้นจะฟังจะโหลดสามารถทำได้โดยไม่ต้องใช้ VPN แล้ว
</div>

</li>
<li>
<p>พอเจอเพลงที่ถูกใจแล้ว</p>
<ol>
<li>กดเลือก file format ที่ต้องการ (ตรงนี้ซื้อครั้งเดียวสามารถเปลี่ยนเป็น format อื่นทีหลังได้ครับ)</li>
<li>กดเพิ่มเเข้าตระกร้าเลย</li>
</ol>
<p>
<img
  src="https://nitpum.com/post/ototoy/./images/select-music.jpg"
  alt=""
  loading="lazy"
  
  width="1063"
  height="729"
  
/>

</p>
<p>หรือถ้าอยากซื้อทั้งอัลบั้มก็ได้เหมือนกัน</p>
<p>
<img
  src="https://nitpum.com/post/ototoy/./images/select-album.jpg"
  alt="ภาพตัวอย่างหน้าเว็บแสดงข้อมูลอัลบั้ม มีให้เลือกประเภทไฟล์ทั้งอัลบั้มและปุ่มกดเพิ่มเข้าตระกร้าทั้งอัลบั้ม"
  loading="lazy"
  
  width="1063"
  height="778"
  
/>

</p>
</li>
<li>
<p>พอเลือกเพลงที่ต้องเข้าตระกร้าครบแล้วก็ไปหน้าตระกร้าได้เลย เมนูจะอยู่ด้านบนขวาชื่อ <code>Cart</code></p>
</li>
<li>
<p>หน้าตระกร้าก็ตรวจสอบข้อมูลให้เรียบร้อย ถ้าทุกอย่างโอเคก็ checkout ได้เลย 
<img
  src="https://nitpum.com/post/ototoy/./images/cart.png"
  alt=""
  loading="lazy"
  
  width="1088"
  height="677"
  
/>

</p>
</li>
<li>
<p>เว็บจะให้เข้าใส่รหัสผ่านยืนยันอีกครั้งก็ใส่ไปครับ 
<img
  src="https://nitpum.com/post/ototoy/./images/password-recheck.png"
  alt=""
  loading="lazy"
  
  width="1088"
  height="677"
  
/>

</p>
</li>
<li>
<p>ต่อมาก็เลือกวิธีจ่ายเงิน ตรงนี้กดเลือก &ldquo;By Credit card&rdquo; ได้เลยครับ ใช้ได้ทั้ง Debit card และ Credit card ที่ออกโดยธนาคารประเทศไทย ไม่จำเป็นต้องเป็นบัตรต่างประเทศ แต่อย่าลืมเปิดให้จ่ายออนไลน์ได้ด้วยนะครับ ตรงนี้ใครไม่มีบัตรลองสมัครใช้พวก Virtual card อย่าง KTB Fun หรือ True money virtual card แทนเอาก็ได้ครับ 
<img
  src="https://nitpum.com/post/ototoy/./images/payment-method.png"
  alt=""
  loading="lazy"
  
  width="1088"
  height="820"
  
/>

</p>
<p>ส่วนด้านล่างจะเป็น OTOTOY Points ถ้าใครมี point สามารถเอา point มาเป็นส่วนลดได้</p>
<p>ถ้าทุกอย่างโอเคแล้วกด confirm ได้เลย</p>
</li>
<li>
<p>ถัดไปจะเป็นหน้าให้กรอกข้อมูลบัตรครับ บัญชีผมมีข้อมูลบัตรไว้อยู่แล้วหน้านี้เลยแค่คอนเฟิร์ม CCV ใครที่ทำครั้งแรกก็กรอกข้อมูลบัตรให้ครบ ส่วนตรง <code>What type of your computer?</code> ให้เลือกอันที่เป็น <code>UTF-8</code> ครับ</p>
<p>
<img
  src="https://nitpum.com/post/ototoy/./images/confirm-payment.png"
  alt=""
  loading="lazy"
  
  width="1088"
  height="769"
  
/>

</p>
<p>เสร็จแล้วก็กด <code>Place Your Order</code> ได้เลย</p>
</li>
<li>
<p>ซื้อเสร็จแล้ว ถึงขั้นตอนนี้ถ้าใช้ VPN สามารถปิดได้เลยครับ 
<img
  src="https://nitpum.com/post/ototoy/./images/complete.png"
  alt=""
  loading="lazy"
  
  width="1088"
  height="671"
  
/>

</p>
</li>
</ol>
<h2 id="วธโหลดเพลง">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b9%82%e0%b8%ab%e0%b8%a5%e0%b8%94%e0%b9%80%e0%b8%9e%e0%b8%a5%e0%b8%87" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีโหลดเพลง
</h2>
<ol>
<li>
<p>ด้านบนขวากดเมนู collection จะเข้ามาหน้า Library 
<img
  src="https://nitpum.com/post/ototoy/./images/collection.jpg"
  alt=""
  loading="lazy"
  
  width="1122"
  height="700"
  
/>

</p>
</li>
<li>
<p>ตรงเพลง</p>
<ol>
<li>กดตรงลูกศร</li>
<li>แล้วจะมีปุ่มดาวน์โหลดรูปก้อนเมฆโผล่ออกมาครับ กดตรงปุ่มก้อนเมฆเพื่อโหลดได้เลย</li>
</ol>
<p>
<img
  src="https://nitpum.com/post/ototoy/./images/download.jpg"
  alt=""
  loading="lazy"
  
  width="510"
  height="412"
  
/>

</p>
</li>
<li>
<p>เท่านี้ก็จะได้ไฟล์ zip มา แตกไฟล์ก็ฟังเพลงได้เลยครับ</p>
<p>
	<figure>
		<img
			src="https://nitpum.com/post/ototoy/./images/player.png"
			alt=""
			loading="lazy"
			
			width="422"
			height="684"
			
		/>
		<figcaption class="text-center">ตัวอย่างเล่นเพลงด้วยโปรแกรม Gapless บน Linux</figcaption>
	</figure>

</p>
</li>
</ol>
<h2 id="วธเปลยน-file-format">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b9%80%e0%b8%9b%e0%b8%a5%e0%b8%a2%e0%b8%99-file-format" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีเปลี่ยน File format
</h2>
<p>สำหรับเพลงที่มี file format หลายๆ แบบให้เลือก แล้วเราอยากเปลี่ยนทีหลังให้ทำตามดังนี้ครับ</p>
<ol>
<li>
<p>กดไปหน้าข้อมูลเพลงนั้นๆ</p>
</li>
<li>
<p>ตรง Price กดเลือก file format ที่ต้องการ แล้วกดเพิ่มเข้าตระกร้าเลยครับ

<img
  src="https://nitpum.com/post/ototoy/./images/change-format.png"
  alt=""
  loading="lazy"
  
  width="765"
  height="386"
  
/>

</p>
</li>
<li>
<p>เสร็จแล้วกดไปที่ Cart แล้ว checkout ไปเลยครับ เป็นหน้า checkout ก็จริงแต่ราคา 0 เยนไม่คิดเงิน

<img
  src="https://nitpum.com/post/ototoy/./images/cart-free.png"
  alt=""
  loading="lazy"
  
  width="1017"
  height="602"
  
/>

</p>
</li>
<li>
<p>หน้าถัดมาจะเป็นหน้าจ่ายเงินก็เลือกแบบฟรีไปเลยเพราะครับไม่เสียเงินอยู่แล้ว

<img
  src="https://nitpum.com/post/ototoy/./images/payment-free.png"
  alt=""
  loading="lazy"
  
  width="1017"
  height="513"
  
/>

</p>
</li>
<li>
<p>ที่เหลือก็ทำเหมือนตอนซื้อเพลงเลยครับ</p>
</li>
<li>
<p>พอทำทุกอย่างเสร็จแล้ว เวลากดไปหน้า collection แล้วกดดาวน์โหลดเราก็จะได้ไฟล์เพลงอันใหม่ที่เราเลือกแล้วครับ</p>
<p>ส่วนวิธีเช็คว่าตอนนี้เป็น file format ไหนอยู่ ให้กดตรงจุด 3 จุด &gt; track info &gt; format

	
	<video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/ototoy/videos/file-type.mp4" type="video/mp4">
		
		
		
	</video>
</p>
</li>
</ol>
<p>จบแล้วครับเท่านี้เราก็มีไฟล์เพลงที่เอาไปฟังที่ไหนได้แล้วครับ แต่อย่าเอาไฟล์ไปแจกใครนะครับแบบนั้นผิดลิขสิทธิ์ ตามลิขสิทธิ์แล้วไฟล์จะใช้ได้เฉพาะกับเราเท่านั้นห้ามเอาไปแจกหรือส่งต่อใคร</p>
]]></description>
		</item><item>
			<title>changesets warn received 404 for npm info on pre-release</title>
			<link>https://nitpum.com/post/changesets-npm-info-prerelease/</link>
			<pubDate>Thu, 04 Jan 2024 21:31:59 +0700</pubDate>
			
			<guid>https://nitpum.com/post/changesets-npm-info-prerelease/</guid>
			<description><![CDATA[<p>I work on monorepo setting up changesets to a project and found a problem when working with pre-release versions.</p>
<h2 id="what-is-changesets">
	<a href="#what-is-changesets" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		What is changesets
</h2>
<p><a href="https://github.com/changesets/changesets" target="_blank" rel="noopener">changesets</a> is a versioning and changelogs for monorepo. By writing impacts and change descriptions in markdown changesets file with commits, Changeset will collect these files to determine which package to bump, versioning, create changelogs, and publish package to registry automatically. The only manual work is writing a change file.</p>
<h2 id="pre-release-version">
	<a href="#pre-release-version" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Pre-release version
</h2>
<p>Semantic version has pre-release version <a href="https://semver.org/#spec-item-9" target="_blank" rel="noopener">specs</a> for an unstable build. The format is something like this <code>1.0.0-alpha</code>, <code>1.0.0-alpha.1</code> in my case is <code>0.1.0-beta.1</code></p>
<h2 id="the-problem">
	<a href="#the-problem" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		The problem
</h2>
<p>Everything seems fine. I setup changesets. Make a first changes. Write a changesets file. Push commit to remote. Pipeline run. Changesets tags and push <code>0.1.0-beta.1</code> to private registry. Everything works as expected. Nothing to worry. I work on other work.</p>
<p>Sometime later. I make an another change. Push commit to remote.</p>
<p>Pipeline GREEN. But I notice something in the CI log.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>🦋  info npm info @nitpum/ui
</span></span><span style="display:flex;"><span>🦋  warn Received <span style="color:#ae81ff">404</span> <span style="color:#66d9ef">for</span> npm info <span style="color:#e6db74">&#34;@nitpum/ui&#34;</span>
</span></span><span style="display:flex;"><span>🦋  info @nitpum/ui is being published because our local version <span style="color:#f92672">(</span>0.1.0-beta.1<span style="color:#f92672">)</span> has not been published on npm
</span></span></code></pre></div><p>Look like changesets can&rsquo;t find my package on the registry and try to publish <code>0.1.0-beta.1</code> to the registry again because it think this version never published and this is the first times.</p>
<p>But how it can&rsquo;t find the existing version?</p>
<p>After some investigation, I found that changesets use npm info underlying.</p>
<h2 id="what-is-npm-info">
	<a href="#what-is-npm-info" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		What is npm info
</h2>
<p>npm info is a command to get package information e.g. description, dependencies, dist-tags, etc.
The command is same as <a href="https://docs.npmjs.com/cli/v10/commands/npm-view" target="_blank" rel="noopener">npm view</a></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>npm info &lt;package-name&gt;
</span></span></code></pre></div><h2 id="changesets-implementation">
	<a href="#changesets-implementation" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Changesets Implementation
</h2>
<p>Changesets <a href="https://github.com/changesets/changesets/blob/main/packages/cli/src/commands/publish/npm-utils.ts#L99-L116" target="_blank" rel="noopener">implemented</a> code like this</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 99
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">100
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">101
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">102
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">103
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">104
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">105
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">106
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">107
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">108
</span><span style="background-color:#3c3d38"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">109
</span></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">110
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">111
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">112
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">113
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">114
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">115
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">116
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;"><code class="language-ts" data-lang="ts"><span style="display:flex;"><span><span style="color:#66d9ef">let</span> <span style="color:#a6e22e">result</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">spawn</span>(<span style="color:#e6db74">&#34;npm&#34;</span>, [
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;info&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">packageJson</span>.<span style="color:#a6e22e">name</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;--registry&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">getCorrectRegistry</span>(<span style="color:#a6e22e">packageJson</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;--json&#34;</span>,
</span></span><span style="display:flex;"><span>]);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Github package registry returns empty string when calling npm info
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// for a non-existent package instead of a E404
</span></span></span><span style="display:flex; background-color:#3c3d38"><span><span style="color:#75715e"></span><span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">result</span>.<span style="color:#a6e22e">stdout</span>.<span style="color:#a6e22e">toString</span>() <span style="color:#f92672">===</span> <span style="color:#e6db74">&#34;&#34;</span>) {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">error</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">code</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;E404&#34;</span>,
</span></span><span style="display:flex;"><span>		},
</span></span><span style="display:flex;"><span>	};
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">return</span> <span style="color:#a6e22e">jsonParse</span>(<span style="color:#a6e22e">result</span>.<span style="color:#a6e22e">stdout</span>.<span style="color:#a6e22e">toString</span>());
</span></span></code></pre></td></tr></table>
</div>
</div><p>Changesets check the stdout if returns empty, assume that it run on Github actions and package not exists.
Normally, npm info never returns empty string on stdout.</p>
<p>But these is a case that can returns empty string.</p>
<p>If your package is published pre-release version and never published stable version yet, Looks like the registry can&rsquo;t get package info because no info from stable version so it returns empty string instead (package info is empty)</p>
<div class="notice note">
  Not sure that all registry has this problem. In my case the registry is <a href="https://www.sonatype.com/products/sonatype-nexus-repository" target="_blank" rel="noopener">SonarType Nexus</a>
</div>

<h2 id="the-solution">
	<a href="#the-solution" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		The solution
</h2>
<p>Publish a stable version to registry once then <code>npm info</code> will return package info with pre-release version info correctly, instead of empty string.</p>
]]></description>
		</item><item>
			<title>Make lint-staged &#43; eslint work in monorepo</title>
			<link>https://nitpum.com/post/lint-staged-eslint-monorepo/</link>
			<pubDate>Wed, 03 Jan 2024 22:38:16 +0700</pubDate>
			
			<guid>https://nitpum.com/post/lint-staged-eslint-monorepo/</guid>
			<description><![CDATA[<p>Imagine a monorepo project that structure like this</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>├── .eslintrc.js
</span></span><span style="display:flex;"><span>├── .husky
</span></span><span style="display:flex;"><span>├── .lintstagedrc.json
</span></span><span style="display:flex;"><span>├── package.json
</span></span><span style="display:flex;"><span>└── packages
</span></span><span style="display:flex;"><span>    ├── app
</span></span><span style="display:flex;"><span>    │   ├── index.js
</span></span><span style="display:flex;"><span>    │   └── package.json
</span></span><span style="display:flex;"><span>    └── ui
</span></span><span style="display:flex;"><span>        ├── index.js
</span></span><span style="display:flex;"><span>        └── package.json
</span></span></code></pre></div><p>And has eslint command in <code>.lintstagedrc.json</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#f92672">&#34;*.js&#34;</span>: [<span style="color:#e6db74">&#34;eslint --fix&#34;</span>] }
</span></span></code></pre></div><p>In the example, when lint-staged runs when has .js staged files it will invoke <code>eslint --fix</code> to fix the file.</p>
<p>Normal behavior of lint-staged is run command in the project root directory and pass absolute file path as argument e.g.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>eslint --fix /home/user/project/package/app/index.js /home/user/project/package/ui/index.js
</span></span></code></pre></div><p>In the most cases, this is not a problem and usually this is a normal config for non-monorepo project.</p>
<p>However, the problem will occur when some packages has its own eslint config</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>├── .eslintrc.js
</span></span><span style="display:flex;"><span>├── .husky
</span></span><span style="display:flex;"><span>├── .lintstagedrc.json
</span></span><span style="display:flex;"><span>├── package.json
</span></span><span style="display:flex;"><span>└── packages
</span></span><span style="display:flex;"><span>    ├── app
</span></span><span style="display:flex;"><span>    │   ├── index.js
</span></span><span style="display:flex;"><span>    │   └── package.json
</span></span><span style="display:flex;"><span>    └── ui
</span></span><span style="display:flex; background-color:#3c3d38"><span>        ├── .eslintrc.js	<span style="color:#75715e"># &lt;--- specific eslint config for ui</span>
</span></span><span style="display:flex;"><span>        ├── index.js
</span></span><span style="display:flex;"><span>        └── package.json
</span></span></code></pre></div><p>When lint-staged runs, it will run <code>eslint --fix</code> in the project root directory and eslint will picks the closest config file which is <code>./.eslintrc.js</code> even the staged file is in <code>./packages/ui</code> (that should uses config from <code>./packages/ui/.eslintrc.js</code> instead) which make eslint invalid.</p>
<p>To fix the problem, just add <code>.lintstagedrc.json</code> to package that need to run script in package directory in this cases is <code>./packages/ui/.lintstagedrc.json</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>├── .eslintrc.js
</span></span><span style="display:flex;"><span>├── .husky
</span></span><span style="display:flex;"><span>├── .lintstagedrc.json
</span></span><span style="display:flex;"><span>├── package.json
</span></span><span style="display:flex;"><span>└── packages
</span></span><span style="display:flex;"><span>    ├── app
</span></span><span style="display:flex;"><span>    │   ├── index.js
</span></span><span style="display:flex;"><span>    │   └── package.json
</span></span><span style="display:flex;"><span>    └── ui
</span></span><span style="display:flex;"><span>        ├── .eslintrc.js
</span></span><span style="display:flex; background-color:#3c3d38"><span>        ├── .lintstagedrc.json	<span style="color:#75715e"># &lt;-- Just add this!</span>
</span></span><span style="display:flex;"><span>        ├── index.js
</span></span><span style="display:flex;"><span>        └── package.json
</span></span></code></pre></div><p>That&rsquo;s it!</p>
<p>Now when has staged file in <code>./packages/ui</code> lint-staged will run separate <code>eslint --fix</code> in <code>./packages/ui</code>. For the other staged file it still run <code>eslint --fix</code> in the project root directory.</p>
<p>lint-staged has <a href="https://github.com/lint-staged/lint-staged?tab=readme-ov-file#how-to-use-lint-staged-in-a-multi-package-monorepo" target="_blank" rel="noopener">section</a> explain about this and how to setup in monorepo that you can read further more.</p>
]]></description>
		</item><item>
			<title>Use nanoid in WeChat Mini Program</title>
			<link>https://nitpum.com/post/wechat-miniprogram-nanoid/</link>
			<pubDate>Thu, 02 Nov 2023 03:25:06 +0000</pubDate>
			
			<guid>https://nitpum.com/post/wechat-miniprogram-nanoid/</guid>
			<description><![CDATA[<p>Developing WeChat mini program</p>
<p>Want to use <a href="https://github.com/ai/nanoid" target="_blank" rel="noopener">nanoid</a> to generate unique id or something like that</p>
<p>npm i nanoid</p>
<p>&ldquo;node:crypto&rdquo; is not defined, &ldquo;crypto&rdquo; is not defined</p>
<p>Surpise! nanoid is relying on <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API" target="_blank" rel="noopener">Web Crypto API</a></p>
<p>WeChat don&rsquo;t have Web Crypto API</p>
<p>What to do now?</p>
<p>Peek the <a href="https://github.com/ai/nanoid/blob/88af1ee0d6610efc308d265018c1cd89f52bb76b/index.browser.js#L50C1-L51C70" target="_blank" rel="noopener">source code</a></p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">50
</span><span style="background-color:#3c3d38"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">51
</span></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">52
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#66d9ef">export</span> <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">nanoid</span> <span style="color:#f92672">=</span> (<span style="color:#a6e22e">size</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">21</span>) =&gt;
</span></span><span style="display:flex; background-color:#3c3d38"><span>	<span style="color:#a6e22e">crypto</span>.<span style="color:#a6e22e">getRandomValues</span>(<span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Uint8Array</span>(<span style="color:#a6e22e">size</span>)).<span style="color:#a6e22e">reduce</span>(<span style="color:#75715e">/* ... */</span>);
</span></span><span style="display:flex;"><span><span style="color:#75715e">// ...
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Oh, it just need only <code>crpyto.getRandomValues</code>. Don&rsquo;t require entire crypto API</p>
<p>Fortunately, WeChat mini program has built-in <a href="https://developers.weixin.qq.com/miniprogram/en/dev/api/device/crypto/wx.getRandomValues.html" target="_blank" rel="noopener">wx.getRandomValues</a>!</p>
<p>Let&rsquo;s try to port this</p>
<p>First, change <code>cryto.getRandomValues()</code> to <code>wx.getRandomValues</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#66d9ef">export</span> <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">nanoid</span> <span style="color:#f92672">=</span> (<span style="color:#a6e22e">size</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">21</span>) =&gt;
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">wx</span>.<span style="color:#a6e22e">getRandomValues</span>({
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">length</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">size</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">succes</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">res</span> =&gt; <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Uint8Array</span>(<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">randomValues</span>
</span></span><span style="display:flex;"><span>	})
</span></span><span style="display:flex;"><span>	.<span style="color:#a6e22e">reduce</span>(<span style="color:#75715e">/* ... */</span>)
</span></span></code></pre></div><p><code>wx.getRandomValues</code> it not immediately return value, instead it is a callback style so can&rsquo;t just simple call <code>.reduce</code></p>
<p>Need to move reduce into the success callback function</p>
<p>Don&rsquo;t like that way</p>
<p>Make it promise!</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#66d9ef">export</span> <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">nanoid</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">async</span> (<span style="color:#a6e22e">size</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">21</span>) =&gt; {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">const</span> <span style="color:#a6e22e">randomValues</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">await</span> <span style="color:#66d9ef">new</span> Promise((<span style="color:#a6e22e">resolve</span>) =&gt; {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">wx</span>.<span style="color:#a6e22e">getRandomValues</span>({
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">length</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">size</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">success</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">res</span> =&gt; <span style="color:#a6e22e">resolve</span>(<span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Uint8Array</span>(<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">randomValues</span>))
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>	})
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">randomValues</span>.<span style="color:#a6e22e">reduce</span>(<span style="color:#75715e">/* ... */</span>)
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></div><p>It work!</p>
<p>Copy and paste it some where in the project</p>
<p>npm remove nanoid. No need it in node_modules any more</p>
<p>Here the final code
<div class="notice note">
  I&rsquo;m not security expert. Use this at your own risk
</div>
</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#66d9ef">export</span> <span style="color:#66d9ef">default</span> <span style="color:#66d9ef">async</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">nanoid</span>(<span style="color:#a6e22e">size</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">21</span>) {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">const</span> <span style="color:#a6e22e">randomValues</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">await</span> <span style="color:#66d9ef">new</span> Promise((<span style="color:#a6e22e">resolve</span>) =&gt; {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">wx</span>.<span style="color:#a6e22e">getRandomValues</span>({
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">length</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">size</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">success</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; <span style="color:#a6e22e">resolve</span>(<span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Uint8Array</span>(<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">randomValues</span>)),
</span></span><span style="display:flex;"><span>		});
</span></span><span style="display:flex;"><span>	});
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">randomValues</span>.<span style="color:#a6e22e">reduce</span>((<span style="color:#a6e22e">id</span>, <span style="color:#66d9ef">byte</span>) =&gt; {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">byte</span> <span style="color:#f92672">&amp;=</span> <span style="color:#ae81ff">63</span>;
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">if</span> (<span style="color:#66d9ef">byte</span> <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">36</span>) {
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">id</span> <span style="color:#f92672">+=</span> <span style="color:#66d9ef">byte</span>.<span style="color:#a6e22e">toString</span>(<span style="color:#ae81ff">36</span>);
</span></span><span style="display:flex;"><span>		} <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (<span style="color:#66d9ef">byte</span> <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">62</span>) {
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">id</span> <span style="color:#f92672">+=</span> (<span style="color:#66d9ef">byte</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">26</span>).<span style="color:#a6e22e">toString</span>(<span style="color:#ae81ff">36</span>).<span style="color:#a6e22e">toUpperCase</span>();
</span></span><span style="display:flex;"><span>		} <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (<span style="color:#66d9ef">byte</span> <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">62</span>) {
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">id</span> <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;-&#34;</span>;
</span></span><span style="display:flex;"><span>		} <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">id</span> <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;_&#34;</span>;
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">id</span>;
</span></span><span style="display:flex;"><span>	}, <span style="color:#e6db74">&#34;&#34;</span>);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Usage</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">id</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">nanoid</span>();
</span></span></code></pre></div>]]></description>
		</item><item>
			<title>ดู z-index ง่ายๆ ด้วย 3D View</title>
			<link>https://nitpum.com/post/edge-z-index-tool/</link>
			<pubDate>Sat, 31 Dec 2022 18:01:43 +0700</pubDate>
			
			<guid>https://nitpum.com/post/edge-z-index-tool/</guid>
			<description><![CDATA[<p>ปกติแล้ว z-index ถ้าเป็นเว็บทั่วไปเราอาจจะไม่ได้ใช้มันบ่อยเท่าไร ใช้ทีก็ไม่ได้กำหนด index เยอะมาก ตอน debug เลยไม่ค่อยมีปัญหาเท่าไร</p>
<p>แต่บางทีเราใช้ component จาก library นอกที่เราควบคุม z-index ไม่ได้ ทำให้ debug ยากว่าใช้ z-index เท่าไรบ้าง หรือแม้แต่โค้ดที่เราเขียนเองแก้ z-index ไปแล้วทำไมยังโดนทับอยู่ มานั่งคิดๆ เอาเองมันก็เห็นภาพยากอยู่ดี</p>
<p>ดีที่ว่าใน Microsoft Edge มีตัว 3D View เลยทำให้ debug z-index ง่ายเห็นภาพชัดกว่าด้วยว่าอะไรอยู่ตรงไหน ทับกันยังไงบ้าง โพสต์นี้เลยจะแชร์ว่ามันใช้งานยังไง</p>
<h2 id="วธใช-microsoft-edge-3d-view">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b9%83%e0%b8%8a-microsoft-edge-3d-view" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีใช้ Microsoft Edge 3D View
</h2>
<ol>
<li>อันดับแรกเปิด Developer tools ขึ้นมาด้วย <code>Ctrl/Cmd + Shift + I</code></li>
<li>กดเครื่องหมาย <code>+</code></li>
<li>เลือก <code>3D View</code></li>
</ol>


<video preload="auto"  autoplay loop muted  width="100%" >
	
		<source src="https://nitpum.com/post/edge-z-index-tool/videos/open-3d-view.webm" type="video/webm">
	
	
</video>

<ol start="4">
<li>ด้านซ้ายมือจะมีแท็บอยู่ให้กดไปที่ <code>Z-index</code> เท่านี้เราก็จะดูได้แล้วว่า element แต่ละอันอยู่ z-index ไหนบ้าง</li>
</ol>
<p>
<img
  src="https://nitpum.com/post/edge-z-index-tool/images/z-index.png"
  alt="z index tab"
  loading="lazy"
  
  width="1170"
  height="561"
  
/>

</p>
<p>ส่วนวิธีควบคุมก็กดด้านบนเพื่อสลับไปโหมดเลื่อนตำแหน่งกับหมุนกล้องได้เลย นอกจากนี้ถ้าเราคลิก element ไหน ก็จะพาเราไปดู source ของ element นั้นด้วย ช่วยให้เรา debug css ได้ง่ายขึ้น</p>


<video preload="auto"  autoplay loop muted  width="100%" >
	
		<source src="https://nitpum.com/post/edge-z-index-tool/videos/control-3d-view.webm" type="video/webm">
	
	
</video>

<h2 id="chromium-based-browser">
	<a href="#chromium-based-browser" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Chromium-based browser
</h2>
<p>ถึงแม้ตัว Microsfot Edge ตัวใหม่นี้จะ based on Chromium แต่น่าเสียดายที่บรรดาบราวเซอร์ในตระกูล chromium เหมือนกันกลับยังไม่มีฟีเจอร์นี้แม้แต่ตัว Google Chrome เองก็ตาม มีใกล้เคียงสุดก็ <code>Layers</code> ซึ่งมันก็คือแท็บ Composited Layers ใน 3D View ของ Edge นั้นเอง</p>
<p>
<img
  src="https://nitpum.com/post/edge-z-index-tool/images/chromium-layers.png"
  alt="chromium-layers"
  loading="lazy"
  
  width="1546"
  height="838"
  
/>

</p>
<h2 id="firefox-ละ">
	<a href="#firefox-%e0%b8%a5%e0%b8%b0" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Firefox ละ?
</h2>
<p>ถ้าจำไม่ผิด Firefox น่าจะเป็นเจ้าแรกเลยมั้งที่ใส่ฟีเจอร์นี้เข้ามาในตัวบราวเซอร์ เพราะแต่ก่อนใช้บ่อยมาก น่าเสียดายที่ตั้งแต่ Firefox 47 เป็นต้นไปฟีเจอร์นี้ดันโดนเอาออกไปซะแล้ว 😢</p>
<figure><img src="/post/edge-z-index-tool/images/firefox-3dview.png"
    alt="3D View in Firefox"><figcaption>
      <p>3D View ใน Firefox - รูปภาพจาก <a href="https://firefox-source-docs.mozilla.org/devtools-user/3d_view/index.html" target="_blank" rel="noopener">https://firefox-source-docs.mozilla.org/devtools-user/3d_view/index.html</a></p>
    </figcaption>
</figure>

]]></description>
		</item><item>
			<title>Vscode Quick Open Relative เปลี่ยนไฟล์เร็วขึ้น ไม่ต้องใช้เมาส์</title>
			<link>https://nitpum.com/post/vscode-quick-relative/</link>
			<pubDate>Tue, 30 Aug 2022 15:30:11 +0000</pubDate>
			
			<guid>https://nitpum.com/post/vscode-quick-relative/</guid>
			<description><![CDATA[<p>เวลาใช้ VSCode ช่วงที่เขียนโค้ดเพลินๆ มือก็ไม่ค่อยอยากปล่อยออกจากคีย์บอร์ดเท่าไร แต่มันก็จะมีช่วงที่ต้องปล่อยมือไปจับเมาส์เพื่อเปิดไฟล์อื่น ถึงจะเสียเวลาไม่มากแต่ก็ต้องยกมืออกแล้วเลื่อนไปจับเมาส์แล้วค่อยเลื่อนมือกลับมาที่คีย์บอร์ดอีกทีทำให้ชัดใจอยู่พอสมควร ส่วนใหญ่เลยจะใช้ <code>Ctrl + P</code> พิมพ์หาชื่อไฟล์ไม่ก็พิมพ์ path ไฟล์ไปแทน</p>
<p>ข้อเสียคือ บางทีก็แค่อยากเปิดไฟล์ในโฟลเดอร์เดียวกันกับไฟล์ปัจจุบันที่เปิดอยู่ แต่ชื่อไฟล์มันซ้ำกับที่อื่นเลยต้องพิมพ์ path แทน แต่ path ดันยาว ตรงนี้ก็จะทำให้เสียเวลาไปอีก</p>
<p>เผื่อนึกภาพไม่ออกขอยกตัวอย่างด้วย Project structure ตามด้านล่างนี้ละกัน</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>project
</span></span><span style="display:flex;"><span>├── build
</span></span><span style="display:flex;"><span>├── scripts
</span></span><span style="display:flex;"><span>└── src
</span></span><span style="display:flex;"><span>    ├── components
</span></span><span style="display:flex;"><span>    │   ├── Button
</span></span><span style="display:flex;"><span>    │   │   ├── constants.ts
</span></span><span style="display:flex;"><span>    │   │   ├── index.test.tsx
</span></span><span style="display:flex;"><span>    │   │   ├── index.tsx
</span></span><span style="display:flex;"><span>    │   │   ├── styled.ts
</span></span><span style="display:flex;"><span>    │   │   └── types.ts
</span></span><span style="display:flex;"><span>    │   └── Card
</span></span><span style="display:flex;"><span>    │       ├── index.test.tsx
</span></span><span style="display:flex;"><span>    │       ├── index.tsx
</span></span><span style="display:flex;"><span>    │       └── styled.ts
</span></span><span style="display:flex;"><span>    ├── hooks
</span></span><span style="display:flex;"><span>    │   └── useDoSomething
</span></span><span style="display:flex;"><span>    │       ├── index.test.ts
</span></span><span style="display:flex;"><span>    │       └── index.ts
</span></span><span style="display:flex;"><span>    └── utils
</span></span><span style="display:flex;"><span>        └── extractIdFromData
</span></span><span style="display:flex;"><span>            ├── index.test.ts
</span></span><span style="display:flex;"><span>            └── index.ts
</span></span></code></pre></div><p>ตัวอย่างนี้จะเป็น Project structure ของ React (โพสต์นี้ขอไม่พูดถึงนะว่าแบบนี้มันดียังไง) แต่จะเห็นได้ว่าโค้ดจะถูกเก็บเอาไว้ที่ <code>src/</code> แล้วข้างในจะแบ่งของออกตามประเภท (components, hooks, utils) เข้าไปข้างในอีกก็จะแบ่งเป็นโฟลเดอร์ตามหน้าที่อีกที <code>src/components/Button</code> แล้วในนั้นค่อยเป็นไฟล์โค้ดจริงๆ ที่เกี่ยวกับเรื่องนั้นๆ <code>src/components/Button/index.ts</code></p>
<p>ทีนี้เนี่ยถ้ากำลังเขียนโค้ดที่ <code>src/components/Button/index.ts</code> แล้วอยากจะสลับไปเขียนเทสก็ต้องพิมพ์ path ไปที่ <code>src/components/Button/index.test.ts</code> อยากแก้ style ต่อก็พิมพ์ไปที่ <code>src/components/Button/styled.ts</code> อีกที ซึ่งมันช้าพอสมควร</p>


<video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/vscode-quick-relative/videos/without-quick-relative.mp4" type="video/mp4">
	
	
	
</video>

<h2 id="quick-open-relative">
	<a href="#quick-open-relative" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Quick Open Relative
</h2>
<p><a href="https://marketplace.visualstudio.com/items?itemName=gpaul.quickOpenRelative" target="_blank" rel="noopener">Quick Open Relative</a> เป็นส่วนเสริมตอนที่เรากดเปิดไฟล์ด้วย <code>Ctrl + P</code> ตัว Quick Open Relative จะเติม path ของไฟล์ปัจจุบันที่เราเปิดอยู่ให้เลย ช่วยให้เราไม่ต้องมานั่งพิมพ์ path เอง ที่เหลือคือเราจะพิมพ์ต่อเองหรือจะกดลูกศรเลือกไฟล์เอาเลยก็ได้</p>


<video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/vscode-quick-relative/videos/with-quick-relative.mp4" type="video/mp4">
	
	
	
</video>

<p>แต่ว่าโดย default แล้วส่วนเสริมนี้ไม่ได้ตั้งปุ่มรัดมาให้ เราต้องไปตั้งปุ่มรัดเอง</p>
<ol>
<li>File &gt; Preference &gt; Keyboard Shortcuts</li>
<li>ค้นว่า <code>quickOpenRelative.quickOpenRelative</code></li>
<li>กดแก้ไข ตั้งปุ่มที่ต้องการ เช่น <code>Ctrl + P</code></li>
<li>จริงๆ เท่านี้ก็เรียบร้อยแล้ว แต่ส่วนตัวไม่อยากให้มันทำงานตลอดทุกครั้งที่กด <code>Ctrl + P</code> เลยจะเพิ่มเงื่อนไขให้มันหน่อย
ให้ทำงานแค่ตอนที่เราโฟกัสอยู่ที่ไฟล์เท่านั้น ถ้าไม่ได้โฟกัสไฟล์เช่นกำลังโฟกัส terminal อยู่หรือกำลังดู git history ก็ให้เปิด <code>Ctrl + P</code> ปกติแทน
คลิกขวา &gt; Change When Expression &gt; ใส่เป็น <code>editorTextFocus</code></li>
<li>เสร็จสมบูรณ์</li>
</ol>
<p>หรือใครที่ตั้งค่าด้วย <code>keybindins.json</code> ก็ก็อปอันนี้ไปใช้ได้เลย</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">&#34;key&#34;</span>: <span style="color:#e6db74">&#34;ctrl+p&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">&#34;command&#34;</span>: <span style="color:#e6db74">&#34;quickOpenRelative.quickOpenRelative&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">&#34;when&#34;</span>: <span style="color:#e6db74">&#34;editorTextFocus&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>เท่านี้ก็ช่วยทำให้เราสลับไปเปิดไฟล์อีกเร็วขึ้นแล้ว!!!</p>


<video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/vscode-quick-relative/videos/even-quicker.mp4" type="video/mp4">
	
	
	
</video>

]]></description>
		</item><item>
			<title>How to enable bash globstar **</title>
			<link>https://nitpum.com/post/enable-bash-globstar/</link>
			<pubDate>Thu, 02 Jun 2022 07:06:35 +0000</pubDate>
			
			<guid>https://nitpum.com/post/enable-bash-globstar/</guid>
			<description><![CDATA[<p>Unlike Zsh, globstar <code>**</code> is not enabled by default in bash.</p>
<p>We can enable by use shopt command (<strong>SH</strong>ell <strong>OPT</strong>ion)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>shopt -s globstar
</span></span></code></pre></div>]]></description>
		</item><item>
			<title>ปิด Code Spell Checker ไม่ให้ตรวจภาษาไทย</title>
			<link>https://nitpum.com/post/make-cspell-ignore-thai/</link>
			<pubDate>Fri, 29 Apr 2022 07:26:40 +0000</pubDate>
			
			<guid>https://nitpum.com/post/make-cspell-ignore-thai/</guid>
			<description><![CDATA[<p>ใน VSCode มี extension <a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker" target="_blank" rel="noopener">Code Spell Checker</a> ไว้สำหรับตรวจคำผิดภาษาอังกฤษ ปัญหาคือ extension นี้ยังไม่ได้ทำมาให้รองรับภาษาไทย ทำให้เวลาเปิดโปรเจคที่มีภาษาไทยตัว extension จะไม่รู้จักและคิดว่าเป็นคำผิด แล้วคอยขึ้นเตือนเราอยู่ตลอดเวลา</p>
<p>
<img
  src="https://nitpum.com/post/make-cspell-ignore-thai/images/cspell-dont-know-thai.png"
  alt="Code Spell Checker don&rsquo;t know thai"
  loading="lazy"
  
  width="933"
  height="157"
  
/>

</p>
<h2 id="วธแก">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b9%81%e0%b8%81" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีแก้
</h2>
<p>แต่ปัญหานี้จะหมดไปถ้าเราตั้งให้ ignore ภาษาไทยไว้ด้วยการใส่ Regex <code>/[\\u0E00-\\u0E7F]/g</code></p>
<ol>
<li>เปิด User settings ขึ้นมา (Windows/Linux กด <code>Ctrl</code> + <code>,</code> macOS กด <code>Cmd</code> + <code>,</code>)</li>
<li>ค้นว่า &ldquo;C Spell Ignore Reg&rdquo;</li>
<li>ตรง C Spell: Ignore Reg Exp List กด Add item</li>
<li>เพิ่ม <code>/[\\u0E00-\\u0E7F]/g</code> เข้าไป</li>
<li>กด Ok แค่นี้ก็เรียบร้อยแล้ว</li>
</ol>
<p>หรือใครอยากแก้ตรงๆ ที่ <code>settings.json</code> ก็ใส่แบบนี้ได้เลย</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">&#34;cSpell.ignoreRegExpList&#34;</span>: [<span style="color:#e6db74">&#34;/[\\u0E00-\\u0E7F]/g&#34;</span>]
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>เรียบร้อยเท่านี้เราก็สามารถใช้ Code Spell Checker กับโปรเจคที่มีภาษาไทยได้อย่างมีความสุข</p>
]]></description>
		</item><item>
			<title>เปลี่ยนปุ่ม Caps Lock ให้เป็น Escape</title>
			<link>https://nitpum.com/post/remap-capslock-to-escape/</link>
			<pubDate>Mon, 14 Mar 2022 19:06:36 +0000</pubDate>
			
			<guid>https://nitpum.com/post/remap-capslock-to-escape/</guid>
			<description><![CDATA[<p>ถ้าให้เทียบความถี่ในการกดปุ่ม เชื่อว่าปุ่ม Caps Lock คงเป็นปุ่มที่กดน้อยเป็นอันดับต้นๆ แน่เลย ต่างกับปุ่ม Esc หรือ Escape ที่ดูจะกดบ่อยกว่าเห็นๆ ยิ่งถ้าพูดถึงคนที่ใช้ vim เป็นประจำปุ่ม Esc กดเป็นว่าเล่นกันเลยทีเดียว</p>
<p>แต่ปุ่ม Esc นี้มันอยู่ไกลกดลำบาก ต้องเอื้อมนิ้วไม่ก็มือขึ้นไปกด เทียบกับปุ่ม Caps Lock ที่อยู่แถวเดียวกับ <code>ASDF JKL:</code> แถวสำหรับวางมือตอนพิมพ์สัมผัสอยู่แล้ว เอื้อมนิ่วก้อยมือซ้ายไปกดง่ายกว่า</p>
<p>โพสต์นี้เลยจะมาบอกวิธีเปลี่ยนปุ่ม Caps Lock ที่ไม่ได้ใช้บ่อยๆ ให้กลายเป็นปุ่ม Esc แทนจะได้กดง่ายๆ</p>
<h2 id="windows">
	<a href="#windows" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Windows
</h2>
<p>เนื่องจาก Windows ไม่สามารถปรับปุ่มได้เองเลยต้องใช้โปรแกรมช่วย ซึ่งเราสามารถใช้โปรแกรม PowerToys ที่ Microsoft เป็นคนทำในการปรับปุ่มได้</p>
<p>โปรแกรม PowerToys ใช้ได้เฉพาะ Windows 10 (v1903 (18362) หรือใหม่กว่านั้น) และ Windows 11 ขึ้นไป ใครใช้ Windows เวอร์ชันเก่ากว่านี้เสียใจด้วยครับ ;-; (แต่เอาจริงๆ Windows เก่านี้ Microsoft เองก็เลิกซัพพอร์ตแล้ว เพราะงั้นใครที่ใช้อยู่แนะนำให้อัพเดทเป็นเวอร์ชันใหม่ดีกว่า)</p>
<h3 id="ตดตง-powertoys">
	<a href="#%e0%b8%95%e0%b8%94%e0%b8%95%e0%b8%87-powertoys" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ติดตั้ง PowerToys
</h3>
<p>โปรแกรม PowerToys เองสามารถลงได้ 2 วิธี ดังต่อไปนี้</p>
<p><strong>วิธีที่ 1 ติดตั้งผ่าน winget</strong></p>
<p>ใครยังไม่เคยใช้ winget สามารถอ่านโพสต์เก่าที่ผมเคยเขียนไว้ได้ที่ <a href="https://nitpum.com/post/winget/">Winget คืออะไร? พร้อมวิธีติดตั้งและใช้งาน</a></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget install Microsoft.PowerToys -s winget
</span></span></code></pre></div><p><strong>วิธีที่ 2 ติดตั้งผ่านทาง Microsoft Store</strong></p>
<ol>
<li>เปิดโปรแกรม Microsoft Store ขึ้น</li>
<li>ค้นหาว่า <code>PowerToys</code> หรือ<a href="https://aka.ms/getPowertoys" target="_blank" rel="noopener">กดจากลิงก์นี้</a></li>
<li>กดติดตั้งเป็นอันเสร็จสิ้น</li>
</ol>
<p>
<img
  src="https://nitpum.com/post/remap-capslock-to-escape/images/powertoy-msstore.png"
  alt="PowerToys&rsquo;s Page in Microsoft Store"
  loading="lazy"
  
  width="1810"
  height="948"
  
/>

</p>
<h3 id="ปรบปม">
	<a href="#%e0%b8%9b%e0%b8%a3%e0%b8%9a%e0%b8%9b%e0%b8%a1" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ปรับปุ่ม
</h3>
<p>ลงโปรแกรมเสร็ตแล้วมาปรับปุ่มกัน</p>
<ol>
<li>
<p>เริ่มจากเปิดโปรแกรมก่อนเลย</p>
</li>
<li>
<p>จากนั้นกดเมนูด้านซ้ายมือที่ชื่อว่า <code>Keyboard Manager</code></p>
</li>
<li>
<p>กดปุ่ม <code>Remap a key</code>

<img
  src="https://nitpum.com/post/remap-capslock-to-escape/images/powertoy-keyboard-manager-highlight.png"
  alt="Keyboard Manager menu in PowerToys"
  loading="lazy"
  
  width="1458"
  height="955"
  
/>

</p>
</li>
<li>
<p>จะมีหน้าต่างเปิดใหม่ขึ้นมาใช้สำหรับตั้งค่าปุ่ม</p>
</li>
<li>
<p>กดเมนูที่เครื่องหมาย <code>+</code> เพื่อตั้งค่าปุ่มใหม่</p>
</li>
<li>
<p>เราอยากเปลี่ยนให้กดปุ่ม <code>Caps Lock</code> เป็นปุ่ม <code>Esc</code> แทนก็ตั้งตามนี้</p>
<ul>
<li>Physical Key ให้เป็น Caps Lock</li>
<li>Mapped To ให้เป็น Esc</li>
</ul>
<div class="notice note">
  ตอนเลือกปุ่มที่เป็น Dropdown ที่มีปุ่มเยอะทำให้หายาก เราสามารถพิมพ์ชื่อปุ่มได้แทนที่การเลื่อนหาปุ่มเองได้ เช่น Caps Lock ให้พิมพ์ Ca หรือ Esc ก็พิมพ์แค่ Es
</div>

<p>
<img
  src="https://nitpum.com/post/remap-capslock-to-escape/images/remap-key.png"
  alt="Remap CapLock to Escape"
  loading="lazy"
  
  width="982"
  height="741"
  
/>

</p>
</li>
<li>
<p>ตั้งค่าเสร็จกด OK</p>
</li>
<li>
<p>จะมีหน้าต่างขึ้นมายืนยันกด <code>Continue anywhere</code> ได้เลย</p>
</li>
<li>
<p>แค่นี้ก็เสร็จเรียบร้อย เราก็สามารถกด Caps Lock แทนปุ่ม Esc ได้แล้ว</p>
</li>
</ol>
<div class="notice note">
  เราจำเป็นจะต้องเปิด PowerToys ไว้ตลอดเพื่อให้ตั้งค่าทำงาน ถ้าใครไม่อยากให้โปรแกรมรกตรง Taskbar ให้กดปิด (Close) โปรแกรมไปได้เลย เดี๋ยว PowerToys จะซ่อนตัวเองไปอยู่ตรง tray bar แทน ขอแค่ไม่คลิกขวาไป Exit โปรแกรมก็พอ
</div>

<h2 id="macos">
	<a href="#macos" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		macOS
</h2>
<p>สำหรับ macOS สามารถตั้งค่าจาก OS ได้เลยไม่ต้องพึ่งโปรแกรมเสริม เริ่มจาก</p>
<ol>
<li>
<p>เปิด <code>System Preferences</code> ขึ้นมา</p>
</li>
<li>
<p>กดไปที่ <code>Keyboard</code>

<img
  src="https://nitpum.com/post/remap-capslock-to-escape/images/macos-system-preferences.png"
  alt="macOS&rsquo;s System Preferences"
  loading="lazy"
  
  width="500"
  height="426"
  
/>

</p>
</li>
<li>
<p>กดไปที่ <code>Modifier Keys</code>

<img
  src="https://nitpum.com/post/remap-capslock-to-escape/images/macos-keyboard-preferences.png"
  alt="Keyboard Preferences"
  loading="lazy"
  
  width="500"
  height="447"
  
/>

</p>
</li>
<li>
<p>ปรับปุ่ม <code>Caps Lock</code> ให้เป็น <code>Esc</code></p>
<p>
<img
  src="https://nitpum.com/post/remap-capslock-to-escape/images/macos-remap.png"
  alt="macOS Caps Lock to Escape"
  loading="lazy"
  
  width="500"
  height="308"
  
/>

</p>
</li>
<li>
<p>กดโอเค แค่นี้ก็เรียบร้อยใช้งานได้เลย!</p>
</li>
</ol>
]]></description>
		</item><item>
			<title>อัพเดท Git ให้เป็นเวอร์ชันล่าสุดบน Ubuntu และ WSL</title>
			<link>https://nitpum.com/post/update-git-on-ubuntu/</link>
			<pubDate>Sat, 19 Feb 2022 16:53:19 +0000</pubDate>
			
			<guid>https://nitpum.com/post/update-git-on-ubuntu/</guid>
			<description><![CDATA[<p>ปกติ Ubuntu จะลง Git มาให้อยู่แล้ว หรือถ้าอยากอัพเดทก็สั่ง <code>apt install</code> ได้เลย ปัญหาคือ package repository ของ Ubuntu นั้นไม่ได้มี Git เวอร์ชันล่าสุดเสมอ ทำให้ถ้าเราอยากจะลงเวอร์ชันใหม่เราจะทำไม่ได้</p>
<p>โพสต์นี้เลยจะมาแชร์วิธีอัพเดท Git ใน Ubuntu ซึ่งวิธีนี้ยังใช้ได้กับ Windows Subsystem for Linux (WSL) ที่เป็น Ubuntu อีกด้วย (เอาจริงๆ ก็น่าจะใช้ได้กับ Ubuntu-based Distro ทั้งหมดแหละพวก Linux Mint, Elementary OS, Pop!_OS, Kubuntu แต่ผมไม่ได้ลองเทสดูนะ แต่คิดว่าน่าจะได้หมด)</p>
<h2 id="เพม-ppa-ของ-git-โดยตรง">
	<a href="#%e0%b9%80%e0%b8%9e%e0%b8%a1-ppa-%e0%b8%82%e0%b8%ad%e0%b8%87-git-%e0%b9%82%e0%b8%94%e0%b8%a2%e0%b8%95%e0%b8%a3%e0%b8%87" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		เพิ่ม PPA ของ Git โดยตรง
</h2>
<p>อย่างที่บอกไปว่า package repository ของ Ubuntu ไม่ได้มี Git เวอร์ชันล่าสุดเสมอ วิธีแก้ก็คือเพิ่ม package repository ของ Git โดยตรงมา เพื่อที่เราจะได้อัพเดทเป็นเวอร์ชันล่าสุดได้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>sudo add-apt-repository ppa:git-core/ppa
</span></span></code></pre></div><h2 id="ลงเวอรชนใหม">
	<a href="#%e0%b8%a5%e0%b8%87%e0%b9%80%e0%b8%a7%e0%b8%ad%e0%b8%a3%e0%b8%8a%e0%b8%99%e0%b9%83%e0%b8%ab%e0%b8%a1" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ลงเวอร์ชันใหม่
</h2>
<p>พอเพิ่ม package repostiory ของ Git แล้วให้เราอัพเดทลิตส์แพ็ตเกจสักหน่อย Ubuntu จะได้รู้ว่าโหลด Git เวอร์ชันใหม่จาก package repository ของ Git เองได้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>sudo apt update
</span></span></code></pre></div><p>เสร็จแล้วก็ลง Git เวอร์ชันใหม่เลย</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>sudo apt instal git
</span></span></code></pre></div><p>ลงเสร็จแล้วลองเช็คดูด้วยว่าได้เป็นเวอร์ชันล่าสุดหรือยัง</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>git version
</span></span></code></pre></div><p><strong>อ้างอิง</strong></p>
<ul>
<li><a href="https://git-scm.com/download/linux" target="_blank" rel="noopener">Download Git for Linux and Unix</a></li>
</ul>
]]></description>
		</item><item>
			<title>ค้นหา Winget package ผ่านเว็บง่ายๆ ด้วย Winget.run</title>
			<link>https://nitpum.com/post/wingetdotrun/</link>
			<pubDate>Fri, 18 Feb 2022 14:56:02 +0000</pubDate>
			
			<guid>https://nitpum.com/post/wingetdotrun/</guid>
			<description><![CDATA[<p>เวลาใช้ <a href="https://nitpum.com/post/winget/">Winget</a> เราก็ต้องทำทุกอย่างผ่าน CLI (Command line interface) ใช่ไหมละ แล้วถ้าอยากลองค้นหาแพ็คเกจก็ต้องพิมพ์คำสั่งแบบนี้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget search &lt;query&gt;
</span></span></code></pre></div><p>เช่น</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget search vscode
</span></span></code></pre></div><p>ผลลัพธ์ก็จะได้ประมาณนี้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>Name                                  Id                                  Version      Match                    Source
</span></span><span style="display:flex;"><span>----------------------------------------------------------------------------------------------------------------------
</span></span><span style="display:flex;"><span>Microsoft Visual Studio Code          Microsoft.VisualStudioCode          1.64.0       Moniker: vscode          winget
</span></span><span style="display:flex;"><span>MrCode                                zokugun.MrCode                      1.62.3.21323 Tag: vscode              winget
</span></span><span style="display:flex;"><span>VSCodium                              VSCodium.VSCodium                   1.64.0       Tag: vscode              winget
</span></span><span style="display:flex;"><span>微信开发者工具                        Tencent.wechat-devtool              1.05.2108130 Tag: vscode              winget
</span></span><span style="display:flex;"><span>Huawei QuickApp IDE                   Huawei.QuickAppIde                  11.4.2       Tag: vscode              winget
</span></span><span style="display:flex;"><span>TheiaBlueprint                        EclipseFoundation.TheiaBlueprint    1.16.0       Tag: vscode              winget
</span></span><span style="display:flex;"><span>Microsoft Visual Studio Code Insiders Microsoft.VisualStudioCode.Insiders 1.65.0       Moniker: vscode-insiders winget
</span></span></code></pre></div><p>แต่มันอ่านยากแถมใช้ไม่ค่อยสะดวกด้วย อย่างลอง search ด้วย <code>winget search chat</code> ดูแล้วจะพบกับผลลัพธ์ที่ยาวถึง 80 บรรทัด 😱</p>
<p>เลยมีคนทำ <a href="https://winget.run" target="_blank" rel="noopener">Winget.run</a> ขึ้นมาจะได้ค้นหากันง่ายๆ ซึ่งตัวเว็บนี้เนี่ยเขาทำช่องค้นหามาให้แล้วอยากได้ package แบบไหนก็พิมพ์ค้นได้เลย</p>
<p>
<img
  src="https://nitpum.com/post/wingetdotrun/images/wingetdotrun.jpeg"
  alt="Winget.run"
  loading="lazy"
  
  width="1755"
  height="949"
  
/>

</p>
<p>ช่องค้นหายังเติม prefix ได้ด้วยเอาไว้เจาะจงผลลัพธ์ให้ตรงที่เราต้องการมากขึ้น เช่น ถ้าอยากค้นหาด้วยแท็กก็พิมพ์ <code>tags:</code> ไว้ข้างหน้าแล้วตามด้วยแท็กที่อยากค้น</p>
<p>
<img
  src="https://nitpum.com/post/wingetdotrun/images/search-prefix.png"
  alt="Search with prefix"
  loading="lazy"
  
  width="778"
  height="305"
  
/>

</p>
<p>พอกดเข้าดูหน้า package ก็จะมีคำอธิบายว่าแพ็คเกจนั้นเกี่ยวกับอะไร ถ้าอยากลงก็มีคำสั่งพร้อมให้ก็อปไปใช้ได้เลย จะได้ไม่ต้องมาพิมพ์คำสั่ง install เอง</p>
<p>
<img
  src="https://nitpum.com/post/wingetdotrun/images/detail.png"
  alt="Package&rsquo;s detail page with description and install script"
  loading="lazy"
  
  width="873"
  height="453"
  
/>

</p>
<p>ด้านข้างก็มีเวอร์ชันที่โหลดได้ให้ดูด้วย อยากลงเวอร์ชันนั้นจิ้มปุ่มก็อปด้านขวาก็จะได้คำสั่งสำหรับลงเวอร์ชันนั้นมา</p>
<p>
<img
  src="https://nitpum.com/post/wingetdotrun/images/version-list.png"
  alt="Available version with copy install command"
  loading="lazy"
  
  width="395"
  height="342"
  
/>

</p>
<p>สุดท้ายนี้ตัว Winget.run เองไม่ได้เป็นเว็บไซต์ทางการ (Official) จาก Microsoft นะ ใครที่อยากให้มีเว็บดีๆ แบบนี้ให้ใช้ไปนานๆ ก็อย่าลืมไป<a href="https://ko-fi.com/wingetdotrun" target="_blank" rel="noopener">โดเนทช่วยค่าเซิฟเวอร์</a>ด้วยละ Winget.run เองยังอัพซอร์สไว้บน <a href="https://github.com/winget-run/wingetdotrun" target="_blank" rel="noopener">Github</a> ด้วยไปดูกันได้ (ปล. ถึงแม้อัพโค้ดไว้บน Github ก็จริง แต่ไม่ได้กำหนด License ไว้ ถ้าจะเอาไปทำอะไรก็ระวังด้วยละ)</p>
]]></description>
		</item><item>
			<title>Winget คืออะไร? พร้อมวิธีติดตั้งและใช้งาน</title>
			<link>https://nitpum.com/post/winget/</link>
			<pubDate>Sun, 13 Feb 2022 11:50:03 +0000</pubDate>
			
			<guid>https://nitpum.com/post/winget/</guid>
			<description><![CDATA[<h2 id="winget-คออะไร">
	<a href="#winget-%e0%b8%84%e0%b8%ad%e0%b8%ad%e0%b8%b0%e0%b9%84%e0%b8%a3" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Winget คืออะไร
</h2>
<p>Winget คือ package manager หรือตัวจัดการโปรแกรมในเครื่องเรานั้นเอง ไม่ว่าจะเป็นการลงโปรแกรมใหม่, ลบโปรแกรม หรืออัพเดทโปรแกรมไปเป็นเวอร์ชันใหม่ ซึ่งที่ว่ามานี้ทำผ่าน command line ทั้งหมดเลย เรียกได้ว่าไม่ต้องแตะเมาส์กันเลยทีเดียว</p>
<p>ถ้าให้เทียบกับ OS อื่นฝั่ง macOS ก็คือ Homebrew หรือถ้าฝั่ง Linux ก็จะเป็น apt, yum, pacman ในส่วนของ Windows ก็จะเป็น winget นั้นเอง</p>
<p>ใครที่ยังนึกไม่ออกลองนึกถึง package manager ที่ใช้ในแต่ละภาษาดู อย่าง javascript มี npm, python มี pip, rust มี cargo, java มี maven, c# มี nuget ซึ่งอย่างที่รู้กันว่า package manager ของแต่ละภาษาก็จะคอยช่วยจัดการในการโหลดตัว dependecy ต่างๆ ที่จำเป็นมาให้ทำให้เราไม่ต้องมาจัดการเรื่องพวกนี้เอง แต่ว่านั้นก็เป็น package manager ระดับภาษาใช่ไหมละ winget นั้นใหญ่กว่านั้นที่จะจัดการระดับโปรแกรมในเครื่องนั้นเอง</p>
<p>สำหรับใครที่สนใจเบื้องหลังการทำงานของ winget Microsoft ได้เปิดเผยซอร์สโค้ดไว้บน <a href="https://github.com/microsoft/winget-cli" target="_blank" rel="noopener">Github</a> แล้วสามารถเข้าไปอ่านโค้ดได้เลย</p>
<div class="notice note">
  แต่ใช่ว่า Windows จะไม่เคยมี package manager มาก่อน เพราะจริงๆ ก็มีทั้ง <a href="https://scoop.sh/" target="_blank" rel="noopener">Scoop</a>, <a href="https://chocolatey.org/" target="_blank" rel="noopener">Chocolatey</a> และ <a href="https://appget.net/" target="_blank" rel="noopener">AppGet</a> อยู่ก่อนหน้านี้แล้ว เพียงแต่ไม่ใช่ของ Microsoft เท่านั้นเอง
</div>

<h2 id="ประโยชนของ-winget">
	<a href="#%e0%b8%9b%e0%b8%a3%e0%b8%b0%e0%b9%82%e0%b8%a2%e0%b8%8a%e0%b8%99%e0%b8%82%e0%b8%ad%e0%b8%87-winget" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ประโยชน์ของ Winget
</h2>
<p>แล้วมันต่างจากโหลดโปรแกรมมาลงเองยังไง? สมมุติว่าเราอยากลงโปรแกรม 10 โปรแกรม ตามปกติเราก็ต้องเข้า Google พิมพ์ค้นโปรแกรมที่เราจะลงและกดดาวน์โหลดโปรแกรมมาลงเองทีละตัว แต่ถ้าเราใช้ winget ก็แค่เปิด cmd แล้วพิมพ์คำสั่งเหล่านี้ลงไป</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget install Google.Chrome
</span></span><span style="display:flex;"><span>winget install Discord.Discord
</span></span><span style="display:flex;"><span>winget install SlackTechnologies.Slack
</span></span><span style="display:flex;"><span>winget install Microsoft.VisualStudioCode
</span></span><span style="display:flex;"><span>winget install Git.Git
</span></span><span style="display:flex;"><span>winget install Golang.Go
</span></span><span style="display:flex;"><span>winget install OpenJS.NodeJS
</span></span><span style="display:flex;"><span>winget install EclipseAdoptium.Temurin.16
</span></span><span style="display:flex;"><span>winget install Microsoft.dotnet
</span></span><span style="display:flex;"><span>winget install Docker.DockerDesktop
</span></span></code></pre></div><p>กด Enter ที่เหลือปล่อย winget จัดการได้เลย เดี๋ยวมันจะไปโหลดโปรแกรมมาลงให้</p>
<p>ด้วยความที่คำสั่งที่พิมพ์เป็นตัวหนังสือทำให้เราสามารถก๊อปปี้เก็บเอาไปเปิดดูเวลาลง Windows ใหม่ได้
หรืออยากให้เพื่อนลงโปรแกรมแบบเดียวกันก็ส่งเป็นข้อความไปให้ได้</p>
<p>นอกจากนี้เรายังเอาคำสั่งพวกนี้ไป<a href="#batscript">สร้างเป็นสคริปต์เก็บไว้</a>
เอาไปรันที่อื่นได้เลยจะได้ไม่ต้องก๊อปวางคำสั่ง</p>
<p>ข้อดีอีกอย่างคือ เราไม่ต้องไปหาลิงก์ดานว์โหลดตามเว็บไซต์ต่างๆ เองที่อาจโหลดผิดลิงก์หรือโดนฝั่งไวรัสมากับไฟล์ติดตั้ง ในส่วนนี้ winget เองก็ยังมีการเช็คค่า hash ป้องกันการปลอมแปลงไฟล์ระหว่างโหลดให้อีกด้วย</p>
<h2 id="ตดตง">
	<a href="#%e0%b8%95%e0%b8%94%e0%b8%95%e0%b8%87" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ติดตั้ง
</h2>
<p>Winget ใช้ได้ตั้งแต่ Windows 10 ขึ้นไป (Windows 10, Windows 11) ใครที่ใช้ Windows ต่ำกว่านี้ไม่สามารถลง Winget ได้</p>
<p>สำหรับ Windows 10 จะลงได้เฉพาะเวอร์ชัน 1709 (build 16299) ขึ้นไป เช็คได้ด้วยการเปิด Run (กดปุ่ม Start + R) จากนั้นพิมพ์ <code>winver</code> แล้วกด Enter จะมีหน้าต่างบอกเวอร์ชันขึ้นมา ให้ดูตรง <code>version</code> ถ้าเป็น 1709 หรือมากกว่านั้นแสดงว่าลงได้</p>
<p>ส่วน Windows 11 ปกติจะลงพร้อมตอนติดตั้งวินโด้อยู่แล้วไม่ต้องทำอะไรเพิ่ม แต่ถ้าเครื่องไหนไม่มีก็ทำตามด้านล่างได้เลย</p>
<p>ทั้ง Windows 10 และ 11 สามารถติดตั้งได้จาก Microsoft Store ค้นหาในนั้นว่า <code>App Installer</code> หรือจะกดจาก<a href="https://www.microsoft.com/en-us/p/app-installer/9nblggh4nns1" target="_blank" rel="noopener">ลิงก์นี้</a>ก็ได้ กดเข้าไปแล้วกด Get และ Install แค่นี้ก็เรียบร้อยพร้อมใช้งาน</p>
<h2 id="วธใชงาน">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b9%83%e0%b8%8a%e0%b8%87%e0%b8%b2%e0%b8%99" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีใช้งาน
</h2>
<p>เปิด Command Prompt หรือ Powershell ขึ้นมาแล้วพิมพ์คำสั่งที่เราต้องการได้เลย</p>
<h3 id="คนหารายชอโปรแกรม">
	<a href="#%e0%b8%84%e0%b8%99%e0%b8%ab%e0%b8%b2%e0%b8%a3%e0%b8%b2%e0%b8%a2%e0%b8%8a%e0%b8%ad%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ค้นหารายชื่อโปรแกรม
</h3>
<p>เช็คดูว่าโปรแกรมที่อยากลงมีใน winget หรือยังด้วยคำสั่งนี้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget search &lt;package&gt;
</span></span></code></pre></div><p>อย่างถ้าอยากรู้ว่ามี VSCode หรือเปล่าก็พิมพ์แบบนี้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget search vscode
</span></span></code></pre></div><p>ผลลัพธ์จะได้ประมาณนี้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>Name                                  Id                                  Version      Match                    Source
</span></span><span style="display:flex;"><span>----------------------------------------------------------------------------------------------------------------------
</span></span><span style="display:flex;"><span>Microsoft Visual Studio Code          Microsoft.VisualStudioCode          1.64.0       Moniker: vscode          winget
</span></span><span style="display:flex;"><span>MrCode                                zokugun.MrCode                      1.62.3.21323 Tag: vscode              winget
</span></span><span style="display:flex;"><span>VSCodium                              VSCodium.VSCodium                   1.64.0       Tag: vscode              winget
</span></span><span style="display:flex;"><span>微信开发者工具                        Tencent.wechat-devtool              1.05.2108130 Tag: vscode              winget
</span></span><span style="display:flex;"><span>Huawei QuickApp IDE                   Huawei.QuickAppIde                  11.4.2       Tag: vscode              winget
</span></span><span style="display:flex;"><span>TheiaBlueprint                        EclipseFoundation.TheiaBlueprint    1.16.0       Tag: vscode              winget
</span></span><span style="display:flex;"><span>Microsoft Visual Studio Code Insiders Microsoft.VisualStudioCode.Insiders 1.65.0       Moniker: vscode-insiders winget
</span></span></code></pre></div><p>เราจะได้ตารางที่แบ่งคอลลัมมาให้ตามนี้</p>
<ul>
<li><strong>Name</strong> คือ ชื่อโปรแกรมที่เรียกกันทั่วไป</li>
<li><strong>Id</strong> คือ ไอดีเฉพาะของโปรแกรมนั้นที่ไม่ซ้ำกับโปรแกรมอื่น สาารถเอาไปใช้อ้างอิงตอนพิมพ์คำสั่งอื่นได้</li>
<li><strong>Version</strong> คือ เวอร์ชันล่าสุดที่ติดตั้งได้</li>
<li><strong>Match</strong> คือ คำที่เราค้นไปตรงกับโปรแกรมนี้ยังไง</li>
<li><strong>Source</strong> คือ โหลดโปรแกรมนี้ได้จาก repository ไหนได้บ้าง</li>
</ul>
<h3 id="ตดตงโปรแกรม">
	<a href="#%e0%b8%95%e0%b8%94%e0%b8%95%e0%b8%87%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ติดตั้งโปรแกรม
</h3>
<p>อยากจะลงโปรแกรมอะไรก็พิมพ์คำสั่งแบบนี้ได้เลย</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget install &lt;package&gt;
</span></span></code></pre></div><p>สมมุติอยากลง VSCode ก็พิมพ์แบบนี้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget install vscode
</span></span></code></pre></div><p>กรณีที่มีชื่อโปรแกรมคล้ายกันเยอะ เราสามารถเจาะจงโปรแกรมได้ด้วย <code>--id &lt;id&gt;</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget install --id &lt;id&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>:<span style="color:#75715e">: ตัวอย่าง</span>
</span></span><span style="display:flex;"><span>winget install --id Microsoft.VisualStudioCode
</span></span></code></pre></div><p>หรือถ้าอยากลงโปรแกรมเวอร์ชันที่ต้องการก็สามารถระบุเลขเวอร์ชันได้ด้วย <code>--version &lt;version&gt;</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget install &lt;package&gt; --version &lt;version&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>:<span style="color:#75715e">: ตัวอย่าง</span>
</span></span><span style="display:flex;"><span>winget install vscode --version 1.64.0
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>:<span style="color:#75715e">: หรือจะใช้คู่กับ --id &lt;id&gt; ก็ได้</span>
</span></span><span style="display:flex;"><span>winget install --id Microsoft.VisualStudioCode --version 1.64.0
</span></span></code></pre></div><h3 id="อพเดทโปรแกรม">
	<a href="#%e0%b8%ad%e0%b8%9e%e0%b9%80%e0%b8%94%e0%b8%97%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		อัพเดทโปรแกรม
</h3>
<p>อัพเดทโปรแกรมเป็นเวอร์ชันล่าสุด</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget upgrade &lt;package&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>:<span style="color:#75715e">: ตัวอย่าง</span>
</span></span><span style="display:flex;"><span>winget upgrade vscode
</span></span></code></pre></div><p>อัพเดทโปรแกรมไปเวอร์ชันที่ต้องการด้วย <code>--version &lt;version&gt;</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget upgrade &lt;package&gt; --version &lt;version&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>:<span style="color:#75715e">: ตัวอย่าง</span>
</span></span><span style="display:flex;"><span>winget upgrade vscode --version 1.64.0
</span></span></code></pre></div><h3 id="ลบโปรแกรม">
	<a href="#%e0%b8%a5%e0%b8%9a%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ลบโปรแกรม
</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget uninstall &lt;package&gt;
</span></span><span style="display:flex;"><span>:<span style="color:#75715e">:ตัวอย่าง</span>
</span></span><span style="display:flex;"><span>winget uninstall vscode
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>:<span style="color:#75715e">: หรือจะใช้ --id &lt;id&gt; ก้ได้</span>
</span></span><span style="display:flex;"><span>winget uninstall --id Microsoft.VisualStudioCode
</span></span></code></pre></div><h3 id="แบคอพรายชอโปรแกรม-export">
	<a href="#%e0%b9%81%e0%b8%9a%e0%b8%84%e0%b8%ad%e0%b8%9e%e0%b8%a3%e0%b8%b2%e0%b8%a2%e0%b8%8a%e0%b8%ad%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1-export" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		แบ็คอัพรายชื่อโปรแกรม (Export)
</h3>
<p>winget เองสามารถเซฟลิตส์โปรแกรมออกมาเป็นไฟล์เพื่อใช้แบ็คอัพได้ กรณีที่เราลงวินโดใหม่ก็ import ไฟล์นี้แล้วเดี๋ยว winget จะลงโปรแกรมให้ตามในไฟล์เลย</p>
<p>สำหรับคำสั่งเราแค่ระบุที่อยู่ที่อยากให้เซฟไฟล์ไว้พร้อมกับใส่ชื่อไฟล์ ส่วนนามสกุลไฟล์จะใส่เป็นอะไรก็ได้ (ข้างในจะใช้ฟอตแมตเป็น JSON)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget export &lt;filepath&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>:<span style="color:#75715e">: ตัวอย่าง</span>
</span></span><span style="display:flex;"><span>winget export D:\winget.json
</span></span></code></pre></div><h3 id="ลงโปรแกรมจากแบคอพ-import">
	<a href="#%e0%b8%a5%e0%b8%87%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1%e0%b8%88%e0%b8%b2%e0%b8%81%e0%b9%81%e0%b8%9a%e0%b8%84%e0%b8%ad%e0%b8%9e-import" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ลงโปรแกรมจากแบ็คอัพ (Import)
</h3>
<p>กรณีที่เราลงวินโดใหม่ก็ import ไฟล์นี้แล้วเดี๋ยว winget จะลงโปรแกรมให้ตามในไฟล์เลย</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget import &lt;filepath&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>:<span style="color:#75715e">: ตัวอย่าง</span>
</span></span><span style="display:flex;"><span>winget import D:\winget.json
</span></span></code></pre></div><h2 id="batscript">
	<a href="#batscript" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ทำสคริปต์ลงโปรแกรม
</h2>
<p>นอกเหนือจาก export กับ import ที่ Winget มีมาให้แล้ว ด้วยความที่ทุกคำสั่งมันก็เป็นแค่ตัวหนังสือธรรมดา เราเลยสามารถเซฟเก็บเป็นไฟล์ได้</p>
<p>แต่ถ้าเซฟเป็น .bat ก็จะเปลี่ยนจากไฟล์ text ธรรมดาเป็นไฟล์สคริปต์ที่แค่กดเปิดก็จะรันตามคำสั่งที่เราพิมพ์เอาไว้ให้เลย เวลาจะใช้ก็แค่กดดับเบิ้ลคลิกเพื่อรันไฟล์แค่นั้น ไม่ต้องก็อปคำสั่งเอามาวางบน cmd เองอีกต่อไป</p>
<p>ส่วนวิธีทำก็ง่ายมักๆ เปิด Text Editor ตัวไหนก็ได้ขึ้นมา (Notepad, VSCode, Notepad++ หรืออื่นๆ) จากนั้นก็พิมพ์คำสั่งลงไป โดยที่หนึ่งบรรทัดคือหนึ่งคำสั่ง เช่น อยากลง VSCode และ Git ก็จะเป็นแบบนี้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget install vscode
</span></span><span style="display:flex;"><span>winget install git
</span></span></code></pre></div><p>ที่เหลือก็แค่เซฟเป็นไฟล์ .bat ก็เสร็จแล้ว จะเอาไฟล์นี้ไปใช้ที่ไหนก็ได้ ก๊อปใส่ Flash drive ไปรันเครื่องเพื่อนก็ยังได้ เวลาจะใช้ก็แค่กดดับเบิ้ลคลิกแล้วเดี๋ยวที่เหลือมันรันตามคำสั่งให้เลย</p>
<p>อ๋อ จริงๆ มันใช้ได้ทุกคำสั่งเลยนะไม่ได้เฉพาะแค่ install อย่างเดียว อย่างถ้าอยากลบ Discord ก็พิมพ์เพิ่มไปเป็นแบบนี้</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>winget install VSCode
</span></span><span style="display:flex;"><span>winget install git
</span></span><span style="display:flex;"><span>winget uninstall discord
</span></span></code></pre></div>]]></description>
		</item><item>
			<title>ทำ Git visualize ตลอด 1 ปีที่ผ่านมาด้วย Gource</title>
			<link>https://nitpum.com/post/gource-git-visualize/</link>
			<pubDate>Sun, 23 Jan 2022 11:55:51 +0000</pubDate>
			
			<guid>https://nitpum.com/post/gource-git-visualize/</guid>
			<description><![CDATA[<p>ปกติช่วงสิ้นปีหรือช่วงปีใหม่เราก็มักจะทำ Year review กันใช่ไหมละ
ผมเองก็มีทำๆ บ้างจะได้เป็นการทบทวนตัวเองว่าตลอด 1 ปีที่ผ่านมาได้ทำอะไรไปบ้าง ซึ่งตัวผมนั้นอยากเห็นด้วยว่าโปรเจคที่ทำมาตลอด 1 ปีได้ทำอะไรไปเยอะแค่ไหนและมีการเติบโตจากเดิมไปเท่าไร แต่มานั่งนึกเอาเองมันก็ดูจะไม่ค่อยเห็นภาพเท่าไร เลยนึกขึ้นได้ว่าใช้ Gource ทำ visualization ให้ดีกว่าจะได้เห็นเป็นภาพเลย แถมเอาไปโชว์ให้ทีมดูได้ด้วย</p>
<p><a href="https://gource.io" target="_blank" rel="noopener">Gource</a> เป็นโปรแกรมที่จะอ่านประวัติจาก SVC Repo (เช่น Git, Mercurial, SVN เป็นต้น) แล้วเอามาวาดเป็นต้นไม้แสดงให้ดูตามโฟลเดอร์และไฟล์ในโปรเจค นอกจากนี้ยังเล่นเป็นไทมไลน์ให้ดูว่าช่วงนั้นมีอะไรเกิดขึ้นบ้างและใครทำอะไรตรงไหนไป</p>


<video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/gource-git-visualize/videos/preview.mp4" type="video/mp4">
	
	
	
</video>

<h2 id="ตดตง">
	<a href="#%e0%b8%95%e0%b8%94%e0%b8%95%e0%b8%87" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ติดตั้ง
</h2>
<p>วิธีติดตั้ง gource นั้นง่ายมากๆ เราสามารถลงผ่าน package manager ด้วย command line เพียงบรรทัดเดียวได้เลยทั้ง macOS และ Linux รวมถึง Windows 11 หรือ Windows 10 ที่ลง winget ไว้แล้ว ก็สามารถใช้ command ติดตั้งตามด้านล่างได้เลย</p>
<p><strong>Winget</strong> (Windows 11 / Windows 10)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>winget install gource
</span></span></code></pre></div><p><strong>Homebrew</strong> (macOS)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>brew install gource
</span></span></code></pre></div><p><strong>Debian / Ubuntu</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt install gource
</span></span></code></pre></div><p><strong>Arch linux</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pacman -S gource
</span></span></code></pre></div><p>ถ้าใครไม่อยากลงผ่าน command line ก็สามารถโหลดตัวติดตั้งจากเว็บไซต์หลักได้เลย <a href="https://gource.io/" target="_blank" rel="noopener">gource.io</a></p>
<h2 id="วธใชงาน">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b9%83%e0%b8%8a%e0%b8%87%e0%b8%b2%e0%b8%99" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีใช้งาน
</h2>
<p>ในส่วนวิธีใช้งานก็ง่ายๆ ไม่มีอะไรซับซ้อนเลย เริ่มจากไปที่โฟลเดอร์โปรเจคของเราก่อน</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cd ~/myporject
</span></span></code></pre></div><p>จากนั้นรัน gource</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gource
</span></span></code></pre></div><p>ตู้มม!! ก็จะมีหน้าต่างเด้งขึ้นมาให้เราดู</p>


<video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/gource-git-visualize/videos/demo.mp4" type="video/mp4">
	
	
	
</video>

<p>แต่ว่ามันเอามาทั้งหมดเลยตั้งแต่ตอนสร้าง repo มาจนถึงช่วงปัจจุบันเลย ซึ่งผมอยากได้แค่ช่วงของ 1 ปีที่แล้วเท่านั้น เลยต้องกำหนดช่วงเวลาให้มัน</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gource --start-date <span style="color:#e6db74">&#34;2021-01-01&#34;</span> --stop-date <span style="color:#e6db74">&#34;2021-12-31&#34;</span>
</span></span></code></pre></div><p>โดยที่</p>
<ul>
<li><code>---start-date &quot;YYYY-MM-DD&quot;</code> กำหนดวันเริ่มต้น ในที่นี้คือ วันที่ 1 มกราคม ค.ศ. 2021</li>
<li><code>--stop-date &quot;YYYY-MM-DD&quot;</code>  กำหนดวันสุดท้าย ในที่นี้คือ วันที่ 31 ธันวาคม ค.ศ. 2021</li>
</ul>
<p>เท่านี้ gource จะไล่ไทมไลน์ให้เราแค่ในช่วงที่เรากำหนดไว้แล้วละ</p>
<p>แต่ว่าถ้าช่วงไหนไม่ได้มี commit เลย gource ก็จะข้ามช่วงนั้นไปให้อัตโนมัติ ถ้าใครไม่อยากให้ข้ามสามารถปิดด้วย flag <code>--disable-auto-skip</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gource --disable-auto-skip
</span></span></code></pre></div><p>แล้วถ้ารู้สึกว่ามันช้าไปเราสามารถปรับความเร็วได้ด้วย <code>--time-scale &lt;scale&gt;</code> ซึ่งปรับได้ตั้งแต่ 1.0 - 4.0  (ค่าเริ่มต้นอยู่ที่ 1.0)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gource --time-scale <span style="color:#ae81ff">4</span>
</span></span></code></pre></div><p>หน้าจอเล็กไปก็ปรับได้ด้วย <code>-&lt;WIDTH&gt;x&lt;HIEGHT&gt;</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gource -1920x1080
</span></span></code></pre></div><p>หรือจะปรับเต็มจอไปเลยก็ใส่ <code>--fullscreen</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gource --fullscreen
</span></span></code></pre></div><p>จริงๆ ยังมี option ให้ปรับได้อีกเยอะ แนะนำให้ลอง<a href="https://github.com/acaudwell/Gource/wiki" target="_blank" rel="noopener">อ่านเพิ่มในวิกิ</a></p>
<p>สำหรับหนึ่งปีใช้แค่นี้ก็พอแล้ว ที่เหลือก็แค่อัดหน้าจอเราก็จะได้ visualize ตลอด 1 ปีที่ผ่านมาแล้ว</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gource --start-date <span style="color:#e6db74">&#34;2021-01-01&#34;</span> --stop-date <span style="color:#e6db74">&#34;2021-12-31&#34;</span> --time-scale <span style="color:#ae81ff">4</span>
</span></span></code></pre></div>

<video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/gource-git-visualize/videos/one_year.mp4" type="video/mp4">
	
	
	
</video>

<p>(อันนี้เป็นวิดีโอประกอบเฉยๆ นะ ผมเอาของจริงมาโชว์ให้ดูไม่ได้)</p>
<h2 id="ffmpeg">
	<a href="#ffmpeg" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		FFmpeg
</h2>
<p>ใครที่มี <a href="https://www.ffmpeg.org/" target="_blank" rel="noopener">ffmpeg</a> อยู่แล้ว
เราสามารถเอามาใช้เรนเดอร์วิดีโอออกมาเป็นไฟล์ให้เราได้เลยจะได้ไม่ต้องมาอัดหน้าจอเอง</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gource --start-date <span style="color:#e6db74">&#34;2021-01-01&#34;</span> --stop-date <span style="color:#e6db74">&#34;2021-12-31&#34;</span> --time-scale <span style="color:#ae81ff">4</span> -1980x1080 | ffmpeg -y -r <span style="color:#ae81ff">60</span> -f image2pipe -vcodec ppm -i - -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -crf <span style="color:#ae81ff">1</span> -threads <span style="color:#ae81ff">0</span> -bf <span style="color:#ae81ff">0</span> gource.mp4
</span></span></code></pre></div><p>อ่าน<a href="https://github.com/acaudwell/Gource/wiki/Videos" target="_blank" rel="noopener">รายละเอียดเพิ่มเติม</a></p>
]]></description>
		</item><item>
			<title>ย้ายบล็อกจาก Blogger ไป Hugo - Part 1</title>
			<link>https://nitpum.com/post/migrate-from-blogger-to-hugo-part-1/</link>
			<pubDate>Sat, 01 Jan 2022 00:00:00 +0700</pubDate>
			
			<guid>https://nitpum.com/post/migrate-from-blogger-to-hugo-part-1/</guid>
			<description><![CDATA[<p>สวัสดีครับ ตอนนี้ผมได้ย้ายบล็อกจาก Blogger ไปใช้ Hugo เรียบร้อยแล้ว เลยอยากจะมาเล่าให้ฟังว่าได้ทำอะไรไปบ้าง</p>
<h2 id="ทำไมถงยาย">
	<a href="#%e0%b8%97%e0%b8%b3%e0%b9%84%e0%b8%a1%e0%b8%96%e0%b8%87%e0%b8%a2%e0%b8%b2%e0%b8%a2" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ทำไมถึงย้าย?
</h2>
<p>บล็อกเดิมตั้งแต่เปิดมาก็ใช้ <a href="https://www.blogger.com" target="_blank" rel="noopener">Blogger</a> มาโดยตลอดไม่เคยย้ายออกไปที่ไหนเลย ด้วยความที่ว่ามันใช้ได้<strong>ฟรี + ใช้ง่าย</strong>เลยเลือกใช้ตัวนี้มาตั้งแต่ตอนนั้น</p>
<p>ถึงอย่างนั้นการใช้ Blogger ก็ยังมีปัญหาอยู่</p>
<ul>
<li><strong>เขียนธีมเองยาก</strong> ธีมที่ให้มามันไม่ค่อยถูกใจเท่าไร เลยต้องเขียนธีมขึ้นมาใช้เอง แต่ด้วยความที่ธีมต้องเขียนด้วย XML ฉบับพิเศษของ Blogger เอง ทำให้จะแก้แต่ละทีต้องไปตบตีกับ XML สุดพิเศษนี้ที่รวม HTML + JS + CSS ไว้ด้วยกันในไฟล์เดียว! แถมหน้าแต่ละหน้ามีหน้าตาไม่เหมือนกันก็ต้องเขียนรวมไว้ในไฟล์เดียว แล้วเขียนเงื่อนไขครอบการแสดงผลเอา</li>
<li><strong>เว็บบวม</strong> นอกจาก js และ css ที่เราใส่เองแล้ว ยังมีของจาก Blogger ที่แปะเพิ่มเข้ามา แถมเอาออกไม่ได้ด้วย ทำให้เว็บเราโหลดช้าขึ้นโดยไม่จำเป็น</li>
<li><strong>ไม่ได้เป็นเจ้าของแพลตฟอร์ม</strong> ไม่ว่าจะเป็น Blogger, Medium, Tumblr, Facebook หรือ อื่นๆ ล้วนแล้วแต่เป็นแพลตฟอร์มที่เราใช้บริการอยู่ แพลตฟอร์มเป็นคนกำหนดว่าอะไรควรอยู่อะไรไม่ควรอยู่ อย่างที่ Facebook Page โดนลด Reach ลง หรือถ้าเกิดวันหนึ่ง Medium ตัดสินใจให้มีป็อบอัพโฆษาในเว็บ เราก็ทำอะไรไม่ได้ เราเป็นแค่ผู้ใช้บริการ เราไม่ได้เป็นเจ้าของแพลตฟอร์ม</li>
<li><strong>ความเป็นส่วนตัวของผู้อ่าน</strong> ทุกวันนี้แพลตฟอร์มต่างๆ เก็บข้อมูลและรู้เรื่องราวเกี่ยวกับเราเยอะเกินไป แน่นอนว่าสำหรับแพลตฟอร์มฝากบล็อกเองก็มีการเก็บข้อมูลอยู่แล้ว ผู้ที่เข้ามาอ่านบล็อกเราก็จะโดนเก็บข้อมูลไปด้วย ถ้าผมอยากลดการเก็บข้อมูลพวกนี้ลงหรือไม่เก็บเลย ผมจะทำอะไรแบบนั้นไม่ได้ถ้ายังใช้แพลตฟอร์มคนอื่นอยู่</li>
</ul>
<p>นั้นเลยเป็นที่มาว่าทำไมถึงอยากย้ายบล็อกออกจาก Blogger ไปไว้ที่อื่นที่</p>
<h2 id="self-hosted">
	<a href="#self-hosted" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Self-Hosted
</h2>
<p>ถ้าไม่ฝากบล็อกไว้กับแพลตฟอร์มออนไลน์เราก็ต้องเช่าเซิฟเวอร์มาเปิดบล็อกเอง ตัวระบบบล็อกเราอาจจะเขียนขึ้นมาเองด้วย PHP, NodeJS หรือภาษาอื่นๆ ตามแต่ถนัด ไม่ก็อาจจะใช้ CMS ที่มีอยู่แล้วไม่ว่าจะเป็น WordPress หรือ Ghost สอง CMS ยอดนิยมสำหรับทำบล็อก</p>
<p>ไม่ว่าจะแบบไหนก็มีหลักการทำงานที่เหมือนกันคือ ทุกๆ ครั้งที่มีคนเข้าเว็บไซต์เซิฟเวอร์ต้องไปดึงข้อมูลจาก Database เอามาประมวลผลและเรนเดอร์ออกมาเป็นเว็บไซต์ที่สวยงามให้เรา</p>
<p>นั้นหมายความว่าเราจะต้องมี Database สำหรับเก็บข้อมูล และเซิฟเวอร์ที่แรงพอสำหรับใช้ในการประมวลผล ค่าจ่ายตรงนี้อาจไม่สูงแต่สำหรับบล็อกส่วนตัวที่ไม่ค่อยได้อัพเดทก็ดูไม่ค่อยคุ้มสักเท่าไร ไหนจะเรื่องแบล็คอัพข้อมูลจาก Database ที่ไม่ได้ทำง่ายๆ อีก</p>
<h2 id="static-site-generator">
	<a href="#static-site-generator" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Static Site Generator
</h2>
<p>เราจะคอยเรนเดอร์หน้าเว็บไซต์ทุกครั้งที่มีคนเข้าเว็บไปทำไมในเมื่อเนื้อหาก็เหมือนเดิม นานทีปีหนจะอัพเดทที&hellip;</p>
<p>ทำไมเราเรนเดอร์ทีเดียวแล้วเก็บไว้ใช้ตลอดละ?</p>
<p>Static Site Generator หรือ SSG จึงเกิดมาเพื่อแก้ปัญหานี้</p>
<p>แทนที่เราจะเก็บโพสต์เราลง Database ก็เปลี่ยนมาเก็บเป็นไฟล์ <a href="https://en.wikipedia.org/wiki/Markdown" target="_blank" rel="noopener">Markdown</a> แทน จากนั้นก็รันตัว SSG ให้ไปอ่านไฟล์ Markdown ทั้งหมด SSG ก็จะเอาโพสต์เราไปประกอบกับเทมเพลตของเว็บไซต์ที่เขียนเอาไว้ และได้ออกมาเป็นไฟล์ HTML ทุกหน้าของเว็บไซต์เราที่พร้อมใช้งาน แค่เอาไปอัพขึ้นเซิฟเวอร์ก็ใช้ได้เลย ทุกครั้งที่เราเพิ่มโพสต์หรือแก้ไขโพสต์เก่าก็แค่รัน SSG 	ใหม่แล้วเอาไฟล์ HTML ที่ได้ไปอัพโหลดขึ้นเซิฟก็จบ</p>
<p><strong>ข้อดี</strong></p>
<ul>
<li>ไม่ต้องมี Database Management System (DBMS) ในการจัดการข้อมูล ทุกอย่างเป็นไฟล์ Text-based ธรรมดาใช้อะไรแก้ก็ได้</li>
<li>ประหยัดค่าใช้จ่าย ไม่ต้องเช่าเซิฟแรงๆ สำหรับประมวลข้อมูลจาก Database ขอแค่ฝากไฟล์ HTML ได้ก็พอแล้ว</li>
<li>แบล็คอัพข้อมูลง่าย ทุกอย่างถูกเก็บเป็นไฟล์ในเครื่องเรา จะเก็บลง Flash Drive, External Drive หรือ Cloud ก็ทำได้หมดเลย</li>
<li>แก้เนื้อหาด้วยโปรแกรมอะไรก็ได้ ทุกอย่างเราเก็บเป็นไฟล์แบบ Text-based อยู่แล้ว หมายความว่าเวลาแก้ไขเนื้อหาก็แค่ใช้โปรแกรมที่เปิดไฟล์ Text ได้อย่าง  Notepad, VSCode, Vim หรืออื่นๆ ได้ตามที่ต้องการเลย</li>
<li>จัดฟอร์แมตข้อความได้ในตัว พอเราเขียนบล็อกเป็นไฟล์ Markdown เราสามารถทำพวกตัวหนา, ตัวเอียง, หัวข้อ ได้เอง ไม่ได้ขึ้นอยู่กับโปรแกรมที่ใช้เปิด</li>
<li>เขียนบล็อกได้แม้ออฟไลน์อยู่ พอทุกอย่างมันเป็นไฟล์ในเครื่องเราอยู่แล้วก็ไม่จำเป็นต้องต่อเน็ตอีกต่อไป (ตอนอัพขึ้นเซิฟเวอร์ยังต้องต่อเน็ตอยู่)</li>
</ul>
<p><strong>ข้อเสีย</strong></p>
<ul>
<li>ต้องเก็บข้อมูลเอง ถ้าเป็นบล็อกปกติคือข้อมูลเราทุกอย่างถูกเก็บไว้บนเซิฟเวอร์อยู่แล้วจะย้ายไปทำเครื่องอื่นก็ไม่มีปัญหา แต่พอเป็น SSG ที่ข้อมูลทุกอย่างถูกเก็บเป็นไฟล์อยู่ในเครื่องเรา เวลาย้ายเครื่องเราต้องย้ายข้อมูลพวกนี้ไปด้วยไม่งั้นทำบล็อกต่อจากเดิมไม่ได้</li>
<li>ต้องรัน SSG ใหม่ทุกครั้งที่มีการอัพเดทเนื้อหาหรือปรับดีไซน์เว็บไซต์ ทำให้ไม่ค่อยเหมาะกับเว็บไซต์ที่มีการอัพเดทเนื้อหาบ่อยๆ</li>
<li>นอกจากต้องรัน SSG ทุกครั้งแล้ว เรายังต้องคอยอัพไฟล์ HTML ขึ้นไปบนเซิฟเวอร์ใหม่ทุกครั้งด้วย</li>
</ul>
<p>พอมาเทียบข้อดีกับข้อเสียแล้ว สำหรับบล็อกผมข้อเสียดูจะไม่ค่อยมีผลสักเท่าไร ทั้งในเรื่องที่ต้องคอยเก็บข้อมูลเองหรือค่อยรัน SSG และอัพขึ้นเซิฟเวอร์ทุกครั้ง ซึ่งเดี๋ยวจะมีบอกครับว่าทำไมส่วนนี้ผมถึงไม่มีปัญหา</p>
<h2 id="hugo">
	<a href="#hugo" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Hugo
</h2>
<p>ในปัจจุบัน SSG มีตัวเลือกให้ใช้อยู่หลายตัว ไม่ว่าจะเป็น <a href="https://jekyllrb.com/" target="_blank" rel="noopener"><strong>Jekyll</strong></a>, <a href="https://hexo.io/" target="_blank" rel="noopener"><strong>Hexo</strong></a>, <a href="https://middlemanapp.com/" target="_blank" rel="noopener"><strong>Middleman</strong></a>, <a href="https://www.gatsbyjs.com/" target="_blank" rel="noopener"><strong>Gastsby</strong></a>, <a href="https://gridsome.org/" target="_blank" rel="noopener"><strong>Gridsome</strong></a> และอื่นๆ อีกมากมาย ใครสนใจแนะนำให้ลองไปเช็คดูที่ <a href="https://jamstack.org/generators/" target="_blank" rel="noopener">Jamstack</a> ครับ เขาทำลิตส์รวมไว้ให้หมดแล้ว อีกทั้งยังมีแนะนำการใช้ SSG และประเด็นอื่นๆ ที่เกี่ยวข้องอีกด้วย</p>
<p>สำหรับใครที่เขียน React อยู่แล้วแนะนำให้ลองไปดู Gastsby ครับ หรือถ้าเขียน Vue ก็ Gridsome</p>
<p>แม้ตัวผมจะเขียน React กับ Vue เป็นประจำ แต่สำหรับบล็อกนี้ผมมาจบที่ <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a> ครับ ด้วยความที่บล็อกผมไม่ได้ต้องการอะไรมาก ไม่ได้ทำลูกเล่นอะไรในเว็บอยู่แล้วเลยไม่จำเป็นต้องใช้ UI Framework ตัวไหน ขออะไรที่ใช้ได้ง่ายและเร็วก็พอแล้ว ซึ่ง Hugo ตอบโจทย์นี้ทั้งหมด</p>
<ul>
<li><strong>เร็ว</strong> Hugo เขียนด้วย <a href="https://go.dev" target="_blank" rel="noopener">Go</a> เลยทำงานเร็วมากเมื่อ<a href="https://css-tricks.com/comparing-static-site-generator-build-times/" target="_blank" rel="noopener">เทียบกับ SSG ตัวอื่นๆ</a> ไฟล์เยอะแค่ไหนก็ยังเร็วอยู่ ในอนาคตถ้าเกิดเรามีโพสต์มากถึง 1000 โพสต์ก็รันเสร็จได้ในไม่กี่วินาที</li>
<li><strong>ครบจบในตัว</strong> อยากทำ Post-process เหรอทำได้เลย, อยากเขียน SASS / SCSS เหรอเขียนได้เลย, จะทำ minify หรือ bundle ก็ยังได้ ไม่ต้องลง node modules หรืออะไรเลย เรียกได้ว่ามีทุกอย่างครบจบในตัว</li>
<li><strong>ใช้ได้เลย</strong> โหลดมาลงแล้วใช้ได้เลย ไม่มี dependency ไม่มี node_modules ไม่ต้องลงอะไรเพิ่ม ก๊อปใส่ Flash drive ไปใช้ที่เครื่องอื่นยังได้เลยครับ</li>
</ul>
<h2 id="git">
	<a href="#git" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Git
</h2>
<p>สำหรับใครที่อ่านบทความนี้แล้วอาจจะยังไม่รู้ว่า <a href="https://git-scm.com" target="_blank" rel="noopener">Git</a> คืออะไร ถ้าจะให้พูดก็คือเครื่องมือที่เหล่านักพัฒนาซอฟต์แวร์ใช้ในการเก็บบันทึกการเปลี่ยนแปลงของไฟล์ซอร์สโค้ด (Version control) อารมณ์ประมาณประวัติการแก้ไขใน Google docs อะครับ ที่เราสามารถย้อนกลับไปดูประวัติในอดีตได้ว่าใครแก้อะไรตรงไหนไปบ้าง แต่ของ Git นี้จะ advance กว่าและมีคุณสมบัติอื่นๆ อีกมากครับ</p>
<p>ที่นี้พอเราใช้ SSG ที่เก็บทุกอย่างเป็นไฟล์เลยเอาไปใช้กับ Version control อย่าง Git ได้! ซึ่งก็จะได้ประโยชน์ของ Git มาด้วย ไม่ว่าจะเป็นประวัติการแก้ไข การเก็บข้อมูลแบบกระจายศูนย์เอาไปอัพทิ้งไว้ที่ git provider ไหนก็ได้ไม่ต้องกลัวโดนล็อคอยู่บริการของเจ้าไหน ไม่ต้องกลัวข้อมูลจะหายเพราะแบล๊คอัพได้หลายที่ ย้ายเครื่องก็แค่ clone repo ลงมาก็ทำงานต่อได้เลย หรือถ้าจะให้คนอื่นมาเขียนบล็อกด้วยก็ซิงค์ข้อมูลกันง่ายมากๆ</p>
<h2 id="netlify">
	<a href="#netlify" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Netlify
</h2>
<p><a href="https://www.netlify.com" target="_blank" rel="noopener"><strong>Netlify</strong></a> เป็นบริการฝาก Static Website ไว้บน CDN ทั่วโลก ซึ่งไม่เหมือนกับการเช่าเซิฟเวอร์มาเปิดบล็อกทั่วไปนะครับ เราไม่ได้ยุ่งในส่วนเซิฟเวอร์เลยด้วยความที่เป็น Static Website ด้วยไม่ต้องใช้เซิฟเวอร์ในการประมวลผลอยู่แล้ว Netlify เลยเป็นคนจัดการแลดูเองทั้งหมด หน้าที่ของเราคืออัพโหลดไฟล์เว็บเราให้ Netlify ก็พอแล้วเดี๋ยวที่เหลือปล่อยให้ Netlify เป็นคนจัดการ</p>
<p>ความเจ๋งอย่างนึงคือเราสามารถเชื่อม Git repo จาก Github, Gitlab หรือ Bitbucket เข้ากับ Netlify ได้ ทุก ๆ ครั้งที่มี commit ใหม่ push ขึ้นไป Netlify ก็จะดึงโค้ดใน repo ไปอัพโหลดขึ้น CDN ให้เราให้อัตโนมัติ นอกจากนี้เรายังตั้งค่าให้ Netlify รันตัว SSG และให้เอาผลลัพธ์จาก SSG อัพขึ้นไปแทนโค้ดใน repo ได้อีกด้วย ตรงนี้เองทำให้เราแค่เขียนบทความเป็น Markdown ไฟล์เก็บไว้ใน repo กับไฟล์ template อีกนิดหน่อย แล้วเดี๋ยวที่เหลือปล่อยให้ Netlfiy เป็นคนจัดการ เราเลยไม่ต้องมารัน SSG ใหม่เองทุกครั้งที่จะอัพเดทเนื้อหา</p>
<p>ตัว Netlify เองใช้ได้ฟรีแบบจำกัดแบนด์วิดท์ (Bandwith) 100GB/เดือน และจำกัดเวลาบิ้ว (ฺBuild time) ที่ 300 นาที/เดือน แต่เสียเงินเพื่ออัพเกรดเพิ่มได้ สำหรับบล็อกผมเองเท่านี้ถือว่าเพียงพอแล้วครับ</p>
<div class="notice note">
  เผื่อใครไม่รู้ผมเคยเขียนบนความ &ldquo;<a href="https://nitpum.com/post/hello-netlify/" target="_blank" rel="noopener">ฝาก Static Website ไว้กับ Netlify</a>&rdquo; ลองไปอ่านดูกันได้ครับ 😉
</div>

<p>พอเอาทุกอย่างมารวมกัน <strong>Hugo + Git + Netlify</strong> นี้เรียกได้สมบูรณ์แบบสุดๆ ไปเลยครับ ที่สำคัญคือ<strong>ฟรี</strong>ไม่มีค่าใช้จ่ายอะไรเลย (ไม่นับค่าโดเมนเว็บไซต์นะครับ อันนั้นยังไงก็ต้องเสียอยู่แล้ว)</p>
<p>เอาละครับสำหรับโพสต์นี้ผมขอจบไว้ที่ตรงนี้ก่อนเดี๋ยวมันจะยาวเกินไป เดี๋ยวพาร์ทหน้าผมจะมาเขียนต่อว่าตอนย้ายข้อมูลจาก Blogger มานั้นต้องทำอะไรบ้าง และพอมาใช้ Hugo แล้วต้องปรับอะไรบ้าง</p>
]]></description>
		</item><item>
			<title>Style</title>
			<link>https://nitpum.com/style/</link>
			<pubDate>Tue, 22 Dec 2020 22:38:16 +0700</pubDate>
			
			<guid>https://nitpum.com/style/</guid>
			<description><![CDATA[<h2 id="typography">
	<a href="#typography" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Typography
</h2>
<p><em>Italic</em></p>
<p><strong>Bold</strong></p>
<p><del>Strike through</del></p>
<p><del><em><strong>Mixed</strong></em></del></p>
<h2 id="heading">
	<a href="#heading" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Heading
</h2>
<h1 id="h1">
	<a href="#h1" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		H1
</h1>
<h2 id="h2">
	<a href="#h2" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		H2
</h2>
<h3 id="h3">
	<a href="#h3" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		H3
</h3>
<h4 id="h4">
	<a href="#h4" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		H4
</h4>
<h4 id="h5">
	<a href="#h5" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		H5
</h4>
<h5 id="h6">
	<a href="#h6" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		H6
</h5>
<h2 id="paragraph">
	<a href="#paragraph" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Paragraph
</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas id venenatis mi. Maecenas placerat nulla ex, a semper urna cursus cursus. Curabitur fringilla vestibulum viverra. Nulla facilisi. Quisque ligula velit, viverra at congue lacinia, finibus a ipsum. Suspendisse in nisl at nisi tristique varius eu vitae purus. Vivamus suscipit in libero sit amet dapibus. Proin et tortor eget enim ultrices mollis eget ac tellus.</p>
<p>Nunc nec tellus tempus, feugiat odio quis, aliquet tortor. Praesent dignissim, justo cursus aliquam dictum, nisl nisi dignissim purus, vel commodo eros odio nec libero. Aenean sed lectus ex. Aliquam commodo felis metus, sed mattis nulla accumsan sit amet. Sed eu mattis ligula. Suspendisse feugiat, est nec condimentum eleifend, erat magna condimentum lacus, et lobortis leo metus nec dui. In ornare sem nec est euismod molestie. Integer fermentum nunc maximus porttitor tincidunt.</p>
<p>Fusce semper ligula sapien, sit amet faucibus neque volutpat sit amet. Proin faucibus dictum quam, at ornare ipsum lobortis et. Etiam auctor pharetra erat et aliquet. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vestibulum auctor, sapien eu gravida iaculis, sem ante ultricies diam, sed porttitor velit velit sed mauris. In hac habitasse platea dictumst. Mauris tempor ullamcorper metus ut dictum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed magna sapien, sodales eget rhoncus a, fringilla sit amet elit. Ut maximus diam quis elit cursus, non mattis risus tincidunt. Aenean vitae quam vel tortor scelerisque ullamcorper.</p>
<p>Pellentesque turpis nulla, semper eget elementum ac, consequat vel justo. Pellentesque eget lacus volutpat, tempor diam cursus, facilisis diam. Nunc sodales ligula vitae dolor mattis, consectetur bibendum nisi dignissim. Pellentesque semper ex at neque fringilla, et accumsan tellus tincidunt. Suspendisse potenti. Morbi vitae metus sit amet nisl consectetur sodales quis et ante. Fusce at iaculis est. Proin ac justo nec felis hendrerit feugiat quis sed urna. In gravida, elit ut tempus tristique, ante tellus gravida sem, et iaculis mauris ante vel nulla. Morbi tincidunt varius ultricies. Pellentesque ante mi, cursus ac elit in, mollis mollis turpis. Proin tincidunt massa at tristique sodales. In bibendum sapien at nisl rutrum porta. Duis at posuere odio, egestas laoreet nibh.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam erat volutpat. Mauris non diam at dolor rhoncus dictum quis eget neque. Nunc nulla nunc, luctus eget condimentum vitae, tincidunt accumsan sem. Vivamus convallis posuere enim hendrerit convallis. Donec finibus nulla in porta faucibus. Ut venenatis blandit malesuada. Praesent venenatis vestibulum sapien id lobortis. Fusce orci enim, semper vel tellus sed, maximus interdum erat. Sed hendrerit sodales eros, eu hendrerit dolor eleifend at. Nunc finibus quis dui eu pharetra. Maecenas luctus ex vel ligula pulvinar, id ultrices erat cursus. Pellentesque consectetur blandit urna, vitae vehicula lacus sagittis eu.</p>
<h2 id="emoji">
	<a href="#emoji" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Emoji
</h2>
<p>😉 🤔 🌴 🏡</p>
<h2 id="unordered-lists">
	<a href="#unordered-lists" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Unordered Lists
</h2>
<p>To-do</p>
<ul>
<li>Sleep</li>
<li>Code</li>
<li><del>Coffee</del></li>
</ul>
<h2 id="ordered-lists">
	<a href="#ordered-lists" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Ordered Lists
</h2>
<p>Anime</p>
<ol>
<li>Attack on Titan</li>
<li>Code geass</li>
<li>Death Notes</li>
<li>??? Where JoJO!!</li>
</ol>
<h2 id="notice">
	<a href="#notice" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Notice
</h2>
<div class="notice note">
  The note that fell from the sky
</div>

<div class="notice update">
  Looks like something has update
</div>

<h2 id="table">
	<a href="#table" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Table
</h2>
<table>
  <thead>
      <tr>
          <th>Name</th>
          <th>Description</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Kabuto</td>
          <td>Kamen rider</td>
      </tr>
      <tr>
          <td>Faiz</td>
          <td>I&rsquo;m Orphnoch</td>
      </tr>
      <tr>
          <td>Decade</td>
          <td>Just passing through</td>
      </tr>
  </tbody>
</table>
<h2 id="code-blocks">
	<a href="#code-blocks" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Code Blocks
</h2>
<p>Inline <code>This is a inline codeblock.</code></p>
<p>var key = <code>key_without_hash_123456789</code></p>
<p>HTML</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;text&#34;</span>&gt;
</span></span><span style="display:flex;"><span>	&lt;<span style="color:#f92672">span</span>&gt;&lt;/<span style="color:#f92672">span</span>&gt;
</span></span><span style="display:flex;"><span>	&lt;<span style="color:#f92672">p</span>&gt;&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>	&lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>&gt;Click here&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">div</span>&gt;
</span></span></code></pre></div><p>Javascript</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#75715e">// TODO: should print username
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">helloWorld</span>() {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">world</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">world</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">`Hi </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">world</span><span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>C#</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Player</span> {
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">float</span> maxHealth = <span style="color:#ae81ff">100</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">public</span> PlayerInput input;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">float</span> health = <span style="color:#ae81ff">100.0f</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> TakeDamage(<span style="color:#66d9ef">float</span> dmg) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">this</span>.health -= dmg;
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">void</span> Destroy() {
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// TODO: implement</span>
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Bash</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git add -A
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>git commit -m <span style="color:#e6db74">&#34;Update code&#34;</span>
</span></span></code></pre></div><p>Highlight line and change start line no.</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
</span><span style="background-color:#3c3d38"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
</span></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
</span><span style="background-color:#3c3d38"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
</span></span><span style="background-color:#3c3d38"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
</span></span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">useInput</span>() {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">const</span> [<span style="color:#a6e22e">input</span>, <span style="color:#a6e22e">setInput</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">useState</span>(<span style="color:#e6db74">&#39;&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">const</span> <span style="color:#a6e22e">onChange</span> <span style="color:#f92672">=</span> (<span style="color:#a6e22e">e</span>) =&gt; {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">setInput</span>(<span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">target</span>.<span style="color:#a6e22e">value</span>)
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> [<span style="color:#a6e22e">input</span>, <span style="color:#a6e22e">onChange</span>]
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">InputField</span>() {
</span></span><span style="display:flex; background-color:#3c3d38"><span>	<span style="color:#66d9ef">const</span> [<span style="color:#a6e22e">input</span>, <span style="color:#a6e22e">onChange</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">useInput</span>()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> (
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&lt;</span><span style="color:#a6e22e">input</span>
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;text&#34;</span>
</span></span><span style="display:flex; background-color:#3c3d38"><span>			<span style="color:#a6e22e">value</span><span style="color:#f92672">=</span>{<span style="color:#a6e22e">input</span>}
</span></span><span style="display:flex; background-color:#3c3d38"><span>			<span style="color:#a6e22e">onChange</span><span style="color:#f92672">=</span>{<span style="color:#a6e22e">onChange</span>}
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>	)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="blockquotes">
	<a href="#blockquotes" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Blockquotes
</h2>
<p>Some one said</p>
<blockquote>
<p>If it works don&rsquo;t touch it.</p>
</blockquote>
<p>Another one said</p>
<blockquote>
<p>People die if they are killed.</p>
</blockquote>
<p>Below is two quote</p>
<blockquote>
<p>This is first quote</p>
</blockquote>
<blockquote>
<p>This is another quote</p>
</blockquote>
<p>Multiple line</p>
<blockquote>
<p>First</p>
<p>Third line</p>
<p>Last</p>
</blockquote>
<p><a href="https://nitpum.com/style/" title="About Us">Style</a></p>
]]></description>
		</item><item>
			<title>แก้ปัญหา KERNEL32.dll Discord </title>
			<link>https://nitpum.com/post/fix-discord-kernel32dll/</link>
			<pubDate>Fri, 27 Oct 2017 23:47:00 +0700</pubDate>
			
			<guid>https://nitpum.com/post/fix-discord-kernel32dll/</guid>
			<description><![CDATA[<h2 id="สาเหต">
	<a href="#%e0%b8%aa%e0%b8%b2%e0%b9%80%e0%b8%ab%e0%b8%95" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		สาเหตุ
</h2>
<p>สำหรับใครที่กำลังจะติดตั้งหรือใช้งาน Discord แล้วเจอปัญหา Error <strong>&ldquo;KERNELL32.Dll&rdquo;</strong> สามารถแก้ปัญหานี้ได้ง่ายๆ ครับเพียงแค่ดาวน์โหลดอัพเดทระบบของวินโดมาลงครับ</p>
<h2 id="ลงกดาวนโหลด">
	<a href="#%e0%b8%a5%e0%b8%87%e0%b8%81%e0%b8%94%e0%b8%b2%e0%b8%a7%e0%b8%99%e0%b9%82%e0%b8%ab%e0%b8%a5%e0%b8%94" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ลิงก์ดาวน์โหลด
</h2>
<p>สำหรับคอม 32bit: <a href="https://www.microsoft.com/en-us/download/details.aspx?id=26767" target="_blank" rel="noopener">https://www.microsoft.com/en-us/download/details.aspx?id=26767</a><br>
สำหรับคอม 64bit: <a href="https://www.microsoft.com/en-us/download/details.aspx?id=26764" target="_blank" rel="noopener">https://www.microsoft.com/en-us/download/details.aspx?id=26764</a></p>
<p>กดเข้าไปตามลิงก์ด้านบนจากนั้นเลื่อนลงมาข้างล่าง กดที่ปุ่ม Download เมื่อโหลดเสร็จก็กดติดตั้ง<br>
หลังจากติดตั้งเสร็จแล้วก็สามารถติดตั้งหรือเข้า Discord ได้เลยครับ :)</p>
<h2 id="ปญหา-error-0x80070422">
	<a href="#%e0%b8%9b%e0%b8%8d%e0%b8%ab%e0%b8%b2-error-0x80070422" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ปัญหา Error: 0x80070422
</h2>
<p>
<img
  src="https://nitpum.com/post/fix-discord-kernel32dll/images/error_0x80070422.jpg"
  alt="Error 0x80070422"
  loading="lazy"
  
  width="495"
  height="197"
  
/>

</p>
<p>บางท่านเมื่อกดติดตั้งตามขัั้นตอนด้านบน อาจจะเจอปัญหา error: 0x80070422 ขึ้นมา เกิดจากการที่ตัว Services ของ Windows Update ถูกปิดอยู่จึงไม่สามารถติดตั้งอัพเดทได้ครับ</p>
<h3 id="วธแก">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b9%81%e0%b8%81" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีแก้
</h3>
<ol>
<li>เปิด Start menu ขึ้นมา</li>
<li>พิมพ์ค้นหาว่า Services กดเปิดขึ้นมา</li>
<li>เมื่อเปิดขึ้นมาจะมีรายชื่อ Services ต่างๆ ให้หา <strong>Windows Update</strong></li>
<li>คลิกขวาที่ Windows Update กด <strong>Properties</strong></li>
<li>ในแท็บ General ให้ดูแถวๆ ด้านล่าง <strong>Startup type</strong> เปลี่ยนเป็น <strong>Automatic</strong></li>
<li>กด ok</li>
<li>รีสตาร์ทเครื่อง</li>
</ol>
<p>หลังจากรีสตาร์ทเครื่องแล้วก็เสร็จแล้วครับ ทีนี้เมื่อกดติดตั้งไฟล์อัพเดทก็จะไม่เจอปัญหา error: 0x80070422 แล้วครับ</p>
<p>หากใครพบปัญหาอื่นหรืออยากสอบถาม คอมเม้นทิ้งไว้ด้านล่างได้เลยครับ :)</p>
]]></description>
		</item><item>
			<title>LoL แก้หน้าจอ Out of Range หรือจอดำ Black screen </title>
			<link>https://nitpum.com/post/lol-out-of-range-blackscreen/</link>
			<pubDate>Thu, 29 Jun 2017 12:30:00 +0700</pubDate>
			
			<guid>https://nitpum.com/post/lol-out-of-range-blackscreen/</guid>
			<description><![CDATA[<p>ปัญหานี้แก้ด้วยการปรับหน้าจอเกมออกจากโหมดเต็มหน้าจอ(Full screen) เป็นโหมด Borderless หรือ โหมด Window โดยวิธีการก็ทำได้ดังนี้</p>
<h2 id="วธแก">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b9%81%e0%b8%81" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีแก้
</h2>
<p><strong>วิธีที่ 1 :</strong> กดปุ่ม <code>Alt</code> + <code>Enter</code> ในขณะที่จอดำ เพื่อให้ตัวเกมออกจากโหมดเต็มจอ(Full screen)<br>
<strong>วิธีที่ 2 :</strong> หากวิธีที่ 1 ไม่ได้ผลให้ให้ทำตามดังต่อไปนี้</p>
<ol>
<li>เข้าไปในโฟลเดอร์เกม League of Legends ที่ติดตั้งไว้<br>
โดยปกติแล้วจะอยู่ที่ <code>C:/Program Files (x86)/GarenaLoLTH/</code></li>
<li>จากนั้นเข้าไปที่ <code>/Apps/LoLTH/Game/Config</code></li>
<li>เปิดไฟล์ <code>game.cfg</code> ด้วย Notepad</li>
<li>ค้นหาคำว่า <code>WindowMode</code></li>
<li>ให้แก้จาก <code>WindowMode=0</code> เป็น <code>WindowMode=2</code> ดังรูป

<img
  src="https://nitpum.com/post/lol-out-of-range-blackscreen/images/WindowMode2.jpg"
  alt="Set window mode to 2"
  loading="lazy"
  
  width="650"
  height="100"
  
/>

</li>
<li>จากนั้น <strong>save</strong> และ <strong>เปิดเกมใหม่</strong> ก็เรียบร้อยแล้วครับ<br>
แต่อย่าลืมไปลองทดสอบดูก่อนนะครับ :)</li>
</ol>
]]></description>
		</item><item>
			<title>แก้ปัญหา Discord ลงไม่ได้ Installaion has failed</title>
			<link>https://nitpum.com/post/discord-installaion-has-failed/</link>
			<pubDate>Sat, 17 Jun 2017 20:11:00 +0700</pubDate>
			
			<guid>https://nitpum.com/post/discord-installaion-has-failed/</guid>
			<description><![CDATA[<p>สวัสดีครับบทความนี้จะมาบอก<strong>วิธีแก้ปัญหา</strong> สำหรับใครที่ติดตั้ง Discord แล้วพบปัญหา <strong>Installation has failed</strong>  เพื่อนผมพึง Reset this PC เพื่อล้างคอมลง Windows ใหม่แล้วเจอปัญหานี้ก็เลยแชร์วิธีการแก้เผื่อมีประโยชน์กับคนที่ติดปัญหานี้เหมือนกัน</p>
<p>
<img
  src="https://nitpum.com/post/discord-installaion-has-failed/images/error.jpg"
  alt="Error"
  loading="lazy"
  
  width="359"
  height="173"
  
/>

</p>
<h2 id="สาเหต">
	<a href="#%e0%b8%aa%e0%b8%b2%e0%b9%80%e0%b8%ab%e0%b8%95" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		สาเหตุ
</h2>
<p>ปัญหานี้เกิดจากการที่มีตัวไฟล์ของโปรแกรม Discord อยู่บนเครื่องอยู่แล้วแต่ตัวโปรแกรมไม่สมบูรณ์หรือเสียหาย ส่วนมากมักจะเจอกับคนที่พึ่งลง Windows ใหม่ หรือ Reset Windows มาหรือมีไฟล์โปรแกรมเก่าค้างอยู่ในเครื่อง</p>
<h2 id="วธแก">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b9%81%e0%b8%81" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีแก้
</h2>
<p>ต้องลบตัวไฟล์โปรแกรมที่มีอยู่ทั้งหมดออกไปครับ โดยปกติแล้วจะอยู่ที่ <code>%AppData%/Discord</code> และ <code>%AppData%/../local/Discord</code></p>
<ol>
<li>
<p>เช็คให้แน่ใจว่าโปรแกรมไม่ได้ค้างเปิดอยู่ในเครื่องรวมไปถึง<strong>ไม่ได้เปิดในบราวเซอร์</strong>ด้วยครับ เช็คได้จาก <strong>Task manager</strong> ครับ (กดปุ่ม <code>Ctrl</code> + <code>Shift</code> + <code>Esc</code>)<br>
อย่าลืมกด <strong>More details ด้วยนะครับ</strong><br>
ถ้าเปิดอยู่ก็กด End task ไปครับ<br>

<img
  src="https://nitpum.com/post/discord-installaion-has-failed/images/task-manager-more-details.jpg"
  alt="Default Task manager"
  loading="lazy"
  
  width="458"
  height="455"
  
/>

</p>
<p>
<img
  src="https://nitpum.com/post/discord-installaion-has-failed/images/taskmanger.jpg"
  alt="Full task manager"
  loading="lazy"
  
  width="512"
  height="430"
  
/>

</p>
</li>
<li>
<p>เมื่อโปรแกรมไม่ได้เปิดอยู่ก็เริ่มลบโปรแกรมกันครับ</p>
</li>
<li>
<p>เปิด <strong>Run</strong> ขึ้นมา (กดปุ่ม Start + R) (ปุ่ม Start คือปุ่มรูป ธง ด้านซ้ายล่างของแป้นพิมพ์ครับ)</p>
</li>
<li>
<p>พิมพ์ในช่องว่า <strong>%appdata%</strong> แล้วกด <strong>OK</strong><br>

<img
  src="https://nitpum.com/post/discord-installaion-has-failed/images/windows_run.jpg"
  alt="Windwos Run"
  loading="lazy"
  
  width="399"
  height="206"
  
/>

</p>
</li>
<li>
<p>จะขึ้นหน้าต่างใหม่ขึ้นมา จากนั้นหาโฟลเดอร์ <strong>Discord</strong> แล้ว <strong>Delete</strong> ทิ้งไปเลยครับ<br>
(ถ้าลบไม่ได้แสดงว่าตัวโปรแกรมยังเปิดอยู่ครับให้ปิดไปก่อน)</p>
</li>
<li>
<p>จากนั้นเปิด <strong>Run</strong> ขึ้นมาอีกทีครับ</p>
</li>
<li>
<p>คร่าวนี้พิมพ์ว่า <code>%appdata%/../Local</code> แล้วกด <strong>OK</strong></p>
</li>
<li>
<p>จะมีหน้าต่างขึ้นมาหาโฟลเดอร์ <strong>Discord</strong> แล้ว <strong>Delete</strong> ทิ้งไปครับ</p>
</li>
<li>
<p><strong>Restart</strong> คอมใหม่ แค่นี้ก็เรียบร้อยแล้วครับ</p>
</li>
</ol>
]]></description>
		</item><item>
			<title>วิธีใช้ Discord ฉบับเร่งรีบ เพื่อนบอกให้ใช้</title>
			<link>https://nitpum.com/post/quickly-use-discord_2/</link>
			<pubDate>Fri, 02 Jun 2017 23:01:00 +0700</pubDate>
			
			<guid>https://nitpum.com/post/quickly-use-discord_2/</guid>
			<description><![CDATA[<p>&ldquo;คุยกันผ่าน Discord นะ&rdquo; เชื่อว่าต้องมีคนเคยได้ยินคำพูดนี้แล้วแต่ไม่รู้ว่าต้องทำยังไงแน่นอน<br>
ผมจึงเขียนบทความนี้เขียนมาเพื่อคนที่ต้องการใช้โปรแกรมนี้แบบเร่งรีบอารมณ์เพื่อนเรียกบวกแต่บอกให้คุยผ่าน Discord นะ</p>
<p><a href="https://discord.com/" target="_blank" rel="noopener">เว็บหลัก Discord</a></p>
<h2 id="1-ตดตงโปรแกรม">
	<a href="#1-%e0%b8%95%e0%b8%94%e0%b8%95%e0%b8%87%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		1. ติดตั้งโปรแกรม
</h2>
<p>การใช้งาน Discord นั้นสามารถใช้ได้หลายทางครับ</p>
<ul>
<li><a href="https://discord.com/" target="_blank" rel="noopener">ใช้ผ่านเว็บเบราว์เซอร์</a> เข้าไปในเว็บแล้วคลิกที่ปุ่ม Open Discord in your browser</li>
<li><a href="https://discord.com/download" target="_blank" rel="noopener">โหลดลงคอม</a> (Windows, Mac และ Linux)</li>
<li>ใช้ผ่านแอพมือถือ <a href="https://play.google.com/store/apps/details?id=com.discord" target="_blank" rel="noopener">Android</a> และ <a href="https://itunes.apple.com/us/app/discord-chat-for-games/id985746746" target="_blank" rel="noopener">iOS</a></li>
</ul>
<h2 id="2-จากนนกสมครบญช">
	<a href="#2-%e0%b8%88%e0%b8%b2%e0%b8%81%e0%b8%99%e0%b8%99%e0%b8%81%e0%b8%aa%e0%b8%a1%e0%b8%84%e0%b8%a3%e0%b8%9a%e0%b8%8d%e0%b8%8a" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		2. จากนั้นก็สมัครบัญชี
</h2>
<p>ส่วนวิธีสมัครผมขอไม่บอกนะครับ เหมือนสมัครเกมนั้นแหละครับ อย่าลืมไปยืนยันอีเมล์กันด้วยนะครับ</p>
<h2 id="3-ลอคอนเขาโปรแกรมเลย">
	<a href="#3-%e0%b8%a5%e0%b8%ad%e0%b8%84%e0%b8%ad%e0%b8%99%e0%b9%80%e0%b8%82%e0%b8%b2%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1%e0%b9%80%e0%b8%a5%e0%b8%a2" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		3. ล็อคอินเข้าโปรแกรมเลย
</h2>
<h2 id="4-วธเขาเซฟเวอร">
	<a href="#4-%e0%b8%a7%e0%b8%98%e0%b9%80%e0%b8%82%e0%b8%b2%e0%b9%80%e0%b8%8b%e0%b8%9f%e0%b9%80%e0%b8%a7%e0%b8%ad%e0%b8%a3" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		4. วิธีเข้าเซิฟเวอร์
</h2>
<p>โดยปกติแล้วคนที่ชวนจะให้<strong>ลิงก์เซิฟเวอร์</strong>มาด้วยครับใช้สำหรับเข้าเซิฟเวอร์ หน้าตาประมาณนี้ <code>discord.gg/ABCD</code></p>
<p>วิธีเข้าก็ตามนี้ครับ</p>
<ol>
<li>
<p>ซ้ายมือด้านบนของโปรแกรมจะมี ปุ่มวงกลมที่มีเครื่องหมายบวก คลิกปที่ปุ่มนั้น</p>
</li>
<li>
<p>จะมีหน้าต่างโผล่ขึ้นมาให้กดปุ่ม Join a Server</p>
</li>
<li>
<p>ใส่ลิงก์เซิฟเวอร์ ที่เพื่อนให้เรามาครับ (ตัวอย่าง: <code>discord.gg/ABCD</code>)</p>

    
    <video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/quickly-use-discord_2/videos/join_a_server.mp4" type="video/mp4">
    	
    	
    	
    </video>

</li>
<li>
<p>จะมี วงกลมเซิฟเวอร์ เพิ่มขึ้นมา (ไอคอนเซิฟเวอร์ของแต่ละคนจะไม่เหมือนกัน)</p>
</li>
</ol>
<h2 id="5-วธเขาหองคย">
	<a href="#5-%e0%b8%a7%e0%b8%98%e0%b9%80%e0%b8%82%e0%b8%b2%e0%b8%ab%e0%b8%ad%e0%b8%87%e0%b8%84%e0%b8%a2" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		5. วิธีเข้าห้องคุย
</h2>
<ol>
<li>
<p>คลิกที่ วงกลมเซิฟเวอร์ ที่เพิ่มขึ้นมา</p>
</li>
<li>
<p>ดูที่ด้านซ้ายครับเลื่อนหาห้องที่มีรูปลำโพงอยู่จะเป็น Voice channel สามารถเข้าไปพูดเปิดไมค์ได้ครับ</p>
<p>
<img
  src="https://nitpum.com/post/quickly-use-discord_2/images/discord_join_voice_ch.jpg"
  alt="Join discord voice channel"
  loading="lazy"
  
  width="224"
  height="237"
  
/>

</p>
</li>
<li>
<p>กดเข้าห้องก็คุยกับเพื่อนได้แล้วครับ <strong>พร้อมลุย !</strong><br>
3.1 ห้องที่มีรูปลำโพงคือ Voice Channel เป็นห้องสำหรับเปิดไมค์คุยครับ<br>
3.2 ห้องที่มี # อยู่ด้านหน้าคือ Text Channel เป็นห้องแชทครับ</p>
</li>
</ol>
<p>จบแล้วครับบทความนี้ ส่วนวิธีใช้งานเต็ม ๆ จะเขียนแยกเป็นอีกบทความนะครับ</p>
]]></description>
		</item><item>
			<title>มาฝาก Static Website ไว้กับ Netlify กันเถอะ</title>
			<link>https://nitpum.com/post/hello-netlify/</link>
			<pubDate>Wed, 15 Mar 2017 19:48:00 +0700</pubDate>
			
			<guid>https://nitpum.com/post/hello-netlify/</guid>
			<description><![CDATA[<p>ช่วงนี้ผมกำลังมองหาโฮสต์ฝาก Static Website แบบฟรีๆ มาลองเล่นอยู่ ว่าจะเอาไปสำรองไว้เผื่อเลิกเขียนบล็อกจาก Blogspot ย้ายไป <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a> จะได้มีที่ฝากบล็อก จริงๆ ก็ใช้ <a href="https://pages.github.com/" target="_blank" rel="noopener">Github Pages</a> ได้อยู่ครับ แต่มันค่อนข้างช้าแถมมีข้อจำกัดอยู่พอสมควร บวกกับอย่างลองของใหม่ด้วย XD</p>
<p>เลยไปลองค้นในกูเกิ้ลดูว่ามีที่อื่นอีกไหมก็เจออยู่หลายตัวเลยครับ แต่ผมชอบ  <a href="https://www.netliy.com/" target="_blank" rel="noopener">Netlify</a>  ที่สุดครับเลยยกมาเขียนในบทความนี้ ส่วนตัวอื่นๆ ไว้ค่อยเขียนอีกทีครับ</p>
<h2 id="พนฐานทควรมกอนอานบทความน">
	<a href="#%e0%b8%9e%e0%b8%99%e0%b8%90%e0%b8%b2%e0%b8%99%e0%b8%97%e0%b8%84%e0%b8%a7%e0%b8%a3%e0%b8%a1%e0%b8%81%e0%b8%ad%e0%b8%99%e0%b8%ad%e0%b8%b2%e0%b8%99%e0%b8%9a%e0%b8%97%e0%b8%84%e0%b8%a7%e0%b8%b2%e0%b8%a1%e0%b8%99" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		พื้นฐานที่ควรมีก่อนอ่านบทความนี้
</h2>
<ul>
<li>การเขียนโค้ด HTML และ CSS</li>
<li>รู้วิธีใช้งาน Git และ Github เบื้องต้น</li>
</ul>
<h2 id="รจก-netlify">
	<a href="#%e0%b8%a3%e0%b8%88%e0%b8%81-netlify" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		รู้จัก Netlify
</h2>
<p>หลายคนอาจจะเคยเห็นหรือเคยได้ยินชื่อนี้กันมาบ้างแล้ว แต่อาจจะยังไม่รู้หรือสงสัยว่า Netlify คืออะไร Netlify เป็นโฮตส์ฝากเว็บไซต์แบบ Static ที่ออกแบบและเน้นอำนวยความสะดวกให้เหล่า developer ใช้งาน การใช้งาน Netlify จึงใช้พวก command line เป็นหลักครับ</p>
<p>นอกจากนี้แล้วยังมีฟีดเจอร์ต่างๆ มากมายให้เราใช้งานกันอีกด้วยครับ ส่วยรายละเอียดฟีดเจอร์เต็มๆ นั้นดูได้ที่ <a href="https://www.netlify.com/features/" target="_blank" rel="noopener">ลิงก์</a></p>
<p><strong>Netlify ให้ CDN ฟรี!</strong> ใช่ครับอ่านไม่ผิดครับ Netlify ให้เว็บเราใช้งาน CDN ได้ฟรีครับ ถ้าใครไม่รู้จัก CDN(Content Delivery Network) หรือถ้าพูดง่ายๆ ก็คือระบบเครือข่ายที่กระจายข้อมูลเว็บไปยังทั่วโลก ทำให้เว็บเราสามารถเข้าจากที่ไหนก็ได้ในโลกได้อย่างรวดเร็วนั้นเองครับ</p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/01.jpg"
  alt="Netlify Global CDN"
  loading="lazy"
  
  width="1077"
  height="510"
  
/>

</p>
<p>นอกจากนี้ยังมี <strong>SSL(Let&rsquo;s Encrypt) ให้เราฟรีอีกด้วย</strong> และเมื่อเราเปิดใช้งาน SSL จะส่งข้อมูลผ่าน <strong>HTTP2</strong> ทำให้เว็บเราเร็วสุดๆ ไปเลยครับ แถมยังมีระบบประวัติเวอร์ชั่นเว็บเรา ที่ให้เราย้อนเว็บกลับไปเป็นแบบเก่าได้อีกด้วย นอกจากนี้เว็บที่ใช้ <strong>static site generator</strong> ไม่จำเป็นต้องสั่ง build เอง แต่ให้ Netlify สั่ง build แทนและอัพขึ้นเน็ตให้ทันที</p>
<p>ทางด้านราคาสำหรับแพลนฟรีถือว่าโอเคครับ มีฟีดเจอร์พื้นฐานให้ครบถ้วน ถ้าใครอยากฟีดเจอร์อื่นๆ เพิ่ม เช่น Advance Proxy Rule กับ Prerendering ต้องเสียเงินครับ <a href="https://www.netlify.com/pricing/" target="_blank" rel="noopener">ดูรายละเอียดเรื่องราคา</a></p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/02.jpg"
  alt="Netfliy plans"
  loading="lazy"
  
  width="1096"
  height="498"
  
/>

</p>
<p>ส่วนเรื่องขอจำกัด พวกแบรดวิด กับ ขนาดของเว็บ ก็ตามนี้เลยครับ<br>
แพลนฟรีได้ แบรดวิน 100GB/เดือน และขนาดเว็บสูงสุด 100GB  ถือว่าเยอะพอสมควรครับ<br>
สำหรับเว็บไซต์ธรรมดาและเว็บบล็อกแค่นี้ก็เพียงพอแล้วครับ <a href="https://www.netlify.com/tos/" target="_blank" rel="noopener">ดูข้อมูลเต็ม</a></p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/03.jpg"
  alt="Netlify Limits"
  loading="lazy"
  
  width="1058"
  height="326"
  
/>

</p>
<h2 id="เรมใชงาน">
	<a href="#%e0%b9%80%e0%b8%a3%e0%b8%a1%e0%b9%83%e0%b8%8a%e0%b8%87%e0%b8%b2%e0%b8%99" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		เริ่มใช้งาน
</h2>
<p>เอาละครับเรามาเริ่มต้นฝากเว็บไว้กับ Netlify กันดูเลยดีกว่า โดยวิธีการฝากเว็บเรานั้นก็มีอยู่ด้วยกัน 3 วิธีครับได้แก่</p>
<ol>
<li>ฝากโค้ดได้กับ Git Hosting (เช่น Github, Bitbucket, Gitlabs เป็นต้น ) แล้วให้ Netlify ดึงไปอีกที</li>
<li>อัพโค้ดลง Netlify โดยตรงผ่าน <a href="https://www.netlify.com/docs/cli/" target="_blank" rel="noopener">CLI (Command line interface) ของ Netlify</a></li>
<li>อัพโค้ดลง Netlify โดยตรงทางเว็บบราวเซอร์</li>
</ol>
<p>ในบทความนี้ผมเลือกที่จะใช้วิธีที่หนึ่งนะครับ เพราะเป็นวิธีที่ไม่ต้องติดตั้งอะไรเพิ่ม และคงคุ้นเคยอยู่แล้วสำหรับคนที่เคยใช้ Github Pages แถมเวลาเรามี commit ใหม่ Netlify ก็จะอัพเดทให้เราเลยครับ</p>
<p>อย่างแรกเราต้องสร้าง Repo ของเว็บเรากันก่อนครับ ในตัวอย่างนี้ผมฝากไว้กับ Github ครับ ใครจะใช้ Bitbucket หรือ Gitlab ก็ได้นะครับ สามตัวนี้ Netlify เชื่อมได้หมดครับ</p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/04.jpg"
  alt="Create new repo on Github"
  loading="lazy"
  
  width="968"
  height="513"
  
/>

</p>
<p>หลังจากนั้นก็โคลนโปรเจคเราลงมา</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git clone https://www.github.com/username/hello-netlify
</span></span></code></pre></div><p>แล้วก็สร้าง index.html กันครับ</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span><span style="color:#75715e">&lt;!DOCTYPE html&gt;</span>
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">html</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">head</span>&gt;
</span></span><span style="display:flex;"><span>        &lt;<span style="color:#f92672">title</span>&gt;Hello Netlify !&lt;/<span style="color:#f92672">title</span>&gt;
</span></span><span style="display:flex;"><span>        &lt;<span style="color:#f92672">style</span>&gt;
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">*</span>{<span style="color:#66d9ef">-webkit-</span><span style="color:#66d9ef">box-sizing</span>:<span style="color:#66d9ef">border-box</span>;<span style="color:#66d9ef">-moz-</span><span style="color:#66d9ef">box-sizing</span>:<span style="color:#66d9ef">border-box</span>;<span style="color:#66d9ef">-ms-</span><span style="color:#66d9ef">box-sizing</span>:<span style="color:#66d9ef">border-box</span>;<span style="color:#66d9ef">box-sizing</span>:<span style="color:#66d9ef">border-box</span>}<span style="color:#f92672">body</span><span style="color:#f92672">,</span><span style="color:#f92672">html</span>{<span style="color:#66d9ef">height</span>:<span style="color:#ae81ff">100</span><span style="color:#66d9ef">%</span>}<span style="color:#f92672">body</span>{<span style="color:#66d9ef">background</span>:<span style="color:#ae81ff">#f4f6f6</span>;<span style="color:#66d9ef">font-family</span>:Roboto,<span style="color:#66d9ef">sans-serif</span>;<span style="color:#66d9ef">color</span>:<span style="color:#ae81ff">#414546</span>;<span style="color:#66d9ef">display</span>:<span style="color:#66d9ef">flex</span>;<span style="color:#66d9ef">align-items</span>:<span style="color:#66d9ef">center</span>;<span style="color:#66d9ef">justify-content</span>:<span style="color:#66d9ef">center</span>}<span style="color:#f92672">p</span>{<span style="color:#66d9ef">margin</span>:<span style="color:#ae81ff">20</span><span style="color:#66d9ef">px</span> <span style="color:#ae81ff">0</span>}.<span style="color:#a6e22e">panel</span>{<span style="color:#66d9ef">background</span>:<span style="color:#ae81ff">#eee</span>;<span style="color:#66d9ef">padding</span>:<span style="color:#ae81ff">40</span><span style="color:#66d9ef">px</span> <span style="color:#ae81ff">60</span><span style="color:#66d9ef">px</span>;<span style="color:#66d9ef">border-radius</span>:<span style="color:#ae81ff">6</span><span style="color:#66d9ef">px</span>;<span style="color:#66d9ef">width</span>:<span style="color:#ae81ff">40</span><span style="color:#66d9ef">em</span>;<span style="color:#66d9ef">margin</span>:<span style="color:#ae81ff">50</span><span style="color:#66d9ef">px</span> <span style="color:#66d9ef">auto</span>;<span style="color:#66d9ef">max-width</span>:<span style="color:#ae81ff">100</span><span style="color:#66d9ef">%</span>}<span style="color:#f92672">a</span><span style="color:#f92672">,</span><span style="color:#f92672">a</span>:<span style="color:#a6e22e">active</span><span style="color:#f92672">,</span><span style="color:#f92672">a</span>:<span style="color:#a6e22e">link</span><span style="color:#f92672">,</span><span style="color:#f92672">a</span>:<span style="color:#a6e22e">visited</span>{<span style="color:#66d9ef">color</span>:<span style="color:#ae81ff">#35a65e</span>;<span style="color:#66d9ef">text-decoration</span>:<span style="color:#66d9ef">none</span>}<span style="color:#f92672">a</span>:<span style="color:#a6e22e">hover</span>{<span style="color:#66d9ef">text-decoration</span>:<span style="color:#66d9ef">underline</span>}
</span></span><span style="display:flex;"><span>        &lt;/<span style="color:#f92672">style</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;/<span style="color:#f92672">head</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">body</span>&gt;
</span></span><span style="display:flex;"><span>        &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;panel&#34;</span>&gt;
</span></span><span style="display:flex;"><span>            &lt;<span style="color:#f92672">h1</span>&gt;Nothing here !&lt;/<span style="color:#f92672">h1</span>&gt;
</span></span><span style="display:flex;"><span>        &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;/<span style="color:#f92672">body</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">html</span>&gt;
</span></span></code></pre></div><p>เสร็จแล้วก็ commit และ push เลยครับ</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git add <span style="color:#e6db74">&#34;index.html&#34;</span>
</span></span><span style="display:flex;"><span>git commit -m <span style="color:#e6db74">&#34;Add index.html&#34;</span>
</span></span><span style="display:flex;"><span>git push -u origin master
</span></span></code></pre></div><h2 id="เชอม-repo-เขากบ-netlify">
	<a href="#%e0%b9%80%e0%b8%8a%e0%b8%ad%e0%b8%a1-repo-%e0%b9%80%e0%b8%82%e0%b8%b2%e0%b8%81%e0%b8%9a-netlify" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		เชื่อม Repo เข้ากับ Netlify
</h2>
<p>ต่อไปเราก็จะเชื่อม Netlify เข้ากับ Repo เว็บเราครับ<br>
ขั่นแรกก็ล็อคอินเข้า Netlify ตามลิงก์นี้ครับ <a href="https://app.netlify.com/" target="_blank" rel="noopener">Login</a></p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/05.jpg"
  alt="Login Netlify"
  loading="lazy"
  
  width="1033"
  height="576"
  
/>

</p>
<p>พอเข้ามาหน้า Dashboard แล้วกด &ldquo;Import an exiting project&rdquo; จะเข้ามาหน้า Import an existing project from a Git repository ครับ</p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/06.jpg"
  alt="New site from git"
  loading="lazy"
  
  width="1096"
  height="487"
  
/>

</p>
<p>ในหน้านี้จะให้เราเลือกว่าจะเอา Repo จากที่ไหนซึ่งก็มี GitHub, GitLab และ Bitbucket ด้วยกันครับ<br>
แน่นอนว่าตัวอย่างนี้เราเอา Repo ฝากไว้กับ Github ขั้นตอนนี้เราจึงเลือก Github ครับ</p>
<p>ถ้าใครต้องการให้ Netlify อ่านแค่ public repo ก็ ติ๊ก ตรงช่อง Limit GitHub access เลยครับ</p>
<p>ในขั้นตอนนี้ไม่ได้หมายความว่าเราเลือก Github แล้ว เว็บต่อไปของเราจะต้องใช้ Github นะครับ จะใช้ตัวอื่นก็ได้ครับ เช่น<br>
เว็บ A ใช้ Github<br>
เว็บ B ใช้ Gitlab<br>
เว็บ C ใช้ Bitbucket<br>
ทาง Netlify จะถามเราทุกครั้งเวลาสร้างเว็บใหม่ครับว่าจะให้ดึง Repo จากที่ไหนครับ</p>
<p>เสร็จแล้วจะมีหน้าต่างยืนยันสิทธิให้ Netlify อ่าน Repo ของเราขึ้นมา กดปุ่ม &ldquo;Authorize application&rdquo; เลยครับ</p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/07.jpg"
  alt="Authorization Github"
  loading="lazy"
  
  width="886"
  height="429"
  
/>

</p>
<p>จากนั้นจะมีรายชื่อ Repo ทั้งหมดขึ้นมา กดเลือก Repo ของเว็บเราครับ</p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/08.jpg"
  alt="Choose repo"
  loading="lazy"
  
  width="1058"
  height="500"
  
/>

</p>
<p>ขั้นตอนต่อไปจะเป็นการตั้งค่าพื้นฐาน</p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/09.jpg"
  alt="Config deploy branch"
  loading="lazy"
  
  width="1047"
  height="609"
  
/>

</p>
<h3 id="branch-to-deploy">
	<a href="#branch-to-deploy" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Branch to deploy
</h3>
<p>เลือก branch ที่เราต้อง deploy ครับ ใครที่มี branch อยู่หลายอันให้เลือกอันที่เราใช้ดีพลอยครับ<br>
(ตรงนี้เหมาะมากสำหรับ static site generator ครับ เช่น มี branch เก็บซอสโค้ด กับ branch ที่ใช้ดีพลอยแยกกัน)<br>
ในบทความนี้เรามีแค่ branch เดียวครับคือ master ครับ เพราะฉนั้นไม่ต้องเลือกอะไรครับ</p>
<h3 id="basic-build-settings">
	<a href="#basic-build-settings" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		Basic build settings
</h3>
<p>สำหรับคนที่ใช้ static site generator ที่ต้องการอัพแค่ซอสโค้ดแล้วให้ Netlify ไป build ให้ก็กำหนดคำสั่งลงในช่อง Build command ครับ เช่น jeklly build เป็นต้น <a href="https://www.netlify.com/docs/continuous-deployment/" target="_blank" rel="noopener">อ่านวิธีใช้งาน</a><br>
ในบทความนี้เป็นแค่เว็บ HTML ธรรมดาครับ ส่วนนี้จึงข้ามไป</p>
<p>กดปุ่ม &ldquo;Deploy site&rdquo; ได้เลยครับ</p>
<p>เสร็จแล้วเราจะมาโผล่หน้าประมาณนี้ครับ ด้านล่างจะมี log การ deploy ให้เราด้วย<br>
ส่วนด้านบนจะมีลิงค์กดดูหน้าเว็บเราครับ</p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/10.jpg"
  alt="Deploy log"
  loading="lazy"
  
  width="1286"
  height="539"
  
/>

</p>
<p>และเมื่อกดเข้าลิงก์เว็บเรา&hellip; เย้ ! ตอนเว็บเราตอนนี้อยู่บน Netlify แล้วครับ<br>
ต่อไปเราจะมาลองอัพเดทหน้าเว็บดูกันครับ</p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/11.jpg"
  alt="Result page"
  loading="lazy"
  
  width="1026"
  height="455"
  
/>

</p>
<h2 id="อพเดทหนาเวบ">
	<a href="#%e0%b8%ad%e0%b8%9e%e0%b9%80%e0%b8%94%e0%b8%97%e0%b8%ab%e0%b8%99%e0%b8%b2%e0%b9%80%e0%b8%a7%e0%b8%9a" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		อัพเดทหน้าเว็บ
</h2>
<p>หลังจากเว็บเราอยู่บน Netlify แล้ว ทีนี้ผมจะมาลองเปลี่ยนข้อความหน้าเว็บดูกันนะครับ<br>
ผมจะเปลี่ยนข้อความตรง panel ใหม่ครับ</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;panel&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">h1</span>&gt;Hello Netlify | nitpum&lt;/<span style="color:#f92672">h1</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://nitpum.com&#34;</span>&gt;← Back to main site&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">div</span>&gt;
</span></span></code></pre></div><p>เสร็จแล้วก็ commit และ push ครับ</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git add <span style="color:#e6db74">&#34;index.html&#34;</span> 
</span></span><span style="display:flex;"><span>git commit -m <span style="color:#e6db74">&#34;Update index.html&#34;</span> 
</span></span><span style="display:flex;"><span>git push origin master 
</span></span></code></pre></div><p>ลองกลับไปดูหน้า Deploys จะเห็นว่า Netlify ดึงคอมมิดใหม่ให้เราแล้วครับ</p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/12.jpg"
  alt="New deployment in deploy page"
  loading="lazy"
  
  width="1336"
  height="610"
  
/>

</p>
<p>ลองกดดูเว็บเราใหม่อีกที&hellip; เย้ ! หน้าเว็บเราอัพเดทแล้วครับ</p>
<p>
<img
  src="https://nitpum.com/post/hello-netlify/images/13.jpg"
  alt="Our website is updated"
  loading="lazy"
  
  width="1110"
  height="282"
  
/>

</p>
<h2 id="เปลยนชอเวบไซต">
	<a href="#%e0%b9%80%e0%b8%9b%e0%b8%a5%e0%b8%a2%e0%b8%99%e0%b8%8a%e0%b8%ad%e0%b9%80%e0%b8%a7%e0%b8%9a%e0%b9%84%e0%b8%8b%e0%b8%95" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		เปลี่ยนชื่อเว็บไซต์
</h2>
<p>หากลองสังเกตุจะเห็นว่าตอนนี้เว็บของเรานั้นใช้ซับโดเมนของ Netlify อยู่ด้วย (<code>nitpum-hello-AXbLk23.netlify.app</code>)
แต่ว่าซับโดเมนที่ให้มามันเป็นข้อความสุ่ม ซึ่งไม่เท่เอาซะเลย&hellip;<br>
วิธีการเปลี่ยนซับโดเมนนั้นก็ง่ายๆ ครับ เพียงแค่กดที่</p>
<p><strong>Site settings -&gt; Domain management -&gt; Domain -&gt; กดปุ่ม Options -&gt; Edit site name -&gt; พิมพ์ชื่อที่เราต้องการลงไป -&gt; Save</strong>  แค่นี้เรียบร้อยแล้ว</p>
<p>แต่ตอนนี้จะเห็นว่าเว็บเรานั้นเข้าได้ทั้ง http และ https นะครับ ถ้าจะให้เข้า http แล้วเปลี่ยนเป็น https เองต้องกำหนด Custom domain ครับก่อนครับ ซึ่งบทความนี้ผมขอยังไม่พูดถึง แต่สามารถอ่านเพิ่มเติมได้ตาม <a href="https://www.netlify.com/docs/custom-domains/" target="_blank" rel="noopener">ลิงก์</a> นี้ครับ</p>
<p>เพียงเท่านี้เราก็ได้เว็บไซต์ของเราแล้ว ทั้งเร็วและมี SSL ด้วยครับ :)<br>
ยังไงถ้าใครมีความคิดเห็นหรือข้อเสนอแนะนำอะไรก็ทิ้งไว้ด้านล่างได้เลยครับ</p>
]]></description>
		</item><item>
			<title>วิธีแสดง FPS เกมบน Steam</title>
			<link>https://nitpum.com/post/fps-steam/</link>
			<pubDate>Sat, 11 Mar 2017 13:20:00 +0700</pubDate>
			
			<guid>https://nitpum.com/post/fps-steam/</guid>
			<description><![CDATA[<p>&ldquo;FPS&rdquo; หรือ &ldquo;Frames per second&rdquo; คือ จำนวนเฟรมภาพที่แสดงต่อหนึ่งวินาที การเล่นเกมจะให้ดีควรมี FPS ในระดับที่พอเหมาะที่เครื่องคอมพิวเตอร์ของเรารับได้ ไม่ควรน้อยเกินไปหรือมากเกินไป เพราะอาจทำให้กินทรัพยากรในเครื่องเราหรือภาพกระตุกได้<br>
เกมบางเกมนั้นมีตัวเลือกให้ตั้งค่าแสดง FPS ได้ในตัว ซึ่งเกมส่วนใหญ่นั้นไม่มี แต่ Steam นั้นมีฟังชั่นพิเศษที่สามารถแสดง FPS บนเกมที่เล่นผ่าน Steam ได้ทุกเกม</p>
<h2 id="วธแสดง-fps-เกมบน-steam">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b9%81%e0%b8%aa%e0%b8%94%e0%b8%87-fps-%e0%b9%80%e0%b8%81%e0%b8%a1%e0%b8%9a%e0%b8%99-steam" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีแสดง FPS เกมบน Steam
</h2>
<ol>
<li>
<p>คลิกที่เมนู &ldquo;Steam&rdquo; ด้านซ้ายบนของโปรแกรม</p>
</li>
<li>
<p>คลิกเมนู &ldquo;Settings&rdquo; (ภาษาไทย &ldquo;การตั้งค่า&rdquo;)</p>
<p>
<img
  src="https://nitpum.com/post/fps-steam/images/01.png"
  alt="เปิดหน้าต่างตั้งค่า"
  loading="lazy"
  
  width="506"
  height="270"
  
/>

</p>
</li>
<li>
<p>จะมีหน้าต่างการตั้งค่าขึ้นมา</p>
</li>
<li>
<p>คลิกที่ &ldquo;In-Game&rdquo; (ภาษาไทย &ldquo;ในเกม&rdquo;)</p>
</li>
<li>
<p>ดูที่ &ldquo;In-game FPS counter&rdquo; (ภาษาไทย &ldquo;แสดงโอเวอร์เลย์ตรวจสอบประสิทธิภาพ&rdquo;)  เลือกตำแหน่งที่ต้องการให้ FPS แสดงในเกม<br>

<img
  src="https://nitpum.com/post/fps-steam/images/02.png"
  alt="หน้าต่างตั้งค่า"
  loading="lazy"
  
  width="850"
  height="722"
  
/>


ใครต้องการให้แสดงตรงไหนเลือกได้ตามใจชอบเลยครับ โดยจะมีตัวเลือกให้ดังนี้</p>
<ul>
<li><strong>Off/ปิด</strong>: ปิดการแสดง FPS</li>
<li><strong>Top-left/บนซ้าย</strong>: แสดง FPS ด้านซ้ายบน</li>
<li><strong>Top-right/บนขวา</strong>: แสดง FPS ด้านขวาบน</li>
<li><strong>Bottom-right/ล่างขวา</strong>: แสดง FPS ด้านขวาล่าง</li>
<li><strong>Bottom-left/ล่างซ้าย</strong>: แสดง FPS ด้านซ้ายล่าง</li>
</ul>
</li>
<li>
<p>ลองกดเข้าเล่นเกมดูครับ ของผมเลือก Top-right (ด้านขวาบน) จะได้หน้าตาประมาณนี้ครับ</p>
<p>
<img
  src="https://nitpum.com/post/fps-steam/images/03.jpg"
  alt="เปิดหน้าต่างตั้งค่า"
  loading="lazy"
  
  width="295"
  height="165"
  
/>

</p>
</li>
</ol>
<p>ถึงแม้เกมนั้นจะไม่มีตัวเลือกให้เราตั้งค่าก็ตาม ขอเพียงแค่เกมนั้นเล่นผ่านระบบของ Steam เท่านี้เราก็มี FPS แสดงให้เราเห็นได้แล้วครับ 🙂 ใครมีความคิดเห็น หรือขอเสนออะไร สามารถคอมเม้นได้ด้านล่างเลยครับ</p>
]]></description>
		</item><item>
			<title>วิธีเล่นแพตช์ใหม่ Public Beta Test Dead by Daylight ก่อนใคร</title>
			<link>https://nitpum.com/post/14-public-test-build-dead-by-daylight/</link>
			<pubDate>Mon, 06 Feb 2017 19:54:00 +0700</pubDate>
			
			<guid>https://nitpum.com/post/14-public-test-build-dead-by-daylight/</guid>
			<description><![CDATA[<p>คงปฏิเสธกันไม่ได้ครับว่าเวลา Dead by Daylight มีข่าวเกี่ยวกับแพตช์ใหม่มาก็อยากจะเล่นกันเร็วๆใช่ไหมละครับ แน่นอนว่ากว่าจะอัพเดททางผู้พัฒนาเกมก็ต้องเทสกันก่อนซึ่งค่อนข้างนาน ดังนั้นผู้พัฒนาจึงได้เปิดเบต้าให้คนเข้าไปช่วยกันร่วมทดลองเทสเล่นก่อน ซึ่งวิธีการเข้าไปทดลองเล่นนั้นก็ง่ายมากๆ เพียงแค่โหลดตัวเกมเบต้าหรือที่เรียกว่า Public Test (Beta) มาลงแค่นั้นเอง  วิธีโหลดก็ตามข้างล่างเลยครับ</p>
<p><strong>หมายเหต</strong> : การเล่น Public Test นั้นจะต้องโหลดตัวเกม Public Test มาลง ซึ่งจะทับกับตัวเกมปกติทำให้สลับกลับไปมาระหว่างสองตัวเกมไม่ได้ ต้องเลือกเล่นเฉพาะตัวเกมใดตัวเกมหนึ่งเท่านั้น</p>
<h2 id="วธตดตงตวเกม-public-test-build">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b8%95%e0%b8%94%e0%b8%95%e0%b8%87%e0%b8%95%e0%b8%a7%e0%b9%80%e0%b8%81%e0%b8%a1-public-test-build" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีติดตั้งตัวเกม Public Test Build
</h2>
<ol>
<li>
<p>คลิกขวาเกม Dead by Daylight แล้วกด Properties (ภาษาไทยคือ คุณสมบัติ)

    
    <video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/14-public-test-build-dead-by-daylight/videos/01.mp4" type="video/mp4">
    	
    	
    	
    </video>
</p>
</li>
<li>
<p>กดไปที่แท็บ &ldquo;Betas&rdquo; หรือ &ldquo;เบต้า&rdquo;</p>

    
    <video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/14-public-test-build-dead-by-daylight/videos/02.mp4" type="video/mp4">
    	
    	
    	
    </video>

</li>
<li>
<p>3.1 พิมพ์โค๊ดในช่องว่างว่า <code>DbdPublicTest</code><br>
3.2 กด Check Code</p>
<p>3.3 กดที่ NONE เปลี่ยนเป็น public-beta

    
    <video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/14-public-test-build-dead-by-daylight/videos/03.mp4" type="video/mp4">
    	
    	
    	
    </video>
</p>
</li>
<li>
<p>จากนั้นรอตัวเกมโหลดตัวเกม Public Test Build ลง เพียงเท่านี้เราก็เล่นแพตช์ Public Test Build ได้แล้ว</p>
<figure><img src="/post/14-public-test-build-dead-by-daylight/images/downloading-update.jpg"
        alt="ดาวน์โหลดอัพเดท">
    </figure>

</li>
</ol>
<h2 id="วธถอดการตดตง-public-test-build-กลบไปตวเกมปกต">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b8%96%e0%b8%ad%e0%b8%94%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%95%e0%b8%94%e0%b8%95%e0%b8%87-public-test-build-%e0%b8%81%e0%b8%a5%e0%b8%9a%e0%b9%84%e0%b8%9b%e0%b8%95%e0%b8%a7%e0%b9%80%e0%b8%81%e0%b8%a1%e0%b8%9b%e0%b8%81%e0%b8%95" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีถอดการติดตั้ง Public Test Build กลับไปตัวเกมปกติ
</h2>
<ol>
<li>
<p>ทำแบบเดียวกับตอนติดตั้งตัวเกม Public Test เลยครับ เพียงแต่ในแท็บ Betas เปลี่ยนจาก public-beta เป็น NONE แค่นั้นเอง</p>

    
    <video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/14-public-test-build-dead-by-daylight/videos/back-to-normal-build.mp4" type="video/mp4">
    	
    	
    	
    </video>

</li>
<li>
<p>จากนั้นรอโหลดตัวเกมปกติมาใหม่ก็กลับมาเล่นตัวเกมปกติได้แล้วครับ</p>
<figure><img src="/post/14-public-test-build-dead-by-daylight/images/downloading-update.jpg"
        alt="ดาวน์โหลดอัพเดท">
    </figure>

</li>
</ol>
<p>จบแล้วครับสำหรับวิธีการเล่น Public Test เพียงเท่านี้เวลามีคอนเท็นใหม่หรืออัพเดทใหม่ที่กำลังจะมา เช่น ตัวละครใหม่, แมพใหม่ หรือ ไอเทมใหม่อะไรพวกนี้เราก็จะได้เล่นก่อนใครเลย</p>
]]></description>
		</item><item>
			<title>วิธีอัด Replay LoL ด้วย SkinSpotLights Replay</title>
			<link>https://nitpum.com/post/replay-lol-skinspotlights/</link>
			<pubDate>Sat, 21 Nov 2015 17:00:00 +0000</pubDate>
			
			<guid>https://nitpum.com/post/replay-lol-skinspotlights/</guid>
			<description><![CDATA[<div class="notice update">
  ปัจจุบันตัวเกมสามารถอัดรีเพลย์ได้เองแล้ว ผู้พัฒนาโปรแกรม SkinSpotLight จึงหยุดอัพเดทตัวโปรแกรมและแนะนำให้อัดรีเพลย์ผ่านตัวเกมแทน
</div>

<p>หลายคนที่เล่นเกม League of Legends คงจะเคยเจอช็อดสำคัญต่างๆไม่ว่าจะเป็น ได้แต้ม Pentakill ช็อตเฟว ช็อตตลกๆ ของเพื่อน และอยากเก็บเอาไว้ดูทีหลัง แต่เกม League of Legends นั้นไม่ได้มีตัวอีดรีเพลย์ให้อัตโนมัติ บางครั้งเราจำเป็นต้องเปิดโปรแกรมอัดวิดีโอหน้าจอเพื่ออัดเหตการณ์เหล่านั้นไว้ ซึ่งต้องแลกมากับการที่เครื่องเราต้องถูกใช้งานอย่างหนัก</p>
<p>ในบทความนี้ผมจะมาพูดถึงถ่ายรีเพลย์ (Replay) ในเกม League of Legends หรือ LoL ด้วยการใช้งานโปรแกรม SkinSpotLights กันนะครับ</p>
<h2 id="ขอดของการอดรเพลยดวย-skinspotlight">
	<a href="#%e0%b8%82%e0%b8%ad%e0%b8%94%e0%b8%82%e0%b8%ad%e0%b8%87%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%ad%e0%b8%94%e0%b8%a3%e0%b9%80%e0%b8%9e%e0%b8%a5%e0%b8%a2%e0%b8%94%e0%b8%a7%e0%b8%a2-skinspotlight" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ข้อดีของการอัดรีเพลย์ด้วย SkinSpotLight
</h2>
<ul>
<li>ไม่กินสเปคคอมมาก</li>
<li>ใช้งานง่าย</li>
<li>สามารถดูและสำรวจแผนที่ได้ทั้งหมด</li>
<li>กดดูย้อนหลังหรือหยุดดูช็อดต่างๆได้</li>
<li>ดู Replay ในโหมดผู้ชม (เหมือนเราดูเพื่อนเล่นอยู่)</li>
</ul>
<h2 id="การตดตง">
	<a href="#%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%95%e0%b8%94%e0%b8%95%e0%b8%87" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		การติดตั้ง
</h2>
<ol>
<li>กดเข้าไปโหลดโปรแกรมตามลิงค์ <a href="http://www.skinspotlights.com/p/skinspotlights-replays.html" target="_blank" rel="noopener">http://www.skinspotlights.com/p/skinspotlights-replays.html</a> เมื่อกดเข้าไปในลิงค์ ให้เลื่อนลงมาข้างล่างจะเจอลิงค์ดาวน์โหลดโปรแกรมเวอร์ชั่นต่างๆ</li>
</ol>


<video preload="auto"  autoplay loop muted  width="100%" >
	
		<source src="https://nitpum.com/post/replay-lol-skinspotlights/videos/01-download-link.webm" type="video/webm">
	
	
</video>

<ol start="2">
<li>
<p>กดเลือกโหลดเวอร์ชั่นใหม่ ดู Patch ให้ตรงกับเกมของเราด้วยนะครับ</p>
</li>
<li>
<p>หลังจากโหลดมาแล้วเราจะได้ไฟลล์ .zip ของโปรแกรมมา</p>
</li>
<li>
<p>แตกไฟลล์ออกมากเราจะได้ไฟลล์โปรแกรมเป็น .exe ครับและไม่จำเป็นต้องลงโปรแกรม</p>
</li>
</ol>
<h2 id="การตงคา">
	<a href="#%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%95%e0%b8%87%e0%b8%84%e0%b8%b2" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		การตั้งค่า
</h2>
<p>เพื่อให้การใช้งานโปรแกรมเป็นไปอย่างราบรื่นและไม่มีปัญหาในการอัดรีเพลย์ เราจึงจำเป็นต้องตั้งค่าตัวโปรแกรมเพื่อความถูกต้องสมบูรณ์
หากไม่ทำการตั้งค่าบางครั้งรีเพลย์จะอัดไม่ติดนะครับ</p>
<ol>
<li>
<p>คลิกขวาที่โปรแกรม</p>
</li>
<li>
<p>กด Properties</p>
</li>
</ol>
<p>
<img
  src="https://nitpum.com/post/replay-lol-skinspotlights/images/raw-04.jpg"
  alt="Right click to properties"
  loading="lazy"
  
  width="259"
  height="389"
  
/>

</p>
<ol start="3">
<li>กดไปที่แท็บ Compatibillity
ต่อด้วยติ๊กถูกที่ช่อง Run the program as an adminstrator
แล้วกด OK</li>
</ol>


<video preload="auto"    muted  width="100%" ><source src="https://nitpum.com/post/replay-lol-skinspotlights/videos/set-adminstrator.mp4" type="video/mp4">
	
	
	
</video>

<ol start="4">
<li>เมื่อเรากดเข้าโปรแกรมจะมีให้ยืนยัน Adminstrator กด Yes ไปเลยครับ</li>
<li>ไปที่แท็บ Options และตั้งค่าโดยมีรายละเอียดดังนี้ครับ</li>
</ol>
<p>
<img
  src="https://nitpum.com/post/replay-lol-skinspotlights/images/ssl-option_update_rads.png"
  alt="Options"
  loading="lazy"
  
  width="800"
  height="574"
  
/>

</p>
<p><strong>หมายเลข 1 Game Path</strong></p>
<p>กดปุ่ม Set ตรง Game Path เลือกที่อยู่ของเกม League of legends ที่ลงไว้ในเครื่อง
เข้าไปที่โฟลล์เดอร์ที่เราลง League of Legends ไว้
โดยปกติแล้วไฟล์จะอยู่ประมาณนี้</p>
<p><strong>ตัวเกมใหม่:</strong> <code>C:\Program Files\GarenaLoLLCUTH\GameData\Apps\LoLLCUTH\Game\</code></p>
<p><strong>ตัวเกมเก่า:</strong> <code>C:\Program Files\GarenaLoLTH\GameData\Apps\LoLTH\Game\</code></p>
<p>ในส่วนนี้แนะนำให้ใช้ตัวเกมใหม่ เนื่องจากตัวโปรแกรมรีเพลย์เริ่มไม่ซัพพอตตัวเกมแบบเก่าแล้ว
จากนั้นเลือก League of Legends.exe แล้วกด Open** หากไม่เห็นไฟลล์ League of Legends.exe
ให้กดเปลี่ยนสกุลไฟลล์จาก LoL Launcher.exe ไปเป็น Any EXE ดูตามภาพข้างล่างนี้นะครับ</p>


<video preload="auto"  autoplay loop muted  width="100%" ><source src="https://nitpum.com/post/replay-lol-skinspotlights/videos/find-lol.mp4" type="video/mp4">
	
	
	
</video>

<p><strong>หมายเลข 2 Replay Path</strong> ให้เราเลือกโฟลเดอร์ที่เราต้องการจะเก็บไฟลล์รีเพลย์ไว้ครับ</p>
<p><strong>หมายเลข 3 Record Spectated Game</strong>
หากต้องการจะอัดรีเพลย์ในตอนที่เราดูคนอื่นเล่นด้วยให้กดเปิดส่วนนี้ไว้นะครับ</p>
<p><strong>หมายเลข 4 Use RADS</strong> ตรงนี้สำหรับใครที่เล่นเซิฟไทยหรือเล่นเซิฟของการีน่าให้กดปิดไปนะครับ แต่ถ้าใครที่เล่นเซิฟนอกเช่น อเมริกา, ญี่ปุ่น เป็นต้น ให้เปิดส่วนนี้ไว้นะครับ</p>
<h2 id="วธการอด-replay-lol">
	<a href="#%e0%b8%a7%e0%b8%98%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%ad%e0%b8%94-replay-lol" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		วิธีการอัด Replay LoL
</h2>
<p>สำหรับวิธีการอัดรีเพลย์ก็ไม่ยากนะครับ เพียงแค่เปิดโปรแกรม SkinSpoltLights ก่อนเข้าหน้าโหลดเกม ตัวโปรแกรมจะอัดรีเพลย์ให้เราอัตโนมัติเลยครับ เปิดค้างไว้ตลอดนะครับ</p>
<p>หลังจากจบเกมแล้วไม่ควรรีบปิดโปรแกรมทันทีนะครับ เนื่องจากหลังจากจบเกมโปรแกรมยังคงประมวลผลรีเพลย์เราอยู่นะครับ ควรรอสักพักหนึ่งก่อน จนชื่อรีเพลย์ของเราขึ้นชื่อตัวละครที่เราเล่นนะครับ โปรแกรมถึงจะประมวลผลเสร็จแล้ว</p>
<h2 id="ขอควรร">
	<a href="#%e0%b8%82%e0%b8%ad%e0%b8%84%e0%b8%a7%e0%b8%a3%e0%b8%a3" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		ข้อควรรู้
</h2>
<p>บางครั้งหากพับโปรแกรมไป โปรแกรมจะไปอยู่ที่ลูกศรขวาล่างของหน้าจอนะครับ</p>
<p>
<img
  src="https://nitpum.com/post/replay-lol-skinspotlights/images/tray.jpg"
  alt="Programe in tray icon"
  loading="lazy"
  
  width="138"
  height="163"
  
/>

</p>
<h2 id="การดรเพลย">
	<a href="#%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%94%e0%b8%a3%e0%b9%80%e0%b8%9e%e0%b8%a5%e0%b8%a2" class="anchor-link" aria-label="Anchor"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a>
		การดูรีเพลย์
</h2>
<p>รีเพลย์ต่างๆจะเรียงอยู่ด้านซ้ายนะครับ
กดเลือก Replay ที่เราต้องการจะดูจากนั้นกด Play replay
<strong>** หลังจากอัดรีเพลย์เสร็จใหม่ๆ ไฟลล์จะยังประมวลผลอยู่ จะดูได้ตอนที่ชื่อไฟลล์ปรากฏชื่อตัวละครที่เราเล่น</strong></p>
<p>
<img
  src="https://nitpum.com/post/replay-lol-skinspotlights/images/replay-leftside.png"
  alt="Replay list"
  loading="lazy"
  
  width="838"
  height="577"
  
/>

</p>
<p>เพียงเท่านี้เราก็สามารถอัดรีเพลย์ขณะเล่นเก็บไว้ดูทีหลังได้แล้วครับ
ขอให้มีความสุขกับการเล่นเกมนะครับ :D</p>
]]></description>
		</item><item>
			<title>Welcome to My Blog</title>
			<link>https://nitpum.com/post/welcome-to-my-blog/</link>
			<pubDate>Sat, 21 Nov 2015 16:48:00 +0700</pubDate>
			
			<guid>https://nitpum.com/post/welcome-to-my-blog/</guid>
			<description><![CDATA[<p>ยินดีต้อนรับเข้าสู่บล็อกของผมนะครับ :D บล็อกนี้มีไว้เพื่อแชร์ประสบการ์ณต่างๆของผม ไม่ว่าจะเป็นการสร้างเกม การออกแบบภาพ การทำเว็บ หรือ อื่นๆตามที่ผมจะเคยทำมานะครับ :D</p>
<p>Welcome to my blog !</p>
]]></description>
		</item></channel>
</rss>
