Tuesday, December 27, 2022

ตั้งค่า Mouse scrolling on Mac Book ให้ใช้งานเหมือน windows หรือ linux

  • ประเด็นคือ mouse scrolling ปุ่มกลาง เราใช้งานบน windows หรือ linux 
  • เมื่อเรา scroll ลงล่างคือ เนื้อหาที่แสดงบนหน้าต่าง มันก็จะเลื่อนลงด้านล่าง แต่ Mac มันตรงข้ามเลยแฮะ

solved

  • เข้าไปที่ system settings เลือกเมนู mouse จากนั้นตั้งค่า natural scrolling เป็น off


เพิ่มเติม

  • เข้าไปเมนูอย่างเร็วก็ commnad + space bar (spotlight searching) แล้วพิมพ์ mosue + enter

ว่าด้วยเรื่อง Forticlient VPN บน Mac Book

  • ใช้เน็ตบ้านทำงาน แต่พบปัญหา
  • คือใช้ ForticlientVPN บน windows หรือ linux หรือ android ใช้งานได้ปกติ
  • แต่ทำไมบน Mac Book ต่อ VPN แล้วใช้เว็บ browser เข้าเว็บผ่าน domain name ไม่ได้
  • แต่เข้าผ่าน ip ได้

Solved

  • ตั้ง IP เป็น DHCP นั่นแหละ แต่ manual DNS เป็น 8.8.8.8, 8.8.4.4
  • เปิด System preferences โดย Spotlight Search (command + space bar) พิมพ์ system preferences
  • แล้วเลือกเมนู Network

  • พาเนลด้านซ้าย ให้เราจะใช้ interface ที่เรากำลังใช้งาน ในที่นี้คือ usb 10/100 
  • ที่พาเนลด้านขวาล่างเลือก Advaced...

  • ไปที่ tab DNS กดปุ่ม + ด้านล่างได้เลย
เพิ่มเติม
  • ค่าเริ่มต้น DNS จะได้ 192.168.1.1 นะมันใช้ router เป็น dns ว่างั้น
  • ซึ่งถ้าเราเชื่อม VPN แล้วมันคงจะใช้ ค่านี้อยู่ เราเลยเข้าเว็บผ่าน domain name ไม่ได้
  • เพราะในวง VPN ไม่มี ไอพีนี้มั้งคิดว่านะ

 Short key for searching box on Mac Book

command + space bar

  • คีย์บอร์ดปกติที่เราใช้กับ windows คือ

start + space bar

Switch layout language on Mac Book

  • ประเด็นคือใช้ windows หรือ linux ถนัดใช้ alt + space bar ซึ่งเค้าเป็นค่าเริ่มต้นของทั้ง 2 ระบบอยู่แล้ว
  • พอเปลี่ยนมาใช้ Mac Book ไม่ค่อยคุ้น

Solved

ctrl + space bar

Screen capture on Mac Book

Ref

  • https://support.apple.com/en-us/HT201361#:~:text=of%20the%20screen-,Press%20and%20hold%20these%20three%20keys%20together%3A%20Shift%2C%20Command%2C,the%20Esc%20(Escape)%20key.

Solved
  • เอาทั้งหน้าที่แสดงผลขณะนั้น
shif+command+3
  • หรือ เลือกเฉพาะพื้นที่ ที่ต้องการ
shif+command+4
เพิ่มเติม
  • ปุ่ม command ฝั่ง mac = ปุ่ม start ของ windows 
  • ปุ่ม 3 หรือ 4 ให้ใช้ในแป้นของตัวอักษร ซึ่งจะอยู่แถวแรก ไม่ให้ใช้ number pad นะจ้ะ

Friday, December 2, 2022

How to Check Which Apache Modules are Enabled/Loaded in Linux

$ apache2ctl -M

Loaded Modules:

 core_module (static)

 so_module (static)

 watchdog_module (static)

 http_module (static)

 log_config_module (static)

 logio_module (static)

 version_module (static)

 unixd_module (static)

 access_compat_module (shared)

 alias_module (shared)

 auth_basic_module (shared)

 authn_core_module (shared)

 authn_file_module (shared)

 authz_core_module (shared)

 authz_host_module (shared)

 authz_user_module (shared)

 autoindex_module (shared)

 deflate_module (shared)

 dir_module (shared)

 env_module (shared)

 filter_module (shared)

 headers_module (shared)

 mime_module (shared)

 mpm_prefork_module (shared)

 negotiation_module (shared)

 php7_module (shared)

 reqtimeout_module (shared)

 rewrite_module (shared)

 setenvif_module (shared)

 socache_shmcb_module (shared)

 ssl_module (shared)

 status_module (shared)

 userdir_module (shared)

Ref

  • https://ubiq.co/tech-blog/check-apache-modules-enabled/
  • https://www.tecmint.com/check-apache-modules-enabled/

Tuning Your Apache Server

ENV

  • Ubuntu 18.04 
  • Apache2
  • PHP 7.4
ปัญหาที่พบ
  • apache2 ชอบ freeze เป็นระยะๆ น่าจะเกิดจาก client แต่ละ node สร้าง connection เยอะเกิน limit ของ apache
  • ดู log
$ sudo tail /var/log/apache2/error.log
  • พบ error ประมาณนี้
AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting

Solved

$ sudo nano /etc/apache2/sites-available/your_doman.conf 

  • เพิ่มต่อบรรทัดสุดท้ายได้เลย

<IfModule mpm_prefork_module>

       StartServers              4

       MinSpareServers          20

       MaxSpareServers          40

       MaxRequestWorkers       200

       MaxConnectionsPerChild 4500

</IfModule>

  • ถ้ายังดู error.log ยังพบ MaxRequestWorkers ไม่พออยู่ ให้ปรับสัก 1500 เลย

<IfModule mpm_prefork_module>
      StartServers                     10
      MinSpareServers               10
      MaxSpareServers              20
      ServerLimit                      2000
      MaxRequestWorkers         1500
      MaxConnectionsPerChild    10000 

</IfModule> 

  • หรือจะไปแก้ที่ global file เลย สำหรับทุก ไซต์

$ sudo nano /etc/apache2/mods-available/mpm_prefork.conf

  • รีสตาร์ท apache

$ sudo systemctl restart apache2

$ sudo /etc/init.d/apache2 restart

Ref

  • https://www.linode.com/docs/guides/tuning-your-apache-server/
  • https://help.thaidatahosting.com/kb/apache-performance-directadmin/
  • https://th.linux-console.net/?p=1301#gsc.tab=0
  • https://www.programmerthailand.com/tutorial/post/view/288/%E0%B9%81%E0%B8%81%E0%B9%89%E0%B8%9B%E0%B8%B1%E0%B8%8D%E0%B8%AB%E0%B8%B2-apache-error-maxrequestworkers
  • https://ubiq.co/tech-blog/check-apache-modules-enabled/
  • https://thiti.dev/blog/6245/
  • https://softganz.com/paper/235
  • https://stackoverflow.com/questions/36924952/ah00161-server-reached-maxrequestworkers-setting-consider-raising-the-maxreque

Check Apache concurrent Connections using Netstat command

$ netstat -tn 2>/dev/null | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head
หรือ
$ netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
  • ต้องการแค่บรรทัด แรก ก็
