วันเสาร์ที่ 30 มิถุนายน พ.ศ. 2561

[Google Assistant] รายงานรถติด แอปพลิเคชันที่ช่วยรายงานสภาพการจราจรให้ฟัง


          สวัสดีครับผม หลังจากที่ห่างหายการเขียนบทความไปนาน (เพราะงานยุ่ง + แอบซุ่มทำแอปพลิเคชันเล็ก ๆ ) พอทำเสร็จและ publish ออกใช้งานแล้ว ก็รีบมาเขียนบทความรีวิวแอปพลิเคชันเลย จากชื่อบทความก็น่าจะพอรู้แล้วว่าผมทำแอปพลิเคชันเกี่ยวกับอะไร แต่ที่จะแตกต่างไปจากแอปพลิเคชันปกติที่เพื่อน ๆ คุ้นเคยก็ตรงที่แอปพลิเคชันนี้เป็นแอปพลิเคชันที่ทำงานบน Google Assistant นั่นเอง ก่อนอื่นเรามาทำความรู้จักกับ Google Assistant กันสักเล็กน้อย

          Google Assistant คือปัญญาประดิษฐ์ผู้ช่วยอัจฉริยะบนสมาร์ทโฟนที่เปิดตัวในปีพ.ศ. 2559 ซึ่งเราสามารถสั่งงานได้ด้วยเสียงพูด โดยวิธีเรียกใช้งาน Google Assistant ก็ง่าย ๆ เพียงแค่พูดว่า "OK Google" (วิธีนี้ต้องเปิดใช้งานยืนยันเจ้าของเสียงด้วย) หรือแค่กดปุ่ม home ค้างไว้ ซึ่งหลังจากที่พัฒนามาได้อีก 2 ปี Google ก็ได้ประกาศว่า Google Assistant รองรับภาษาไทยและสำเนียงการพูดของคนไทยในงาน Google I/O 2018 ที่ผ่านมา ซึ่งนับว่าเป็นข่าวดีที่พวกเราชาวไทยจะได้พูดกับ Google Assistant ซะที แต่เนื่องจาก Google Assistant เพิ่งจะรองรับภาษาไทยได้ไม่นาน แอปพลิเคชันภาษาไทยก็เลยยังมีไม่เยอะ (โดยเพื่อน ๆ สามารถเข้าไปดูแอปพลิเคชันที่ทำงานบน Google Assistant ได้ ที่นี่ )

          จุดนึงที่ผมรู้สึกขัดใจเล็กน้อยก็ตรงที่ภาษาที่ Google Assistant จะพูด ขึ้นอยู่กับการตั้งค่าภาษาของสมาร์ทโฟน นั่นหมายถึง ถ้าเราตั้งค่าสมาร์ทโฟนของเราให้เป็นภาษาไทย Google Assistant ก็จะพูดเป็นภาษาไทย แต่ถ้าเราตั้งค่าสมาร์ทโฟนของเราให้เป็นภาษาอังกฤษ ก็รู้ได้ทันทีว่า Google Assistant จะพูดออกมาเป็นภาษาอังกฤษ แต่ก็พอเข้าใจได้ว่าภาษาแต่ละภาษามีสำเนียงที่แตกต่างกันไป ดังนั้นการระบุแบบนี้จะทำให้ Google Assistant เข้าใจภาษาที่เราพูดได้ทันที

          นอกจากนี้การตั้งค่าภาษาของสมาร์ทโฟนก็ยังส่งผลไปถึงการแสดงแอปพลิเคชันที่เราจะมองเห็นในหน้า Explore ของ Google Assistant อีกด้วย .....เอ๊ะ! Explore ของ Google Assistant คืออะไรหน่ะเหรอ? ถ้าจะให้เปรียบเทียบง่าย ๆ Explore ของ Google Assistant ก็คือหน้า Play Store ที่เอาไว้ใช้แสดงแอปพลิเคชันของ Google Assistant นั่นเอง สามารถเข้าสู่หน้านี้ได้ผ่านทางหน้าเว็บ และผ่านทาง Google Assistant

ผ่านทางหน้าเว็บ
เข้าผ่านทางหน้าเว็บด้วย URL: https://assistant.google.com/explore
ผ่านทางสมาร์ทโฟน
เข้าผ่านทางสมาร์ทโฟนด้วยการกดปุ่มโฮมค้างไว้แล้วกดที่ปุ่มสีน้ำเงินที่อยู่มุมบนขวา

          เกริ่นกันไปพอสมควรแล้วก็ถึงเวลาโปรโมทแอปพลิเคชันของตัวเองซะที (ฮา) แอปพลิเคชันรายงานรถติดของผมจะทำงานโดยการดึงข้อความมาจากทวิตเตอร์ของ จส.100 และ FM91 ซึ่งเป็นทวิตเตอร์ที่ทวีตรายงานข่าวรถติด หรือสภาพอากาศ เอาล่ะ เรามาดูวิธีเรียกใช้งานแอปพลิเคชันนี้กันเลย

1. กดปุ่มโฮมค้างไว้เพื่อเรียกใช้งาน Google Assistant











2. พูดหรือพิมพ์ว่า "คุยกับรายงานรถติด" (หรือ "คุยกับ...<ชื่อแอปพลิเคชันที่ต้องการเรียกใช้งาน>") แอปพลิเคชันจะแสดงคำพูดทักทาย พร้อมทั้งถามและแสดงตัวเลือกถึงจำนวนข้อความข่าวที่เพื่อน ๆ อยากจะฟัง









3. หลังจากตอบตัวเลขไปแล้ว แอปพลิเคชันจะทำการรายงานข่าว เมื่อรายงานข่าวเสร็จแล้วแอปพลิเคชันจะถามจำนวนข้อความข่าวที่เพื่อน ๆ อยากจะฟังอีกรอบ










4. ถ้าเพื่อน ๆ ต้องการปิดการใช้งานแอปพลิเคชันก็พูดว่า "จบการสนทนา"











          เป็นยังไงบ้างกับแอปพลิเคชันเล็ก ๆ ของผม ด้วยคำสั่งเสียงนิดหน่อยเพื่อน ๆ ก็สามารถเปิดฟังรายงานการจราจรหรือสภาพอากาศได้แม้มือจะไม่ว่างอยู่ เพื่อน ๆ สามารถเข้าไปอ่านรายละเอียด ให้คะแนน หรือเขียนรีวิวแอปพลิเคชันของผมได้ ที่นี่ .....หวังว่าเพื่อน ๆ จะชอบนะครับ หากมีอะไรอยากให้ปรับปรุงแก้ไขก็เขียนบอกมากันได้เลย สำหรับบทความนี้ ผมก็ต้องขอตัวลาไปก่อนล่ะ เอาไว้พบกันใหม่ในบทความหน้า บ๊ายบาย

          ปล. ช่วงนี้มีบทความหลายเรื่องที่อยากเขียน แต่กลับไม่ค่อยมีเวลาซะงั้น แต่ผมจะพยายามทยอยเขียนบทความที่ค้าง ๆ เอาไว้ให้เสร็จโดยเร็ว หนึ่งในเรื่องที่จะเขียนก็คือบทความสอนเขียนแอปพลิเคชันที่ทำงานบน Google Assistant แบบแอปพลิเคชันตัวนี้เนี่ยแหละครับ


วันอังคารที่ 27 มีนาคม พ.ศ. 2561

[PHP] รับ-ส่งข้อมูลผ่านโพรโทคอล MQTT


          กลับมาพบกับบทความเขียนโปรแกรมด้วยภาษา PHP กันอีกครั้ง ในบทความนี้เราจะมาเขียนโปรแกรมเพื่อใช้งานโพรโทคอล MQTT ในการสื่อสารกัน แล้วโพรโทคอล MQTT คืออะไร? .....ปกติแล้วเราจะใช้โพรโทคอล HTTP (HyperText Transfer Protocol) ในการแลกเปลี่ยนข้อมูลกันระหว่างคอมพิวเตอร์ โดยโพรโทคอลตัวนี้ถูกออกแบบมาให้มีความกระทัดรัด ทำงานได้รวดเร็วและไม่ซับซ้อน สามารถรองรับข้อมูลได้ทุกแบบ มีการแบ่งการทำงานออกเป็น 2 ฝั่ง ได้แก่ ฝั่ง Server และฝั่ง Client โดยฝั่ง Client จะทำการส่ง request ไปที่ Server เพื่อทำการประมวลและส่งข้อมูลตอบกลับ Client แต่โพรโทคอล MQTT จะมีรูปแบบการทำงานที่แตกต่างออกไป

          โพรโทคอล Message Queuing Telemetry Transport หรือ MQTT เป็นโพรโทคอลที่ถูกออกแบบมาเพื่อการเชื่อมต่อแบบ M2M (machine-to-machine) หรือพูดง่าย ๆ ก็คือเป็นโพรโทคอลที่ใช้ในการสื่อสารระหว่างอุปกรณ์กับอุปกรณ์ มีน้ำหนักเบา ใช้รับส่งข้อมูลในเครือข่ายที่มีขนาดเล็ก แบ่งการทำงานออกเป็น 2 ฝั่ง ได้แก่ ฝั่ง Server และฝั่ง Client โดย
  • ฝั่ง Server: คือเครื่องที่ทำหน้าที่เป็นตัวกลางคอยจัดการการรับส่งข้อมูลระหว่าง Client ต่าง ๆ ซึ่งในที่นี้จะเรียกว่า Broker
  • ฝั่ง Client: คือเครื่องหรืออุปกรณ์ที่เชื่อมต่อและต้องการรับ-ส่งข้อมูลกับ Broker โดยจะแบ่งออกเป็นเครื่องที่ทำหน้าที่เป็น Publisher และเครื่องที่ทำหน้าที่เป็น Subscriber
    • Publisher: เป็นเครื่องหรืออุปกรณ์ที่ทำหน้าที่คอยส่งข้อมูลไปให้ Broker
    • Subscriber: เป็นเครื่องหรืออุปกรณ์ที่ทำหน้าที่คอยรับข้อมูลจาก Broker
          หลักการทำงานคือ อุปกรณ์ Client จะทำการเชื่อมต่อกับ Broker จากนั้นก็ทำการ subscribe หัวเรื่อง (Topic) หนึ่ง อุปกรณ์นั้นก็กลายเป็น Subscriber คอยรับข้อความจาก Broker เมื่ออุปกรณ์ตัวหนึ่งต้องการส่งข้อความไปหา Broker อุปกรณ์ตัวนั้นก็จะทำตัวเป็น Publisher ส่งข้อความไปให้ Broker โดยระบุหัวเรื่องติดไปด้วย เมื่อ Broker ได้รับข้อความก็จะทำการส่งข้อความเหล่านั้นไปให้ Client ที่ทำการสมัครหัวเรื่องนั้น ๆ ไว้อยู่

          เพื่อความเข้าใจที่มากยิ่งขึ้น เรามาดูอย่างกันดีกว่า สมมุติว่ามีเครื่อง MQTT Broker และอุปกรณ์ Client ที่เชื่อมต่อกับ Broker อยู่ 3 ตัว (ได้แก่ A1, A2 และ A3) อันดับแรก A1, A2 ทำการสมัครเป็นสมาชิกของหัวเรื่อง S1 และเมื่อ A1 ทำการส่งข้อความในหัวเรื่อง S1 ไปให้ Broker แล้ว Broker ก็จะทำการส่งข้อความนั้นไปให้กับอุปกรณ์ที่เป็นสมาชิกของหัวเรื่อง S1 นั่นคือ A2 (สาเหตุที่ A3 ไม่ได้รับข้อความด้วยเป็นเพราะ A3 ยังไม่ได้สมัครเป็นสมาชิกของหัวเรื่อง S1)

          หลังจากนั้น A3 ก็ทำการสมัครเป็นสมาชิกของหัวเรื่อง S1 เมื่อ A1 ทำการส่งข้อความในหัวเรื่อง S1 ไปให้ Broker เจ้า Broker ก็จะทำการส่งข้อความต่อให้กับ A2 และ A3 ที่เป็นสมาชิกในหัวเรื่อง S1

          ถึงตรงนี้เพื่อน ๆ ก็คงจะพอเข้าใจหลักการทำงานของโพรโทคอล MQTT กันอย่างคร่าว ๆ แล้ว และด้วยคุณสมบัติของเจ้าโพรโทคอลนี้ มันจึงเหมาะที่จะนำไปใช้ในเทคโนโลยี IoT (Internet of Things หรือ "อินเทอร์เน็ตของสรรพสิ่ง") ซึ่งเป็นเทคโนโลยีที่ใช้ในการติดต่อสื่อสารกันระหว่างอุปกรณ์ เช่น โทรศัพท์มือถือ รถยนต์ หลอดไฟ เป็นต้น ผ่านเครือข่ายอินเทอร์เน็ต โดยจะส่งผลให้มนุษย์เราสามารถเข้าถึงอุปกรณ์เหล่านั้นจากที่ไหนก็ได้ เพื่อเช็คสถานะหรือควบคุมสั่งการต่าง ๆ เช่น การสั่งเปิด-ปิดไฟภายในบ้านจากห้างสรรพสินค้า เป็นต้น

