วันอังคารที่ 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

วันศุกร์ที่ 2 มิถุนายน พ.ศ. 2566

เปลี่ยนสีและ Weight ของ Text ใน Arduino IDE ผ่าน Theme

ไฟล์ theme.txt จะอยู่ใน C:/Program Files (x86)/Arduino/lib/theme ซึ่งจะต้องใช้สิทธิ์ Administrator ในการแก้ไขไฟล์ แต่เราสามารถ Copy ไฟล์ theme.txt แล้วเปลี่ยนชื่อไฟล์ theme.txt เดิมเป็นชื่ออื่น เช่น default-theme.txt จากนั้น้ราก็แก้ไขไฟล์ theme.txt ได้โดยไม่จำเป็นต้องใช้สิทธิ์ Administrator


ส่วนที่ 1 Keywords

# TEXT - KEYWORDS

# FUNCTIONS
editor.keyword1.style = #E06C75,bold
editor.data_type.style = #E06C75,bold          บรรทัดนี้คือคำสั่ง Serial, WiFi, etc. 
                                                                       ซึ่งเป็น Built-in library

# METHODS
editor.keyword2.style = #E06C75,plain
editor.function.style = #61AFEF,plain             บรรทัดนี้คือคำสั่ง begin, init, print, 
                                                                        println, delay, millis, pinMode, 
                                                                        digitalWrite, etc.

# STRUCTURES
editor.keyword3.style = #C678DD,plain
editor.reserved_word.style = #C678DD,plain บรรทัดนี้คือคำสั่ง setup, loop, 
                                                                                while, if, else, return, etc.

ส่วนที่ 2 Literals

# TEXT - LITERALS

# constants & datatypes
editor.literal1.style = #61AFEF,plain                    

# p5 built in variables: e.g. mouseX, width, pixels
editor.literal2.style = #61AFEF,plain
editor.variable.style = #61AFEF,plain
editor.reserved_word_2.style = #61AFEF,plain        บรรทัดนี้คือคำสั่ง const, 
                                                                                  unsigned, int, long, void, 
                                                                                  float, string, HIGH, LOW, 
                                                                                  OUTPUT, etc.

editor.literal_boolean.style = #61AFEF,plain           บรรทัดนี้คือ boolean variable
editor.literal_char.style = #61AFEF,plain   บรรทัดนี้คือ char varible

บรรทัดนี้คือ string variable
editor.literal_string_double_quote.style = #61AFEF,plain    

บรรทัดนี้คือคำสั่ง #inclide, define, etc.
editor.preprocessor.style = #98C379,plain


หลังจากแก้ไขเสร็จแล้วให้ Save ไฟล์ theme.txt แล้วเปิด Arduino IDE ขึ้นมาใหม่ ก็จะพบว่าสีหรือ Weight ของ Text ใน Editor มีการเปลี่ยนแปลง

วันอังคารที่ 21 กุมภาพันธ์ พ.ศ. 2566

ทดสอบความเร็วในการอ่าน/เขียน Storage รูปแบบต่างๆ ด้วยซอฟต์แวร์ CrystalDiskMark 8

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

1) Sandisk USB flash drive ขนาด 64 GB (exFAT)


2) Sandisk USB flash drive ขนาด 64 GB (NTFS)


3) Sandisk USB flash drive ขนาด 32 GB (FAT32)


4) Kingston SD card 8 GB (FAT32)


5) WD SATA SSD 2 TB (NTFS)


6) Toshiba M.2 SSD 512 GB (NTFS)


Link สำหรับดาวน์โหลดซอฟต์แวร์ : https://crystalmark.info/en/software/crystaldiskmark/
Link วิดีโอสอนการใช้งานซอฟต์แวร์ : 


วันอาทิตย์ที่ 4 ตุลาคม พ.ศ. 2563

ทำไมต้อง Bias ทรานซิสเตอร์ ?

