Skip to content

Kor's blog Posts

Python | แก้ปัญหาการเรียกใช้ module แบบ command line ไม่ได้หลังจากติดตั้งผ่าน pip

ปัญหาคือผมต้องการใช้  Apache Airflow บนเครื่อง  Ubuntu ซึ่งเขียนด้วย  Python และมี cli ให้ใช้ แต่หลังจากติดตั้งด้วย pip install airflow  ไปแล้วปรากฏว่าไม่สามารถใช้คำสั่ง  airflow  ผ่าน terminal  ได้ เจอ  error  แบบนี้

ปัญหาเกิดจาก pip รุ่นใหม่ๆ บน Ubuntu เมื่อเรา pip install เพื่อติดตั้ง module ที่สามารถใช้งานผ่าน command line ตัว execute file มันจะไปอยู่ที่ $HOME/.local/bin ซึ่งบางครั้ง shell ที่เราใช้ไม่ได้ export  path  นี้ให้ทำให้เมื่อเราติดตั้งไปแล้วไม่สามารถเรียกใช้งาน module ผ่าน terminal  ได้

ที่ทำแบบนี้ก็เพื่อแยก env ของผู้ใช้นั้นออกจากระบบหลัก แต่ก็มีทั้งข้อดีและข้อเสียเพราะบ้างครั้ง path ของ module  ก็ชี้กันมั่ว เพราะบางครั้งเราอาจจะใช้  sudo pip install บางครั้งก็ไม่ได้ใช้

วิธีแก้ก็ง่ายๆ ครับ ให้เราเพิ่ม path  $HOME/.local/bin  เข้าไปที่ environment variable PATH ที่ ~/.bashrc  หรือ ~/.zshrc

เสร็จแล้วแล้วก็ source ~/.bashrc หรือ source ~/.zshrc  ใหม่ สมมุติว่าผมใช้  zsh ก็ทำแบบนี้

เท่านี้ก็จะใช้งาน python module ผ่าน  command line ได้แล้วครับ

Python | จัดการ Python หลาย version ด้วย pyenv และ virtualenv (virtualenvwrapper)

ช่วงนี้ผมมีโอกาสใช้งาน Python และ contribute open source โปรเจกต์หนึ่งอยู่ ปัญหาที่โคตรจะเบสิกของ developer อย่างเราๆ ที่ต้องเจอคือ environment (ต่อไปขอย่อเป็น env ละกัน) บนเครื่องที่ใช้พัฒนากับ env ที่โปรเจกต์ต้องการเป็นคนละ version กัน เราอาจจะติดตั้ง env สำหรับโปรเจกต์นั้นบนเครื่องเราก็ได้แต่ก็จะเกิดปัญหาต่อมา เช่น

  • version ของชุดซอฟต์แวร์ที่โปรเจกต์ต้องการกระทบกับ version ของซอฟต์แวร์หลักของระบบ
  • version ของชุดซอฟต์แวร์ที่โปรเจกต์ต้องการอาจจะเก่าเกินไปจนติดตั้งบน OS version ปัจจุบันของเราไม่ได้

แม้ว่าเราจะมี Docker ซึ่งสามารถสร้าง container ที่มี env แยกจากระบบหลักได้ แต่บางครั้งก็ไม่สะดวกนักเพราะในระหว่างพัฒนาเราอาจจะต้องใช้  tool chain ต่างๆ ร่วมด้วย เช่น ถ้าผม develop ด้วย  Python ก็อาจจะต้องใช้ pip ด้วย เป็นต้น

ภาษา Python เองก็มี virtualenv ซึ่งช่วยให้เราจัดการ env ของ Python โดยสามารถรัน Python version ต่างกันกับแต่ละโปรเจกต์ได้โดยไม่กระทบ version  หลักในเครื่อง ส่วนอีกตัวที่จะช่วยให้เราทำงานกับ virtualenv ได้ง่ายขึ้นคือ pyenv

บันทึกการย้ายบล็อกและใช้งาน HTTPS จาก Let’s encrypt โดยใช้ Docker

บล็อกนี้ผมใช้ WordPress และ MySQL การ Dockerize เลยง่ายหน่อยเพราะมี official image ให้ใช้เลย ส่วนการทำ HTTPS ด้วย Let’s encrypt ก็ง่ายเช่นกันเพราะมี docker-letsencrypt-nginx-proxy-companion ให้ใช้ การสร้าง virtual host และ issue domain/sub-domain ที่ต้องการใช้งาน HTTPS ก็ทำได้ง่ายโดยการกำหนด env variable ตอนสั่ง docker run

Backup the database

เดิมผมติดตั้ง MySQL ผ่าน apt-get  โดยปกติ data ทั้งหมดของ MySQL จะอยู่ /var/lib/mysql  ก็ compress เป็น tar.gz แล้ว scp ไปที่เครื่องใหม่

ถ้ากลัวไม่ชัวร์ก็ใช้ phpmyadmin หรือ MySQL client dump เป็นไฟล์ .sql ออกมาด้วยก็ได้

Backup WordPress files

เนื่องจากบล็อกเก่าผมมีรูปภาพที่อัปโหลดไว้และติดตั้ง plugin ไว้หลายตัว ขี้เกียจติดตั้งและ config ที่เครื่องใหม่อีกเลย copy ออกมาทั้งเว็บ โดย compress เป็น tar.gz เสร็จแล้วก็ scp ไปที่เครื่องใหม่เหมือนเดิม

ย้ายบล็อกจาก DigitalOcean มา Vultr

ตอนนี้ผมย้ายบล็อกมาจาก DigitalOcean มาที่ Vultr แล้ว เหตุผลก็เรื่องราคาต่อ resource ล้วนๆ เพราะบล็อกผมเป็นเว็บเล็กๆ traffic ไม่เยอะและไม่ต้องมี availability สูงขนาดนั้น เลยตัดสินใจง่ายหน่อย

โดยส่วนตัว DigitalOcean ก็เป็นผู้ให้บริการที่ดี support ตอนมีปัญหาได้ค่อนข้างรวดเร็ว (สำหรับ free support น่ะนะ) ขยันออกผลิตภัณฑ์มาให้บริการเรื่อยๆ และราคาก็ถูก แต่ด้วยราคาที่เท่ากันแล้ว Vultr ให้ resource มากกว่า ตัวอย่างเช่นตอนนี้ผมใช้ package เล็กสุดคือ $5/month DigitalOcean นั้นให้ RAM แค่ 512MB ส่วน Vultr ให้ 1024MB มากกว่าเท่าตัว ถึง RAM 1024MB จะไม่ได้มากมายแล้วสำหรับทุกวันนี้แต่มีมากกว่าก็น่าจะดีกว่า

จากที่บอกไปข้างต้นว่าผมมองเรื่องราคาต่อ resource เป็นหลักการย้ายบล็อกครั้งนี้ผมเลยใช้ Docker เข้ามาช่วยเผื่อเวลาย้ายจะได้ทำได้สะดวก เริ่มตั้งแต่ proxy, database และตัวเว็บที่สร้างด้วย WordPress รวมไปถึงการทำ HTTPS ด้วย Let’s encrypt ทุกอย่างใช้ Docker หมด ซึ่งก็สะดวกมากเพราะมีคนทำไว้ให้หมดแล้ว

หลังจากย้ายมาตอนนี้ก็ยังไม่มีอะไรผิดปกติ ยังใช้ได้ราบรื่น ไว้คราวหลังจะเขียนถึงขั้นตอนการย้ายและการใช้ Docker ครับ