ติดตั้งโปรแกรม Mosquitto เพื่อใช้งานโพรโทคอล MQTT


          ณ จุดนี้เพื่อน ๆ ก็คงพอจะเห็นภาพของโพรโทคอล MQTT กันไปบ้างแล้ว ถัดไปเราจะมาลองใช้งานโพรโทคอลตัวนี้กัน เพราะงั้นเราก็มาติดตั้ง MQTT Broker กันก่อน ซึ่งก็มีผู้พัฒนา MQTT Broker อยู่หลายค่าย ไม่ว่าจะเป็น HiveMQ, Mosquitto, Eclipse IoT เป็นต้น และในบทความนี้ เราจะทำการติดตั้ง Mosquitto ลงใน Server จำลอง (Virtual Machine) แต่ถ้าเพื่อน ๆ คนไหนมี Server จริงอยู่แล้วก็สามารถติดตั้งลง Server จริงได้เลย (ส่วนเพื่อน ๆ ที่ยังไม่ได้สร้าง Server จำลอง ให้ลองย้อนกลับไปอ่านบทความ วิธีสร้างคอมพิวเตอร์เสมือนด้วย VirtualBox และบทความ วิธีตั้งค่า Ubuntu Server ให้ใช้งานเป็น Web Server ก่อน)

หลังจากเปิดใช้งาน VirtualBox แล้วก็ log-in ตาม user, password ที่ได้ตั้งค่าไว้ จากนั้นพิมพ์คำสั่งตามนี้
***** หมายเหตุ: แนะนำให้ log-in ด้วย root *****

apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
apt-get update
apt-get upgrade
เพื่ออัพเดทฐานข้อมูลของแพ็กเก็จทั้งหมด จากนั้นก็พิมพ์คำสั่ง

apt-get install mosquito
apt-get install mosquitto-clients
เพื่อติดตั้งโปรแกรม Mosquitto .....หลังจากติดตั้งเสร็จแล้วให้ทำการสร้าง user เพื่อเข้าใช้งาน โดยการพิมพ์คำสั่ง

mosquitto_passwd -b /etc/mosquitto/pwfile ชื่อผู้ใช้งาน รหัสผ่าน 
service mosquitto restart
เท่านี้เราก็ติดตั้งโปรแกรม Mosquitto สำหรับเรียกใช้งานโพรโทคอล MQTT เสร็จเรียบร้อยแล้ว

เขียนโปรแกรม PHP เพื่อใช้งานโพรโทคอล MQTT


          ถึงจุดนี้ เราก็พร้อมที่จะเขียนโปรแกรมด้วยภาษา PHP เพื่อใช้งานโพรโทคอล MQTT แล้ว โดยไฟล์ที่เราจะเขียนแบ่งออกเป็น 2 ไฟล์ ได้แก่ publish.php (ไฟล์ที่ทำหน้าที่เป็น publish ไว้คอยส่งข้อมูล) และ subscribe.php (ไฟล์ที่ทำหน้าที่เป็น subscribe ไว้คอยรับข้อมูล) แต่ก่อนจะเริ่มเขียนโค้ด เรามาเช็ค ip address ของเครื่องจำลองกันก่อน ด้วยคำสั่ง

ip addr show

จากตัวอย่างเป็น ip 192.168.3.238 ให้จดเอาไว้ก่อน จากนั้นให้เราเข้าไปดาวน์โหลดไฟล์ phpMQTT.php มาจาก https://github.com/bluerhinos/phpMQTT/blob/master/phpMQTT.php และเมื่อดาวน์โหลดเสร็จแล้วให้เปิดไฟล์ขึ้นมา


แล้วลบบรรทัด  namespace Bluerhinos;  ออกไป ถัดไปให้สร้างไฟล์ subscribe.php โดยการพิมพ์โค้ดดังนี้

<?php

require("phpMQTT.php");

$server  = "192.168.3.238"; Server ip address
$port  = 1883;
$username = "yyy";  username ที่ได้สร้างไว้ตอนตั้งค่า MQTT Broker
$password = "zzz";  password ที่ได้สร้างไว้ตอนตั้งค่า MQTT Broker
$client_id = "Client-".rand();

$mqtt = new phpMQTT($server, $port, $client_id);
if( !$mqtt->connect(true, NULL, $username, $password) ) {
 exit(1);
}

$topics['test/topic'] = array("qos" => 0, "function" => "procmsg");
$mqtt->subscribe($topics, 0);

while($mqtt->proc()){
 
}

$mqtt->close();

function procmsg($topic, $msg){
  echo "Recieved at: " . date("Y-m-d H:i:s", time()) . "\n";
  echo "Topic: {$topic}\n";
  echo "Message: $msg\n\n";
}

?>
โดยเราจะต้องรันไฟล์นี้ไว้เพื่อรอรับข้อมูลจากไฟล์ publisher และเพื่อไม่ให้เป็นการเสียเวลา เราก็มาคัดลอกโค้ดข้างล่างไปใช้สร้างไฟล์ publish.php เพื่อส่งข้อมูลกันเลย

<?php

require("phpMQTT.php");

$server  = "192.168.3.238"; Server ip address
$port  = 1883;
$username = "yyy";  username ที่ได้สร้างไว้ตอนตั้งค่า MQTT Broker
$password = "zzz";  password ที่ได้สร้างไว้ตอนตั้งค่า MQTT Broker
$client_id = "Client-".rand();

$mqtt = new phpMQTT($server, $port, $client_id);

if ($mqtt->connect(true, NULL, $username, $password)) {
 $mqtt->publish("test/topic", "Hello World! This is message from publisher.", 0);
 $mqtt->close();
} else {
    echo "Time out!\n";
}

?>
อย่าลืมแก้ไขค่า username และ password ให้ตรงตามที่ได้ตั้งค่าไว้ตอนติดตั้ง MQTT Broker นอกจากนี้ไฟล์ phpMQTT.php, subscribe.php และ publish.php จะต้องอยู่ในพาทเดียวกัน

          หลังจากที่ได้ไฟล์ครบทั้ง 3 ไฟล์เรียบร้อยแล้ว ขั้นตอนถัดไปเราก็ต้องอัพโหลดไฟล์ทั้งหมดไปยัง Server จำลอง ด้วยโปรแกรม FileZilla (เพื่อน ๆ คนไหนยังไม่ได้ติดตั้ง FileZilla ขอให้ย้อนกลับไปอ่านในบทความ วิธีติดตั้งและกำหนดค่า FTP เพื่อใช้สำหรับโอนไฟล์ ก่อนจ้าาาาา) เมื่อเชื่อมต่อกับ Server จำลองเรียบร้อยแล้วให้ย้ายไปยังพาท /var/www/html และสร้างโฟลเดอร์ที่ชื่อ test_mqtt ขึ้นมา จากนั้นก็อัพโหลดไฟล์ทั้งหมดไปยังพาทที่เพิ่งสร้างขึ้น

          เมื่อเราลงโปรแกรม Mosquitto และอัพโหลดไฟล์ทั้งหมดเรียบร้อย เท่านี้ก็...ไฟล์พร้อม! Server พร้อม! ทุกอย่างพร้อม! เรามาเริ่มรันโปรแกรมเพื่อใช้งานโพรโทคอลกันเล้ยยยยย! เริ่มจากล็อกอินเข้า Server จำลองใน VirtualBox และย้ายไปยังพาทที่เก็บไฟล์ด้วยคำสั่ง

cd /var/www/html/text_mqtt
แล้วต่อด้วยคำสั่งสำหรับรันไฟล์ subscribe.php เพื่อให้โค้ดทำงาน

php subscribe.php

จะเห็นได้ว่าเมื่อไฟล์ subscribe.php ทำงาน ก็จะอยู่ในสภาพรอรับข้อมูลจาก publisher ก็ให้เราใช้โปรแกรม PuTTy เพื่อเชื่อมต่อเข้าไปยัง Server จำลองเพื่อสั่งทำงานไฟล์ publish.php (เพื่อน ๆ คนไหนยังไม่ได้ติดตั้ง PuTTy ก็สามารถย้อนกลับไปอ่านวิธีติดตั้งได้ที่บทความ ติดตั้งโพรโทคอล Secure Shell สำหรับเชื่อมต่อกับ Server ก่อน) เปิดโปรแกรม PuTTy ขึ้นมา กรอกค่า IP address และ Port แล้วกดเชื่อมต่อ Server

          พิมพ์ username กับ password เพื่อเข้าใช้งาน Server ย้ายไปยังพาทที่เก็บไฟล์ด้วยคำสั่ง

