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

Python 3 และ Flask พื้นฐาน

เมื่อปีก่อนเราใช้ Raspberry Pi Zero W เป็นเครื่อง Host เพื่อทำระบบ POS (Point of Sell) ใช้เองที่ร้าน โดยตัวระบบเขียนเป็นภาษา Python 3 โดยใช้ Framework Flask ซึ้งใช้งานง่ายมาก แต่ก็มีปัญหาเรื่องการ Deploy เพราะไม่ได้ศึกษาการ Deploy จริง ๆ จัง ๆ ตอนนี้ถึงเวลาที่ต้องมาทำการ Update ตัวระบบ POS ของตัวเอง ก็ลังเลอยู่นานว่าจะย้ายไป Django ดีไหม แต่ก็สรุปคือไม่ย้ายและต้องเอาของที่ทำอยู่แล้วมาแก้ เลยเป็นที่มาของหัวข้อในตอนนี้ Python 3 และ Flask ...

การติดตั้ง Python 3 และ Virtual Environment

sudo apt install python3 python3-venv

การอัพเดต PIP 3 version

python3 -m pip install --upgrade pip

การสร้าง Virtual Environment

python3 -m venv [environment-name]

การ Active ให้เราสั่ง source /bin/activate และ การ Deactivate เมื่ออยู่ใน venv แล้วให้พิมพ์ deactivate
source [environment-name]/bin/activate
deactivate

การจัดการ Package

pip3 search [package-name]
pip3 install [package-name]
pip3 install [package-name]==[version=number]
pip3 install --upgrade [package-name]

pip3 show [package-name]
pip3 uninstall [package-name]

pip3 list
pip3 freeze
pip3 freeze > requirement.txt
pip3 install -r requirement.txt

วันศุกร์ที่ 30 สิงหาคม พ.ศ. 2562

ตั้งค่า Network โดยใช้ "netplan" บน Ubuntu 18.04

คำสั่งไม่ยุ่งยาก แค่ 3 คำสั่ง ถ้าใครลง Ubuntu 18.04 ก็ข้าม "netplan generate" ได้เลย
sudo netplan generate

# แก้ไขไฟล์
sudo nano /etc/netplan/50-cloud-init.yaml

# สั่งให้ใช้ค่าใหม่
sudo netplan apply

ตัวอย่างที่ผมใช้เป็นประจำ
network:
    ethernets:
        ens3:
            addresses:
            - 10.1.4.137/24
            gateway4: 10.1.4.254
            nameservers:
                addresses:
                - 192.168.1.3
                - 8.8.8.8
            routes:
            - to: 10.0.0.0/8
              via: 0.0.0.0
        ens4:
            addresses:
            - 192.168.0.137/24
            gateway4: 192.168.0.254
            nameservers:
                addresses:
                - 192.168.1.3
                - 8.8.8.8
    version: 2

วันพุธที่ 28 สิงหาคม พ.ศ. 2562

Install PHPMyAdmin Manual

ก่อนที่จะทำการดาวโหลด์ PHPMyAdmin ไฟล์ลงมาติดตั้งเอง ให้เราทำการติดตั้งตัว Unzip ก่อน
sudo apt install unzip

ให้เราย้ายไปอยู่ที่โฟลเดอร์ /usr/share ก่อนดาวโหลด์ (ถ้าลง PHPMyAdmin ผ่าน apt ก็จะมาอยู่ที่นี่เหมือนกัน)
จากนั้นทำการดาวโหลด์ไฟล์ phpMyAdmin-4.9.0.1-all-languages.zip จากเว็บไซต์ https://phpmyadmin.net
cd /usr/share
sudo wget https://files.phpmyadmin.net/phpMyAdmin/4.9.0.1/phpMyAdmin-4.9.0.1-all-languages.zip

# If Error Use This !
# sudo wget http://files.phpmyadmin.net/phpMyAdmin/4.9.0.1/phpMyAdmin-4.9.0.1-all-languages.zip

เสร็จแล้วแตกไฟล์ออกจาก zip และเปลี่ยนชื่อโฟลเดอร์เป็น phpmyadmin เพื่อให้ง่ายต่อการใช้งาน
แล้วทำการเปลี่ยนเจ้าของและสิทธิ์การใช้งาน
sudo unzip phpMyAdmin-4.9.0.1-all-languages.zip

sudo mv phpMyAdmin-4.9.0.1-all-languages.zip phpmyadmin
sudo rm phpMyAdmin-4.9.0.1-all-languages.zip

sudo chown -R www-data: phpmyadmin
sudo chmod -R 744 phpmyadmin

เปิดไฟล์ Config และแก้ไขจากไฟล์ตัวอย่างที่มีมาให้
sudo cp phpmyadmin/config.sample.inc.php phpmyadmin/config.inc.php
sudo nano phpmyadmin/config.inc.php

