วันอังคารที่ 7 พฤษภาคม พ.ศ. 2567

ทดสอบความเร็วในการอ่าน/เขียน SSD ด้วยซอฟต์แวร์ CrystalDiskMark 8 ภาค #2

หลังจากได้ WD Blue SN580 M.2 SSD มาใหม่ จึงทำการทดสอบเทียบกัน

ผลการทดสอบมีดังต่อไปนี้

1) WD SATA SSD 2 TB (NTFS)


2) Toshiba M.2 NVMe PCIe 3.0 SSD 512 GB (NTFS)


3) WD SN580 M.2 NVMe PCIe 4.0 SSD 500 GB (NTFS)


จะเห็นได้ว่า WD Blue SN580 ซึ่งเป็น PCIe 4.0 มี Speed ทั้ง Read และ Write สูงกว่า Toshiba ซึ่งเป็น PCIe 3.0 อย่างเห็นได้ชัดทั้ง Sequential และ Random R/W อีกจุดสังเกตหนึ่งคือ WD SSD จะมี Speed R/W ที่สมดุลกันทั้ง SSD ที่เป็นแบบ SATA และแบบ NVMe ซึ่งต่างจาก Toshiba SSD ที่มี Writing Speed ต่ำกว่า Reading Speed อยู่หลายเท่า

วันศุกร์ที่ 12 เมษายน พ.ศ. 2567

แข่งหมากรุกไทยครั้งแรก

    ในกระดานที่ 7 กระดานสุดท้ายของการแข่งขัน หมากฝ่ายขาวกำลังได้เปรียบ แต่ในแต้มนี้หมากขาวเดินม้า C3 ไป B5 ทำให้จากรูปเกมที่ได้เปรียบ กลายเป็นเสียเปรียบ เพราะหมากดำสามารถกินเบี้ยข้างขุนฟรีเพราะกินสอง แล้วม้าก็ไปชิดขุนฝ่ายดำ แถมบังตาเรืออีก ตาที่ควรเดินจริงๆ คือเดินม้า E5 มา D3


วันอังคารที่ 10 ตุลาคม พ.ศ. 2566

เชื่อมต่อ Web Application ผ่าน Websocket กับ MQTT Broker ด้วย Paho MQTT

  • เพิ่ม Script ใน tag <header> จาก CDNJS
<script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.1.0/paho-mqtt.min.js"></script>
  • สร้าง Client Instance ของ Paho MQTT ด้วยคำสั่ง
