Thursday, May 30, 2019

[Database - SQL] วิธีคำนวณระยะทางระหว่างพิกัด (Latitude, Longitude) 2 พิกัด
[Database - SQL] How to Calculate Distance between 2 Points of (Latitude, Longitude)

เนื่องจากผิวโลกมีความโค้ง จึงต้องใช้ haversine formula ในการคำนวณระยะทางที่สั้นที่สุดระหว่างพิกัดสองพิกัดบนผิวโลก

สมมติว่า ตาราง location ประกอบด้วยคอลัมน์ lat และ lon ที่เก็บค่า Latitude และ Longitude ตามลำดับของแต่ละพิกัด และพิกัดที่สนใจอยู่ที่ตำแหน่ง ([lat0], [lon0])

เราสามารถค้นหาพิกัดที่อยู่ใกล้เคียงกับพิกัดที่เราสนใจ ภายในรัศมี 1 กิโลเมตร โดยใช้ SQL ดังต่อไปนี้

SELECT *, 6373  * 2 * ATAN2(
    SQRT(
        POW(SIN((lat - [lat0]) * PI() / 180 / 2), 2) +
        COS(ABS([lat0]) * PI() / 180) *
        COS(ABS(lat) * PI() / 180) *
        POW(SIN((lon - [lon0]) * PI() / 180 / 2), 2)
    ),
    SQRT(1-(
        POW(SIN((lat - [lat0]) * PI() / 180 / 2), 2) +
        COS(ABS([lat0]) * PI() / 180) *
        COS(ABS(lat) * PI() / 180) *
        POW(SIN((lon - [lon0]) * PI() / 180 / 2), 2))
    )
) as dist
FROM `location`
HAVING  dist < 1 
ORDER BY dist

โดยที่
  •     6373 เป็นรัศมีของโลก มีหน่วยเป็นกิโลเมตร
  •     lat เป็นค่า Latitude ของ record ในตาราง location
  •     lon เป็นค่า Longitude ของ record ในตาราง location
  •     [lat0] เป็นค่า Latitude ของพิกัดที่เราสนใจ
  •     [lon0] เป็นค่า Longitude ของพิกัดที่เราสนใจ
  •     dist เป็นระยะทางระหว่างพิกัดที่เราสนใจกับพิกัดของ record ในตาราง location มีหน่วยเป็นกิโลเมตร

Monday, May 27, 2019

[Laravel - Exception] ข้อควรระวัง: โปรดระวังการใช้ Exception class ใน catch เมื่อใช้ try...catch
[Laravel - Exception] Warning: Using Wrong Exception Class in catch when Using try...catch

try...catch ถูกใช้ในการ handle exception

อย่างไรก็ตาม มีบางกรณีที่ทำให้ exception ไม่ถูก handle ในส่วนของ catch และถูก throw ออกไปโดยไม่มีการ handle ใดๆ

ผมจะใช้โค้ดตัวอย่างเพื่อแสดงว่า โค้ดส่วนใดที่คุณต้องระวังเป็นพิเศษ

โค้ดทั้งสองตัวอย่างเป็น Laravel commands ที่สามารถเรียกใช้งาน โดยรันคำสั่งใน console ดังนี้
php artisan test-exception

Friday, May 17, 2019

[Laravel - AWS] วิธีการตั้งค่า timeout สำหรับ InstanceProfileProvider ของ AWS PHP SDK
[Laravel - AWS] How to Set Timeout for InstanceProfileProvider of AWS PHP SDK

InstanceProfileProvider เป็น credential provider ที่ใช้ credentials จาก EC2 metadata server

สำหรับข้อมูลของ EC2 metadata server อ่านได้ที่ https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

ใน InstanceProfileProvider class ของ aws-php-sdk library เราจะพบ constructor ตามภาพด้านล่าง


เราจะพบตัวแปร $config['timeout'] แต่เราจะตั้งค่ามันยังไง!!!

Thursday, May 16, 2019

[ELK - Logstash] วิธีการ parse ข้อความ Log ที่มีหลายรูปแบบ โดยใช้ GROK
[ELK - Logstash] How to Parse Multiple Log Message by Using GROK

สำหรับการ parse ข้อความโดย GROK คุณต้องเพิ่ม grok filter ตามตัวอย่างด้านล่าง (อ้างอิงจาก https://www.elastic.co/guide/en/logstash/2.1/plugins-filters-grok.html#plugins-filters-grok-match)

สำหรับรายละเอียดของ GROK patterns อ่านได้ที่ https://github.com/elastic/logstash/blob/v1.4.0/patterns/grok-patterns

คุณสามารถทดสอบ pattern ที่คุณสร้างขึ้นกับข้อความจริง ได้ที่ https://grokdebug.herokuapp.com/

Tuesday, April 30, 2019

[Laravel - Laradock] การแก้ปัญหา "Fatal error loading the DB: Invalid argument" ของ Redis ใน Laradock
[Laravel - Laradock] How to Fix "Fatal error loading the DB: Invalid argument" of Redis in Laradock

เมื่อสั่ง docker-compose up -d redis ใน Laradock จะไม่สามารถ start ได้ และเมื่อดู log จะพบ error ดังรูปข้างล่าง
วิธีแก้ไข คือ ลบ folder redis ที่ path C:\Users\{user}\.laradock\data\redis แล้วสั่งรัน docker-compose up -d redis ใหม่อีกครั้ง ({user} แทนด้วย username ของ user ที่จะรันคำสั่ง)