Menu

Monday, April 27, 2020

[Bash Script] ระวังการสร้าง ฺBash Script บน Windows แล้วอาจจะไม่สามารถนำมารันบน Unix ได้
[Bash Script] Warning: Create Bash Script on Windows then Cannot Run on Unix

ในกรณีนี้เราเขียน Bash script ขึ้นมาบน Windows แล้วค่อยอัพโหลดขึ้นไปรันบนเซิร์ฟเวอร์ที่เป็น Ubuntu ผลการรันได้ข้อผิดพลาดตามด้านล่างนี้
/bin/bash^M: bad interpreter: No such file or directory
สาเหตุเกิดจากอักขระที่แทนการขึ้นบรรทัดใหม่บน Windows และ Unix นั้นต่างกันดังนี้
  • Windows จะเป็น \r\n
  • Unix จะเป็น \n
ทำให้ \r เป็นอักขระที่ไม่เกี่ยวข้องกับการขึ้นบรรทัดใหม่ จึงถูกมองว่าเป็นอักขระอีกตัวที่ตามหลัง /bin/bash จึงเกิดข้อผิดพลาดข้างต้น

วิธีแก้ไข คือ รันคำสั่งดังนี้
sed -i -e 's/\r$//' scriptname.sh
หรือเขียน bash script ใหม่บน Unix แทน

Wednesday, April 22, 2020

[Bash Script] วิธีการพิมพ์ข้อความที่มีการขึ้นบรรทัดใหม่หรือ Backslash Escape บน Bash
[Bash Script] How to Print New Line or Backslash Escape on Bash

เวลาเราจะพิมพ์ข้อความออกทาง standard output เราจะใช้คำสั่ง echo ดังนี้
echo "your_message"
นอกจากนั้น เรายังนำคำสั่งข้างต้นมาประยุกต์ใช้ เพื่อพิมพ์ข้อความลงไปในไฟล์ดังนี้
echo "your_message" >> [filename]
หากเราต้องการพิมพ์ข้อความที่มีการขึ้นบรรทัดใหม่หรือมี Backslash Escape แทรกอยู่ลงไปในไฟล์ ให้เราเลือกใช้คำสั่งใดคำสั่งหนึ่งต่อไปนี้
  • ใช้คำสั่ง printf แทน echo
    printf "your_message1\nyour_message2"
    
  • ใช้คำสั่ง echo ตามด้วย option -e เพื่ออนุญาตให้แปลง backslash escape
    echo -e "your_message1\nyour_message2"
    
  • ใช้คำสั่ง echo ตามด้วย $'your_message' เพื่อบอกว่า your_message เป็น ANSI-C Quoting
    echo $'your_message1\nyour_message2'
    

Monday, April 20, 2020

[Ubuntu] สรุปคำสั่งสำหรับบีบอัดและแตกไฟล์ผ่านทาง Command Line
[Ubuntu] The Commands to Zip and Unzip File and Folder via Command line

การบีบอัดไฟล์ผ่านทาง Command Line

ในกรณีที่ยังไม่เคยติดตั้ง zip ให้รันคำสั่งดังนี้
apt-get install zip
การบีบอัดแฟ้มข้อมูล ใช้คำสั่งดังนี้
zip -r [zip_name].zip [folder_name]
การบีบอัดไฟล์ ใช้คำสั่งดังนี้
zip [zip_name].zip [file_name]

การแตกไฟล์ผ่านทาง Command Line

ในกรณีที่ยังไม่เคยติดตั้ง unzip ให้รันคำสั่งดังนี้
apt-get install unzip
การแตกไฟล์ที่ถูกบีบอัด ใช้คำสั่งดังนี้
unzip [zip_name].zip

[PHP - Laravel] วิธีการตรวจสอบว่า Private key ที่ผู้ใช้งานใส่เข้ามาตรงกับ Public key ที่ตั้งค่าไว้หรือไม่
[PHP - Laravel] How to Verify Private Key with Existing Public Key