คำถามนี้เป็นคำถามที่คาใจผมเองมาตั้งแต่สมัยเรียน และผมก็เชื่อว่ามีอีกหลายๆ คนที่คาใจแบบผม คือตอนเรียนอาจารย์ให้ต่อวงจรก็ต่อ คำนวณค่าต่างๆ ตามสมการก็เชื่อตามนั้น แต่ไม่ได้เอะใจว่า แล้วสิ่งที่เรียนทำไมต้องทำแบบนั้นแบบนี้ด้วย แล้วมันจะเอาสิ่งที่เรียนไปใช้ทำอะไรต่อได้ ไม่ได้ถามอาจารย์ในห้องเรียนแล้วก็ปล่อยมันผ่านเลยไป สอบเสร็จก็ลืมๆ ไป จนถึงทุกวันนี้ที่เทคโนโลยีก้าวหน้าไปอย่างรวดเร็ว จนบางทีผมยังนึกเลยว่าการมานั่งต่อวงจร Bias ทรานซิสเตอร์เป็นเรื่องไม่จำเป็นอีกต่อไปแล้ว เพราะเดี๋ยวนี้เวลาทำโครงงานนักเรียนนักศึกษาก็มักจะซื้อโมดูลที่มีขายตามท้องตลาดซึ่งราคาถูกมากๆ มาประกอบกัน แล้วเน้นไปทำงานด้านการเขียนโปรแกรมแทน วงจรทรานซิสเตอร์ที่ใช้ส่วนใหญ่ก็จะถูกนำไปใช้ในการขับ Relay, LED หรือมอเตอร์ด้วยสัญญาณ PWM ซึ่งทั้งหมดทั้งมวลนี้คือการใช้ทรานซิสเตอร์ทำหน้าที่เป็นสวิตช์ซึ่งทรานซิสเตอร์จะทำงานที่ย่าน Saturation ขณะที่ ON และทำงานที่ย่าน Cut-off ขณะที่ OFF ซึ่งนั่นเองแทบไม่เกี่ยวกับการ Bias ทรานซิสเตอร์ตอนที่ผมเรียนมาเลย เพราะเนื้อหาที่เรียนในตอนนั้นทรานซิสเตอร์ทำหน้าที่เป็นวงจรขยายสัญญาณและทำงานในย่าน Active ทั้งหมดนี้จึงนำมาซึ่งการทดลอง Bias ทรานซิสเตอร์แบบง่ายๆ ด้วยวงจร Common Emitter Fixed Bias ดังรูป

รูปที่ 1

แรงดัน VCC ที่ใช้คือ +12V อินพุตที่ขาเบส (B) เอาต์พุตที่ขาคอลเลคเตอร์ (C) โดยมีตัวต้านทานที่ขาเบส (RB) และตัวต้านทานที่ขาคอลเลคเตอร์ (RC) เป้าหมายของการ Bias ครั้งนี้คือการเปลี่ยนค่าแรงดันระหว่างขาคอลเลคเตอร์กับอีมิตเตอร์ หรือที่เรียกว่า VCE ซึ่งถ้าในกรณีใช้ทรานซิสเตอร์เป็นสวิตช์ค่า VCE จะมีสองค่าคือ +12V ขณะที่ทรานซิสเตอร์ทำงานย่าน Cut-off หรือสวิตช์ OFF คือแทบไม่มีกระแส IC ไหลผ่านทรานซิสเตอร์เลย หรือในทางอุดมคติคือไม่มีเลย และ VCE อีกค่าคือ 0V หรือเกือบๆ 0V ขณะที่ทรานซิสเตอร์ทำงานย่าน Saturation หรือสวิตช์ ON คือกระแส IC ไหลผ่านทรานซิสเซอร์แบบเต็มสูบ ซึ่งตรงนี้ถ้าเอา Relay หรือ LED มาต่อระหว่างขาคอลเลคเตอร์ (C) กับ VCC มันก็จะ ON นั่นเอง

รูปที่ 2