$ netstat -tn 2>/dev/null | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 1
Ref
  • https://www.cloudtechtiq.com/blog/check-apache-concurrent-connections-using-netstat-command
  • https://askubuntu.com/questions/239631/how-can-i-watch-the-current-connections-on-my-apache-webserver
  • https://fedingo.com/how-to-check-number-of-concurrent-connections-in-apache/
  • https://www.2daygeek.com/linux-check-apache-concurrent-connections-netstat-ss-command/
  • https://stackoverflow.com/questions/46021955/get-first-line-of-a-shell-commands-output

Wednesday, November 30, 2022

Bash script monitor web site service ไม่ตอบ status 200 ให้ restart web service อัตโนมัติ

  • ประเด็นมีอยู่ว่า ระบบ web ใช้ Linux + Apache2 + PHP 7 มี client เข้าไปใช้างานเยอะ บางช่วงเวลา
  • ทำให้ server 443 ไม่ตอบสนองบางครั้ง คือ  freeze ไปเลยว่างั้น กว่าจะกลับมาทำงานปกติก็ใช้เวลานาน
  • แก้ไขเบื้องต้นคือ remote เข้าไป restart apache
  • เลยหาวิธีเขียน bash script monitor server response 200 เป็นจำนวนครั้งตามที่เราตั้งค่า ถ้าไม่ตอบ 200 ทุกครั้งก็ restart เลย
  • พร้อมเก็บ log file  และส่ง line notify พร้อม
  • ตัวอย่างนี้ เช็ค 3 ครั้งเว้น 3 วินาที ถ้าไม่ตอบ status 200 ทุกครั้ง ให้ restart apache เลย

Solved

#!/bin/bash


now=$(date)

url='https://your_site'


### admin line token

token="iFBqHnx34sHla9rAQ7Qxxxxxxxxxxxxxxxxxxxxx

message="$url >>> non response >>> /etc/init.d/apache2 restart >>> $now"


i=0

j=0


## 0,1,2

until [ $i -gt 2

do

  echo i: $i

  ((i=i+1))

  sleep 3s


  status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})

  [[ $status == 500 ]] || [[ $status == 000 ]] && ((j=j+1)) # do start/restart logic

done


echo "J: $j"


if (( $j == 3 ))

 then

    echo "J == 3"

    echo "restart ${url}: $now" >> /path/log_service_freezed.log

    curl -X POST -H "Authorization: Bearer $token" -F "message=$message" https://notify-api.line.me/api/notify

    /etc/init.d/apache2 restart

 else

    echo "J != 3"

 fi 

Ref

  • https://linuxize.com/post/bash-increment-decrement-variable/
  • https://www.cyberciti.biz/faq/linux-unix-sleep-bash-scripting/
  • https://stackoverflow.com/questions/13086109/check-if-bash-variable-equals-0

Thursday, November 24, 2022

Python : TypeError: Connection.__init__() takes 1 positional argument but 5 were given

  •  พยายามรัน python script ที่มีอยู่แล้วติดต่อฐานข้อมูล ซึ่งใช้ที่เครื่องอื่นได้ปกติ
  • แต่พอย้ายมารันอีกเครื่องติดตั้ง lib ที่จำเป็นแล้ว ได้ error งี้ซะงั้น

TypeError: Connection.__init__() takes 1 positional argument but 5 were given

Solved

  • conncetion แบบเดิม

connnection = pymysql.connect("localhost", "root", "", "dbname")

  • แก้รูปแบบ Connection ใหม่เป็น

connection = pymysql.connect(host='localhost',user='root',password='',database='db_emp',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)

Ref

  • https://stackoverflow.com/questions/66300530/typeerror-init-takes-1-positional-argument-but-5-were-given

Python3 on Ubuntu 22.04 import pymysql

  • คือใน Ubuntu 22.04 server มันลง python3 มาให้โดยค่าเริ่มต้น
  • แต่จะรัน python script ที่มีอยู่มัน ซึ่งใจ้ lib pymysql

Solved

$ sudo apt install python3-pymysql

Add

  •  อย่าลืมลง pip เอาไว้ใช้

$ sudo apt install python3-pip 


Tuesday, November 22, 2022

Install Jitsi Self host Ubuntu 22.04 Server

Prerequire

  • Nginx + https
  • ในที่นี้ผู้เขียนมี  private_key และ public_key (certificate) ที่ใช้จริงๆ อยู่แล้ว
  • แก้คอนฟิกใน Nginx รีสตาร์ท ก็ใช้งาน https ได้เลย
  • เปลี่ยน hostname เราให้เป็นชื่อที่  เหมาะสม ด้วยคำสั่ง (ใช้ meet ขึ้นต้นความหมายจะได้สื่อชัดเจน)

$ sudo hostnamectl set-hostname meet.your_domain

  • เพิม static dns เครื่อง server เรา

$ sudo nano /etc/hosts

x.x.x.x meet.your_domain

  • ปิด firewall ไว้ก่อน

$ sudo ufw disable

ติดตั้ง Library ที่จำเป็น

$ sudo apt install apt-transport-https

$ sudo apt install gnupg2

$ sudo apt install openjdk-8-jdk

ติดตั้ง Jitsi Meet

  • download และ add key ของ repo สำหรับ jitsi

$ curl https://download.jitsi.org/jitsi-key.gpg.key -o jitsi-key.gpg.key

$ sudo gpg --output /usr/share/keyrings/jitsi-key.gpg --dearmor jitsi-key.gpg.key

  • เพิ่ม repo โดยสร้างไฟล์

$ sudo nano /etc/apt/sources.list.d/jitsi-stable.list

  • เพิ่มตามบรรทัดนี้เข้าไปในไฟล์ jitsi-stable.list และบันทึกให้เรียบร้อย

deb [signed-by=/usr/share/keyrings/jitsi-key.gpg] https://download.jitsi.org stable/

  • download และ add key ของ repo สำหรับ prosody

$ curl https://prosody.im/files/prosody-debian-packages.key -o prosody-debian-packages.key

$ sudo gpg --output /usr/share/keyrings/prosody-keyring.gpg --dearmor prosody-debian-packages.key

  • เพิ่ม repo สำหรับ prosody โดยสร้างไฟล์ prosody.list 

$ sudo nano /etc/apt/sources.list.d/prosody.list

  • เพิ่มตามบรรทัดนี้เข้าไปในไฟล์ prosody.list และบันทึกให้เรียบร้อย

deb [signed-by=/usr/share/keyrings/prosody-keyring.gpg] http://packages.prosody.im/debian jammy main

  • ลบ key ที่โหลดมาออกจากเครื่องเลย หรือ จะไม่ลบก็ได้เช่นกัน

$ rm jitsi-key.gpg.key prosody-debian-packages.key

  • อัพเดท repo

$ sudo apt update

