Menu

Thursday, March 19, 2020

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

ปัญหานึงของการเขียนโปรแกรมด้วยภาษา PHP คือ class 1 class สามารถ inherit จาก class อื่นได้เพียง class เดียวเท่านั้น (single inheritance) ทำให้ไม่สามารถ inherit method ที่ต้องการใช้จาก class อื่นๆ เพื่อลดความซ้ำซ้อนของโค้ดได้

Traits เป็นกลไกสำหรับการใช้ code ซ้ำในภาษาที่เป็น single inheritance เช่น PHP

Traits มีความคล้ายคลึงกับ class ต่างกันที่ Traits เป็นเพียงกลุ่มของ method เท่านั้น จึงไม่สามารถเรียกใช้งานแบบ instance ได้ นอกจากนั้น มันยังมีความสามารถเพิ่มเติม คือ การเรียกใช้ class member ของ class ที่เรียกใช้มันได้ โดยไม่ต้อง inherit อีกด้วย

[Bash Script] รู้หรือไม่ว่า ส่วนหัวของ Bash Script ที่เป็นเครื่องหมาย #! มีไว้ใช้ทำอะไร
[Bash Script] What does the Head of a Script (#! Line) do?

เครื่องหมาย #! (she-bang) ในส่วนของหัว script ใช้เพื่อระบุว่า กลุ่มของคำสั่งในไฟล์นี้ต้องใช้  command interpreter ตัวใด

ส่วนข้อความหลังเครื่องหมาย #! คือ path ของโปรแกรมที่ใช้ประมวลผลคำสั่งใน script ซึ่งอาจะเป็น shell, programming language หรือโปรแกรมอื่นๆ

command interpreter นี้จะเริ่มประมวลผลคำสั่งใน script เริ่มต้นจากบรรทัดใต้เครื่องหมาย #! เป็นต้นไปและข้ามบรรทัดที่เป็น comment

ตัวอย่างของบรรทัดที่เป็น she-bang เป็นดังนี้

#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/bin/awk -f

หมายเหตุ โดยปกติแล้ว จะใช้ #!/bin/sh และ #!/bin/bash เป็นหลัก

Tuesday, March 10, 2020

[Docker - MySQL] การใช้ Docker Image MySQL โดยไม่ระบุเลขเวอร์ชั่นของ Patch ใน Tag อาจทำให้ได้ Docker Image เวอร์ชั่นที่เราไม่ได้คาดการณ์ไว้
[Docker - MySQL] Using Docker Image MySQL without Patch Version Number in Tag May Cause Using Unpredictable Docker Image Version

หลังจากที่ใช้ Docker Image สำหรับ MySQL 5.7 มาหลายโปรเจค 

วันนึงมีโปรเจคที่ต้องรัน SQL เพื่อ insert ข้อมูลภาษาไทยลงฐานข้อมูล ปรากฏว่า SQL ดังกล่าวสามารถรันบน environment ที่เป็น  UAT ได้ แต่ไม่สามารถรันบน Production ได้ ทั้งที่โค้ดและเลข Tag ของ Docker Image ก็เป็นเวอร์ชั่นเดียวกัน

หลังจากหาสาเหตุอยู่นาน พบว่า ถึงแม้จะใช้เลข Docker Tag เดียวกัน คือ 5.7 แต่เวอร์ชั่นของ MySQL ภายในแต่ละ Docker Image แตกต่างกัน ดังรูปข้างล่าง

Image mysql:5.7 ที่ถูกสร้างวันที่ 12/12/2017 จะใช้ MySQL version 5.7.20

[Security] วิธีการแก้ไขข้อผิดพลาด "Couldn't load this key (OpenSSH-SSH-2 private key (old PEM format))" ใน TortoiseGit สำหรับ Windows
[Security] How to Fix Error "Couldn't load this key (OpenSSH-SSH-2 private key (old PEM format))" in TortoiseGit for Windows

เมื่อสร้าง SSH2 RSA key ด้วย ssh-keygen เราจะได้ไฟล์ id_rsa และ id_rsa.pub

หลังจากที่เราเอา id_rsa.pub ไปตั้งค่าบน Git Repository แล้ว เราต้องใช้ไฟล์ id_rsa ใน TortoiseGit สำหรับ Windows เพื่อ clone code จาก Git Repository ลงมายังเครื่อง ดังรูปข้างล่างนี้

[Docker - MySQL] วิธีการหลีกเลี่ยงกรณีที่ไม่สามารถรัน mysql:5.7 container ได้ เนื่องจากมีข้อผิดพลาด "Operating system error number 22 in a file operation"
[Docker - MySQL] Workaround for mysql:5.7 Container Cannot Start Due to "Operating system error number 22 in a file operation"

เนื่องจากมีหลายโปรเจคที่ใช้ฐานข้อมูลเป็น MySQL ผมจึงรัน MySQL Docker ผ่านทาง Docker Compose (บน Docker Toolbox ของ Windows) เพื่อใช้เป็นฐานข้อมูล ซึ่งจะมีการตั้งค่าในส่วน mysql service ใน docker-compose.yml ตามด้านล่างนี้
mysql:
    container_name: mysqlserver
    image: mysql:5.7
    ports:
        - 3306:3306
    volumes:
        - ./mysql:/var/lib/mysql
อย่างไรก็ตาม ปัญหานึงที่ผมเจอ คือ Container ของ MySQL จะหยุดการทำงาน เมื่อรันไปสักพัก เมื่อตรวจสอบ Log ของ Container จะเจอ error ดังนี้
2020-03-06T08:39:40.454013Z 0 [ERROR] InnoDB: Operating system error number 22 in a file operation.
2020-03-06T08:39:40.454196Z 0 [ERROR] InnoDB: Error number 22 means 'Invalid argument'
2020-03-06T08:39:40.454258Z 0 [ERROR] InnoDB: File ./ib_logfile101: 'aio write' returned OS error 122. Cannot continue operation
2020-03-06T08:39:40.454584Z 0 [ERROR] InnoDB: Cannot continue operation.
จากการตรวจสอบเบื้องต้นยังไม่สามารถหาวิธีแก้ไขได้ แต่มีวิธีการหลีกเลี่ยง error ข้างต้นไม่ให้เกิดขึ้น  โดยแก้ไขการตั้งค่าในส่วน mysql service ใน docker-compose.yml ดังนี้
mysql:
    container_name: mysqlserver
    image: mysql:5.7
    ports:
        - 3306:3306
    # volumes:
    #     - ./mysql:/var/lib/mysql