Saturday, May 26, 2018

[Ubuntu] การแตกไฟล์ zip ด้วย encoding ที่กำหนด
[Ubuntu] How to Extract ZIP File with Specific Encoding

หลังจากที่บีบอัดไฟล์ที่มีชื่อภาษาไทยเป็นไฟล์ zip บน Windows แล้วนำมาแตกไฟล์บน Ubuntu เพื่อใช้งาน จะพบว่า ชื่อไฟล์ที่เป็นอักขระภาษาไทยถูกแทนที่ด้วยอักระพิเศษที่อ่านไม่รู้เรื่อง

สาเหตุที่เป็นเช่นนั้น เนื่องจากการแตกไฟล์ปกติจะใช้ default encoding ซึ่งไม่ใช่ encoding สำหรับภาษาไทย ดังนั้นเราจึงต้องกำหนด encoding ที่จะใช้ในการแตกไฟล์ดังนี้
unzip -O <encoding> <filename> -d <target_dir>
ตัวอย่างเช่น
unzip -O windows-874 lp-real-font.zip -d ocr_in
สำหรับชื่อ encoding ที่ใช้ได้ สามารถดูได้จาก https://www.iana.org/assignments/character-sets/character-sets.xhtml

Ref: https://superuser.com/questions/872596/decompress-zip-with-given-encoding

[Laravel - Config] การบังคับให้ Laravel สร้าง URL แบบ HTTPS
[Laravel - Config] How to Force Laravel to Create URL with HTTPS

เมื่อ Laravel ถูกดีพลอยบน server ที่มีการเรียกหน้าเว็บแบบ HTTP เบื้องหลัง NGINX ที่ตั้งค่าให้เรียกหน้าเว็บแบบ HTTPS เราจึงจำเป็นต้องบังคับให้ link ที่สร้างขึ้นมาโดย Laravel เป็น HTTPS ทั้งหมด

Method ที่เกี่ยวข้องกับการสร้าง link ของ Laravel มี 2 methods ดังนี้
  • url() 
    • เป็น method สำหรับสร้าง url จาก relative path ที่ใส่เข้าไป เช่น url('/images/logo_sm.png') เป็นต้น
    • url ที่ถูกสร้างขึ้นจะเป็น HTTP หรือ HTTPS ตาม server ที่มันอยู่
    • วิธีแก้ไข คือ เพิ่ม \URL::forceScheme('https'); ใน boot ของ AppServiceProvider 
  • link() 
    • เป็น method สำหรับสร้าง render template เพื่อแสดงรายการของหน้า 
    • Method นี้เป็นของตัวแปรที่ได้มาจากการเรียกใช้ paginate() ตอน query ข้อมูลจากฐานข้อมูล
    • วิธีแก้ไข คือ ให้ทำการสั่ง setPath() ให้กับตัวแปรดังกล่าวก่อนที่จะเรียกใช้ link() เช่น $users->setPath('/users/manage'); แล้วจึงเรียกใช้ {{$users->link()}} ใน blade template เมื่อ $users เป็นตัวแปรที่ได้มาจากการเรียกใช้ paginate()

Saturday, April 7, 2018

[Laravel - Package] การสร้าง Refresh Token เองจาก jwt-auth version 1.0.0-rc.1
[Laravel - Package] How to Manually Generate Refresh Token from jwt-auth version 1.0.0-rc.1

tymon/jwt-auth เป็น library สำหรับจัดการการเข้าใช้งานแบบ token โดยเวอร์ชั่นล่าสุดในตอนนี้ คือ 1.0.0-rc.1

สำหรับ access token สามารถสร้าง, ตรวจสอบและใช้งานได้อย่างปกติ แต่สำหรับการ refresh token นั้นจะผิดแปลกไปจาก library สำหรับ JWT ทั่วไป

โดยทั่วไปแล้ว หลังจากที่เรา refresh token ไปแล้ว เราจะได้ access token ใหม่ที่เริ่มนับเวลาหมดอายุรวมถึงเวลาที่สามารถทำการ refresh ใหม่ด้วย เพื่อใช้ token นั้นในระบบต่อไป โดยที่ระบบจะบังคับให้เรา login ใหม่ก็ต่อเมื่อเราไม่ได้ใช้งานระบบเป็นเวลานานจน access token หมดอายุและเลยกำหนดเวลาที่จะ refresh token ได้