$ sudo apt install jitsi-meet

  • มันจะถามให้เราใส่ your_domain ของเรา ให้เราใส่เป็น meet.your_domain
  • จากนั้นเค้าถามเรื่อง SSL ถ้าเราใช้อันที่มีอยู่แล้วก็เลือก i want to use my own certificate (เค้าก็จะให้ใส่  พาธ private_key และ พาธ public_key (certificate) ก็ใส่ให้เรียบร้อย
  • หรือ จะสร้าง ssl ปลอมขึ้นมาใช้ก่อนก็ได้ ทำตามขั้นตอนจากอ้างอิงได้เลย
  • เสร็จสิ้นการติดตั้ง Jitsi Meet ค่าพื้นฐานสามารถใช้งานได้แล้ว
  • ทดสอบ

https://meet.your_domain

คอนฟิกให้ผู้สร้างห้องต้องใส่ username และ password ก่อน

  • แก้ไขไฟล์ /etc/prosody/conf.avail/your_domain.cfg.lau

$ sudo nano /etc/prosody/conf.avail/your_domain.cfg.lau

  • มองหาประมาณ 

authentication = "anonymous" 

  • และ แก้ไขเป็น 

authentication = "internal_plain"

  • ยังอยู่ที่ไฟล์ /etc/prosody/conf.avail/your_domain.cfg.lau เพิ่ม section ด้านล่างนี้ลงไปต่อท้ายของไฟล์

VirtualHost "guest.meet.your_domain"

    authentication = "anonymous"

    c2s_require_encryption = false

    modules_enabled = {

            "bosh";

            "ping";

            "pubsub";

            "speakerstats";

            "turncredentials";

            "conference_duration";

    }

  • ต่อไปแก้ไขไฟล์ /etc/jitsi/meet/meet.your_domain-config.js

$ sudo nano /etc/jitsi/meet/meet.your_domain-config.js

  • มองหาประมาณนี้ 

// anonymousdomain: 'guest.example.com',

  • แล้ว uncomment มันและแกไขเป็นประมาณนี้ 

anonymousdomain: 'guest.meet.your_domain',

  • สร้างไฟล์ /etc/jitsi/jicofo/sip-communicator.properties

$ sudo nano /etc/jitsi/jicofo/sip-communicator.properties

  • เพิ่มบรรทัดล่างนี้เข้าไปในไฟล์ที่เราสร้าง

org.jitsi.jicofo.auth.URL=XMPP:meet.your_domain

  • เพิ่ม userและ pass สำหรับ ใช้สร้างห้อง

$ sudo prosodyctl register user meet.your_domain password

  • restart service ที่เกี่ยวข้อง

$ sudo systemctl restart prosody.service jicofo.service jitsi-videobridge2.service

เพิ่มเติม

  • การติดตั้ง Jitsi Meet เมื่อสำเร็จเราจะได้ไฟล์ คอนฟิกของ vhost 

/etc/nginx/sites-available/meet.your_domain.conf 

  • และมีการสร้างลิ้งใน

/etc/nginx/sites-enabled/

  • ทั้ง 2 อันนี้มันจะสร้างให้อัตโนมัตินะคับ
  • โดยที่เราไม่ต้องสร้าง vhost ไว้เอง
  • แต่ยังไม่ได้ลอง openjdk ที่เวอร์ชั่นใหม่กว่า 8

Ref

  • https://ifew.medium.com/%E0%B8%97%E0%B8%B3-video-conference-%E0%B8%9F%E0%B8%A3%E0%B8%B5%E0%B9%86-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-jitsi-meet-%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%AA%E0%B8%B2%E0%B8%A1%E0%B8%B2%E0%B8%A3%E0%B8%96%E0%B9%81%E0%B8%97%E0%B8%9A%E0%B9%80%E0%B8%AB%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%99-google-meet-zoom-4b7bc8d007ef
  • https://www.digitalocean.com/community/tutorials/how-to-install-jitsi-meet-on-ubuntu-22-04

Monday, November 21, 2022

Config exists ssl file for NGINX on Ubuntu 22.04

  • แก้ไขไข vhost คอนฟิก
  • ประมาณว่าเรา มี public และ private แบบ wildcard ใช้งานจริงอยู่แล้ว
  • ซึ่งปัจจุบันใช้กับ  apache อยู่ แต่อยากเอามาใช้บน nginx ด้วย

Solved

  • ไปคัดลอก  public_key และ private_key มาที่ server nginx ของเรา
  • วางไว้พาธที่เราต้องการ ในที่นี้ขอวางไว้ที่นี้แล้วกัน

/etc/nginx/ssl

  • จากนั้นเปิด vhost คอนฟิกไฟล์ขึ้นมาก

$ sudo nano /etc/nginx/sites-available/your_domain

  • เพิ่มคอนฟิกเพิ่มเติมประมาณนี้

listen 443 ssl;

......

ssl_certificate /etc/nginx/ssl/public_key.pem;

ssl_certificate_key /etc/nginx/ssl/private_key.pem;

  • เช็ค syntax nginx

$ sudo nginx -t

  • ทุกอย่างถูกต้อง restart nginx

$ systemctl restart nginx

  • คอนฟิกไฟล์จะได้ประมาณนี้

server {

listen 80;

listen 443 ssl;

server_name your_domain;

ssl_certificate /etc/nginx/ssl/public_key.pem;

ssl_certificate_key /etc/nginx/ssl/private_key.pem;


root /var/www/your_domain;

index index.html index.htm index.php;


location / {

try_files $uri $uri/ =404;

}

location ~ \.php$ {

include snippets/fastcgi-php.conf;

fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;

}

location ~ /\.ht {

deny all;

}

}

Ref 

  • http://nginx.org/en/docs/http/configuring_https_servers.html

Friday, November 18, 2022

Config PHP-FPM 8.0 (PHP.INI) with NGINX on Ubuntu 22.04

$ sudo nano /etc/php/8.0/fpm/php.ini

  • แล้วแก้ คอนฟิกเหมือนกันกับที่เราแก้ของ apache นั่นแหละ 
  • หรือ 

$ sudo nano /etc/php/8.0/fpm/pool.d/www.conf

  • ต่อบรรทัดสุดท้ายเพิ่มประมาณนี้ เป็นต้น

php_admin_value[memory_limit] = 512M

php_admin_value[max_execution_time] = 300

  • ทำวิธีด้านบนแล้ว restart service  2 อันนะคับ ที่ต่างจาก apache อยู่

$ sudo systemctl restart nginx

$ sudo systemctl restart php8.0-fpm

Ref

  • https://www.digitalocean.com/community/tutorials/php-fpm-nginx

Thursday, November 17, 2022

mysqldump แยก structure, function, procedure, data

structure + view + trigger

mysqldump --column-statistics=0 --no-data -B -h [host_remote] -u [user_remote] -p[pass_remote] [db_remote] > [file_export.sql]

function + procedure

mysqldump --column-statistics=0 --host=[host_remote] -B --user=[user_remote] --password=[pass_remote] --routines --no-create-info --no-data --no-create-db --skip-opt [db_remote] > [file_export.sql]

data

mysqldump --column-statistics=0 --no-create-info -B -h [host_remote] -u [user_remote] -p[pass_remote] [db_remote] > [file_export.sql]

Add

  • --column-statistics=0 ถ้า mysql server เป็นเวอร์ชั่นเดียวกัน option นี้ไม่น่าจะได้ใช้

Ref

  • https://stackoverflow.com/questions/6175473/mysql-export-schema-without-data

mysql import ข้อมูลผิดพลาด NO_AUTO_CREATE_USER

  • ปัญหาเกิดขึ้นคือ mydump ข้อมูล ออกมา จาก MySQL 5 จะ import เข้า MySQL 8 ด้วย command line
  • แต่ขึ้น error ประมาณนี้

NO_AUTO_CREATE_USER

  • ประมาณว่า MySQL 8 ไม่เปิดให้ใช้ ตั้งค่าแบบนี้ตอน import

Solved

  • แก้ไขปัญหาโดย replace string 
  • ,NO_AUTO_CREATE_USER ให้เป็นค่าว่าง แล้วค่อยสั่งนำเข้าข้อมูลอีกครั้ง
  • ด้วย bash script ก็ได้ file_bashname.sh

#!/bin/bash

file_replace="fn_mysql.sql"

search=",NO_AUTO_CREATE_USER"

replace=""

sed -i "s/$search/$replace/" $file_replace

Add

  • MySQL ฝั่ง client และ server เป็น version เดียวกัน พบปัญหานี้  เหมือนเดิม

Ref

  • https://linuxhint.com/replace_string_in_file_bash/
  • https://stackoverflow.com/questions/50336378/variable-sql-mode-cant-be-set-to-the-value-of-no-auto-create-user

mysql command import ผิดพลาด ERROR 1418 (HY000) at line 434: This function has none of DETERMINISTIC...

ERROR 1418 (HY000) at line 434: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

  • error นี้ได้มาจากใช้ mysql client เพื่อ import ข้อมูลที่ใช้ mysqldump มา โดย client เป็น MySQL 8, server ที่ไปเอาข้อมูลออกมาเป็น MySQL 5 แล้วจะนำเข้า MySQL 8

Solved

  • ที่ฝั่ง client เราไป set ค่าก่อนประมาณนี้

mysql>  SET GLOBAL log_bin_trust_function_creators = 1;


Add

  • MySQL ฝั่ง client 8.0 และ server 8.0 เป็น version เดียวกัน พบปัญหานี้  เหมือนเดิม

Wednesday, November 16, 2022

Enable mod_rewrite for Nginx on Ubuntu 22.04

  • ในที่นี้เราสร้าง vhost ใหม่ your_domain

$ sudo nano /etc/nginx/sites-available/your_domain


  • comment บรรทัดที่ 10 ดังภาพ

try_files $uri $uri/ = 404;

  • เพิ่มบรรทัดที่ 11 กรณีระบบวางภายใน web root เลย

try_files $uri $uri/ /index.php?$args;

  • หรือกรณีทำระบบวางเป็น subfolder อยากให้เป็น rewrite เราก็ใส่เป็น

try_files $uri $uri/ /subfolder/index.php?$arsg;

เพิ่มเติม

  • ไฟล์คอนฟิกเริ่มต้นจะอยู่ที่ /etc/nginx/sites-available/default
  • กรณีเรามี subfolder ใน root หลายอันที่ต้องใช้ rewrite ให้ทำประมาณนี้ก็ได้เช่นกัน
location / {
    try..... /index.php?$args;
}

location /sub1 {
    try..... /sub1/index.php?$args;
}

location /sub2 {
    try..... /sub2/index.php?$args;
}

Tuesday, November 15, 2022

Downgrade PHP8.1 to PHP8.0 for NGINX on Ubuntu 22.04

  • ปัญหาประมาณ พัฒนา project CI4 แต่มันรันได้ปกติแค่ PHP 8.0
  • server ใหม่ที่เตรียมไว้ ลง NGINX ค่าเริ่มต้น PHP 8.1 มันใช้ไม่ได้
  • ต้อง downgrade ลงมาประมาณนี้

$ sudo apt install php8.0-fpm php8.0-mysql

  • ติดตั้ง lib ที่จำเป็นก่อนเลย

$ sudo apt install php8.0-bcmath php8.0-bz2 php8.0-curl php8.0-intl php8.0-mbstring php8.0-mysql php8.0-readline php8.0-xml php8.0-zip php8.0-gd php8.0-gmp

  • เปลี่ยน PHP 8.1  เป็น 8.0

วิธีแรก (ผู้เขียนเลือกวิธีแรก)

$ sudo update-alternatives --config php


  • เลือก php version  ตามเลข ด้านหน้าแล้ว Enter

วิธีสอง

$ sudo update-alternatives -set php /usr/bin/php8.0
  • ทดสอบ php ที่ระบบหลักใช้

$ sudo php -v

เปลี่ยน คอนฟิกไฟล์ default site หรือ vhost 

$ sudo nano /etc/nginx/sites-available/your_domain

  • fastcgi_pass... php8.1 เป็น php8.0 นะคับ
fasstcgi_pass unix:/var/run/php/php8.0-fpm.sock;
  • จากนั้น restart nginx

/etc/init.d/nginx restart

  • ทดสอบรัน phpinfo  ดูเวอร์ชั่นที่ nginx ใช้ php

Ref

  • http://juuier.blogspot.com/2022/11/lemp-on-ubuntu-2204.html
  • https://opensenselabs.com/blog/tech/change-php-version-drupal-website-apache-nginx

LEMP on Ubuntu 22.04

ENV

  • Ubuntu 22.04 Server
  • UFW status is inactive

Step

$ sudo apt update

install nginx 

  • ตอนนี้มันจะได้ nginx version: nginx/1.18.0 (Ubuntu) 

$ sudo apt install nginx

$ sudo nginx -v

  • ทดสอบ

http://server_domain_or_ip

  • พาธไฟล์ root ของ nginx

/var/www/html/

install MySQL 

  • ตอนนี้มันจะได้ mysql  Ver 8.0.31-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))

