อัปเดต Stage Idol Calendar v16.5.1: จากปฏิทินดูตารางงานส่วนตัว สู่แพลตฟอร์ม

ต่อเนื่องจากบล็อกที่แล้ว ที่ผมเคยเล่าถึงจุดเริ่มต้นของโปรเจกต์ stage idol calendar ที่ทำขึ้นมาเพื่อแก้ปัญหาความวุ่นวายในการตามตารางงานไอดอล ตอนแรกก็กะว่าทำใช้เองขำๆ ตอบโจทย์ความต้องการส่วนตัวเป็นหลัก แต่ไปๆ มาๆ เมื่อนำไปใช้งานจริงอย่างต่อเนื่อง ตัวระบบมันก็โตขึ้นเรื่อยๆ ตาม Requirement ที่เพิ่มเข้ามา จนตอนนี้ลากยาวมาถึงเวอร์ชัน v16.5.1 เรียบร้อยแล้วครับ

จากระบบ Event-timetable ธรรมดาๆ ตอนนี้มันกลายร่างเป็น “แพลตฟอร์ม” ไปแล้ว วันนี้เลยอยากมาอัปเดตฟีเจอร์ใหม่ๆ และเล่าเบื้องหลังแนวคิดการพัฒนาที่ผมสนุกไปกับมันในช่วงที่ผ่านมาให้ฟังกันครับ

  1. ยกระดับหน้าตาบ้านใหม่ และแถบ Live Now
    – หน้าแรกของระบบถูกรื้อทำใหม่ให้ดูโปรขึ้นในสไตล์ Ticket-Marketplace มี Hero Carousel พร้อมปฏิทินขนาดย่อม และที่ผมชอบเป็นพิเศษคือการทำแถบ Live Now ที่จะโชว์ว่าตอนนี้มีเวทีไหนกำลังแสดงอยู่ หรือกำลังจะเริ่มในอีก 60 นาที โดยตัวระบบจะดึงเวลาจากเครื่องของผู้ชมมาคำนวณและรีเฟรชตัวเองทุกๆ 30 วินาที
  2. ปรับการค้นหาใหม่ทั้งหมด
    – ระบบค้นหา Full-text Search: ใช้พลังของ SQLite FTS5 ทำให้สามารถค้นหา โปรแกรม, อีเวนต์ และศิลปิน ได้อย่างรวดเร็วและแม่นยำมากยิ่งขึ้น
  3. ระบบ Organizer
    – ปลดล็อกให้ผู้จัดงานดูแลตารางตัวเองได้ ซึ่งเมื่อก่อนคนอัปเดตตารางมีแค่ Admin หลัก แต่พอสเกลงานมันใหญ่ขึ้น ผมเลยพัฒนาระบบสิทธิ์ผู้ใช้งานและเพิ่ม Role “Organizer” เข้ามา ตอนนี้ผู้จัดงานสามารถล็อกอินเข้ามาสร้างเวที จัด Line-up และอัปเดตข้อมูลศิลปินในงานของตัวเองได้อย่างอิสระ โดยระบบจะล็อกการมองเห็นและการแก้ไขไว้เฉพาะอีเวนต์ที่ตัวเองรับผิดชอบเท่านั้น
  4. โอน Favorites ข้ามเครื่อง และ PWA Offline Cache
    – จำระบบ Anonymous Favorites แบบไม่พึ่ง Database จากบล็อกที่แล้วได้ไหมครับ? ปัญหาที่เจอต่อมาคือ พอคนเอาเว็บไป Add to Home Screen เป็น PWA บน iOS ตัว Safari มันดันแยกล็อก localStorage ออกจากเบราว์เซอร์หลัก ทำให้วงที่กด Follow ไว้หายหมด!
    – แทนที่จะยอมแพ้แล้วบังคับคนล็อกอิน ผมเลือกแก้ปัญหานี้ด้วย Cross-device Favorites transfer โดยการสร้าง QR Code ขึ้นมา ให้ผู้ใช้เอามือถืออีกเครื่อง (หรือแอปกล้อง) สแกนเพื่อส่งผ่าน Token Slug ไปตั้งค่าใน Environment ใหม่ได้เลย ง่ายและยังคงคอนเซปต์ Privacy ไว้ได้เหมือนเดิม
    – นอกจากนี้ผมยังทำ PWA Offline Cache แบบจริงจัง เพราะเข้าใจฟีลเวลาไปงานใหญ่ๆ ที่คนเยอะๆ แล้วเน็ตมือถือชอบพัง ตัว Service Worker จะช่วยคอยดึงข้อมูลจาก Cache มาแสดง ทำให้เรายังเปิดดูตารางวงที่ชอบต่อได้แม้เน็ตจะดับไปชั่วขณะก็ตาม
  5. การจัดการสถานที่ (Venues) และศิลปิน (Artists) ที่ดียิ่งขึ้น
    – ระบบ Venue Dedup: จัดการสถานที่จัดงานให้เป็นระเบียบขึ้น มีหน้า Profile ของสถานที่นั้นๆ พร้อมระบุพิกัดแผนที่ และสามารถแยกประเภท “แพลตฟอร์มออนไลน์” เพื่อซ่อนจากหน้าค้นหาสถานที่ได้
    – ข้อมูลศิลปินแน่นขึ้น: เพิ่มช่องทาง Social Media ของศิลปิน มีเครื่องมือ CLI สำหรับ Import ข้อมูลแบบ Bulk ได้, เพิ่มปุ่มกดซื้อตั๋วในแต่ละอีเวนต์ และระบบสามารถแสดงผลกลุ่มวงดนตรี (Parent group) ของศิลปินเดี่ยวได้
  6. Timezone ขั้นสุด และ Web Push Notification ฉบับทำเอง
    – เรื่องสุดท้ายที่ท้าทายมากคือการแจ้งเตือน (Notifications) ในเวอร์ชันนี้ผมได้เพิ่ม Web Push Notifications เข้ามาเสริมทัพจากเดิมที่มีแค่ Telegram ความตึงคือผมเลือกที่จะเขียนมันขึ้นมาด้วย pure PHP ล้วนๆ ไม่พึ่งพา Composer หรือ Library ภายนอกเลย (ยังคงคอนเซปต์ “ไม่มี Dependencies ที่ไม่จำเป็น” จากตอนที่แล้ว) โดยเขียนให้รองรับ VAPID และ RFC 8291 เต็มรูปแบบ
    – พร้อมกันนี้ยังได้แก้ปัญหา Timezone แบบ End-to-End ไม่ว่าผู้ใช้งานจะอยู่ที่ไหน ระบบจะปรับเวลาให้ตรงกับ Local Time เสมอ คราวนี้ไม่ว่าจะคอยตามตารางเวที หรือจะตั้งแจ้งเตือนรอตารางมีคิวจะเปิดไลฟ์สด ระบบก็จะเด้งเตือนล่วงหน้า ไม่มีพลาดแน่นอน

ส่วนอื่นๆ ที่ไม่ใช่ความสามารถของคนทั่วไป แต่เสริมให้ระบบแข็งแรงขึ้น อย่างหลังบ้านมี Audit Log บันทึกประวัติ และรองรับ 2FA (TOTP) ถือว่ามาไกลกว่าจุดเริ่มต้นที่แค่อยากทำปฏิทินดูตารางงานเองไปมากเลยครับ

สำหรับนักพัฒนาที่ติดตามอยู่
– เนื่องจากการเดินทางจากเวอร์ชัน 7 มาถึง 16 มีการเปลี่ยนแปลงโครงสร้างฐานข้อมูลไปหลายส่วน (เช่น การเพิ่มฟิลด์รูปภาพ, เพิ่มระบบสิทธิ์ผู้ใช้งาน, ระบบ FTS5 ฯลฯ)
– ตรวจสอบรายการ Files changed ได้จาก Release note ของ v16.5.1
– ในฝั่ง database แนะนำให้ backup database ของเก่าไว้ก่อน แล้ว เข้าไปที่ไฟล์ setup.php
– กดปุ่ม “Run All Migrations” ตัวสคริปต์จะจัดการปรับโครงสร้างฐานข้อมูลทุกอย่างให้โดยอัตโนมัติ
– รันคำสั่ง php sync-sw-version.php เพื่ออัปเดต Service-worker PWA cache ให้ตรงกับเวอร์ชันปัจจุบันของแอปพลิเคชัน

ใครที่สนใจเอาไปใช้งาน จัดงานอีเวนต์ งานคอนเสิร์ตที่มีหลายเวที หรืออยากเข้าไปดูซอร์สโค้ด ก็ยังสามารถเข้าไปดาวน์โหลดและ Contribute กันได้ที่ GitHub – stage-idol-calendar (v16.5.1) เหมือนเดิมครับ!

ใครอยากลองว่ามันทำอะไรได้บ้างก็ที่นี่ครับ https://idoltrack.thaicyberpoint.com/

 

