<rss
      xmlns:atom="http://www.w3.org/2005/Atom"
      xmlns:media="http://search.yahoo.com/mrss/"
      xmlns:content="http://purl.org/rss/1.0/modules/content/"
      xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
      xmlns:dc="http://purl.org/dc/elements/1.1/"
      version="2.0"
    >
      <channel>
        <title><![CDATA[Block of Vaz]]></title>
        <description><![CDATA[Random thought of a System Engineer]]></description>
        <link>https://blog.siamstr.com/author/npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60/</link>
        <atom:link href="https://blog.siamstr.com/author/npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60/rss/" rel="self" type="application/rss+xml"/>
        <itunes:new-feed-url>https://blog.siamstr.com/author/npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60/rss/</itunes:new-feed-url>
        <itunes:author><![CDATA[VΔz]]></itunes:author>
        <itunes:subtitle><![CDATA[Random thought of a System Engineer]]></itunes:subtitle>
        <itunes:type>episodic</itunes:type>
        <itunes:owner>
          <itunes:name><![CDATA[VΔz]]></itunes:name>
          <itunes:email><![CDATA[VΔz]]></itunes:email>
        </itunes:owner>
            
      <pubDate>Fri, 04 Apr 2025 08:42:17 GMT</pubDate>
      <lastBuildDate>Fri, 04 Apr 2025 08:42:17 GMT</lastBuildDate>
      
      <itunes:image href="https://image.nostr.build/ba269bb842d8e1c6ada4ea3f9203aa570f1610cceeaca6a35c281f28274a914a.jpg" />
      <image>
        <title><![CDATA[Block of Vaz]]></title>
        <link>https://blog.siamstr.com/author/npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60/</link>
        <url>https://image.nostr.build/ba269bb842d8e1c6ada4ea3f9203aa570f1610cceeaca6a35c281f28274a914a.jpg</url>
      </image>
      <item>
      <title><![CDATA[ตั้งค่า Dark Theme สำหรับสาย Tilling Window Manager: darkman]]></title>
      <description><![CDATA[หากใครลองใช้ Linux แบบ Custom Windows Manger เองอย่าง Sway / i3 / bspwm จะทราบดีว่าการตั้งค่า Theme นั้นค่อนข้างยุ่งยาก และต้องจัดการเองทุกอย่างตั้งแต่หา Theme ที่จะใช้ บทความนี้จะใช้ `darkman` มาช่วยให้เราตั้งค่า Theme ได้สะดวกยิ่งขึ้น!]]></description>
             <itunes:subtitle><![CDATA[หากใครลองใช้ Linux แบบ Custom Windows Manger เองอย่าง Sway / i3 / bspwm จะทราบดีว่าการตั้งค่า Theme นั้นค่อนข้างยุ่งยาก และต้องจัดการเองทุกอย่างตั้งแต่หา Theme ที่จะใช้ บทความนี้จะใช้ `darkman` มาช่วยให้เราตั้งค่า Theme ได้สะดวกยิ่งขึ้น!]]></itunes:subtitle>
      <pubDate>Fri, 04 Apr 2025 08:42:17 GMT</pubDate>
      <link>https://blog.siamstr.com/post/gg-5vprd4cvzvqxjswqvc/</link>
      <comments>https://blog.siamstr.com/post/gg-5vprd4cvzvqxjswqvc/</comments>
      <guid isPermaLink="false">naddr1qq2kw3edx4m8qunyx33hvknk29vx5u6hw9myxq3qvaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qxpqqqp65wlw4t8u</guid>
      <category>siamstr</category>
      
        <media:content url="https://i.kym-cdn.com/photos/images/original/001/812/989/630.gif" medium="image"/>
        <enclosure 
          url="https://i.kym-cdn.com/photos/images/original/001/812/989/630.gif" length="0" 
          type="image/gif" 
        />
      <noteId>naddr1qq2kw3edx4m8qunyx33hvknk29vx5u6hw9myxq3qvaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qxpqqqp65wlw4t8u</noteId>
      <npub>npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60</npub>
      <dc:creator><![CDATA[VΔz]]></dc:creator>
      <content:encoded><![CDATA[<h2>darkman คืออะไร</h2>
<p><strong>Darkman</strong> เป็นโปรแกรมที่ช่วยควบคุมการเปลี่ยนโหมดสีของเดสก์ท็อประหว่างโหมดมืดและโหมดสว่างบนระบบปฏิบัติการ Unix-like. โปรแกรมนี้จะทำงานในเบื้องหลัง(background process) และสามารถตั้งค่าให้เปลี่ยนไปใช้โหมดมืดเมื่อพระอาทิตย์ตก หรือเปลี่ยนกลับไปใช้โหมดสว่างเมื่อพระอาทิตย์ขึ้นได้</p>
<h2>การทำงานของ Darkman</h2>
<p>เรียกใช้ผ่าน systemd service หรือคำสั่ง <code>darkman run</code> โดยตรงได้เลย</p>
<ol>
<li><strong>การตั้งค่าโหมด</strong>: Darkman สามารถตั้งค่าโหมดปัจจุบันเป็นโหมดมืดหรือโหมดสว่างได้ด้วยคำสั่ง <code>darkman set &lt;light|dark&gt;</code>.</li>
<li><strong>การตรวจสอบโหมดปัจจุบัน</strong>: สามารถตรวจสอบโหมดปัจจุบันได้ด้วยคำสั่ง <code>darkman get</code>.</li>
<li><strong>การสลับโหมด</strong>: สามารถสลับโหมดระหว่างโหมดมืดและโหมดสว่างได้ด้วยคำสั่ง <code>darkman toggle</code>.</li>
<li><strong>การทำงานอัตโนมัติ</strong>: Darkman จะทำงานอัตโนมัติโดยใช้ข้อมูลตำแหน่งที่ตั้งของระบบเพื่อกำหนดเวลาพระอาทิตย์ขึ้นและตก.</li>
<li><strong>การปรับแต่ง</strong>: สามารถเพิ่มสคริปต์เพื่อปรับแต่งการทำงานของโปรแกรมให้เข้ากับแอปพลิเคชันต่างๆ ได้.</li>
</ol>
<h2>การตั้งค่า darkman</h2>
<ol>
<li>สร้างไฟล์ <code>config.yaml</code> ในโฟลเดอร์ <code>~/.config/darkman/</code></li>
</ol>
<pre><code class="language-yaml">lat: 13.7563
lng: 100.5018 # ตำแหน่งกรุงเทพ
usegeoclue: false
dbusserver: true
portal: true
</code></pre>
<ol start="2">
<li>การตั้งค่า portal สำหรับ Darkman</li>
</ol>
<p>จะช่วยให้โปรแกรมสามารถเปลี่ยนโหมดสีของเดสก์ท็อปได้โดยใช้ XDG settings portal API.</p>
<p>2.1 สร้างไฟล์ portals.conf ในโฟลเดอร์ ~/.config/xdg-desktop-portal/</p>
<pre><code class="language-conf">[preferred]
org.freedesktop.impl.portal.Settings=darkman
</code></pre>
<p>2.1 รีสตาร์ท service xdg-desktop-portal เพื่อให้การตั้งค่าใหม่มีผล:</p>
<pre><code class="language-bash">systemctl --user restart xdg-desktop-portal
</code></pre>
<p>การตั้งค่านี้จะช่วยให้แอปพลิเคชันต่างๆ บนเดสก์ท็อปสามารถอ่านค่าโหมดสีจาก Darkman และปรับเปลี่ยนตามที่กำหนด.</p>
<ol start="3">
<li>Custom executables</li>
</ol>
<p>ใน Darkman สามารถเพิ่มการทำงานเพิ่มเติมเมื่อมีการเปลี่ยนโหมดสีของเดสก์ท็อป โดยการวางสคริปต์หรือโปรแกรมที่ต้องการในไดเรกทอรีที่กำหนด</p>
<p><strong>ไดเรกทอรีสำหรับ Custom executables</strong>:</p>
<ul>
<li><code>$XDG_DATA_DIRS/dark-mode.d/</code>: สำหรับสคริปต์ที่ต้องการรันเมื่อเปลี่ยนไปใช้โหมดมืด</li>
<li><code>$XDG_DATA_DIRS/light-mode.d/</code>: สำหรับสคริปต์ที่ต้องการรันเมื่อเปลี่ยนไปใช้โหมดสว่าง</li>
</ul>
<p><strong>ตัวอย่างการใช้งาน Custom executables</strong>:</p>
<ol>
<li><strong>สร้างสคริปต์สำหรับโหมดมืด</strong>:<ul>
<li>สร้างไฟล์ <code>set_dark_mode.sh</code> ในไดเรกทอรี <code>$XDG_DATA_DIRS/dark-mode.d/</code></li>
<li>เพิ่มเนื้อหาดังนี้:</li>
</ul>
</li>
</ol>
<pre><code class="language-bash">#!/bin/bash
# ตัวอย่างสคริปต์สำหรับโหมดมืด
gsettings set org.gnome.desktop.interface gtk-theme "Adwaita-dark"
notify-send "Dark Mode Activated"
</code></pre>
<ol start="2">
<li><strong>สร้างสคริปต์สำหรับโหมดสว่าง</strong>:<ul>
<li>สร้างไฟล์ <code>set_light_mode.sh</code> ในไดเรกทอรี <code>$XDG_DATA_DIRS/light-mode.d/</code></li>
<li>เพิ่มเนื้อหาดังนี้:</li>
</ul>
</li>
</ol>
<pre><code class="language-bash">#!/bin/bash
# ตัวอย่างสคริปต์สำหรับโหมดสว่าง
gsettings set org.gnome.desktop.interface gtk-theme "Adwaita"
notify-send "Light Mode Activated"
</code></pre>
<ol start="3">
<li><strong>ตั้งค่าสิทธิ์การรันสคริปต์</strong>:<ul>
<li>ตั้งค่าสิทธิ์ให้สคริปต์สามารถรันได้:</li>
</ul>
</li>
</ol>
<pre><code class="language-bash">chmod +x $XDG_DATA_DIRS/dark-mode.d/set_dark_mode.sh
chmod +x $XDG_DATA_DIRS/light-mode.d/set_light_mode.sh
</code></pre>
<p>เมื่อ Darkman เปลี่ยนโหมด สคริปต์เหล่านี้จะถูกเรียกใช้งานตามที่กำหนด</p>
<h3>การแก้ไขหากไม่พบ XDG_DATA_DIRS</h3>
<p>หากไม่พบตัวแปร <code>XDG_DATA_DIRS</code> คุณสามารถสร้างไดเรกทอรีที่จำเป็นเองได้ตามต้องการ โดยปกติแล้ว <code>XDG_DATA_DIRS</code> จะประกอบด้วยไดเรกทอรีเหล่านี้:</p>
<ul>
<li><code>~/.local/share/</code></li>
<li><code>/usr/local/share/</code></li>
<li><code>/usr/share/</code></li>
</ul>
<p>คุณสามารถสร้างไดเรกทอรีเหล่านี้และเพิ่มสคริปต์ของคุณได้ตามนี้:</p>
<ol>
<li><strong>สร้างไดเรกทอรี</strong>:<ul>
<li>สร้างไดเรกทอรีสำหรับโหมดมืดและโหมดสว่าง:</li>
</ul>
</li>
</ol>
<pre><code class="language-bash">mkdir -p ~/.local/share/dark-mode.d
mkdir -p ~/.local/share/light-mode.d
</code></pre>
<p><a href="https://github.com/vazw/dotfiles/tree/Void(wayland)/darkman">ตัวอย่าง Script ที่ผมใช้</a></p>
<ol start="2">
<li>ทำการ <strong>export XDG_DATA_DIRS</strong>:</li>
</ol>
<p>โดยทั่วไปเราสามารถตั้งตัวแปร Environments ต่าง ๆ ได้ที่ <code>~/.profile</code> และตัวแปรทั้งหมดจะถูกโหลดหลังจากเรา <strong>Login</strong></p>
<pre><code class="language-bash">export XDG_DATA_DIRS=$HOME/.local/share:/usr/local/share:/usr/share:$XDG_DATA_DIRS
</code></pre>
<p>Source: <a href="https://gitlab.com/WhyNotHugo/darkman">darkman</a></p>
]]></content:encoded>
      <itunes:author><![CDATA[VΔz]]></itunes:author>
      <itunes:summary><![CDATA[<h2>darkman คืออะไร</h2>
<p><strong>Darkman</strong> เป็นโปรแกรมที่ช่วยควบคุมการเปลี่ยนโหมดสีของเดสก์ท็อประหว่างโหมดมืดและโหมดสว่างบนระบบปฏิบัติการ Unix-like. โปรแกรมนี้จะทำงานในเบื้องหลัง(background process) และสามารถตั้งค่าให้เปลี่ยนไปใช้โหมดมืดเมื่อพระอาทิตย์ตก หรือเปลี่ยนกลับไปใช้โหมดสว่างเมื่อพระอาทิตย์ขึ้นได้</p>
<h2>การทำงานของ Darkman</h2>
<p>เรียกใช้ผ่าน systemd service หรือคำสั่ง <code>darkman run</code> โดยตรงได้เลย</p>
<ol>
<li><strong>การตั้งค่าโหมด</strong>: Darkman สามารถตั้งค่าโหมดปัจจุบันเป็นโหมดมืดหรือโหมดสว่างได้ด้วยคำสั่ง <code>darkman set &lt;light|dark&gt;</code>.</li>
<li><strong>การตรวจสอบโหมดปัจจุบัน</strong>: สามารถตรวจสอบโหมดปัจจุบันได้ด้วยคำสั่ง <code>darkman get</code>.</li>
<li><strong>การสลับโหมด</strong>: สามารถสลับโหมดระหว่างโหมดมืดและโหมดสว่างได้ด้วยคำสั่ง <code>darkman toggle</code>.</li>
<li><strong>การทำงานอัตโนมัติ</strong>: Darkman จะทำงานอัตโนมัติโดยใช้ข้อมูลตำแหน่งที่ตั้งของระบบเพื่อกำหนดเวลาพระอาทิตย์ขึ้นและตก.</li>
<li><strong>การปรับแต่ง</strong>: สามารถเพิ่มสคริปต์เพื่อปรับแต่งการทำงานของโปรแกรมให้เข้ากับแอปพลิเคชันต่างๆ ได้.</li>
</ol>
<h2>การตั้งค่า darkman</h2>
<ol>
<li>สร้างไฟล์ <code>config.yaml</code> ในโฟลเดอร์ <code>~/.config/darkman/</code></li>
</ol>
<pre><code class="language-yaml">lat: 13.7563
lng: 100.5018 # ตำแหน่งกรุงเทพ
usegeoclue: false
dbusserver: true
portal: true
</code></pre>
<ol start="2">
<li>การตั้งค่า portal สำหรับ Darkman</li>
</ol>
<p>จะช่วยให้โปรแกรมสามารถเปลี่ยนโหมดสีของเดสก์ท็อปได้โดยใช้ XDG settings portal API.</p>
<p>2.1 สร้างไฟล์ portals.conf ในโฟลเดอร์ ~/.config/xdg-desktop-portal/</p>
<pre><code class="language-conf">[preferred]
org.freedesktop.impl.portal.Settings=darkman
</code></pre>
<p>2.1 รีสตาร์ท service xdg-desktop-portal เพื่อให้การตั้งค่าใหม่มีผล:</p>
<pre><code class="language-bash">systemctl --user restart xdg-desktop-portal
</code></pre>
<p>การตั้งค่านี้จะช่วยให้แอปพลิเคชันต่างๆ บนเดสก์ท็อปสามารถอ่านค่าโหมดสีจาก Darkman และปรับเปลี่ยนตามที่กำหนด.</p>
<ol start="3">
<li>Custom executables</li>
</ol>
<p>ใน Darkman สามารถเพิ่มการทำงานเพิ่มเติมเมื่อมีการเปลี่ยนโหมดสีของเดสก์ท็อป โดยการวางสคริปต์หรือโปรแกรมที่ต้องการในไดเรกทอรีที่กำหนด</p>
<p><strong>ไดเรกทอรีสำหรับ Custom executables</strong>:</p>
<ul>
<li><code>$XDG_DATA_DIRS/dark-mode.d/</code>: สำหรับสคริปต์ที่ต้องการรันเมื่อเปลี่ยนไปใช้โหมดมืด</li>
<li><code>$XDG_DATA_DIRS/light-mode.d/</code>: สำหรับสคริปต์ที่ต้องการรันเมื่อเปลี่ยนไปใช้โหมดสว่าง</li>
</ul>
<p><strong>ตัวอย่างการใช้งาน Custom executables</strong>:</p>
<ol>
<li><strong>สร้างสคริปต์สำหรับโหมดมืด</strong>:<ul>
<li>สร้างไฟล์ <code>set_dark_mode.sh</code> ในไดเรกทอรี <code>$XDG_DATA_DIRS/dark-mode.d/</code></li>
<li>เพิ่มเนื้อหาดังนี้:</li>
</ul>
</li>
</ol>
<pre><code class="language-bash">#!/bin/bash
# ตัวอย่างสคริปต์สำหรับโหมดมืด
gsettings set org.gnome.desktop.interface gtk-theme "Adwaita-dark"
notify-send "Dark Mode Activated"
</code></pre>
<ol start="2">
<li><strong>สร้างสคริปต์สำหรับโหมดสว่าง</strong>:<ul>
<li>สร้างไฟล์ <code>set_light_mode.sh</code> ในไดเรกทอรี <code>$XDG_DATA_DIRS/light-mode.d/</code></li>
<li>เพิ่มเนื้อหาดังนี้:</li>
</ul>
</li>
</ol>
<pre><code class="language-bash">#!/bin/bash
# ตัวอย่างสคริปต์สำหรับโหมดสว่าง
gsettings set org.gnome.desktop.interface gtk-theme "Adwaita"
notify-send "Light Mode Activated"
</code></pre>
<ol start="3">
<li><strong>ตั้งค่าสิทธิ์การรันสคริปต์</strong>:<ul>
<li>ตั้งค่าสิทธิ์ให้สคริปต์สามารถรันได้:</li>
</ul>
</li>
</ol>
<pre><code class="language-bash">chmod +x $XDG_DATA_DIRS/dark-mode.d/set_dark_mode.sh
chmod +x $XDG_DATA_DIRS/light-mode.d/set_light_mode.sh
</code></pre>
<p>เมื่อ Darkman เปลี่ยนโหมด สคริปต์เหล่านี้จะถูกเรียกใช้งานตามที่กำหนด</p>
<h3>การแก้ไขหากไม่พบ XDG_DATA_DIRS</h3>
<p>หากไม่พบตัวแปร <code>XDG_DATA_DIRS</code> คุณสามารถสร้างไดเรกทอรีที่จำเป็นเองได้ตามต้องการ โดยปกติแล้ว <code>XDG_DATA_DIRS</code> จะประกอบด้วยไดเรกทอรีเหล่านี้:</p>
<ul>
<li><code>~/.local/share/</code></li>
<li><code>/usr/local/share/</code></li>
<li><code>/usr/share/</code></li>
</ul>
<p>คุณสามารถสร้างไดเรกทอรีเหล่านี้และเพิ่มสคริปต์ของคุณได้ตามนี้:</p>
<ol>
<li><strong>สร้างไดเรกทอรี</strong>:<ul>
<li>สร้างไดเรกทอรีสำหรับโหมดมืดและโหมดสว่าง:</li>
</ul>
</li>
</ol>
<pre><code class="language-bash">mkdir -p ~/.local/share/dark-mode.d
mkdir -p ~/.local/share/light-mode.d
</code></pre>
<p><a href="https://github.com/vazw/dotfiles/tree/Void(wayland)/darkman">ตัวอย่าง Script ที่ผมใช้</a></p>
<ol start="2">
<li>ทำการ <strong>export XDG_DATA_DIRS</strong>:</li>
</ol>
<p>โดยทั่วไปเราสามารถตั้งตัวแปร Environments ต่าง ๆ ได้ที่ <code>~/.profile</code> และตัวแปรทั้งหมดจะถูกโหลดหลังจากเรา <strong>Login</strong></p>
<pre><code class="language-bash">export XDG_DATA_DIRS=$HOME/.local/share:/usr/local/share:/usr/share:$XDG_DATA_DIRS
</code></pre>
<p>Source: <a href="https://gitlab.com/WhyNotHugo/darkman">darkman</a></p>
]]></itunes:summary>
      <itunes:image href="https://i.kym-cdn.com/photos/images/original/001/812/989/630.gif"/>
      </item>
      
      <item>
      <title><![CDATA[อุปกรณ์ใด ๆ ที่มี…]]></title>
      <description><![CDATA[อุปกรณ์ใด ๆ ที่มีแบตเตอรี่ ควรจะตั้งประจุไฟสูงสุดไว้ที่ 80% ทำให้ถนอมการใช้งานแบตได้มากขึ้น อายุแบตอยู่ได้นานขึ้น จำนวน cycle แบตลดลงอย่างเห็นได้ชัด อย่างในภาพคือ Asus Zenbook 13 ที่ใช้งานมาเกือบสองปี แต่แบตขึ้นมาแค่ 124 cycle อยู่เลย
บน Linux…]]></description>
             <itunes:subtitle><![CDATA[อุปกรณ์ใด ๆ ที่มีแบตเตอรี่ ควรจะตั้งประจุไฟสูงสุดไว้ที่ 80% ทำให้ถนอมการใช้งานแบตได้มากขึ้น อายุแบตอยู่ได้นานขึ้น จำนวน cycle แบตลดลงอย่างเห็นได้ชัด อย่างในภาพคือ Asus Zenbook 13 ที่ใช้งานมาเกือบสองปี แต่แบตขึ้นมาแค่ 124 cycle อยู่เลย
บน Linux…]]></itunes:subtitle>
      <pubDate>Fri, 10 Jan 2025 03:10:49 GMT</pubDate>
      <link>https://blog.siamstr.com/post/note1qrr7w63k038w5efs33ky8egw6l6z3tp2tha77arwtet34awqx54sqvn7w8/</link>
      <comments>https://blog.siamstr.com/post/note1qrr7w63k038w5efs33ky8egw6l6z3tp2tha77arwtet34awqx54sqvn7w8/</comments>
      <guid isPermaLink="false">note1qrr7w63k038w5efs33ky8egw6l6z3tp2tha77arwtet34awqx54sqvn7w8</guid>
      <category>siamstr</category>
      
        <media:content url="https://image.nostr.build/55f8c90f38edc0061351fe51785ec88939e528f806789cd4b09c1cd7d6116bcf.png" medium="image"/>
        <enclosure 
          url="https://image.nostr.build/55f8c90f38edc0061351fe51785ec88939e528f806789cd4b09c1cd7d6116bcf.png" length="0" 
          type="image/png" 
        />
      <noteId>note1qrr7w63k038w5efs33ky8egw6l6z3tp2tha77arwtet34awqx54sqvn7w8</noteId>
      <npub>npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60</npub>
      <dc:creator><![CDATA[VΔz]]></dc:creator>
      <content:encoded><![CDATA[<p>อุปกรณ์ใด ๆ ที่มีแบตเตอรี่ ควรจะตั้งประจุไฟสูงสุดไว้ที่ 80% ทำให้ถนอมการใช้งานแบตได้มากขึ้น อายุแบตอยู่ได้นานขึ้น จำนวน cycle แบตลดลงอย่างเห็นได้ชัด อย่างในภาพคือ Asus Zenbook 13 ที่ใช้งานมาเกือบสองปี แต่แบตขึ้นมาแค่ 124 cycle อยู่เลย<br>บน Linux จะมี Service ที่ทำหน้าที่นี้ได้หลายตัว  แต่ตัวที่ผมเลือกใช้คือ tlp ตั้งค่าได้ทุกอย่างยัน clock CPU<br> <a href="https://image.nostr.build/55f8c90f38edc0061351fe51785ec88939e528f806789cd4b09c1cd7d6116bcf.png" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/55f8c90f38edc0061351fe51785ec88939e528f806789cd4b09c1cd7d6116bcf.png"></a> <br><br><np-embed nostr="nevent1qvzqqqqqqypzqx78pgq53vlnzmdr8l3u38eru0n3438lnxqz0mr39wg9e5j0dfq3qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgwwaehxw309ahx7uewd3hkctcqyrzwhzw9mg0a3edvzrjtssfvhhtt99npzhuwm75ngg3yyfc2kh5ek6n477j"><a href="https://njump.me/nevent1qvzqqqqqqypzqx78pgq53vlnzmdr8l3u38eru0n3438lnxqz0mr39wg9e5j0dfq3qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgwwaehxw309ahx7uewd3hkctcqyrzwhzw9mg0a3edvzrjtssfvhhtt99npzhuwm75ngg3yyfc2kh5ek6n477j">nostr:nevent1qvzqqqqqqypzqx78pgq53vlnzmdr8l3u38eru0n3438lnxqz0mr39wg9e5j0dfq3qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgwwaehxw309ahx7uewd3hkctcqyrzwhzw9mg0a3edvzrjtssfvhhtt99npzhuwm75ngg3yyfc2kh5ek6n477j</a></np-embed><br><a href='/tag/siamstr/'>#siamstr</a></p>
]]></content:encoded>
      <itunes:author><![CDATA[VΔz]]></itunes:author>
      <itunes:summary><![CDATA[<p>อุปกรณ์ใด ๆ ที่มีแบตเตอรี่ ควรจะตั้งประจุไฟสูงสุดไว้ที่ 80% ทำให้ถนอมการใช้งานแบตได้มากขึ้น อายุแบตอยู่ได้นานขึ้น จำนวน cycle แบตลดลงอย่างเห็นได้ชัด อย่างในภาพคือ Asus Zenbook 13 ที่ใช้งานมาเกือบสองปี แต่แบตขึ้นมาแค่ 124 cycle อยู่เลย<br>บน Linux จะมี Service ที่ทำหน้าที่นี้ได้หลายตัว  แต่ตัวที่ผมเลือกใช้คือ tlp ตั้งค่าได้ทุกอย่างยัน clock CPU<br> <a href="https://image.nostr.build/55f8c90f38edc0061351fe51785ec88939e528f806789cd4b09c1cd7d6116bcf.png" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/55f8c90f38edc0061351fe51785ec88939e528f806789cd4b09c1cd7d6116bcf.png"></a> <br><br><np-embed nostr="nevent1qvzqqqqqqypzqx78pgq53vlnzmdr8l3u38eru0n3438lnxqz0mr39wg9e5j0dfq3qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgwwaehxw309ahx7uewd3hkctcqyrzwhzw9mg0a3edvzrjtssfvhhtt99npzhuwm75ngg3yyfc2kh5ek6n477j"><a href="https://njump.me/nevent1qvzqqqqqqypzqx78pgq53vlnzmdr8l3u38eru0n3438lnxqz0mr39wg9e5j0dfq3qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgwwaehxw309ahx7uewd3hkctcqyrzwhzw9mg0a3edvzrjtssfvhhtt99npzhuwm75ngg3yyfc2kh5ek6n477j">nostr:nevent1qvzqqqqqqypzqx78pgq53vlnzmdr8l3u38eru0n3438lnxqz0mr39wg9e5j0dfq3qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgwwaehxw309ahx7uewd3hkctcqyrzwhzw9mg0a3edvzrjtssfvhhtt99npzhuwm75ngg3yyfc2kh5ek6n477j</a></np-embed><br><a href='/tag/siamstr/'>#siamstr</a></p>
]]></itunes:summary>
      <itunes:image href="https://image.nostr.build/55f8c90f38edc0061351fe51785ec88939e528f806789cd4b09c1cd7d6116bcf.png"/>
      </item>
      
      <item>
      <title><![CDATA[serde-derive มีปัญหาด้านประสิ…]]></title>
      <description><![CDATA[serde-derive มีปัญหาด้านประสิทธิภาพเนื่องจากเหตุผลหลายประการ:


โค้ดที่ซับซ้อนและซ้อนลึก: serde-derive สร้างโค้ดที่มีการเรียกใช้ฟังก์ชัน deserialize ซ้อนกันหลายชั้น ซึ่งทำให้เกิดการคัดลอกข้อมูล (memcpy) บ่อยครั้ง1.
การจัดการหน่วยความจำ: Rust และ…]]></description>
             <itunes:subtitle><![CDATA[serde-derive มีปัญหาด้านประสิทธิภาพเนื่องจากเหตุผลหลายประการ:


โค้ดที่ซับซ้อนและซ้อนลึก: serde-derive สร้างโค้ดที่มีการเรียกใช้ฟังก์ชัน deserialize ซ้อนกันหลายชั้น ซึ่งทำให้เกิดการคัดลอกข้อมูล (memcpy) บ่อยครั้ง1.
การจัดการหน่วยความจำ: Rust และ…]]></itunes:subtitle>
      <pubDate>Thu, 19 Dec 2024 07:27:01 GMT</pubDate>
      <link>https://blog.siamstr.com/post/note1qzanyqtt6ak6jsrys049fpe9smpcu4fftgyxqzk2jj8swfk6vq3s56h8r9/</link>
      <comments>https://blog.siamstr.com/post/note1qzanyqtt6ak6jsrys049fpe9smpcu4fftgyxqzk2jj8swfk6vq3s56h8r9/</comments>
      <guid isPermaLink="false">note1qzanyqtt6ak6jsrys049fpe9smpcu4fftgyxqzk2jj8swfk6vq3s56h8r9</guid>
      <category>2584</category>
      
      <noteId>note1qzanyqtt6ak6jsrys049fpe9smpcu4fftgyxqzk2jj8swfk6vq3s56h8r9</noteId>
      <npub>npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60</npub>
      <dc:creator><![CDATA[VΔz]]></dc:creator>
      <content:encoded><![CDATA[<p><code>serde-derive</code> มีปัญหาด้านประสิทธิภาพเนื่องจากเหตุผลหลายประการ:<br><br>1. <strong>โค้ดที่ซับซ้อนและซ้อนลึก</strong>: <code>serde-derive</code> สร้างโค้ดที่มีการเรียกใช้ฟังก์ชัน <code>deserialize</code> ซ้อนกันหลายชั้น ซึ่งทำให้เกิดการคัดลอกข้อมูล (memcpy) บ่อยครั้ง<a href="https://github.com/serde-rs/serde/issues/2584">1</a>.<br><br>2. <strong>การจัดการหน่วยความจำ</strong>: Rust และ LLVM ไม่เก่งในการทำ Return Value Optimization (RVO) ซึ่งทำให้การคัดลอกผลลัพธ์ของ <code>deserialize</code> กลับไปยังที่หมายปลายทางเกิดขึ้นบ่อยครั้ง<a href="https://github.com/serde-rs/serde/issues/2584">1</a>.<br><br>3. <strong>การสร้างผลลัพธ์หลายครั้ง</strong>: ในกรณีที่มีการ deserialize ข้อมูลประเภทเดียวกันหลายครั้ง มันจะสร้าง <code>Result&lt;T, _&gt;</code> แยกกันหลายครั้ง ซึ่งอาจทำให้เกิดปัญหาการใช้หน่วยความจำมากเกินไปและทำให้ stack overflow<a href="https://github.com/serde-rs/serde/issues/2584">1</a>.<br><br>4. <strong>ไม่สามารถทำงานขนานกันได้</strong>:  <code>serde-derive</code> มีการพึ่งพา chain ที่ไม่สามารถทำงานพร้อมกันได้ (sequential dependencies) ซึ่งหมายความว่าโค้ดที่สร้างขึ้นโดย serde-derive ต้องทำงานตามลำดับ ไม่สามารถทำงานหลายๆ อย่างพร้อมกันได้ (parallel execution) ทำให้เวลาในการคอมไพล์เพิ่มขึ้นและประสิทธิภาพลดลงในบางกรณี<br><br>ตัวอย่างเช่น ถ้าคุณมีหลายฟิลด์ที่ต้อง deserialize โค้ดที่สร้างขึ้นจะต้องทำการ deserialize ฟิลด์เหล่านั้นทีละฟิลด์ ไม่สามารถทำพร้อมกันได้ ซึ่งทำให้เกิดการหน่วงเวลาและใช้ทรัพยากรมากขึ้น<br><br>ดังนั้น <code>serde-derive</code> อาจไม่เหมาะสำหรับโค้ดที่ต้องการประสิทธิภาพสูง.<br><br><a href="https://github.com/serde-rs/serde/issues/2584">1</a>: <a href="https://github.com/serde-rs/serde/issues/2584">GitHub Issue <a href='/tag/2584/'>#2584</a></a><br><a href="https://github.com/serde-rs/serde/issues/2831">2</a>: <a href="https://github.com/serde-rs/serde/issues/2831">GitHub Issue <a href='/tag/2831/'>#2831</a></a><br><a href='/tag/siamstr/'>#siamstr</a> <a href='/tag/siamdev/'>#siamdev</a> <a href='/tag/rust/'>#rust</a></p>
]]></content:encoded>
      <itunes:author><![CDATA[VΔz]]></itunes:author>
      <itunes:summary><![CDATA[<p><code>serde-derive</code> มีปัญหาด้านประสิทธิภาพเนื่องจากเหตุผลหลายประการ:<br><br>1. <strong>โค้ดที่ซับซ้อนและซ้อนลึก</strong>: <code>serde-derive</code> สร้างโค้ดที่มีการเรียกใช้ฟังก์ชัน <code>deserialize</code> ซ้อนกันหลายชั้น ซึ่งทำให้เกิดการคัดลอกข้อมูล (memcpy) บ่อยครั้ง<a href="https://github.com/serde-rs/serde/issues/2584">1</a>.<br><br>2. <strong>การจัดการหน่วยความจำ</strong>: Rust และ LLVM ไม่เก่งในการทำ Return Value Optimization (RVO) ซึ่งทำให้การคัดลอกผลลัพธ์ของ <code>deserialize</code> กลับไปยังที่หมายปลายทางเกิดขึ้นบ่อยครั้ง<a href="https://github.com/serde-rs/serde/issues/2584">1</a>.<br><br>3. <strong>การสร้างผลลัพธ์หลายครั้ง</strong>: ในกรณีที่มีการ deserialize ข้อมูลประเภทเดียวกันหลายครั้ง มันจะสร้าง <code>Result&lt;T, _&gt;</code> แยกกันหลายครั้ง ซึ่งอาจทำให้เกิดปัญหาการใช้หน่วยความจำมากเกินไปและทำให้ stack overflow<a href="https://github.com/serde-rs/serde/issues/2584">1</a>.<br><br>4. <strong>ไม่สามารถทำงานขนานกันได้</strong>:  <code>serde-derive</code> มีการพึ่งพา chain ที่ไม่สามารถทำงานพร้อมกันได้ (sequential dependencies) ซึ่งหมายความว่าโค้ดที่สร้างขึ้นโดย serde-derive ต้องทำงานตามลำดับ ไม่สามารถทำงานหลายๆ อย่างพร้อมกันได้ (parallel execution) ทำให้เวลาในการคอมไพล์เพิ่มขึ้นและประสิทธิภาพลดลงในบางกรณี<br><br>ตัวอย่างเช่น ถ้าคุณมีหลายฟิลด์ที่ต้อง deserialize โค้ดที่สร้างขึ้นจะต้องทำการ deserialize ฟิลด์เหล่านั้นทีละฟิลด์ ไม่สามารถทำพร้อมกันได้ ซึ่งทำให้เกิดการหน่วงเวลาและใช้ทรัพยากรมากขึ้น<br><br>ดังนั้น <code>serde-derive</code> อาจไม่เหมาะสำหรับโค้ดที่ต้องการประสิทธิภาพสูง.<br><br><a href="https://github.com/serde-rs/serde/issues/2584">1</a>: <a href="https://github.com/serde-rs/serde/issues/2584">GitHub Issue <a href='/tag/2584/'>#2584</a></a><br><a href="https://github.com/serde-rs/serde/issues/2831">2</a>: <a href="https://github.com/serde-rs/serde/issues/2831">GitHub Issue <a href='/tag/2831/'>#2831</a></a><br><a href='/tag/siamstr/'>#siamstr</a> <a href='/tag/siamdev/'>#siamdev</a> <a href='/tag/rust/'>#rust</a></p>
]]></itunes:summary>
      
      </item>
      
      <item>
      <title><![CDATA[/dev/null/ คืออะไร?]]></title>
      <description><![CDATA[/dev/null/ คืออะไร?
dev/null เป็นไฟล์พิเศษในระบบปฏิบัติการ Unix และ Linux ที่มักเรียกกันว่า "bit bucket" หรือ "black hole" ซึ่งหมายความว่าอะไรก็ตามที่เขียนลงไปในไฟล์นี้จะถูก "ทิ้ง" และหายไปโดยไม่มีการจัดเก็บหรือประมวลผล
 #siamstr…]]></description>
             <itunes:subtitle><![CDATA[/dev/null/ คืออะไร?
dev/null เป็นไฟล์พิเศษในระบบปฏิบัติการ Unix และ Linux ที่มักเรียกกันว่า "bit bucket" หรือ "black hole" ซึ่งหมายความว่าอะไรก็ตามที่เขียนลงไปในไฟล์นี้จะถูก "ทิ้ง" และหายไปโดยไม่มีการจัดเก็บหรือประมวลผล
 #siamstr…]]></itunes:subtitle>
      <pubDate>Fri, 29 Nov 2024 09:00:31 GMT</pubDate>
      <link>https://blog.siamstr.com/post/note1qr7g8kmdx657duyekmyckzqu87jkcxhrc2zssm30q9q7jz968s7sa4wapa/</link>
      <comments>https://blog.siamstr.com/post/note1qr7g8kmdx657duyekmyckzqu87jkcxhrc2zssm30q9q7jz968s7sa4wapa/</comments>
      <guid isPermaLink="false">note1qr7g8kmdx657duyekmyckzqu87jkcxhrc2zssm30q9q7jz968s7sa4wapa</guid>
      <category>siamstr</category>
      
        <media:content url="https://image.nostr.build/53db3892bf1d7518598c3221b0974dad415a0eeec0e818acfc0b24dd81bce353.png" medium="image"/>
        <enclosure 
          url="https://image.nostr.build/53db3892bf1d7518598c3221b0974dad415a0eeec0e818acfc0b24dd81bce353.png" length="0" 
          type="image/png" 
        />
      <noteId>note1qr7g8kmdx657duyekmyckzqu87jkcxhrc2zssm30q9q7jz968s7sa4wapa</noteId>
      <npub>npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60</npub>
      <dc:creator><![CDATA[VΔz]]></dc:creator>
      <content:encoded><![CDATA[<p><np-embed nostr="nevent1qvzqqqqqqypzp75cf0tahv5z7plpdeaws7ex52nmnwgtwfr2g3m37r844evqrr6jqqs0528hwd7cupgpaaszxusmd60us0ennuh4rrqcfx0hc7qmw5wpseg5xhtcj"><a href="https://njump.me/nevent1qvzqqqqqqypzp75cf0tahv5z7plpdeaws7ex52nmnwgtwfr2g3m37r844evqrr6jqqs0528hwd7cupgpaaszxusmd60us0ennuh4rrqcfx0hc7qmw5wpseg5xhtcj">nostr:nevent1qvzqqqqqqypzp75cf0tahv5z7plpdeaws7ex52nmnwgtwfr2g3m37r844evqrr6jqqs0528hwd7cupgpaaszxusmd60us0ennuh4rrqcfx0hc7qmw5wpseg5xhtcj</a></np-embed><br><br>/dev/null/ คืออะไร?<br>dev/null เป็นไฟล์พิเศษในระบบปฏิบัติการ Unix และ Linux ที่มักเรียกกันว่า "bit bucket" หรือ "black hole" ซึ่งหมายความว่าอะไรก็ตามที่เขียนลงไปในไฟล์นี้จะถูก "ทิ้ง" และหายไปโดยไม่มีการจัดเก็บหรือประมวลผล<br> <a href="https://image.nostr.build/53db3892bf1d7518598c3221b0974dad415a0eeec0e818acfc0b24dd81bce353.png" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/53db3892bf1d7518598c3221b0974dad415a0eeec0e818acfc0b24dd81bce353.png"></a><br><a href='/tag/siamstr/'>#siamstr</a></p>
]]></content:encoded>
      <itunes:author><![CDATA[VΔz]]></itunes:author>
      <itunes:summary><![CDATA[<p><np-embed nostr="nevent1qvzqqqqqqypzp75cf0tahv5z7plpdeaws7ex52nmnwgtwfr2g3m37r844evqrr6jqqs0528hwd7cupgpaaszxusmd60us0ennuh4rrqcfx0hc7qmw5wpseg5xhtcj"><a href="https://njump.me/nevent1qvzqqqqqqypzp75cf0tahv5z7plpdeaws7ex52nmnwgtwfr2g3m37r844evqrr6jqqs0528hwd7cupgpaaszxusmd60us0ennuh4rrqcfx0hc7qmw5wpseg5xhtcj">nostr:nevent1qvzqqqqqqypzp75cf0tahv5z7plpdeaws7ex52nmnwgtwfr2g3m37r844evqrr6jqqs0528hwd7cupgpaaszxusmd60us0ennuh4rrqcfx0hc7qmw5wpseg5xhtcj</a></np-embed><br><br>/dev/null/ คืออะไร?<br>dev/null เป็นไฟล์พิเศษในระบบปฏิบัติการ Unix และ Linux ที่มักเรียกกันว่า "bit bucket" หรือ "black hole" ซึ่งหมายความว่าอะไรก็ตามที่เขียนลงไปในไฟล์นี้จะถูก "ทิ้ง" และหายไปโดยไม่มีการจัดเก็บหรือประมวลผล<br> <a href="https://image.nostr.build/53db3892bf1d7518598c3221b0974dad415a0eeec0e818acfc0b24dd81bce353.png" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/53db3892bf1d7518598c3221b0974dad415a0eeec0e818acfc0b24dd81bce353.png"></a><br><a href='/tag/siamstr/'>#siamstr</a></p>
]]></itunes:summary>
      <itunes:image href="https://image.nostr.build/53db3892bf1d7518598c3221b0974dad415a0eeec0e818acfc0b24dd81bce353.png"/>
      </item>
      
      <item>
      <title><![CDATA[GA #siamstr]]></title>
      <description><![CDATA[GA #siamstr
รู้หรือไม่ว่า Windows Linux Android IOS MacOS สามารถส่ง airdrop ถึงกันได้ด้วย localsend เป็นแอพที่ใช้ส่งไฟล์กันผ่าน TCP/IP ในวงแลนเดียวกันได้ ที่เจ๋งคือถ้าใช้ tunnel เราสามารถส่งไฟล์ผ่านกันข้ามโลกได้เลย ลองไปโหลดมาใช้กันได้…]]></description>
             <itunes:subtitle><![CDATA[GA #siamstr
รู้หรือไม่ว่า Windows Linux Android IOS MacOS สามารถส่ง airdrop ถึงกันได้ด้วย localsend เป็นแอพที่ใช้ส่งไฟล์กันผ่าน TCP/IP ในวงแลนเดียวกันได้ ที่เจ๋งคือถ้าใช้ tunnel เราสามารถส่งไฟล์ผ่านกันข้ามโลกได้เลย ลองไปโหลดมาใช้กันได้…]]></itunes:subtitle>
      <pubDate>Mon, 30 Sep 2024 07:40:12 GMT</pubDate>
      <link>https://blog.siamstr.com/post/note1ydatnan2aty0c3ezhf932mtf2dkz5pl6wu5k7kagdtzll7g78wrs5anlx7/</link>
      <comments>https://blog.siamstr.com/post/note1ydatnan2aty0c3ezhf932mtf2dkz5pl6wu5k7kagdtzll7g78wrs5anlx7/</comments>
      <guid isPermaLink="false">note1ydatnan2aty0c3ezhf932mtf2dkz5pl6wu5k7kagdtzll7g78wrs5anlx7</guid>
      <category>siamstr</category>
      
        <media:content url="https://image.nostr.build/de40ff3db0e4410c0463501deb422ebba56eef663a678f05881187e307e0997a.jpg" medium="image"/>
        <enclosure 
          url="https://image.nostr.build/de40ff3db0e4410c0463501deb422ebba56eef663a678f05881187e307e0997a.jpg" length="0" 
          type="image/jpeg" 
        />
      <noteId>note1ydatnan2aty0c3ezhf932mtf2dkz5pl6wu5k7kagdtzll7g78wrs5anlx7</noteId>
      <npub>npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60</npub>
      <dc:creator><![CDATA[VΔz]]></dc:creator>
      <content:encoded><![CDATA[<p>GA <a href='/tag/siamstr/'>#siamstr</a><br>รู้หรือไม่ว่า Windows Linux Android IOS MacOS สามารถส่ง airdrop ถึงกันได้ด้วย localsend เป็นแอพที่ใช้ส่งไฟล์กันผ่าน TCP/IP ในวงแลนเดียวกันได้ ที่เจ๋งคือถ้าใช้ tunnel เราสามารถส่งไฟล์ผ่านกันข้ามโลกได้เลย ลองไปโหลดมาใช้กันได้ที่ localsend.org<br><br>ส่วนใหญ่มีใน package manager ของ os นั้น ๆ แล้ว<br>เช่น void linux ติดตั้งผ่าน<br>xbps-install localsend ได้เลย<br>windows ก็ใช้ <br>winget install localsend ผ่าน power shell ได้เช่นกัน<br>แน่นอนว่า android ios มีใน app store <br>MacOS ใช้ brew ติดตั้งได้เลย<br><br><br></p>
]]></content:encoded>
      <itunes:author><![CDATA[VΔz]]></itunes:author>
      <itunes:summary><![CDATA[<p>GA <a href='/tag/siamstr/'>#siamstr</a><br>รู้หรือไม่ว่า Windows Linux Android IOS MacOS สามารถส่ง airdrop ถึงกันได้ด้วย localsend เป็นแอพที่ใช้ส่งไฟล์กันผ่าน TCP/IP ในวงแลนเดียวกันได้ ที่เจ๋งคือถ้าใช้ tunnel เราสามารถส่งไฟล์ผ่านกันข้ามโลกได้เลย ลองไปโหลดมาใช้กันได้ที่ localsend.org<br><br>ส่วนใหญ่มีใน package manager ของ os นั้น ๆ แล้ว<br>เช่น void linux ติดตั้งผ่าน<br>xbps-install localsend ได้เลย<br>windows ก็ใช้ <br>winget install localsend ผ่าน power shell ได้เช่นกัน<br>แน่นอนว่า android ios มีใน app store <br>MacOS ใช้ brew ติดตั้งได้เลย<br><br><br></p>
]]></itunes:summary>
      <itunes:image href="https://image.nostr.build/de40ff3db0e4410c0463501deb422ebba56eef663a678f05881187e307e0997a.jpg"/>
      </item>
      
      <item>
      <title><![CDATA[Digging low-level : Bitwise Operation ทำงานอย่างไร?]]></title>
      <description><![CDATA[Bitwise Operations เป็นเครื่องมือที่ทรงพลังสำหรับนักพัฒนาที่ต้องการประสิทธิภาพสูงและการควบคุมระดับบิต โดยเฉพาะในการพัฒนาระบบระดับ low-level และการทำงานกับฮาร์ดแวร์โดยตรง]]></description>
             <itunes:subtitle><![CDATA[Bitwise Operations เป็นเครื่องมือที่ทรงพลังสำหรับนักพัฒนาที่ต้องการประสิทธิภาพสูงและการควบคุมระดับบิต โดยเฉพาะในการพัฒนาระบบระดับ low-level และการทำงานกับฮาร์ดแวร์โดยตรง]]></itunes:subtitle>
      <pubDate>Mon, 05 Aug 2024 05:46:34 GMT</pubDate>
      <link>https://blog.siamstr.com/post/fgriwwzgw2fdmqj5tsjqu/</link>
      <comments>https://blog.siamstr.com/post/fgriwwzgw2fdmqj5tsjqu/</comments>
      <guid isPermaLink="false">naddr1qq25ve6jf9t4wkj82ueyv3rdw99r24rndfch2q3qvaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qxpqqqp65wfv7942</guid>
      <category>#siamstr</category>
      
        <media:content url="https://www.researchgate.net/profile/Rama_M_A/publication/276202732/figure/fig3/AS:667718365749268@1536207872972/Bitwise-Operators-i-Bitwise-operators-cannot-be-applied-to-float-or-double-They-can.png" medium="image"/>
        <enclosure 
          url="https://www.researchgate.net/profile/Rama_M_A/publication/276202732/figure/fig3/AS:667718365749268@1536207872972/Bitwise-Operators-i-Bitwise-operators-cannot-be-applied-to-float-or-double-They-can.png" length="0" 
          type="image/png" 
        />
      <noteId>naddr1qq25ve6jf9t4wkj82ueyv3rdw99r24rndfch2q3qvaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qxpqqqp65wfv7942</noteId>
      <npub>npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60</npub>
      <dc:creator><![CDATA[VΔz]]></dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>Bitwise Operation คือ กระบวนการที่การดำเนินการใด ๆ โดยตรงกับบิตของตัวเลข หรือชุดข้อมูลของเราใน memory  ซึ่งการทำงานโดยตรงกับบิตของตัวเลข ทำให้มีประสิทธิภาพสูงและใช้บ่อยในการเขียนโปรแกรมระดับ low-level  โดยหลัก ๆ ที่ใช้กันจะมี 6 แบบ<br> เป็นเครื่องมือที่ทรงพลังสำหรับนักพัฒนาที่ต้องการประสิทธิภาพสูงและการควบคุมระดับบิต โดยเฉพาะในการพัฒนาระบบระดับ low-level และการทำงานกับฮาร์ดแวร์โดยตรง </p>
</blockquote>
<h2>TLDR</h2>
<p>ภาพรวม Bitwise Operations:</p>
<p>AND (&amp;):</p>
<p>ใช้เปรียบเทียบบิต, ให้ 1 เมื่อทั้งสองบิตเป็น 1<br>ประโยชน์: ตรวจสอบบิต, สร้าง mask</p>
<p>OR (|):</p>
<p>ให้ 1 เมื่อมีบิตใดบิตหนึ่งเป็น 1<br>ประโยชน์: รวมแฟล็ก, ตั้งค่าบิต</p>
<p>XOR (^):</p>
<p>ให้ 1 เมื่อบิตต่างกัน<br>ประโยชน์: สลับค่า, เข้ารหัสอย่างง่าย</p>
<p>NOT (~):</p>
<p>กลับค่าทุกบิต<br>ประโยชน์: สร้าง mask สำหรับลบบิต</p>
<p>Left Shift (&lt;&lt;):</p>
<p>เลื่อนบิตไปซ้าย, เติม 0 ทางขวา<br>ประโยชน์: คูณด้วยกำลังของ 2, สร้าง mask</p>
<p>Right Shift (&gt;&gt;):</p>
<p>เลื่อนบิตไปขวา<br>ประโยชน์: หารด้วยกำลังของ 2, แยกส่วนข้อมูล</p>
<h2>1.) BitAnd (&amp;):</h2>
<p>BitAnd มักใช้สัญลักษณ์ &amp; เป็นการดำเนินการทางตรรกะที่เปรียบเทียบบิตในตำแหน่งเดียวกันของสองตัวเลข โดยมีกฎดังนี้:</p>
<ul>
<li>1 AND 1 = 1</li>
<li>1 AND 0 = 0</li>
<li>0 AND 1 = 0</li>
<li>0 AND 0 = 0</li>
</ul>
<p>หรือกล่าวอีกนัยหนึ่ง ผลลัพธ์จะเป็น 1 ก็ต่อเมื่อทั้งสองบิตเป็น 1 เท่านั้น</p>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลขสองตัว A = 5 และ B = 3<br>ในระบบเลขฐานสอง:<br>A = 5 = 0101<br>B = 3 = 0011</p>
<p>เมื่อทำ BitAnd:</p>
<pre><code>  0101 (A = 5)
&amp; 0011 (B = 3)
  ----
  0001 (Result = 1)
</code></pre>
<p>จะเห็นได้ว่า:</p>
<ul>
<li>บิตที่ 1 (จากขวา): 1 &amp; 1 = 1</li>
<li>บิตที่ 2: 0 &amp; 1 = 0</li>
<li>บิตที่ 3: 1 &amp; 0 = 0</li>
<li>บิตที่ 4: 0 &amp; 0 = 0</li>
</ul>
<p>ดังนั้น ผลลัพธ์คือ 0001 ในเลขฐานสอง ซึ่งเท่ากับ 1 ในเลขฐานสิบ</p>
<p>การใช้งาน BitAnd:</p>
<ol>
<li><p>การตรวจสอบเลขคู่/คี่:<br>ถ้า (n &amp; 1) == 0 แสดงว่า n เป็นเลขคู่<br>ถ้า (n &amp; 1) == 1 แสดงว่า n เป็นเลขคี่</p>
</li>
<li><p>การตรวจสอบสถานะของบิตเฉพาะ:<br>ถ้าต้องการตรวจสอบบิตที่ 3 ของ x:<br>if (x &amp; (1 &lt;&lt; 2)) != 0 // บิตที่ 3 เป็น 1</p>
</li>
<li><p>การลบบิตสุดท้ายที่เป็น 1:<br>n = n &amp; (n - 1)</p>
</li>
</ol>
<p>BitAnd มีประโยชน์มากในการจัดการกับข้อมูลระดับบิต การตั้งค่าแฟล็ก และการทำงานกับฮาร์ดแวร์โดยตรง</p>
<h2>2.) BitOr (|):</h2>
<p>BitOr มักใช้สัญลักษณ์ | เป็นการดำเนินการทางตรรกะที่เปรียบเทียบบิตในตำแหน่งเดียวกันของสองตัวเลข โดยมีกฎดังนี้:</p>
<ul>
<li>1 OR 1 = 1</li>
<li>1 OR 0 = 1</li>
<li>0 OR 1 = 1</li>
<li>0 OR 0 = 0</li>
</ul>
<p>กล่าวคือ ผลลัพธ์จะเป็น 1 เมื่อมีบิตใดบิตหนึ่งเป็น 1 หรือทั้งสองบิตเป็น 1</p>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลขสองตัว A = 5 และ B = 3<br>ในระบบเลขฐานสอง:<br>A = 5 = 0101<br>B = 3 = 0011</p>
<p>เมื่อทำ BitOr:</p>
<pre><code>  0101 (A = 5)
| 0011 (B = 3)
  ----
  0111 (Result = 7)
</code></pre>
<p>จะเห็นได้ว่า:</p>
<ul>
<li>บิตที่ 1 (จากขวา): 1 | 1 = 1</li>
<li>บิตที่ 2: 0 | 1 = 1</li>
<li>บิตที่ 3: 1 | 0 = 1</li>
<li>บิตที่ 4: 0 | 0 = 0</li>
</ul>
<p>ดังนั้น ผลลัพธ์คือ 0111 ในเลขฐานสอง ซึ่งเท่ากับ 7 ในเลขฐานสิบ</p>
<p>การใช้งาน BitOr:</p>
<ol>
<li><p>การรวมแฟล็ก:<br>เช่น ในการตั้งค่าสิทธิ์ไฟล์ในระบบ Unix<br>permissions = READ | WRITE | EXECUTE</p>
</li>
<li><p>การตั้งค่าบิตเฉพาะ:<br>ถ้าต้องการตั้งค่าบิตที่ 3 ของ x เป็น 1:<br>x = x | (1 &lt;&lt; 2)</p>
</li>
<li><p>การรวมสี RGB:<br>ในระบบสี RGB ที่ใช้ 8 บิตต่อสี<br>color = (red &lt;&lt; 16) | (green &lt;&lt; 8) | blue</p>
</li>
</ol>
<p>BitOr มีประโยชน์มากในการรวมแฟล็ก การตั้งค่าบิต และการทำงานกับข้อมูลที่แต่ละบิตมีความหมายเฉพาะ</p>
<h2>BitXor (^):</h2>
<p>BitXor หรือ Exclusive OR (XOR) มักใช้สัญลักษณ์ ^ เป็นการดำเนินการทางตรรกะที่เปรียบเทียบบิตในตำแหน่งเดียวกันของสองตัวเลข โดยมีกฎดังนี้:</p>
<ul>
<li>1 XOR 1 = 0</li>
<li>1 XOR 0 = 1</li>
<li>0 XOR 1 = 1</li>
<li>0 XOR 0 = 0</li>
</ul>
<p>กล่าวคือ ผลลัพธ์จะเป็น 1 เมื่อบิตทั้งสองมีค่าต่างกัน</p>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลขสองตัว A = 5 และ B = 3<br>ในระบบเลขฐานสอง:<br>A = 5 = 0101<br>B = 3 = 0011</p>
<p>เมื่อทำ BitXor:</p>
<pre><code>  0101 (A = 5)
^ 0011 (B = 3)
  ----
  0110 (Result = 6)
</code></pre>
<p>จะเห็นได้ว่า:</p>
<ul>
<li>บิตที่ 1 (จากขวา): 1 ^ 1 = 0</li>
<li>บิตที่ 2: 0 ^ 1 = 1</li>
<li>บิตที่ 3: 1 ^ 0 = 1</li>
<li>บิตที่ 4: 0 ^ 0 = 0</li>
</ul>
<p>ดังนั้น ผลลัพธ์คือ 0110 ในเลขฐานสอง ซึ่งเท่ากับ 6 ในเลขฐานสิบ</p>
<p>การใช้งาน BitXor:</p>
<ol>
<li><p>การสลับค่าโดยไม่ใช้ตัวแปรเพิ่ม:<br>a ^= b;<br>b ^= a;<br>a ^= b;<br>// ตอนนี้ a และ b ได้สลับค่ากันแล้ว</p>
</li>
<li><p>การเข้ารหัสอย่างง่าย:<br>encrypted = data ^ key<br>decrypted = encrypted ^ key  // จะได้ data กลับคืนมา</p>
</li>
<li><p>การตรวจสอบความเท่ากันของตัวเลข:<br>if ((a ^ b) == 0) // a และ b เท่ากัน</p>
</li>
<li><p>การหาตัวเลขที่ไม่มีคู่ในชุดข้อมูล:<br>result = num1 ^ num2 ^ num3 ^ ... // ผลลัพธ์จะเป็นตัวเลขที่ไม่มีคู่</p>
</li>
</ol>
<p>BitXor มีคุณสมบัติพิเศษคือ การ XOR กับตัวเองจะได้ 0 และการ XOR กับ 0 จะได้ตัวเองกลับคืนมา ทำให้มันมีประโยชน์มากในการเข้ารหัสและการตรวจสอบข้อมูล</p>
<h2>BitNot (~):</h2>
<p>BitNot หรือ NOT  มักใช้สัญลักษณ์ ~ เป็นการดำเนินการทางตรรกะที่กลับบิตของตัวเลข โดยมีกฎง่ายๆ คือ:</p>
<ul>
<li>NOT 1 = 0</li>
<li>NOT 0 = 1</li>
</ul>
<p>กล่าวคือ BitNot จะเปลี่ยนทุกบิต 0 เป็น 1 และทุกบิต 1 เป็น 0</p>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลข A = 5<br>ในระบบเลขฐานสอง (สมมติว่าเป็นเลข 8 บิต):<br>A = 5 = 00000101</p>
<p>เมื่อทำ BitNot:</p>
<pre><code>  00000101 (A = 5)
  --------
~ 11111010 (Result = 250 ใน unsigned int, หรือ -6 ใน signed int)
</code></pre>
<p>จะเห็นได้ว่า:</p>
<ul>
<li>ทุกบิต 0 ถูกเปลี่ยนเป็น 1</li>
<li>ทุกบิต 1 ถูกเปลี่ยนเป็น 0</li>
</ul>
<p>ผลลัพธ์จะขึ้นอยู่กับว่าเราใช้ระบบเลขแบบไหน (signed หรือ unsigned):</p>
<ul>
<li>ในระบบ unsigned 8 บิต: 11111010 = 250</li>
<li>ในระบบ signed 8 บิต: 11111010 = -6</li>
</ul>
<p>การใช้งาน BitNot:</p>
<ol>
<li><p>การสร้าง mask สำหรับการลบบิต:<br>clear_mask = ~(1 &lt;&lt; n)  // สร้าง mask ที่มีบิตที่ n เป็น 0 และที่เหลือเป็น 1<br>x &amp;= clear_mask  // ลบบิตที่ n ของ x</p>
</li>
<li><p>การหาค่าสัมบูรณ์ของเลขติดลบในระบบ two's complement:<br>abs_value = (x ^ (x &gt;&gt; 31)) - (x &gt;&gt; 31)<br>// x &gt;&gt; 31 จะได้ 0 สำหรับเลขบวก และ -1 สำหรับเลขลบ</p>
</li>
<li><p>การสลับสถานะของทุกบิต:<br>inverted = ~original</p>
</li>
<li><p>การหาค่าสูงสุดของตัวแปรที่มีขนาด n บิต:<br>max_value = ~0 &gt;&gt; (32 - n)  // สำหรับตัวแปร 32 บิต</p>
</li>
</ol>
<p>BitNot มักใช้ร่วมกับ BitAnd เพื่อลบบิตที่ต้องการ หรือใช้ในการสร้าง mask สำหรับการจัดการบิต</p>
<h2>Left Shift (&lt;&lt;):</h2>
<p>Left Shift มักใช้สัญลักษณ์ &lt;&lt; เป็นการดำเนินการที่เลื่อนบิตทั้งหมดของตัวเลขไปทางซ้ายตามจำนวนที่กำหนด โดยเติม 0 ทางด้านขวา<br>Left Shift โดยทั่วไปแล้วไม่แตกต่างกันระหว่างเลข unsigned int และ signed int แต่มีบางประเด็นที่ควรระวัง:</p>
<ol>
<li><p>ผลลัพธ์:</p>
<ul>
<li>ในกรณีของเลขไม่มีเครื่องหมาย ผลลัพธ์จะเป็นบวกเสมอ</li>
<li>สำหรับเลขมีเครื่องหมาย ผลลัพธ์อาจเปลี่ยนเครื่องหมายได้หากบิตเครื่องหมาย (sign bit) ถูกเปลี่ยน</li>
</ul>
</li>
<li><p>Overflow:</p>
<ul>
<li>ทั้งสองกรณีอาจเกิด overflow ได้ถ้าเลื่อนมากเกินไป</li>
<li>สำหรับเลข signed int overflow อาจทำให้เกิดการเปลี่ยนเครื่องหมายโดยไม่คาดคิด</li>
</ul>
</li>
<li><p>Undefined Behavior:</p>
<ul>
<li>ในบางภาษา เช่น C/C++, การเลื่อนด้วยค่าที่มากกว่าหรือเท่ากับจำนวนบิตของตัวแปรอาจทำให้เกิด Undefined Behavior ได้</li>
</ul>
</li>
</ol>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลข A = 5 และต้องการเลื่อนซ้าย 2 ตำแหน่ง<br>ในระบบเลขฐานสอง (สมมติว่าเป็นเลข 8 บิต):<br>A = 5 = 00000101</p>
<p>เมื่อทำ Left Shift 2 ตำแหน่ง (A &lt;&lt; 2):</p>
<pre><code>  00000101 (A = 5)
  --------
  00010100 (Result = 20)
</code></pre>
<p>จะเห็นได้ว่า::</p>
<ul>
<li>บิตทั้งหมดถูกเลื่อนไปทางซ้าย 2 ตำแหน่ง</li>
<li>เติม 0 สองตัวทางด้านขวา</li>
</ul>
<p>ผลลัพธ์: 00010100 ในเลขฐานสอง ซึ่งเท่ากับ 20 ในเลขฐานสิบ</p>
<p>ตัวอย่าง 2:</p>
<pre><code>unsigned int a = 1;  // 00000001 in binary
int b = 1;           // 00000001 in binary

// Left shift by 3
unsigned int a_result = a &lt;&lt; 3;  // 00001000 (8 in decimal)
int b_result = b &lt;&lt; 3;           // 00001000 (8 in decimal)

// สำหรับตัวเลขเล็ก ๆ ผลอาจจะไม่ต่างกัน
// แต่เมื่อมีตัวเลขที่ใหญ่ขึ้น อาจจะให้ผลตรงกันข้ามแทน:

unsigned int large_a = 1 &lt;&lt; 31;  // 10000000 00000000 00000000 00000000 (2147483648 in decimal)
int large_b = 1 &lt;&lt; 31;           // 10000000 00000000 00000000 00000000 (-2147483648 in decimal, due to two's complement)
</code></pre>
<p>ในตัวอย่างสุดท้าย เราเห็นความแตกต่าง:</p>
<ul>
<li>สำหรับ unsigned int, ผลลัพธ์คือเลขบวกที่ใหญ่ที่สุดที่เป็นไปได้</li>
<li>สำหรับ signed int, ผลลัพธ์คือเลขลบที่น้อยที่สุดที่เป็นไปได้ เนื่องจากบิตซ้ายสุดถูกตีความเป็นเครื่องหมายลบในระบบ two's complement</li>
</ul>
<p>กฎการทำงาน:</p>
<ul>
<li>เลื่อนบิตทั้งหมดไปทางซ้าย n ตำแหน่ง</li>
<li>เติม 0 ทางด้านขวา n ตัว</li>
<li>บิตที่เลื่อนออกไปทางซ้ายจะหายไป</li>
</ul>
<p>การใช้งาน Left Shift:</p>
<ol>
<li><p>การคูณด้วยกำลังของ 2:<br>x &lt;&lt; n เท่ากับ x * (2^n)<br>เช่น 5 &lt;&lt; 2 = 5 * (2^2) = 5 * 4 = 20</p>
</li>
<li><p>การสร้างหน้ากาก (mask) สำหรับการตั้งค่าบิต:<br>mask = 1 &lt;&lt; n  // สร้างหน้ากากที่มีบิตที่ n เป็น 1 และที่เหลือเป็น 0<br>x |= mask  // ตั้งค่าบิตที่ n ของ x เป็น 1</p>
</li>
<li><p>การเข้ารหัสข้อมูลหลายบิตในตัวแปรเดียว:<br>encoded = (r &lt;&lt; 16) | (g &lt;&lt; 8) | b  // เก็บค่า RGB ในตัวแปร 32 บิต</p>
</li>
<li><p>การทำงานกับบิตแฟล็ก:<br>FLAG_A = 1 &lt;&lt; 0<br>FLAG_B = 1 &lt;&lt; 1<br>FLAG_C = 1 &lt;&lt; 2<br>// ใช้งาน: flags = FLAG_A | FLAG_B</p>
</li>
</ol>
<p>Left Shift มีประสิทธิภาพสูงในการคูณด้วยกำลังของ 2 และมักใช้ในการจัดการบิตแฟล็กและการสร้างหน้ากากสำหรับการดำเนินการระดับบิต</p>
<h2>Right Shift (&gt;&gt;):</h2>
<p>Right Shift มักใช้สัญลักษณ์ &gt;&gt; เป็นการดำเนินการที่เลื่อนบิตทั้งหมดของตัวเลขไปทางขวาตามจำนวนที่กำหนด การทำงานจะแตกต่างกันเล็กน้อยระหว่างเลขที่มีเครื่องหมาย (signed) และไม่มีเครื่องหมาย (unsigned)</p>
<p>สำหรับเลข unsigned int (Logical Right Shift):</p>
<ul>
<li>เลื่อนบิตทั้งหมดไปทางขวา n ตำแหน่ง</li>
<li>เติม 0 ทางด้านซ้าย n ตัว</li>
<li>บิตที่เลื่อนออกไปทางขวาจะหายไป</li>
</ul>
<p>สำหรับเลข signed int (Arithmetic Right Shift):</p>
<ul>
<li>เลื่อนบิตทั้งหมดไปทางขวา n ตำแหน่ง</li>
<li>เติมด้วยบิตเครื่องหมาย (sign bit) ทางด้านซ้าย n ตัว</li>
<li>บิตที่เลื่อนออกไปทางขวาจะหายไป</li>
</ul>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลข A = 20 และต้องการเลื่อนขวา 2 ตำแหน่ง<br>ในระบบเลขฐานสอง (สมมติว่าเป็นเลข 8 บิต):<br>A = 20 = 00010100</p>
<p>เมื่อทำ Right Shift 2 ตำแหน่ง (A &gt;&gt; 2):</p>
<pre><code>  00010100 (A = 20)
  --------
  00000101 (Result = 5)
</code></pre>
<p>จะเห็นได้ว่า::</p>
<ul>
<li>บิตทั้งหมดถูกเลื่อนไปทางขวา 2 ตำแหน่ง</li>
<li>เติม 0 สองตัวทางด้านซ้าย (สำหรับเลขไม่มีเครื่องหมาย)</li>
</ul>
<p>ผลลัพธ์: 00000101 ในเลขฐานสอง ซึ่งเท่ากับ 5 ในเลขฐานสิบ</p>
<p>การใช้งาน Right Shift:</p>
<ol>
<li><p>การหารด้วยกำลังของ 2:<br>x &gt;&gt; n เท่ากับ x / (2^n) (ปัดเศษลง)<br>เช่น 20 &gt;&gt; 2 = 20 / (2^2) = 20 / 4 = 5</p>
</li>
<li><p>การแยกส่วนของข้อมูลที่ถูกเก็บรวมกัน:<br>r = (rgb &gt;&gt; 16) &amp; 0xFF  // แยกค่าสีแดงจาก RGB 24 บิต<br>g = (rgb &gt;&gt; 8) &amp; 0xFF   // แยกค่าสีเขียว<br>b = rgb &amp; 0xFF          // แยกค่าสีน้ำเงิน</p>
</li>
<li><p>การตรวจสอบเครื่องหมายของตัวเลข:<br>sign = x &gt;&gt; 31  // สำหรับตัวแปร 32 บิต, จะได้ 0 สำหรับบวก และ -1 สำหรับลบ</p>
</li>
<li><p>การทำ rounded division:<br>(x + (1 &lt;&lt; (n-1))) &gt;&gt; n  // หารด้วย 2^n และปัดเศษ</p>
</li>
</ol>
<p>ข้อควรระวัง:</p>
<ul>
<li>ใน Java, &gt;&gt; เป็น arithmetic shift สำหรับ int และ long, ส่วน &gt;&gt;&gt; เป็น logical shift</li>
<li>ในภาษาอื่นๆ เช่น C/C++, การทำงานของ &gt;&gt; กับเลขติดลบอาจแตกต่างกันไปตาม Compiler</li>
</ul>
<p>Right Shift มีประสิทธิภาพสูงในการหารด้วยกำลังของ 2 และมักใช้ในการจัดการข้อมูลที่ถูกเก็บรวมกันในรูปแบบบิต</p>
<p>หากเปรียบกับ Right Shift แม้ว่าการทำงานพื้นฐานของ Left Shift จะเหมือนกันสำหรับทั้งเลข signed int และ unsigned int แต่การตีความผลลัพธ์และผลกระทบต่อเครื่องหมาย(sign bit)อาจแตกต่างกัน ดังนั้นจึงควรระมัดระวังเมื่อใช้ Left Shift กับเลขที่มี signed int โดยเฉพาะเมื่อเลื่อนด้วยค่าที่สูงมาก ๆ</p>
<h2>Conclusion</h2>
<h4>ลักษณะเด่นของ Bitwise Operations:</h4>
<ul>
<li>ประสิทธิภาพสูง: ทำงานเร็วกว่าการคำนวณปกติ</li>
<li>ประหยัดหน่วยความจำ: จัดเก็บข้อมูลหลายอย่างในตัวแปรเดียว</li>
<li>ใช้ในงานระดับต่ำ: การทำงานกับฮาร์ดแวร์, ระบบปฏิบัติการ</li>
<li>การเข้ารหัส: ใช้ในอัลกอริทึมการเข้ารหัสและบีบอัดข้อมูล</li>
<li>การจัดการแฟล็ก: ใช้ในการตั้งค่าและตรวจสอบสถานะต่างๆ</li>
</ul>
<h4>การใช้งานทั่วไป:</h4>
<ul>
<li>จัดการสิทธิ์และการอนุญาตในระบบไฟล์</li>
<li>การเข้ารหัสและถอดรหัสข้อมูล</li>
<li>การบีบอัดข้อมูล</li>
<li>การทำงานกับพิกเซลในการประมวลผลภาพ</li>
<li>การจัดการโปรโตคอลเครือข่าย</li>
<li>การทำงานกับ register ใน Embedded system</li>
</ul>
<h4>ข้อควรระวัง:</h4>
<ul>
<li>ต้องระมัดระวังเรื่องขนาดของข้อมูล (8, 16, 32, 64 บิต)</li>
<li>ความแตกต่างระหว่างเลขมี signed int และ unsigned int</li>
<li>ความแตกต่างของการทำงานในแต่ละภาษาโปรแกรม</li>
</ul>
<p>**unsigned int คือตัวเลขเป็นบวกเสมอ signed int สามารถมีค่าเป็นลบได้</p>
<p>#siamstr #Blog</p>
]]></content:encoded>
      <itunes:author><![CDATA[VΔz]]></itunes:author>
      <itunes:summary><![CDATA[<blockquote>
<p>Bitwise Operation คือ กระบวนการที่การดำเนินการใด ๆ โดยตรงกับบิตของตัวเลข หรือชุดข้อมูลของเราใน memory  ซึ่งการทำงานโดยตรงกับบิตของตัวเลข ทำให้มีประสิทธิภาพสูงและใช้บ่อยในการเขียนโปรแกรมระดับ low-level  โดยหลัก ๆ ที่ใช้กันจะมี 6 แบบ<br> เป็นเครื่องมือที่ทรงพลังสำหรับนักพัฒนาที่ต้องการประสิทธิภาพสูงและการควบคุมระดับบิต โดยเฉพาะในการพัฒนาระบบระดับ low-level และการทำงานกับฮาร์ดแวร์โดยตรง </p>
</blockquote>
<h2>TLDR</h2>
<p>ภาพรวม Bitwise Operations:</p>
<p>AND (&amp;):</p>
<p>ใช้เปรียบเทียบบิต, ให้ 1 เมื่อทั้งสองบิตเป็น 1<br>ประโยชน์: ตรวจสอบบิต, สร้าง mask</p>
<p>OR (|):</p>
<p>ให้ 1 เมื่อมีบิตใดบิตหนึ่งเป็น 1<br>ประโยชน์: รวมแฟล็ก, ตั้งค่าบิต</p>
<p>XOR (^):</p>
<p>ให้ 1 เมื่อบิตต่างกัน<br>ประโยชน์: สลับค่า, เข้ารหัสอย่างง่าย</p>
<p>NOT (~):</p>
<p>กลับค่าทุกบิต<br>ประโยชน์: สร้าง mask สำหรับลบบิต</p>
<p>Left Shift (&lt;&lt;):</p>
<p>เลื่อนบิตไปซ้าย, เติม 0 ทางขวา<br>ประโยชน์: คูณด้วยกำลังของ 2, สร้าง mask</p>
<p>Right Shift (&gt;&gt;):</p>
<p>เลื่อนบิตไปขวา<br>ประโยชน์: หารด้วยกำลังของ 2, แยกส่วนข้อมูล</p>
<h2>1.) BitAnd (&amp;):</h2>
<p>BitAnd มักใช้สัญลักษณ์ &amp; เป็นการดำเนินการทางตรรกะที่เปรียบเทียบบิตในตำแหน่งเดียวกันของสองตัวเลข โดยมีกฎดังนี้:</p>
<ul>
<li>1 AND 1 = 1</li>
<li>1 AND 0 = 0</li>
<li>0 AND 1 = 0</li>
<li>0 AND 0 = 0</li>
</ul>
<p>หรือกล่าวอีกนัยหนึ่ง ผลลัพธ์จะเป็น 1 ก็ต่อเมื่อทั้งสองบิตเป็น 1 เท่านั้น</p>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลขสองตัว A = 5 และ B = 3<br>ในระบบเลขฐานสอง:<br>A = 5 = 0101<br>B = 3 = 0011</p>
<p>เมื่อทำ BitAnd:</p>
<pre><code>  0101 (A = 5)
&amp; 0011 (B = 3)
  ----
  0001 (Result = 1)
</code></pre>
<p>จะเห็นได้ว่า:</p>
<ul>
<li>บิตที่ 1 (จากขวา): 1 &amp; 1 = 1</li>
<li>บิตที่ 2: 0 &amp; 1 = 0</li>
<li>บิตที่ 3: 1 &amp; 0 = 0</li>
<li>บิตที่ 4: 0 &amp; 0 = 0</li>
</ul>
<p>ดังนั้น ผลลัพธ์คือ 0001 ในเลขฐานสอง ซึ่งเท่ากับ 1 ในเลขฐานสิบ</p>
<p>การใช้งาน BitAnd:</p>
<ol>
<li><p>การตรวจสอบเลขคู่/คี่:<br>ถ้า (n &amp; 1) == 0 แสดงว่า n เป็นเลขคู่<br>ถ้า (n &amp; 1) == 1 แสดงว่า n เป็นเลขคี่</p>
</li>
<li><p>การตรวจสอบสถานะของบิตเฉพาะ:<br>ถ้าต้องการตรวจสอบบิตที่ 3 ของ x:<br>if (x &amp; (1 &lt;&lt; 2)) != 0 // บิตที่ 3 เป็น 1</p>
</li>
<li><p>การลบบิตสุดท้ายที่เป็น 1:<br>n = n &amp; (n - 1)</p>
</li>
</ol>
<p>BitAnd มีประโยชน์มากในการจัดการกับข้อมูลระดับบิต การตั้งค่าแฟล็ก และการทำงานกับฮาร์ดแวร์โดยตรง</p>
<h2>2.) BitOr (|):</h2>
<p>BitOr มักใช้สัญลักษณ์ | เป็นการดำเนินการทางตรรกะที่เปรียบเทียบบิตในตำแหน่งเดียวกันของสองตัวเลข โดยมีกฎดังนี้:</p>
<ul>
<li>1 OR 1 = 1</li>
<li>1 OR 0 = 1</li>
<li>0 OR 1 = 1</li>
<li>0 OR 0 = 0</li>
</ul>
<p>กล่าวคือ ผลลัพธ์จะเป็น 1 เมื่อมีบิตใดบิตหนึ่งเป็น 1 หรือทั้งสองบิตเป็น 1</p>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลขสองตัว A = 5 และ B = 3<br>ในระบบเลขฐานสอง:<br>A = 5 = 0101<br>B = 3 = 0011</p>
<p>เมื่อทำ BitOr:</p>
<pre><code>  0101 (A = 5)
| 0011 (B = 3)
  ----
  0111 (Result = 7)
</code></pre>
<p>จะเห็นได้ว่า:</p>
<ul>
<li>บิตที่ 1 (จากขวา): 1 | 1 = 1</li>
<li>บิตที่ 2: 0 | 1 = 1</li>
<li>บิตที่ 3: 1 | 0 = 1</li>
<li>บิตที่ 4: 0 | 0 = 0</li>
</ul>
<p>ดังนั้น ผลลัพธ์คือ 0111 ในเลขฐานสอง ซึ่งเท่ากับ 7 ในเลขฐานสิบ</p>
<p>การใช้งาน BitOr:</p>
<ol>
<li><p>การรวมแฟล็ก:<br>เช่น ในการตั้งค่าสิทธิ์ไฟล์ในระบบ Unix<br>permissions = READ | WRITE | EXECUTE</p>
</li>
<li><p>การตั้งค่าบิตเฉพาะ:<br>ถ้าต้องการตั้งค่าบิตที่ 3 ของ x เป็น 1:<br>x = x | (1 &lt;&lt; 2)</p>
</li>
<li><p>การรวมสี RGB:<br>ในระบบสี RGB ที่ใช้ 8 บิตต่อสี<br>color = (red &lt;&lt; 16) | (green &lt;&lt; 8) | blue</p>
</li>
</ol>
<p>BitOr มีประโยชน์มากในการรวมแฟล็ก การตั้งค่าบิต และการทำงานกับข้อมูลที่แต่ละบิตมีความหมายเฉพาะ</p>
<h2>BitXor (^):</h2>
<p>BitXor หรือ Exclusive OR (XOR) มักใช้สัญลักษณ์ ^ เป็นการดำเนินการทางตรรกะที่เปรียบเทียบบิตในตำแหน่งเดียวกันของสองตัวเลข โดยมีกฎดังนี้:</p>
<ul>
<li>1 XOR 1 = 0</li>
<li>1 XOR 0 = 1</li>
<li>0 XOR 1 = 1</li>
<li>0 XOR 0 = 0</li>
</ul>
<p>กล่าวคือ ผลลัพธ์จะเป็น 1 เมื่อบิตทั้งสองมีค่าต่างกัน</p>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลขสองตัว A = 5 และ B = 3<br>ในระบบเลขฐานสอง:<br>A = 5 = 0101<br>B = 3 = 0011</p>
<p>เมื่อทำ BitXor:</p>
<pre><code>  0101 (A = 5)
^ 0011 (B = 3)
  ----
  0110 (Result = 6)
</code></pre>
<p>จะเห็นได้ว่า:</p>
<ul>
<li>บิตที่ 1 (จากขวา): 1 ^ 1 = 0</li>
<li>บิตที่ 2: 0 ^ 1 = 1</li>
<li>บิตที่ 3: 1 ^ 0 = 1</li>
<li>บิตที่ 4: 0 ^ 0 = 0</li>
</ul>
<p>ดังนั้น ผลลัพธ์คือ 0110 ในเลขฐานสอง ซึ่งเท่ากับ 6 ในเลขฐานสิบ</p>
<p>การใช้งาน BitXor:</p>
<ol>
<li><p>การสลับค่าโดยไม่ใช้ตัวแปรเพิ่ม:<br>a ^= b;<br>b ^= a;<br>a ^= b;<br>// ตอนนี้ a และ b ได้สลับค่ากันแล้ว</p>
</li>
<li><p>การเข้ารหัสอย่างง่าย:<br>encrypted = data ^ key<br>decrypted = encrypted ^ key  // จะได้ data กลับคืนมา</p>
</li>
<li><p>การตรวจสอบความเท่ากันของตัวเลข:<br>if ((a ^ b) == 0) // a และ b เท่ากัน</p>
</li>
<li><p>การหาตัวเลขที่ไม่มีคู่ในชุดข้อมูล:<br>result = num1 ^ num2 ^ num3 ^ ... // ผลลัพธ์จะเป็นตัวเลขที่ไม่มีคู่</p>
</li>
</ol>
<p>BitXor มีคุณสมบัติพิเศษคือ การ XOR กับตัวเองจะได้ 0 และการ XOR กับ 0 จะได้ตัวเองกลับคืนมา ทำให้มันมีประโยชน์มากในการเข้ารหัสและการตรวจสอบข้อมูล</p>
<h2>BitNot (~):</h2>
<p>BitNot หรือ NOT  มักใช้สัญลักษณ์ ~ เป็นการดำเนินการทางตรรกะที่กลับบิตของตัวเลข โดยมีกฎง่ายๆ คือ:</p>
<ul>
<li>NOT 1 = 0</li>
<li>NOT 0 = 1</li>
</ul>
<p>กล่าวคือ BitNot จะเปลี่ยนทุกบิต 0 เป็น 1 และทุกบิต 1 เป็น 0</p>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลข A = 5<br>ในระบบเลขฐานสอง (สมมติว่าเป็นเลข 8 บิต):<br>A = 5 = 00000101</p>
<p>เมื่อทำ BitNot:</p>
<pre><code>  00000101 (A = 5)
  --------
~ 11111010 (Result = 250 ใน unsigned int, หรือ -6 ใน signed int)
</code></pre>
<p>จะเห็นได้ว่า:</p>
<ul>
<li>ทุกบิต 0 ถูกเปลี่ยนเป็น 1</li>
<li>ทุกบิต 1 ถูกเปลี่ยนเป็น 0</li>
</ul>
<p>ผลลัพธ์จะขึ้นอยู่กับว่าเราใช้ระบบเลขแบบไหน (signed หรือ unsigned):</p>
<ul>
<li>ในระบบ unsigned 8 บิต: 11111010 = 250</li>
<li>ในระบบ signed 8 บิต: 11111010 = -6</li>
</ul>
<p>การใช้งาน BitNot:</p>
<ol>
<li><p>การสร้าง mask สำหรับการลบบิต:<br>clear_mask = ~(1 &lt;&lt; n)  // สร้าง mask ที่มีบิตที่ n เป็น 0 และที่เหลือเป็น 1<br>x &amp;= clear_mask  // ลบบิตที่ n ของ x</p>
</li>
<li><p>การหาค่าสัมบูรณ์ของเลขติดลบในระบบ two's complement:<br>abs_value = (x ^ (x &gt;&gt; 31)) - (x &gt;&gt; 31)<br>// x &gt;&gt; 31 จะได้ 0 สำหรับเลขบวก และ -1 สำหรับเลขลบ</p>
</li>
<li><p>การสลับสถานะของทุกบิต:<br>inverted = ~original</p>
</li>
<li><p>การหาค่าสูงสุดของตัวแปรที่มีขนาด n บิต:<br>max_value = ~0 &gt;&gt; (32 - n)  // สำหรับตัวแปร 32 บิต</p>
</li>
</ol>
<p>BitNot มักใช้ร่วมกับ BitAnd เพื่อลบบิตที่ต้องการ หรือใช้ในการสร้าง mask สำหรับการจัดการบิต</p>
<h2>Left Shift (&lt;&lt;):</h2>
<p>Left Shift มักใช้สัญลักษณ์ &lt;&lt; เป็นการดำเนินการที่เลื่อนบิตทั้งหมดของตัวเลขไปทางซ้ายตามจำนวนที่กำหนด โดยเติม 0 ทางด้านขวา<br>Left Shift โดยทั่วไปแล้วไม่แตกต่างกันระหว่างเลข unsigned int และ signed int แต่มีบางประเด็นที่ควรระวัง:</p>
<ol>
<li><p>ผลลัพธ์:</p>
<ul>
<li>ในกรณีของเลขไม่มีเครื่องหมาย ผลลัพธ์จะเป็นบวกเสมอ</li>
<li>สำหรับเลขมีเครื่องหมาย ผลลัพธ์อาจเปลี่ยนเครื่องหมายได้หากบิตเครื่องหมาย (sign bit) ถูกเปลี่ยน</li>
</ul>
</li>
<li><p>Overflow:</p>
<ul>
<li>ทั้งสองกรณีอาจเกิด overflow ได้ถ้าเลื่อนมากเกินไป</li>
<li>สำหรับเลข signed int overflow อาจทำให้เกิดการเปลี่ยนเครื่องหมายโดยไม่คาดคิด</li>
</ul>
</li>
<li><p>Undefined Behavior:</p>
<ul>
<li>ในบางภาษา เช่น C/C++, การเลื่อนด้วยค่าที่มากกว่าหรือเท่ากับจำนวนบิตของตัวแปรอาจทำให้เกิด Undefined Behavior ได้</li>
</ul>
</li>
</ol>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลข A = 5 และต้องการเลื่อนซ้าย 2 ตำแหน่ง<br>ในระบบเลขฐานสอง (สมมติว่าเป็นเลข 8 บิต):<br>A = 5 = 00000101</p>
<p>เมื่อทำ Left Shift 2 ตำแหน่ง (A &lt;&lt; 2):</p>
<pre><code>  00000101 (A = 5)
  --------
  00010100 (Result = 20)
</code></pre>
<p>จะเห็นได้ว่า::</p>
<ul>
<li>บิตทั้งหมดถูกเลื่อนไปทางซ้าย 2 ตำแหน่ง</li>
<li>เติม 0 สองตัวทางด้านขวา</li>
</ul>
<p>ผลลัพธ์: 00010100 ในเลขฐานสอง ซึ่งเท่ากับ 20 ในเลขฐานสิบ</p>
<p>ตัวอย่าง 2:</p>
<pre><code>unsigned int a = 1;  // 00000001 in binary
int b = 1;           // 00000001 in binary

// Left shift by 3
unsigned int a_result = a &lt;&lt; 3;  // 00001000 (8 in decimal)
int b_result = b &lt;&lt; 3;           // 00001000 (8 in decimal)

// สำหรับตัวเลขเล็ก ๆ ผลอาจจะไม่ต่างกัน
// แต่เมื่อมีตัวเลขที่ใหญ่ขึ้น อาจจะให้ผลตรงกันข้ามแทน:

unsigned int large_a = 1 &lt;&lt; 31;  // 10000000 00000000 00000000 00000000 (2147483648 in decimal)
int large_b = 1 &lt;&lt; 31;           // 10000000 00000000 00000000 00000000 (-2147483648 in decimal, due to two's complement)
</code></pre>
<p>ในตัวอย่างสุดท้าย เราเห็นความแตกต่าง:</p>
<ul>
<li>สำหรับ unsigned int, ผลลัพธ์คือเลขบวกที่ใหญ่ที่สุดที่เป็นไปได้</li>
<li>สำหรับ signed int, ผลลัพธ์คือเลขลบที่น้อยที่สุดที่เป็นไปได้ เนื่องจากบิตซ้ายสุดถูกตีความเป็นเครื่องหมายลบในระบบ two's complement</li>
</ul>
<p>กฎการทำงาน:</p>
<ul>
<li>เลื่อนบิตทั้งหมดไปทางซ้าย n ตำแหน่ง</li>
<li>เติม 0 ทางด้านขวา n ตัว</li>
<li>บิตที่เลื่อนออกไปทางซ้ายจะหายไป</li>
</ul>
<p>การใช้งาน Left Shift:</p>
<ol>
<li><p>การคูณด้วยกำลังของ 2:<br>x &lt;&lt; n เท่ากับ x * (2^n)<br>เช่น 5 &lt;&lt; 2 = 5 * (2^2) = 5 * 4 = 20</p>
</li>
<li><p>การสร้างหน้ากาก (mask) สำหรับการตั้งค่าบิต:<br>mask = 1 &lt;&lt; n  // สร้างหน้ากากที่มีบิตที่ n เป็น 1 และที่เหลือเป็น 0<br>x |= mask  // ตั้งค่าบิตที่ n ของ x เป็น 1</p>
</li>
<li><p>การเข้ารหัสข้อมูลหลายบิตในตัวแปรเดียว:<br>encoded = (r &lt;&lt; 16) | (g &lt;&lt; 8) | b  // เก็บค่า RGB ในตัวแปร 32 บิต</p>
</li>
<li><p>การทำงานกับบิตแฟล็ก:<br>FLAG_A = 1 &lt;&lt; 0<br>FLAG_B = 1 &lt;&lt; 1<br>FLAG_C = 1 &lt;&lt; 2<br>// ใช้งาน: flags = FLAG_A | FLAG_B</p>
</li>
</ol>
<p>Left Shift มีประสิทธิภาพสูงในการคูณด้วยกำลังของ 2 และมักใช้ในการจัดการบิตแฟล็กและการสร้างหน้ากากสำหรับการดำเนินการระดับบิต</p>
<h2>Right Shift (&gt;&gt;):</h2>
<p>Right Shift มักใช้สัญลักษณ์ &gt;&gt; เป็นการดำเนินการที่เลื่อนบิตทั้งหมดของตัวเลขไปทางขวาตามจำนวนที่กำหนด การทำงานจะแตกต่างกันเล็กน้อยระหว่างเลขที่มีเครื่องหมาย (signed) และไม่มีเครื่องหมาย (unsigned)</p>
<p>สำหรับเลข unsigned int (Logical Right Shift):</p>
<ul>
<li>เลื่อนบิตทั้งหมดไปทางขวา n ตำแหน่ง</li>
<li>เติม 0 ทางด้านซ้าย n ตัว</li>
<li>บิตที่เลื่อนออกไปทางขวาจะหายไป</li>
</ul>
<p>สำหรับเลข signed int (Arithmetic Right Shift):</p>
<ul>
<li>เลื่อนบิตทั้งหมดไปทางขวา n ตำแหน่ง</li>
<li>เติมด้วยบิตเครื่องหมาย (sign bit) ทางด้านซ้าย n ตัว</li>
<li>บิตที่เลื่อนออกไปทางขวาจะหายไป</li>
</ul>
<p>ตัวอย่าง:<br>สมมติว่าเรามีเลข A = 20 และต้องการเลื่อนขวา 2 ตำแหน่ง<br>ในระบบเลขฐานสอง (สมมติว่าเป็นเลข 8 บิต):<br>A = 20 = 00010100</p>
<p>เมื่อทำ Right Shift 2 ตำแหน่ง (A &gt;&gt; 2):</p>
<pre><code>  00010100 (A = 20)
  --------
  00000101 (Result = 5)
</code></pre>
<p>จะเห็นได้ว่า::</p>
<ul>
<li>บิตทั้งหมดถูกเลื่อนไปทางขวา 2 ตำแหน่ง</li>
<li>เติม 0 สองตัวทางด้านซ้าย (สำหรับเลขไม่มีเครื่องหมาย)</li>
</ul>
<p>ผลลัพธ์: 00000101 ในเลขฐานสอง ซึ่งเท่ากับ 5 ในเลขฐานสิบ</p>
<p>การใช้งาน Right Shift:</p>
<ol>
<li><p>การหารด้วยกำลังของ 2:<br>x &gt;&gt; n เท่ากับ x / (2^n) (ปัดเศษลง)<br>เช่น 20 &gt;&gt; 2 = 20 / (2^2) = 20 / 4 = 5</p>
</li>
<li><p>การแยกส่วนของข้อมูลที่ถูกเก็บรวมกัน:<br>r = (rgb &gt;&gt; 16) &amp; 0xFF  // แยกค่าสีแดงจาก RGB 24 บิต<br>g = (rgb &gt;&gt; 8) &amp; 0xFF   // แยกค่าสีเขียว<br>b = rgb &amp; 0xFF          // แยกค่าสีน้ำเงิน</p>
</li>
<li><p>การตรวจสอบเครื่องหมายของตัวเลข:<br>sign = x &gt;&gt; 31  // สำหรับตัวแปร 32 บิต, จะได้ 0 สำหรับบวก และ -1 สำหรับลบ</p>
</li>
<li><p>การทำ rounded division:<br>(x + (1 &lt;&lt; (n-1))) &gt;&gt; n  // หารด้วย 2^n และปัดเศษ</p>
</li>
</ol>
<p>ข้อควรระวัง:</p>
<ul>
<li>ใน Java, &gt;&gt; เป็น arithmetic shift สำหรับ int และ long, ส่วน &gt;&gt;&gt; เป็น logical shift</li>
<li>ในภาษาอื่นๆ เช่น C/C++, การทำงานของ &gt;&gt; กับเลขติดลบอาจแตกต่างกันไปตาม Compiler</li>
</ul>
<p>Right Shift มีประสิทธิภาพสูงในการหารด้วยกำลังของ 2 และมักใช้ในการจัดการข้อมูลที่ถูกเก็บรวมกันในรูปแบบบิต</p>
<p>หากเปรียบกับ Right Shift แม้ว่าการทำงานพื้นฐานของ Left Shift จะเหมือนกันสำหรับทั้งเลข signed int และ unsigned int แต่การตีความผลลัพธ์และผลกระทบต่อเครื่องหมาย(sign bit)อาจแตกต่างกัน ดังนั้นจึงควรระมัดระวังเมื่อใช้ Left Shift กับเลขที่มี signed int โดยเฉพาะเมื่อเลื่อนด้วยค่าที่สูงมาก ๆ</p>
<h2>Conclusion</h2>
<h4>ลักษณะเด่นของ Bitwise Operations:</h4>
<ul>
<li>ประสิทธิภาพสูง: ทำงานเร็วกว่าการคำนวณปกติ</li>
<li>ประหยัดหน่วยความจำ: จัดเก็บข้อมูลหลายอย่างในตัวแปรเดียว</li>
<li>ใช้ในงานระดับต่ำ: การทำงานกับฮาร์ดแวร์, ระบบปฏิบัติการ</li>
<li>การเข้ารหัส: ใช้ในอัลกอริทึมการเข้ารหัสและบีบอัดข้อมูล</li>
<li>การจัดการแฟล็ก: ใช้ในการตั้งค่าและตรวจสอบสถานะต่างๆ</li>
</ul>
<h4>การใช้งานทั่วไป:</h4>
<ul>
<li>จัดการสิทธิ์และการอนุญาตในระบบไฟล์</li>
<li>การเข้ารหัสและถอดรหัสข้อมูล</li>
<li>การบีบอัดข้อมูล</li>
<li>การทำงานกับพิกเซลในการประมวลผลภาพ</li>
<li>การจัดการโปรโตคอลเครือข่าย</li>
<li>การทำงานกับ register ใน Embedded system</li>
</ul>
<h4>ข้อควรระวัง:</h4>
<ul>
<li>ต้องระมัดระวังเรื่องขนาดของข้อมูล (8, 16, 32, 64 บิต)</li>
<li>ความแตกต่างระหว่างเลขมี signed int และ unsigned int</li>
<li>ความแตกต่างของการทำงานในแต่ละภาษาโปรแกรม</li>
</ul>
<p>**unsigned int คือตัวเลขเป็นบวกเสมอ signed int สามารถมีค่าเป็นลบได้</p>
<p>#siamstr #Blog</p>
]]></itunes:summary>
      <itunes:image href="https://www.researchgate.net/profile/Rama_M_A/publication/276202732/figure/fig3/AS:667718365749268@1536207872972/Bitwise-Operators-i-Bitwise-operators-cannot-be-applied-to-float-or-double-They-can.png"/>
      </item>
      
      <item>
      <title><![CDATA[มาทำ Secure Boot บน Linux กันเถอะ]]></title>
      <description><![CDATA[ไหนมีใครใช้ Linux บ้าง???]]></description>
             <itunes:subtitle><![CDATA[ไหนมีใครใช้ Linux บ้าง???]]></itunes:subtitle>
      <pubDate>Sun, 23 Jun 2024 10:15:02 GMT</pubDate>
      <link>https://blog.siamstr.com/post/1klj6-rzdcev_jaakoli3/</link>
      <comments>https://blog.siamstr.com/post/1klj6-rzdcev_jaakoli3/</comments>
      <guid isPermaLink="false">naddr1qq2nz66vdgmz65j6g33k2ajlffqkz660f35nxq3qvaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qxpqqqp65wvzj7x2</guid>
      <category>siamstr</category>
      
        <media:content url="https://image.nostr.build/55e82d0b3a6bd7157e9a6baa0558cbb230c03c78f1d64ef4608c020ea20c9cc7.jpg" medium="image"/>
        <enclosure 
          url="https://image.nostr.build/55e82d0b3a6bd7157e9a6baa0558cbb230c03c78f1d64ef4608c020ea20c9cc7.jpg" length="0" 
          type="image/jpeg" 
        />
      <noteId>naddr1qq2nz66vdgmz65j6g33k2ajlffqkz660f35nxq3qvaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qxpqqqp65wvzj7x2</noteId>
      <npub>npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60</npub>
      <dc:creator><![CDATA[VΔz]]></dc:creator>
      <content:encoded><![CDATA[<h2>Secure Boot คืออะไร?</h2>
<p>Secure Boot เป็นฟังก์ชั่นของระบบไบออส UEFI ที่ป้องกันการติดตั้งไฟล์ระบบที่ไม่ได้รับการอนุมัติจากผู้ผลิดเมนบอร์ด<br>โดยเมื่อระบบบูต, ไบออส UEFI จะตรวจหาลายเซ็นดิจิตอลในไฟล์บูตของระบบปฏิบัติการ<br>หากตรวจพบและเช็คความถูกต้องผ่านหมด ก็จะทำการบูตระบบปฏิบัติการนั้นขึ้นมา<br>แต่ถ้าไม่พบ, ไม่ถูกต้อง หรือลายเซ็นมาจากเจ้าที่ไม่รู้จัก ก็จะปฏิเสธการบูตระบบนั้น</p>
<p>ฟีเจอร์นี้มีไว้ในกรณีที่ระบบปฏิบัติการที่มีรูโหว่แล้วถูกไวรัสเขียนทับไฟล์ระบบที่ใช้บูต หรือถูกผู้อื่นเข้าถึงคอมของเราแล้ววางไฟล์บูตที่มีช่องโหว่ให้โจมตีได้<br>เมื่อผู้ใช้รีสตาร์ต ระบบจะหยุดทำงานที่จอดำเพื่อไม่ให้ไวรัสก่อความเสียหายเพิ่มเติม หรือถูกโจมตีระบบ</p>
<h2>จำเป็นแค่ไหน?</h2>
<p>หากว่าระบของเราไม่ได้เข้ารหัสแบบ Full-disk encryption แล้วนั้น ตัว secure boot ไม่ได้จำเป็น หรือไม่มีประโยชน์ใด ๆ เลย นอกจากให้ Microsoft บังคับห้ามเราลง ระบบประติบัติการที่เราต้องการเท่านั้น (ปิด secure boot ใน bios ก็สามารถเข้าระบบได้เลย)</p>
<p>แต่สำหรับระบบที่เข้ารหัสไว้นั้น จะช่วยเพิ่มความปลอดภัยไปอีกระดับ เช่นหากโดยขโมยคอมไป แม้เขาจะพยายามแก้ไขไฟล์ boot ก็ไม่สามารถเข้าถึงระบบเราได้อยู่ดี มีเดียวทางเดียวคือล้างข้อมูลทั้งหมดทิ้งไปเท่านั้น ถึงจะใช้งานคอมเครื่องนั้น ๆ ได้ แม้จะปิด secure boot ใน bios แล้วก็ตาม</p>
<p>ทำให้ระบบ Linux ที่เข้ารหัสไว้ ปลอดภัยขึ้นอีกชั้นนึง</p>
<h2>Boot Loader</h2>
<pre><code>BIOS &gt; BOOT LOADER &gt; KERNEL &gt; INIT SYSTEM
</code></pre>
<p>ในระบบประติบัติการ Linux นั้น มีตัวเลือกสำหรับ Boot Loader ที่หลากหลาย อย่างระบบใหม่ ๆ จะใช้ systemd-boot ที่สะดวกใช้งานง่าย ปรับอะไรได้ไม่มากนัก<br>โดยตัวที่ใช้เยอะที่สุดคงจะเป็น GRUB ซึ่งสามารถปรับแต่งได้แทบทุก logic ของการบูตเข้าระบบของเรา และในบทความนี้ เราจะใช้ GRUB ในการทำ Secure Boot</p>
<p>โดยก่อนหน้านั้นเราต้องแบ่ง partition ส่วนนึงไปให้ <code>/boot/efi</code> ซึ่งเป็น filesystem แบบ fat ทั่ว ๆ ไป สำหรับ ให้ bios อ่านไฟล์ boot ของเราได้</p>
<pre><code class="language-sh">❯ sudo fdisk -l
Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: WD PC SN735 SDBPNHH-512G-1002
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 9A5798B5-DC04-4770-A26B-3A489642CF32

Device           Start        End   Sectors   Size Type
/dev/nvme0n1p1    2048    2099199   2097152     1G EFI System
/dev/nvme0n1p2 2099200 1000214527 998115328 475.9G Linux filesystem
</code></pre>
<p>และอีกส่วน จะใช้ LVM (Logical Volume Management) ในการสร้าง Volume Group (VG) บน SSD ของผม สำหรับติดตั้งระบบที่เข้ารหัสไว้ โดยจะแบ่งพื้นที่ส่วนนึงไปเป็น <code>swap</code> partition ใช้สำหรับการเก็บข้อมูลตอนที่เราพับจอ หรือเข้าโหมด sleep<br>ที่เหลือทั้งหมด ก็จะเป็นพื้นที่ติดตั้ง Linux ของผม (disk นี้ผมไม่ได้แยก <code>/home</code>(user's home) กับ <code>/</code>(root) ไว้คนละ Partition เพราะว่าผมชอบทำ root เต็มบ่อย ๆ ฮาาา)</p>
<pre><code class="language-sh">❯ sudo vgscan
  Found volume group "vg0" using metadata type lvm2

❯ sudo lvscan
  ACTIVE            '/dev/vg0/swap' [17.00 GiB] inherit
  ACTIVE            '/dev/vg0/void' [458.93 GiB] inherit
</code></pre>
<p>สำหรับวิธีการติดตั้ง Linux แบบเข้ารหัสนั้น มีอยู่ตามคู่มือตอนติดตั้ง Linux เกือบทุกตัวอยู่แล้ว ไม่ต้อง งง ยิ่งพวกที่เป็น GUI install อย่าง Fedora, Ubuntu บลา ๆ นั้นแค่คลิก ๆ ก็ทำได้แล้ว (แถมทำ Secure Boot ได้เลยอีกต่างหาก)</p>
<p>โดยที่ระบบที่ผมใช้ในบทความนี้ คือ <a href="https://voidlinux.org/">VoidLinux</a> ซี่งเป็นระบบง่าย ๆ ไม่มี systemd ให้กวนใจ</p>
<p>ส่วนของ software ที่ใช้จะมี</p>
<ol>
<li>grub</li>
<li>sbctl<br>และ bash script เล็กน้อย ในการทำ kernel hook สำหรับการ Sign ไฟล์ boot ของเราอัตโนมัติหลังจาก Update</li>
</ol>
<h1>เริ่มกันเลย!</h1>
<p>อย่างแรก ตั้งค่า SecureBoot ใน Bios เป็น Setup-Mode ให้เรียบร้อยก่อน<br> จากนั้นต้องตั้งค่า Grub กันใหม่ โดยเพิ่ม module <code>tpm</code> และ <code>--disable-shim-lock</code> (สำหรับ Microsoft's CA) เผื่อกรณีที่อยากทำ Dual Boot เข้า Windows ด้วย</p>
<pre><code class="language-sh">sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=void --modules="tpm" --disable-shim-lock
</code></pre>
<p>จากนั้นก็มา Gen ไฟล์ตั้งค่าที่เพิ่งทำไปด้วยคำสั่ง</p>
<pre><code class="language-sh">sudo grub-mkconfig -o /boot/grub/grub.cfg
</code></pre>
<p>แล้วก็ติดตั้ง sbctl ให้เรียบร้อย </p>
<pre><code class="language-sh">sudo xbps-install sbctl
</code></pre>
<p>จากนั้นลองเช็คด้วยคำสั่ง <code>sbctl status</code> ก็จะแสดงผลประมาณนี้</p>
<pre><code class="language-sh">❯ sbctl status
Installed:      ✓ sbctl is installed
.....
</code></pre>
<p>จากนั้นเราก็จะสร้าง Key สำหรับการ Sign ไฟล์ Boot ของเรา</p>
<pre><code class="language-sh">sudo sbctl create-keys
</code></pre>
<p>พอได้คีย์แล้ว <code>enroll-keys</code> ต่อ คำสั่งนี้จะสร้างรหัสสำหรับ Verify ใน Bios ให้เราหลังจากการตั้ง Setup-Mode ใน Secure Boot (<code>-m</code> คือการเพิ่ม Cert ของ Microsoft ไปด้วย เผื่อ Dual Boot)</p>
<pre><code class="language-sh">sudo sbctl enroll-keys -m
</code></pre>
<p>หลังจากขั้นตอนนี้ก็ใช้คำสั่งดู status อีกรอบ<br>และใช้คำสั่ง <code>sudo sbctl verify</code> เพื่อดูว่าเราต้อง Sign ไฟล์ไหนบ้าง</p>
<pre><code class="language-sh">❯ sbctl status
Installed:      ✓ sbctl is installed
Owner GUID:     61bb7cf9-38bb-4ef5-94f6-960b095c9322
Setup Mode:     ✓ Disabled
Secure Boot:    ✓ Enabled
Vendor Keys:    microsoft
❯ sudo sbctl verify
Verifying file database and EFI images in /boot/efi..
✓ /boot/efi/EFI/void/grubx64.efi is signed
</code></pre>
<p>อย่างตัวอย่างข้างบนคือไฟล์เหล่านี้ได้ถูก sign เรียบร้อยแล้ว ก็สามารถ Boot ด้วย Secure Boot ได้เลย<br>หากไฟล์ไหนยังไม่ได้ Sign ก็จัดการด้วยคำสั่ง <code>sudo sbctl sign -s /ไฟล์พาท</code> เช่น</p>
<pre><code class="language-sh">sudo sbctl sign -s /boot/efi/EFI/void/grubx64.efi
</code></pre>
<p>แล้วก็ลอง <code>sudo sbctl verify</code> ดูว่า sign เรียบร้อยดีไหม<br>ถ้าเรียบร้อยแล้วก็สามารถ reboot ไปเปิด SecureBoot ดูได้เลย ว่า Boot เข้าระบบได้หรือไม่</p>
<p>และบางระบบก็ต้อง sign ไฟล์ kernel ด้วยเหมือนกัน อย่างระบบผม ต้อง sign <code>/boot/vmlinuz-{version}</code>  ด้วย ไม่งั้น Boot ไม่ได้</p>
<pre><code class="language-sh">❯ sudo sbctl sign -s /boot/vmlinuz-6.9.6_1

❯ sudo sbctl verify
Verifying file database and EFI images in /boot/efi...
✓ /boot/vmlinuz-6.9.6_1 is signed
✓ /boot/efi/EFI/void/grubx64.efi is signed
</code></pre>
<p>หลังจาก reboot ด้วย SecureBoot ได้เรียบร้อย เป็นอันเสร็จ<br>แต่อย่าลืมว่าถ้าระบบ Update เราต้องกลับมา Sign เองใหม่หรือเปล่า??</p>
<h2>Kernel Hook</h2>
<p>โดยทั่วไป ระบบ Linux จะมี Directory <code>/etc/kernel.d/post-install/</code> ซึ่งจะรวบรวมเอา Script สำหรับใช้หลังจาก Update ระบบเช่น ตัว Grub เอง ก็สร้างไฟล์ config ใหม่ทุกครั้งหลังจาก update kernel</p>
<pre><code class="language-sh">cat /etc/kernel.d/post-install/50-grub
#!/bin/sh
#
# Kernel hook for GRUB 2.
#
# Arguments passed to this script: $1 pkgname, $2 version.
#
PKGNAME="$1"
VERSION="$2"

export ZPOOL_VDEV_NAME_PATH=YES

if command -v grub-mkconfig &gt;/dev/null 2&gt;&amp;1; then
        if [ -d $ROOTDIR/boot/grub ]; then
                grub-mkconfig -o $ROOTDIR/boot/grub/grub.cfg
                exit $?
        fi
fi

exit 0
</code></pre>
<p>และสังเกตุว่า ไฟล์ทั้งหมดใน Directory นี้นั้น จะนำหน้าด้วยตัวเลข ซึ่งเป็นลำดับของการทำงานนั่นเอง โดยที่เลขน้อยกว่า จะถูกรันก่อน จนครบ</p>
<pre><code class="language-sh">❯ sudo ls /etc/kernel.d/post-install/ -l
10-dkms
 20-initramfs -&gt; ../../../usr/libexec/dracut/kernel-hook-postinst
 50-bootsize
50-efibootmgr
50-grub
</code></pre>
<p>เราก็จะทำการ Copy ไฟล์ <code>50-grub</code> มาเป็น templates ในการทำ kernel hook และตั้งชื่อว่า <code>60-sign</code> เพื่อให้แน่ใจว่า ทุกอย่างถูกติดตั้งไปก่อน แล้ว sign เป็นลำดับสุดท้าย</p>
<pre><code class="language-sh">sudo cp /etc/kernel.d/post-install/50-grub  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>แล้วก็เข้าไปแก้ไขไฟล์</p>
<pre><code class="language-sh">sudo vi  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>แล้วก็ปรับคำสั่งเป็น sbctl ให้เรียบร้อย<br>จะสังเกตุว่าผมได้ใช้ sign สองครั้ง คือ <code>grub config</code> และไฟล์ kernel <code>vmlinuz-</code> ที่มีเวอร์ชั่นตามท้าย</p>
<pre><code class="language-bash">#!/bin/sh
#
# Kernel post-install hook for surcue boot.
#
# Arguments passed to this script: $1 pkgname, $2 version.
#

PKGNAME="$1"
VERSION="$2"

if command -v sbctl &gt;/dev/null 2&gt;&amp;1; then
    if [ -d $ROOTDIR/boot/efi ]; then
        echo "Signing new packages v.$VERSION"
        sbctl sign -s /boot/efi/EFI/void/grubx64.efi
        sbctl sign -s /boot/vmlinuz-${VERSION}
        exit $?
    fi
fi

exit 0
</code></pre>
<p>เซฟไฟล์ และสุดท้าย ทำ permission ให้มัน excuteable หรือว่าให้โปรแกรมเรียยกทำงานได้</p>
<pre><code class="language-sh">sudo chmod +x  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>เนื่องจากว่าบางระบบจะไม่ให้ไฟล์ script ใดๆ มาทำงานได้ตามใจชอบ<br>เราต้องควบคุมเองว่าไฟล์ไหนมี <code>สิทธ์</code> ที่จะทำงานได้ นั่นเอง</p>
<p>เพียงเท่านี้ เราก็จะมีระบบเข้ารหัสที่ปลอดภัยสุด ๆ ใครจะมาแอบเสียบแฟรชไดร์มาแก้ไขไฟล์ Boot วางยาเราไม่ได้ แน่นอน</p>
]]></content:encoded>
      <itunes:author><![CDATA[VΔz]]></itunes:author>
      <itunes:summary><![CDATA[<h2>Secure Boot คืออะไร?</h2>
<p>Secure Boot เป็นฟังก์ชั่นของระบบไบออส UEFI ที่ป้องกันการติดตั้งไฟล์ระบบที่ไม่ได้รับการอนุมัติจากผู้ผลิดเมนบอร์ด<br>โดยเมื่อระบบบูต, ไบออส UEFI จะตรวจหาลายเซ็นดิจิตอลในไฟล์บูตของระบบปฏิบัติการ<br>หากตรวจพบและเช็คความถูกต้องผ่านหมด ก็จะทำการบูตระบบปฏิบัติการนั้นขึ้นมา<br>แต่ถ้าไม่พบ, ไม่ถูกต้อง หรือลายเซ็นมาจากเจ้าที่ไม่รู้จัก ก็จะปฏิเสธการบูตระบบนั้น</p>
<p>ฟีเจอร์นี้มีไว้ในกรณีที่ระบบปฏิบัติการที่มีรูโหว่แล้วถูกไวรัสเขียนทับไฟล์ระบบที่ใช้บูต หรือถูกผู้อื่นเข้าถึงคอมของเราแล้ววางไฟล์บูตที่มีช่องโหว่ให้โจมตีได้<br>เมื่อผู้ใช้รีสตาร์ต ระบบจะหยุดทำงานที่จอดำเพื่อไม่ให้ไวรัสก่อความเสียหายเพิ่มเติม หรือถูกโจมตีระบบ</p>
<h2>จำเป็นแค่ไหน?</h2>
<p>หากว่าระบของเราไม่ได้เข้ารหัสแบบ Full-disk encryption แล้วนั้น ตัว secure boot ไม่ได้จำเป็น หรือไม่มีประโยชน์ใด ๆ เลย นอกจากให้ Microsoft บังคับห้ามเราลง ระบบประติบัติการที่เราต้องการเท่านั้น (ปิด secure boot ใน bios ก็สามารถเข้าระบบได้เลย)</p>
<p>แต่สำหรับระบบที่เข้ารหัสไว้นั้น จะช่วยเพิ่มความปลอดภัยไปอีกระดับ เช่นหากโดยขโมยคอมไป แม้เขาจะพยายามแก้ไขไฟล์ boot ก็ไม่สามารถเข้าถึงระบบเราได้อยู่ดี มีเดียวทางเดียวคือล้างข้อมูลทั้งหมดทิ้งไปเท่านั้น ถึงจะใช้งานคอมเครื่องนั้น ๆ ได้ แม้จะปิด secure boot ใน bios แล้วก็ตาม</p>
<p>ทำให้ระบบ Linux ที่เข้ารหัสไว้ ปลอดภัยขึ้นอีกชั้นนึง</p>
<h2>Boot Loader</h2>
<pre><code>BIOS &gt; BOOT LOADER &gt; KERNEL &gt; INIT SYSTEM
</code></pre>
<p>ในระบบประติบัติการ Linux นั้น มีตัวเลือกสำหรับ Boot Loader ที่หลากหลาย อย่างระบบใหม่ ๆ จะใช้ systemd-boot ที่สะดวกใช้งานง่าย ปรับอะไรได้ไม่มากนัก<br>โดยตัวที่ใช้เยอะที่สุดคงจะเป็น GRUB ซึ่งสามารถปรับแต่งได้แทบทุก logic ของการบูตเข้าระบบของเรา และในบทความนี้ เราจะใช้ GRUB ในการทำ Secure Boot</p>
<p>โดยก่อนหน้านั้นเราต้องแบ่ง partition ส่วนนึงไปให้ <code>/boot/efi</code> ซึ่งเป็น filesystem แบบ fat ทั่ว ๆ ไป สำหรับ ให้ bios อ่านไฟล์ boot ของเราได้</p>
<pre><code class="language-sh">❯ sudo fdisk -l
Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: WD PC SN735 SDBPNHH-512G-1002
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 9A5798B5-DC04-4770-A26B-3A489642CF32

Device           Start        End   Sectors   Size Type
/dev/nvme0n1p1    2048    2099199   2097152     1G EFI System
/dev/nvme0n1p2 2099200 1000214527 998115328 475.9G Linux filesystem
</code></pre>
<p>และอีกส่วน จะใช้ LVM (Logical Volume Management) ในการสร้าง Volume Group (VG) บน SSD ของผม สำหรับติดตั้งระบบที่เข้ารหัสไว้ โดยจะแบ่งพื้นที่ส่วนนึงไปเป็น <code>swap</code> partition ใช้สำหรับการเก็บข้อมูลตอนที่เราพับจอ หรือเข้าโหมด sleep<br>ที่เหลือทั้งหมด ก็จะเป็นพื้นที่ติดตั้ง Linux ของผม (disk นี้ผมไม่ได้แยก <code>/home</code>(user's home) กับ <code>/</code>(root) ไว้คนละ Partition เพราะว่าผมชอบทำ root เต็มบ่อย ๆ ฮาาา)</p>
<pre><code class="language-sh">❯ sudo vgscan
  Found volume group "vg0" using metadata type lvm2

❯ sudo lvscan
  ACTIVE            '/dev/vg0/swap' [17.00 GiB] inherit
  ACTIVE            '/dev/vg0/void' [458.93 GiB] inherit
</code></pre>
<p>สำหรับวิธีการติดตั้ง Linux แบบเข้ารหัสนั้น มีอยู่ตามคู่มือตอนติดตั้ง Linux เกือบทุกตัวอยู่แล้ว ไม่ต้อง งง ยิ่งพวกที่เป็น GUI install อย่าง Fedora, Ubuntu บลา ๆ นั้นแค่คลิก ๆ ก็ทำได้แล้ว (แถมทำ Secure Boot ได้เลยอีกต่างหาก)</p>
<p>โดยที่ระบบที่ผมใช้ในบทความนี้ คือ <a href="https://voidlinux.org/">VoidLinux</a> ซี่งเป็นระบบง่าย ๆ ไม่มี systemd ให้กวนใจ</p>
<p>ส่วนของ software ที่ใช้จะมี</p>
<ol>
<li>grub</li>
<li>sbctl<br>และ bash script เล็กน้อย ในการทำ kernel hook สำหรับการ Sign ไฟล์ boot ของเราอัตโนมัติหลังจาก Update</li>
</ol>
<h1>เริ่มกันเลย!</h1>
<p>อย่างแรก ตั้งค่า SecureBoot ใน Bios เป็น Setup-Mode ให้เรียบร้อยก่อน<br> จากนั้นต้องตั้งค่า Grub กันใหม่ โดยเพิ่ม module <code>tpm</code> และ <code>--disable-shim-lock</code> (สำหรับ Microsoft's CA) เผื่อกรณีที่อยากทำ Dual Boot เข้า Windows ด้วย</p>
<pre><code class="language-sh">sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=void --modules="tpm" --disable-shim-lock
</code></pre>
<p>จากนั้นก็มา Gen ไฟล์ตั้งค่าที่เพิ่งทำไปด้วยคำสั่ง</p>
<pre><code class="language-sh">sudo grub-mkconfig -o /boot/grub/grub.cfg
</code></pre>
<p>แล้วก็ติดตั้ง sbctl ให้เรียบร้อย </p>
<pre><code class="language-sh">sudo xbps-install sbctl
</code></pre>
<p>จากนั้นลองเช็คด้วยคำสั่ง <code>sbctl status</code> ก็จะแสดงผลประมาณนี้</p>
<pre><code class="language-sh">❯ sbctl status
Installed:      ✓ sbctl is installed
.....
</code></pre>
<p>จากนั้นเราก็จะสร้าง Key สำหรับการ Sign ไฟล์ Boot ของเรา</p>
<pre><code class="language-sh">sudo sbctl create-keys
</code></pre>
<p>พอได้คีย์แล้ว <code>enroll-keys</code> ต่อ คำสั่งนี้จะสร้างรหัสสำหรับ Verify ใน Bios ให้เราหลังจากการตั้ง Setup-Mode ใน Secure Boot (<code>-m</code> คือการเพิ่ม Cert ของ Microsoft ไปด้วย เผื่อ Dual Boot)</p>
<pre><code class="language-sh">sudo sbctl enroll-keys -m
</code></pre>
<p>หลังจากขั้นตอนนี้ก็ใช้คำสั่งดู status อีกรอบ<br>และใช้คำสั่ง <code>sudo sbctl verify</code> เพื่อดูว่าเราต้อง Sign ไฟล์ไหนบ้าง</p>
<pre><code class="language-sh">❯ sbctl status
Installed:      ✓ sbctl is installed
Owner GUID:     61bb7cf9-38bb-4ef5-94f6-960b095c9322
Setup Mode:     ✓ Disabled
Secure Boot:    ✓ Enabled
Vendor Keys:    microsoft
❯ sudo sbctl verify
Verifying file database and EFI images in /boot/efi..
✓ /boot/efi/EFI/void/grubx64.efi is signed
</code></pre>
<p>อย่างตัวอย่างข้างบนคือไฟล์เหล่านี้ได้ถูก sign เรียบร้อยแล้ว ก็สามารถ Boot ด้วย Secure Boot ได้เลย<br>หากไฟล์ไหนยังไม่ได้ Sign ก็จัดการด้วยคำสั่ง <code>sudo sbctl sign -s /ไฟล์พาท</code> เช่น</p>
<pre><code class="language-sh">sudo sbctl sign -s /boot/efi/EFI/void/grubx64.efi
</code></pre>
<p>แล้วก็ลอง <code>sudo sbctl verify</code> ดูว่า sign เรียบร้อยดีไหม<br>ถ้าเรียบร้อยแล้วก็สามารถ reboot ไปเปิด SecureBoot ดูได้เลย ว่า Boot เข้าระบบได้หรือไม่</p>
<p>และบางระบบก็ต้อง sign ไฟล์ kernel ด้วยเหมือนกัน อย่างระบบผม ต้อง sign <code>/boot/vmlinuz-{version}</code>  ด้วย ไม่งั้น Boot ไม่ได้</p>
<pre><code class="language-sh">❯ sudo sbctl sign -s /boot/vmlinuz-6.9.6_1

❯ sudo sbctl verify
Verifying file database and EFI images in /boot/efi...
✓ /boot/vmlinuz-6.9.6_1 is signed
✓ /boot/efi/EFI/void/grubx64.efi is signed
</code></pre>
<p>หลังจาก reboot ด้วย SecureBoot ได้เรียบร้อย เป็นอันเสร็จ<br>แต่อย่าลืมว่าถ้าระบบ Update เราต้องกลับมา Sign เองใหม่หรือเปล่า??</p>
<h2>Kernel Hook</h2>
<p>โดยทั่วไป ระบบ Linux จะมี Directory <code>/etc/kernel.d/post-install/</code> ซึ่งจะรวบรวมเอา Script สำหรับใช้หลังจาก Update ระบบเช่น ตัว Grub เอง ก็สร้างไฟล์ config ใหม่ทุกครั้งหลังจาก update kernel</p>
<pre><code class="language-sh">cat /etc/kernel.d/post-install/50-grub
#!/bin/sh
#
# Kernel hook for GRUB 2.
#
# Arguments passed to this script: $1 pkgname, $2 version.
#
PKGNAME="$1"
VERSION="$2"

export ZPOOL_VDEV_NAME_PATH=YES

if command -v grub-mkconfig &gt;/dev/null 2&gt;&amp;1; then
        if [ -d $ROOTDIR/boot/grub ]; then
                grub-mkconfig -o $ROOTDIR/boot/grub/grub.cfg
                exit $?
        fi
fi

exit 0
</code></pre>
<p>และสังเกตุว่า ไฟล์ทั้งหมดใน Directory นี้นั้น จะนำหน้าด้วยตัวเลข ซึ่งเป็นลำดับของการทำงานนั่นเอง โดยที่เลขน้อยกว่า จะถูกรันก่อน จนครบ</p>
<pre><code class="language-sh">❯ sudo ls /etc/kernel.d/post-install/ -l
10-dkms
 20-initramfs -&gt; ../../../usr/libexec/dracut/kernel-hook-postinst
 50-bootsize
50-efibootmgr
50-grub
</code></pre>
<p>เราก็จะทำการ Copy ไฟล์ <code>50-grub</code> มาเป็น templates ในการทำ kernel hook และตั้งชื่อว่า <code>60-sign</code> เพื่อให้แน่ใจว่า ทุกอย่างถูกติดตั้งไปก่อน แล้ว sign เป็นลำดับสุดท้าย</p>
<pre><code class="language-sh">sudo cp /etc/kernel.d/post-install/50-grub  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>แล้วก็เข้าไปแก้ไขไฟล์</p>
<pre><code class="language-sh">sudo vi  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>แล้วก็ปรับคำสั่งเป็น sbctl ให้เรียบร้อย<br>จะสังเกตุว่าผมได้ใช้ sign สองครั้ง คือ <code>grub config</code> และไฟล์ kernel <code>vmlinuz-</code> ที่มีเวอร์ชั่นตามท้าย</p>
<pre><code class="language-bash">#!/bin/sh
#
# Kernel post-install hook for surcue boot.
#
# Arguments passed to this script: $1 pkgname, $2 version.
#

PKGNAME="$1"
VERSION="$2"

if command -v sbctl &gt;/dev/null 2&gt;&amp;1; then
    if [ -d $ROOTDIR/boot/efi ]; then
        echo "Signing new packages v.$VERSION"
        sbctl sign -s /boot/efi/EFI/void/grubx64.efi
        sbctl sign -s /boot/vmlinuz-${VERSION}
        exit $?
    fi
fi

exit 0
</code></pre>
<p>เซฟไฟล์ และสุดท้าย ทำ permission ให้มัน excuteable หรือว่าให้โปรแกรมเรียยกทำงานได้</p>
<pre><code class="language-sh">sudo chmod +x  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>เนื่องจากว่าบางระบบจะไม่ให้ไฟล์ script ใดๆ มาทำงานได้ตามใจชอบ<br>เราต้องควบคุมเองว่าไฟล์ไหนมี <code>สิทธ์</code> ที่จะทำงานได้ นั่นเอง</p>
<p>เพียงเท่านี้ เราก็จะมีระบบเข้ารหัสที่ปลอดภัยสุด ๆ ใครจะมาแอบเสียบแฟรชไดร์มาแก้ไขไฟล์ Boot วางยาเราไม่ได้ แน่นอน</p>
]]></itunes:summary>
      <itunes:image href="https://image.nostr.build/55e82d0b3a6bd7157e9a6baa0558cbb230c03c78f1d64ef4608c020ea20c9cc7.jpg"/>
      </item>
      
      <item>
      <title><![CDATA[Recall north101]]></title>
      <description><![CDATA[เหลาเรื่องราวการไปพบปะกับเหล่า Bitcoiners ที่เชียงใหม่ในช่วง 25-28 ที่ผ่านมา ในมุมมองของผม อาจจะมีตกหล่นอะไรบ้างขออภัยมา ณ ที่นี้ด้วย ผมเมา]]></description>
             <itunes:subtitle><![CDATA[เหลาเรื่องราวการไปพบปะกับเหล่า Bitcoiners ที่เชียงใหม่ในช่วง 25-28 ที่ผ่านมา ในมุมมองของผม อาจจะมีตกหล่นอะไรบ้างขออภัยมา ณ ที่นี้ด้วย ผมเมา]]></itunes:subtitle>
      <pubDate>Thu, 22 Feb 2024 06:00:07 GMT</pubDate>
      <link>https://blog.siamstr.com/post/30heou8adbomfergtwg26/</link>
      <comments>https://blog.siamstr.com/post/30heou8adbomfergtwg26/</comments>
      <guid isPermaLink="false">naddr1qq2nxvzgv4h42wzpv3px7ntxg4fxw4zhguervq3qvaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qxpqqqp65wvv8kum</guid>
      <category>#siamstr</category>
      
        <media:content url="https://image.nostr.build/168a56a0ec1fd43af7140900b3cd3e24fa7a6e3a9dd7130fb36a9a5163b35c67.png" medium="image"/>
        <enclosure 
          url="https://image.nostr.build/168a56a0ec1fd43af7140900b3cd3e24fa7a6e3a9dd7130fb36a9a5163b35c67.png" length="0" 
          type="image/png" 
        />
      <noteId>naddr1qq2nxvzgv4h42wzpv3px7ntxg4fxw4zhguervq3qvaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qxpqqqp65wvv8kum</noteId>
      <npub>npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60</npub>
      <dc:creator><![CDATA[VΔz]]></dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>เหลาเรื่องราวการไปพบปะกับเหล่า Bitcoiners ที่เชียงใหม่ในช่วง 25-28 ที่ผ่านมา ในมุมมองของผม อาจจะมีตกหล่นอะไรบ้างขออภัยมา ณ ที่นี้ด้วย ผมเมา</p>
</blockquote>
<h2>planing</h2>
<p>ก่อนหน้านั้นไม่กี่วันผมได้ชวนเพื่อน ๆ ว่า <code>26-28 มกรานีัจะไปงาน Bitcoin ที่เชียงใหม่</code> ใครว่างมาเจอกันบ้างไหม<br>ซึ่งก็ติดกับช่วงรับปริญญาพอดี ไม่มีใครว่าง แต่ก็มีเพื่อนคนนึง ทักผมมาว่า <code>จะเข้าเชียงใหม่ 25 นี้พอดี ไปด้วยกันป่าว แต่กูไม่ได้ไปงาน Bitcoin นะ</code><br>ผมยังลังเล เพราะจองโรงแรมไว้วันที่ 26-28 จึงบอกเพื่อนไปตรง ๆ <code>แล้วกูจะไปนอนไหนหล่ะเนี่ย</code> เพื่อนผมก็บอกว่า นอนด้วยกันก็ได้ และทราบว่าเพื่อนจะไปงาน meetup กับ suppliers ร้านมือถือของพ่อเขา ซึ่งจัดที่โรงแรม และเข้าให้ 2 ห้อง แต่พ่อ พี่ชายเขาใช้ห้องนั้น จึงจะไปหาโรงแรมข้างนอกอยู่พอดี <code>จัดไป</code><br>ไอ่เราก็ดีเลย ไม่ต้องซื้อตั๋วรถ เลยตกลงไปด้วยกัน</p>
<h2>25</h2>
<p><a href="https://image.nostr.build/5f9001552c61ee41d7252e3f609f02ea6cc262522262cbef7be1b134f118a498.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/5f9001552c61ee41d7252e3f609f02ea6cc262522262cbef7be1b134f118a498.jpg"></a></p>
<p>ผมเริ่มออกเดินทางตอนเที่ยง วันที่ 25 จากเชียงรายโดยการติดรถเพื่อนไป 4 คนในรถ เพื่อนผม พี่ชายและแฟนเขาไปด้วย<br>เข้าเชียงใหม่ก็แวะหาอะไรกินกันที่ร้าน โอ้กะจู๋ สาขาสันทราย ซัดเนื้อน่องลายไปหนึ่งจานใหญ่ สุดท้ายมื้อนี้มีคนเลี้ยง เขินเลย 😳</p>
<p><a href="https://image.nostr.build/b23faf20220862a2b905cea2477594c1172df4040aaf32df7f71ac1b03aaded9.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/b23faf20220862a2b905cea2477594c1172df4040aaf32df7f71ac1b03aaded9.jpg"></a></p>
<p>หลังจากนั้นก็ส่งพี่ชาย และแฟนพี่เขาไปเข้างานก่อน และผมกับเพื่อนจะไปเช็คอินโรงแรม B2 ข้าง ๆ นี้ และแยกทางกัน</p>
<h4>ไป Bitdevs</h4>
<p>เริ่มด้วยการเดิน 1.8 กิโลจากโรงแรมไปทางห้างเมญ่า กะจะไปเดินดูอะไรเพลิน ๆ ก็เปิดมาเจอ live ของทีม RightShift อยู่ที่ Chit hole พอดี ก็เลยลองเดินไปดู<br>พอไปถึงน่าจะจบ live พอดีเจออิสกับหลามกำลังเดินไปห้องน้ำ และได้ทักทายกันเล็กน้อยแบบเขิน ๆ 5555 แล้วก็มาถึงร้านพี่ชิต เหล่าทีม RightShift กำลังคุยกันอยู่ เลยเดินเเข้าไปทักทาย<br>พี่จิงโจ้บอก <code>ไปกดเบียร์กันก่อนแล้วมานั่งคุยกัน</code> ผมจึงแซวไปว่า <code>พี่เลี้ยงผมใช่ไหมครับ</code> แล้วพี่แกก็เลี้ยงเบียร์จริง ๆ 555555😊 วันนี้มันวันอะไรวะเนี่ย ตั้งแต่เดินทางมายังไม่เสียตังซักแดงเดียว!</p>
<p><a href="https://image.nostr.build/011e6015d113754a642db39317d7bb8ec94c95f30b933531eb29f1adafce7476.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/011e6015d113754a642db39317d7bb8ec94c95f30b933531eb29f1adafce7476.jpg"></a></p>
<p>จากนั้นก็มีคุยกันเล็กน้อย เพราะส่วนมากผมจะนั่งฟังก็มีความสุขแล้ว 😄 ซักพัก อ.พิริยะ มาก็ได้สวัสดีทักทายกัน แต่ผมก็ไม่ได้คุยกับแกมาก และที่พลาดที่สุดคือไม่ได้รูปคู่มาเลย 🤣<br>ตอนแรกนึกว่าจะไปฟัง Bitdevs กันแค่ไม่กี่คน พอถึงเวลาไปกันทั้งทีม รวมถึง อ.พิริยะ และแม่โบว์ด้วย!</p>
<p>หลังจากสมองหวานในงาน Bitdevs ก็ชวนกันไปหาของกิน ซึ่งผมก็ไม่รู้จะไปไหนก็เลยเนียน ๆ เดินตามไปด้วย ลงเอยที่ร้านอาหารญี่ปุ่นแถวนั้น จบด้วยเบียร์ไปอีกทาว เสร็จแล้วกลับมาต่อที่ Chit hole ได้นั่งฟังทีมสภายาส้มจัดแจงหน้าที่กัน ดูจริงจังกับงานกันสุด ๆ ตามติดชีวิต RightShift แบบ Exclusive 😂</p>
<p>ไม่นานก็ถึงเวลาที่นัดกับเพื่อนไว้ ผมจึงขอตัวออกมาก่อน และก็กลับโรงแรมไปพักผ่อนเตรียมพร้อมสำหรับวันต่อไป</p>
<h2>26</h2>
<p>เช้านี้เพื่อนผมขอตัวออกไปก่อน เพราะต้องกลับแล้ว ผมจึงได้หน้าที่คืนห้องให้โรงแรม และออกมาหากาแฟ ก่อนจะมุ่งหน้าสู่ north101 ของจริงในวันนี้<br>หลังจากฝากของไว้ที่โรงแรมที่จองไว้ รอได้ห้องช่วงบ่าย ก็เห็นว่าพี่วิน พี่เซฟ ว่างพอดี เลยออกมาเดินเล่นกัน และพี่แชมป์ก็มาแจมด้วย ทุกคนต่างบอกว่าพี่เซฟหน้าเหมือนหลามมาก ๆ เค้าเลยอยากตัดผม ฮาา เราเดินไปหาข้าวซอย น้ำพริกหนุ่มกินกันที่ร้านหมวย ข้าวซอยฝั่งนิมมานซอย 12 แล้วก็เดินย่อย หาร้านตัดผมกัน ระหว่างรอก็นั่งคุยกันกับพี่วินและพี่แชมป์ นินทาพี่ Jakk Goodday และคุยเรื่องกาตูนที่พี่แชมป์วาด พี่แชมป์เล่าประสบการณ์การสร้าง Seed แบบโคตรจะปลอดภัย หรือ panic ก็มิทราบ (หยอก ๆ นะครับ) ระหว่างที่ช่างเค้าตัดผมนานมาก ๆ เป็นชั่วโมงกว่า ๆ พี่วินกับพี่แชมป์ก็ชวนกันคุยได้เรื่อย ๆ ละลายพฤติกรรมกันก่อนเข้างานแบบสบาย ๆ ออกจากร้านตัดผมเราก็ไปเดินชมเมืองเล่นดูอะไรเพลิน ๆ ตาไปจนถึงบ่ายสองครึ่ง ผมจีงแยกออกมาเช็คอินโรงแรม และพักชาร์ทแบต หาของกิน อาบน้ำ และแวะไปซักผ้า เตรียมตัวไปฟังสภายาส้ม on stage ช่วงเย็น</p>
<h3>Bitcoin &amp; Beer</h3>
<p><a href="https://image.nostr.build/19869c1d629e8d2766f17ed060749b69f73967bb7659f867d1050b4c76a2088e.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/19869c1d629e8d2766f17ed060749b69f73967bb7659f867d1050b4c76a2088e.jpg"></a></p>
<p>ถึงเวลานัดหมาย ก็เข้าไปงาน Block moutain ด้วยความที่ซื้อตั๋วไว้ จึงลงทะเบียน และไปแลกเบียร์โดยไว ก่อนจะมาเดินหาพรรคพวก (เจอกัันวันเดียวเป็นพวกกันซะแล้ว)<br>ในวันแรกนี้หลาย ๆ คนยังไม่รู้จักกันเท่าไหร่นัก เลยมีกล่้า ๆ เกร็ง ๆ กันบ้าง ได้เจอพี่ป้ำ และพี่ปิ๊งในช่วงเย็นวันนี้ มีการทำความรู้จักกันเล็กน้อย ก่อนที่พี่ตั้ม Jakk Goodday ของเราจะเรียกพากันไปนั่งรอฟังสภายาส้ม on stage<br>ถ้าจำไม่ผิดตอนเขาเดินไปนั่งผมแอบหนีไปกดเบียร์ก่อน เดี๋ยวไม่ได้อรรถรส(ฮาา) จำได้ว่าผมนั่งกับพี่แชมป์ ข้างหลังเป็น อ.ตั้ม พี่ป้ำ และพี่ปิ๊ง (พี่ป้ำ และพี่ปิ๊งนั่งคุยกันนานมาก เหมือนซี้กันมาก่อน 😆)<br>บรรยากาศสบาย ๆ มีฝนปรอย ๆ เล็กน้อย กระทบกับแสงเวทีเป็นเส้นสายราวกับดาวตก พร้อม ๆ กับสภายาส้ม อากาศชิลดีมาก จนตอนจบพี่วินหวีถึงกับอุทานว่า "แม่ง โคตรสุดยอดเลยอะ" มันส์ดีจริง ๆ</p>
<p><a href="https://image.nostr.build/b40450effff4d610255464f31378b4860cc298ef77dc089db72844aed480b456.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/b40450effff4d610255464f31378b4860cc298ef77dc089db72844aed480b456.jpg"></a></p>
<p>หลังสภาจบก็มีพี่จิงโจ้มานั่งคุยด้วย ซักพักพี่ชิตก็มา และยืนคุยอยู่กับวงผู้จัดงาน พอมีคนเห็นว่าพี่ชิตมา ทีม RightShift ก็เข้าไปรุมกอดพี่ชิต ดูอบอุ่นมากทีเดียว<br>แล้วก็ถึงเวลาที่ผู้ใหญ่ท้ัง 4 ท่าน อ.พิริยะ อ.เดชา พี่เจมส์ Picolo และพี่ชิต ขึ้นเวทีพูดคุยเรื่อง Bitcoin ไปพร้อม ๆ กับจิบเบียร์ ได้ทั้งความสนุกสนาน ได้ข้อคิด และกำลังใจดีมาก ๆ ฮาตรง อ.เดชาบ่นปวดเยี่ยว แต่เวลาคุยเพิ่ม และพี่ป๊อปก็เอาเบียร์มาเพิ่มเรื่อย ๆ ได้ยินว่าวงดนตรีที่จ้างมาก็ให้ยกเลิกไปเลยไม่ได้ขึ้นเล่นแล้ว ให้เวลากับ 4 จตุรเทพของเราคุยกันไปอีกยาว ๆ พอจบงานยังไม่จุใจ เดินตามกันไป Chit Hole และฟังพี่ชิตพูดต่ออีกเป็นชั่วโมง</p>
<p>แล้วพอถึงประมาณเที่ยงคืนกว่า ๆ ผมก็ขอตัวแยกกลับมานอนก่อน เตรียมพร้อมกับการเดินเขาขึ้นวัดผาลาดในวันพรุ่งนี้เช้า!</p>
<h2>27</h2>
<p>nevent1qvzqqqqqqypzqk845gcq3wj6suc2gd0k3uvd5zcseefccm325ksm0qfqwccy6k0hqyv8wumn8ghj7un9d3shjtnwda6x7umgdyh8w6tw9uq32amnwvaz7tmjv4kxz7fwv3sk6atn9e5k7tcqyq7vfknmazlhwqce0zqcttv7vwdlwypn8d6l02cmr904s7yqpzrfq4d2d9s</p>
<p>เช้าวันนี้ตื่นแต่เช้า เพื่อเตรียมตัวเดินไปรวมตัวกันหน้า Alexa ไปถึงก็มีพี่วินวีลงมาพอดี และรอพี่เซฟเข้าห้องน้ำก่อนจะเรียก Grab ไปที่ร้านกาแฟ Basecamp Coffee House ตรงตีนเขาที่จะขึ้นแถว ๆ หลัง มช.</p>
<h3>Monk's Trail วัดผาลาด</h3>
<p>ระหว่างที่รถออกก็เจอพี่พฤกษ์ที่มาสายกำลังเดินมา จะไป Alexa ก็เลยบอกคนขับรถให้จอด และเปิดหน้าต่างเรียกพี่เขาขึ้นรถมาด้วยกันมุ่งหน้าไปที่ Basecamp<br>พอมาถึงยังมืด ๆ อยู่ร้านกาแฟยังไม่เปิดเลยยืนคุยกันซักพัก พร้อม ๆ กับที่คนอื่น ๆ ทยอยเดินทางมารวมตัวกัน นับได้ 11 คน มีผม พี่วินวี พี่เซฟ พี่หยุน และแฟน พีฝาง คุณเน Maximize พี่จิ๊บ พี่พฤกษ์ หมออ่าน และพี่อีกคนจำชื่อไม่ได้ ขออภัยด้วย ถ้าจำไม่ผิดน่าจะเป็นเพื่อนหมออ่าน พามาเดินด้วยกัน<br>ระหว่างรอผมขอตัวไปเข้าห้องน้ำพร้อมกับไปนั่งดูดบุหรี่อยู่ ก่อนจะเดินกลับมาพบว่าไม่มีใครอยู่แล้ว.... เลยเดินเข้าไปถามพนักงานในร้านกาแฟ เลยได้รู้ว่าเขาเดินออกไปซักพักแล้ว....<br><code>แม่งทิ่้งกูเดินไปก่อนแล้ว ได้วิ่งตามเกือบโล โถ่เอ้ย มาด้วยกันแท้ ๆ</code> จำเป้นนนน ได้วิ่งตามไปเกือบครึ่งโล กลายเป็นจังหว่ะ meme ในทริปนี้ไปซะงั้น ถถถถถถ<br>พอตามมาถึงก็เฮฮาหัวเราะกันไป จากนั้นก็เดินไปคุยกันไปซักพักก็ถึงทางเข้าเส้นทางเดินป่า เราไม่รอช้า เดินตามป้าย/ทางเดินที่มีอยู่ไปเรื่อย ๆ ระหว่างทางเป็นทั้งเนินหิน ทางน้ำที่แทบจะได้ยินเสียงน้ำไหลตลอดเส้นทาง ผ่อนคลายเอามาก ๆ ไม้ป่าธรรมชาติใหญ่โต อากาศเย็นสดชื่น เสียดายอย่างเดียวว่าไม่มีแดด 🌞 เดินชมป่าชมเขาไปไม่นานก็ถึงวัดผาลาด สมชื่อวัดมาก ๆ ตั้งอยู่ตรงเนินหน้าผา มีน้ำตกไหลผ่าน ลงไปด้านล่าง ด้านบนมีฝายเล็ก ๆ เป็นแอ่งน้ำ พร้อมกับวิวบนเขาสวยงามมาก ๆ</p>
<p><a href="https://image.nostr.build/90c42ba46fb68e6ff5614b3d00d90d52f8b383db39cca04d409dc7d36fd2b7ad.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/90c42ba46fb68e6ff5614b3d00d90d52f8b383db39cca04d409dc7d36fd2b7ad.jpg"></a></p>
<p>ตอนถึงข้างบนก็เดินชมวัด ศิลปะ บางคนก็เข้าไปกราบพระข้างในวิหาร ส่วนผมเดินออกมาชมรอบ ๆ ซึมซับบรรยากาศโบราณสถานนี้ไว้ เดินดูต้นไม้สูงใหญ่ ไม้เนื้อแดงขนาดหลายคนโอบ อายุไม่ต่ำกว่าร้อยปีแน่ ๆ<br>ระหว่างที่ผมเดินเล่นก็เผลอไปทักทายฝรั่งคนนึง ได้คุยกันเล็กน้อย ว่าเขามาจากออสเตรเลีย เพิ่งมาไทยได้ประมาณสองสามวัน จึงมาหาชมวัด ชมธรรมชาติ แล้วก็แยกทางกันเดินชมวัดกันต่อ<br>ซักพักก็มานั่ง Grounding กันตรงลานหญ้าเย็น ๆ พร้อมกับต้นมะม่วงสูงใหญ่ ด้านข้างวิหาร และก็มีการเก็บถ่ายภาพจากกล้องหมออ่าน ก่อนทัี่ฝรั่งคนเมื่อกี้จะมาอาสาช่วยถ่ายรูปหมู่ให้</p>
<p><a href="https://image.nostr.build/35f9749198f818af218e874941cb41f234b2de0aff6fcb78c7983dfc7e89023e.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/35f9749198f818af218e874941cb41f234b2de0aff6fcb78c7983dfc7e89023e.jpg"></a></p>
<p>หลังจากที่ Grounding เสร็จก็นัดเวลา - สถานที่ที่ตอนกลับจะมารวมกัน ก่อนจะแยกกันไปชมวัด ดูงานศิลป์ ซึมซับธรรมชาติกัน<br>เสร็จแล้วก็ถึงเวลาเดินลงเขา กลับไปร้านกาแฟ Basecamp พักเหนื่อยจิบกาแฟกันก่อนจะแยกย้าย เพื่อมาพบกับเหล่า Bitcoiner ที่ร้าน Yellow ในช่วงสาย</p>
<h3>Meet Bitcoiner at Yellow</h3>
<p>หลังจากนั่ง Grab มาจาก Basecamp เข้าสู่นิมมาณ บ้างก็แยกย้ายกันไปเข้าที่พักเพื่ออาบน้ำ ล้างเหงื่อ บ้างก็ตรงเข้าไปที่ Yellow ตามที่ได้นัดหมายกันไว้<br>ผมกลับมาอาบน้ำล้างตัวก่อน และเดินตามไปที่ร้าน Yellow ภายหลังตอนนั้นเวลาราว ๆ 10 โมง ตามที่นัดกันไว้ ก็เริ่มมีคนทยอยมากัน โดยที่มีทีม RightShift ได้ streaming บรรยากาศ ณ ตอนนั้นสู่ทุ่งม่วง<br>ตอนที่ผมไปถึงคนยังมาไม่เยอะมาก ก็เลยไปสั่งกาแฟอีกซักช็อต เผื่อจะเอามาจิบฟังตอนที่คนมารวมกันเยอะ ๆ เพลิน ๆ จึงลุกเดินไปสั่งกาแฟที่ด้านหน้าร้าน<br>พอกลับมาที่นั่ง คนอื่น ๆ ก็ทยอยกันมา ทีมที่ไปเดินเขาวัดผาลาดเริ่มมากัน ที่เด็ดสุดคงจะเป็นนมดิบที่พี่จิ๊บเขาวานให้คุณเนแวะซื้อมาให้ลอง จากนั้นก็มีการแบ่งปันกันชิม ผมเลยขอเอามาลองผสมกาแฟกินซักหน่อย<br>และตอนนี้เก้าอี้วงเล็ก ๆ ก็ขยายวงจนล้อมไปทั่วโซน จากที่หลาย ๆ คนไม่รู้จักกัน พี่ Jakk Goodday ก็ได้เริ่มให้แต่ละคนแนะนำตนเอง ว่าเป็นใครมาจากไหน รู้จัก Bitcoin ได้อย่างไร<br>จังหว่ะนี้เองที่ทำให้หลาย ๆ คนรู้จักกันมากขึ้น ผมก็ใช้เวลาช่วงนี้พยายามจำคนให้ได้มากที่สุด มีการแซวกันเล่นบ้าง ตลกเฮฮากันไป นับว่าเป็นช่วงเวลาที่ดีมาก ๆ เผลอแปบเดียวก็บ่ายแล้ว</p>
<p>และในช่วงบ่ายทีมยาส้มจะมีการขึ้นพูดเรื่อง Nostr และ Roland พูดเรื่อง Lightning ที่งาน Block Moutain จึงตกลงแยกย้ายกันไปหาอะไรกิน ก่อนที่จะไปเจอกันที่เวทีตรงวันนิมมาน<br>ก็มีการออกความเห็นกันว่าจะไปกินอะไรที่ไหนดี ผมจึงเสนอร้านหม้อไฟเนื้อเจ้าเด็ดที่ไปกินมาเมื่อวาน ถัดไปจากตรงนี้ไม่กี่ซอย ปรากฏว่า Idea นี้ถูกซื้อ แทบจะไปกินที่ร้านนั้นกันทั้งก๊กกันเลย</p>
<h3>One Nimman at Block Moutain</h3>
<p>หลังจากที่เราซดหม้อไฟกันมาแล้ว ก็ได้เวลาที่ต้องไปรวมตัวที่กันที่ One Nimman เพื่อรอฟังพี่อาร์มกับหลามขึ้นเวทีไปพูดเรื่อง Nostr<br>บนเวทีมีผู้บรรยายเรื่อง Web3 กันอยู่ จังหว่ะนี้เองที่มีนมดิบมาเพิ่มอีก 5 ลิตร มีการทยอยกันแจกจ่ายแบ่งปันกันกิน โดยที่ผมก็ไม่รู้ว่าใครจ่าย ฮาาา<br>พอแจกนมกันเกือบครบ(แอบได้ยินมาว่าคุณยูพลาด 🤣) มีการรวมตัวกันถ่ายภาพเป็นที่ระทึก โดยมีแบคกราวหลังเป็นเวทีบรรยาย Web3(ที่ไม่พูดถึง Nostr) ได้จังหว่ะมีมกันเลยทีเดียว</p>
<p><a href="https://image.nostr.build/168a56a0ec1fd43af7140900b3cd3e24fa7a6e3a9dd7130fb36a9a5163b35c67.png" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/168a56a0ec1fd43af7140900b3cd3e24fa7a6e3a9dd7130fb36a9a5163b35c67.png"></a></p>
<p>ซักพักถึงเวลาที่หลามและพี่อาร์มต้องขึ้นไปพูดเรื่อง Nostr บนเวที ก็ไปจับจองที่นั่งแถวหน้ากัน โดยมีการถือนมไปคนละแก้ว น่ารักกันจริง ๆ 😆<br>พอจบ session ของ Nostr คุณ Roland ก็ขึ้นพูดเรื่องพื้นฐาน Bitcoin และ Lightning ที่อธิบายได้เข้าใจง่ายเอามาก ๆ แถมพูดไทยซะคล่อง จนพิธีกรต้องแซว</p>
<h3>Chit hole ยาว ๆ</h3>
<p>หลังจากช่วงที่หน้าเวทีของ Roland จบลง ทุกคนก็พากันไปต่อที่ Chit Hole กันตั้งแต่ยังไม่ค่ำ คนขายคงเบื่อขี้หน้าเราแล้ว อย่างที่เห็นโน๊ตผ่าน ๆ 😆<br>ตอนแรกพี่ Jakk พากันมานั่งจองโต๊ะนั่งด้านใน แต่ทิ้งให้นั่งอยู่กันสองสามคน ผม น้องนัท และพี่จิ๊บ แล้วคนอื่น ๆ ก็ไปนั่งข้างนอกกันหมด -*-<br>ก่อนที่ Roland และภรรยาจะมานั่งร่วมโต๊ะ และคุยด้วยกัน พอเห็นน้องนัทมันดูหงอย ๆ ฟังเพลงอยู่คนเดียว Roland เลยเลี้ยงเบียร์น้องไป แถมแนะนำหนังสือให้ผมด้วยอีก ใจดีมาก<br>หลังจากนั้น Lกฮ ก็เริ่มพรุ่งพร่านเข้าสู่กระแสเลือด ความเมามันส์กำลังงก่อขึ้น ด้วยบรรยากาศในร้าน และเหล่า Bitcoiners ที่คุยกันตามความสนใจของตนในมุมต่าง ๆ ของร้าน<br>มีทั้งวงปรัชญาจากพี่ชิต ยาแดงจากพี่จิงโจ้ วิถีเต๋าของ อ.ขิง ที่ยังโสดอยู๋ แวะวงของ อ.พิริยะ และ อ.เดชา เลือกฟังกันไม่ถูกเลยทีเดียว มันเป็นคืนที่ดี เอามาก ๆ ลากยาวกันจนร้านปิด ยังไม่พอ<br>หาที่นั่งคุยกันต่อยันตี 3 กว่า อีกวันมาลุกแทบไม่ได้</p>
<h2>28</h2>
<p>หลังจากเมื่อคืนกลับตี 3 กว่า ๆ เช้าวันนี้ยังสะลึมสะลือ จากอาการเมาค้าง แต่ก็ต้องลุกจากเตียงไปอาบน้ำ เพื่อไปเจอกันที่ Chit Hole อีกครั้ง</p>
<h3>ก่อนจะลา</h3>
<p>หลังจากกทำธุระส่วนตัวเสร็จ ก็คืนห้องให้โรงแรมก่อน และเดินไปที่ Chit Hole พอไปถึง ก็หากาแฟกินก่อนเลยอันดับแรก และก็เป็นช่วงที่คุณยูกำลังพูดอยู่พอดี<br>มาได้ยินจังหว่ะเดือด ๆ พอดีซะด้วย แต่ด้วยสภาพร่างกาย จำอะไรแทบไม่ได้ 5555555 แถมกับความประมาท ไม่ได้จองตั๋วรถไว้ ก็เลยได้ตั๋วรถของเช้าวันพรุ่งนี้แทน ฮา😂<br>แล้วซักพักหลาย ๆ คนก็ทยอยกลับ ก็รู้สึก โหวง ๆ นิดหน่อย ที่งานเลี้ยงกลังจะถึงเวลาเลิกลา และก็ทราบว่าอิสรกับพี่จิงโจ้ และพี่วินนั้นกลับพรุ่งนี้เช่นกัน<br>จึงคุยกันซะดิบดี เย็นนี้ไปไหนกัน ถึงตอนเที่ยง ทุกคนก็เริ่มแยกย้ายกัน และก็ได้เจอกับพี่เอ็ดดี้ ผู้ปลอมเป็นอานนต์ บอกว่าติดรถไปด้วยกันได้นะ พี่ก็จะเข้าเชียงราย ผมเลยตกลงเลยทันที ดีเลย ไม่ต้องหาที่นอนแล้ว ตั๋วรถก็ช่างมันไป ไม่กี่บาท</p>
<p>จากนั้นผมจับกลุ่มกับพี่วินวี กับทีม RightShift ที่เหลืออยู่ ไปนั่งคุยกันที่ลานไวน์หน้า Alexa และมีพี่แองจี้ ที่เพิ่งเริ่มเล่น Nostr ใหม่ ๆ มาร่วมกลุ่มคุยด้วยกัน<br>จำได้ว่าพี่วินวีชวยคุยกันเก่งมาก ๆ จนพี่จิงโจ้ และอิสรไปนอน ก็ยังคุยได้หลายชั่วโมงยันค่่ำ จนพี่เอ็ดดี้มารับผม เพื่อนเดินทางกลับถึงจะเริ่มแยกย้ายกัน</p>
<h3>กลับบ้าน</h3>
<p>ขากลับกับพี่เอ็ดดี้เป็นทริปแบบสบาย ๆ คุยกันจนขับเลยแยก ต้องอ้อมวนกลับมาใหม่กันเลยทีเดียว 55555 ตอนแรกก็คุยเรื่องเป็นไงมายังไงถึงมาอยู่วงการนี้<br>ลามไปยันเรื่องสมัยเรียน รวมถึงหลักการทำงาน เปรียบเทียบระหว่างฟังชั่นการทำงานของ NFT ที่พี่แกทำอยู่สามารถใช้ Bitcoin มาแทนตรงไหนได้หรือไหม<br>และเปรี่ยบเทียบเทคโนโลยี ว่าของเจ้านี้มีแบบนี้ ถ้าเป็น Lightning จะมาปรับใช้แทนได้ไหม ฯลฯ จนมาถึงแม่ขจาน จึงแวะหาอะไรกินที่ร้านข้าวต้มเจ้าเด็ดตรงนั้น<br>แถมพี่แกยังเลี้ยงมื้อนี้ด้วยอีกต่างหาก ก่อนจะขับรถต่อไปจนส่งผมถึงหน้าบ้านกันเลย ขอบคุณอานนต์มากครับ 🙏</p>
<h4>แล้วพบกันใหม่</h4>
<p>#north101 #siamstr #siamstrOG</p>
]]></content:encoded>
      <itunes:author><![CDATA[VΔz]]></itunes:author>
      <itunes:summary><![CDATA[<blockquote>
<p>เหลาเรื่องราวการไปพบปะกับเหล่า Bitcoiners ที่เชียงใหม่ในช่วง 25-28 ที่ผ่านมา ในมุมมองของผม อาจจะมีตกหล่นอะไรบ้างขออภัยมา ณ ที่นี้ด้วย ผมเมา</p>
</blockquote>
<h2>planing</h2>
<p>ก่อนหน้านั้นไม่กี่วันผมได้ชวนเพื่อน ๆ ว่า <code>26-28 มกรานีัจะไปงาน Bitcoin ที่เชียงใหม่</code> ใครว่างมาเจอกันบ้างไหม<br>ซึ่งก็ติดกับช่วงรับปริญญาพอดี ไม่มีใครว่าง แต่ก็มีเพื่อนคนนึง ทักผมมาว่า <code>จะเข้าเชียงใหม่ 25 นี้พอดี ไปด้วยกันป่าว แต่กูไม่ได้ไปงาน Bitcoin นะ</code><br>ผมยังลังเล เพราะจองโรงแรมไว้วันที่ 26-28 จึงบอกเพื่อนไปตรง ๆ <code>แล้วกูจะไปนอนไหนหล่ะเนี่ย</code> เพื่อนผมก็บอกว่า นอนด้วยกันก็ได้ และทราบว่าเพื่อนจะไปงาน meetup กับ suppliers ร้านมือถือของพ่อเขา ซึ่งจัดที่โรงแรม และเข้าให้ 2 ห้อง แต่พ่อ พี่ชายเขาใช้ห้องนั้น จึงจะไปหาโรงแรมข้างนอกอยู่พอดี <code>จัดไป</code><br>ไอ่เราก็ดีเลย ไม่ต้องซื้อตั๋วรถ เลยตกลงไปด้วยกัน</p>
<h2>25</h2>
<p><a href="https://image.nostr.build/5f9001552c61ee41d7252e3f609f02ea6cc262522262cbef7be1b134f118a498.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/5f9001552c61ee41d7252e3f609f02ea6cc262522262cbef7be1b134f118a498.jpg"></a></p>
<p>ผมเริ่มออกเดินทางตอนเที่ยง วันที่ 25 จากเชียงรายโดยการติดรถเพื่อนไป 4 คนในรถ เพื่อนผม พี่ชายและแฟนเขาไปด้วย<br>เข้าเชียงใหม่ก็แวะหาอะไรกินกันที่ร้าน โอ้กะจู๋ สาขาสันทราย ซัดเนื้อน่องลายไปหนึ่งจานใหญ่ สุดท้ายมื้อนี้มีคนเลี้ยง เขินเลย 😳</p>
<p><a href="https://image.nostr.build/b23faf20220862a2b905cea2477594c1172df4040aaf32df7f71ac1b03aaded9.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/b23faf20220862a2b905cea2477594c1172df4040aaf32df7f71ac1b03aaded9.jpg"></a></p>
<p>หลังจากนั้นก็ส่งพี่ชาย และแฟนพี่เขาไปเข้างานก่อน และผมกับเพื่อนจะไปเช็คอินโรงแรม B2 ข้าง ๆ นี้ และแยกทางกัน</p>
<h4>ไป Bitdevs</h4>
<p>เริ่มด้วยการเดิน 1.8 กิโลจากโรงแรมไปทางห้างเมญ่า กะจะไปเดินดูอะไรเพลิน ๆ ก็เปิดมาเจอ live ของทีม RightShift อยู่ที่ Chit hole พอดี ก็เลยลองเดินไปดู<br>พอไปถึงน่าจะจบ live พอดีเจออิสกับหลามกำลังเดินไปห้องน้ำ และได้ทักทายกันเล็กน้อยแบบเขิน ๆ 5555 แล้วก็มาถึงร้านพี่ชิต เหล่าทีม RightShift กำลังคุยกันอยู่ เลยเดินเเข้าไปทักทาย<br>พี่จิงโจ้บอก <code>ไปกดเบียร์กันก่อนแล้วมานั่งคุยกัน</code> ผมจึงแซวไปว่า <code>พี่เลี้ยงผมใช่ไหมครับ</code> แล้วพี่แกก็เลี้ยงเบียร์จริง ๆ 555555😊 วันนี้มันวันอะไรวะเนี่ย ตั้งแต่เดินทางมายังไม่เสียตังซักแดงเดียว!</p>
<p><a href="https://image.nostr.build/011e6015d113754a642db39317d7bb8ec94c95f30b933531eb29f1adafce7476.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/011e6015d113754a642db39317d7bb8ec94c95f30b933531eb29f1adafce7476.jpg"></a></p>
<p>จากนั้นก็มีคุยกันเล็กน้อย เพราะส่วนมากผมจะนั่งฟังก็มีความสุขแล้ว 😄 ซักพัก อ.พิริยะ มาก็ได้สวัสดีทักทายกัน แต่ผมก็ไม่ได้คุยกับแกมาก และที่พลาดที่สุดคือไม่ได้รูปคู่มาเลย 🤣<br>ตอนแรกนึกว่าจะไปฟัง Bitdevs กันแค่ไม่กี่คน พอถึงเวลาไปกันทั้งทีม รวมถึง อ.พิริยะ และแม่โบว์ด้วย!</p>
<p>หลังจากสมองหวานในงาน Bitdevs ก็ชวนกันไปหาของกิน ซึ่งผมก็ไม่รู้จะไปไหนก็เลยเนียน ๆ เดินตามไปด้วย ลงเอยที่ร้านอาหารญี่ปุ่นแถวนั้น จบด้วยเบียร์ไปอีกทาว เสร็จแล้วกลับมาต่อที่ Chit hole ได้นั่งฟังทีมสภายาส้มจัดแจงหน้าที่กัน ดูจริงจังกับงานกันสุด ๆ ตามติดชีวิต RightShift แบบ Exclusive 😂</p>
<p>ไม่นานก็ถึงเวลาที่นัดกับเพื่อนไว้ ผมจึงขอตัวออกมาก่อน และก็กลับโรงแรมไปพักผ่อนเตรียมพร้อมสำหรับวันต่อไป</p>
<h2>26</h2>
<p>เช้านี้เพื่อนผมขอตัวออกไปก่อน เพราะต้องกลับแล้ว ผมจึงได้หน้าที่คืนห้องให้โรงแรม และออกมาหากาแฟ ก่อนจะมุ่งหน้าสู่ north101 ของจริงในวันนี้<br>หลังจากฝากของไว้ที่โรงแรมที่จองไว้ รอได้ห้องช่วงบ่าย ก็เห็นว่าพี่วิน พี่เซฟ ว่างพอดี เลยออกมาเดินเล่นกัน และพี่แชมป์ก็มาแจมด้วย ทุกคนต่างบอกว่าพี่เซฟหน้าเหมือนหลามมาก ๆ เค้าเลยอยากตัดผม ฮาา เราเดินไปหาข้าวซอย น้ำพริกหนุ่มกินกันที่ร้านหมวย ข้าวซอยฝั่งนิมมานซอย 12 แล้วก็เดินย่อย หาร้านตัดผมกัน ระหว่างรอก็นั่งคุยกันกับพี่วินและพี่แชมป์ นินทาพี่ Jakk Goodday และคุยเรื่องกาตูนที่พี่แชมป์วาด พี่แชมป์เล่าประสบการณ์การสร้าง Seed แบบโคตรจะปลอดภัย หรือ panic ก็มิทราบ (หยอก ๆ นะครับ) ระหว่างที่ช่างเค้าตัดผมนานมาก ๆ เป็นชั่วโมงกว่า ๆ พี่วินกับพี่แชมป์ก็ชวนกันคุยได้เรื่อย ๆ ละลายพฤติกรรมกันก่อนเข้างานแบบสบาย ๆ ออกจากร้านตัดผมเราก็ไปเดินชมเมืองเล่นดูอะไรเพลิน ๆ ตาไปจนถึงบ่ายสองครึ่ง ผมจีงแยกออกมาเช็คอินโรงแรม และพักชาร์ทแบต หาของกิน อาบน้ำ และแวะไปซักผ้า เตรียมตัวไปฟังสภายาส้ม on stage ช่วงเย็น</p>
<h3>Bitcoin &amp; Beer</h3>
<p><a href="https://image.nostr.build/19869c1d629e8d2766f17ed060749b69f73967bb7659f867d1050b4c76a2088e.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/19869c1d629e8d2766f17ed060749b69f73967bb7659f867d1050b4c76a2088e.jpg"></a></p>
<p>ถึงเวลานัดหมาย ก็เข้าไปงาน Block moutain ด้วยความที่ซื้อตั๋วไว้ จึงลงทะเบียน และไปแลกเบียร์โดยไว ก่อนจะมาเดินหาพรรคพวก (เจอกัันวันเดียวเป็นพวกกันซะแล้ว)<br>ในวันแรกนี้หลาย ๆ คนยังไม่รู้จักกันเท่าไหร่นัก เลยมีกล่้า ๆ เกร็ง ๆ กันบ้าง ได้เจอพี่ป้ำ และพี่ปิ๊งในช่วงเย็นวันนี้ มีการทำความรู้จักกันเล็กน้อย ก่อนที่พี่ตั้ม Jakk Goodday ของเราจะเรียกพากันไปนั่งรอฟังสภายาส้ม on stage<br>ถ้าจำไม่ผิดตอนเขาเดินไปนั่งผมแอบหนีไปกดเบียร์ก่อน เดี๋ยวไม่ได้อรรถรส(ฮาา) จำได้ว่าผมนั่งกับพี่แชมป์ ข้างหลังเป็น อ.ตั้ม พี่ป้ำ และพี่ปิ๊ง (พี่ป้ำ และพี่ปิ๊งนั่งคุยกันนานมาก เหมือนซี้กันมาก่อน 😆)<br>บรรยากาศสบาย ๆ มีฝนปรอย ๆ เล็กน้อย กระทบกับแสงเวทีเป็นเส้นสายราวกับดาวตก พร้อม ๆ กับสภายาส้ม อากาศชิลดีมาก จนตอนจบพี่วินหวีถึงกับอุทานว่า "แม่ง โคตรสุดยอดเลยอะ" มันส์ดีจริง ๆ</p>
<p><a href="https://image.nostr.build/b40450effff4d610255464f31378b4860cc298ef77dc089db72844aed480b456.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/b40450effff4d610255464f31378b4860cc298ef77dc089db72844aed480b456.jpg"></a></p>
<p>หลังสภาจบก็มีพี่จิงโจ้มานั่งคุยด้วย ซักพักพี่ชิตก็มา และยืนคุยอยู่กับวงผู้จัดงาน พอมีคนเห็นว่าพี่ชิตมา ทีม RightShift ก็เข้าไปรุมกอดพี่ชิต ดูอบอุ่นมากทีเดียว<br>แล้วก็ถึงเวลาที่ผู้ใหญ่ท้ัง 4 ท่าน อ.พิริยะ อ.เดชา พี่เจมส์ Picolo และพี่ชิต ขึ้นเวทีพูดคุยเรื่อง Bitcoin ไปพร้อม ๆ กับจิบเบียร์ ได้ทั้งความสนุกสนาน ได้ข้อคิด และกำลังใจดีมาก ๆ ฮาตรง อ.เดชาบ่นปวดเยี่ยว แต่เวลาคุยเพิ่ม และพี่ป๊อปก็เอาเบียร์มาเพิ่มเรื่อย ๆ ได้ยินว่าวงดนตรีที่จ้างมาก็ให้ยกเลิกไปเลยไม่ได้ขึ้นเล่นแล้ว ให้เวลากับ 4 จตุรเทพของเราคุยกันไปอีกยาว ๆ พอจบงานยังไม่จุใจ เดินตามกันไป Chit Hole และฟังพี่ชิตพูดต่ออีกเป็นชั่วโมง</p>
<p>แล้วพอถึงประมาณเที่ยงคืนกว่า ๆ ผมก็ขอตัวแยกกลับมานอนก่อน เตรียมพร้อมกับการเดินเขาขึ้นวัดผาลาดในวันพรุ่งนี้เช้า!</p>
<h2>27</h2>
<p>nevent1qvzqqqqqqypzqk845gcq3wj6suc2gd0k3uvd5zcseefccm325ksm0qfqwccy6k0hqyv8wumn8ghj7un9d3shjtnwda6x7umgdyh8w6tw9uq32amnwvaz7tmjv4kxz7fwv3sk6atn9e5k7tcqyq7vfknmazlhwqce0zqcttv7vwdlwypn8d6l02cmr904s7yqpzrfq4d2d9s</p>
<p>เช้าวันนี้ตื่นแต่เช้า เพื่อเตรียมตัวเดินไปรวมตัวกันหน้า Alexa ไปถึงก็มีพี่วินวีลงมาพอดี และรอพี่เซฟเข้าห้องน้ำก่อนจะเรียก Grab ไปที่ร้านกาแฟ Basecamp Coffee House ตรงตีนเขาที่จะขึ้นแถว ๆ หลัง มช.</p>
<h3>Monk's Trail วัดผาลาด</h3>
<p>ระหว่างที่รถออกก็เจอพี่พฤกษ์ที่มาสายกำลังเดินมา จะไป Alexa ก็เลยบอกคนขับรถให้จอด และเปิดหน้าต่างเรียกพี่เขาขึ้นรถมาด้วยกันมุ่งหน้าไปที่ Basecamp<br>พอมาถึงยังมืด ๆ อยู่ร้านกาแฟยังไม่เปิดเลยยืนคุยกันซักพัก พร้อม ๆ กับที่คนอื่น ๆ ทยอยเดินทางมารวมตัวกัน นับได้ 11 คน มีผม พี่วินวี พี่เซฟ พี่หยุน และแฟน พีฝาง คุณเน Maximize พี่จิ๊บ พี่พฤกษ์ หมออ่าน และพี่อีกคนจำชื่อไม่ได้ ขออภัยด้วย ถ้าจำไม่ผิดน่าจะเป็นเพื่อนหมออ่าน พามาเดินด้วยกัน<br>ระหว่างรอผมขอตัวไปเข้าห้องน้ำพร้อมกับไปนั่งดูดบุหรี่อยู่ ก่อนจะเดินกลับมาพบว่าไม่มีใครอยู่แล้ว.... เลยเดินเข้าไปถามพนักงานในร้านกาแฟ เลยได้รู้ว่าเขาเดินออกไปซักพักแล้ว....<br><code>แม่งทิ่้งกูเดินไปก่อนแล้ว ได้วิ่งตามเกือบโล โถ่เอ้ย มาด้วยกันแท้ ๆ</code> จำเป้นนนน ได้วิ่งตามไปเกือบครึ่งโล กลายเป็นจังหว่ะ meme ในทริปนี้ไปซะงั้น ถถถถถถ<br>พอตามมาถึงก็เฮฮาหัวเราะกันไป จากนั้นก็เดินไปคุยกันไปซักพักก็ถึงทางเข้าเส้นทางเดินป่า เราไม่รอช้า เดินตามป้าย/ทางเดินที่มีอยู่ไปเรื่อย ๆ ระหว่างทางเป็นทั้งเนินหิน ทางน้ำที่แทบจะได้ยินเสียงน้ำไหลตลอดเส้นทาง ผ่อนคลายเอามาก ๆ ไม้ป่าธรรมชาติใหญ่โต อากาศเย็นสดชื่น เสียดายอย่างเดียวว่าไม่มีแดด 🌞 เดินชมป่าชมเขาไปไม่นานก็ถึงวัดผาลาด สมชื่อวัดมาก ๆ ตั้งอยู่ตรงเนินหน้าผา มีน้ำตกไหลผ่าน ลงไปด้านล่าง ด้านบนมีฝายเล็ก ๆ เป็นแอ่งน้ำ พร้อมกับวิวบนเขาสวยงามมาก ๆ</p>
<p><a href="https://image.nostr.build/90c42ba46fb68e6ff5614b3d00d90d52f8b383db39cca04d409dc7d36fd2b7ad.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/90c42ba46fb68e6ff5614b3d00d90d52f8b383db39cca04d409dc7d36fd2b7ad.jpg"></a></p>
<p>ตอนถึงข้างบนก็เดินชมวัด ศิลปะ บางคนก็เข้าไปกราบพระข้างในวิหาร ส่วนผมเดินออกมาชมรอบ ๆ ซึมซับบรรยากาศโบราณสถานนี้ไว้ เดินดูต้นไม้สูงใหญ่ ไม้เนื้อแดงขนาดหลายคนโอบ อายุไม่ต่ำกว่าร้อยปีแน่ ๆ<br>ระหว่างที่ผมเดินเล่นก็เผลอไปทักทายฝรั่งคนนึง ได้คุยกันเล็กน้อย ว่าเขามาจากออสเตรเลีย เพิ่งมาไทยได้ประมาณสองสามวัน จึงมาหาชมวัด ชมธรรมชาติ แล้วก็แยกทางกันเดินชมวัดกันต่อ<br>ซักพักก็มานั่ง Grounding กันตรงลานหญ้าเย็น ๆ พร้อมกับต้นมะม่วงสูงใหญ่ ด้านข้างวิหาร และก็มีการเก็บถ่ายภาพจากกล้องหมออ่าน ก่อนทัี่ฝรั่งคนเมื่อกี้จะมาอาสาช่วยถ่ายรูปหมู่ให้</p>
<p><a href="https://image.nostr.build/35f9749198f818af218e874941cb41f234b2de0aff6fcb78c7983dfc7e89023e.jpg" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/35f9749198f818af218e874941cb41f234b2de0aff6fcb78c7983dfc7e89023e.jpg"></a></p>
<p>หลังจากที่ Grounding เสร็จก็นัดเวลา - สถานที่ที่ตอนกลับจะมารวมกัน ก่อนจะแยกกันไปชมวัด ดูงานศิลป์ ซึมซับธรรมชาติกัน<br>เสร็จแล้วก็ถึงเวลาเดินลงเขา กลับไปร้านกาแฟ Basecamp พักเหนื่อยจิบกาแฟกันก่อนจะแยกย้าย เพื่อมาพบกับเหล่า Bitcoiner ที่ร้าน Yellow ในช่วงสาย</p>
<h3>Meet Bitcoiner at Yellow</h3>
<p>หลังจากนั่ง Grab มาจาก Basecamp เข้าสู่นิมมาณ บ้างก็แยกย้ายกันไปเข้าที่พักเพื่ออาบน้ำ ล้างเหงื่อ บ้างก็ตรงเข้าไปที่ Yellow ตามที่ได้นัดหมายกันไว้<br>ผมกลับมาอาบน้ำล้างตัวก่อน และเดินตามไปที่ร้าน Yellow ภายหลังตอนนั้นเวลาราว ๆ 10 โมง ตามที่นัดกันไว้ ก็เริ่มมีคนทยอยมากัน โดยที่มีทีม RightShift ได้ streaming บรรยากาศ ณ ตอนนั้นสู่ทุ่งม่วง<br>ตอนที่ผมไปถึงคนยังมาไม่เยอะมาก ก็เลยไปสั่งกาแฟอีกซักช็อต เผื่อจะเอามาจิบฟังตอนที่คนมารวมกันเยอะ ๆ เพลิน ๆ จึงลุกเดินไปสั่งกาแฟที่ด้านหน้าร้าน<br>พอกลับมาที่นั่ง คนอื่น ๆ ก็ทยอยกันมา ทีมที่ไปเดินเขาวัดผาลาดเริ่มมากัน ที่เด็ดสุดคงจะเป็นนมดิบที่พี่จิ๊บเขาวานให้คุณเนแวะซื้อมาให้ลอง จากนั้นก็มีการแบ่งปันกันชิม ผมเลยขอเอามาลองผสมกาแฟกินซักหน่อย<br>และตอนนี้เก้าอี้วงเล็ก ๆ ก็ขยายวงจนล้อมไปทั่วโซน จากที่หลาย ๆ คนไม่รู้จักกัน พี่ Jakk Goodday ก็ได้เริ่มให้แต่ละคนแนะนำตนเอง ว่าเป็นใครมาจากไหน รู้จัก Bitcoin ได้อย่างไร<br>จังหว่ะนี้เองที่ทำให้หลาย ๆ คนรู้จักกันมากขึ้น ผมก็ใช้เวลาช่วงนี้พยายามจำคนให้ได้มากที่สุด มีการแซวกันเล่นบ้าง ตลกเฮฮากันไป นับว่าเป็นช่วงเวลาที่ดีมาก ๆ เผลอแปบเดียวก็บ่ายแล้ว</p>
<p>และในช่วงบ่ายทีมยาส้มจะมีการขึ้นพูดเรื่อง Nostr และ Roland พูดเรื่อง Lightning ที่งาน Block Moutain จึงตกลงแยกย้ายกันไปหาอะไรกิน ก่อนที่จะไปเจอกันที่เวทีตรงวันนิมมาน<br>ก็มีการออกความเห็นกันว่าจะไปกินอะไรที่ไหนดี ผมจึงเสนอร้านหม้อไฟเนื้อเจ้าเด็ดที่ไปกินมาเมื่อวาน ถัดไปจากตรงนี้ไม่กี่ซอย ปรากฏว่า Idea นี้ถูกซื้อ แทบจะไปกินที่ร้านนั้นกันทั้งก๊กกันเลย</p>
<h3>One Nimman at Block Moutain</h3>
<p>หลังจากที่เราซดหม้อไฟกันมาแล้ว ก็ได้เวลาที่ต้องไปรวมตัวที่กันที่ One Nimman เพื่อรอฟังพี่อาร์มกับหลามขึ้นเวทีไปพูดเรื่อง Nostr<br>บนเวทีมีผู้บรรยายเรื่อง Web3 กันอยู่ จังหว่ะนี้เองที่มีนมดิบมาเพิ่มอีก 5 ลิตร มีการทยอยกันแจกจ่ายแบ่งปันกันกิน โดยที่ผมก็ไม่รู้ว่าใครจ่าย ฮาาา<br>พอแจกนมกันเกือบครบ(แอบได้ยินมาว่าคุณยูพลาด 🤣) มีการรวมตัวกันถ่ายภาพเป็นที่ระทึก โดยมีแบคกราวหลังเป็นเวทีบรรยาย Web3(ที่ไม่พูดถึง Nostr) ได้จังหว่ะมีมกันเลยทีเดียว</p>
<p><a href="https://image.nostr.build/168a56a0ec1fd43af7140900b3cd3e24fa7a6e3a9dd7130fb36a9a5163b35c67.png" class="vbx-media" target="_blank"><img class="venobox" src="https://image.nostr.build/168a56a0ec1fd43af7140900b3cd3e24fa7a6e3a9dd7130fb36a9a5163b35c67.png"></a></p>
<p>ซักพักถึงเวลาที่หลามและพี่อาร์มต้องขึ้นไปพูดเรื่อง Nostr บนเวที ก็ไปจับจองที่นั่งแถวหน้ากัน โดยมีการถือนมไปคนละแก้ว น่ารักกันจริง ๆ 😆<br>พอจบ session ของ Nostr คุณ Roland ก็ขึ้นพูดเรื่องพื้นฐาน Bitcoin และ Lightning ที่อธิบายได้เข้าใจง่ายเอามาก ๆ แถมพูดไทยซะคล่อง จนพิธีกรต้องแซว</p>
<h3>Chit hole ยาว ๆ</h3>
<p>หลังจากช่วงที่หน้าเวทีของ Roland จบลง ทุกคนก็พากันไปต่อที่ Chit Hole กันตั้งแต่ยังไม่ค่ำ คนขายคงเบื่อขี้หน้าเราแล้ว อย่างที่เห็นโน๊ตผ่าน ๆ 😆<br>ตอนแรกพี่ Jakk พากันมานั่งจองโต๊ะนั่งด้านใน แต่ทิ้งให้นั่งอยู่กันสองสามคน ผม น้องนัท และพี่จิ๊บ แล้วคนอื่น ๆ ก็ไปนั่งข้างนอกกันหมด -*-<br>ก่อนที่ Roland และภรรยาจะมานั่งร่วมโต๊ะ และคุยด้วยกัน พอเห็นน้องนัทมันดูหงอย ๆ ฟังเพลงอยู่คนเดียว Roland เลยเลี้ยงเบียร์น้องไป แถมแนะนำหนังสือให้ผมด้วยอีก ใจดีมาก<br>หลังจากนั้น Lกฮ ก็เริ่มพรุ่งพร่านเข้าสู่กระแสเลือด ความเมามันส์กำลังงก่อขึ้น ด้วยบรรยากาศในร้าน และเหล่า Bitcoiners ที่คุยกันตามความสนใจของตนในมุมต่าง ๆ ของร้าน<br>มีทั้งวงปรัชญาจากพี่ชิต ยาแดงจากพี่จิงโจ้ วิถีเต๋าของ อ.ขิง ที่ยังโสดอยู๋ แวะวงของ อ.พิริยะ และ อ.เดชา เลือกฟังกันไม่ถูกเลยทีเดียว มันเป็นคืนที่ดี เอามาก ๆ ลากยาวกันจนร้านปิด ยังไม่พอ<br>หาที่นั่งคุยกันต่อยันตี 3 กว่า อีกวันมาลุกแทบไม่ได้</p>
<h2>28</h2>
<p>หลังจากเมื่อคืนกลับตี 3 กว่า ๆ เช้าวันนี้ยังสะลึมสะลือ จากอาการเมาค้าง แต่ก็ต้องลุกจากเตียงไปอาบน้ำ เพื่อไปเจอกันที่ Chit Hole อีกครั้ง</p>
<h3>ก่อนจะลา</h3>
<p>หลังจากกทำธุระส่วนตัวเสร็จ ก็คืนห้องให้โรงแรมก่อน และเดินไปที่ Chit Hole พอไปถึง ก็หากาแฟกินก่อนเลยอันดับแรก และก็เป็นช่วงที่คุณยูกำลังพูดอยู่พอดี<br>มาได้ยินจังหว่ะเดือด ๆ พอดีซะด้วย แต่ด้วยสภาพร่างกาย จำอะไรแทบไม่ได้ 5555555 แถมกับความประมาท ไม่ได้จองตั๋วรถไว้ ก็เลยได้ตั๋วรถของเช้าวันพรุ่งนี้แทน ฮา😂<br>แล้วซักพักหลาย ๆ คนก็ทยอยกลับ ก็รู้สึก โหวง ๆ นิดหน่อย ที่งานเลี้ยงกลังจะถึงเวลาเลิกลา และก็ทราบว่าอิสรกับพี่จิงโจ้ และพี่วินนั้นกลับพรุ่งนี้เช่นกัน<br>จึงคุยกันซะดิบดี เย็นนี้ไปไหนกัน ถึงตอนเที่ยง ทุกคนก็เริ่มแยกย้ายกัน และก็ได้เจอกับพี่เอ็ดดี้ ผู้ปลอมเป็นอานนต์ บอกว่าติดรถไปด้วยกันได้นะ พี่ก็จะเข้าเชียงราย ผมเลยตกลงเลยทันที ดีเลย ไม่ต้องหาที่นอนแล้ว ตั๋วรถก็ช่างมันไป ไม่กี่บาท</p>
<p>จากนั้นผมจับกลุ่มกับพี่วินวี กับทีม RightShift ที่เหลืออยู่ ไปนั่งคุยกันที่ลานไวน์หน้า Alexa และมีพี่แองจี้ ที่เพิ่งเริ่มเล่น Nostr ใหม่ ๆ มาร่วมกลุ่มคุยด้วยกัน<br>จำได้ว่าพี่วินวีชวยคุยกันเก่งมาก ๆ จนพี่จิงโจ้ และอิสรไปนอน ก็ยังคุยได้หลายชั่วโมงยันค่่ำ จนพี่เอ็ดดี้มารับผม เพื่อนเดินทางกลับถึงจะเริ่มแยกย้ายกัน</p>
<h3>กลับบ้าน</h3>
<p>ขากลับกับพี่เอ็ดดี้เป็นทริปแบบสบาย ๆ คุยกันจนขับเลยแยก ต้องอ้อมวนกลับมาใหม่กันเลยทีเดียว 55555 ตอนแรกก็คุยเรื่องเป็นไงมายังไงถึงมาอยู่วงการนี้<br>ลามไปยันเรื่องสมัยเรียน รวมถึงหลักการทำงาน เปรียบเทียบระหว่างฟังชั่นการทำงานของ NFT ที่พี่แกทำอยู่สามารถใช้ Bitcoin มาแทนตรงไหนได้หรือไหม<br>และเปรี่ยบเทียบเทคโนโลยี ว่าของเจ้านี้มีแบบนี้ ถ้าเป็น Lightning จะมาปรับใช้แทนได้ไหม ฯลฯ จนมาถึงแม่ขจาน จึงแวะหาอะไรกินที่ร้านข้าวต้มเจ้าเด็ดตรงนั้น<br>แถมพี่แกยังเลี้ยงมื้อนี้ด้วยอีกต่างหาก ก่อนจะขับรถต่อไปจนส่งผมถึงหน้าบ้านกันเลย ขอบคุณอานนต์มากครับ 🙏</p>
<h4>แล้วพบกันใหม่</h4>
<p>#north101 #siamstr #siamstrOG</p>
]]></itunes:summary>
      <itunes:image href="https://image.nostr.build/168a56a0ec1fd43af7140900b3cd3e24fa7a6e3a9dd7130fb36a9a5163b35c67.png"/>
      </item>
      
      </channel>
      </rss>
    