$ sudo apt install mysql-server

$ sudo mysql --version

install PHP สำหรับ NGINX 

  • ลง แบบ FPM และ php-mysql ค่าเริ่มต้นจะเป็นของ php8.1 นะ

$ sudo apt install php8.1-fpm php-mysql

  • ติดตั้ง lib ที่จำเป็น

sudo apt install php8.1-bcmath php8.1-bz2 php8.1-curl php8.1-intl php8.1-mbstring php8.1-mysql php8.1-readline php8.1-xml php8.1-zip php8.1-gd php8.1-gmp 

  • ทดสอบรัน PHP บน NGINX ของเราโดย สร้างไฟล์ info.php ก่อน

$ nano /var/www/html/info.php

  • แก้ไขคอนฟิก default ให้รัน php ได้ซะก่อน (ก่อนแก้ไขอย่าลืมสำรองไฟล์ไว้ก่อน)
$ sudo nano /etc/nginx/sites-available/default

  • เปิด comment ที่เค้า comment เกี่ยวกับการเปิดใช้งาน php ไว้ หรือ เพิ่ม คอนฟิกประมาณนี้ 

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html index.php;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}

location ~ /\.ht {
deny all;
}
  • โดยใส่โค้ดแบบนี้

<?php phpinfo(); ?>

  • ทดสอบ ถ้าสำเร็จ info จะมี  หัวข้อ PDO, และ MySQLi คือ lib mysql สำหรับ php ใช้ด้วยกันได้ ถ้าไม่มี หัวข้อ MySQLi แสดงว่า php-mysql เวอร์ชั่นไม่ตรงกันจึงใช้ไม่ได้

http://server_domain_or_ip/info.php
สร้าง virtual host สำหรับ nginx