สร้างปฏิทินงานไอดอลใช้เอง

ก่อนอื่น ต้องบอกหากหายจากการเขียน blog ไปเป็นปี แล้วโผล่มาก็เขียนอะไรก็ไม่รู้ แต่ทนๆ อ่านหน่อยนะ 🤣

จุดเริ่มต้น: ความวุ่นวายของคนตามไอดอล

ผมตามไอดลอสายจิกะ (坂道) มาสักพักใหญ่ ๆ ซึ่งคนที่ตามวงเหล่านี้รู้ดีว่า ตารางงานมันเยอะมากและกระจัดกระจาย มีหลายวง หลายช่วงเวลา เราในฐานะผู้ติดตามก็แค่อยากรู้ว่า "วงที่ชอบขึ้นเวทีกี่โมง? และซ้อนทับกับใครบ้าง หากมีหลายเวที" และงานที่ทำให้ผมประสบปัญหามากที่สุดคืองาน Japan Expo ที่ CTW เมื่อเดือนกุมภาพันธ์ที่ผ่านมา โดยงานก็ไม่ได้ให้ข้อมูลที่ดูได้ง่ายนัก ผมจึงทำระบบนี้ขึ้นมาใช้งานเอง ซึ่งก็ได้รับความสนใจจากเพื่อนๆ แฟนคลับอยู่พอสมควร

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

Idol Stage Timetable คืออะไร

stage-idol-calendar คือระบบปฏิทินอีเวนต์แบบ Open Source ที่ผมออกแบบมาเพื่อจัดการตารางงานแสดงไอดอลโดยเฉพาะ ตอนนี้ใช้งานจริงอยู่ที่ Idol Track — Live Idol TH และยังเอาไปประยุกต์ใช้งานได้หลากหลายอีกด้วย

สิ่งที่มันทำได้ มีอะไรบ้าง:

ตารางงาน

  • 3 โหมดการดู — List View (ตารางปกติ), Gantt Chart (Timeline เห็นว่าเวทีไหนซ้อนกัน), และ Calendar View (ปฏิทินรายเดือน สำหรับกิจกรรมสตรีมออนไลน์)
  • Multi-Event รองรับหลายงาน — เปลี่ยนงานผ่าน Event Picker Modal แบบ Card Grid ค้นหาได้ กรองตามสถานะ (กำลังจัด / กำลังจะมา / จบแล้ว)
  • Homepage Calendar — ปฏิทินบนหน้าแรก กดวันไหนก็เห็นว่ามีงานอะไรบ้าง พร้อมลิงก์ไปดูตาราง

กรอง & ค้นหา

  • Advanced Filtering — กรองตามศิลปิน, เวที, ประเภทโปรแกรม (Stage/Booth/Meet & Greet ฯลฯ) หรือพิมพ์ค้นหาคำ
  • Quick Filter Badges — เห็นชื่อศิลปินหรือประเภทงานในตาราง กดที่ Badge ได้เลย มันจะเพิ่ม Filter ให้ทันที ไม่ต้องไปเปิด Dropdown
  • Program Type System — ระบบประเภทโปรแกรม (free-text + autocomplete) แสดง Badge สีฟ้าบนชื่อรายการ

ศิลปิน & ติดตาม

  • Artist Profile — หน้าโปรไฟล์ศิลปินแต่ละคน รวมทุกงานที่เคยขึ้น หากเป็นวงก็แสดงสมาชิกวง และชื่อ Variant/Alias
  • Also appears in — ส่วนท้ายหน้าบอกว่าศิลปินจากงานนี้จะไปออกงานอื่นอีกไหม พร้อมลิงก์ข้ามไป
  • Anonymous Favorites — Follow ศิลปินโดยไม่ต้อง Login ไม่ต้องสมัคร Account ระบบสร้าง URL ส่วนตัวให้ Bookmark
  • My Upcoming Programs — หน้าส่วนตัว รวมโปรแกรมที่กำลังจะมาจากศิลปินที่ Follow ทั้งหมด พร้อม Mini Calendar กดดูรายวันได้
  • My Favorites — หน้ารวมศิลปินที่ Follow ไว้ แยกส่วน เดี่ยวหรือกลุ่ม เรียง A→Z หรือ Z→A ได้ กด Unfollow ได้ในคลิกเดียว
  • Artist Reuse System — ศิลปินคนเดียว Record เดียว ใช้ซ้ำได้ทุกงาน รองรับชื่อ Variant/Alias

Export & Subscribe

  • Export .ics — ดาวน์โหลดตารางที่กรองแล้วเป็นไฟล์ .ics (iCalendar) เอาไปใส่ Google Calendar, Apple Calendar ได้ทันที มี Alarm แจ้งเตือน 15 นาทีก่อนเริ่ม
  • Live Subscription Feed — Subscribe ผ่าน webcal:// แล้วปฏิทินจะ Auto-Sync เมื่อตารางเปลี่ยน ไม่ต้อง Export ใหม่ รองรับทั้ง Apple Calendar, Google Calendar, Outlook, Thunderbird
  • Artist Feed — Subscribe ติดตามรายศิลปิน ปฏิทินจะรวมทุกงานของศิลปินคนนั้นให้ สมาชิกวงก็มี Feed แยกสำหรับงานในนามของวง
  • Personal Feed — Subscribe ติดตามเฉพาะศิลปินที่ Follow ไว้ รวมทุกอีเวนต์ในลิงก์เดียว

แชร์ & แสดงผล

  • Save as Image — กดปุ่มเดียว ได้ภาพ PNG เก็บบนมือถือ (Render ฝั่ง Server ด้วย PHP GD ไม่พึ่ง JS) ไปแชร์ใน Twitter/Line ได้เลย รองรับ 3 ฟอนต์ (Thai/Latin, CJK, Symbol) และเปลี่ยนสีตามธีม
  • Live Stream Links — โปรแกรมที่มี Stream URL จะแสดงไอคอนแพลตฟอร์ม (📷 IG / 𝕏 / ▶️ YouTube / 🔴) พร้อมปุ่ม "เข้าร่วม"
  • Request Changes — ผู้ชมส่ง Request เพิ่ม/แก้ไขโปรแกรมได้ มี Rate Limit 10 ครั้ง/ชม.

ภาษา & ธีม

  • รองรับ 3 ภาษา — ไทย, อังกฤษ, ญี่ปุ่น (日本語) เปลี่ยนแล้วทุกส่วนอัปเดตทันที รวมถึงปฏิทิน วันเดือน และ Modal ต่าง ๆ
  • 7 ธีมสี — Sakura 🌸 (ค่าเริ่มต้น), Ocean, Forest, Midnight, Sunset, Dark, Gray — ตั้งได้ทั้งระดับ Global และ Per-Event
  • Site Title & Disclaimer — เปลี่ยนชื่อเว็บ และข้อความ Disclaimer ได้จากหน้า Admin ไม่ต้องแก้โค้ด

สำหรับผู้จัดงาน (Admin)

  • Full CRUD — จัดการโปรแกรม, อีเวนต์, ศิลปิน, Credits, Contact Channels ครบจบในหน้า Admin
  • Bulk Operations — เลือกหลายรายการแล้ว Edit/Delete ได้ทีเดียว สูงสุด 100 รายการ
  • Bulk Import Artists — Import รายชื่อศิลปินทีละ 500 คน พร้อมกำหนดกลุ่มได้
  • ICS Upload & Import — อัปโหลดไฟล์ .ics แล้ว Preview ก่อน Import ได้ รองรับ field พิเศษอย่าง X-PROGRAM-TYPE แล้วรองรับ Variant/Alias ของ Artists เวลา import จะ auto assign Artists ได้เลย
  • Backup/Restore — Backup ฐานข้อมูล มี Auto-backup ก่อน Restore ทุกครั้ง
  • Setup Wizard — ติดตั้งผ่าน Wizard 6 ขั้นตอน รองรับ 2 ภาษา (TH/EN) ไม่ต้องแตะ CLI ก็ได้

เบื้องหลังฟีเจอร์ที่ผมภูมิใจ

Anonymous Favorites — เพราะแค่อยากรู้ว่าวงตัวเองขึ้นกี่โมง

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

หลักคิด: ไม่มี Account แต่ต้อง Secure

ผมออกแบบให้ระบบ Favorites ทำงานโดยไม่มี Database สำหรับ User เลย ไม่มีตาราง users ไม่มี Login ทั้งหมดทำงานผ่าน Token-Based System บน File Storage