ทีนี้ถ้าเกิดเราเปลี่ยนค่า VCE ให้อยู่ระหว่าง 0 – 12V ได้ล่ะ จะเกิดอะไรขึ้น ใช่เลยครับ มันคือการทำงานในย่าน Active ที่ทรานซิสเตอร์จะทำหน้าที่เป็นวงจรขยายสัญญาณนั่นเอง ซึ่งในทางปฏิบัติหากเรามีสัญญาณที่ต้องการขยายทั้งซีกบวกและซีกลบ ค่า VCE ที่ดีที่สุดก็คือค่ากึ่งกลางระหว่าง VCC กับ GND ในที่นี้คือ +6V เพื่อที่จะขยายสัญญาณทั้งสองซีกไปได้ในอัตราเท่าๆ กันนั่นเอง ลองพิจารณารูปที่ 3 เมื่อทำการ Bias ให้ค่า VCE อยู่ประมาณ 8V เส้นสีฟ้าคือสัญญาณอินพุต Sine Wave ขนาด 64mVp-p ความถี่ 1 kHz เส้นสีเหลืองสัญญาณเอาต์พุตที่ได้จะถูกขยายให้มีขนาด 3.64Vp-p แต่กลับเฟส เนื่องจากเราใช้วงจร Common Emitter จากรูปสัญญาณเอาต์พุต (สีเหลือง) จะเห็นได้ว่ารูปสัญญาณในซีกบวกจะมีความผิดเพี้ยนของสัญญาณเกิดขึ้น เนื่องจากแรงดัน VCE มีค่ามากกว่า 6V ทำให้การขยายในซีกบวก Saturate ที่แรงดันไฟเลี้ยง VCC นั่นเอง

รูปที่ 3

            ลองพิจารณารูปที่ 4 ดูบ้าง เมื่อทำการ Bias ให้ค่า VCE อยู่ประมาณ 1V โดยป้อนสัญญาณอินพุต Sine Wave ขนาด 52mVp-p ความถี่ 1 kHz เข้าไป สัญญาณเอาต์พุตที่ได้จะถูกขยายให้มีขนาด 4.92Vp-p จากรูปสัญญาณเอาต์พุต (สีเหลือง) จะเห็นได้ว่าในกรณีนี้รูปสัญญาณในซีกลบจะมีความผิดเพี้ยนของสัญญาณเกิดขึ้นแทน เนื่องจากแรงดัน VCE มีค่าน้อยกว่า 6V ทำให้การขยายในซีกลบ Saturate ที่ 0V หรือ GND นั่นเอง

รูปที่ 4

            จากทั้งหมดนี้เราคงพอจะเข้าใจกันแล้วว่าทำไมเราต้อง Bias ทรานซิสเตอร์ รวมถึงยังเข้าใจอีกว่าการทำงานของทรานซิสเตอร์แบ่งออกเป็น 3 ย่านคือย่าน Cut-off, Active และ Saturation ซึ่งพิจารณาได้จากค่า VCE ที่เกิดจากการ Bias ว่าทรานซิสเตอร์ในวงจรนั้นทำงานอยู่ในย่านไหน ทีนี้ก็ขึ้นอยู่กับผู้อ่านแล้วว่าจะใช้ทรานซิสเตอร์ตัวนั้นทำหน้าที่เป็นอะไร ? สวิตช์หรือวงจรขยายหรืออื่นๆ ซึ่งในแต่ละงานก็จะแตกต่างกันไป สุดท้ายนี้ขอจบบทความนี้ด้วยรูปที่ 5 ซึ่งเป็นการ Bias ให้ค่า VCE อยู่ที่ประมาณ 6V ซึ่งก็คือครึ่งนึงของแรงดันไฟเลี้ยง (VCC) พอดี สัญญาณเอาต์พุตที่ได้จะถูกขยายให้มีขนาด 6.04Vp-p และไม่มีความผิดเพี้ยนที่เกิดจากการ Saturation ทั้งในซีกบวกและซีกลบของสัญญาณ

รูปที่ 5

ขอบคุณทุกท่านที่อ่านมาจนถึงบรรทัดนี้ หากมีข้อผิดพลาดประการใดต้องขออภัยมา ณ ทีนี้ด้วย และครั้งหน้าหากเรามีสาระความรู้ดีดีแบบนี้อีก เราจะเอามานำเสนออีกแน่นอน โปรดติดตามรับชมครับ