วิธี github clone มาเฉพาะบาง Folder

ถ้าต้องการเฉพาะบาง folder เช่นจากของ Google Research https://github.com/google-research/google-research แต่เราต้องการเพียงแค่ project ย่อยเดียว เช่น tft (Temporal Fusion Transformer) วิธีการมีดังนี้ 0. ต้องใช้ git version ใหม่ ๆ ในที่นี้ผมใช้ 2.32.0 1. จะมี sparse-checkout ซึ่งทำให้กำหนดได้ว่า ต้องการ folder ใด ให้ใช้คำสั่งแรกคือ 2. จากนั้น กำหนดว่า ต้องการเฉพาะ folder ชื่อ tft 3 . จากนั้นก็กำหนด remote repository ด้วยคำสั่ง 4 . แล้วก็ pull ด้วยคำสั่ง รอสักครู่ เราก็จะได้เฉพาะ folder ที่ต้องการ หวังว่าจะเป็นประโยชน์ครับ

Read More »

วิธีแก้ปัญหา docker container ไม่ start cron อัตโนมัติ

ปัญหา เวลาสร้าง docker container เพื่อ run งานแบบอัตโนมัติ เราก็จำเป็นต้องใช้ cron แต่ว่า เจ้า docker container images เนี่ย จะเป็นรุ่นตัดทุกอย่างที่ไม่จำเป็นออกหมด เอาไว้ให้ start – run – stop แต่ถึงกระนั้น เราก็ยังอยากได้การทำงานแบบ cron อยู่ดี Reproduce สร้าง docker container จาก ubuntu:20.04 ตรวจสอบว่ามี crontab หรือไม่ ก็ไม่มี /var/log/syslog มีไม๊ ก็ไม่มี systemctl มีไม๊ ก็ไม่มี แก้ไข ติดตั้ง 3 อย่าง cron, systemctl, rsyslog แล้ว ขอแถม vim ด้วย ติดตั้งแล้ว ลองตรวจสอบ ก็พบว่า crontab มาแล้ว, systemctl มาแล้ว ส่วน /var/log/syslog ยังไม่ได้สร้าง ลอง start cron และ rsyslog ดู ก็พบว่า /var/log/syslog มาแล้ว ทดสอบสร้าง cron ทำความเข้าใจก่อน crontab เอาไว้สร้าง cron ส่วนตัวของแต่ละ user แต่ที่ /etc/cron.d/ นั้น เอาไว้สร้างสำหรับ system 2 วิธีการสร้าง cron นี้แตกต่างกันที่ crontab ไม่สามารถระบุผู้ใช้ได้ แต่ใน /etc/cron.d/ นั้น สามารถระบุ user ที่จะ run ได้ ต่อไป จะสร้าง cron ง่าย ๆ ให้ echo เวลา ทุก 1 นาทีลงไฟล์ แล้วใส่ บรรทัดนี้ลงไป ดูใน /var/log/syslog แล้ว ก็พบว่า ทำงานได้ ดูผลใน -/test.log เป็นอันว่า OK ต่อไป ดูว่า ถ้า restart docker แล้ว cron จะทำงานไม๊ ? ทดสอบ restart docker container ออกจาก bash ของ docker แล้วใช้คำสั่ง รอสัก 3 นาที แล้วใช้คำสั่ง ผลที่ได้คือ อ้าว cron ไม่ทำงานต่อ มาดูเหตุกันก่อน เราต้องไปดู รากเหง้าของ ubuntu:20.04 image https://hub.docker.com/_/ubuntu Docker ทำงานโดยจะทำเพียงคำสั่งเดียว การสร้าง docker image จะสร้างจาก Dockerfile ซึ่ง ubuntu:20.04 มี Dockerfile ดังนี้ แสดงว่า docker container ที่ใช้ ubuntu:20.04 (ตัวอื่น ๆ ก็ต้องตามไปดูกัน) ก็จะเรียก Bash เป็นคำสั่งสุดท้าย ก่อนจะยืนเป็น Service ให้ใช้งาน ดังนั้น … เราก็ต้องไปทำให้ start cron service ใน .bashrc กัน ประเด็นคือ มัน start ด้วย user ไหน ? ลองใช้คำสั่งนี้ ก็แสดงว่า สำหรับ image ตัวนี้

Read More »

วิธีแก้ปัญหา Let’s Encrypt กับ Root Certificate Expire ในวันที่ 30 กันยายน 2021