กระบวนการทำงานคือ:

  1. สร้าง Token — เมื่อผู้ใช้กด Follow ศิลปินคนแรก ระบบจะสร้าง UUID v7 (time-ordered UUID ที่ sort ตาม timestamp ได้) แล้วนำไป Sign ด้วย HMAC-SHA256 โดยใช้ Secret Key ที่เก็บไว้ฝั่ง Server

  2. Slug = UUID + HMAC ตัดสั้น — ถ้าใครแก้ UUID แล้ว HMAC ไม่ตรง ระบบจะ Reject ทันที ป้องกันการ Enumerate URL ไปดู Favorites ของคนอื่น

  3. เก็บเป็นไฟล์ JSON แบบ Sharded — ข้อมูล Favorites ของแต่ละคนเก็บเป็นไฟล์ .json บนโครงสร้าง Sharded Directory เพื่อกระจายไฟล์ไม่ให้โฟลเดอร์เดียวมีไฟล์เป็นหมื่น โดยข้อมูลในไฟล์ก็แค่ Array ของ Artist ID ที่ Follow ไว้

  4. localStorage เป็นแค่ Shortcut — Slug จะถูก Save ลง localStorage ของ Browser ด้วย Key หนึ่ง เพื่อให้ครั้งหน้าเปิดเว็บมา ระบบรู้ว่าเป็นคนเดิม แล้วแสดงเมนูระบบ Favorites ที่มุมบนซ้ายของทุกหน้า — โดยที่ localStorage ไม่ใช่ Source of Truth จริง ๆ มันเป็นแค่ Cache ฝั่ง Client ข้อมูลจริงอยู่ที่ไฟล์ JSON บน Server

  5. TTL 365 วัน + Auto-Touch — ไฟล์ .json มีอายุ 1 ปี แต่ทุกครั้งที่เข้ามาดูหน้า My Favorites หรือ My Upcoming Programs ระบบจะ Touch ไฟล์ (อัปเดต mtime) ให้นับ 365 วันใหม่ ตราบใดที่ยังเข้ามาใช้อยู่ ข้อมูลจะไม่หาย

  6. Garbage Collection แบบ Probabilistic — ฟังก์ชัน cleanup จะสุ่มรันทุกครั้งที่มี Request เข้ามา (ด้วยความน่าจะเป็นต่ำ) เพื่อลบไฟล์ที่หมดอายุออก ไม่ต้องตั้ง Cron Job แยก

Recovery UX — ไม่ต้องเปิด DevTools

ปัญหาที่เจอคือ ถ้า Token ใน localStorage หมดอายุ หรือ User เคลียร์ Browser Data หน้า My Favorites จะเปิดไม่ได้ ตอนแรกต้องเปิด DevTools ลบ key ใน localStorage เอง ซึ่งไม่ User-Friendly เลย ผมเลยเพิ่ม Recovery UX — เมื่อ Token ไม่ Valid ช่วยให้คนใช้งานแก้ไขได้ด้วยตัวเอง นอกจากนี้ยังมี Silent Self-Healing — ทุกครั้งที่แสดงเมนู Favorites มันจะไปเช็ค Slug กับ Server เบื้องหลัง ถ้าได้ 400/404 กลับมา (Token หมดอายุหรือไม่มีอยู่) ก็จะลบข้อมูลใน key จาก localStorage และเอาปุ่มออกเงียบ ๆ ไม่ต้องรอให้ User เจอหน้า Error

ทำไมไม่ใช้ Database? กับระบบ Favorites

เพราะหลักการของโปรเจกต์นี้คือ "ไม่มี Dependencies ที่ไม่จำเป็น" ระบบทั้งหมดรันบน SQLite ตัวเดียว ถ้าเพิ่มตาราง Users + Favorites ลง SQLite มันก็ทำได้ แต่จะเกิดปัญหาอื่น — ต้องมี Session Management สำหรับ Anonymous User, ต้อง GC Session ที่หมดอายุ, ต้อง Handle Race Condition ตอน Write พร้อมกัน (SQLite Lock) สำหรับข้อมูลที่ไม่ Critical อย่าง Favorites List การใช้ File-Based Storage + HMAC Validation มันง่ายกว่า เร็วกว่า และ Scale ได้ดีพอสำหรับ Use Case นี้ (เผื่อรองรับการใช้ Object storage ในอนาคตด้วย จะได้สเกลได้)

สรุปแล้ว Favorites ของแต่ละคนเป็นแค่ไฟล์ .json ขนาดไม่กี่ร้อย Bytes ที่อยู่ในโฟลเดอร์ที่ Protected ด้วย (Deny from all) อ่านไม่ได้จาก Web โดยตรง ต้องผ่าน API เท่านั้น ซึ่ง API ก็ Validate HMAC ทุก Request

สิ่งที่ต่อยอดจาก Favorites

พอมี Favorites แล้ว ผมก็ต่อยอดฟีเจอร์ได้อีกหลายตัว:

  • My Upcoming Programs — รวมโปรแกรมจากศิลปินที่ Follow ทุกอีเวนต์ เรียงตามวันเวลา มี Mini Calendar กดดูรายวันได้
  • My Favorites Page — แยกส่วน Solo / Group Artists เรียง A→Z / Z→A ได้ กด Unfollow ได้ทันที
  • Personal ICS Feed — Subscribe ผ่าน webcal แล้วปฏิทินมือถือจะรวมทุกงานของศิลปินที่ Follow ไว้ให้อัตโนมัติ Admin เพิ่มโปรแกรมใหม่ ปฏิทินก็อัปเดตเอง
  • Group Programs Auto-Include — ถ้า Follow ศิลปินที่เป็นสมาชิกกลุ่ม ระบบจะรวมโปรแกรมของกลุ่มเข้ามาใน Feed และ My Upcoming ให้ด้วย ไม่ต้อง Follow กลุ่มแยก
  • Persistent Nav Shortcuts — ทุกหน้าของเว็บจะแสดงเมนู Favorites ที่มุมบนซ้าย (ถ้ามี key ใน localStorage) กดข้ามไปหน้า Favorites หรือ Upcoming ได้ทันที

ทั้งหมดนี้ทำงานได้โดยไม่มี User Account ไม่มี Login ไม่มี Password — แค่ URL เดียวที่ Bookmark ไว้

Server-Side Image Export — แชร์ตารางสวย ๆ โดยไม่พึ่ง JavaScript

ตอนแรกผมใช้ html2canvas แต่มันมีปัญหาเรื่อง layout บนมือถือกับบนคอมพิวเตอร์มันไม่เหมือนกันเลยเปลี่ยนมา Render ฝั่ง Server ด้วย PHP GD ทั้งหมด สร้าง Three-Font Architecture ที่แยก Thai/Latin, CJK (ญี่ปุ่น/จีน), และ Symbol ออกจากกัน ระบบจะวิเคราะห์แต่ละตัวอักษรแล้วเลือกฟอนต์ที่ถูกต้อง ภาพที่ได้จะเปลี่ยนสีตามธีมของแต่ละงานด้วย มี Cache 1 ชม. เพื่อไม่ให้ Server หนัก

Live Stream Links — เพราะยุคนี้งานไอดอลไม่ได้มีแค่ On-site

หลายค่าย หลายวงมีตารางงานให้เมมเบอร์มี Live ไม่ว่าจะ IG Live, X Spaces หรือ YouTube Live ผมเลยเพิ่มระบบ Stream URL เข้าไป

ICS Feed ที่ต่อสู้กับ Outlook

เรื่องนี้สนุก ตอน Implement Subscription Feed ผมเจอบั๊กที่ทำให้ Outlook ลบอีเวนต์ทั้งหมดออกจากปฏิทินทุกรอบที่ Sync เพราะ ORGANIZER;CN="..." มีการ Escape เครื่องหมาย Comma ผิดวิธี (RFC 5545 QUOTED-STRING ไม่ใช้ Backslash Escaping) Outlook Parser เจอ Backslash แปลก ๆ ก็ Reject ทั้งไฟล์ แล้วก็เคลียร์ข้อมูลเก่าออก สุดท้ายแก้โดยเอา ORGANIZER ออกจาก VEVENT ไปเลย เพราะมันเป็น Optional นอกจากนี้ยังต้องจัดการ Line Folding ให้ถูกตาม RFC 5545 (ทุกบรรทัดเกิน 75 bytes ต้องตัด โดยไม่ตัดกลาง Multi-byte character) และแก้ CATEGORIES Delimiter ที่ Escape Comma ผิดทำให้ Outlook รวมศิลปินหลายคนเป็นชื่อเดียว ทุกอย่างมี Test ครอบคลุมหมด

ทำไมถึงเลือก PHP + SQLite + Vanilla JS (ไม่มี Framework)

หลายคนอาจสงสัย ทำไมไม่ใช้ React, Next.js หรือ Framework อะไรสักตัว

คำตอบง่าย ๆ คือ: ผมอยากให้มันเบา, Deploy ง่าย, ใครจะเอาไปใช้ก็แค่มี PHP กับ SQLite ไม่ต้อง Build, ไม่ต้องหา Database Server แยก จะรันบน Shared Hosting ราคาถูก ๆ ก็ได้ หรือจะรันผ่าน Docker ก็มี docker-compose ให้พร้อม