$ sudo mkdir /var/www/your_domain

$ sudo chown -R $USER:$USER /var/www/your_domain

$ sudo nano /etc/nginx/sites-available/your_domain

  • ใส่เนื้อหาประมาณนี้

  • จากนั้นเปิดใช้งาน virtual host config ไฟล์อันนี้
$ sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled

  • ปิด host default

$ sudo unlink /etc/nginx/sites-enabled/default

  • *** ถ้าต้องการเอา vhost default กลับ

$ sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled

  • ทดสอบ syntax config site ถูกต้อง

$ sudo nginx -t

  • restart nginx

$ sudo /etc/init.d/nginx [reload|restart] หรือ $ sudo systemctl [reload|restart] nginx

  • ตอนนี้ root vhost ใหม่เราจะอยู่ที่ประมาณนี้ เอาไฟล์ php ไปรันได้เลย

/var/www/your_domain

Add

  • ถ้าต้องการใช้ php8.0 ตั้งแต่เริ่มให้ add repo แล้ว update ก่อน

$ sudo add-apt-repository ppa:ondrej/php

$ sudo apt update

  • เราสามารถกำหนดให้ vhost แต่ละอันใช้ php เวอร์ชั่นต่างๆ ได้ตามต้องการ 
  • แค่เราลง php เวอร์ชั่นที่เราต้องการเพิ่มใน server เครื่องนั้น และ คอนฟิก vhost 
  • fastcgi_... /php8.1-fpm.sock; เปลี่ยนเป็น เวอร์ชั่นที่เราลงเพิ่ม แล้ว restart nginx ซักรอบ

Ref

  • https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-22-04

Thursday, November 10, 2022

mysqldump: Couldn't execute 'SELECT COLUMN_NAME_ _ _ _ _ Unknown table 'COLUMN_STATISTICS' in information_schema (1109)

  • จะสำรองข้อมูล MySQL บน Server 
  • รันคำสั่งจาก client
mysqldump -h host -u user -p dbname > dbname.sql
  • มันขึ้นประมาณนี้
mysqldump: Couldn't execute 'SELECT COLUMN_NAME_ _ _ _ _ Unknown table 'COLUMN_STATISTICS' in information_schema (1109)
Solved
  • เพิ่ม option นี้ --column-statistics=0 เข้าไปในคำสั่ง
mysqldump --column-statistics=0 -h host -u user -p dbname > dbname.sql
Ref
  • https://skillsenrich.blogspot.com/2019/08/mysqldump-couldnt-execute-select.html

Ubuntu 22.04 add shared print from Printer Server (Rasbery Pi)

  • EPSON L3110
  • Ubuntu 22.04  Desktop 64bit เราจะเพิ่มปริ้นเตอร์ที่ถูกแชร์แบบ Print server โดย Rasbery Pi ไว้แล้ว

Solved

  • ไปดาวนโหลดและติดตั้ง driver ซะก่อน
  • https://download.ebz.epson.net/dsc/search/01/search/searchModule
  • โหลดของ 64 bit ได้ประมาณ .deb ทำการติดตั้งด้วยคำสั่งประมาณนี้

  • sudo dpkg -i xxx.deb หรือ sudo apt install ./xxx.deb
  • driver พร้อมในเครื่องแล้ว ให้เราเปิด Setting ของระบบขึ้นมา 
  • panel ด้านซ้ายเลือก Printers
  • จากนั้นเลือก Additional Printer Settings...
  • และกดปุ่ม + Add

  • จากนั้นจะได้หน้าต่างใหม่ panel ซ้ายเลือก Find Network Printer
  •  ช่อง Host ให้เราใส่ IP ของ เครื่อง Printer server จากนั้น กดปุ่ม Find

  • ถ้าเครื่องนั้นมีการแชร์ปริ้นไว้ จะเห็นรายชื่อที่แชร์ไว้ ให้เราเลือก printer ที่เราต้องการใช้งาน
  • และกดปุ่ม Forward

  • ใส่ Printer Name ตามที่เราต้องการได้เลย (ใส่เป็นชื่อรุ่นปริ้นเตอร์ไปเลยน่าจะดี)
  • จากนั้นกดปุ่ม Apply
  • ถ้าทุกอย่างเรียบร้อย มันจะแสดงประมาณนี้เลย (แต่ถ้ามีปัญหายังไม่ลง driver ในขั้นตอนก่อนหน้า มันจะขึ้นไปเลือก driver ประมาณนั้น)

Ref
  • https://askubuntu.com/questions/1250554/epson-l3110-on-ubuntu-20-04-lts

ปัญหาของ Shutter บน Ubuntu 22.04 กับ Wayland session

  • ใช้ใน Ubuntu ก่อนเวอร์ชั่นนี้มาตลอดค่อนข้างโอเค
  • แต่ไง๋พอเราจะใช้ใน Ubuntu 22.04 มันติดตั้งได้ปกติ

sudo apt install shutter

sudo apt remove --autoremove shutter 

  • แต่จะใช้ปุ่ม selection มัน disable ซะงั้น เวลาจะใช้ทีต้องเปิดผ่าน sudo จึงจะได้ selection ได้ ซึ่งไม่ค่อยสะดวกที่เคยว่า user ปกติก็ใช้ได้

Solved

  • อ้างอิงบอกว่า Shutter so far does not support Wayland session ซะงั้น
  • อีกนานว่างั้น 
  • Logout ออกจาก session ปัจจุบัน ที่เป็น wayland จากนั้น Login ใหม่โดยเลือกประมาณ Unity หรือ Ubunbtu.Xorg ประมาณนี้
  • เพียงเท่านี้เราก็ใช้ Shutter ได้เต็มที่เหมือนเคยแล้ว

Ref

  • https://fostips.com/install-shutter-ppa-ubuntu-20-10/

Wednesday, October 19, 2022

Ubuntu 22.04 downgrade PHP 8.1 to PHP 8.0 or PHP 7.4 (Apache)

  • ประเด็นคือย้าย Codeignitor 4 จาก PHP 7.4 ที่ Server เครื่องเก่าไป VM เครื่องใหม่
  • โดย Server ตัวใหม่ลง apache2 + PHP 8.1 ไว้ใช้งานแล้ว แต่ CI4 เค้าว่ามีปัญหากับ PHP 8.1 ซะงั้น
  • https://stackoverflow.com/questions/70285088/uncaught-errorexception-strtolower-passing-null-to-parameter-1-string-of
  • เค้าแนะนำให้ใช้ PHP 8.0 พอ
  • ที่ทำอยู่นิ ใช้ Apache2 นะคับ

Solved

  • add repo ก่อนถึงจะติดตั้ง php8.0 ได้เพราะ 22.04 ค่าเริ่มของ repo เค้าได้ php8.1 นะ 
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt update

  • ติดตั้ง php8.0 และ package ที่จำเป็น

sudo apt install php8.0 php8.0-common php8.0-cli

sudo apt install php8.0-bcmath php8.0-bz2 php8.0-curl php8.0-intl php8.0-mbstring php8.0-mysql php8.0-readline php8.0-xml php8.0-zip php8.0-gd php8.0-gmp

  • เปิดใช้งาน php8.0 (a2enmod ใช้ได้เฉพาะ ลง apache แล้วเท่านั้น)