สืบเนื่องจากโพสต์ [Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model โดยใช้ SSH Keys ที่ใช้ SSH keys ในการเข้ารหัสข้อมูล โดยที่เราตั้งค่า public key ไว้ในไฟล์ .env แต่เราให้ผู้ใช้งานเป็นผู้กรอก private key เอง แล้วเราจะรู้ได้อย่างไรว่า private key ที่ถูกกรอกเข้ามานั้น เป็นคู่ของ public key ที่เราตั้งค่าไว้จริงๆ

เรามีวิธีตรวจสอบ 2 วิธีดังนี้
  • การตรวจสอบด้วยการ sign และ verify signature
  • การตรวจสอบด้วยการ encrypt และ decrypt ข้อความ

การตรวจสอบด้วยการ sign และ verify signature

ขั้นตอนการตรวจสอบเป็นดังนี้
  1. เลือกข้อความมา 1 ข้อความ ข้อความอะไรก็ได้
  2. sign ข้อความนั้นด้วย private key ที่ผู้ใช้กรอกเข้ามา เพื่อสร้าง signature
  3. verify ข้อความนั้นกับ signature ที่เพิ่ง sign ด้วย public key ในระบบ
  4. ถ้า verify ไม่ผ่านจะเกิด exception ดังนี้

Wednesday, April 15, 2020

[MySQL] ระวังการใช้ mysqldump ในการ backup ฐานข้อมูลขนาดใหญ่ จะเกิดข้อผิดพลาด "Packet Too Large"
[MySQL] Warning: Using mysqldump to Backup Large Database May Cause "Packet Too Large" Error

หลังจากที่รัน mysqldump เพื่อ backup ฐานข้อมูลของโปรเจคนึง ก็เกิดข้อผิดพลาดดังนี้
mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `failed_jobs` at row: 79
ข้อผิดพลาดข้างต้นเป็นข้อผิดพลาด Packet Too Large ที่มีระบุอยู่ใน MySQL Reference Manual ซึ่งสามารถเข้าไปอ่านเพิ่มเติมได้ที่ https://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html

วิธีแก้ไขข้อผิดพลาดดังกล่าวมี 2 วิธีดังนี้
  1. เพิ่ม --max_allowed_packet=512M ตอนสั่งรัน mysqldump
  2. เพิ่ม max_allowed_packet=512M ไปในส่วนของ [mysqldump] ในไฟล์ my.cnf
หมายเหตุ 512M เป็นเพียงขนาดตัวอย่างเท่านั้น ขนาดใหญ่สุดที่เป็นไปได้ คือ 1024M

[GIT] การตั้งค่า Deploy Key ใน Gitlab
[GIT] How to Set Up Deploy Key in Gitlab

การตั้งค่า deploy key เป็นการตั้งค่า SSH key เฉพาะโปรเจคและใช้เป็น key สำหรับการ deploy เท่านั้น โดยปกติแล้ว key นี้จะอนุญาตให้ clone หรือ pull code จาก repository เท่านั้น ไม่อนุญาตให้ทำการ push code ที่แก้ไขขึ้นมายัง repository

สมมติว่า เราสร้าง SSH key ในเครื่อง server ของเราเรียบร้อยแล้ว (ข้อมูลเพิ่มเติม: การสร้าง SSH Key ใหม่)
  1. Login เข้า Gitlab
  2. เข้าไปที่โปรเจคของเรา
  3. เลือกเมนู Settings
  4. เลือกเมนู CI/CD
  5. เลื่อนลงไปยังส่วนของ Deploy Keys แล้วกดปุ่ม Expand
  6. กรอกข้อมูล Title เพื่อระบุว่า key นี้เป็นของเครื่องใด
  7. คัดลอกข้อมูลภายใน Public key ของ SSH แล้ววางลงในช่อง Key
  8. ไม่ต้องเลือกช่อง Write access allowed
  9. กดปุ่ม Add key
เพียงเท่านี้ เราก็สามารถใช้ Clone with SSH และ pull code จาก Gitlab ด้วย SSH key ของ server เราได้แล้ว โดยไม่จำเป็นต้องใส่ username และ password

Friday, April 10, 2020

[Laravel] การบันทึกไฟล์ JSON ใน Laravel Tinker
[Laravel] How to Save JSON File in Laravel Tinker

Tinker ช่วยให้เราสามารถตอบโต้กับ Laravel application ของเราทั้งหมดผ่านทาง command line ได้

เราสามารถเข้าใช้ Tinker ได้ โดยรันคำสั่งดังนี้
php artisan tinker
ส่วนใหญ่เราจะใช้ Tinker ช่วยในการตรวจสอบความถูกต้องของข้อมูลในฐานข้อมูล โดยเราจะใช้ Eloquent ในการ query ข้อมูลขึ้นมา และในบางครั้งเราต้องการส่งออกผลการ query ออกเป็นไฟล์ เพื่อนำไปตรวจสอบเพิ่มเติม

สมมติว่า เรา query ข้อมูลใน Tinker แล้วเก็บใส่ตัวแปรดังนี้
$users = User::all();
และเรามีการตั้งค่า disks ในไฟล์ config/filesystems.php ดังนี้
...
    'disks' => [
        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],
...
การส่งออกผลการ query ข้างต้นออกเป็นไฟล์ JSON เราจะรันคำสั่งใน Tinker ดังนี้
Storage::disk('local')->put('users.json', json_encode((array) $users, JSON_PRETTY_PRINT));
ไฟล์ผลการ query ที่ถูกสร้างอยู่ที่ path storage/app/users.json

Wednesday, April 8, 2020

[Database - MySQL] วิธีการแก้ปัญหา Syntax Error เมื่อทำการสร้าง Procedure
[Database - MySQL] How to Fix Syntax Error when Creating a Procedure

สมมติว่า เราต้องการสร้าง procedure ด้วย SQL statement ข้างล่างนี้
CREATE PROCEDURE `my_procedure` (IN `_year` INT, IN `_month` INT)
    NO SQL
BEGIN
    SELECT * FROM my_table WHERE year = `_year`and month = `_month`;
END;
อย่างไรก็ตาม statement นี้ไม่สามารถรันได้ทุกฐานข้อมูล

บางฐานข้อมูลจะแสดงข้อผิดพลาดตามรูปข้างล่างนี้


[Laravel] ขั้นตอนการตั้งค่า XAMPP สำหรับรันโปรเจค Laravel
[Laravel] How to Set XAMPP to Run Laravel Project

สมมติว่า 
  • เรามี folder ชื่อ laravel ที่เป็น folder ของ project ที่เป็น Laravel
  • เราติดตั้ง XAMPP ไว้ที่ C:\xampp
  • เราต้องการเรียกหน้าเว็บของเราผ่าน domain ชื่อ laravel.dev
เราจะมีขั้นตอนดังต่อไปนี้

[Database - MySQL] การ Backup และ Restore ฐานข้อมูล MySQL ผ่านทาง Command Line
[Database - MySQL] How to Backup and Restore MySQL Databases via Command Line

การ Backup ฐานข้อมูล MySQL

การ backup ฐานข้อมูล เราจะใช้คำสั่ง mysqldump ซึ่งเป็นโปรแกรมที่ถูกลงมาพร้อมกับ MySQL software โดยเราจะใช้คำสั่งดังนี้
mysqldump -u [username] -p [database_name] > [filename].sql
โดย option ที่ใส่ได้มีดังนี้
  • -u [username] ใช้ระบุชื่อผู้ใช้งานที่ใช้ login เข้าฐานข้อมูล
  • -p[password] ใช้ระบุรหัสผ่านที่ใช้ login เข้าฐานข้อมูล
    (ถ้าไม่ระบุ [password] ระบบจะถามรหัสเมื่อสั่งรัน)
  • -h [host] ใช้ระบุ host ของฐานข้อมูล (ถ้าไม่ระบุ ค่าจะเป็นเครื่องที่รันคำสั่ง)
  • -P [port] ใช้ระบุ port ของฐานข้อมูล (ถ้าไม่ระบุ ค่าจะเป็น 3306)

การ Restore ฐานข้อมูล MySQL

การ restore ฐานข้อมูล เราจะใช้คำสั่ง mysql ร่วมกับไฟล์ SQL ที่ได้จากคำสั่ง backup ข้างต้น โดยเราจะใช้คำสั่งดังนี้
mysql -u [username] -p --default-character-set=[charset] [database_name] < [filename].sql
โดย option ที่ใส่ได้มีดังนี้
  • -u [username] ใช้ระบุชื่อผู้ใช้งานที่ใช้ login เข้าฐานข้อมูล
  • -p[password] ใช้ระบุรหัสผ่านที่ใช้ login เข้าฐานข้อมูล
    (ถ้าไม่ระบุ [password] ระบบจะถามรหัสเมื่อสั่งรัน)
  • ---default-character-set=[charset] ใช้ระบุ character set ของข้อมูลที่จะนำเข้าฐานข้อมูล

Thursday, April 2, 2020

[Blogger] วิธีการตั้งค่า Default Facebook Thumbnail สำหรับ Blogger
[Blogger] How to Set Default Facebook Thumbnail for Blogger

Default Facebook Thumbnail จะถูกใช้เมื่อเราแชร์โพสต์ของเราไปยัง Facebook แล้วโพสต์นั้นไม่มีรูปภาพประกอบ Facebook จะดึงข้อมูลภาพที่เราตั้งค่านี้มาแสดงในลิ้งค์แทน

วิธีการตั้งค่าภาพ Thumbnail ตั้งต้นเป็นดังนี้
  1. เข้าไปที่ Theme 
  2. เลือกเมนู Edit HTML 
  3. Copy script ด้านล่างไปใส่ไว้ในส่วนของ head ของ theme
    <b:if cond='data:blog.postImageUrl'>
    <meta expr:content='&quot;&quot; + data:blog.postImageUrl' property='og:image'/>
    <b:else/>
    <meta content= 'image_url' property='og:image'/>
    </b:if>
    
  4. แทนที่ image_url ใน script ข้างต้นด้วย URL ของรูปที่ต้องการ
  5. รอเวลาให้ Facebook อัพเดตข้อมูล ซึ่งใช้เวลาประมาณ 24 ชั่วโมง
หมายเหตุ สำหรับคนที่ไม่ต้องการรอ Facebook อัพเดตตามเวลา สามารถเข้าไปอ่านข้อมูลเพิ่มเติมได้ที่ [Facebook] วิธีการอัพเดตรูปภาพและรายละเอียดของ Link บน Facebook แบบ Manual

[Facebook] วิธีการอัพเดตรูปภาพและรายละเอียดของ Link บน Facebook แบบ Manual
[Facebook] How to Manually Updates The Thumbnail and Descriptions of Links on Facebook

เนื่องจาก Facebook จะอัพเดต thumbnail และรายละเอียดของ links ทุกๆ 24 ชั่วโมง ดังนั้นเมื่อเราแก้ข้อมูลภายใน links เราจำเป็นจะต้องรอการอัพเดต 24 ชั่วโมง

อย่างไรก็ตาม เราสามารถกดให้ Facebook อัพเดต links ของเราได้ด้วยตัวเราเอง เพื่อที่จะได้ไม่ต้องรอให้ครบ 24 ชั่วโมง ซึ่งมีวิธีการดังต่อไปนี้
  1. ไปที่ https://developers.facebook.com/tools/debug/

Wednesday, April 1, 2020

[Ubuntu] วิธีการตั้งค่า IP Address สำหรับ Host Name ที่ต้องการบน Ubuntu
[Ubuntu] How to Set IP Address for Specific Host Name on Ubuntu

ไฟล์ hosts เป็นไฟล์ที่ใช้สำหรับการระบุ IP address ของ host name ที่ต้องการ ซึ่งระบบปฏิบัติการจะเข้ามาหา IP address ของ host name ในนี้ก่อน ถ้าไม่พบจึงยิงไปขอข้อมูลจาก DNS server ต่อไป

สำหรับ Ubuntu ไฟล์ hosts ข้างต้นจะอยู่ที่ /etc/hosts

[Windows] วิธีการตั้งค่า IP Address สำหรับ Host Name ที่ต้องการบน Windows
[Windows] How to Set IP Address for Specific Host Name on Windows

ไฟล์ hosts เป็นไฟล์ที่ใช้สำหรับการระบุ IP address ของ host name ที่ต้องการ ซึ่งระบบปฏิบัติการจะเข้ามาหา IP address ของ host name ในนี้ก่อน ถ้าไม่พบจึงยิงไปขอข้อมูลจาก DNS server ต่อไป

สำหรับ Windows ไฟล์ hosts ข้างต้นจะอยู่ที่ C:\Windows\System32\drivers\etc\hosts

[PHP - Laravel] Closure คืออะไร
[PHP - Laravel] What is Closure?

Closure เป็น anonymous function ที่นิยมใช้เป็น callback method อีกทั้งยังสามารถใช้เป็น parameter ของ function ได้อีกด้วย

ตัวอย่างการใช้งาน

สมมติว่า เรามี function ชื่อ handle โดยที่ function นี้รับ parameter เป็น Closure ดังต่อไปนี้
function handle(Closure $closure) {
    $closure();
}
เวลาเราเรียกใช้งาน handle เราสามารถใส่ function ของเราเข้าไปเป็น parameter แบบนี้ได้เลย
handle(function(){
    echo __METHOD__;
});
นอกจากนั้น เราสามารถประกาศ function ของเราเก็บไว้ในตัวแปรก่อน แล้วค่อยส่งตัวแปรนั้นเป็น parameter แบบนี้ก็ได้
$myFunction = function(){
    echo __METHOD__;
});
handle($myFunction);

[Bash Script] วิธีการใช้วันที่และเวลาสำหรับชื่อไฟล์ในไฟล์ Bash
[Bash Script] How to Use Date and Time for Filename in Bash File

สำหรับค่าของวันที่และเวลาจะอยู่ในตัวแปรชื่อ date ซึ่งเราสามารถเรียกใช้ตามตัวอย่างดังนี้
echo `date`  # Wed Apr 1 06:22:11 UTC 2020
ในการจัดรูปแบบของวันที่และเวลา เราจะใช้คำสั่งในดังต่อไปนี้
echo `date +<format-option><format-option>...`
ยกตัวอย่างเช่น
echo `date +%Y%m%d`  # 20200401
กรณีที่เราต้องการตั้งชื่อไฟล์ โดยมีวันที่และเวลาในรูปแบบ yyyymmdd_hhmmss อยู่ในชื่อไฟล์ด้วย เราสามารถใช้คำสั่งดังนี้
filename=test_`date +%Y%m%d_%H%M%S`.zip
echo $filename
หมายเหตุ format-option สามารถอ่านเพิ่มเติมได้ที่ Bash Date – Format Options and Examples