cd /var/www/html/text_mqtt
แล้วต่อด้วยคำสั่งสำหรับรันไฟล์ publish.php เพื่อให้โค้ดทำงาน

php publish.php

          เมื่อเราสั่งรันไฟล์ publish.php เรียบร้อยแล้ว ในหน้าจอที่รันไฟล์ subscribe.php ก็จะแสดงข้อความจากไฟล์ publish.php ขึ้นมา โดยการส่งข้อความผ่านโพรโทคอล MQTT

          พอถึงตรงนี้เพื่อน ๆ น่าจะพอเข้าใจโพรโทคอล MQTT ขึ้นมาบ้างแล้ว ซึ่งในบทความนี้ได้แสดงการเขียนโปรแกรมสื่อสารกันภายในเครื่อง Server จำลองเดียวกัน (เพราะไฟล์ที่ส่งข้อมูลกับไฟล์ที่รับข้อมูลอยู่บนเครื่องเดียวกัน) ซึ่งผมคาดหวังว่าบทความนี้จะเป็นประโยชน์ ช่วยทำให้เพื่อน ๆ เข้าใจพื้นฐานการทำงานของโพรโทคอล MQTT และสามารถนำไปประยุกต์ต่อยอดเขียนโปรแกรมบนบอร์ดไมโครคอนโทรลเลอร์ให้สื่อสารกับเครื่อง Server ได้ (ฮา) สำหรับบทความนี้ก็ขอจบลงเพียงเท่านี้ ไว้พบกันใหม่บทความหน้า บ๊ายบายครับผม 😄


วันจันทร์ที่ 19 มีนาคม พ.ศ. 2561

ติดตั้งโพรโทคอล Secure Shell สำหรับเชื่อมต่อกับ Server


          ห่างหายจากการเขียนบทความไปเสียนาน ช่วงนี้งานค่อนข้างเยอะทำให้ไม่มีเวลาเขียนบทความเพิ่มเลย หวังว่าเพื่อน ๆ จะยังไม่ลืมกันนะ (ฮา) สำหรับบทความนี้จะทำการติดตั้งโพรโทคอล Secure Shell (SSH) ซึ่งเป็นโพรโทคอล (Protocol) ที่ใช้ในการติดต่อสื่อสารระหว่างเครื่องคอมพิวเตอร์บนระบบเครือข่าย และอนุญาตให้ผู้ใช้งานสามารถควบคุมหรือสั่งการเครื่องคอมพิวเตอร์เครื่องนั้น ๆ ได้แม้จะไม่ได้อยู่ต่อหน้าเครื่อง

          โพรโทคอล SSH จะทำงานในลักษณะ Client และ Server ประกอบไปด้วยโปรแกรม 2 ส่วนคือ โปรแกรมส่วนของ Server ซึ่งจะติดตั้งลงบน Server หรือเครื่องที่ให้บริการ เป็นการเปิดช่องทางให้ผู้ใช้งานสามารถเข้ามาควบคุมการทำงานหรือสั่งการเครื่องที่ติดตั้งโปรแกรมนี้ได้ และโปรแกรมส่วนของ Client ซึ่งจะติดตั้งลงบนเครื่อง Client หรือเครื่องคอมพิวเตอร์ที่จะทำหน้าที่เป็นผู้เชื่อมต่อไปยังเครื่องที่ให้บริการ SSH โดยในบทความนี้เราจะใช้โปรแกรม PuTTy (ซึ่งเป็นโปรแกรมที่มีขนาดเล็ก) ทำงานในส่วนของ Client

          เริ่มต้นจากการติดตั้งโปรแกรม PuTTy ลงบนเครื่อง Client กันก่อน ให้เข้าไปดาวน์โหลดไฟล์โปรแกรมจากเว็บ Putty.org

กดเข้าที่ลิงค์ Download เพื่อไปหน้าดาวน์โหลดไฟล์
 
เลื่อนลงมาในส่วนของไฟล์ .exe แล้วเลือกไฟล์ที่ต้องการแล้วกดดาวน์โหลดโล้ด
 
พอดาวน์โหลดเสร็จจะได้ไอคอนประมาณนี้ กดใช้งานโปรแกรมได้เลย
 
หน้าตาโปรแกรมก็จะประมาณนี้
  
          หลังจากที่ทำการติดตั้ง PuTTy ลงบนเครื่อง Client เสร็จเรียบร้อยแล้ว ต่อไปจะเป็นการติดตั้งบนเครื่อง Server เพื่อไม่ให้เสียเวลางั้นเราก็มาเปิดเครื่อง Guest จาก VirtualBox และเริ่มติดตั้งกันเล้ยยยยย

หลังจากเปิดใช้งานแล้วก็ log-in ตาม user, password ที่ได้ตั้งค่าไว้ จากนั้นพิมพ์คำสั่งตามนี้
***** หมายเหตุ: แนะนำให้ log-in ด้วย root *****
 
apt-get update
apt-get upgrade
เพื่ออัพเดทฐานข้อมูลของแพ็กเก็จทั้งหมด จากนั้นก็พิมพ์คำสั่ง

apt-get install openssh-server
เพื่อติดตั้งโปรแกรม SSH ในส่วนของ Server

          หลังจากติดตั้งเสร็จแล้ว เราสามารถตั้งค่าเพื่อควบคุมการเชื่อมต่อของ SSH ในส่วน Client เพื่อเพิ่มความปลอดภัยและป้องกันผู้ไม่ประสงค์ดีเข้ามาเชื่อมต่อกับ Server ของเราได้ โดยทำการเปิดไฟล์ config ของ SSH ขึ้นมาด้วยคำสั่ง

vi /etc/ssh/sshd_config
หน้าจอจะแสดงการตั้งค่าพื้นฐานดังรูป
 

จะเห็นได้ว่ามีการตั้งค่าบางค่าไว้อยู่แล้วแต่มีการปิดไว้เป็นคอมเมนต์ด้วยตัวอักษร # นั่นหมายความว่าถ้าเราลบ # ออกก็จะเป็นการเปิดใช้งานการตั้งค่านั้น ๆ ซึ่งเราสามารถกำหนด Port ที่ใช้ในการเชื่อมต่อได้ เราจะเห็นการค่าของ Port โดยค่าตั้งต้นคือ 22 ให้เรากดคีย์บอร์ด i เพื่อเข้าสู่โหมดแก้ไขเอกสาร ทำการลบ # ออกแล้วแก้ไขตัวเลข 22 เป็น 123 จากนั้นให้เพิ่ม MaxAuthTries เท่ากับ 2 เพื่อกำหนดจำนวนครั้งในการล็อกอินผิดพลาด (ถ้าล็อกอินผิด 2 ครั้ง Server จะตัดการเชื่อมต่อออกไป) และเพิ่ม AllowUsers ตามด้วยชื่อ user ที่อนุญาตให้เชื่อมต่อ

Port หมายเลขพอร์ตที่ใช้ในการเชื่อมต่อ
MaxAuthTries จำนวนครั้งที่อนุญาตให้ล็อกอินผิด
AllowUsers ชื่อผู้ใช้งานที่อนุญาตให้เชื่อมต่อ
จากนั้นก็กดปุ่ม esc บนคีย์บอร์ดเพื่อออกจากโหมดแก้ไขเอกสาร แล้วพิมพ์ :wq เพื่อบันทึกและออกจากไฟล์ตั้งค่า หลังจากนั้นก็ให้เราพิมพ์คำสั่ง

service ssh restart
เพื่อทำการรีสตาร์ท service ให้ใช้การตั้งค่าล่าสุด ถัดไปเราก็จะใช้โปรแกรม PuTTy ในส่วน Client เข้ามาเชื่อมต่อ แต่ก่อนหน้านั้นเราต้องรู้ IP address ของเครื่อง Server ก่อน ด้วยการพิมพ์คำสั่ง

ip addr show
เพื่อแสดง IP address ที่จะใช้ในการเชื่อมต่อ


ให้เปิดโปรแกรม PuTTy ในส่วน Client ขึ้นมา

กรอกค่า IP address และแก้ไขค่า Port ให้ตรงตามค่าที่ได้กำหนดไว้เมื่อสักครู่
 
พิมพ์ username กับ password เพื่อเชื่อมต่อเข้าสู่ Server
(จะต้องใช้ Account ตามที่เราตั้งค่าไว้ในไฟล์ SSH config)

          พอเชื่อมต่อเข้าสู่ Server ได้สำเร็จ เราก็สามารถสั่งการเครื่องได้ทันที แต่การเชื่อมต่อจากภายนอกแบบนี้จะไม่สามารถใช้ Account root ในการล็อกอินได้


วันพุธที่ 14 กุมภาพันธ์ พ.ศ. 2561

[PHP] Resize, Crop และ ใส่ลายน้ำให้กับรูป


          กลับมาอีกแล้วสำหรับบทความเขียนโปรแกรม (อันน่าปวดหัว) ในบทความนี้เราจะมาเขียนโปรแกรมภาษา PHP เพื่อทำการย่อ-ขยาย ตัด แล้วก็ใส่ลายน้ำลงไปในรูปกัน ซึ่งโปรแกรมจะให้เรากำหนดขนาดกว้างและยาวของรูปที่ต้องการจะตัดออกมาจากรูปต้นฉบับ จากนั้นก็จะทำการย่อรูปให้อยู่ในขนาดที่ต้องการโดยยังคงอัตราส่วนกว้างต่อยาวของรูปต้นฉบับไว้อยู่ด้วย แล้วจึงทำการตัดรูปในส่วนที่ต้องการออกมา สุดท้ายก็ใส่ลายน้ำลงไปในรูป (อ่านดูแล้วอาจจะงง ๆ แต่เดี๋ยวลงมือทำแล้วก็จะเข้าใจเอง)

          ข้อดีของเจ้าโปรแกรมนี้คือเราสามารถประยุกต์เอาโค้ดบางส่วนแยกไปใช้งานได้ เช่น ใช้ในการย่อ-ขยายรูปโดยที่อัตราส่วนของรูปยังเหมือนเดิม หรือใช้เพิ่มลายน้ำลงไปในรูป เป็นต้น .....เกริ่นกันพอแล้วเราก็มาเริ่มเขียนโปรแกรมกันเลยดีกว่าเนอะ เริ่มจากไปสร้างโฟลเดอร์สำหรับเก็บโค้ดก่อน จากนั้นก็สร้างไฟล์ PHP เปล่า ๆ ขึ้นมา ตั้งชื่อว่า processImage.php แล้วเพิ่มโค้ด