sudo a2enmod php8.0

  • ปิดการใช้งาน php8.1 (a2dismod ใช้ได้เฉพาะ ลง apache แล้วเท่านั้น)

sudo a2dismod php8.1

  • สลับให้ Ubuntu ไปใช้ lib ของ php8.0 เป็นค่าเริ่มต้น

sudo update-alternatives --set php /usr/bin/php8.0

  • restart apache ซะหน่อย

sudo /etc/init.d/apache2 restart หรือ $ sudo systemctl restart apache2

Add

  • ถ้าเราต้องการใช้  downgrade ไปที่ 7.4 ก็เปลี่ยนจาก 8.0 เป็น 7.4 ในคำสั่งด้านบนเท่านั้น
  • server ใหม่ในที่นี้ใช้ Ubuntu 22.04 ตัวเก่าใช้ 18.04
  • เช็ค version php ที่ระบบใช้อยู่ปัจจุบัน
sudo php -v

Ref

  • https://juuier.blogspot.com/2020/09/rewrite-urls-with-modrewrite-for-apache.html
  • https://juuier.blogspot.com/2021/06/update-to-php-74-on-ubuntu-1804.html
  • https://juuier.blogspot.com/2021/09/scp-copy-tool-ubuntu-2004.html


Tuesday, October 18, 2022

MySQL Export query data มากๆ ด้วย outfile

  • ปกติเราใช้ MySQL Workbench เป็น client แต่เค้าให้ export result ได้ทีละ 1000 per page
  • มันมีตั้งหลายหน้าทำไง เลยถามผู้รู้พี่เค้าแนะนำใช้ select to outfile แต่ผลลัพธ์ที่เป็น ไฟล์ output มันจะอยู่ที่ db server ซะงั้น แต่ก็ยังดีกว่า  export ที่ละหน้าแหละ

Solved

SELECT t1.* from table into outfile '/tmp/tb.csv' fields enclosed by '"' terminated by ';' escaped by '"' lines terminated by '\r\n';

เพิ่มเติม

  • พาธที่มันจะสร้างไฟล์ csv  จะอยู่ที่เครื่องที่ database server นั้น
  • และต้องใช้ export ลง /tmp ด้วย เพราะถ้าระบุพาธอื่นๆ ที่เราต้องการ mysql user ไม่มี สิทธิ์เขียนไฟล์ประมาณนี้

ERROR 1 (HY000): Can't create/write to file

Ref

  • https://www.navisite.com/blog/mysql-error-1-hy000-cant-create-write-to-file/
  • https://www.educba.com/mysql-export-to-csv/
  • https://stackoverflow.com/questions/2867607/mysql-select-into-outfile-local

Tuesday, September 13, 2022

ว่าด้วยเรื่อง result export MySQL Workbench เป็น file.csv ใน Ubuntu


  • ปัญหาคือ เมื่อเรา export ได้  file.csv แล้ว เครื่องเราก็อ่านไทยได้ปกติ (เปิดด้วย LibreOffice Calc)
  • แต่พอแชร์ให้เครื่อง Windows เปิดด้วย MS Office excel อ่านไม่ออกซะงั้น

Solved

  • ที่ Ubuntu เรา
  • เปิด file.csv ด้วย LibreOffice Calc จากนั้น  save as...
  • เลือก format เป็น Excel 2007-365(.xlsx)

Create a MySQL database with charset

  • ปัญหาคือ สร้าง database ด้วย command line แต่ไม่ได้กำหนด charset 

> create database mydb;

  • ค่าเริ่มต้นมันจะได้ latin เป็น charset เริ่มต้นให้เรา ซึ่งมันค่อนข้างมีปัญหากับภาษาไทย

CREATE DATABASE mydatabase CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ref: 

  • https://dba.stackexchange.com/questions/76788/create-a-mysql-database-with-charset-utf-8 

Tuesday, August 30, 2022

Gedit กับ file ภาษาไทย Ubunut 22.04

  • ประเด็นมีอยู่ว่า ได้รับไฟล์ file.txt จากระบบ Line app
  • เค้าพิมพ์ไทยมา แต่เปิดอ่านเป็นภาษาต่างดาวซะงั้น

  • ไฟล์ต้นทางเค้าน่าจะสร้างไฟล์โดยการเข้ารหัส TIS-620 มา แล้วส่งถึงเรา

Solved

$ gedit --encoding=TIS-620 file.txt

  • จากนั้น save as เป็นไฟล์ใหม่ เลือกเข้ารหัส UTF-8 นะ

Friday, August 26, 2022

ว่าด้วยเรื่อง crontab ทำงานทุกๆ 5 นาที และมันไม่ทำงาน ที่ 23:59

  • Ubuntu 18.04
  • ใช้คำสั่งฝังใน crontab ณ เวลา 23:59 มันไม่ทำงาน
  • เปลี่ยนไปรันที่  06:08 มันทำงานเฉย งง ล่ะสิคับ
  • หรือ เราจัดงานให้ ณ เวลานั้น หลายงาน ทำให้บางงานไม่ทำงานหรือป่าวไม่แน่ใจ
เพิ่มเติม
  • Execute a cron job every 5 Minutes
*/5 * * * * /home/ramesh/backup.sh
  • Execute a cron job every 5 Hours
0 */5 * * * /home/ramesh/backup.sh
  • Execute a job every 5 Seconds
  • Create a shell script every-5-seconds.sh using bash while loop as shown below.
$ cat every-5-seconds.sh
#!/bin/bash
while true
do
 /home/ramesh/backup.sh
 sleep 5
done
Ref
  • https://www.thegeekstuff.com/2011/07/cron-every-5-minutes/#:~:text=Cron%20job%20cannot%20be%20used,sleep%205'%20command%20in%20it.

Friday, August 19, 2022

Change timezone on Ubuntu 22.04

  • ดูวัน/เวลาปัจจุบันก่อน Set Time Zone

$ date 

  • ดูว่าปัจจุบันเครื่องใช้ Time Zone อะไร

$ timedatectl 

  • ดูว่าเราสามารถเปลี่ยน Time Zone เป็นอะไรได้บ้าง

$ timedatectl list-timezones

  • เปลี่ยน Time Zone ตามที่อยากจะให้เป็น

$ timedatectl set-timezone Asia/Bangkok

  • ตรวจสอบ Time Zone เครื่องอีกครั้ง

$ timedatectl 

ปัญหาที่เจอถ้าเราไม่ดูแลเรื่องนี้

  • ตอนเขียน PHP ปริ้น เวลาออก มามันจะใช้ timezone ของ  OS
  • ซึ่งถ้าเราไม่เปลี่ยน timezone ให้ถูกต้อง เวลาคำนวนเรื่องเวลาจะเพื้ยนไปหมด
  • วิธีแก้เบื้องต้น กำหนดค่าในโค้ด php  ให้ใช้ timezone ที่ถูกต้อง หรือ แก้ไข php.ini
  • หรือแก้ที่ Host OS เลยด้วยคำสั่ง timedatectl
*** เพิ่มเติม กรณี sync แล้วแต่เพี้ยน
  • ปิด sync $ sudo timedatectl set-ntp no
  • และตั้งเองเลย