วันจันทร์ที่ 26 สิงหาคม พ.ศ. 2562

Install PHP5 and PHP7 on Ubuntu 18.04

การติดตั้ง PHP5 บน Ubuntu 18.04 นั้นเราไม่สามารถใช้ Package Repository ที่มากับ Ubuntu 18.04 ได้
อย่างตอนที่ผมลง Ubuntu 18.04 เราจะได้ PHP ที่เป็น เวอร์ชั่นค่อนข้างใหม่คือ PHP 7.2
เราเลยจำเป็นต้องเพิ่ม Package Repository อีกตัวเขาไปเพื่อให้เราสามารถติดตั้ง PHP5 ได้

ให้เราทำการเพิ่ม Repository "ppa:ondrej/php"

วันอาทิตย์ที่ 4 สิงหาคม พ.ศ. 2562

[Linux Container] - Container Device / Proxy Device

Proxy Device ! ใช้สำหรับการ Bind Port เพื่อให้เข้าไปยัง Container ได้ โดยเริ่มแรกที่เราใช้ Container นั้น
ตอนนั้นเรายังไม่รู้จัก เราก็ใช้ iptables ไปก่อน ก็ใช้งานได้นะ แต่ยังติดที่ว่า Port 21 กับ Port 22 ใช้ไม่ได้
และ iptables ตอนนั้นเราก็ยังไม่ได้ Save Config พอเครื่อง Server Restart ก็เจอปัญหาว่ามันลืมค่า

ตอนนี้เราจะมาดูกันว่า เวลาที่เราจะเปิดให้ข้างนอกเข้ามา Container ได้โดยใช้ Proxy Device นั้นทำยังไง
และจะลองทดสอบ Port ที่ใช้ทำ SSH ด้วยว่าใช้งานผ่าน Proxy Device ได้ไหม ? ปกติ Container เข้าไม่เปิด
การใช้งาน SSH เข้าไปใน Container

การเพิ่ม Proxy Device

ข้อมูลอ้างอิงจาก : https://lxd.readthedocs.io/en/latest/containers/
# listen ให้รอรับข้อมูลทางไหน ส่วนใหญ่ก็จะเป็น 0.0.0.0:80
# connect ให้ต่อเข้ากับช่องทางไหน ก็จะเป็น 127.0.0.1:80 
# type คือ Connection Type ก็พวก TCP, UDP

lxc config device add <container-name> <device-name> proxy \
  listen=<type>:<address>:&ltport> connect=<type>:<address>:<port>

# listen จะเป็น Port ของ Host
# connect จะเป็น Port ของ Container

# คำสั่งที่ใช้ในการลบ Config ออก
lxc config device remove <container-name> <device-name>

# ตัวอย่างการใช้
lxc config device add ubuntu-80 ubuntu-device-80 proxy \
  listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80

วันศุกร์ที่ 2 สิงหาคม พ.ศ. 2562

[Linux Container] - Storage Pool & LXC Storage

เรื่องของพื้นที่ เราจำได้ว่าครั้งนั้นเราทำพลาดที่ไม่ได้คิดว่า Storage นั้นจะโตขึ้นเรื่อยๆ และยังไม่ได้ศึกษาให้ดีก่อนการใช้งาน
และในที่สุดเราก็เจอปัญหาจากการที่ Container ใช้งาน Storage จนเต็มแล้วเราเองก็ขยายมันไม่เป็นเลยทำให้ต้องไปหาข้อมูลเพิ่ม
แล้วนำมาเขียนเก็บไว้ในตอนนี้ เรื่องของ Storage Pool กับ Linux Container

เราคิดว่า Storage Pool นั้นสำคัญเพราะเป็นพื้นที่ใช้งานหลักของ Container เลย และบางส่วนก็จะต่อออกไปที่ Host เพิ่มด้วย
Storage จะติดอยู่กับ Profile หนึ่งตัวในตอนที่เรา LXD Init ครั้งแรกนั้นเอง จากที่หาข้อมูล จะมีการแนะนำว่าให้ใช้ btrfs และ zsf

"Recommended setup : The two best options for use with LXD are ZFS and btrfs."
อ้างอิงจาก : https://lxd.readthedocs.io/en/latest/storage/
ข้อมูลเพิ่มเติม : https://medium.com/life-at-dek-d/


วันอาทิตย์ที่ 28 กรกฎาคม พ.ศ. 2562

ลองใช้งาน Jenkins ไว้ Backup ข้อมูลแบบอัตโนมัติ

