Monday, December 11, 2023

How to install Nodejs 20.10.0 on Ubunut 22.04

  • ก่อนหน้านี้ติดตั้ง nodejs ใน ubuntu 22.04 ด้วยคำสั่ง
$ sudo apt update
$ sudo apt install nodejs
  • version node ที่ได้มาได้ 12 มา
  • แต่ในเว็บเป็น 20.10.0 แล้ว
Solved
  • ไปหน้า download ของ node https://nodejs.org/en/download
  • ได้ไฟล์ node-v20.10.0-linux-x64.tar.xz
  • ติดตั้งด้วยคำสั่ง
$ sudo tar --strip 1 -xJvf "node-v20.10.0-linux-x64.tar.xz" -C /usr/
  • ตั้งค่าพาธระบบให้เรียกใช้ node ได้
$ export PATH=/usr/bin:$PATH
  • ปิดและเปิด terminal แล้วเช็คเวอร์ชั่น
$ node -v
Ref
  • https://stackoverflow.com/questions/63312642/how-to-install-node-tar-xz-file-in-linux

Thursday, November 23, 2023

Argument list too long error for rm, cp, mv commands

  • ปัญหาคือ พยายามลบไฟล์ session ของ PHP Framework ตัวหนึ่ง ใน folder นั้นมีไฟล์ประมาณ ล้านกว่าไฟล์
  • เราจะจึงใช้คำสั่งปกติที่คุ้นเคยคือ rm /path/file*

$ rm myfile_session*

  •  แล้วได้ error ซะงั้น

 Argument list too long 

Solved

$ find [path_dir] -name "[myfile_session*]" -delete

  • กรณีเราอยู่ใน folder ที่จะลบไฟล์ ให้เราใช้คำสั่งประมาณนี้

$ find . -name "myfile_sessin*" -delete

  • กรณีเราตั้ง crontab ลบไฟล์ session ทุก 30 นาที

*/30 * * * * find /var/www/site/html/project/writable/session -name "file_session*" -delete

Ref

  • https://stackoverflow.com/questions/11289551/argument-list-too-long-error-for-rm-cp-mv-commands

Wednesday, November 22, 2023

Ubuntu 22.04 flush record when dns updated

 sudo resolvectl flush-caches

Bootstrap Modals padding-right เพิ่มเองตอน ปิด modal

  • อ้างอิง bootstrap5 
  • ปัญหาคือ เปิด modal แล้วปืด padding-right มันเพิ่มมา ทีละ 5  px

Solved

  • เพิ่ม  css ใน header file

body { padding-right: 0 !important }

Ref

  • https://stackoverflow.com/questions/32862394/bootstrap-modals-keep-adding-padding-right-to-body-after-closed

Friday, September 15, 2023

How to Delete Repository And GPG Key In Ubuntu 18.04

ปัญหา

  • ใช้ apt update ใน Ubuntu 18.04 แล้วมีบาง source error เรื่อง key


  • ดังภาพมี 2 รายการที่มีปัญหาคือ anydesk และ dl.google มันมีปัญหาเรื่อง public key ในการเข้าถึง repo

Solved

  • เข้าไปที่ /etc/apt/sources.list ไปจัดการ comment โดย # บรรที่ที่เกี่ยวกับ 2 รายการ error
  • หรือ ถ้าใน sources.list ไม่เจอ ให้ดูไฟล์ใน folder /etc/apt/sources.list.d มันจะมีไฟล์  แยกออกมา

  • ไปคอมเม้น โดยใส่เครื่องหมาย # ประมาณนี้

Ref

  • https://bobcares.com/blog/how-to-delete-repository-and-gpg-key-in-ubuntu/#:~:text=Deleting%20a%20repository%20in%20Ubuntu&text=First%2C%20open%20the%20%2Fetc%2F,look%20for%20the%20repository%20entry.&text=And%20simply%20remove%20the%20entry,save%20and%20close%20the%20file.
  • https://itslinuxfoss.com/delete-repository-and-gpg-key-ubuntu/

Thursday, September 14, 2023

Change default crontab editor Ubuntu 18.04++

Method 1 by command

$ select-editor

Method 2 by user environment variable by command

$ export EDITOR=/path/to/editor

Ex:

$ export EDITOR=/usr/bin/nano

  • ตั้งค่า editor ให้กับ user ในระบบบางคน โดยไปเพิ่ม คำสั่ง export ในไฟล์ ~/.bashrc หรือ ~/.bash_profile เหมือน คำสั่งอื่นๆ นั่นแหละ
  • จากนั้น ให้มีผลทันทีโดยที่ไม่ต้อง logout ออกจากระบบ เลย ด้วยคำสั่ง

$ source ~/.bashrc

Ref

  • https://www.makeuseof.com/change-default-crontab-editor-linux/#:~:text=Using%20the%20select%2Deditor%20Command&text=Run%20the%20select%2Deditor%20command,corresponding%20number%20and%20press%20Enter.
  • https://askubuntu.com/questions/55022/changing-default-crontab-editor

Wednesday, August 9, 2023

How to usage UFW delete some rule by number and insert deny rule first level Ubuntu 18.04

  • แสดง index ของ rule

$ sudo ufw status numbered

[1] ...

[2]...

[3]...

...

  • สั่งลบ rule ตาม index

$ sudo ufw delete 3

  • แทรก rule deny some port

$ sudo ufw insert 1 deny 8834

Related

  • https://juuier.blogspot.com/2013/03/how-to-for-ufw-script-configures.html

Thursday, July 20, 2023

Remove char on tail string on MySQL

  • ปัญหาคือ import ข้อมูล csv file เข้า mysql แล้ว บาง column มีค่าไม่พึงประสงค์ต่อท้าย
  • จะเอาออกยังไง 
  • ก่อนอัพเดทเราน่าจะ select ให้มันได้ก่อนประมาณนั้น 

Solved

  • ตัวอย่างจะ select แบบเอาค่าจาก column name โดยตัว char นี้ # ออกจาก column นั้น

SELECT 

id, name, trim(trailing '#' from name) 

FROM db1.tb1where name like '%#';

  • ดูผลลัพธ์แล้วใช้ได้ ก็อัพเดทสิคับรอไร

update db1.tb1 set name = trim(trailing '#' from name)

Ref

  • https://stackoverflow.com/questions/6080662/strip-last-two-characters-of-a-column-in-mysql

Monday, July 3, 2023

ทบทวนการใช้งาน Slim Framework 4 การสร้าง get, post และ สร้าง multi db connection

  • กรณี rest api เราใช้เป็น site/subfolder ให้เราเพิ่มพาธ subfolder เข้าไปใน index.php ของ slim framework ด้วยเช่น

/** set path for app subdirectory */

$app->setBasePath('/subapi');

  • สร้างไฟล์ method แยก myapi.php  ให้วางไว้ใน app/myapi.php
  • และใน index.php ของ root slim framework ให้เพิ่ม

// Register myapi

$myapis = require __DIR__ . '/app/myapis.php';

$myapis($app);

  • การสร้าง get method

....

$app->get('/md5/{par1}', function(Request $request, Response $response, $args){

        $par1 = $args['par1'];

        $response->getBody()->write(md5($par1));

        return $response;

});

....

  • การสร้าง post method

...

$app->post('/md5', function (Request $request, Response $response, $args) {

$data = $request->getParsedBody();

        $par1 = $data["par1"];

        $response->getBody()->write(md5($par1));

        return $response;

});

...

  • การส่งค่ากลับเป็น json

...

$app->post('/md5', function (Request $request, Response $response, $args) {

$data = $request->getParsedBody();

        $par1 = $data["par1"];

        $payload = json_encode(

              array(

                    "result"=>md5($par1)

                )

            );

$response->getBody()->write($payload);

$content_type = "application/json"; // 'text/html'

$status = 200; // 500

        return $response->withHeader('Content-Type', $content_type)->withStatus($status);

});

...

  • การสร้าง db connection หลายตัวใน api site เดียวกันนี้ ให้เราแก้ไข app/settings.php

  • และไฟล์ app/dependencies.php

  • การเรียกใช้ db connection ของเราใน myapi.php
$db1 = $this->get(PDO::class); 
$db2 = $this->get("db2");

$db3 = $this->get("db3"); 

  • ตัวอย่างการเรียกใช้ connection

$par1 = "value1";

$par2 = "value2";

$sql = "select * from mytb where col1=:par1 && col2=:par2;";

$stmt = $db1->prepare($sql);

$stmt->bindValue(":par1", "%{$par1}%");

$stmt->bindParam(":par2", $par2);

$stmt->execute();

$row_count = $stmt->rowCount();

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);