$original_image = 'xxxxx.png';
$name_array = explode('.', $original_image);
$result_image = 'result_'.$name_array[0].'.'.$name_array[1];
$watermark_image = 'yyyyy.png';
          โค้ดในส่วนนี้ใช้สำหรับกำหนดไฟล์รูปที่จะใช้เป็นรูปต้นฉบับ โดยตัวแปรที่ต้องตั้งค่ามีอยู่ 2 ตัว ได้แก่ $original_image ซึ่งจะเก็บค่าชื่อของไฟล์รูปที่จะใช้ ให้เพื่อน ๆ เปลี่ยนไปใส่ชื่อไฟล์รูปต้นฉบับที่ต้องการได้เลย แต่มีข้อแม้ว่าไฟล์นั้นจะต้องอยู่ในโฟล์เดอร์เดียวกับไฟล์ processImage.php ด้วย ส่วนอีกตัวก็คือ $watermark_image ซึ่งเก็บชื่อของไฟล์รูปที่จะใช้เป็นลายน้ำ (รูปลายน้ำควรจะมีสีพิ้นหลังใส ๆ ไม่งั้นรูปลายน้ำจะไปบังรูปต้นฉบับ)

$result_image_width = 640;
$result_image_height = 480;
$quality = 100;
          ถัดไปเป็นการกำหนดขนาดของรูปที่จะทำการตัดออกมา โดย $result_image_width คือค่าความกว้าง และ $result_image_height คือค่าความสูง ซึ่งตรงนี้เพื่อน ๆ สามารถกำหนดได้ตามใจชอบเลย

$info = getimagesize($original_image);
$imgtype = image_type_to_mime_type($info[2]);

switch ($imgtype) {
 case 'image/jpeg':
  $source = imagecreatefromjpeg($original_image);
  break;
 case 'image/gif':
  $source = imagecreatefromgif($original_image);
  break;
 case 'image/png':
  $source = imagecreatefrompng($original_image);
  break;
 default:
  die('Invalid image type.');
}
          ใช้ฟังก์ชัน getimagesize() หาประเภทของรูป จากนั้นก็ทำการสร้างรูปขึ้นมาภายในโปรแกรม PHP โดยใช้ฟังก์ชันที่แตกต่างกันไปขึ้นอยู่กับประเภทของรูป (เช่น รูปประเภท png ก็จะใช้ฟังก์ชัน imagecreatefrompng() ในการสร้างรูป เป็นต้น) ที่ต้องสร้างรูปขึ้นมาในโปรแกรมก็เพื่อให้โปรแกรมรู้จักรูปและสามารถเข้าถึงรายละเอียดของรูปได้

$source_width = imagesx($source);
$source_height = imagesy($source);
$source_ratio = $source_width / $source_height;
          เมื่อโปรแกรมสามารถเข้าถึงข้อมูลรูปได้แล้ว ต่อไปก็จะทำการย่อ-ขยายรูป โดยเริ่มจากหาอัตราส่วนของรูปเพื่อเอาไปคำนวณหาความกว้างและความสูงของรูปที่ถูกย่อ-ขยาย

if ($result_image_width/$result_image_height > $source_ratio) {
 $new_image_width = $result_image_width;
 $new_image_height = $result_image_width/$source_ratio;
} else {
 $new_image_width = $result_image_height*$source_ratio;
 $new_image_height = $result_image_height;
}
          คำนวณความกว้างและความสูงของรูปใหม่ที่ถูกย่อ-ขยายมาจากรูปต้นฉบับ

$new_image = imagecreatetruecolor(round($new_image_width), round($new_image_height));
imagecopyresampled($new_image, $source, 0, 0, 0, 0, $new_image_width, $new_image_height, $source_width, $source_height);
          ใช้ฟังก์ชัน imagecreatetruecolor() เพื่อสร้างรูปสี่เหลี่ยมใหม่ โดยใส่พารามิเตอร์เป็นความกว้าง ($new_image_width) และความสูง ($new_image_height) ของรูปที่ถูกย่อ-ขยาย จากนั้นจึงใช้ฟังก์ชัน imagecopyresampled() เพื่อก๊อบปี้จากภาพนึงไปยังอีกภาพนึง โดยใส่พารามิเตอร์เป็น
  • resource ของรูปใหม่ที่ถูกย่อ-ขยาย ($new_image)
  • resource ของรูปต้นฉบับ ($source)
  • ตำแหน่งเริ่มต้นในแนวแกน x ของรูปใหม่ที่ถูกย่อ-ขยาย (0)
  • ตำแหน่งเริ่มต้นในแนวแกน y ของรูปใหม่ที่ถูกย่อ-ขยาย (0)
  • ตำแหน่งเริ่มต้นในแนวแกน x ของรูปต้นฉบับ (0)
  • ตำแหน่งเริ่มต้นในแนวแกน y ของรูปต้นฉบับ (0)
  • ความกว้างของรูปใหม่ที่ถูกย่อ-ขยาย ($new_image_width)
  • ความสูงของรูปใหม่ที่ถูกย่อ-ขยาย ($new_image_height)
  • ความกว้างของรูปต้นฉบับ ($source_width)
  • ความสูงของรูปต้นฉบับ($source_height)
เท่านี้เราก็จะได้ภาพใหม่ที่ผ่านการย่อ-ขยายตามอัตราส่วนของขนาดความกว้างและความสูงที่กำหนดไว้ในตอนแรกแล้ว อันดับถัดไปเราจะทำการหาตำแหน่งที่จะตัด (Crop) รูปออกมา

$new_x_mid = $new_image_width / 2;
$new_y_mid = $new_image_height / 2;
$old_x_mid = $result_image_width / 2;
$old_y_mid = $result_image_height / 2;
          โค้ดส่วนนี้จะทำการหาพิกัดแนวแกน x และแกน y เพื่อทำการตัดรูป

$final_source = imagecreatetruecolor($result_image_width, $result_image_height);
imagecopyresampled($final_source, $new_image, 0, 0, ($new_x_mid - $old_x_mid), ($new_y_mid - $old_y_mid), $result_image_width, $result_image_height, $result_image_width, $result_image_height);
          ทำการตัดรูปออกมาเท่ากับขนาดที่เรากำหนดไว้ในตอนแรกด้วยการใช้ฟังก์ชัน imagecopyresampled() โดยใส่พิกัดที่ได้คำนวณไว้แล้ว ซึ่งผลลัพธ์จะทำให้เราได้รูปที่มีขนาดตามที่ต้องการและยังคงอัตราส่วนของรูปเดิมไว้อยู่

$watermark_info = getimagesize($watermark_image);
$imgtype = image_type_to_mime_type($watermark_info[2]);
switch ($imgtype) {
  case 'image/jpeg':
   $watermark_source = imagecreatefromjpeg($watermark_image);
   break;
  case 'image/gif':
   $watermark_source = imagecreatefromgif($watermark_image);
   break;
  case 'image/png':
   $watermark_source = imagecreatefrompng($watermark_image);
   break;
  default:
   die('Invalid watermark type.');
}
          ลำดับต่อไปจะทำการใส่ลายน้ำลงไปที่รูป ให้ทำการสร้างรูปลายน้ำในโปรแกรมเหมือนที่ทำกับรูปต้นฉบับในตอนแรกก่อน

$watermark_image_width = imagesx($watermark_source);
$watermark_image_height = imagesy($watermark_source);
imagecopy($final_source, $watermark_source, $result_image_width - $watermark_image_width, $result_image_height - $watermark_image_height, 0, 0, $result_image_width , $result_image_height);
          ในส่วนของการใส่ลายน้ำก็ไม่มีอะไรมาก หาขนาดของความกว้างและความสูงของรูปลายน้ำเพื่อเอาไปใช้คำนวณตำแหน่งของรูปลายน้ำบนรูปหลัก แล้วใช้ฟังก์ชัน imagecopy() เพื่อก๊อปปี้รูปลายน้ำลงไปบนรูปหลัก (อย่าลืมว่ารูปลายน้ำต้องมีพื้นหลังใสนะ ไม่งั้นจะบังรูปหลักเอาได้) โดยใส่พารามิเตอร์เป็น
  • resource ของรูปหลัก ($final_source)
  • resource ของรูปลายน้ำ ($watermark_source)
  • ตำแหน่งในแนวแกน x ของรูปหลักที่จะนำรูปลายน้ำมาใส่ ($result_image_width - $watermark_image_width)
  • ตำแหน่งในแนวแกน y ของรูปหลักที่จะนำรูปลายน้ำมาใส่ ($result_image_height - $watermark_image_height)
  • ตำแหน่งเริ่มต้นในแนวแกน x ของรูปลายน้ำ (0)
  • ตำแหน่งเริ่มต้นในแนวแกน y ของรูปลายน้ำ (0)
  • ความกว้างของรูปลายน้ำ ($result_image_width)
  • ความสูงของรูปลายน้ำ ($result_image_height)
เหตุที่กำหนดความกว้างและความสูงของรูปลายน้ำให้เท่ากับรูปหลักก็เพื่อให้รูปลายน้ำทับลงไปบนรูปหลักพอดี แต่แค่นี้เรายังไม่ได้รูปออกมาจริง ๆ เพราะเมื่อทำถึงขั้นตอนนี้แล้ว เราจะได้แค่รูปในโปรแกรมเท่านั้น ต้องทำการสร้างรูปออกมาเป็นไฟล์ด้วย

imagejpeg($final_source, $result_image, $quality);
imagedestroy($final_source);
          ใช้ฟังก์ชัน imagejpeg() เพื่อสร้างไฟล์รูป โดยใส่ใส่พารามิเตอร์เป็น
  • resource ของรูปที่จะทำการสร้าง ($final_source)
  • ตำแหน่งที่เก็บไฟล์รูปที่จะทำการบันทึก ($result_image)
  • คุณภาพของรูปที่จะทำการสร้าง ($quality)
จากนั้นก็ใช้ฟังก์ชัน imagedestroy() ลบรูปออกจากโปรแกรมเพื่อคืนหน่วยความจำของเครื่อง


          ผลลัพธ์ที่ได้ก็จะประมาณนี้ เพียงเท่านี้เราก็จะได้โปรแกรมย่อ-ขยาย ตัด และใส่ลายน้ำให้กับรูปแล้ว เพื่อน ๆ สามารถตัดการทำงานบางส่วนแล้วนำไปประยุกต์ใช้งานต่อได้ ซึ่งผมขอแนะนำให้เพื่อน ๆ แก้ไขค่าบางค่าแล้วลองดูผลการทำงานเพื่อทำความเข้าใจโค้ดให้มากยิ่งขึ้น


วันอังคารที่ 30 มกราคม พ.ศ. 2561