Jenkins เป็น Automate ที่ช่วยทำเกี่ยวกับ Software เช่นการ Build, Test, Deliver แล้วก็ Deploy
แต่ความคิดที่จะใช้งานครั้งนี้คือเอามา Backup ระบบ ลองดูว่าจะสามารถใช้งานได้ดีไหม และเหมาะสมไหม



Install Jenkins

เริ่มด้วยการติดตั้งกันก่อน Jenkins ทำงานอยู่บน Java เราจำเป็นต้องติดตั้ง Java กันก่อน
ตอนนี้ผมใช้ OpenJDK 8 ในการรัน Jenkins | ข้อมูลจาก Jenkins - Getting Started
sudo apt install openjdk-8-jdk

wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
java -jar jenkins.war --httpPort=8080

# เราจะเห็นรหัส สำหรับใช้ในการ Login เพื่อเข้าไปทำการติดตั้งในหน้าเว็บต่อ

จากนั้นเข้าไปที่เครื่องโดยผ่าน Port 8080 ตามที่เรากำหนดไว้เพื่อทำตามขั้นต่อการติดตั้งต่อ
ให้เราใช้รหัสที่ได้จาก Console ตอนที่เราใช้คำสั่ง "java -jar jenkins.war --httpPort=8080"

วันศุกร์ที่ 26 กรกฎาคม พ.ศ. 2562

[Linux Container] - Basic Linux Container Command


รวมคำสั่งที่ใช้งานบ่อยๆ

คำสั่งที่ใช้ในการติดตั้ง

sudo snap install lxd
sudo lxd init
sudo usermod --append --groups lxd sarankon

การจัดการเกี่ยวกับ Container

# Create new container
lxc launch images:<alias-name> <container-name>
lxc launch images:alpine/3.10 alpine

# List the list of container 
lxc list 

# Show the info of container, *snapshot show here!
lxc info <container-name>

# Start and Stop container
lxc start <container-name>
lxc stop <container-name>

# Delete container
lxc delete <container-name>
lxc delete <container-name> --force

# Run command in container
lxc exec <container-name> -- <command>
# Run apt update command
lxc exec <container-name> -- apt update
# Use bash in container
lxc exec <container-name> -- bash

# Use default editor to edit file in container
lxc file edit <container-name>/<path/file.txt>

# Push file to container
lxc file push <file> <container-name>/<path>

# Create snapshot 
lxc snapshot <container-name> <snapshot-name>

# Restore snapshot
lxc restore <container-name> <snapshot-name>

# Delete snapshot
lxc delete <container-name>/<snapshot-name>

# Create container from snapshot
lxc copy <container-name>/<snapshot-name> <new-container-name>
# lxc start <container-name> // after create from snapshot

วันเสาร์ที่ 20 กรกฎาคม พ.ศ. 2562

Raspberry Pi Zero W กับการทำ Printer Server ด้วย CUPS

อยากได้ Printer ที่สั่งผ่าน WiFi ได้ ซึ่งเคยทำมานานแล้วครั้งหนึ่งแต่ตอนนั้นลง Driver ในตัว Pi เลยและสิ่งที่ไม่มีก็คือ Driver
ผ่านไปหลายปี ตอนนี้มี Pi Zero W อยู่สามตัวไม่ได้ทำอะไร ยังไม่ได้ทำเลยเอามาลองดูใหม่ว่าจะทำได้ไหมครั้งนี้
จากการ Search Google ก็พบกับคนที่ทำไว้แล้วก็เลยลองเข้าไปอ่านแล้วก็ทำตามเขาเลยครับ
ทำ Print Server ด้วย Raspberry Pi Zero W และขอขอบคุณเจ้าของบทความครับ

ปัญหาแรกที่เจอคือพยายาม Fix IP Address ของ WiFi ยังทำไม่ได้ ไม่รู้ว่าติดตรงไหน ขอข้ามไปละกันเดี๋ยวจะไม่ได้เริ่มสักที
***ตอนนี้ใช้ Fix IP ผ่านทาง Router แทน
# Update package และ ทำการ Install CUPS
sudo apt update
sudo apt install cups

# เราสามารถใช้คำสั่ง systemctl กับ cups ได้มี service ให้เหมือนกัน
# เช่น ดูสถานะของ cups ด้วยคำสั่ง sudo systemctl status cups

# แสดงข้อมูลของอุปกรณ์ด้วยคำสั่ง lpinfo
# lpinfo - show available devices or drivers

# sudo lpinfo -v
sudo lpinfo -v | grep usb:

# ข้อมูลอุปกรณ์ที่ต่อกับ Port USB ตามนี้ เราใช้ EPSON L360
direct usb://EPSON/L360%20Series?serial=5647444B3135373352&interface=1