ตัว SQLite เหมาะกับระบบแบบนี้มาก เพราะข้อมูลไม่ได้เยอะขนาดต้องไปใช้ PostgreSQL/MySQL ที่มันยิ่งใหญ่เกินไป แต่เร็วกว่าอ่าน .ics ไฟล์ตรง ๆ ประมาณ 10-20 เท่า

สู่ Open Source

โปรเจกต์นี้เกิดจากความต้องการส่วนตัว 100% ผมอยากมีที่เดียวที่ดูตารางงานไอดอลได้ง่าย ๆ แต่พอทำเสร็จ ผมคิดว่ามันน่าจะมีประโยชน์กับคนอื่นด้วย ไม่ว่าจะเป็นผู้จัดงานที่อยากมี Timetable ให้ผู้ชม หรือแฟนคลับที่อยากจัดการข้อมูลงานของตัวเอง เลยเปิดเป็น Open Source ภายใต้ MIT License ใครจะเอาไปใช้ ดัดแปลง หรือแม้แต่ใช้เชิงพาณิชย์ก็ได้เลย

สิ่งที่อยากทำต่อไป

  • หน้ารายการศิลปินและวง
  • รองรับ Multi-timezone ให้ดีขึ้น สำหรับคนที่ตามงานจากญี่ปุ่นมาไทย
  • ระบบ Notification แจ้งเตือนก่อนงานเริ่ม
  • เชื่อมข้อมูลจากแหล่งต่าง ๆ แบบ Semi-auto เช่น ดึงจากเว็บทางการ แต่ลำบากสุดเพราะตอนนี้ทำด้วย OCR และ prompt ที่ทำไว้เป็น template เพื่อให้ได้ .ics โยน import ได้ทันที
  • รองรับ PWA เพื่อใช้งานแบบ Offline บนมือถือได้

ลองใช้กันดู

ลอง Star ⭐ ให้กำลังใจกันได้ หรือจะ Fork ไปใช้กับงานอีเวนต์ของตัวเองก็ยินดีมาก ๆ ครับ

🌸 Made with ❤️ for event organizers and idol fans everywhere

 

PHP 5.4 กำลังจะหมด Security support และ End of Life ในเดือนกันยายน 2015 นี้

เมื่อปีก่อน PHP 5.3 นั้นก็หมดช่วง Security support  และ End of Life ไปตั้งแต่เดือนสิงหาคม 2014 แล้ว โดย version สุดท้ายคือ 5.3.29

มาปีนี้ PHP 5.4 ก็ตามมาติดๆ โดยจะหมด Security support และ End of Life ในเดือนกันยายน 2015 ที่จะถึงนี้เช่นกัน โดยใครที่จะอัพเกรดไป version ใหม่ในตอนนี้จากทั้ง PHP 5.3 หรือ PHP 5.4 ขอแนะนำให้อัพเกรดไปใช้ PHP 5.6 ไปเลย เพราะ PHP 5.5 จะหมดช่วง Security support  และ End of Life ในปีหน้านี้แล้วเช่นกัน ฉะนั้น อัพแล้วได้ support ยาวๆ ซึ่ง PHP 5.6 ยังคง support ไปอย่างน้อยๆ ก็ 2 ปี (End of Life ในสิงหาคมปี 2017)

ข้อมูลอื่นๆ

  • PHP 5.2 นั้น End of Life ไปตั้งแต่เดือนมกราคม 2011 (version สุดท้ายคือ 5.2.17)
  • PHP 5.3 นั้น End of Life ไปตั้งแต่เดือนสิงหาคม 2014 (version สุดท้ายคือ 5.3.29)
  • PHP 5.4 ในตอนนี้อยู่ในช่วง Security support เท่านั้น จะหมด support ในเดือนกันยายน 2015 นี้แล้ว (version ล่าสุด ณ วันที่โพสนี้คือ 5.4.40)
  • PHP 5.5 ยังอยู่ในช่วง Active support แต่จะหมดช่วง Active support ในเดือนมิถุนายน 2015 นี้ แล้วจะเข้าสู่ช่วง Security support เท่านั้น และจะหมด support ในเดือนมิถุนายน 2016 หรือปีหน้า (version ล่าสุด ณ วันที่โพสนี้คือ 5.5.24)
  • PHP 5.6 ตัวล่าสุด อยู่ในช่วง Active support แต่จะหมดช่วง Active support ในเดือนสิงหาคม 2016 (ปีหน้า) แล้วจะเข้าสู่ช่วง Security support เท่านั้น และจะหมด support ในเดือนสิงหาคมม 2017 หรือ 2 ปีข้างหน้า (version ล่าสุด ณ วันที่โพสนี้คือ 5.6.8)
  • PHP 7.0 จะออก RC version ในเดือนหน้า (มิถุนายน 2015) และ GA/Release ในเดือนตุลาคม 2015 นี้ โดยอ้างอิงจากแผนใน php.net

อ้างอิง

ส่วนใครยังอยากใช้ตัวที่ End of Life ไปแล้ว หรือเปิด options ใน php.ini ที่มีผลต่อความปลอดภัยของระบบ เอาตามที่สบายใจครับ

 

Windows Azure ตอนที่ 4 การติดตั้ง WordPress, การปรับแต่ง PHP และการตั้งค่าในการขยายระบบบน Windows Azure Web Sites

จากตอนที่แล้ว “Windows Azure ตอนที่ 3 การติดตั้ง Drupal บน Windows Azure Web Sites” นั้น จะไม่ขอพูดในบางส่วนที่เป็นการอธิบายซ้ำซึ่งอยู่ในขั้นตอนที่ 1 – 30 ซึ่งจะใช้การตั้งค่าที่เหมือนกัน (ใช้ในการอ้างอิงได้ทุก CMS ของ PHP ด้วยซ้ำไป)

โดยจากขั้นตอนที่ 1- 30 จากบทความที่แล้ว เราจะมีข้อมูลดังต่อไปนี้

  • FTP host name , username และ password สำหรับการ FTP/FTPS เข้าไปวางไฟล์
  • Endpoint Information (MySQL hostname) และ Access Credentials (username และ password) ของฐานข้อมูล MySQL จาก cleardb

เมื่อเราได้ข้อมูลครบก็ทำการโอนย้ายไฟล์ของ WordPress ที่ดาวน์โหลดได้จาก wordpress.org/download

image

สำหรับการ FTP ไปวางไฟล์ ถ้าไม่ใช้ client ที่ติดมากับ Windows ก็ใช้สามารถใช้ client ของเจ้าอื่นๆ ได้ อย่างตัวอย่างนี้ก็ใช้ CuteFTP 9.0 ในการอัพโหลดไฟล์ได้เช่นกัน

โดยนำไฟล์ไปวางไว้ที่ /site/wwwroot

2013-09-30_160404

ทำการเข้าหน้าแรกของตัวเว็บที่ติดตั้งไฟล์ WordPress จากข้อที่แล้ว

2013-09-30_160450

นำข้อมูล Endpoint Information (MySQL hostname) และ Access Credentials (username และ password) ของฐานข้อมูล MySQL จาก cleardb มากรอกในหน้า database connection details นี้

2013-09-30_160551

สั่ง Run the install เพื่อติดตั้งฐานข้อมูลลง cleardb

2013-09-30_160650

เมื่อติดตั้งฐานข้อมูลเรียบร้อยแล้ว ก็กำหนดข้อมูลต่างๆ ของเว็บที่ทำจาก WordPress รวมไปถึง Username และ Password สำหรับเข้าไปจัดการ WordPress เสียก่อน

2013-09-30_160736

เมื่อกำหนดค่าเรียบร้อยก็ให้เข้าระบบ Dashboard ลอง WordPress ได้ทันที

2013-09-30_160827

2013-09-30_160920

 

การปรับแต่ง PHP บน Windows Azure Web Sites

1. การเปิดสร้าง rewrite rules เพื่อใช้ Custom URL ของ WordPress

เข้าไปที่ Dashboard ของ WordPress แล้วเลือกเมนู Settings และไปเมนูชื่อ Permalink

เสร็จแล้วตั้งค่า Permalink ได้ตามที่ต้องการ เสร็จแล้วกด Save

2013-09-30_174545

เมื่อ FTP เข้าไป จะเห็นว่าตัว WordPress จะสร้าง web.config ขึ้นมาให้ โดยภายในจะมี rewrite rules ที่เราตั้งไว้

2013-09-30_174800

โดยภายหลังจากสร้างไฟล์แล้ว ถ้าเราต้องการปรับแต่ง rewrite rules เพื่อใช้ Custom URL ก็สามารถทำผ่านไฟล์ web.config ได้ทันที

 

การเพิ่ม PHP Extension ใน Windows Azure Web Sites

