Menu

Friday, August 30, 2019

[Blogger] การทำ code snippet สำหรับ Blogger ที่เป็น HTTPS
[Blogger] How to Make Code Snippet for Blogger (HTTPS version)

  1. เข้าไปที่ Theme 
  2. กดปุ่ม Edit HTML ภายใต้ Live on Blog
  3. Copy script ด้านล่างไปใส่ไว้ในส่วนของ head ของ theme
  4. <link href='https://agorbatchev.typepad.com/pub/sh/3_0_83/styles/shCore.css' rel='stylesheet' type='text/css'/>
    <link href='https://agorbatchev.typepad.com/pub/sh/3_0_83/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
     
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shCore.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushBash.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushCpp.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushCSharp.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushCss.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushJava.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushJScript.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushPlain.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushPhp.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushPython.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushRuby.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushSql.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushVb.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushXml.js' type='text/javascript'/>
    <script src='https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushPerl.js' type='text/javascript'/>
    <script language='javascript'>
        SyntaxHighlighter.config.bloggerMode = true;
        SyntaxHighlighter.config.clipboardSwf = &#39;https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/clipboard.swf&#39;;
        SyntaxHighlighter.all();
    </script>
    
  5. กดปุ่ม Save theme
  6. ใส่ code ตามด้านล่างในส่วนของ HTML ของ Post
  7. <pre class="brush: html">
        <link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
        <link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
    </pre>
    
หมายเหตุ: เราไม่จำเป็นต้องใส่ brush ทุกอันในข้อ 3 สามารถเลือกเฉพาะอันที่ใช้เท่านั้นได้ สำหรับ brush เพิ่มเติม สามารถดูได้จาก http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/

Thursday, August 29, 2019

[Laravel - Exception] ระวังข้อผิดพลาด "Prepared statement contains too many placeholders" หากมีการ Bulk Insert ข้อมูลจำนวนมาก
[Laravel - Exception] Warning: "Prepared statement contains too many placeholders" Exception if Bulk Insert Large Data

การทำ bulk insert หรือการ insert ข้อมูลทีละเยอะๆ สามารถช่วยลดจำนวนการยิง query หลายๆรอบได้ ซึ่งส่งผลให้เวลาในการทำงานลดลงอย่างเห็นได้ชัด โดยเฉพาะอย่างยิ่ง เมื่อ Database อยู่คนละเครื่อง Server

แต่... อย่าเพิ่งคิดนะครับว่า เราจะยิงข้อมูลเป็นก้อนใหญ่ๆไปเลยทีเดียวได้

เพราะว่ามันก็มี limit ในเรื่องของ placeholder อยู่เหมือนกัน ซึ่งถ้าหากเราส่งข้อมูลก้อนใหญ่เกินไปก็จะได้ error นี้กลับมา
PDOException: SQLSTATE[HY000]: General error: 1390 Prepared statement contains too many placeholders in /var/www/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:77
แล้ว placeholder มาจากไหน?

Thursday, August 15, 2019

[Laravel - Config] วิธีการเพิ่มหรือแก้ไขค่าตัวแปรในไฟล์ .env ในขณะ Runtime
[Laravel - Config] How to Add or Modify Variable Value in .env File at Runtime

ไฟล์ .env เป็นไฟล์สำหรับเก็บค่า environment variables ต่างๆของ Application

โดยปกติแล้ว เราสามารถใส่ชื่อตัวแปรและค่าของตัวแปรนั้นๆเข้าไปในไฟล์ .env ได้เลย

แต่ในบางกรณี เราไม่สามารถกำหนดค่าของตัวแปรนั้นได้ เช่น ค่าที่ต้อง encrypt ผ่าน Application หรือค่าของตัวแปรนั้นสามารถหาได้ในขณะ Runtime เท่านั้น เช่น IP address ของ Host server เป็นต้น

[Docker - AWS] วิธีการหา IP address ของ Host ที่เป็น EC2 จากภายใน Docker Container
[Docker - AWS] How to Find IP Address of EC2 Host from Inside of Docker Container

สำหรับ Docker ที่รันใน AWS นั้น ข้อมูล Instance meta-data ของ Host ยังคงสามารถเรียกใช้ได้จากภายใน Container

ดังนั้นเราไม่จำเป็นต้องหาวิธีส่งค่า Host IP address เข้าไปใน Docker Container ให้ยุ่งยาก เราสามารถเรียกใช้ local-ipv4 หรือ public-ipv4 จาก Instance meta-data ได้เลย โดยใช้คำสั่งดังนี้
curl http://169.254.169.254/latest/meta-data/{category}
โดยที่ {category} เป็น local-ipv4 หรือ public-ipv4

นอกจาก local-ipv4 และ public-ipv4 แล้ว ยังมี categories อื่นๆที่ยังสามารถเรียกใช้ได้อีก อ่านข้อมูลเพิ่มเติมได้ที่ EC2 Instance Metadata

Thursday, August 8, 2019

[Laravel - Scheduler] การใช้ Environment Variable ของระบบปฏิบัติการใน Laravel Scheduler
[Laravel - Scheduler] How to Use Environment Variable of Operating System in Laravel Scheduler

Laravel scheduler ใช้ Crontab ในการรันคำสั่งต่างๆตามเวลาที่กำหนดบน Linux