สิ่งที่เกิดขึ้นกับร่างกายเมื่อเรานอนไม่พอ


          หลังจากเขียนบทความด้านการเขียนโปรแกรมไปหลายบทความแล้ว บทความนี้ขอเปลี่ยนแนวมาพักสมอง (?) กับบทความด้านสุขภาพกันบ้าง ในปีที่แล้วผมได้เขียนบทความเรื่อง การอดนอนเพิ่มความเสี่ยงที่จะเป็นโรคอ้วน และ การนอนดึกตื่นสายในวันหยุดสุดสัปดาห์เป็นอันตรายต่อหัวใจ แต่ดูเหมือนว่าการนอนไม่เพียงพอจะสร้างปัญหาให้กับร่างกายของเรามากกว่านั้น จากงานวิจัยที่ศึกษาตัวอย่างเลือดพบว่าการนอนหลับน้อยกว่า 6 ชั่วโมงต่อคืนติดต่อกัน 1 สัปดาห์ส่งผลให้เกิดการเปลี่ยนแปลงระดับยีนส์มากกว่า 700 จุด ซึ่งการเปลี่ยนแปลงนี้ส่งผลกระทบต่อสุขภาพและเป็นสาเหตุของโรคอ้วน โรคหัวใจและโรคเบาหวาน


          จาก Infographic แสดงให้เห็นถึงสิ่งที่เกิดขึ้นเมื่อร่างกายนอนหลับไม่เพียงพอ และผลกระทบจะรุนแรงขึ้นเรื่อย ๆ หากเรายังนอนไม่เพียงพอติดต่อกันเป็นเวลานาน ซึ่งอาการที่เกิดขึ้นหลังจากนอนไม่พอ 1 คืนประกอบด้วย

  • รู้สึกหิวและกินอาหารมากขึ้น: จากการศึกษาพบว่าการอดนอนทำให้เรารู้สึกอยากอาหารที่มีแคลอรี่สูง และมีแนวโน้มที่จะกินอาหารทำลายสุขภาพมากขึ้น
  • มีโอกาสเกิดอุบัติเหตุสูงขึ้น: การพักผ่อนไม่เพียงพอจะทำให้เราซุ่มซ่ามมากขึ้น และความง่วงก็จะทำให้เกิดอุบัติเหตุได้ง่าย
  • หน้าโทรม: ผู้ที่นอนน้อยจะมีสเน่ห์ลดลง ดูเหน็ดเหนื่อยและเศร้าหมอง ยิ่งเวลาผ่านไปก็ยิ่งส่งผลต่อผิว เช่น ก่อให้เกิดริ้วรอยบนใบหน้า (หรือที่เรียกกันง่าย ๆ ว่า "ตีนกา" นั่นเอง)
  • เป็นหวัดได้ง่ายขึ้น: ประสิทธิภาพการทำงานของระบบภูมิคุ้มกันน้อยลง เมื่อแอนติบอดีที่ต่อสู้กับการติดเชื้อลดลงก็ส่งผลให้เราเป็นหวัดได้ง่ายขึ้น
  • เนื้อเยื่อสมองลดลง
  • อารมณ์มาเต็ม: การอดนอนส่งผลให้ศูนย์อารมณ์ของสมองมีการปฏิกิริยามากกว่า 60 เปอร์เซ็นต์ทำให้เราหัวร้อนได้ง่ายเนื่องจากไม่สามารถควบคุมอารมณ์ได้นั่นเอง
  • สมาธิน้อยลงและมีปัญหาเกี่ยวกับหน่วยความจำ
และถ้ายังนอนไม่พอติดต่อกันไปเรื่อย ๆ ก็จะยิ่งปรากฏอาการเหล่านี้

  • เสี่ยงที่จะเป็นโรคหลอดเลือดสมอง: วัยกลางคนและผู้สูงอายุที่นอนน้อยกว่า 6 ชั่วโมงต่อคืนมีโอกาสเสี่ยงที่จะเป็นโรคหลอดเลือดสมองมากกว่าคนที่นอน 7-8 ชั่วโมงสูงถึง 4 เท่า
  • เสี่ยงที่จะเป็นโรคอ้วน: การนอนหลับน้อยกว่า 6 ชั่วโมงต่อคืนก่อให้เกิดการเปลี่ยนแปลงระดับฮอร์โมนความอยากอาหาร ทำให้มีความอยากอาหารมากขึ้น นอกจากนี้การนอนดึกทำให้เราต้องผจญกับความหิวที่ชอบมาตอนมืด ๆ ของว่างยามดึกก็อาจเป็นสาเหตุที่ทำให้เราอ้วนด้วย
  • เสี่ยงที่จะเป็นโรคมะเร็งบางชนิด: จากการศึกษาพบว่าผู้ที่นอนน้อยเสี่ยงที่จะเป็นมะเร็งลำไส้ใหญ่ มะเร็งต่อมลูกหมาก และมะเร็งเต้านม
  • เสี่ยงที่จะเป็นโรคเบาหวาน: การนอนหลับน้อยเกินไปจะลดการตอบสนองของอินซูลิน ซึ่งเป็นปัจจัยเสี่ยงของโรคเบาหวาน
  • เสี่ยงที่จะเป็นโรคหัวใจ: ผู้ที่นอนไม่เพียงพอเสี่ยงต่อการเสียชีวิตด้วยโรคหัวใจถึงร้อยละ 48 และมีโอกาสเป็นโรคหลอดเลือดสมองมากขึ้นถึงร้อยละ 15 นอกจากนี้ยังเสี่ยงที่จะเป็นโรคความดันโลหิตสูง คลอเรสเตอรอลอุดตันในหลอดเลือด ภาวะหัวใจล้มเหลวและหัวใจวาย
  • จำนวนอสุจิลดลง: จากการศึกษาวัยรุ่นหนุ่มในเดนมาร์กพบว่าคนที่นอนน้อยจะมีความเข้มข้นของอสุจิลดลง 29 เปอร์เซ็นต์ในน้ำอสุจิ
  • ความเสี่ยงที่จะเสียชีวิตสูงขึ้น: ในการศึกษาชายและหญิง 1,741 คน พบว่าคนที่หลับน้อยกว่า 6 ชั่วโมงมีความเสี่ยงต่อการเสียชีวิตเพิ่มขึ้นอย่างมากแม้ว่าจะตัดโรคเบาหวาน ความดันโลหิตสูง และปัจจัยอื่น ๆ ออกไปแล้ว 
          นอกจากอาการเหล่านี้แล้ว การอดนอนยังเป็นการขัดขวางความสามารถในการสร้างความทรงจำใหม่ ๆ และยังนำไปสู่การเพิ่มขึ้นของโปรตีนที่เป็นพิษในสมองที่เรียกว่า Beta-Amyloid ซึ่งเป็นสาเหตุที่ทำให้เกิดโรคอัลไซเมอร์อีกด้วย ซึ่งวิธีลดจำนวนเจ้าโปรตีนพิษนี้ก็คือการนอนให้เพียงพอนั่นเอง .....แต่นอนมากเกินไปก็ไม่ดีนะจ๊ะ 😁


ที่มา: Huffingtonpost.com


วันอาทิตย์ที่ 28 มกราคม พ.ศ. 2561

[PHP + Laravel] ติดตั้งและทำความเข้าใจโครงสร้างของ Laravel


          ในบทความที่แล้ว เราได้ทำความรู้จัก Laravel กันไปแล้ว สำหรับบทความนี้เราจะมาติดตั้ง Laravel กัน ซึ่งวิธีการติดตั้ง Laravel เนี่ยจะต้องติดตั้งผ่าน Composer..... อ้าว! แล้วไอ้เจ้า Composer มันคืออะไรกันล่ะ นักแต่งเพลงเหรอ?


          Composer คือเครื่องมือสำหรับติดตั้ง Package หรือ Library จากแหล่งต่าง ๆ ของภาษา PHP เนื่องจาก Package หรือ Library ของ PHP Framework ที่เป็น Open Source นั้นมีอยู่มากมาย ซึ่งแต่ละตัวก็เกิดจากการสร้างสรรค์ของเหล่าโปรแกรมเมอร์มือฉมัง และกระจัดกระจายไม่เป็นหมวดหมู่ ในกรณีที่เราต้องการดาวน์โหลด Package หรือ Library มาใช้ เราก็ไม่อาจรู้ได้เลยว่าจะมีของแถมจำพวกไวรัสหรือมัลแวร์ติดมาด้วยหรือเปล่า รวมไปถึงไฟล์นั้นรองรับกับเวอร์ชั่นของ php ที่เราใช้งานได้หรือไม่

          ด้วยเหตุนี้จึงมีการคิดค้น Composer ขึ้นมาเพื่อจัดระเบียบ Package และ Library ต่าง ๆ ให้มาอยู่ในแหล่งเดียวกัน ซึ่งจะสามารถติดตั้งไฟล์เหล่านี้ได้จากการใช้คำสั่ง Command โดย Composer จะทำการตรวจสอบและดาวน์โหลด Package นั้น ๆ มาติดตั้ง แต่ก่อนหน้าที่เราจะใช้ Composer ได้นั้น ก็ต้องติดตั้ง Composer กันก่อน เข้าไปที่ลิงค์ Download Composer

คลิกที่ "Composer-Setup.exe" แล้วคลิก Save File เล้ย

 
หลังจากดับเบิ้ลคลิกไฟล์ติดตั้งแล้วก็คลิก Next >

 
เลือก Path ของไฟล์ php.exe จากนั้นคลิก Next >

 
ถ้าเชื่อม Internet ต่อผ่าน Proxy ก็ให้กำหนด Proxy แล้วคลิก Next >

 
คลิก Install แล้วรอให้คอมพิวเตอร์ติดตั้ง.....

 คลิก Next > โล้ด

 
ติดตั้งเรียบร้อยแล้ว คลิก Finish ปิดหน้าต่างไปได้เลย

ทดสอบการทำงานโดยเปิดโปรแกรม Command Prompt ขึ้นมาแล้วพิมพ์คำสั่งว่า composer

          หลังการทดสอบเรียกใช้ composer เราก็จะเห็นว่าเจ้า composer สามารถทำงานได้แล้ว ถัดไปเราก็จะใช้คำสั่งของ composer ในการติดตั้ง Laravel ซึ่งคำสั่งที่ใช้คือ  composer create-project --prefer-dist laravel/laravel ชื่อโฟลเดอร์ที่จะสร้าง 