สำหรับการ refresh token ของ jwt-auth นั้น access token ใหม่จะเริ่มนับเวลาหมดอายุใหม่เท่านั้น แต่เวลาที่สามารถทำการ refresh ใหม่นั้น ยังคงนับเวลาต่อจากเวลาของ token เดิม เนื่องจากเวลาสร้างของ access token ใหม่ใช้เวลาสร้างเดียวกับ access token เดิม ทำให้ไม่ว่าเราจะ refresh token ไปกี่ครั้ง ระบบก็จะบังคับให้เรา login ใหม่ เมื่อ access token ปัจจุบันหมดอายุและเลยกำหนดเวลาที่จะ refresh token ตัวแรกที่ได้หลังจาก log in ได้

Saturday, March 17, 2018

[Docker] การเปลี่ยนแปลงวันเวลาของเครื่อง Server ที่เป็น Docker
[Docker] How to Change Date and Time of Server which is Docker

การเปลี่ยนแปลงวันเวลาของเครื่อง Server ที่เป็น Docker นั้น เราไม่สามารถใช้คำสั่ง docker exec เพื่อเข้าไปเปลี่ยนแปลงวันเวลาของเครื่องได้โดยตรง เนื่องจากวันเวลาของเครื่องที่เป็น Docker นั้นจะใช้วันเวลาจากเครื่อง Host เป็นหลัก ดังนั้นการจะเปลี่ยนแปลงวันเวลาของเครื่อง Docker จะต้องเปลี่ยนแปลงเวลาที่เครื่อง Host แทน

คำสั่งในการเปลี่ยนแปลงวันเวลาของเครื่อง Host ที่เป็น Linux คือ
date -s "2018-04-01 00:00:00"
ซึ่งถ้าต้องการเปลี่ยนแปลงวันเวลากลับไปเป็นวันเวลาของเครื่องจริงๆก็สามารถใช้คำสั่งดังนี้
hwclock > date -s

Saturday, November 11, 2017

[PHP - MQ] การติดตั้ง mqseries สำหรับ PHP บน Ubuntu
[PHP - MQ] How to Install mqseries for PHP on Ubuntu

เนื่องจากมีความจำเป็นต้องส่งข้อความไปยัง IBM MQ Server จากโปรแกรมที่พัฒนาด้วย Laravel framework ซึ่งเป็น PHP framework ทำให้ต้องใช้ mqseries เป็นตัวช่วยในการเชื่อมต่อและส่งผ่านข้อความไปยัง IBM MQ Server

ข้อสำคัญ mqseries สำหรับ PHP นี้ จะทำงานได้สมบูรณ์ก็ต่อเมื่อมีการติดตั้ง IBM MQ Client ไว้ภายในเครื่องด้วย

สมมติว่า ใช้ Homestead เป็น environment ในการพัฒนา และมี folder Project เป็น shared folder ใน Homestead

วิธีการติดตั้งก็จะเป็นตามข้างล่างนี้
  1. ดาวน์โหลด mqseries จาก http://pecl.php.net/package/mqseries เลือก 0.14.1 (0.14.2 มีปัญหา)
  2. เอาไฟล์ที่ดาวน์โหลดมา ไปไว้ใน folder Project/ibm
  3. เข้าไปในเครื่องของ Homestead ด้วยคำสั่ง vagrant ssh
  4. หลังจากเข้าไปในเครื่องแล้ว ให้รันคำสั่ง sudo su เพื่อเข้าใช้ในสิทธิ์ root
  5. ถ้ายังไม่เคย compile mqseries มาก่อน ให้รันคำสั่งดังนี้
    cd เข้า Project/ibm
    tar -zxvf mqseries-0.14.1.tgz
    cd mqseries-0.14.1
    phpize
    ./configure --with-libdir=lib64
    make
    
  6. สร้าง config file ของ mqseries ด้วยคำสั่งดังนี้
    cp modules/mqseries.so /usr/lib/php5/20131226
    
  7. สร้างไฟล์ /etc/php5/cli/conf.d/mqseries.ini และใส่ข้อความตามด้านล่างนี้แล้วบันทึก
    ; Enable mqseries extension module
    extension=mqseries.so
  8. ทำการ copy file ข้างต้นไปยัง /etc/php5/fpm/conf.d/ พร้อมแก้ไข permission ตามคำสั่งดังนี้
    cd /etc/php5
    cp cli/conf.d/mqseries.ini fpm/conf.d/
    cd /etc/php5/fpm/conf.d/
    chmod 777 mqseries.ini
    
  9. ทำการ restart service php5-fpm ตามคำสั่งดังนี้
    service php5-fpm restart
    
  10. ทดสอบการใช้งาน โดยลองรันคำสั่งดังนี้
    cd เข้า Project/ibm/mqseries-0.14.1/example
    php put.php