ใน Windows Azure Web Sites นั้นเป็นระบบปฎิบัติการ Windows Server 2012 และระบบให้บริการเว็บ Microsoft Internet Information Services 8.0 (IIS 8.0) ซึ่งทำงานร่วมกับ PHP ที่ Compile ผ่าน MSVC9 x86 และทำงานผ่าน FastCGI API อีกทั้งยังทำงานแบบ Non Thread Safety ไว้ด้วย

การเข้าไปหา extension ใน https://downloads.php.net/pierre/ นั้นจึงต้องใช้ extension ที่เป็น nts ที่ย่อมาจาก Non Thread Safety และเป็นการ Compile แบบ VC9 x86 เช่นกัน

จากตัวอย่าง ทางผู้เขียนยกตัวอย่างการติดตั้ง extension ที่ชื่อว่า Memcache ลงบน PHP 5.3.19 บน Windows Azure Web Sites โดยเลือกชื่อว่า php_memcache-2.2.6-5.3-nts-vc9-x86.zip

2013-10-01_000520

ทำการแตกไฟล์ php_memcache-2.2.6-5.3-nts-vc9-x86.zip ออกมา จะได้ไฟล์ php_memcache.dll เสร็จแล้วนำไฟล์ไปวางไว้ที่ /site/wwwroot/bin

2013-09-30_181824

เข้าไปที่ Dashboard แล้วไปที่ CONFIGURE

2013-10-01_001903

เลื่อนลงมาที่หัวข้อ app settings แล้วใส่ค่าดังต่อไปนี้

KEY ใส่ค่าเป็น PHP_EXTENSIONS

VALUE ใส่ค่าเป็น bin\php_memcache.dll

ถ้าหากมีการกำหนดค่าของ extension มากกว่า 1 ตัวให้ใช้ comma (,) ขั้นไปเรื่อยๆ เช่น

bin\php_memcache.dll,bin\php_mongo.dll

โดยไฟล์ extension.dll ต้องอยู่ใน directory “/site/wwwroot/bin” เพื่อความสะดวกในการจัดการ

2013-09-30_181747

เมื่อตั้งค่าเรียบร้อยแล้วให้กด Restart

2013-09-30_182337

รอจนกว่าสถานะ Restart จะสำเร็จ

2013-09-30_182321

เมื่อแสดงผล phpinfo ใหม่อีกครั้ง extension ที่ใส่ลงไปจะมาให้เราเห็นใน phpinfo

2013-09-30_181846

ลองทำสอบใช้งานได้ตามโค้ด้านล่างก็จะสามารถใช้งานได้

2013-10-01_002648

 

การปรับแต่งค่า PHP.ini ใน Windows Azure Web Sites แบบ global setting

ในบางครั้ง ค่าเริ่มต้นของ phpconfig ที่ Windows Azure Web Sites ให้มา อาจจะไม่เพียงพอ หรือไม่เหมาะสม เช่นการแสดงผลความผิดพลาดที่ปิดไว้ หรือขนาดไฟล์ที่ให้รองรับการอัพโหลดเข้ามาที่ Windows Azure Web Sites เพียง 20MB ที่น้อยเกินไป เป็นต้น เราสามารถตั้งค่าพวกนี้ใหม่ได้ด้วยการใช้ไฟล์ชื่อ .user.ini โดยอัพโหลดเข้าไปไว้ใน /site/wwwroot เพื่อให้ Windows Azure Web Sites ใช้ค่าในไฟล์ดังกล่าวแทนค่าเริ่มต้นของระบบ

image

จากตัวอย่างได้ทดลองเปิดการแจ้งเตือนความผิดพลาด และเพิ่มขนาดไฟล์ที่รองรับการอัพโหลดเป็น 100MB ด้วยการตั้งค่าด้านล่าง

; User Settings
display_errors=On
upload_max_filesize=100M

เมื่อตั้งค่าเรียบร้อยแล้วก็ Restart ตัว Windows Azure Web Sites เพื่อให้ระบบอ่านค่าใหม่อีกครั้ง

2013-09-30_182836

2013-09-30_182911

 

ลักษณะการขยายระบบบน Windows Azure Web Sites

การเข้าไปปรับแต่งเรื่องการขยายระบบบน Windows Azure Web Sites นั้นสามารถทำได้ที่ หน้า Portal ของ Windows Azure โดยเข้าไปที่ Dashboard ของ Web Sites นั้นๆ แล้ว ไปที่เมนู SCALE เพื่อเลือกตัวเลือกรูปแบบสำหรับการขยายระบบ ซึ่งใน Windows Azure Web Sites นั้นจะมีรูปแบบสำหรับการขยายระบบอยู่ 3 รูปแบบคือ Free, Shared และ Standard

1. Free – เป็นการนำเว็บของเราไปไว้บน Virtual Machine บนระบบประมวลผลแบบกลุ่มเมฆ และให้เราใช้งาน CPU เพียง 1 Core โดยเป็นการให้ใช้งานในรูปแบบแชร์ทรัพยากรในการประมวผล ซึ่งจะให้ใช้งานฟรีโดยให้ระยะเวลาในการประมวลผลเพียง 1 ชั่วโมงต่อวันเท่านั้น และไม่สามารถขยายการใช้งานออกไป ด้วยการเพิ่มอินสแตนซ์ไม่ได้

2013-09-30_171614

2. Shared – เป็นการนำเว็บของเราไปไว้บน Virtual Machine บนระบบประมวลผลแบบกลุ่มเมฆ และให้เราใช้งาน CPU เพียง 1 Core โดยเป็นการให้ใช้งานในรูปแบบแชร์ทรัพยากรในการประมวผล ซึ่งจะให้ใช้งานโดยให้ระยะเวลาในการประมวลผลเพียง 4 ชั่วโมงต่อวันเท่านั้น (240 นาที) แต่สามารถขยายการใช้งานออกไปด้วยการเพิ่มอินสแตนซ์ได้มากทีสุดถึง 6 อินสแตนซ์ หรือทำให้ทำงานประมวลผต่อเนื่องได้ 24 ชั่วโมงเลยทีเดียว (4 ชั่วโมง x 6 อินสแตนซ์)

การเลื่อนปรับค่าทำได้ที่หน้า SCALE ด้วยการเลือก WEB SITE MODE ไปที่ SHARED แล้วไปเลื่อนปรับ INSTANCE COUNT ที่ด้านล่างตามจำนวนที่ต้องการ

2013-09-30_171647

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

สำหรับตัวเลือก Standard นี้จะมีตัวเลือกคุณสมบัติของ Virtual Machine ดังนี้

COMPUTE INSTANCE NAME

VIRTUAL CORES

RAM

Small

1

1.75 GB

Medium

2

3.5 GB

Large

4

7 GB

การเลือกปรับค่าทำได้ที่หน้า SCALE ด้วยการเลือก WEB SITE MODE ไปที่ STANDARD แล้วไปเลื่อนปรับ INSTANCE SIZE ตามคุณสมบัติที่ต้องการ

image

เมื่อเราเลือก Web Sites ตัวใดตัวหนึ่งเป็น Standard แล้ว เราสามารถเลือกให้ Web Sites อื่นๆ ที่เรามีอยู่ มาใช้งานอินสแตนซ์นี้ร่วมได้ด้วย

2013-10-01_011214

เมื่อเราเลือกแล้วว่าจะให้ Web Sites ตัวไหนบ้างใช้งาน Standard ที่เรากำหนด ก็มาถึงขั้นตอนการกำหนดการขยายระบบตามโหลดของหน่วยประมลผล หรือช่วงเวลาที่เรากำหนดได้อัตโนมัติ หรือการทำ Autoscale

 

การกำหนดขยายระบบแบบแปร่ตามการโหลดของหน่วยประมวล

จากภาพตัวอย่างจะเพิ่มอินสแตนซ์ที่มีคุณสมบัติแบบ Small (1 core, 1.75GB Memory) ระหว่าง 1 – 4 อินสแตนซ์ขึ้นมาตามโหลดของตัว Virtual Machine ที่มีอยู่ โดยใช้การวัดจากการโหลดของหน่วยประมวลผลที่ Virtual Machine โดยตั้งค่าให้อยู่ระหว่าง 60 – 80% ความหมายของตัวต่ำสุด-สูงสุดคือ

1. ถ้าโหลดต่ำกว่า 60% ก็จะทำการลดอินสแตนซ์ลงจนถึงค่า INSTANCE COUNT ที่ตั้งไว้

2. ถ้าโหลดสูงถึง 80% จะสร้างอินสแตนซ์เพิ่มขึ้นมาเรื่อยๆ แต่ไม่เกินค่า INSTANCE COUNT ที่ตั้งไว้ จนกว่าโหลดจะลงมาในระดับต่ำกว่า 80%

image

 

การกำหนดขยายระบบแบบแปร่ตามช่วงเวลาที่ตั้งไว้

2013-09-30_171826