composer create-project --prefer-dist laravel/laravel test_laravel

          พอเรียกใช้คำสั่งแล้ว composer ก็จะดาวน์โหลดและติดตั้ง Laravel ซึ่งขั้นตอนนี้อาจจะใช้เวลานานนิดหน่อย


          เมื่อติดตั้ง Laravel เสร็จแล้วเราสามารถเข้า URL http://localhost/test_laravel/public/ เพื่อเปิดหน้าเว็บที่เราเพิ่งสร้างขึ้นได้ นอกจากนี้ถ้าเราเข้าไปในโฟลเดอร์ที่ติดตั้ง Laravel ก็จะพบกับไฟล์และโฟลเดอร์เป็นจำนวนมาก สาเหตุที่มีหลากหลายโฟลเดอร์เป็นเพราะ Laravel ถูกออกแบบมาโดยใช้หลัก MVC จึงมีการแยกโฟลเดอร์ตามลักษณะการทำงานออกอย่างชัดเจน สิ่งที่เราต้องทำก็คือการเขียนโค้ดและเซฟเก็บไว้ในโฟลเดอร์ให้ถูกต้อง โดยโฟลเดอร์สำคัญ ๆ ที่ควรรู้ได้แก่

  • app: โฟลเดอร์ที่เก็บไฟล์โค้ดทั้งหมดของเว็บ
    • Controllers: เป็นโฟลเดอร์ที่อยู่ภายในโฟลเดอร์ app/Httpd เอาไว้เก็บไฟล์ Controller ทั้งหมดของเว็บ
  • bootstrap: โฟล์เดอร์ที่เก็บไฟล์ซึ่งจะถูกโหลดทันทีเมื่อเว็บเริ่มต้นทำงาน
  • config: โฟลเดอร์ที่เก็บไฟล์การตั้งค่าต่าง ๆ ของเว็บ
  • database: โฟล์เดอร์ที่เก็บไฟล์จัดการฐานข้อมูล เช่น สร้าง, เพิ่มเติม หรือแก้ไขฐานข้อมูล
  • public: โฟลเดอร์ที่เก็บไฟล์สาธารณะที่ทุกคนสามารถเข้าถึงได้ เช่นไฟล์ index.php, ไฟล์ css หรือไฟล์รูปภาพเป็นต้น เป็นจุดรับทุก request ที่เข้ามาในเว็บ
  • resources: โฟล์เดอร์ที่เก็บไฟล์สำหรับแสดงผล หรือไฟล์ที่ยังไม่ได้คอมไพล์
    • views: เป็นโฟลเดอร์ที่เก็บไฟล์ View สำหรับแสดงผลของเว็บ
  • routes: โฟลเดอร์ที่เก็บไฟล์ตั้งค่า route สำหรับการเข้าถึงเว็บ
  • vendor: โฟลเดอร์ที่เก็บ Library ต่าง ๆ ที่ดาวน์โหลดโดย composer
          ถึงตรงนี้ เราก็ได้ทำการติดตั้ง Laravel แล้วก็พอจะรู้จักโครงสร้างคร่าว ๆ ไปเป็นที่เรียบร้อย ซึ่งเมื่อเราเข้าใจหลักในการจัดเก็บไฟล์ทั้งหมดแล้ว เราก็จะสามารถพัฒนาเว็บได้อย่างง่ายและมีประสิทธิภาพมากขึ้น


วันพฤหัสบดีที่ 25 มกราคม พ.ศ. 2561

[PHP + Laravel] มาทำรู้จักกับ Laravel กัน


          ในการพัฒนาเว็บแอปพลิเคชัน เราสามารถเริ่มต้นพัฒนาจากศูนย์ก็ได้ แต่การทำแบบนั้นจะทำให้เสียเวลาในการพัฒนาเป็นอย่างมาก เนื่องจากเราต้องออกแบบโครงสร้างของเว็บเองตั้งแต่ต้น และถ้าเราออกแบบไม่ดีก็จะส่งผลให้การพัฒนาเป็นไปอย่างยากลำบาก แถมการปรับปรุงแก้ไขก็ทำได้ยากอีก นอกจากนี้แต่ละคนต่างก็มีความคิดไม่เหมือนกัน คงเป็นเรื่องยากที่มีจะใครออกแบบโครงสร้างโค้ดได้ตรงใจในแบบที่เราต้องการ ซึ่งจะส่งผลให้เวลาที่เราไปรับงานพัฒนาแอปพลิเคชันต่อจากคนอื่น เราต้องไปนั่งศึกษาโครงสร้างโค้ดแอปพลิเคชันนั้น ๆ ใหม่ ทำให้เสียเวลาเป็นอันมาก แต่โชคดีที่ปัจจุบันนี้มี Web Framework ออกมาให้นักพัฒนาเลือกใช้กันหลายตัว ช่วยให้ลดเวลาในการพัฒนาได้

          Framework คือโครงสร้างหรือรูปแบบที่ใช้ในการเขียนโปรแกรม มีการวางโค้ดไว้อย่างเป็นระบบและมีแบบแผนการเขียนโค้ดที่เป็นมาตรฐาน นอกจากนี้ยังมีการกำหนดโฟลเดอร์ที่เก็บไฟล์ไว้อย่างเป็นระเบียบ เหมาะกับการพัฒนาแอปพลิเคชันที่มีขนาดใหญ่ มีผู้พัฒนาหลายคน เพราะจะช่วยให้รูปแบบการเขียนโค้ดไม่สะเปะสะปะและเป็นไปในทิศทางเดียวกัน สามารถจัดการไฟล์ได้อย่างง่าย ซึ่งหนึ่งใน Framework ยอดนิยมที่มีผู้ใช้งานกันอย่างแพร่หลายก็คือ Laravel

          Laravel เป็น PHP Web Framework แบบโอเพนซอร์สที่สร้างขึ้นโดยคุณ Taylor Otwell ใช้สำหรับการพัฒนาเว็บแอปพลิเคชันตามรูปแบบ Model-View-Controller (MVC) มีฟีเจอร์ที่ช่วยให้การพัฒนาเว็บสามารถทำให้ได้ง่ายขึ้น เช่น การจัดการ Sessions, การตรวจสอบข้อมูล เป็นต้น ซึ่งในวันที่เขียนบทความอยู่นี้ Laravel ได้พัฒนามาถึงเวอร์ชันที่ 5.5 แล้ว โดยใน Laravel จะมี Artisan CLI (Artisan Command-Line Interface) หรือชุดคำสั่งที่ใช้เรียกงานผ่านทาง Command Line เพื่อช่วยในการพัฒนาเว็บติดมาด้วย นอกจากนี้ Laravel ยังเป็น Framework ที่มีคนนิยมใช้งานเป็นจำนวนมาก จึงเป็นเรื่องง่ายที่จะค้นหาข้อมูลจาก Google ในเวลาที่ติดปัญหาหรือมีข้อสงสัย

        สำหรับเพื่อน ๆ ที่สงสัยว่า MVC หรือ Model-View-Controller คืออะไร MVC ก็คือสถาปัตยกรรมซอฟต์แวร์ที่มีการแบ่งโค้ดของระบบออกเป็น 3 ส่วน ได้แก่ Model, View และ Controller ตามชื่อที่เรียกเลย ซึ่งแต่ละส่วนก็จะมีหน้าที่แตกต่างกันไป

  • Model คือ โค้ดส่วนที่ใช้สำหรับติดต่อกับฐานข้อมูล จัดการนำข้อมูลเข้าหรือออกจากฐานข้อมูล เพื่อนำไปประมวลผล
  • View คือ โค้ดส่วนที่ใช้แสดงผลออกทางหน้าจอ เพื่อติดต่อรับคำสั่งหรือข้อมูลจากผู้ใช้งาน
  • Controller คือ โค้ดส่วนที่ใช้ประมวลผลการทำงานตามที่ได้รับคำสั่งหรือข้อมูลจากผู้ใช้งาน (พูดง่าย ๆ ก็คือเป็นส่วนที่ควบคุมการทำงานของระบบ) เป็นตัวที่เชื่อมต่อทั้ง Model และ View ซึ่งเมื่อรับข้อมูลจากผู้ใช้งานเข้ามาแล้ว ก็จะดำเนินการตอบสนองต่อข้อมูลนั้นด้วย Model และส่งข้อมูลกลับไปยังส่วนแสดงผล View เพื่อแจ้งผลลัพธ์แก่ผู้ใช้งาน
          เมื่อผู้ใช้งานเปิดแอปพลิเคชันขึ้นมา Controller จะทำการส่ง View หน้าแรกของแอปพลิเคชันให้ผู้ใช้งาน เมื่อผู้ใช้คลิกคำสั่งหรือป้อนข้อมูลเข้ามา Controller จะทำการประมวลผลข้อมูลนั้น ๆ (ตรงจุดนี้ Controller อาจจะส่งต่อให้ Model เพื่อทำการบันทึกลงฐานข้อมูลก็ได้) แล้วจึงส่งผลลัพธ์การประมวลกลับไปแสดงที่ View เพื่อแจ้งผลลัพธ์แก่ผู้ใช้งาน

          ข้อดีของโครงสร้างระบบแบบ MVC นั่นคือ เราสามารถแก้ไขได้ระบบง่าย เช่น ถ้าเราต้องการแก้ไขการแสดงผลก็ให้ไปแก้ไขในโค้ดส่วนของ View โดยไม่ต้องยุ่งเกี่ยวกับโค้ดส่วนของ Model และ Controller เป็นต้น และเนื่องจากแบ่งโค้ดออกเป็นส่วน ๆ แบบนี้ ทำให้ข้อเสียที่ตามมาคือจำนวนไฟล์ในระบบก็จะมีมากขึ้น แต่กระนั้นก็ยังถือว่าโครงสร้างแบบ MVC ช่วยให้พัฒนาระบบได้ง่ายขึ้น

          บทความนี้เราได้ทำความรู้จัก Laravel กันอย่างคร่าว ๆ ไปแล้ว ในบทความถัดไปเราจะมาติดตั้ง Laravel เพื่อใช้งานกัน สำหรับบทความนี้ก็ขอจบเพียงเท่านี้ บ๊ายบายจ้าาาาา 😆


วันอาทิตย์ที่ 14 มกราคม พ.ศ. 2561