let client = new Paho.Client("<broker-url>", Number(<port>), "<client-id>");
  • สร้างฟังก์ชั่น onConnect ทำการเชื่อมต่อและ subscribe ไปยัง topic ด้วยคำสั่ง
                       const onConnect = () => {
                               console.log("Connected");
                               console.log("Subscribing to topic: <topic-name>");
                               client.subscribe("<topic-name>");
                       }
  • สร้างฟังก์ชั่น onConnectionLost เพื่อแสดงสถานะหากถูกตัดการเชื่อมต่อ
                       const onConnectionLost = responseObject => {
                              if(responseObject !== 0){
                                      console.log("ConnectionLost:"+responseObject.errorMessage);
                              }
                       }
  • สร้างฟังก์ชั่น onMessageArrived เพื่อแสดงข้อความที่ได้รับ
                        const onMessageArrived = message => {
                                console.log("MessageArrived: " + message.payloadString);
                               }
                        }
  • เรียกใช้ฟังก์ชัน connect, onConnect, onConnectionLost และ onMessageArrived
                        client.connect({
                                onSuccess: onConnect
                        }
                        client.onConnectionLost = onConnectionLost;
                        client.onMessageArrived = onMessageArrived;


วันเสาร์ที่ 30 กันยายน พ.ศ. 2566

Git Command

  • เริ่มต้นสร้าง Git repository หรือสร้างโฟลเดอร์ .git (hidden folder) ด้วยคำสั่ง
  • git init

  • เพิ่มไฟล์เข้าไปใน staging area ด้วยคำสั่ง
git add <file name> หรือ git add . เพื่อ add ไฟล์ทั้งหมด
  • Commit ไฟล์ไปยัง local repository ด้วยคำสั่ง
git commit -m "<commit-message>"
  • ตรวจสอบสถานะของไฟล์ด้วยคำสั่ง
git status
  • ตรวจสอบ remote repository ด้วยคำสั่ง
git remote -v
  • Add remote repository ด้วยคำสั่ง
git remote add <remote-name> <remote-url>
  • เปลี่ยน remote url ด้วยคำสั่ง
git remote set-url <remote-name> <new-remote-url>
  • ลบ remote repository ด้วยคำสั่ง
git remote rm <remote-name>
  • ตรวจสอบ branch ปัจจุบันด้วยคำสั่ง
git branch
  • ตรวจสอบ branch ทั้งหมดด้วยคำสั่ง
git branch -a
  • เปลี่ยนชื่อ branch ปัจจุบันด้วยคำสั่ง
git branch -M <new-branch-name>
  • สร้าง branch ใหม่ด้วยคำสั่ง
git branch <new-branch-name>
  • เปลี่ยน branch ปัจจุบันด้วยคำสั่ง
git checkout <branch-name>
  • ลบ local branch ด้วยคำสั่ง
git branch -d <branch-name>
  • ลบ remote branch ด้วยคำสั่ง
git push <remote-name> --delete <branch-name>
  • Push local repository ไปยัง remote repository ด้วยคำสั่ง
git push -u <remote-name> <branch-name>
  • Clone remote repository ไปยัง local repository ด้วยคำสั่ง
git clone <remote-url>
  • ดึงการอัพเดทล่าสุดจาก remote repository ด้วยคำสั่ง 
git pull
  • Clone remote repository ของ user อื่นไปยัง remote repository ของตัวเองด้วยคำสั่ง
git fork
  • ส่ง Pull request ไปยัง remote reposity ของ user ต้นทางที่ clone มา เพื่อขอให้ตรวจสอบและทำการ merge pull request ด้วยคำสั่ง
Pull request
  • Merge local repository ปัจจุบันกับ local branch ด้วยคำสั่ง
git merge 
<branch-name>

วันอังคารที่ 22 สิงหาคม พ.ศ. 2566

Deploy React App บน GitHub Page

 


  • ติดตั้ง gh-pages npm package ด้วยคำสั่ง
npm install gh-pages

  • เพิ่ม homepage property ในไฟล์ package.json
"homepage": "https://<username>.github.io/<repository-name>"
  • เพิ่ม predeploy และ deploy ใน script ของไฟล์ package.json
"predeploy": "npm run build",
"deploy": "gh-pages -d build"
  • Add remote repository ด้วยคำสั่ง
git remote add origin https://github.com/<username>/<repository-name>.git
  • Push React app ด้วยคำสั่ง
npm run deploy
หรือ
npm run deploy -- -m "<commit-message>"

npm จะทำการ build ไฟล์เก็บไว้ในโฟลเดอร์ build
แล้ว deploy ขึ้นไปที่ gh-pages branch
  • หากต้องการเก็บ React app source code ไว้บน GitHub สามารถใช้คำสั่ง
git add .
git commit -m "<commit-message>"
git push origin main

React app source code จะถูกเก็บใน main branch
build file จะถูกเก็บใน gh-pages branch



วันพฤหัสบดีที่ 3 สิงหาคม พ.ศ. 2566

Docker Command

docker --version ตรวจสอบการติดตั้ง Docker + ตรวจสอบ version

docker ps ตรวจสอบ Container ที่ run อยู่ ps (process)

docker ps -a ตรวจสอบ Container ทั้งหมด -a (all)

docker run -it --name <container name> -p <user port:container port> <image name:tag>

Run container จาก image -it (interactive) และ -p (port) โดยเป็นการ expose user post กับ container port ถ้าเปลี่ยนจาก -it เป็น -d (daemon) จะเป็น background running

docker stop <container name> หยุดการ run container ตามชื่อ container

docker start <container name> เริ่มการ run container ตามชื่อ container

docker exec -it <container name> bash ทำการ SSH เข้าไปใน container ตามชื่อ container

exit ออกจาก SSH

docker rm <container name> ลบ container ตามชื่อ container โดยต้อง stop container ก่อน

docker rm -f <container name> ลบ container ตามชื่อ container แบบบังคับลบ -f (force)

docker images ตรวจสอบ image ทั้งหมดที่มีอยู่

docker pull <image name:tag> ดึง image มาจาก Docker hub

docker build -t <image name> <destination> สร้าง image จาก Dockerfile -t (tag)

docker rmi <image name> ลบ image ตามชื่อ image

docker login ล็อกอินเข้า Docker hub

docker tag <image name> <username>/<docker hub image name:tag>

เปลี่ยนชื่อ image เพื่อเตรียม push ขึ้น Docker hub

docker push <username>/<docker hub image name:tag> ทำการ push image ขึ้น Docker hub 

docker commit <container name> <image name:tag>

ทำการ commit image ด้วยสถานะ container ปัจจุบัน

docker save <image name:tag> <filename>.tar ทำการ backup image เป็นไฟล์ .tar

docker load -i <filename>.tar ทำการ load image จากไฟล์ .tar


การเขียน Dockerfile

FROM <image name:tag> กำหนด image ที่จะใช้

WORKDIR <directory> กำหนด working directory ที่ต้องการทำงาน

COPY <file> <destination> ทำการ copy file จำเป็นต้องใช้ไปยัง directory ที่ต้องการ

RUN <run command> กำหนดคำสั่งที่ต้องการ run ขณะ build image

CMD ["<command>", "<file>"] กำหนดคำสั่งที่ต้องการ run อยู่ใน container

.dockerignore ระบุชื่อ file หรือ folder ที่ไม่ต้องการให้ copy ในการ build image เช่น node_modules