สิ่งแรกที่ต้องทำก่อนคือตั้งค่าเวลาที่จะใช้ในการขยายระบบ เพื่อกำหนดช่วงเวลา โดยไปที่ “set up schedule times

2013-09-30_171906

การตั้งค่า Set up schedule times นั้นมีตัวเลือก

1. Different scale settings for day and night – ให้สามารถแยกระหว่างเวลาทำงการ (day) กับเวลาเลิกทำการ (night)

2. Differnet scale settings for week days and weekends – ให้แยกเวลาระหว่างวันทำการ (weekdays; วันจันทร์-ศุกร์) กับวันหยุด (weekends; วันเสาร์-อาทิตย์)

3. Time ตั้งเวลาว่าเวลาทำการจะเริ่มต้นเมื่อไหร่

4. Time zone กำหนด Time zone ที่ใช้อ้างอิง

2013-09-30_172213

จากตัวอย่างเมื่อผมเลือกทั้งหมด โดยกำหนดว่าเวลาทำการคือ 8:00 ถึง 20:00 เป็นเวลาทำการ และเลือกตั้งให้ขยายระบบแยกกันระหว่างเวลาทำการ เวลาเลิกการ วันทำการและวันหยุด โดยเมื่อเราตั้งเสร็จแล้ว ที่ EDIT SCALE SETTINGS FOR SCHEDULE จะมีตัวเลือกเพิ่มมา 3 ตัวเลือก คือ Week Day, Week Night และ Weekend

Week Day (วันทำการจันทร์-ศุกร์ เวลา 8:00 – 20:00) จะเพิ่มอินสแตนซ์ที่มีคุณสมบัติแบบ Small (1 core, 1.75GB Memory) จำนวน 4 อินสแตนซ์ขึ้นมาคงที่ตลอดระยะเวลาดังกล่าว

2013-09-30_172445

Week Night(วันทำการจันทร์-ศุกร์ เวลา 20:01 – 7:59) จะลดอินสแตนซ์ที่มีคุณสมบัติแบบ Small (1 core, 1.75GB Memory) ลงเหลือจำนวน 1 อินสแตนซ์คงที่ตลอดระยะเวลาดังกล่าว

2013-09-30_172508

Weekend (วันทำการเสาร์-อาทิตย์ เวลา 00:00 – 23:59) จะปรับอินสแตนซ์ที่มีคุณสมบัติแบบ Small (1 core, 1.75GB Memory) กลับมาที่จำนวน 2 อินสแตนซ์คงที่ตลอดระยะเวลาดังกล่าว

2013-09-30_172549

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

 

การตั้งค่าขยายระบบแบบแปร่ผันตามโหลดของหน่วยประมวลและแปร่ตามช่วงเวลา

ทำการตั้งค่าเวลาที่จะใช้ในการขยายระบบ เพื่อกำหนดช่วงเวลา

1. ไปที่ “set up schedule times” ตามข้อที่ปรับแต่งเรื่องช่วงเวลาในการขยายระบบเสียก่อน

2013-09-30_172213

2. แล้วเลือก Week Day, Week Night และ Weekend ตามช่วงเวลาที่ต้องการปรับขยายระบบ

3. เลือก SCALE BY METRIC โดยเลือกที่ CPU จะมีตัวเลือก TARGET CPU ขึ้นมาเพิ่มเติมจาก INSTANCE COUNT ที่มีอยู่ก่อนแล้ว

Week Day (วันทำการจันทร์-ศุกร์ เวลา 8:00 – 20:00)

ระบบเพิ่มอินสแตนซ์ที่มีคุณสมบัติแบบ Small (1 core, 1.75GB Memory) จำนวน 2 – 6 อินสแตนซ์ขึ้นและลง โดยแปร่ตามการโหลดของหน่วยประมลผลตั้งแต่ 70 – 90 % ของระบบ

2013-09-30_172700

Week Night(วันทำการจันทร์-ศุกร์ เวลา 20:01 – 7:59)

ระบบเพิ่มอินสแตนซ์ที่มีคุณสมบัติแบบ Small (1 core, 1.75GB Memory) จำนวน 1 – 2 อินสแตนซ์ขึ้นและลง โดยแปร่ตามการโหลดของหน่วยประมลผลตั้งแต่ 70 – 90 % ของระบบ

2013-09-30_172833

Weekend (วันทำการเสาร์-อาทิตย์ เวลา 00:00 – 23:59)

ระบบเพิ่มอินสแตนซ์ที่มีคุณสมบัติแบบ Small (1 core, 1.75GB Memory) จำนวน 1 – 4 อินสแตนซ์ขึ้นและลง โดยแปร่ตามการโหลดของหน่วยประมลผลตั้งแต่ 70 – 90 % ของระบบ

2013-09-30_173237

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

 

Windows Azure ตอนที่ 3 การติดตั้ง Drupal บน Windows Azure Web Sites

ในตอนที่ 3 นี้ เราจะมาพูดถึงการติดตั้ง Drupal บน Windows Azure Web Sites กัน โดยต้องย้อนกลับไปสักหน่อยว่า Windows Azure Web Sites เป็นบริการแพลตฟอร์ม (PaaS) สำหรับให้เรานำเว็บไซต์ที่พัฒนาขึ้นมาไปไว้บนบริการประมวลผลแบบกลุ่มเมฆ ซึ่งจะมีระบบฐานข้อมูล พื้นที่ และระบบเครือข่ายที่ถูกติดตั้งไว้รองรับการใช้งานไว้พร้อม เรามีหน้าที่เพียงนำระบบที่พัฒนาและฐานข้อมูล ขึ้นไปติดตั้งและใช้งานได้ทันที

โดยสำหรับ Drupal นั้นสามารถติดตั้งและใช้งาน Windows Azure Web Sites ได้ทันทีโดยไม่ต้องปรับแต่งตัวโค้ดพื้นฐานใดๆ ซึ่งใน Windows Azure Web Sites นั้นได้รองรับ PHP ทั้ง versions ที่ 5.3 และ 5.4 ผ่าน PHP/FastCGI บน Internet Information Services (IIS) ใน Windows Server

สำหรับในการติดตั้งขึ้นบน Windows Azure Web Sites นั้น สามารถติดตั้งและนำระบบขึ้นได้ผ่านทาง FTP, FTPS, WebMatrix และ Git โดยจะทำการบันทึกตัวเว็บไซต์ของเราไว้ใน File System Storage ของตัว Windows Server ที่เรากำลังใช้งานอินสแตนซ์ตัวนั้นอยู่ โดยจำกัดพื้นที่ 1GB สำหรับแบบฟรีหรือแบบแชร์การใช้งาน (Free/Shared instance) ส่วนสำหรับอินสแตนซ์แบบจองโหลดการใช้งาน (Reserved instance) จะได้พื้นที่ถึง 10GB โดยถ้าต้องการใช้งานมากกว่านี้ทาง Microsoft แนะนำให้ใช้งานผ่าน Windows Azure Storage แบบ “บลอบ” (Blob, Binary Large Object) ซึ่งจะรองรับพื้นที่ให้บริการถึง 100TB ต่อ 1 บัญชีพื้นที่ข้อมูล

สำหรับการใช้งานฐานข้อมูลนั้นมีตัวเลือกในการใช้งานฐานข้อมูลอยู่ 2 แบบคือ ระบบการจัดการฐานข้อมูลเชิงสัมพันธ์ (RDBMS) และระบบฐานข้อมูลที่ไม่ใช่ภาษาสอบถามเชิงโครงสร้าง (NoSQL) โดยใน Drupal จะใช้ระบบการจัดการฐานข้อมูลเชิงสัมพันธ์ที่ชื่อ MySQL ซึ่ง Microsoft มีพันธมิตรที่ชื่อ ClearDB เพื่อให้บริการรองรับกับ MySQL ในชื่อของ ClearDB MySQL database cluster โดยระบบการจัดการฐานข้อมูลเชิงสัมพันธ์นี้จะทำงานบนระบบประมวลผลกลุ่มเมฆทั้งหมด

เรามาดูกันว่า การติดตั้ง Drupal เพื่อใช้งานบน Windows Azure Web Sites ทำกันอย่างไร

1. ทำการ Login เข้า Windows Azure Portal เสียก่อน โดยจะพบกับหน้า all items

1

2. เลือกที่ตัวเลือก WEB SITES ด้านซ้ายเพื่อดูรายการ web sites ที่มีอยู่ในระบบ Windows Azure ของเรา สำหรับการสร้างเว็บไซต์เพิ่มขึ้นใน Windows Azure ให้เลือกที่ NEW มุมซ้ายล่างของ Windows Azure Portal

2

3. จะมีตัวเลือกในการสร้างขึ้นมา ให้เลือก COMPUTE ตามด้วย WEB SITE และแนะนำให้เลือก CUSTOM CREATE

3

4. จะเปิดหน้าต่าง Create Web Site ขึ้นมา ในแต่ละช่องมีความหมายดังต่อไปนี้