Tuesday, May 9, 2023

หัดทำ Reverse proxy to multi endpoint ด้วย Nginx บน Ubuntu 22.04

  • ทำคล้ายๆ กับ direct ip reverse เลย แต่เพิ่มนิดหน่อย
  • ในที่นี้ primary เป็น 192.168.1.1 ส่วน endpoint ที่จะให้ reverse ไปมี 192.168.1.2 และ 192.168.1.3:8080

Step

  • แก้ไข /etc/nginx/default
  • เพิ่ม section upstream ให้อยู่ในระดับเดียวกับ server {...}  และตั้งชื่อที่เราต้องการ (ในที่นี้ตั้งเป็น repositories) พร้อมกำหนดค่าการ IP ที่จะให้ forward ไป

upstream repositories {

#server domain_name.com:443;

server 192.168.1.2;

server 192.168.1.3:8080;

}

server {

    ...

}

  • จากนั้นใน location / section ให้เราตั้งค่าประมาณนี้
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
try_files $uri $uri/ /index.php?$args;
proxy_next_upstream error timeout http_404;
proxy_pass http://repositories;
include proxy_params;
}

  • จากนั้น restart nginx

$ sudo systemctl restart nginx

  • ทดสอบระบบโดยเข้าเว็บ http://192.168.1.1
  • หน้าเว็บจะแสดงข้อมูลเหมือนเราเข้าเว็บ http://192.168.1.2 และ http://192.168.1.3:8080 สลับกันไปมาแบบ round robin

เพิ่มเติม

  • ค่าเริ่มต้นในการ reverse น่าจะใช้แบบ round robin นะคือ กระจายไปแต่ละ endpoint เท่าๆ กัน

Related

  • http://juuier.blogspot.com/2023/05/reverse-proxy-direct-nginx-ubuntu-2204.html
Ref
  • https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
  • https://www.bogotobogo.com/DevOps/Docker/Docker-Compose-Nginx-Reverse-Proxy-Multiple-Containers.php

หัดทำ Reverse proxy direct ไปเครื่องเดียว ด้วย Nginx บน Ubuntu 22.04

  • โจทย์คือ ใช้  nginx ทำ reverse proxy ที่เครื่อง 192.168.1.1 
  • โดยถ้าเข้าเว็บ http://192.168.1.1 (nginx) ให้มันเบื้องหลังมันไปดึงข้อมูลที่ http://192.168.1.2 (apache)

Step

  • ทดสอบทำกับ /etc/nginx/default กันเหนียวไว้ก่อน

$ sudo cp /etc/nginx/default /etc/nginx/default_old

  • จากนั้นแก้คอนฟิก default site

$ sudo nano /etc/nginx/default

  • ที่ section location / (หรือ location /subfolder แบบ alias ก็ได้เช่นกัน)

location / {

# First attempt to serve request as file, then

# as directory, then fall back to displaying a 404.

# try_files $uri $uri/ =404;

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

}

  • แก้ไขเป็น