# ทำการตั้งค่าอุปกรณ์โดนกำหนดชื่อ Destination และ URI ของ Printer เอาถึง Serials
# lpadmin - configure cups printers and classes
# sudo lpadmin -p {destination} -v {device-uri}

sudo lpadmin -p EPSONL360 -v usb://EPSON/L360%20Series?serial=5647444B3135373352

# จากนั้นดูข้อมูลสถานะของ Printer
# lpstat - print cups status information
# sudo lpstat -p {destination} -l
sudo lpstat -p EPSONL360 -l

# ปกติถ้าพึ่งใส่ข้อมูลจะเป็น Disable
printer EPSONL360 disable since Thu 18 Jul 2019 17:40:10 BST
        reason unknown

# ทำการ Enable Printer ด้วยคำสั่ง cupsenable
# cupsdisable, cupsenable - stop/start printers and classes
# sudo cupsenable {destination}
sudo cupsenable EPSONL360

# เสร็จแล้วลองดูข้อมูลเครื่อง Printer อีกครั้งด้วยคำสั่ง lpstat
sudo lpstat -p EPSONL360 -l

# ตอนนี้ Printer ของเราเป็น Enable แล้ว
printer EPSONL360 is idle.  Enable since Thu 18 Jul 2019 17:45:10 BST

วันอังคารที่ 2 กรกฎาคม พ.ศ. 2562

Error ที่เจอกับ PHPMyAdmin และวิธีแก้ไข

Warning in ./libraries/sql.lib.php#613

ตอนนี้ใช้ PHP Version 7.2.19 บน Ubuntu 18.04 โดย PHPMyAdmin เป็น Version 4.6.6deb5 แล้วเจอ Warning

Warning in ./libraries/sql.lib.php#613
count(): Parameter must be an array or an object that implements Countable

เสร็จแล้วลองเอาไปค้นหาใน Internet ดูว่าใครเจอบ้าง ได้วีธีการแก้ปัญหามา 2 วีธี
1. แก้ไขไฟล์ sql.lib.php หรือ 2. Upgrade PHPMyAdmin
เราใช้วิธีที่ 2 แก้ไขไฟล์เพราะอ่านแล้วทำง่ายกว่าลองดูก่อนถ้าไม่ได้ผลค่อยอัพ Version

วันศุกร์ที่ 10 พฤษภาคม พ.ศ. 2562

Install Apache Tomcat 8.5 on Ubuntu Server 18.04

# Search Package Apache Tomcat 8
sudo apt update
sudo apt search tomcat8*

# List
tomcat8/bionic-updates,bionic-security 8.5.39-1ubuntu1~18.04.1 all
  Apache Tomcat 8 - Servlet and JSP engine

tomcat8-admin/bionic-updates,bionic-security 8.5.39-1ubuntu1~18.04.1 all
  Apache Tomcat 8 - Servlet and JSP engine -- admin web applications

tomcat8-common/bionic-updates,bionic-security 8.5.39-1ubuntu1~18.04.1 all
  Apache Tomcat 8 - Servlet and JSP engine -- common files

tomcat8-docs/bionic-updates,bionic-security 8.5.39-1ubuntu1~18.04.1 all
  Apache Tomcat 8 - Servlet and JSP engine -- documentation

tomcat8-examples/bionic-updates,bionic-security 8.5.39-1ubuntu1~18.04.1 all
  Apache Tomcat 8 - Servlet and JSP engine -- example web applications

tomcat8-user/bionic-updates,bionic-security 8.5.39-1ubuntu1~18.04.1 all
  Apache Tomcat 8 - Servlet and JSP engine -- tools to create user instances

# Install Apache Tomcat 8, It will install [jre] and [tomcat8-common] with.
sudo apt install tomcat8

# Check Apache Tomcat 8 Status
sudo systemctl status tomcat8

# File Location
/var/lib/tomcat8/
/etc/tomcat8/

Check http://your-domain:8080 at your web browser

วันพุธที่ 8 พฤษภาคม พ.ศ. 2562

แนะนำ Git Extensions ใช้ Git ง่ายๆ ผ่าน GUI

การใช้งาน Git แต่เดิมใช้เป็น Command Line จนชินแล้ว แต่พอจะใช้ผ่าน SSH เลยต้องหาตัวช่วยเพื่อให้ใช้งานง่ายขึ้น
เข้าไปโหลดโปรแกรม 3 ตัวนี้เลยจ้า แนะนำให้ติดตั้งใหม่ ตั้งแต่ Git เลย Next ยาวเลยไม่ปรับอะไรทั้งนั้น
- https://git-scm.com/ ( version 2.21.0 64-bit)
- http://kdiff3.sourceforge.net/ ( version 0.9.98)
- https://gitextensions.github.io ( version 3.0.2)




การใช้ SSH กับ Git