สร้าง LINE Bot ด้วย Messaging API


          สวัสดีปีใหม่ย้อนหลังครับผม!!! หลังจากเงียบหายไปประมาณเดือนนึงจากบทความล่าสุด วันนี้ถือเป็นฤกษ์งามยามดี (ตรงไหน?) ที่ทางลุงบันไดเปิดให้จอง Digimon Pendulum ver.20th ไปแล้ว เจ้าเครื่องนี้จะรวมสัตว์เลี้ยงดิจิตอลรุ่น Digimon Pendulum ทุกเวอร์ชันซึ่งบันไดทำออกมาฉลองครบรอบ 20 ปีของดิจิมอน และถ้ามีโอกาส ผมก็อาจจะเขียนบทความรีวิวเหมือนอย่างบทความ Digital Monster Ver.20th (Original)..... แต่นั่นก็เป็นเรื่องของอนาคต ไม่ใช่เรื่องที่ต้องสนใจตอนนี้ เพราะจริง ๆ แล้วบทความนี้เป็นบทความเกี่ยวกับการเขียนบอทต่างหาก (ฮา)

          หากพูดถึงบอทในภาษานักเล่นเกม เพื่อน ๆ ก็คงจะนึกถึงตัวละครในเกมที่สามารถเคลื่อนไหวได้เองโดยไม่ต้องมีผู้เล่นบังคับ แต่บอทในบทความนี้หมายถึง LINE Bot ซึ่งเป็น Line@ Account ที่ใช้ API ที่เรียกว่า Message API ร่วมกับโปรแกรมที่เราเขียนไว้เบื้องหลังเพื่อให้ LINE@ Account สามารถทำตามคำสั่งหรือตอบโต้การสนทนาได้โดยอัตโนมัติ โดยเจ้า Message API ก็คือ API ที่ทาง LINE สร้างขึ้นเพื่ออนุญาตให้ส่งข้อมูลจากโปรแกรมบน Server ของนักพัฒนาไปยังแพลตฟอร์มของ LINE .....ว่าแล้วเราก็มาเริ่มสร้าง LINE Bot กันเล้ยยยยย


สร้าง channel สำหรับ LINE Bot


          ในการจะใช้ Message API เพื่อสร้างบอทนั้น อันดับแรกให้เราเข้าไปที่ LINE Developers console เพื่อสร้าง channel หรือช่องทางที่จะเชื่อมต่อโปรแกรมของเรากับแพลตฟอร์มของ LINE

ใส่ username และ password บัญชีของ LINE เพื่อ Log in เข้าสู่ระบบ

คลิกที่ปุ่ม "Create provider"

ตั้งชื่อ Provider ใช้เป็นชื่อบริษัทก็ได้

เมื่อสร้าง Provider เสร็จแล้วให้คลิกที่ปุ่ม "Message API" เพื่อสร้าง channel

กรอกข้อมูลต่าง ๆ จากนั้นก็คลิกปุ่ม Create

แค่นี้ก็เป็นอันเสร็จสิ้นการสร้าง channel

          หลังจากทำการสร้าง channel เสร็จ ตอนนี้เราสามารถแอดเพื่อนกับบอทที่เราสร้างได้ไว้แล้ว แต่เนื่องจากเรายังไม่ได้สร้างโปรแกรมสำหรับประมวลผล บอทของเราจึงทำได้แค่ตอบกลับข้อความตามที่เราตั้งค่าไว้เท่านั้น


เพิ่มบอทเป็นเพื่อน


          วิธีเพิ่มบอทเป็นเพื่อนก็เหมือนกับการเพิ่มเพื่อนแบบปกตินั่นคือการเพิ่มจาก LINE ID หรือเพิ่มจาก QR Code


          วิธีดู QR Code ก็ให้คลิกตรงที่ channel bot นั้น ๆ เพื่อเข้าไปหน้า Configuration จากนั้นก็เลื่อนลงมาที่หัวข้อ "QR code of your bot" จากนั้นก็สแกน QR Code เพื่อเพิ่มเพื่อนโล้ดดดดด (ส่วนวิธีการเพิ่มเพื่อนด้วย LINE ID จะพูดถึงในลำดับถัดไป)

หลังจากทำการเพิ่มบอทเป็นเพื่อนแล้ว เราก็จะได้รับข้อความต้อนรับ (Greeting message)

และเมื่อพิมพ์อะไรไป เราก็จะได้รับข้อความตอบกลับอัตโนมัติ (Auto-reply messages)


          จะเห็นได้ว่า ถึงเรายังไม่ได้เขียนโปรแกรมอะไร ระบบก็มีการเซ็ตค่าตั้งต้นเพื่อให้ตอบกลับข้อความของเราอยู่แล้ว ซึ่งเราสามารถแก้ไขข้อความได้ทั้ง Greeting message และ Auto-reply messages ในหน้า Configuration ตรงหัวข้อ "Using LINE@ features"

เมื่อเราคลิกที่ Set message ของ Greeting message ก็จะแสดงหน้าให้แก้ไขข้อความต้อนรับ

เมื่อเราคลิกที่ Set message ของ Auto-reply messages ก็จะแสดงหน้าข้อความตอบกลับอัตโนมัติ
*แนะนำให้ลบข้อความ Auto-reply messages เนื่องจากเราจะเขียนโปรแกรมตอบกลับข้อความเอง*

หมายเหตุ: สังเกตตรงเมนูทางซ้ายจะมี LINE ID อยู่


เตรียม Server สำหรับเชื่อมต่อกับ LINE


          Server ที่จะทำ Webhook เชื่อมต่อกับ LINE นั้นจะต้องเป็น Server ที่สามารถใช้ https ได้ ซึ่งถ้าเรามีอยู่แล้วก็สามารถเอามาใช้ได้เลย แต่ถ้าเราไม่อยากเสียเงินเช่า Server ที่มี SSL (ซึ่งจะแพงกว่า Server ปกติ) เราก็สามารถไปใช้งาน Server แบบ SSL บน Heroku.com แทนได้โดยไม่เสียค่าใช้จ่าย ซึ่งแน่นอนว่าเราต้องสมัครสมาชิกก่อน

เข้าเว็บ Heroku.com เสร็จแล้วคลิก Sign up โลด

กรอกข้อมูลสมัครสมาชิกให้ครบถ้วน จากนั้นจะมีอีเมลส่งมาให้ตั้งพาสเวิร์ด

พอ Login เสร็จ ก็คลิก Create New App เพื่อทำการสร้าง Server (ในที่นี้จะเรียกว่า App) ได้เลย

ตั้งชื่อ App แล้วคลิก Create app โล้ดดดดด

เมื่อสร้างเสร็จแล้วจะได้ตามรูป สิ่งสำคัญคือชื่อ App ที่เราตั้งไว้ (ในกรอบสีแดง)

เราสามารถทดสอบ App ที่เพิ่งสร้างเมื่อสักครู่ได้โดยการเข้าไปที่ URL https://<ชื่อ app>.herokuapp.com
ตามตัวอย่างคือ https://javeb-app.herokuapp.com/ ซึ่งจะได้หน้าเว็บตามรูป



วิธี Deploy โค้ดไปยัง Heroku


          ในขั้นตอนที่แล้ว เราได้สร้าง App ที่ถือเป็นตัว Server เสร็จเรียบร้อยแล้ว สิ่งที่ต้องทำถัดไปคือการเขียนโค้ดแล้วส่งไปยัง App ที่เราได้สร้างขึ้น ส่วนโค้ดที่เราจะเขียนนั้นคือโค้ดภาษา PHP ซึ่งเป็นโค้ดที่สามารถอ่านทำความเข้าใจได้ง่าย โดยวิธีการส่งโค้ดขึ้นไปยัง App บน Heroku.com มีหลายวิธีดังต่อไปนี้
  1. Heroku CLI: เป็นเครื่องมือที่ใช้คำสั่งของ Git (บทความที่เกี่ยวกับ Git) ในการ Deploy โค้ดขึ้นไปยัง Heroku.com โดยตรง
  2. GitHub: เชื่อมต่อกับ GitHub เมื่อ Push โค้ดขึ้น GitHub แล้วก็จะ Deploy ไปยัง Heroku.com ให้อัตโนมัติ
  3. Dropbox: เชื่อมต่อกับ Dropbox และสั่ง Deploy ในเมนู Heroku Dashboard
          อันนี้แล้วแต่ว่าเพื่อน ๆ จะเลือกใช้เครื่องมือตัวไหนตามที่ตนเองถนัด อันที่จริงใช้ Dropbox ก็ง่ายดีนะ แต่ในบทความนี้จะขอใช้ Heroku CLI ในการ Deploy โค้ดไปยัง Heroku.com ละกัน ถ้าใครยังไม่รู้จักหรือใช้ Git ไม่เป็นก็กลับไปอ่านบทความที่เกี่ยวกับ Git ก่อน เอาล่ะเรามาติดตั้ง Heroku CLI กันเถอะ เริ่มจากเข้าไปยังลิงค์ Download Heroku CLI แล้วเลือกตัวติดตั้งตามระบบปฏิบัติการณ์ของเพื่อน ๆ

หลังจากคลิกตัวติดตั้งแล้วก็คลิก Next > ได้เลย

เลือก path ที่จะติดตั้งแล้วคลิก Install โลด

รอคอยสักนิดให้ระบบติดตั้งจนเสร็จ แล้วคลิก Close ปิดหน้าต่างนี้ไปได้เลย


          หลังจากติดตั้ง Heroku CLI เสร็จแล้ว เราก็สามารถเรียกใช้งานคำสั่งผ่าน Command Prompt ได้เลย ขั้นตอนต่อไปให้เราทำการทดสอบดูว่าสามารถ Deploy โค้ดไปยัง Heroku.com ได้หรือเปล่า เริ่มจากการสร้างไฟล์ index.php ที่มีโค้ดดังต่อไปนี้

<?php
echo "Hello LINE bot World!";
?>
กดปุ่ม Window + R แล้วพิมพ์ cmd จากนั้นก็คลิก OK เพื่อเปิด Command Prompt



          ใน Command Prompt ให้พิมพ์คำสั่ง  heroku login  แล้วให้เราพิมพ์ Email และ Password ที่ได้สมัครไว้ใน Heroku.com (**ต่อไปจะแยกวิธีใช้งานออกเป็น 2 วิธี สำหรับเพื่อน ๆ ที่ติดตั้ง Git ลงใน Command Prompt ก็สามารถใช้งานต่อได้เลย ส่วนเพื่อน ๆ ที่ติดตั้ง Git ตามในบทความนี้ให้เปิด Git Bash ขึ้นมาแทน**) จากนั้นให้ใช้คำสั่ง  cd <โฟลเดอร์ที่เก็บไฟล์ index.php> เพื่อย้าย path ไปยังโฟลเดอร์ของไฟล์ index.php

$ cd /C/Line_bot/
          ให้เราทำการสร้าง Git Repository ขึ้นมาด้วยคำสั่ง  git init 

$ git init
Initialized empty Git repository in C:/Line_bot/.git/
          จากนั้นให้ใช้คำสั่ง  heroku git:remote -a <ชื่อ App>  เพื่อกำหนดค่าให้ Git Repository เชื่อมต่อไปยัง Server ของ Heroku.com

$ heroku git:remote -a javeb-app
set git remote heroku to https://git.heroku.com/javeb-app.git
          ถัดไปให้ใช้คำสั่ง git add ตามด้วย git commit แล้วจึงใช้คำสั่ง  git push heroku master  เพื่อส่งไฟล์ไปยัง Heroku.com

$ git add .

