API คืออะไร?
API ย่อมาจาก Application Programming Interface คือการพัฒนาโปรแกรมสำหรับเป็นส่วนติดต่อเซอร์วิสของแอพพลิเคชั่น หรือโมดูลต่างๆ เพื่อให้คนภายนอกมาเรียกใช้งาน หรือกล่าวอย่างง่ายๆ ก็คือการเขียนโปรแกรมเพื่อให้บริการสำหรับให้คนอื่นมาเรียกใช้งาน ซึ่งแนวคิดเรื่องการสร้าง API เพื่อการใช้งานก็มีมาอย่างยาวนานแล้ว ยกตัวอย่างเช่นตั้งแต่ที่มีการสร้างระบบปฎิบัติการ (OS) ก็จะมีการติดต่อ API ของไดร์เวอร์อุปกรณ์ฮาร์แวร์ต่างๆ ของเครื่องคอมพิวเตอร์เพื่อเรียกใช้งานอุปกรณ์นั้นๆ ตามคำสั่งของนักพัฒนา (more…)
Month: August 2016
-
การพัฒนา API อย่างมืออาชีพ และทำไมต้อง RESTful Service
-
แก้ไข wordpress post แล้ว update ไม่ได้ แอดมินต้องแก้ไขอย่างไร
หลังจากย้าย WordPress site ไปลง ubuntu 16.04.1 ก็ได้เตรียมติดตั้งโปรแกรมต่าง ๆ แต่แล้วเมื่อลองจะแก้ไขบล็อก กลับทำไม่ได้ ขึ้นข้อความว่า
“The sysadmin.psu.ac.th page isn’t working
sysadmin.psu.ac.th is currently unable to handle this request.
HTTP ERROR 500”เกิดอะไรขึ้นหล่ะ แล้วเราจะต้องทำอย่างไร
ค้นหาเจอเว็บนี้ ที่บอกเราว่า ให้ลองเปิด DEBUG
https://wordpress.org/support/topic/http-error-500-internal-server-error-whole-blog-is-down“So to understand where the reason of 500 error is I suggest go to wp-config.php in the root of your website and add there two lines:
define(‘WP_DEBUG’, true);
@ini_set(‘display_errors’, 1);
After that you can see exactly place which linked with 500 error.
After fixing I suggest return it how it was by default (only one line)
define(‘WP_DEBUG’, false);”เมื่อใช้คำสั่งตรวจสอบ error.log ครั้งแรก ไม่เห็นอะไรเพิ่มเติม แต่พบ error 404 ของ plugin ที่ชื่อ WP Like Button ก็ลองปิด plugin นี้ดูเราจึงจะพบ error ก็เห็น error ต่าง ๆ ได้จากคำสั่งข้างล่างนี้
tail -f /var/log/apache2/error.log
Fatal error: Uncaught Error: Class ‘DomDocument’ not found in /var/www/wordpress/wp-content/plugins/google-sitemap-plugin/google-sitemap-plugin.php:144
ค้นหาต่อว่าทำไมจึงขาด DomDocument ก็เจอเว็บนี้
https://blog.namran.net/2009/03/10/php-fatal-error-class-domdocument-not-found-in-blabla/
แนะนำว่า“the solution turn out to be yum install php-xml”
ตรวจสอบดู เออนะ ไม่มี php-xml จริง ๆ ด้วย ด้วยคำสั่งนี้
dpkg -l | grep php-xml
dpkg -l | grep php7.0-xmlทีนี้เราก็ติดตั้ง php-xml ด้วยคำสั่ง
sudo apt install php-xml
จะได้
libxslt1.1 php-xml php7.0-xmlทำให้สามารถใช้งานได้ปรกติแล้ว ซึ่งในกระบวนการ post และ ppdate post นั้น ได้แก้ไข post ให้แล้ว เพียงแต่ว่ามันไปทำต่อที่ google-sitemap-plugin ไม่สำเร็จจึงแสดงเป็น error ออกมา
ขอบคุณเพื่อน ๆ ที่ช่วยกันแก้ไขเรื่องนี้ด้วยกันด้วยครับ
-
การตั้งค่า MaxRequestWorkers บน Apache ให้เหมาะสมกับจำนวนผู้ใช้
ปัญหาของ PSU Webmail ในช่วง 9-15 สิงหาคม 2559 ที่ผ่านมา คือ เมื่อเริ่มเข้าสู่เวลาราชการ ในวันทำการ พบว่า มีการตอบสนองที่ช้า บางครั้งต้องรอถึง 15-20 วินาที หรือ ผู้ใช้บางท่านแจ้งว่า Timeout ไปเลย หรือไม่ก็ใช้งานไปสักพัก ถูกดีดกลับมาหน้า Login ใหม่
แต่เมื่อพ้นเวลาราชการ พบว่าการตอบสนองก็เร็วขึ้นดังเดิม รวมถึงในช่วงวันหยุดก็เร็วอย่างที่ควรเป็น
ขอบคุณทาง NetAdmin ที่ทำระบบตรวจสอบไว้ที่หน้า Data Center เพื่อตรวจจับความเร็วในการตอบสนองบริการ PSU Webmail ด้วย SmokePing ผลที่ได้เป็นดังภาพ
จะเห็นว่า มีความหน่วงในการตอบสนอง เฉพาะในวันเวลาราชการเท่านั้น … ทำไม ???
ทำการตรวจสอบด้วยคำสั่ง
ps aux |grep apache| wc -l
เพื่อดูว่า มีจำนวน Apache อยู่กี่ Process พบว่า ในช่วงเวลาที่ระบบหน่วง มี Process เกือบคงที่ที่ 150 แต่ในช่วงที่ระบบทำงานได้เร็ว มีจำนวนประมาณ 50 process
จากการศึกษา พบว่า Apache2 ที่ใช้ MPM Prefork นั้น จะจำกัดค่า MaxRequestWorkers ไว้ โดยหากไม่กำหนดค่าใดๆจะตั้งไว้ที่ 256 แต่เมื่อตรวจสอบในไฟล์
/etc/apache2/mods-enabled/mpm_prefork.conf
พบว่า
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>ทำให้เพดานของจำนวน Process ไปจำกัดที่ 150 ดังที่ตรวจสอบเบื้องต้น เมื่อมีผู้ใช้มากขึ้นกว่าเดิม จึงทำให้ Process ไม่เพียงพอต่อความต้องการ เป็นผลให้เกิดการหน่วงขึ้น
จึงทำการแก้ไข MaxRequestWorkers เป็น 256 แล้ว Restart Apache
ผลทำให้ จำนวน Apache Process ขึ้นไปถึง 200 Process และการตอบสนองเร็วขึ้นตามที่ควรเป็นดังภาพ (หลังเวลา 14:45)
ทั้งนี้ การกำหนดจำนวน MaxRequestWorkers นั้น ต้องสัมพันธ์กับ RAM ของ Server ด้วย โดยมีสูตรคร่าวๆ คือ จำนวน RAM ในหน่วย MB หารด้วยขนาดของ Apache Process โดยเฉลี่ย
เช่น
มี RAM 4GB = 4 x 1024 = 4096
ขนาดเฉลี่ย Apache Process = 20
ดังนั้น MaxRequestWorkers = 4096/20 = 204
แต่จริงๆแล้ว ควรเผื่อ Memory ไว้ให้ OS และอื่นๆด้วย (อาจจะไม่เต็ม 4096) หากขยับค่า MaxRequestWorkers แล้วยังพบว่า จำนวน Process ยังขึ้นไปเต็มเพดานอยู่ ควรพิจารณาเพิ่ม Memory ด้วย
ประมาณนี้ครับ
UPDATE:
ผลการปรับแก้ไข ทำให้ เวลาในการตอบสนอง จากที่หน่วง 10 วินาที เหลือ เพียง 50 มิลลิวินาที ดังภาพ
-
การเชื่อมต่อ Thunderbird กับ Google Mail (ทั้ง Gmail และ Google Apps)
ในอดีต Thunderbird และ Mail Client อื่นๆสามารถติดต่อกับ Google Mail ได้โดยตั้งค่า Mail Server ให้ถูกต้อง และ username/password ก็สามารถใช้งานได้ แต่ในปัจจุบัน Google หันไปใช้ระบบ OAuth 2.0 ซึ่งการ Authentication หรือการใส่ username/password ต้องทำที่ Google เท่านั้น รวมถึงการทำ 2-Step Verification ด้วย (การใส่ One-Time Password นอกเหนือจาก username/password เป็นต้น) ทำให้ Thunderbird และ Mail Client ที่ยังไม่รองรับ OAuth 2.0 ไม่สามารถใช้งานได้
แต่ทาง Google Mail ยังเปิดให้สามารถใช้งานได้ โดยแบ่งเป็น 2 กรณีคือ ใช้หรือไม่ใช้ 2-Step Verification โดยตรวจสอบได้จาก
0. วิธีตรวจสอบว่าใช้งาน 2-Step Verification หรือไม่ โดยการไปที่ https://myaccount.google.com/security
หากไม่เปิดใช้ 2-Step Verification จะได้หน้าตาอย่างนี้
หากเปิดใช้ 2-Step Verification จะได้หน้าตาอย่างนี้
1. ผู้ใช้ที่ไม่ได้เปิดใช้งาน 2-Step Verification ให้ไปที่ https://myaccount.google.com/security#connectedapps
ภายใต้หัวข้อ Allow less secure apps ให้เปิดใช้งาน ดังภาพ
2. ผู้ใช้ที่เปิดใช้งาน 2-Step Verification ให้ไปที่ https://security.google.com/settings/security/apppasswords
แล้วเลือก Mail และ Windows Computer แล้วคลิก Generate ดังภาพ
จะได้ Password ที่ใช้ครั้งเดียวทิ้ง (ไม่ต้องไปจำ) ดังภาพ
หากวันหลังต้องการเลิกใช้ ก็กดปุ่ม Revoke ภายหลังได้จากนั้น เปิดให้ Google Account ใช้งาน IMAP ได้ โดยไปที่ https://mail.google.com/mail/u/0/#settings/fwdandpop
แล้วคลิก Enable IMAP ดังภาพ
แล้วคลิก Save Change ด้านล่างสุดท้าย ที่ Thunderbird ให้ตั้งค่า
Password: สำหรับคนที่ไม่ใช้ 2-Step Verification ให้ใส่ Password ของ Google Account เดิมลงไป ส่วนคนที่ใช้ 2-Step Verification ให้เอา Password ที่ได้มาใหม่ใส่ลงไปแทน
Incoming IMAP เป็น imap.gmail.com และ SSL เป็น SSL/TLS
Outgoing SMTP เป็น smtp.gmail.com และ SSL เป็น SSL/TLS
อย่าลืม ใส่ username ให้มี @gmail.com หรือ @psu.ac.th ในกรณีใช้ PSU GAFE ด้วย
แล้วคลิกปุ่ม Done ดังภาพเท่านี้ก็สามารถใช้งาน Google Mail จาก Thunderbird ได้แล้ว
-
เทคนิคการวัดความเร็วในการตอบอีเมลลูกค้า
ถ้ามี KPI ที่ต้องทำให้สำเร็จคือ “ร้อยละของปัญหาที่ตอบกลับลูกค้าภายใน 2 วันทำการ”
แล้ว … ช่องทางที่รับปัญหาจากลูกค้าคือ ทางอีเมล (ในที่นี้เป็นบริการอีเมลบนระบบของ Google Mail หรือ Gmail)
โดยการตอบกลับ คือ การ Reply กลับไปหาลูกค้า
เวลาที่นับคือ นับตั้งแต่เวลาที่อีเมลเข้ามาถึง จนกระทั่งมีการตอบกลับไปหาลูกค้าทางอีเมลฉบับแรกสำหรับคนที่ใช้ Google Mail หรือ Gmail อยู่ สามารถใช้ Google Sheets ทำรายงานได้ ตามขั้นตอนต่อไปนี้
1. ไปที่ drive.google.com (ให้ Login ด้วย Account ที่ต้องการด้วย)
2. สร้าง Google Sheets แล้วตั้งชื่อตามต้องการ เช่น Report
3. ไปที่เมนู Tools > Script Editor
4. ตั้งชื่อ Project ว่า report แล้ววางโค๊ดต่อไปนี้ลงไปfunction reportResponseTime() {
// ถ้าจะทำรายงานทั้ง Inbox ให้ uncomment บรรทัดต่อไปแทน
//var threads = GmailApp.getInboxThreads();// ถ้าจะทำรายงานเฉพาะ Lable ที่เตรียมไว้ ในที่นี้ใช้ Label “support-psuemail”
var threads = GmailApp.search(‘label:support-psuemail ‘);for (var i = 0; i < threads.length; i++) { // วนลูปแต่ละ Thread
if (threads[i].getMessageCount() > 1) { // สนใจเฉพาะ Thread ที่มีการตอบกลับเท่านั้น
var messages = threads[i].getMessages(); // Subject ของอีเมล
var d1= messages[0].getDate().getTime(); // เวลาที่อีเมลเข้ามา
var d2= messages[1].getDate().getTime(); // เวลาที่ตอบกลับฉบับแรก
var diff = (d2-d1)/(1000*60*60); // ระยะเวลาหน่วยเป็น ชั่วโมง// เขียนต่อท้าย Sheet ที่กำลังใช้งาน
SpreadsheetApp.getActiveSheet().appendRow([messages[0].getSubject(), messages[0].getDate(), messages[1].getDate(), diff])
}
}
}5. คลิก Run > reportResponseTime
(หากมีหน้าจอ Consense ต่างๆขึ้นมาให้ Allow ไป)
6. ผลจะปรากฏใน Sheet ที่เปิดไว้
7. จากนั้นสามารถเอาผลไปคำนวนต่อ เช่น ร้อยละของอีเมลที่ตอบสนองภายใน 48 ชั่วโมงหรือ 2 วัน เป็นต้น และสามารถตอบคำถามได้ว่า ทำไมบางฉบับใช้เวลาเกิน 48 ชั่วโมง (อาจจะเป็นเพราะติดเสาร์อาทิตย์เป็นต้น)*** กรุณาอ้างอิงด้วยนะครับ หากนำไปเผยแพร่ต่อ ***
-
Bash Bash Bash เต็มไปหมด…
ไมโครซอฟท์ปล่อยอัพเดต Windows 10 Anniversary Update แล้ว ถึงเวลาลอง bash shell บนวินโดวส์แล้วสิ…
- ติดตั้ง Windows 10 Anniversary ทำได้สองทาง
- หากใช้ Windows 10 อยู่แล้วก็ Windows update ได้เลย (รุ่น Professional อาจยังไม่มีให้ update)
- ต้องการติดตั้ง Windows 10 ใหม่ โหลดที่ https://licensing.psu.ac.th/tag/anniversary/ เลือกเอาเลยจะเอารุ่น Professional หรือ Education (สำหรับนักศึกษาต้องเป็นรุ่น Education)
- ติดตั้งไปจนเสร็จเรียบร้อย
- ต้องเชื่อมต่อ Internet ตลอดเวลาที่ติดตั้ง!!
- คลิกขวาที่ปุ่ม start เลือก Programs and Features
- คลิก Turn Windows Features on or off
- เลือก Windows Subsystem for Linux (Beta)
- เมื่อติดตั้งเสร็จแล้ว ให้เปิด developer mode คลิกที่ start menu แล้วพิมพ์ deve จะได้ดังรูป แล้วเลือก for developers settings
- ได้ดังภาพเลือก Developer mode
คลิก Yes
- อาจมีข้อความเตือนให้ restart ก็ restart ให้เรียบร้อย
- คลิกขวาที่ปุ่ม Start เลือก Command Prompt (Admin)
- พิมพ์ bash
- กด y แล้วกด enter
- จะเป็นการเริ่ม download รอจนครบ 100%
- ตั้ง username และ password
- เมื่อตั้งเสร็จเรียบร้อยก็พร้อมใช้งาน
- ทุกครั้งที่ต้องการใช้งานให้เรียก bash ได้ที่ปุ่ม start แล้วเลือก Bash on Ubuntu on Windows
- ทดสอบ ssh
- จบ… ขอให้สนุกครับ
- ติดตั้ง Windows 10 Anniversary ทำได้สองทาง
-
วิธีตรวจสอบเว็บไซต์ที่โดน Hack #18
ได้รับแจ้งจาก ThaiCERT ว่ามีเว็บไซต์ภายในโดเมนของมหาวิทยาลัย เผยแพร่ Code อันตราย ดังต่อไปนี้
จึงเข้าทำการตรวจสอบในเครื่องเว็บเซิร์ฟเวอร์ดังกล่าว พบการวางไฟล์ Backdoor ไว้ดังที่อธิบายใน วิธีตรวจสอบเว็บไซต์ที่โดน Hack #17 แล้วแต่ที่เห็นผิดปรกติ ก็เป็นใน access.log ของ Apache ซึ่งพบว่า มีการเรียกใช้ xmlrpc.php เป็นจำนวนมาก ดังภาพ
จากการตรวจสอบ พบว่า xmlrpc.php เป็นช่องทางให้สามารถเรียกใช้ Function ต่างๆผ่านทาง HTTP และเป็นช่องทางให้ App ต่างๆสามารถติดต่อกับ WordPress ได้ แต่ก็เป็นช่องทางให้เกิดการเดารหัสผ่านจำนวนมากได้เช่นกัน (Brute Force Attack) โดยสามารถทดลอง ส่ง XML ที่มีโครงสร้าตามที่ API กำหนด เช่น wp.getUsersBlogs [1][2][3] สามารถดูจำนวน Blog ที่ User คนนั้นๆเขียนขึ้นมา แต่ ต้องระบุ username/password ซึ่งตรงนี้จะเป็นส่วนที่ทำให้เกิดการ Brute Force ได้ ด้วยคำสั่งต่อไปนี้ เป็นการเดารหัสผ่านไปยัง http://localhost/blog/xmlrpc.php
echo "<methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value> <string>admin</string></value></param> <param><value><string>password</string></value></param></params></methodCall>" | POST http://localhost/blog/xmlrpc.php
หากสำเร็จ จะได้คำตอบมาอย่างนี้
หากเป็น WordPress รุ่นต่ำกว่า 4.0 เปิดให้ใช้ system.multicall ซึ่งทำให้สามารถเดารหัสผ่านจำนวนมาก ใน 1 Request ทำให้ระบบตรวจจับได้ยาก ดังนั้น หากไม่จำเป็นต้องใช้ xmlrpc.php ก็สมควรปิดการใช้งานที่ระดับ Apache โดยสร้างไฟล์ /etc/apache2/conf-enabled/xmlrpc.conf มีข้อมูลเป็น
<FileMatch "xmlrpc\.php$">
Order Deny,Allow
Deny from All
</FileMatch>
จากนั้น Restart Apache ก็สามารถปิดการทำงานได้
Reference
[1] http://www.hackingsec.in/2014/08/wordpress-xml-rpc-brute-force-attack.html#
[2] http://blog.dewhurstsecurity.com/2012/12/11/introduction-to-the-wordpress-xml-rpc-api.html
[3] https://codex.wordpress.org/XML-RPC_WordPress_API