$ sudo timedatectl set-time 15:30:00
$ sudo timedatectl set-time 2019-04-25

Ref

  • https://www.jittagornp.me/blog/set-timezone-for-ubuntu20.04/
  • https://phoenixnap.com/kb/how-to-set-or-change-timezone-date-time-ubuntu

barrier on Ubuntu 22.04 LTS (Jammy Jellyfish)

Install

$ sudo apt update

$ sudo apt install barrier

Remove

$ sudo apt remove barrier

$ sudo apt remove barrier

Ref

  • https://linux-packages.com/ubuntu-jammy-jellyfish/package/barrier

รื้อ Rsync ซะหน่อย

Env

  • Server Ubuntu18.04
  • Client Ubuntu 22.04

Pattern basic

$ rsync -av -e ssh /src/ user@remote:/path/to/dst

  • ในที่นี้ เครื่อง client จะรันคำสั่ง rsync  เพื่อ backup file จาก server ลงมา client

# rsync -av -e ssh user@remote:/path/from/source_folder /local/path/destination_folder

  • ในกรณีเราจะเอาไฟล์จาก client ขึ้นไปวางบน server แต่ใช้คำสั่งจาก client 

# rsync -av -e ssh /local/path/source_folder user@remote:/path/from/destination_folder 

  • กรณีใช้ private key authen

 # rsync -av -e "ssh -i /path/private_key" user@remote:/path/from/source_folder /local/path/destination_folder

  • กรณีเปลียน port remote

 # rsync -av -e 'ssh -p 2200' user@remote:/path/from/source_folder /local/path/destination_folder

Ref

  • https://linuxconfig.org/using-rsync-over-ssh-an-ultimate-backup-tool

Install LAMP Ubuntu 22.04 Server (Normal type install)

 ติดตั้ง PHP8.1

$ sudo apt update

$ sudo add-apt-repository ppa:ondrej/php

$ sudo apt update

$ sudo apt install php8.1

  • คำสั่งด้านบน มันจะติดตั้ง apache2 และ package เพิ่มเติมที่เราน่าจะได้ใช้ใหัอัตโนมัติ ดังนี้ 

apache2 apache2-bin apache2-data apache2-utils libapache2-mod-php8.1 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap php-common php8.1-cli php8.1-common php8.1-opcache php8.1-readline

  • ลง php module ที่เกี่ยวข้องเพิ่มเติม

$ sudo apt install php8.1-bcmath php8.1-bz2 php8.1-curl php8.1-intl php8.1-mbstring php8.1-mysql php8.1-readline php8.1-xml php8.1-zip php8.1-gd php8.1-gmp

ติดตั้ง Apache2

  • เพื่อให้ชัวร์ สั่งติดตั้ง ด้วยคำสั่ง (มันจะถูกติดตั้งให้อัตโนมัติ ตั้งแต่เราลง php8.1 แล้ว)

$ sudo apt install apache2 libapache2-mod-php8.1 -y

ติดตั้ง MySQL Server

$ sudo apt install mysql-server

  • ถ้าต้องการตั้งความปลอดภัยให้ MySQL เริ่มต้น ใช้คำสั่งด้านล่าง (แต่ส่วนตัวไม่ชอบใช้คับ)

$ sudo mysql_secure_installation

  • เข้าใช้งาน mysql client และ เพิ่ม new_user ให้สิทธิ์ เท่า root ของ mysql เลย (เราไม่ต้องไปยุ่งกับ  root mysql เลย)

$ sudo mysql

> CREATE USER 'new_user'@'%' IDENTIFIED BY 'new_user_password';

> grant all privileges on *.* to 'new_user_name'@'%' with grant option;

> FLUSH PRIVILEGES;

  • สุดท้าย restart apache2 ซะหน่อย

$ sudo systemctl restart apache2

  • สร้างไฟล์ .php ทดสอบ Apache2 + PHP บน server

# echo "<?php phpinfo(); ?>" >> /var/www/html/phpinfo.php

  • รันทดสอบ

http://ip-host/phpinfo.php

Ref

  • https://linuxhint.com/set-up-lamp-stack-ubuntu-22-04/
  • https://juuier.blogspot.com/2021/09/create-set-permission-for-user-mysql.html
  • https://juuier.blogspot.com/2021/06/update-to-php-74-on-ubuntu-1804.html

Tuesday, July 19, 2022

Python : Unable to find token seed! Did https://translate.google.com change?

  • รัน python3 แล้ว exception ประมาณนี้ ซึ่งก่อนหน้านี้ โค้ดนี้ใช้ได้อยู่นะ
  • แต่ทำไมวันนี้มัน exception หว่า   

$ python3 text_file_to_speech.py 

Traceback (most recent call last):

  File "text_file_to_speech.py", line 18, in <module>

  myobj.save("./audios/output.mp3") 

  File "/usr/lib/python3/dist-packages/gtts/tts.py", line 295, in save

    self.write_to_fp(f)

  File "/usr/lib/python3/dist-packages/gtts/tts.py", line 251, in write_to_fp

    prepared_requests = self._prepare_requests()

  File "/usr/lib/python3/dist-packages/gtts/tts.py", line 194, in _prepare_requests

    part_tk = self.token.calculate_token(part)

  File "/usr/lib/python3/dist-packages/gtts_token/gtts_token.py", line 28, in calculate_token

    seed = self._get_token_key()

  File "/usr/lib/python3/dist-packages/gtts_token/gtts_token.py", line 59, in _get_token_key

    "Unable to find token seed! Did https://translate.google.com change?"

ValueError: Unable to find token seed! Did https://translate.google.com change?

Solved
pip3 install gTTS-token --upgrade
pip3 install gTTS --upgrade
Add
  • ติดตั้ง pip ถ้าไม่มี
  • สำหรับ python2
sudo apt install python-pip
  • สำหรับ python3
sudo apt install python3-pip
Ref
  • https://stackoverflow.com/questions/64699071/valueerror-unable-to-find-token-seed-did-https-translate-google-com-change

Tuesday, June 28, 2022

Getting the access token OAuth for integration webex for developers

  • ประเด็นคือ ต้องการใช้งาน api เพื่อจัดการ webex meeting โดยไม่ต้องเข้าผ่านระบบ gui  ของเค้า
  • เข้าไปดูใน document เข้าบอกว่าใช้ token key ในการ ยืนยันตัวตน 
  • และในระบบทดสอบ เค้าใช้ personal token key ในการทดสอบ api ซึ่ง personal token จะมีอายุแค่ 12 ชั่วโมง เท่านั้น (น่าจะเริ่มนับเวลาจากการ  login เข้าระบบเค้านะ)
  • ปัญหาคือ จะทำยังไงให้ได้ token key ที่ใช้ได้นานที่สุด หลังจากมั่วอยู่นานก็ได้ token key มาใช้แล้ว แต่อายุเค้าจะอยู่ได้ประมาณ 14 วัน ต้อง refresh token ใหม่