เมื่อเราต้องการใช้งาน Laravel scheduler เราเพียงเพิ่มการตั้งค่าตามด้านล่างนี้ใน Cron ของ server
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
สำหรับการใช้ Environment Variable ของระบบปฏิบัติการ เราจำเป็นต้องสร้าง shell script ขึ้นมาตัวนึง เพื่อ export ตัวแปรที่เราต้องการใช้ก่อน

Wednesday, August 7, 2019

[Laravel - Model] เรื่องที่ควรรู้เกี่ยวกับ Attributes ใน Laravel Model
[Laravel - Model] What to Know about Attributes in Laravel Model

นอกจาก Laravel Model จะมี Attributes ที่ชื่อตามชื่อ Column ของ Table ใน Database แล้ว Laravel Model ยังมีตัวแปรและ Function สำหรับการจัดการ Attributes พวกนี้อีกด้วย โดยมีรายละเอียดดังนี้

ตัวแปรสำหรับการจัดการ Attributes ใน Laravel Model ประกอบด้วย
  • $fillable - เป็นตัวแปรที่กำหนดว่า Attributes ใดสามารถแก้ไขค่าได้บ้าง
  • $cast - เป็นตัวแปรที่กำหนดว่า Attributes ใดต้องเปลี่ยนประเภทตัวแปรบ้าง ซึ่งประเภทตัวแปร ประกอบด้วย integer, real, float, double, decimal:<digits>, string, boolean, object, array, collection, date, datetime และ timestamp
  • $dates - เป็นตัวแปรที่กำหนดว่า Attributes ใดต้องถูกเปลี่ยนประเภทเป็น datetime บ้าง ซึ่ง attribute ดังกล่าวจะถูก cast เป็น Carbon instance
  • $hidden - เป็นตัวแปรที่กำหนดว่า Attributes ใดต้องถูกตัดออก เมื่อมีการแปลง Model ไปเป็น JSON
  • $appends - เป็นตัวแปรที่กำหนดว่า Attributes ใดต้องถูกเพิ่มเข้าไป เมื่อมีการแปลง Model ไปเป็น JSON

Monday, August 5, 2019

[Laravel - Model] ข้อควรระวังของการใช้ฟังก์ชั่น where และ orWhere ของ Laravel Model
[Laravel - Model] Warning: Using where and orWhere functions of Laravel Model

สมมติว่า
  • OrganizationChildren เป็น Laravel model ที่ผูกกับตาราง organization_children ในฐานข้อมูล
  • OrganizationChildren ประกอบด้วยฟิลด์ parent_organization_id และ child_organization_id 
  • $org1->id และ $org2->id เป็นค่า id ของ Organization โดยมีค่าเป็น 1 และ 2 ตามลำดับ

ถ้าเราต้องการ query ข้อมูล โดยใช้ SQL ดังนี้
select * 
from `organization_children` 
where (`parent_organization_id` = 1 and `child_organization_id` = 2) or 
(`parent_organization_id` = 2 and `child_organization_id` = 1)

[Laravel - Package] วิธีการเปลี่ยนข้อมูลที่ใช้สำหรับ Subject Claim ของ JWT ใน Laravel Model
[Laravel - Package] How to Change Data for Subject Claim of JWT in Laravel Model

JSON Web Token (JWT) ถูกใช้ใน stateless web application

jwt-auth เป็น JWT package ที่นิยมใช้สำหรับ Laravel framework

package นี้จะใช้ ID ของผู้ใช้งานเป็น sub claim (subject claim) โดยอัตโนมัติ

เนื่องจาก payload ของ JWT สามารถ decode ที่ใดก็ได้ โดยไม่จำเป็นต้องใช้ key ใดๆ การใช้ ID ของผู้ใช้งาน จึงทำให้เกิดปัญหาทางด้านความปลอดภัย

คุณสามารถเปลี่ยนฟิลด์ ID ของผู้ใช้งานเป็นฟิลด์อื่นด้วยวิธีตามด้านล่างนี้ เพื่อหลีกเลี่ยงปัญาด้านความปลอดภัย

Saturday, August 3, 2019

[PHP] วิธีการพิมพ์ข้อความออกทาง STDOUT หรือ STDERR หรือ SYSLOG
[PHP] How to Print Out Message to STDOUT or STDERR or SYSLOG

ในบางครั้งคุณมีความจำเป็นต้องพิมพ์ข้อความออกทาง system log หรือ I/O streams อื่นๆ เช่น standard output, standard error

สมมติว่า $str เป็นข้อความที่คุณต้องการ print

คุณสามารถใช้ method ข้างล่างสำหรับการพิมพ์ข้อความออก system log
syslog(LOG_INFO, $str);
อ่านข้อมูลเพิ่มเติมที่ https://www.php.net/manual/en/function.syslog.php

คุณสามารถใช้ method ข้างล่างสำหรับการพิมพ์ข้อความออก I/O streams อื่นๆ
$out = fopen('php://stdout', 'w'); //output handler
fputs($out, $str); //writing output operation
fclose($out); //closing handler
โดยที่ php://stdout สามารถแทนด้วย php://stderr หรือ php://output
อ่านข้อมูลเพิ่มเติมที่ https://www.php.net/manual/en/wrappers.php.php