$ git commit -m "Create index.php"
[master (root-commit) e38b346] Create index.php
 1 file changed, 5 insertions(+)
 create mode 100644 index.php

$ git push heroku master
Counting objects: 3, done.
Writing objects: 100% (3/3), 259 bytes | 259.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> PHP app detected
remote:
remote:  !     WARNING: No 'composer.json' found.
remote:        Using 'index.php' to declare app type as PHP is considered legacy
remote:        functionality and may lead to unexpected behavior.
remote:
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote:        NOTICE: No runtime required in composer.lock; using PHP ^5.5.17
remote:        - apache (2.4.29)
remote:        - nginx (1.8.1)
remote:        - php (5.6.33)
remote: -----> Installing dependencies...
remote:        Composer version 1.6.2 2018-01-05 15:28:41
remote: -----> Preparing runtime environment...
remote:        NOTICE: No Procfile, using 'web: heroku-php-apache2'.
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 13.8M
remote: -----> Launching...
remote:        Released v3
remote:        https://javeb-app.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy.... done.
To https://git.heroku.com/javeb-app.git
 * [new branch]      master -> master

          หลังจาก Deploy เสร็จแล้ว ให้ลองเข้าไปยัง URL เดิม (ตามตัวอย่างคือ https://javeb-app.herokuapp.com/) ก็จะพบว่าหน้าเว็บได้เปลี่ยนไปแล้ว อันดับถัดไปเราจะต้องเขียนโปรแกรมบอทจากนั้นก็ Deploy โค้ดขึ้นไปยัง Heroku.com ซึ่งโค้ดตัวนี้จะเป็นตัวที่รับข้อความมาจาก LINE แล้วทำการประมวลผล ดังนั้นเราจำเป็นต้องเอา URL ที่เก็บโค้ดดังกล่าวไปตั้งค่าใน LINE งั้นเราก็มาสร้างโค้ดบอทที่ว่าแบบคร่าว ๆ เพื่อเอา URL ไปตั้งค่ากันเถอะ

          ปล. ที่ผลลัพธ์จากการ push ยาว ๆ แบบนั้นเป็นเพราะไฟล์ที่เรา Deploy ยังขาดไฟล์บางไฟล์ไป ระบบเลยแจ้งเตือนขึ้นมา แต่เราไม่ต้องสนใจก็ได้ เพราะเราไม่ได้ต้องการสร้างเว็บขนาดใหญ่


สร้างไฟล์ javeb_bot.php


          ตามที่เกริ่นไว้แล้ว เราจะมาสร้างไฟล์บอทที่ชื่อว่า javeb_bot.php กัน แต่ว่าเราจะยังไม่เขียนให้ไฟล์นี้ทำการประมวลผลอะไรมากนัก เพราะเราต้องการนำไฟล์นี้ไป Deploy เพื่อให้ได้ URL สำหรับรับข้อความจาก LINE เท่านั้น ซึ่งเราจะกลับมาแก้ไขไฟล์นี้ภายหลัง .....งั้นเรามาสร้างไฟล์ javeb_bot.php กันเลย

<?php

echo "Hi! I'm your bot.";

?>
          ให้ก็อปปี้โค้ดข้างบนแล้วเซฟไฟล์ในชื่อ javeb_bot.php จากนั้นก็ add ไฟล์ commit แล้ว push ขึ้น Heroku.com ได้เลย

$ git add javeb_bot.php

$ git commit -m "Add file javeb_bot.php"
[master 8e26fa7] Add file javeb_bot.php
 1 file changed, 5 insertions(+)
 create mode 100644 javeb_bot.php

$ git push heroku master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 323 bytes | 161.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> PHP app detected
remote:
remote:  !     WARNING: No 'composer.json' found.
remote:        Using 'index.php' to declare app type as PHP is considered legacy
remote:        functionality and may lead to unexpected behavior.
remote:
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote:        NOTICE: No runtime required in composer.lock; using PHP ^5.5.17
remote:        - apache (2.4.29)
remote:        - nginx (1.8.1)
remote:        - php (5.6.33)
remote: -----> Installing dependencies...
remote:        Composer version 1.6.2 2018-01-05 15:28:41
remote: -----> Preparing runtime environment...
remote:        NOTICE: No Procfile, using 'web: heroku-php-apache2'.
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 13.8M
remote: -----> Launching...
remote:        Released v4
remote:        https://javeb-app.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/javeb-app.git
   e38b346..8e26fa7  master -> master

          ทดสอบผลลัพธ์ด้วยการเข้าไปที่ https://<ชื่อ App>.herokuapp.com/javeb_bot.php (ตามตัวอย่างคือ https://javeb-app.herokuapp.com/javeb_bot.php) เมื่อได้ผลลัพธ์ถูกต้องตามที่ต้องการแล้ว ต่อไปเราไปตั้งค่าใน LINE Developers console กันต่อ


ตั้งค่าเชื่อมต่อ Message API กับ Server


          ขั้นตอนนี้เราจะต้องเข้าไปที่ LINE Developers console เพื่อตั้งค่าให้ LINE Bot ส่งข้อความที่ได้รับจากผู้ใช้งานไปยัง URL โปรแกรมบอทของเรา

คลิกเลือก channel บอทที่เราสร้าง

เลื่อนลงมาล่าง ๆ ตรง Messaging settings

ตรง Channel access token (long-lived) ให้คลิกปุ่ม Issue จะแสดงดั่งรูปข้างบน
เลือกจำนวนชั่วโมงหรือ 0 เพื่อไม่กำหนดอายุของ Access Token แล้วคลิก Issue เพื่อสร้าง Access Token
(Access Token จะนำไปใช้ตอนส่งข้อความตอบกลับ ให้จดเอาไว้ด้วย)

ตรง Use webhooks ให้เลือกเป็น Enabled

ตรง Webhook URL ให้ใส่ URL ที่เราได้สร้างไว้เมื่อสักครู่

ส่วน Allow bot to join group chats เป็นตัวเลือกว่าจะยอมให้บอทเข้ากลุ่มแชทหรือเปล่า
ถ้ายอมให้เข้ากลุ่มได้ ให้เลือก Enabled


          หลังจากที่เราตั้งค่าใน LINE Developers console เสร็จเรียบร้อยแล้ว ถัดไปเราจะมาเขียนโค้ดเพื่อตอบกลับข้อความที่ได้รับจากผู้ใช้งานกัน


เขียนโค้ดบอทตอบข้อความกลับอัตโนมัติ


          เมื่อสักครู่เราได้ตั้งค่าให้ LINE Bot ส่งข้อความไปยัง URL ของเราเรียบร้อยแล้ว ทีนี้เราก็มาแก้ไขไฟล์ javeb_bot.php เพื่อให้ตอบข้อความกลับโดยอัตโนมัติ แต่ก่อนอื่นเรามาดูกันก่อนว่า LINE ส่งอะไรมาที่ไฟล์ javeb_bot.php บ้าง สิ่งที่ LINE ส่งมาคือ JSON ที่มีหน้าตาประมาณนี้

{
  "events": [
    {
      "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
      "type": "message",
      "timestamp": 1462629479859,
      "source": {
        "type": "user",
        "userId": "U4af4980629..."
      },
      "message": {
        "id": "325708",
        "type": "text",
        "text": "Hello, world"
      }
    }
  ]
}
          เมื่อเราได้รับ JSON แล้ว ก็ให้ประมวลผลสิ่งที่ได้รับก่อนจากนั้นค่อยส่งข้อความตอบกลับ โดยการสร้าง Request JSON ที่มีหน้าตาตามข้างล่างนี้และแนบค่า replyToken (ที่ได้รับมา) ส่งไปที่ Message API https://api.line.me/v2/bot/message/reply

{
  "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
  "messages": [
    {
      "type": "text",
      "text": "Hi! This is auto reply message."
    }
  ]
}
          ถึงตรงนี้ เราก็พอจะรู้คร่าว ๆ แล้วว่าต้องส่งข้อมูลอะไรบ้าง ถัดไปให้เปิดไฟล์ javeb_bot.php แล้วแก้ไขไฟล์ตามโค้ดข้างล่าง เพื่อให้บอทตอบกลับข้อความโดยอัตโนมัติ

<?php

$API_URL = 'https://api.line.me/v2/bot/message/reply';
$ACCESS_TOKEN = 'xxxxxxxxxx'; // Access Token ค่าที่เราสร้างขึ้น
$POST_HEADER = array('Content-Type: application/json', 'Authorization: Bearer ' . $ACCESS_TOKEN);

$request = file_get_contents('php://input');   // Get request content
$request_array = json_decode($request, true);   // Decode JSON to Array

if ( sizeof($request_array['events']) > 0 )
{

 foreach ($request_array['events'] as $event)
 {
  $reply_message = '';
  $reply_token = $event['replyToken'];

  if ( $event['type'] == 'message' ) 
  {
   if( $event['message']['type'] == 'text' )
   {
    $text = $event['message']['text'];
    $reply_message = 'ระบบได้รับข้อความ ('.$text.') ของคุณแล้ว';
   }
   else
    $reply_message = 'ระบบได้รับ '.ucfirst($event['message']['type']).' ของคุณแล้ว';
  
  }
  else
   $reply_message = 'ระบบได้รับ Event '.ucfirst($event['type']).' ของคุณแล้ว';
 
  if( strlen($reply_message) > 0 )
  {
   //$reply_message = iconv("tis-620","utf-8",$reply_message);
   $data = [
    'replyToken' => $reply_token,
    'messages' => [['type' => 'text', 'text' => $reply_message]]
   ];
   $post_body = json_encode($data, JSON_UNESCAPED_UNICODE);

   $send_result = send_reply_message($API_URL, $POST_HEADER, $post_body);
   echo "Result: ".$send_result."\r\n";
  }
 }
}

echo "OK";

function send_reply_message($url, $post_header, $post_body)
{
 $ch = curl_init($url);
 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_HTTPHEADER, $post_header);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_body);
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
 $result = curl_exec($ch);
 curl_close($ch);

 return $result;
}

?>

          ผลลัพธ์ที่ได้ก็คือ เมื่อเราพิมพ์อะไรไป บอทก็จะตอบกลับมาว่า "ระบบได้รับข้อความ (xxx) ของคุณแล้ว" ก็เป็นอันเสร็จเรียบร้อย หวังว่าบทความนี้จะช่วยให้เพื่อน ๆ เข้าใจวิธีเขียน LINE Bot อย่างคร่าว ๆ ซึ่งเป็นพื้นฐานที่จะนำไปต่อยอดพัฒนาเป็นบอทที่เก่ง ๆ ได้ สำหรับบทความนี้ก็ขอจบลงเท่านี้ ไว้พบกันใหม่บทความหน้า บ๊ายบายจ้า 😆