URL ให้เลือก sub domain ที่จะใช้งานภายใต้ชื่อ .azurewebsites.net

SUBSCRIPTION เลือกบัญชีสำหรับใช้ในการคิดค่าใช้จ่ายของระบบ

REGION ระบุว่าจะให้ตัวไฟล์ที่เราพัฒานั้นไปอยู่ในพื้นที่ใดของศูณย์ข้อมูลของ Azure สำหรับประเทศไทย ใกล้ที่สุดคือ East Asia ซึ่งอยู่ที่ฮองกง

DATABASE เป็นตัวเลือกที่ระบุว่าจะมีการใช้ฐานข้อมูลหรือไม่ โดย Drupal ที่เราติดตั้งลงไปนั้นใช้ MySQL เราจึงเลือก Create a new MySQL database

DB CONNECTION STRING NAME ใช้ค่าเริ่มต้นคือ DefaultConnection

Publish form source control เป็นสำหรับใช้ในการดึงชุดคำสั่งโปรแกรมมาจาก source code control อย่าง SVN หรือ GIT มาติดตั้งและใช้ในการส่งชุดคำสั่งขึ้นไปในระบบ Windows Azure Web Site แทนการใช้ FTP ได้อีกทางหนึ่งด้วย

เมื่อกรอกข้อมูลทั้งหมดครบแล้วเลือกลูกศรไปด้านขวา เพื่อทำการตั้งค่าอื่นๆ ต่อไป

4

5. มาถึงขั้นตอนการสร้างฐานข้อมูล MySQL กัน ขอย้อนกลับไปนิดนึงว่า Microsoft นั้นมีพันธมิตรที่ชื่อ ClearDB เพื่อให้บริการรองรับกับ MySQL ในชื่อของ ClearDB MySQL database cluster เพราะฉะนั้นการตั้งค่าตรงนี้ในตัว Windows Azure Portal จะไปทำการสร้างให้ถึง ClearDB โดยเราไม่ต้องเข้าไปสร้างเองแต่อย่างใด

ในตัวช่องกรอกข้อมูลนั้นเพียงแต่กรอก ชื่อฐานข้อมูลในช่อง NAME และเลือกพื้นที่ที่ฐานข้อมูลนี้อยู่ในช่อง REGION ซึ่งแนะนำให้ใช้ในพื้นที่เดียวกับที่ตัวเว็บไซต์อยู่เพื่อความเร็วในการดึงข้อมูลข้ามระหว่างเครื่อง เพราะตัวพื้นที่เว็บไซต์ที่เราใช้กับฐานข้อมูลนั้นจะอยู่คนละเครื่องกัน

เมื่อตั้งค่าทั้งสองจบให้ติ๊กที่ “I agree …” เพื่อยอมรับข้อตกลงของ ClearDB แล้วคลิ้กที่เครื่องหมายถูก เพื่อทำการสร้างเว็บไซต์หนึ่งเว็บบน Windows Azure Web Sites

5

6. รอสถานะของการสร้างตัว web sites เพียงสักครู่หนึ่ง ก็จะมีรายชื่อของตัวเว็บไซต์ที่เราสร้างไว้ตั้งแต่ด้านบนเพิ่มขึ้นมาใน Windows Azure Portal ของเรา

เมื่อทุกอย่างสำเร็จให้เลือกที่ชื่อเว็บไซต์ที่เราได้สร้างขึ้นมาเพื่อเข้าไป dashboard ของเว็บไซต์ของเราใน Windows Azure Web Sites

6

7. ในหน้า dashboard จะเป็นส่วนหลักและสรุปว่ามีการทำงานอะไรบ้างเช่น CPU TIME, DATA IN/OUT, ERRORS และ REQUEST เพื่อใช้ในการปรับปรุงหรือใช้ตัดสินใจขยายระบบเมื่อมีการใช้งานหนักๆ ได้อย่างทันที โดยรองรับการรายงานเป็นแบบช่วงเวลาต่างๆ กันไป

7

8. สำหรับในส่วนอื่นๆ ในหน้า dashboard ก็มีส่วน

endpoint สำหรับเปิด-ปิด-ตั้งค่า การตรวจสอบการทำงานของตัวเว็บไซต์

autoscale status สำหรับใช้ในการขยายระบบได้อัตโนมัติเมื่อมีการใช้งานหนักๆ ได้ทันทีโดยไม่ต้องให้นักพัฒนาหรือผู้ดูแลมาปรับขยายด้วยตัวเอง

usage overview เป็นส่วนแสดงการใช้งานระบบต่างๆ ว่ามีโควต้าและการใช้งานไปเท่าไหร่แล้ว

linked resources เป็นส่วนที่แสดงการเชื่อมต่อกับระบบภายนอก ซึ่งในตัวอย่างจะเป็นว่าเราได้เชื่อมต่อกับ ClearDB ที่เป็น MySQL database ซึ่งเมื่อมีการแก้ไข หรือลบตัวเว็บไซต์นี้ออกจาก Windows Azure Web Sites ตัว linked resources เหล่านี้จะถูกแก้ไข-ลบเช่นกัน

quick glance เป็นส่วนของการให้ข้อมูลสถานะ ค่าสำหรับเข้าใช้งาน การตั้งค่าหรือโหลดตัวช่วยในการส่งไฟล์ต่างๆ เข้าไปในตัวระบบ

8

9. โดยเริ่มต้นแล้วนั้น Windows Azure WEeb Sites จะตั้งค่า username และ password สำหรับการใช้ FTP/FTPS ไว้ให้เราแล้ว แต่แน่นอนว่าถ้าใช้ publish profile ของ Windows Azure ซึ่งใน Microsoft Visual Studio นั้นรองรับก็จะสะดวกดี แต่เมื่อเราใช้งานผ่านเครื่องมืออื่นๆ ที่ไม่ได้รองรับ เราจึงต้องมากำหนดค่าต่างๆ เหล่านี้เอง โดยไปที่ Set up deployment credentials ในหัวข้อ quick glance

9

10. ตัว Windows Azure Portal จะแสดงหน้าต่างให้เรากำหนค่า username และ password สำหรับการ FTP/FTPS เข้าไปใช้งานแทนที่ค่าเริ่มต้นของระบบที่ได้กำหนดไว้ให้เราตั้งแต่ตอนสร้างบัญชีนี้ขึ้นมา

10

11

11. เมื่อเรากำหนดส่วนของการสร้างไฟล์ได้แล้ว ก็มาถึงการเข้าถึงส่วนของฐานข้อมูล MySQL กันบ้าง โดยให้ไปที่ โดยให้ไปที่หัวข้อ linked resources แล้วคลิ้กลิ้งค์เพื่อเลือกชื่อฐานข้อมูลที่เราได้กำหนดไว้ตอนเราได้เริ่มต้นสร้างขึ้นมาในข้อแรกๆ

12

12. ตัว Windows Azure จะเปิดหน้าต่างของ browser ใหม่ขึ้นมา แล้วพาเราไปหน้าเว็บ ClearDB เพื่อทำให้เราจัดการฐานข้อมูลนี้จากหน้าเว็บนั้นแทนใน Windows Azure Portal ของ Microsoft โดยในหน้าที่เราเปิดมาครั้งแรกจะเจอหน้า Performance ทันที

13

13. แน่นอนว่าเราต้องการข้อมูลส่วนของ hostname, username และ password ของ MySQL เพื่อนำไปติดตั้ง Drupal ซึ่งข้อมูลทั้งหมดจะอยู่ที่ Endpoint Information ที่อยู่ถัดไปอีก 2 เมนูจาก Performance

เข้ามาในหน้า Endpoint Information เราจะเห็น Hostname อยู่ในตาราง Cluster Gateway Information ที่อยู่ด้านบน พร้อมทั้งรายละเอียด Max connections และ Max Queries/Hour ซึ่งเป็นโควต้าสำหรับ Free Account ซึ่งมาพร้อมกับพื้นที่ให้ 20MB สำหรับ database จำนวน 1 ตัว

สำหรับ username และ password จะอยู่ที่ตาราง Access Credentials ที่อยู่ด้านซ้ายล่างของหน้า Endpoint Information

14

14. หลังจากข้อที่ 10. เราได้แก้ไข username และ password สำหรับการเข้าไป FTP/FTPS แล้ว เราก็มาดูข้อมูลสำหรับส่วนของ hostname ที่ใช้ในการเชื่อมต่อผ่าน FTP/FTPS โดยอยู่ในหัวข้อ Quick glance ข้อย่อย FTP HOST NAME และ FTPS HOST NAME เพื่อนำไปเชื่อมต่อสำหรับการนำไฟล์ต่างๆ ขึ้นไปบน Windows Azure Web Sites

15

