ปัญหานึงของการเขียนโปรแกรมด้วยภาษา 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 อีกด้วย
Menu
Thursday, March 19, 2020
[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 เป็นดังนี้
หมายเหตุ โดยปกติแล้ว จะใช้
ส่วนข้อความหลังเครื่องหมาย #! คือ 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 ลงมายังเครื่อง ดังรูปข้างล่างนี้
หลังจากที่เราเอา 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
Subscribe to:
Posts (Atom)