ปัญหา เช้านี้ (30 กันยายน 2021) พบว่า อยู่ ๆ เว็บเซิร์ฟเวอร์ที่ให้บริการ ซึ่งใช้ Let’s Encrypt ก็ ขึ้นหน้า “This connection is not private” เป็นเฉพาะกับ เครื่อง Mac, iPhone, iPad ไม่ว่าจะใช้ Safari หรือ Chrome ก็ตาม เอ่ เพิ่ง Renew ไปเมื่อเดือนที่แล้ว เกิดอะไรขึ้น ลองคลิกที่รูป Key แล้ว View Certificate พบว่า อ้าว … ไรว้า ก็ Google ดู พบว่า Root CA ของ Let’s Encrypt “รุ่นเก่า” ทะยอยหมดอายุ https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/ กล่าคือ ถ้าของใคร Root CA (บนสุดของภาพ) เป็น จะทำให้การใช้งานจาก Web Browser บน Apple ใช้งานไม่ได้ ก็ restart ดู ก็ยังไม่หาย เอ่ ทำไมนะ ขอ Renew ใหม่ ก็ยังไม่หาย หาไปหามา ไปพบ https://community.letsencrypt.org/t/r3-certificate-expired-macos/160852 เค้าบอกว่า ลองดูซิ ว่า Root CA ตัวใหม่ที่ได้มา เป็นของอะไร ด้วยคำสั่ง คำสั่งนี้ ทำที่เดียวกันกับไฟล์ fullchain.pem พบว่า เอ่ …. ก็ได้ Root CA เป็น ISRG Root X1 แล้วนะ ทำไมยังใช้ไม่ได้ ไปตรวจสอบดู httpd.conf อ้อ … เราอ้างอิงแค่ cert.perm วิธีแก้ไขคือ ไปเพิ่ม ให้เป็นแบบนี้ จากนั้น ก็ restart เรียบร้อย

Read More »

วิธีรัน Jupyter Notebook, ปิด browser แล้วระบบส่ง LINE บอกพร้อมภาพ เมื่อเสร็จแล้ว ค่อยกลับมาดูผล

ปัจจุบัน งานด้าน Data Science ก็มักจะใช้ Jupyter Notebook เพราะสะดวกในการทดลอง ทดสอบ ทำทีละบรรทัด ดูผล ปรับแต่งไปได้เรื่อย ๆ แถมสามารถซื้อ Server ส่วนกลาง ลงทุน GPU แล้วใช้พร้อม ๆ กันหลาย ๆ คนทั้งทีมก็ได้ ปัญหาอยู่ตรงที่ การสร้าง Model มักจะใช้เวลานาน (มาก) แล้ว Jupyter มันเป็น Web-based จะปิด Browser ก็ได้ แต่หลายคนคงเคยเจอว่า พอกลับมาเปิด URL เดิม ก็ไม่เห็นผลที่รันแล้ว จริง ๆ แล้วคือ Jupyter Notebook นั้น ทำงานต่อไป จนเสร็จแล้วแหล่ะ แต่ เว็บ Browser น่าจะไม่สามารถต่อ Session ได้ (หวังว่าจะนึกภาพออก) ที่สำคัญ มันรันนานมาก เสร็จเมื่อไหร่ก็ไม่รู้ แล้วจะรู้ได้อย่างไรว่าเสร็จ เสร็จแล้วผลเป็นอย่างไร ในบทความนี้ จะนำเสนอวิธีการที่ทำให้ สั่งรันงานที่ใช้เวลานาน (ขอยกตัวอย่าง 100 วินาที) แล้วปิด Browser ไปทำอย่างอื่นต่อได้เลย เมื่อระบบทำงานเสร็จ จะแจ้ง LINE Notify พร้อมแนบภาพ Graph ผลลัพธ์ ส่งมาด้วย พอกลับมาเปิด Browser กลับมาใน Jupyter Notebook เดิม สามารถดูผลการรันอื่น ๆ ได้อีกครั้งเหมือนกับไม่ได้ปิด Browser เริ่มต้นจาก Import Function ในการส่ง LINE Notify เป็นส่วนของ LINE TOKEN และ function “jobdone” ไว้ส่ง LINE Notify สามารถกำหนดข้อความ และกำหนดภาพที่จะแนบได้ Function สำหรับ Plot รับข้อมูล และ สร้างภาพเพื่อประกอบการส่ง Line ส่วนที่ใช้เวลานาน ตรงนี้ต้องอธิบายเพิ่ม ใน Jupyter จะมีสิ่งที่เรียกว่า “magic cell” ในที่นี้คือ โดยที่ %%capture คือคำสั่งที่จะเก็บผลลัพธ์ทุกอย่าง ที่ส่งออกจาก stdout, stderr รวมถึงภาพด้วย ในคำสั่งข้างต้น จะส่งออกไปยัง capture_output ซึ่งจะนำไปใช้ในภายหลัง ต่อมา จะจำลองการทำงานที่ยาวนาน คือ random ค่าระหว่าง 1-100 เอาไปใส่ใน array “data” จากนั้น ก็ sleep 1 วินาที รวมแล้ว ขั้นตอนนี้จะทำงาน 100 วินาที หรือ 1 นาที 40 วินาที (ในการทำงานจริง ยาวนานกว่านั้นมาก ๆ) เมื่อเสร็จแล้ว plot_something จะเอาข้อมูล data ไป plot แล้วแสดงผล และ save เป็นไฟล์ตามที่กำหนด คือ result.png คำสั่งต่อมา เป็นการแสดง วันเวลาปัจจุบัน โดยแสดงเป็น Timezone ของไทย สุดท้าย function jobdone กำหนดข้อความ และภาพที่จะส่ง Let’s go! รอไป 1 นาที 40 วินาที ก็จะได้ LINE Notify (อ่านขั้นตอนการได้มาซึ่ง LINE Token ได้จาก วิธีแจ้งเตือนจาก Google Forms เข้า LINE ) กลับมาใน

Read More »