15. เมื่อเราได้ข้อมูลที่จำเป็นทั้งหมดครบแล้ว ก็ถึงเวลาสำหรับการติดตั้งตัว Drupal โดยก่อนอื่น เข้า https://drupal.org/downlaod เพื่อเข้าไปดาวน์โหลดตัว drupal ตัวล่าสุดมารอไว้ในเครื่องของเราเสียก่อน

31

16. ทำการสร้างตัวเชื่อมต่อ FTP จาก Network Location บน Windows (อ้างอิง Windows 8) เสียก่อน

โดยไปที่ Computer (My Computer) แล้วเลือก Add a network location

หมายเหตุ:นักพัฒนาอาจจะใช้ FTP Client ตัวอื่นๆ ก็ทำได้เช่นกัน โดยอาศัยข้อมูลข้างต้นที่ได้เกริ่นไปก่อนหน้านี้ในการสร้าง FTP profile ของแต่ละ client

16

17. จะได้หน้าต่างต้นรับว่าเรากำลังจะสร้าง Network Location ใหม่บน Windows ให้กด Next

18. ในหน้านี้เป็นหน้าที่เลือกประเภทว่าเราจะสร้าง Network Location แบบใด ซึ่งตอนนี้เรามีเพียงแบบเดียวคือ Choose a custom network location ซึ่งนักพัฒนาบางคนอาจจะมีมากกว่านี้ แต่ให้เลือกตัวเลือกนี้ แล้วกด Next

17 18

19. ในหน้าต่อมานี้จะให้เราใส่ internet หรือ network address ให้เราเอาข้อมูล FTP HOST NAME ใน dashboard ของ ของ Windows Azure Web Sites มาใส่ในช่อง Internet or network address แล้วกด Next

20. หน้ากำหนด username ให้กรอก Username ที่อยู่ใน DEPLOYMENT / FTP USER ในหัวข้อ Quick glance ลงไปในช่อง Username แล้วกด Next

19 20

21. มาในหน้าของการตั้งชื่อ network location ก็ตั้งชื่อตามที่ต้องการแล้วกด Next

22. เป็นหน้าสรุปข้อมูลการเชื่อมต่อทั้งหมด แนะนำให้เลือก Open the network location when I click Finish. เมื่อเสร็จสิ้นทั้งหมดแล้วกด Finish

21 22

23. เมื่อกด Finish แล้ว File Explorer จะเปิดหน้าต่างใหม่เพื่อทำการเชื่อมต่อ ซึ่งจะเห็นหน้าต่าง Log on as ขึ้นมาเพื่อถาม username และ password เราจึงกรอก password ที่ได้กำหนดไว้ในข้อที่ 10. ลงไป และถ้าไม่ต้องการให้มีการถาม password ซ้ำอีกให้เลือก Save password แล้วจึงกด Log On

24. ถ้าทั้ง hostname, username และ password ตรงตามที่ได้ตั้งไว้ เราจะเข้ามาถึงภายใน Windows Azure Web Sites และพร้อมที่จะนำไฟล์เว็บไซต์ที่เราพัฒนานั้นๆ ขึ้นไปแล้ว

image 23

25. สำหรับ folder ที่ใช้ในการจัดเก็บไฟล์นั้น จะอยู่ที่ site\wwwroot ภายใน Windows Azure Web Sites เมื่อเราเข้าไป จะเจอไฟล์ hostingstart.html อยู่หนึ่งไฟล์

24

26. ทดสอบสร้างไฟล์ PHP มาหนึ่งไฟล์ชื่อ phpinfo.php เพื่อสร้างสอบว่าใช้งาน PHP ได้และมี PHP เป็น version อะไรจากใน site\wwwroot

27. เมื่อสร้างไฟล์เรียบร้อย เราก็เข้าไปที่ https://xxxx.azurewebsites.net/phpinfo.php เพื่อตรวจสอบ PHP version และการเข้าถึงตัวเว็บไซต์ที่เราสร้างนั้นถูกต้องหรือไม่ (ตัวอย่างคือ https://testdrupalweb.azurewebsites.net/phpinfo.php)

25 26

28. เมื่อทดสอบเสร็จแล้ว แน่นอนว่าเราต้องการใช้ PHP version 5.4 สามารถที่จะเข้าไปเปลี่ยนแปลง version ได้ที่ CONFIGURE ซึ่งอยู่ถัดจากเมนู DASHBOARD ของ Windows Azure Web Sites ไปอีกสองเมนู จะเจอ PHP VERSION เราสามารถปรับไปใช้ PHP version 5.4 ได้จากตัวเลือกนี้

27

29. เมื่อเลือก PHP VERSION เป็น 5.4 แล้ว ให้กด SAVE และรอจนกว่าสถานะการเปลี่ยนแปลงจะจบการทำงานที่ด้านล่าง

28

29

30. เมื่อสถานะการเปลี่ยนแปลงเสร็จสิ้น ให้ลอง refresh หน้า phpinfo.php ที่เราสร้างขึ้นอีกครั้ง จะเห็นการเปลี่ยนแปลงเป็น PHP version 5.4 แทนที่แล้ว

30

ข้อควรระวัง: ซึ่งแนะนำว่าเมื่อตรวจสอบเรียบร้อยแล้วให้ลบออกไป เนื่องจากใน Environment Variable ที่ชื่อ MYSQLCONNSTR_DefaultConnection มีข้อมูลการเชื่อมต่อฐานข้อมูลที่เป็น linked resources ที่เราได้สร้างไว้อยู่ จึงไม่ปลอดภัยที่จะมีไฟล์นี้คงไว้ในระบบของเรา

image

31. เมื่อตอนนี้เราปรับแต่งตัว version ของ PHP เรียบร้อยแล้ว ก็ได้เวลาในการนำไฟล์ Drupal ขึ้นไป โดยใช้ Network Location ของ File Explorer

วิธีก็ไม่ยากอะไร เราคลายไฟล์บีบอัดของ Drupal ออกมา แล้วทำการลากไปวางที่ site\wwwroot ที่ Network Location ที่เราได้สร้าง แล้วรอจนกว่าจะ copy ไฟล์ (ใน FTP Client ตัวอื่นๆ จะเรียกว่า upload) เข้าไปที่ Windows Azure Web Sites ที่เรามีบัญชีอยู่

32

32. เมื่อ copy ไฟล์เข้ามาที่ Windows Azure Web Sites ที่เรามีบัญชีอยู่เรียบร้อย ให้เปิดหน้าเว็บที่เราได้มีบัญชีอยู่ขึ้นมา ตัว Drupal จะพาเราเข้าหน้า install.php ให้ทันที ก็ทำการติดตั้งตามขั้นตอนของ Drupal ตามปรกติดังต่อไปนี้

ในขั้นตอนการเลือก profile ให้เลือก Standard แล้วกด Save and continue

33

33. เลือก language ให้เลือก English (built-in) แล้วกด Save and continue

34

34. ในส่วนของฐานข้อมูลนั้น

Database type ให้เลือก MySQL, MariaDB, or equivalent

Database name ให้กรอกข้อมูลที่ได้กรอกไว้ในข้อที่ 5. ลงไป

Database username ให้กรอกข้อมูลที่ได้ระบุไว้ในข้อที่ 13. ลงไป

Database password ให้กรอกข้อมูลที่ได้ระบุไว้ในข้อที่ 13. ลงไป

ให้ขยาย ADVANCED OPTIONS ออกมา แล้วแก้ไข Database host ให้กรอกข้อมูลที่ได้ระบุไว้ในข้อที่ 13. ลงไป

แล้วกด Save and continue

35

35. ถึงขั้นตอนการ install ตัว Drupal ในขั้นตอนนี้รอการติดตั้งสักพัก

36

36. เมื่อการติดตั้งจบ ให้ทำการกรอกข้อมูลของเว็บต่างๆ ลงไปให้ครบ

37

37. ในส่วนสำคัญคือ time zone ให้เลือก time zone ที่เหมาะสมกับพื้นที่ในการใช้งานให้ถูกต้อง แล้วกด Save and continue

38

38. การติดตั้ง Drupal เสร็จสมบูรณ์แล้วในขั้นตอน ให้คลิ้กลิ้งค์เข้าหน้าเว็บไซต์ผ่าน Visit your new site

39

39. จะเจอหน้าตาของ Drupal ที่คุ้นเคยและเราเป็น administrator ของระบบทันที

40

40. ตรวจสอบความเรียบร้อยอีกครั้ง แนะนำให้ไปที่ Reports และเลือกที่ Status report เพื่อตรวจสอบข้อมูลอื่นๆ ว่ามีการติดตั้งหรือค่าสิทธิ์การเข้าถึงที่ผิดพลาดหรือไม่อีกครั้ง

41

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

โดยในตอนหน้าจะมาพูดถึงการติดตั้ง WordPress บน Windows Azure Web Sites และการขยายระบบขึ้น-ลง (Scale up-down) เพื่อรองรับการโหลดของระบบที่เปลี่ยนแปลงตลอดเวลา