location / {

# First attempt to serve request as file, then

# as directory, then fall back to displaying a 404.

# try_files $uri $uri/ =404;

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

proxy_pass http://192.168.1.2;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

  • หรือใช้คอนฟิกใน proxy_params ที่มีอยู่แล้ว

location / {

# First attempt to serve request as file, then

# as directory, then fall back to displaying a 404.

# try_files $uri $uri/ =404;

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

proxy_pass http://192.168.1.2;

include proxy_params;

}

  • สุดท้าย restart nginx

$ sudo systemctl restart nginx

  • ทดสอบเข้าเว็บไซต์
  • http://192.168.1.1 คือที่แสดงผลจะเป็นค่าเหมือนเราเข้า http://192.168.1.2

เพิ่มเติม

  • เราสามารถ ทำ reverse proxy ด้วย alias ได้เช่นเดียวกัน
  • และ proxy_pass เราสามารถระบุพอร์ต อื่นๆ ได้ด้วยเช่น
  • proxy_pass http://192.168.1.2:8080

Ref

  • https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-as-a-reverse-proxy-on-ubuntu-22-04
  • https://www.baeldung.com/linux/nginx-multiple-proxy-endpoints
  • https://stackoverflow.com/questions/37820013/nginx-routing-to-several-restful-endpoints

Limit/Only allow certain IP addresses to access the website hosted on IIS Windows Server 2022 Standard

Step

  • ติดตั้ง add-on feature ก่อน โดยไปที่ Control Panel -> Programs and Features
  • ที่ left panel เลือก Turn Windows features on or off


  • ที่ Dashboard เลือก Add roles and feadtures แล้วก็ Next ไปเรื่อยๆ

  • Next ไปจนถึงหน้า Select server roles เข้าไปตามโครงสร้าง Tree
  • Web Server (IIS) -> Web Server -> Security
  • เลือกติดตั้ง IP and Domain Restrictions
  • และ Next ไปจนติดตั้งเรียบร้อย
  • จากนั้นไปที่ IIS Managerที่ left panel เลือก vhost ที่จะตั้งค่า allow deny ip
  • จะเห็นเมนู IP Address and Domain... (ในที่นี้เลือก Default)

  • panel ขวา เลือก Edit Feature Settings...
  • ที่ Access for unspecified clinets: เลือก Deny (คือเราจะตั้งค่าสูงสุดคือ ปิดการเชื่อมต่อจากทุก IP)
  • ที่นี้เราจะมา อนุญาต เฉพาะ IP หรือ  IP range
  • โดยเลือก Add Allow Entry...
  • จากนั้น ระบุ IP หรือ ช่วง IP ที่อนุญาตให้เข้าถึง vhost นี้ได้

  • รายการที่อนุญาตก็จะแสดงด้านล่าง

  • และสุดท้าย ก็ restart vhost แล้วลองทดสอบ

เพิ่มเติม

  • เราสามารถตั้งค่า deny aceess เป็น status code อื่นๆ ได้นอกจาก 403

Related

  • http://juuier.blogspot.com/2023/04/limitonly-allow-certain-ip-addresses-to.html

Tuesday, April 11, 2023

Limit/Only allow certain IP addresses to access the website hosted on Apache on Ubuntu

  • ประเด็นมีอยู่ว่าจะจำกัดการใช้งานเฉพาะ network ภายใน แต่วาง site บน public

Solved

  • วิธีแรกแก้ไขสำหรับจำกัดทั้ง vhost ให้แก้ไฟล์ vhost นั้น ภายใน virtualhost tag ได้เลย 

## /etc/apache2/site-available/vhost.conf

<IfModule mod_ssl.c>

<VirtualHost *:443>

.....

<Location />

Require all denied

Require ip 192.168.1.3

Require ip x.x.x.0/8

Require ip y.y.0.0/16

Require ip z.0.0.0/24

</Location>

</VirtualHost>

</IfModule>

  • หรืออีกวิธี เพิ่ม .htaccess เอาวางไว้ที่ root ของ Vhost นั้นๆ อันนี้จะเหมือนวิธีแรก จำกัดทั้ง site(อันนี้ยังไม่ค่อยเข้าใจเท่าไหร่ ถ้าเข้าไป subfolder เข้าได้ซะงั้น)   

Order Deny,Allow

Deny from all

          Allow from 192.168.1.3

Allow from 192.168.1.0/8

Allow from 172.16.0.0/16

Allow from 10.0.0.0/24

  • หรือ จำกัดบาง subfolder ที่เราตั้งค่าเป็น alias

Alias /site1 "/var/www/html/site1/"

<Directory "/var/www/html/site1">

#ErrorDocument 404 /site1/

Options -Indexes

# Allow from all

# Allow from 127.0.0.0/255.0.0.0 ::1/128

Deny from all

                  Allow from x.x.x.x

Allow from x.x.x.0/8

Allow from y.y.0.0/16

Allow from z.0.0.0/24

</Directory>

Ref

  • https://dannyda.com/2021/12/08/how-to-limit-only-allow-certain-ip-addresses-to-access-the-website-hosted-on-apache-or-access-to-reverse-proxy-on-linux-debian-ubuntu-kali-linux/
  • https://electrictoolbox.com/apache-allow-deny-ip-address/
  • https://serverfault.com/questions/776252/allow-access-to-apache-server-from-only-one-ip-address

Wednesday, March 8, 2023

Crontab Linux not running at specific time

ประเด็นมีอยู่ว่า

  • กำหนดค่าใน crontab ให้รัน file.sh เมื่อเวลา 1.30 น. แตทำไมมันไปทำงานตอน 8.30 น. ซะงั้น
  • เช็ค time zone ของระบบด้วยคำสั่งด้านล่าง ก็ได้เป็น Asia/Bangkok +07 แล้วนะ

$ cat /etc/timezone 

  • หรือ select now() ใน mysql ของระบบก็แสดงเวลาที่ถูกต้อง ตามเวลาประเทศไทยเรานะ
  • ลองเพิ่มงานใน crontab ให้ทำงาน 10.30 น. แต่มันก็ไม่ทำงานในเวลานี้เหมือนเดิม

Solved

  • รีสตาร์ท service cron ลองดู

$ sudo service cron restart

  • ลองสร้าง job ใน crontab เป็นเวลา 10.40 ที่นี้แหละ มันก็ทำงานตรงเวลาแล้วคับ
  • สรุป รีสตาร์ท service เค้า ก็ใช้งานได้แล้ว

เพิ่มเติม

  • เปิดเก็บ log crontab โดยแก้ไขไฟล์ /etc/rsyslog.conf

$ sudo vi /etc/rsyslog.d/50-default.conf

  • เปิด comment -> cron.* /var/log/cron.log

  • restart rsyslog ด้วยคำสั่ง
$ sudo service rsyslog restart

Ref

  • https://stackoverflow.com/questions/34626135/crontab-linux-not-running-at-specific-time
  • https://www.serverlab.ca/tutorials/linux/administration-linux/how-to-check-and-set-timezone-in-ubuntu-20-04/

Thursday, January 26, 2023

Set hotspot iphone 7 sim My

  • ประเด็นมีอยู่ว่า option สำหรับ share hotspot ของ  iphone ไม่มีซะงั้น ทำไมน้อ
  • ปัญหาเกิดจาก sim my นี่เอง

Solved

  • เลือก SIM แล้วเข้าไปจัดการ APN ตั้งชื่อเป็น internet บันทึก
  • แล้วย้อนกลับไปหน้าแรก ไป setting เมนุ share hotspot ก็จะปรากฏขึ้นให้เราใช้งานได้เลย

Ref

https://pantip.com/topic/32713879

Reduce file size of PDF in Ubuntu 22.04 by GS

  • คือต้องการลดขนาดไฟล์ pdf ขึ้นเว็บแต่มันใหญ่ไป
  • หาเครื่องมือใน Ubuntu เค้าแนะนำ Ghostscript
  • ซึ่งมันติดตั้งมาให้เรียบร้อยแล้วใน Ubuntu 22.04
Solved
  • อันแรกความละเอียดไม่ลดมาก
  • Low compression: 300 dpi (large file size)
$ gs -sDEVICE=pdfwrite -dPDFSETTINGS=/printer -dNOPAUSE -dBATCH \
-sOutputFile=
output.pdf input.pdf
  • อันที่สองน่าใช้ที่สุด
  • [BEST in my testing] Medium compression (recommended): 150 dpi (medium file size)
$ gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook   -dNOPAUSE -dBATCH \
-sOutputFile=output.pdf input.pdf
  • อันสุดท้ายบีบไฟล์แล้วอ่านไม่ค่อยออก
  • High compression: 72 dpi (small file size--may produce grainy or unreadable results in some cases, so try it and give it a shot)
$ gs -sDEVICE=pdfwrite -dPDFSETTINGS=/screen  -dNOPAUSE -dBATCH \
-sOutputFile=output.pdf input.pdf
Ref
  • https://askubuntu.com/questions/113544/how-can-i-reduce-the-file-size-of-a-scanned-pdf-file

Monday, January 2, 2023

Set path or set alias command for Mac OS

  • ประเด็นคือ จะ set path สำหรับ mac ยังไง
  • ใน ubuntu มันจะตั้งค่าที่ ~/.bashrc หรือ ~/.bash_profile แต่ใน Mac OS ทำไงล่ะ
  • มันก็สายพันธ์ เดียวกันนะ คงทำคล้ายๆ กัน

Solved
  • เปิด terminal ขึ้นมาสร้างไฟล์ชื่อ ~/.zshrc
$ nano ~/.zshrc
  • ตั้งค่าพาธ หรือ set alias ตามต้องการ
alias ll='ls -l'
alias la='ls -a'
export PATH="$PATH:/Users/youruser/flutter/bin"
  • จากนั้นบันทึก ปิด และ เปิด terminal ใหม่อีกครั้ง
Ref
  • https://wpbeaches.com/make-an-alias-in-bash-or-zsh-shell-in-macos-with-terminal/

Popular Posts