Step

  • อย่างแรกเราต้องไปสร้าง integrate app  ของเราก่อนโดยเข้าระบบ https://developer.webex.com/
  • ซึ่งทั้งหมดที่กล่าวมา เราต้องมี license ใช้งานนะ จึงจะได้ user , pass เข้าระบบเค้าได้
  • เลือก  Login เข้าสู่ระบบให้เรียบร้อย จากนั้นเลือก Start Building Apps


  • จากนั้นเลือก Create an Integration

  • จากนั้นใส่รายละเอียดลงไป 

  • Will this ... mobild SDK? เลือก No
  • Integration name ใส่ชื่อ app เราเช่น app2_test
  • Icon เลือก ตามค่าเริ่มต้น 1 - 3 หรือจะ upload มาเองก็ได้

  • Description ใส่คำอธิบาย app เราลงไปสักหน่อย
  • Redirect URL(S) อันนี้ใส่ url ที่เราจะให้มัน redirect กับมาพร้อมกับค่า code ที่เราจะไปใช้ขอ token ต่อ

  • Scopes อันนี้น่าจะคล้ายๆ permission เราก็ไม่แน่ใจ จึงเลือกหมดเลย เท่าที่เลือกได้ เช็คให้หมดเลย

  • ข้อมูลเรียบร้อยคลิก  Add Integration
  • จากนั้นจะได้ข้อความ congraturation ประมาณนี้
  • สิ่งที่เราจะได้ใช้ต่อคือ client id, client secret และ url ในกรอบสีดำ
  • จากนั้นให้เราคัดลอก url ในกรอบสีดำไปวางบน address bar ของ browser  เปลี่ยนค่า state สุดท้ายให้
  • เป็นประมาณนี้ state=authorization_code ด้วย
  • จากนั้น กด enter เพื่อในรัน url ที่เราได้เปลี่ยนค่าตัวแปรแล้ว 
  • ระบบจะให้ใส่ username, pass ของ webex อีกรอบ ก็ใส่ไป
  • เมื่อใส่เรียบร้อย ถ้ามี ขึ้น error โหลดหน้าเว็บไปต่อไม่ได้ ให้เรารอสักครู่ (3 นาที)  คัดลอก url ที่เปลี่ยนค่าแล้ว ไปวางบน address bar แล้วรันมันอีกรอบ
  • ถ้าทุกอย่างเรียบร้อย มันจะแสดงการขอ สิทธิ์ของ integration app นี้ออกมา กด Accept ซะ
  • จากนั้นระบบจะ redirect ไปยังพาธที่เราได้ตั้งไว้ของ integration app พร้อมทั้งส่ง ค่า ?code=xxxx กลับมาให้เราไปใช้ขอ  access token ต่อ
  • ที่นี้ให้เราใช rest client สักตัว ใส่ ค่าประมาณนี้
  • method: POST
  • urlhttps://webexapis.com/v1/access_token
  • header: Content-Type: application/json
  • body
  • grant_type: authorization_code
  • client_id: จะแสดงอยู่ใน integration app เรา
  • client_secret: จะแสดงอยู่ใน integration app เรา (ครั้งแรกจะแสดง เปิดอีกครั้งจะไม่เห็นแล้ว ต้อง regen มันใหม่)
  • code: อันนี้ได้มาจาก  step ด้านบนนี้
  • redirect_uri: จะแสดงอยู่ใน integration app เรา
  • ทุกอย่างโอเคกดรันเลย จะได้ผลลัพท์ประมาณนี้
  • สิ่งที่เราจะเอาไปใช้ต่อจากผลลัพธ์ที่ได้มาคือ access_token  และ  refresh_token  บันทึก 2 ค่านี้ไว้ให้ดีนะคับ
  • access token นี้มีอายุประมาณ 14 วันนะคับ จาก อ้างอิงนะ
  • การนำไปใช้ทดสอบโดย เปิด  https://developer.webex.com/docs/platform-introduction
  • Documentation -> APIs -> full API Reference -> Meeting -> List Meetings
  • ให้เราปิดการใช้งาน Personal Token และใส่ค่า access token ของเราเข้าไปจากนั้นก็ Run สิคับ
  • ถ้าด้านล่างเค้าแสดงผลลัพธ์ประมาณนี้
  • แสดงว่า access token เรา สร้างสำเร็จและใช้งานได้
Add
  • กรณี  access token กำลังจะหมดอายุ ให้เราใช้ rest client ประมาณนี้
  • คล้ายกับ ตอน  get token ใหม่ เปลียน  grant_type ใช้เป็น  refresh_token
  • และสิ่งที่ต้องเพิ่มมาคือ refresh_token อันนี้มันจะมาพร้อมกับตอนเราได้ค่า  access token มาตอนแรกคับ
  • อีกเรื่องคือ timezone เลือกให้ถูกต้องนะคับ 37) Asia/Bangkok

Ref

  • https://developer.webex.com/blog/real-world-walkthrough-of-building-an-oauth-webex-integration
  • https://help.webex.com/en-us/article/ly79es/List-of-Time-Zones-for-Webex-Contact-Center

Wednesday, May 25, 2022

ปัญหาการแสดงจำนวน Row เยอะๆ ใน Datatable Jquery plugin

  • ใน apache error log ขึ้นประมาณนี้
  • หา bug อยู่ตั้งนาน นึกว่าเราไปเผลอ แก้ไขตรงใหนหา ไม่เจอ bug
  • ปัญหาเกี่ยวกับ paging ของ datatable plugin jquery
  • ถ้าเราตั้งค่าแสดง row เริ่มต้น ตั้งแต่ 500 - All แล้ว json ที่เราไป load data มาลงให้ databable ผ่าน ajax เค้า มัน post error 500 ซะงั้น
  • แต่ถ้าตั้ง row เริ่มต้น 10 - 100 อันนี้ json load data มาใส่ datatable ได้ปกติซะงั้น
  • ดูใน inspect -> console มันขึ้นแบบนี้ น่ะ งงเลยคับ
  • ไปใล่ดูใน apache log พบปัญหาประมาณนี้

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 33706237 bytes)

Solved 1 อันนี้แก้เป็นรายระบบไป

  • ระบบเราใช้ CI4 ให้เราไปเพิ่ม
  • ini_set('memory_limit', '512M'); หรือ ini_set('memory_limit', '-1');
  • ใน method ใจ controller สำหรับ json ของเรา วางไว้ประมาณบรรทัดแรก เลย

Solved 2 อันนี้แก้สำหรับรองรับทุกระบบ (แต่ server  ต้อง ram เยอะๆ หน่อย)

  • แก้ไข  php.ini ค้นหา memory_limit
  • กำหนดค่าลงไปว่าใช้ mem เท่าไหร่

  • -1 คือ unlimited  นะคับระวังไว้ด้วย สำหรับการใส่ค่าคอนฟิกแบบนี้
  • แก้ไขเสร็จแก้ restart apache สักรอบน่าจะใช้ได้แล้ว

เพิ่มเติม

  • ระบบปัจจุบันของผู้เขียนนั้น php.ini ตั้งค่าเริ่มต้น memory_limit = 128M ซึ่งมันไม่พอใช้ทำให้ระบบ error คับ ทดลองปรับไปใช้ 256M ก็ไม่ได้ 
  • ต้องไปใช้ 512M หรือ -1 ไปเลย ถึงจะผ่าน

Ref

  • https://stackoverflow.com/questions/561066/fatal-error-allowed-memory-size-of-134217728-bytes-exhausted-codeigniter-xml