PHP/Java/Python – DevExperience https://www.unzeen.com :// Sun, 17 Nov 2019 03:10:35 +0000 en-US hourly 1 เขียนโปรแกรมอัพโหลดข้อมูลไปเก็บไว้ที่ Google Drive https://www.unzeen.com/article/3537/ https://www.unzeen.com/article/3537/#respond Fri, 17 Mar 2017 11:07:17 +0000 https://www.unzeen.com/?p=3537 พอดีผมทำ Google Drive API และเอาขึ้น Github เอาไว้ โดยสามารถดาวน์โหลดได้จาก Google Drive API บทความนี้จะเขียนอธิบายวิธีใช้นิดหน่อย จุดประสงค์ของการทำ API ชุดนี้ก็เพื่อจะทำโปรแกรมสำหรับอัพโหลดไฟล์จาก server ไปเก็บไว้ยัง Google Drive โดยอัตโนมัติ เพื่อทำการ backup ข้อมูล โดยใน API สามารถที่จะแสดงรายชื่อไฟล์และโฟลเดอร์, สร้างโฟลเดอร์ใหม่, ลบไฟล์และโฟลเดอร์ และอัพโหลดไฟล์เข้าไปยังโฟลเดอร์ที่กำหนดไว้ได้ หากใครต้องการเพิ่มความสามารถอื่นเข้าไป ก็สามารถอ่านวิธีเรียกใช้งาน API ได้จาก Reference ด้านล่างบทความนะครับ

ในการเรียกใช้งาน Service ของ Google API เราต้องทำการร้องขอ Access Token ไปยัง Server ของทาง Google เพื่ออนุญาตให้แอพที่เราสร้างสามารถเข้าถึง Service ที่เราระบุเอาไว้ได้ ซึ่งเมื่อเราได้ Access Token มาแล้วเราสามารถที่จะใช้ Access Token ตัวนี้ในการเรียกใช้ API ต่างๆ ได้ ซึ่งในบทความนี้เราจะทำการเรียกใช้ Google Drive API

Google Drive API

มาลองทดลองทำจริงเลยดีกว่าครับ เริ่มแรกเลยให้ทำการดาวน์โหลดโค้ดทั้งหมดจาก Github ลงมาก่อน https://github.com/LookHin/google-drive-api จากนั้นทำการเปิดใช้งาน Google Drive API โดยคลิกเข้าไปที่ Enable Google Drive API จากนั้นเลือกสร้างโปรเจคใหม่ หรือเลือกโปรเจคเก่าที่เรามีอยู่แล้วก็ได้

Google Drive API

คลิก Create credentials และเลือก OAuth client ID

Google Drive API

ในช่อง Application type ให้เลือกเป็น Other และช่อง Name ให้ใส่เป็นชื่อที่เราต้องการ และคลิก Create

Google Drive API

หลังจากคลิก Create แล้วระบบจะแสดง Client Id และ Client secret ขึ้นมาให้ ให้เรา copy รหัสทั้ง 2 ตัวนี้ไปใส่ในไฟล์ authorize.php และ example.php

$strClientId = "YOUR_CLIENT_ID";
$strClientSecret = "YOUR_CLIENT_SECRET";

Google Drive API

ทำการ Authorize โดยเรียก authorize.php จากบราวเซอร์ เช่น http://YOUR_SERVER/google-drive/authorize.php และทำการคลิก Allow เพื่อทำการอนุญาติให้แอพที่เราสร้างสามารถเข้าถึงข้อมูลใน Google Drive ได้

Google Drive API

หลังจากคลิก Allow แล้วระบบจะแสดง Refresh Token ขึ้นมาให้ ให้ทำการ copy รหัสตัวนี้ไปใส่ในไฟล์ example.php

$strRefreshToken = "YOUR_REFRESH_TOKEN";

Google Drive API

เพียงเท่านี้โปรแกรมของเรา ที่เราเขียนไว้ในไฟล์ example.php ก็พร้อมที่จะทำงานได้แล้วครับ แต่ก่อนอื่นมารู้จักกับ File Id และ Folder Id ที่ใช้ภายใน Google Drive กันก่อน ในระบบของ Google Drive จะอ้างอิงถึงไฟล์และโฟลเดอร์ต่างๆ ผ่านทาง Id ฉะนั้นเวลาเราจะสร้างโฟลเดอร์ใหม่ หรือทำการอัพโหลดเข้าไปในโฟลเดอร์ต่างๆ เราต้องรู้ก่อนว่าโฟลเดอร์นั้นมี Id เป็นอะไร โดยวิธีที่ง่ายที่สุดก็คือเปิดเข้าไปที่ Google Drive และคลิกเลือกไปที่โฟลเดอร์ที่ต้องการ เราจะเห็น Id ของโฟลเดอร์นั้นๆ แสดงเป็น URL ดังรูป

Google Drive API

ตัวอย่าง: จากตัวอย่างของโค้ด ผมทำตัวอย่างการแสดงไฟล์ สร้างโฟลเดอร์ ลบไฟล์และโฟลเดอร์ และอัพโหลดไฟล์ไว้ให้แล้ว ลองเล่นกันดูครับ

setAccessTokenFromRefreshToken($strRefreshToken);

// List File From Root Folder
$arrFile = $obj->ListFileAndFolder("root");
print_r($arrFile);

// # List File From Folder Id
//$arrFile = $obj->ListFileAndFolder("_PARENT_FOLDER_ID_");
//print_r($arrFile);

// # Create Folder In Root Folder
//$obj->CreateFolder("root", "_NEW_FOLDER_NAME_");

// # Create Folder In Parent Folder
//$obj->CreateFolder("_PARENT_FOLDER_ID_", "_NEW_FOLDER_NAME_");

// # Delete File & Folder
//$obj->Delete("_FILE_OR_FOLDER_ID_");

// # Upload File To Root Folder
// $arrResult = $obj->Upload("root", "no-face.png");
// print_r($arrResult);

// # Upload File To Parent Folder
// $arrResult = $obj->Upload("_PARENT_FOLDER_ID_", "no-face.png");
// print_r($arrResult);

?>

อ้างอิง :
https://github.com/LookHin/google-drive-api
https://developers.google.com/identity/protocols/OAuth2WebServer
https://developers.google.com/drive/v3/reference/files
https://developers.google.com/drive/v3/web/resumable-upload

]]>
https://www.unzeen.com/article/3537/feed/ 0
การสร้าง LINE Bot ด้วย LINE Messaging API (Official API) https://www.unzeen.com/article/3506/ https://www.unzeen.com/article/3506/#comments Mon, 06 Mar 2017 13:31:42 +0000 https://www.unzeen.com/?p=3506 ก่อนหน้านี้ผมเคยลองทำ LINE Bot เล่นบ้างอยู่เหมือนกัน แต่ตอนนั้น LINE เขายังไม่มี Official API ออกมาให้ ทำให้เราต้องแอบเล่นผ่าน Unofficial API ที่มีคนแกะออกมาจากตัวโปรแกรมของไลน์อีกที ข้อดีคือมันใช้กับ Account ธรรมดาของเราได้ แต่ด้วยความที่มันไม่ใช่ Official API ก็ไม่มีอะไรการันตีให้เราได้ว่ามันจะทำงานสมบูรณ์ หลังๆ มานี้ LINE เขาเอาใจ Developer มากขึ้น เขามี Official API ออกมาให้ใช้งานแล้ว แต่ว่าจะใช้งานกับ Account ธรรมดาไม่ได้ ต้องใช้กับ account ที่เป็น LINE@ เท่านั้น ซึ่งเราสมัครใช้งานได้ฟรีๆ อยู่แล้ว

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

มาเริ่มกันเลย ในการสร้าง LINE Bot ให้เราล๊อกอินเข้าไปที่ LINE Business Center และทำการกรอกข้อมูลและลงทะเบียนให้เรียบร้อย อันนี้ทำเองนะครับ พอดีผมไม่ได้ print screen หน้าจอเอาไว้ เข้าไปทำอีกรอบไม่ได้ ฮาาา

เมื่อลงทะเบียนเสร็จแล้วให้เข้าไปที่เมนู Service -› Messaging API และคลิกที่ปุ่ม Start using Developer Trial

อัพเดท: เนื่องจากทาง LINE มีการแก้ไขในส่วนของการลงทะเบียน Messenger API รูปในบทความนี้อาจจะไม่ตรงกับหน้าลงทะเบียนใหม่ ให้ท่านใช้บทความนี้เป็นแนวทางในการศึกษาและอ่านเอกสารและวิธีลงทะเบียนได้จากลิงค์นี้นะครับ https://developers.line.me/en/services/messaging-api/ ส่วนขั้นตอนการเขียนโปรแกรมยังสามารถใช้งานได้เหมือนเดิม

LINE Bot

ทำการตั้งชื่อบอท เลือกรูปภาพ และกรอกข้อมูลอื่นๆ ให้เรียบร้อย จากนั้นกดปุ่ม OK ด้านล่าง

LINE Bot

ตรวจสอบข้อมูลต่างๆ ให้เรียบร้อยแล้วกด Apply

LINE Bot

เมื่อสร้างเรียบร้อยแล้วให้คลิกที่ LINE@ Manager

LINE Bot

จากนั้นกดที่ปุ่ม “ใช้ API” และกด “ยืนยัน” (อ้าว ภาษาไทยได้ไงหว่า)

LINE Bot

จะเห็นว่าตอนนี้เราสามารถใช้งาน API ได้ 2 ฟังชั่นคือ REPLY_MESSAGE และ PUSH_MESSAGE โดยสามารถดูรายละเอียดการใช้งานทั้ง 2 ฟังชั่นนี้ได้จาก REPLY_MESSAGE และ PUSH_MESSAGE คลิกเข้าไปดูจะเห็นว่าเขียนไม่ยากครับ แค่รอรับและส่งข้อมูลกลับไปกลับมาเท่านั้น

ในหน้านี้จะเห็นว่าด้านขวามือมีชื่อของบอทของเราอยู่ พร้อมกับ LINE@ ID ของบอท เราสามารถแอ็ดเฟรนจาก ID นี้เลยก็ได้ หรือจะใช้ QR Code ในขั้นตอนถัดไปก็ได้ครับ และในส่วนของการตั้งค่าให้เลือก webhook เป็น “อนุญาต” และเลือก Bot เข้าร่วมกลุ่มแชท, ข้อความตอบรับอัตโนมัติ, คำทักทายเริ่มต้นสำหรับการเพิ่มเพื่อนใหม่ เป็น “ไม่อนุญาต” ทั้งหมด แต่ถ้าหากใครจะลองเปิดไว้ก็ได้นะครับ ทาง LINE เขามีระบบตอบรับข้อความอัตโนมัตไว้ให้อยู่แล้ว แทบไม่ต้องทำอะไรเพิ่มเลย เมื่อเลือกเสร็จแล้วกด “บันทึก” เมื่อกดบันทึกเรียบร้อยแล้วให้กดที่ LINE Developers ต่อได้เลยครับ เดียวเราต้องไปใส่ URL ของ webhook ในหน้านั้นอีกที

LINE Bot

ในหน้านี้จะเห็นว่ามี QR Code เราสามารถใช้ QR Code ตัวนี้เพื่อทำการแอ็ดเฟรนกับบอทได้เลยครับ หรือจะแอ็ดโดยใช้ LINE@ ID จากหน้าที่แล้วก็ได้ แต่ ID มันสุ่มมาให้อาจจะพิมพ์ตามยากหน่อย และในหน้าเดียวกันจะเห็นว่าในช่อง Webhook URL ยังไม่มีค่าอะไร ให้กด Edit

LINE Bot

ทำการใส่ Webhook URL ของเราลงไปครับ URL ตรงนี้จะเป็น URL ที่ใช้รับข้อความจาก LINE โดยจะต้องเป็น HTTPS เท่านั้นนะครับ

LINE Bot

หลังจากที่เราใส่ Webhook URL เข้าไปแล้ว ขั้นตอนถัดไปเป็นขั้นตอนการหา Access Token เพื่อเอาไปใช้กับโปรแรกมของเรา ให้คลิกเข้าไปที่ ISSUE ระบบก็จะแสดง Access Token ขึ้นมาให้

LINE Bot

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


หลังจากเขียนโค้ดและอัพโหลดขึ้นเซิฟเวอร์เรียบร้อยก็ลองทักบอทของเราได้เลยครับ มันตอบคำถามได้บ้างหละ

LINE Bot

ขึ้นตอนถัดไปเราจะทำระบบ Push message ฟังชั่นนี้เอาไว้ทำระบบแจ้งเตือนต่างๆ เช่นการแจ้งเตื่อนผู้บุกรุกจากอุปกรณ์ IoT หรือแจ้งเตือนราคาน้ำมัน ราคาทองอะไรก็แล้วแต่ โดยเราต้องใช้ ID ของผู้รับจากขั้นตอนที่แล้วในการส่ง เราอาจจะเก็บ User ID ลง Databsae เพื่อเอามาไว้ใช้ทีหลังอะไรก็แล้วแต่นะครับ แต่สำหรับโค้ดตัวอย่างนี้ผมจะใส่ User Id ลงไปตรงๆ (แก้ ACCESS_TOKEN และ USER_ID ให้เรียบร้อยและลองรันได้เลยครับ)


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

อ้างอิง :
https://developers.line.me/messaging-api/getting-started
https://developers.line.me/en/services/messaging-api/
https://developers.line.me/console/register/messaging-api/provider/
https://devdocs.line.me/en/

]]>
https://www.unzeen.com/article/3506/feed/ 7
การดาวน์โหลดวิดีโอจาก youtube, udemy, facebook โดยใช้ youtube-dl และ ffmpeg https://www.unzeen.com/article/3461/ https://www.unzeen.com/article/3461/#respond Tue, 14 Feb 2017 12:18:52 +0000 https://www.unzeen.com/?p=3461 เรื่องนี้สุ่มเสี่ยงที่จะผิดกฏหมาย ถึงแม้จะนำมาใช้งานส่วนตัวผมก็ไม่แน่ใจนัก แต่อย่างน้อยเรามาตกลงกันก่อนว่าเราจะดาวน์โหลดแค่งานที่เป็นสาธารณะ และศึกษาการใช้งานทูลนี้เท่านั้น (ตัดความรับผิดชอบเรียบร้อย) บทความนี้จะแสดงตัวอย่างการดาวน์โหลดวิดีโอจากเว็บต่างๆ อย่างเช่น youtube, udemy, facebook นะครับ โดยเราจะใช้โปรแกรม youtube-dl ในการดาวน์โหลด และใช้ ffmpeg ในการแปลงฟอร์แมตของไฟล์ จริงๆ ตัว youtube-dl มันก็มีให้ใส่พารามิเตอร์ให้เลือกฟอร์แมตของไฟล์นะครับ แต่สุดท้ายมันก็ไปเรียกใช้ ffmpeg ต่ออยู่ดี ซึ้งขั้นตอนในการแปลงฟอร์แมตเนี้ยก็ใช้เวลานานพอสมควร งั้นผมเลยแยกขั้นตอนการดาวน์โหลดและการแปลงฟอร์แมตของไฟล์วิดีโอออกจากกัน โดยเริ่มจากดาวน์โหลดวิดีโอมาก่อน จากนั้นค่อยมาทำการแปลงฟอร์แมตของไฟล์อีกที

ในขั้นตอนการติดตั้งจะแนะนำเฉพาะบน Windows เท่านั้นนะครับ สำหรับผู้ที่ใช้ Linux น่าจะมีพื้นฐานมากกว่าอยู่แล้ว และขั้นตอนการติดตั้งก็ไม่ยากนักคิดว่าคงทำกันได้หมด

ติดตั้ง youtube-dl โดยให้เข้าไปดาวน์โหลดที่ https://rg3.github.io/youtube-dl/ ให้คลิกไปที่เมนู Download และเลือก youtube-dl.exe หลังจากดาวน์โหลด ให้นำไปไว้ที่ c:\youtube-dl\

ติดตั้ง FFmpeg โดยเข้าไปที่ https://ffmpeg.org/download.html และเลือก Windows Packages จะมีลิงค์ไปหน้าดาวน์โหลดสำหรับ Windows ที่ https://ffmpeg.zeranoe.com/builds/ เมื่อดาวน์โหลดมาแล้วให้ unzip และนำไปไว้ที่ c:\ffmpeg\

youtube-dl-ffmpeg

จากนั้นทำการคอนฟิก Enviroment Variable Path ของ windows โดยให้เข้าไปที่ Control Panel -› System and Security -› System -› Advanced system Setting และเลือกที่ Enviroment Variables

youtube-dl-ffmpeg

ในส่วนของ System variables ให้เลือกไปที่ Path และเลือก Edit

youtube-dl-ffmpeg

ทำการเพิ่ม path ของ youtube-dl และ ffmpeg เข้าไปดังรูป

youtube-dl-ffmpeg

เมื่อเรียบร้อยแล้วให้ลองเปิด command และพิมพ์คำสั่งดังต่อไปนี้ เพื่อตรวจสอบ version กันก่อน ถ้าทุกอย่างเรียบร้อย น่าจะขึ้นประมาณนี้

youtube-dl --version
ffmpeg -version

youtube-dl-ffmpeg

และก่อนใช้งานทุกครั้งเราควรสั่ง youtube-dl -U เพื่อทำการ update โปรแกรมให้เป็น version ใหม่สุดอยู่เสมอ

youtube-dl-ffmpeg

สำหรับการดาวน์โหลดวิดีโอจาก youtube เราสามารถโหลดได้ทั้งแบบเป็น playlist และที่เป็นวิดีโอเดี่ยวๆ โดยสามารถใช้คำสั่งได้ดังต่อไปนี้

แบบเป็น playlist

youtube-dl --no-check-certificate --ignore-errors "https://www.youtube.com/playlist?list=PL6B3937A5D230E335"

แบบแยกเป็นรายวิดีโอ

youtube-dl --no-check-certificate "https://www.youtube.com/watch?v=YE7VzlLtp-4"

สำหรับ facebook ก็สามารถโหลดได้เช่นกันโดยใช้คำสั่งดังต่อไปนี้

youtube-dl --no-check-certificate "https://www.facebook.com/DevExp/videos/1378097708883662/"

และสำหรับวิดีโอที่เราซื้อคอร์สออนไลน์ไว้บน udemy เราสามารถโหลดทั้งคอร์สมาได้ โดยใช้คำสั่งดังต่อไปนี้

youtube-dl -u username -p password -o "%(chapter_number)s-%(chapter)s/%(autonumber)s-%(title)s.%(ext)s" "https://www.udemy.com/java-tutorial/"

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

ffmpeg -i old-video-file.mkv -vcodec libx264 -profile:v high -acodec aac ./new-mp4/new-video-file.mp4

หรือหากว่าต้องการแปลงทั้งโฟลเดอร์ให้ใช้คำสังดังต่อไปนี้

FOR /F "tokens=*" %G IN ('dir /b *') DO ffmpeg -i "%G" -vcodec libx264 -profile:v high -acodec aac "./new-mp4/%~nG.mp4"

อ้างอิง: https://github.com/rg3/youtube-dl/blob/master/README.md

]]>
https://www.unzeen.com/article/3461/feed/ 0
การเขียนโปรแกรมเพื่อวิเคราะห์รูปภาพโดยใช้ Google Cloud Vision API https://www.unzeen.com/article/3444/ https://www.unzeen.com/article/3444/#respond Thu, 09 Feb 2017 16:52:03 +0000 https://www.unzeen.com/?p=3444 Google Cloud Vision สามารถวิเคราะห์ภาพได้ 6 รูปแบบคือ Label, Text, Face, Landmark, Logo, Image Properties ขั้นตอนการวิเคราะห์คือเราต้องทำการ อัพโหลดภาพขึ้นไปที่ Cloud Vision API จากนั้นเราจะได้ค่ากลับมาเป็น JSON ง่ายมากบอกเลย! เราอาจจะเอาความรู้จากบทความนี้มาทำแอพเล่นก็ได้ เช่นว่า ให้ผู้เข้าร่วมกิจกรรมทำการอัพโหลดรูปขึ้นมา และให้ระบบตรวจสอบว่าเป็นภาพอะไร แล้วเอาค่าที่ได้มาทำเป็นแคปชั่นหรือแฮชแทก แล้วอัพโหลดรูปนั้นขึ้นไปที่ Instagram (ดูวิธีการได้จากบทความที่แล้ว) อะไรประมาณนั้น แล้วแต่จะจินตนาการเช่นเคย

ในการใช้งานแบบฟรีเราสามารถอัพโหลดได้ 4MB ต่อภาพ และใช้งานได้ฟรี 1,000 หน่วยต่อเดือน (หน่วยในทีนี้ผมเข้าใจว่าหมายถึงจำนวนการร้องขอการตรวจสอบ เช่นถ้า 1 ภาพเราต้องการให้ตรวจสอบทั้ง Text และ Landmark ก็จะนับเป็น 2 หน่วย) ถ้ามากกว่านั้นก็ต้องเสียตังค์ (ก็สมเหตุสมผล ใช้มากก็ต้องใช้เงินแก้ปัญหาไป)

ขั้นตอนการสมัครเข้าใช้งาน Google Cloud Vision API ให้เข้าไปที่ Cloud Platform Console และคลิกที่ปุ่ม CREATE PROJECT

Google Cloud Vision API

ตั้งชื่อโปรเจคและใส่ข้อมูลต่างๆ ให้เรียบร้อย

Google Cloud Vision API

จากนั้นทำการเปิดใช้งาน Cloud Vision API โดยคลิกที่ลิงค์นี้และเลือกโปรเจคที่เราสร้างไว้เมื่อสักครู่ Enable Cloud Vision API

Google Cloud Vision API

ขั้นตอนถัดไปให้สร้าง API Key โดยให้คลิกเข้าไปที่เมนูรูปแฮมเบอร์เกอร์ด้านซ้ายมือและเลือกไปที่ API Manager และคลิกไปที่เมนู Credentials จากนั้นให้ทำการคลิกที่ Create Credentials และเลือกเป็น API Key

Google Cloud Vision API

หลังจากนั้นเราจะได้ API Key มาชุดหนึ่ง ให้กด RESTRICT KEY และก็กด Save ในหน้าถัดไปเลยครับ

Google Cloud Vision API

หลังจากได้ API Key มาแล้ว เราก็มาถึงขั้นตอนการเขียนโปรแกรมหละ ให้ดาวน์โหลดตัวอย่างรูปภาพและโค้ดที่ผมเตรียมไว้ลงไปก่อนครับ google-cloud-vision-api.zip (รูปตัวอย่างผมขโมยมาจากเน็ท ฮาา) เมื่อโหลดมาแล้วจะเห็นไฟล์ google-cloud-vision.php อันนี้เป็นตัวอย่างโค้ดที่ผมเตรียมไว้ให้ ให้ทำการเปลี่ยน API_KEY เป็นของตัวเองนะครับ


จากนั้นสั่งรันโค้ด เราจะได้ค่าผลลัพธ์กลับมาเป็น JSON เป็นอันเรียบร้อย

Google Cloud Vision API

อ้างอิง : https://cloud.google.com/vision/docs/

]]>
https://www.unzeen.com/article/3444/feed/ 0
การอัพโหลดรูปภาพและวิดีโอขึ้น Instagram โดยใช้ PHP https://www.unzeen.com/article/3425/ https://www.unzeen.com/article/3425/#respond Wed, 08 Feb 2017 17:14:37 +0000 https://www.unzeen.com/?p=3425 ปกติแล้ว Instagram ไม่มี API ให้เราทำการอัพโหลดรูปภาพและวิดีโอขึ้นหรอกนะครับ ตัว Official API ของทาง Instagram ทำได้แค่ดึงข้อมูลรูปภาพและรายละเอียดที่เราอัพขึ้นไปแล้วเท่านั้น หากเราต้องการจะทำการอัพโหลดรูปหรือวิดีโอขึ้นไป เราต้องทำการ reverse engineering ต้องแกะดูเองว่าข้อมูลจากแอพที่ส่งไปที่เซิฟเวอร์มันรับส่งกันยังไง ถ้าเป็นอย่างแอพทั่วๆไป ที่เขาไม่ได้เน้นเรื่องความปลอดภัยมาก เราก็อาจจะใช้วิธีดักแพคเก็จของข้อมูล และเขียนโปรแกรมจำลองวิธีการรับส่งข้อมูลขึ้นมาเอง เพื่อทำการโพสข้อมูลไปที่เซิฟเวอร์ปลายทางก็ได้

แต่สำหรับกรณีของ instagram นี้ยากหน่อย เพราะเขาทำการ encrypt ข้อมูลด้วย secret key ที่อยู่ภายในแอพก่อนแล้วค่อยทำการส่งข้อมูลนั้นออกมา การหา secret key และวิธีเข้ารหัสอะไรนี้ผมเองก็ทำไม่เป็นหรอกนะ แต่พอดีว่าผมไปเห็นโค้ดของคนอื่นใน Github ที่เขาแกะข้อมูลทุกอย่างไว้หมดแล้ว แต่โค้ดเขาเยอะมาก มากเกินความต้องการของเรา ผมเลยเอาโค้ดของเขามารีไรท์ใหม่ และตัดให้เหลือแค่ส่วนที่ตัวเองต้องการใช้งาน นั้นคืออัพโหลดรูปปละวิดีโอ การแกะโค้ดคนอื่นก็ดีครับได้ทบทวนความรู้ตัวเองไปด้วย ถ้าใครสนใจอยากดูโค้ดของเขาก็เข้าไปดูได้ครับ โค้ดเขาอยู่ที่นี้ Instagram’s private API

บทความนี้สั้นๆ นะครับ แค่จะโชว์โค้ด และเดโมการอัพโหลดรูปและวิดีโอขึ้น instagram ให้ดู ส่วนการทำงานของโค้ดว่ามันทำงานยังไงก็ไปอ่านเอาเองครับ ไม่น่ายากเกินความพยายาม โดยคลาสที่ผมเขียนขึ้นมาใหม่จะไม่มีส่วนของการ crop รูปภาพ และแปลง format ของวิดีโอนะครับ ให้ไปทำกันเอาเอง โดยวิดีโอที่ผมทดสอบจะเป็น MP4 (H264)

อ่านตรงนี้ก่อนสำคัญมาก! การจะใช้งานสคริปนี้ได้เราต้องทำการปิดการใช้งาน Two-Factor Authentication ของ Instagram ก่อน โดยให้เข้าไปที่ https://www.instagram.com/accounts/two_factor_authentication/ จากนั้นเอาเครื่องหมายถูกหน้าคำว่า Two-Factor Authentication ออกดังรูป

instagram upload photo video

มาเริ่มเลย อย่างแรกเข้าไปเอาซอสโค้ดและตัวอย่างทั้งหมดมาจาก Github ที่ผมแก้ไขโค้ดและเอาขึ้นไว้ที่ https://github.com/LookHin/instagram-photo-video-upload-api

เมื่อโหลดมาหมดแล้วจะเห็นว่ามีไฟล์ทั้งหมดอยู่ 5 ไฟล์ดังนี้

example.php //ตัวอย่างโปรแกรม
instagram-photo-video-upload-api.class.php //คลาสที่เรียกใช้งาน
square-image.jpg //ตัวอย่างรูปภาพ ขอให้เป็นภาพสี่เหลี่ยมจัตุรัสนะครับ
square-thumb.jpg //ตัวอย่างรูปภาพ thumbnail ที่จะใช้กับวิดีโอ ขอให้เป็นภาพสี่เหลี่ยมจัตุรัสเช่นกัน
test-video.mp4 //ตัวอย่างวิดีโอ เป็นไฟล์ MP4 (H264)

เปิดไฟล์ example.php ขึ้นมา จะเห็นมีอยู่แค่ไม่กี่บรรทัด คือใช้เท่านี้จริงๆ ส่วนการทำงานเบื่องหลังจะอยู่ในไฟล์ instagram-photo-video-upload-api.class.php ทั้งหมด อย่างแรกเลยให้ทำการแก้ไข YOUR_IG_USERNAME และ YOUR_IG_PASSWORD เป็น username และ password ที่เราใช้ในการ login เข้า instagram ถ้าได้แก้ไขเรียบร้อยแล้วก็สั่งรันได้เลยครับ (ผมทดสอบบน PHP 5.6 และ PHP 7)

include_once("instagram-photo-video-upload-api.class.php");

// Upload Photo
$obj = new InstagramUpload();
$obj->Login("YOUR_IG_USERNAME", "YOUR_IG_PASSWORD");
$obj->UploadPhoto("square-image.jpg", "Test Upload Photo From PHP");

// Upload Video
$obj = new InstagramUpload();
$obj->Login("YOUR_IG_USERNAME", "YOUR_IG_PASSWORD");
$obj->UploadVideo("test-video.mp4", "square-thumb.jpg", "Test Upload Video From PHP");

เมื่อสั่งรันแล้ว เราจะได้รูปภาพและวิดีโอตัวอย่างไปขึ้นที่ Instagram ของเราแล้วครับ

instagram upload photo video

]]>
https://www.unzeen.com/article/3425/feed/ 0
เพิ่มความปลอดภัยให้ระบบล็อกอินบนเว็บด้วยการทำ 2 Step Verification https://www.unzeen.com/article/3033/ https://www.unzeen.com/article/3033/#respond Thu, 16 Oct 2014 05:37:48 +0000 http://www.unzeen.com/?p=3033 บทความนี้จะเป็นการแนะนำการใช้งาน Google Authenticator และทดสอบการทำ 2 Step Verification แบบ TOTP (Time-based One-time Password) เพื่อเป็นแนวทางในการทำระบบล็อกอินในหน้าเว็บไซต์ให้มีความปลอดภัยมากขึ้น โค้ดที่ใช้ทดสอบในบทความนี้จะเป็น PHP ที่สามารถโหลดได้ฟรีจาก Github หรือหากต้องการใช้ไลบรารีในภาษาอื่นเช่น Python, .NET หรือ HTML5 ให้ลองดูจากข้อมูลอ่างอิงจาก Wikipedia ในท้ายบทความนะครับ

อย่างแรกสุดให้ทำการติดตั้ง Google Authenticator กันก่อนครับ ถ้าใครใช้ Android หรือ iOS ก็โหลดกันจากสโตร์ของแต่ละค่ายได้เลย โดยค้นหาคำว่า Google Authenticator และทำการติดตั้งให้เรียบร้อย เมื่อติดตั้งแล้วจะได้หน้าตาประมาณนี้

Google Play
https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2

App Store
https://itunes.apple.com/en/app/google-authenticator/id388497605?mt=8

google-authenticator-2-step-verification

google-authenticator-2-step-verification

จากนั้นทำการโหลดไลบรารีจาก https://github.com/chregu/GoogleAuthenticator.php ทำการ unzip ให้เรียบร้อย เดียวเราจะใช้เฉพาะไฟล์ที่อยู่ในโฟลเดอร์ /lib

google-authenticator-2-step-verification

เขียนโปรแกรมเพื่อสร้าง Security Key ซึ่ง Key ที่ได้จะเป็นตัวอักษรภาษาอังกฤษกับตัวเลขรวมกัน 16 ตัว จากชุดตัวอักษรต่อไปนี้ “ABCDEFGHIJKLMNOPQRSTUVWXYZ234567” เราอาจจะสุ่มออกมา 16 ตัวเองก็ได้นะครับ

generateSecret();

echo $secret;

?>

google-authenticator-2-step-verification

นำค่า Security Key ที่ได้ไปสร้าง QR Code อันนี้ใครจะทำโปรแกรมสร้าง QR Code เองก็ได้ ซึ่งผมแนะนำให้สร้างเองดีกว่าอย่างน้อย Security Key ก็จะได้ไม่หลุดออกไปที่อื่น แต่ในบทความนี้จะใช้ทดสอบการทำงานเท่านั้น ฉะนั้นผมจะสร้างจากเว็บที่ให้สร้าง QR Code แบบออนไลน์เลยนะครับ ในทีนี้ผมจะใช้ http://qrcode.kaywa.com/

โดยให้ใช้สตริงต่อไปนี้ในการสร้าง QR Code

otpauth://totp/LABEL?secret=SECURITY_KEY&issuer=ISSUER_NAME

LABEL = ข้อมูลที่จะแสดงในโปรแกรม Google Authenticator ว่ารหัสนี้จะใช้กับอะไร
SECURITY_KEY = Security Key ที่เราสร้างจากขั้นตอนที่แล้ว
ISSUER_NAME = ชื่อหน่วยงานของเรา

จริงๆ ทั้ง LABEL และ ISSUER_NAME เราสามารถตั้งเป็นอะไรก็ได้นะครับ

จากตัวอย่างสตริงที่จะใช้สร้าง QR Code ของผมก็จะเป็น

otpauth://totp/www.unzeen.com?secret=DG4WCXVUVYENHLLS&issuer=2-Step-Login

เมื่อสร้างแล้วจะได้ QR Code ออกมาประมาณนี้

google-authenticator-2-step-verification

ทำการสแกน QR Code ที่ได้ เพื่อทำการเพิ่มข้อมูลลงในโปรแกรม Google Authenticator เมื่อเสร็จแล้วจะเห็นว่ามีรหัสของเราขึ้นมาแสดงที่หน้าของโปรแกรม Google Authenticator อย่างในรูป

google-authenticator-2-step-verification

ขั้นตอนสุดท้าย เขียนโปรแกรมเพื่อทำการตรวจสอบว่ารหัสที่ป้อนเข้ามาถูกต้องหรือไม่

checkCode("DG4WCXVUVYENHLLS",$_GET['code'])) {
    print "YES \n";   
} else {
    print "NO \n";
}

?>

google-authenticator-2-step-verification

อ้างอิง:
http://en.wikipedia.org/wiki/Google_Authenticator
https://github.com/chregu/GoogleAuthenticator.php
https://support.google.com/accounts/answer/1066447?hl=en

]]>
https://www.unzeen.com/article/3033/feed/ 0
การติดตั้ง FFmpeg และ FFmpeg-php สำหรับแปลง Video https://www.unzeen.com/article/2087/ https://www.unzeen.com/article/2087/#respond Sat, 09 Feb 2013 07:08:44 +0000 http://www.unzeen.com/?p=2087 วันนี้เราจะมาแนะนำการติดตั้ง FFmpeg เพื่อใช้สำหรับการแปลงไฟล์วิดีโอจากฟอร์แมตหนึ่งไปเป็นอีกฟอร์แมตหนึ่ง เช่นแปลงจาก .mov เป็น .flv เพื่อใช้สำหรับงานวิดีโอบนเว็บไซต์ โดยเจ้า FFmpeg เนี้ยรองรับฟอร์แมตของวิดีโอเยอะมากๆ คิดว่าน่าจะพอกับความต้องการของแต่ละคนเลยทีเดียว และเรายังมี ffmpeg-php ที่จะเป็น extension สำหรับเรียกใช้ FFmpeg จาก php ได้อีกด้วย (แต่ตอนนี้ความสามารถยังไม่เยอะมากนัก) หรือถ้าใครติดตั้ง FFmpeg แล้ว ต้องการจะทำเว็บรับฝากวิดีโอคล้ายๆ youtube โดยให้ผู้ใช้อัพโหลดไฟล์ฟอร์แมตอะไรขึ้นมาก็ได้ จากน้ันระบบจะแปลงไปเป็น .flv เพื่อใช้เล่นบนเว็บหรือจะแปลงเป็นฟอร์แมตอื่นก็ทำได้

อย่างแรกทำการเพิ่ม Repository ใหม่เข้าไปในระบบให้เรียบร้อย

# nano /etc/yum.repos.d/dag.repo

เพิ่มคำสั่งต่อไปนี้ในไฟล์ /etc/yum.repos.d/dag.repo

[dag]
name=DAG RPM Repository
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
enabled=1

ทำการ import GPG Key เข้าระบบ

# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt

สั่ง yum update สักรอบหนึ่ง

# yum update

ทำการติดตั้ง ffmpeg และไลบรารีทีเกียวข้องด้วยคำสั่ง yum

# yum install ffmpeg ffmpeg-devel ffmpeg-libpostproc

ขั้นตอนถัดไปให้ทำการติดตั้ง ffmpeg-php แต่ว่า ffmpeg-php ต้องการโปรแกรมและไลบรารีต่างๆดังนี้คือ php php-gd php-devel ความจำผมสั่นไม่แน่ใจว่าได้ติดตั้งไปหรือยัง งั้นเราก็สั่งติดตั้งซ้ำลงไปอีกรอบเลยหละกัน

# yum install php php-gd php-devel

ทำการดาวน์โหลดและติดตั้ง ffmpeg-php จาก http://sourceforge.net/projects/ffmpeg-php/files/ffmpeg-php/ โดยเลือกเอาเวอร์ชั่นล่าสุด

# cd /tmp
# wget http://sourceforge.net/projects/ffmpeg-php/files/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2/download
# tar -xjf ffmpeg-php-0.6.0.tbz2
# cd ffmpeg-php-0.6.0
# phpize
# ./configure
# make
# make install

ในขั้นตอนการคอมไพล์ ถ้าหากว่าเกิดมี Error เกียวกับ PIX_FMT_RGBA32 ขึ้นมาเหมือนในรูป ให้เข้าไปทำการแก้ไข ไฟล์ /tmp/ffmpeg-php-0.6.0/ffmpeg_frame.c โดยแก้ไขจากคำว่า PIX_FMT_RGBA32 ให้เป็น PIX_FMT_RGB32 ซึ่งในโค้ดเป็นภาษาซี และตัวแปร PIX_FMT_RGBA32 ก็มีอยู่หลายทีมาก โดยในทีนี้เราจะใช้ nano ในการแก้ไข โดยให้กด CTRL + \ เพื่อทำการค้นหาและแทนที่คำที่เราต้องการ และเมื่อแก้ไขโค้ดเสร็จแล้ว ให้ทำการสั่งคอมไพล์ใหม่อีกรอบ

ทำการเปิดไฟล์ /tmp/ffmpeg-php-0.6.0/ffmpeg_frame.c ขึ้นมาเพื่อทำการแก้ไข

# nano /tmp/ffmpeg-php-0.6.0/ffmpeg_frame.c

เมื่อทำการคอมไพล์ ffmpeg-php เรียบร้อยแล้ว ให้ทำการเพิ่ม ffmpeg ลงไปใน php extension ด้วยคำสั่ง echo extension=ffmpeg.so > /etc/php.d/ffmpeg.ini

# echo extension=ffmpeg.so > /etc/php.d/ffmpeg.ini

สั่ง restart apache httpd สักหนึ่งรอบ

# service httpd restart

จากนั้นเปิดบราวเซอร์ไปที่ http://192.168.8.104/info.php เพื่อตรวจสอบ extension ของ php จะเห็นว่าเราได้ ffmpeg มาแล้ว เท่านี้ก็เป็นอันเรียบร้อย

ก่อนจบเราก็ต้องทดสอบการแปลงไฟล์ video ของเราดูหน่อยว่าใช้งานได้ไหม โดยเราจะทดสอบแปลงจาก .mov เป็น .flv

# ffmpeg -i inputFile.mov outputFile.flv
]]>
https://www.unzeen.com/article/2087/feed/ 0
CMS, Library, Framework, API คืออะไร..ต่างกันยังไง ? https://www.unzeen.com/article/1916/ https://www.unzeen.com/article/1916/#respond Fri, 05 Oct 2012 11:09:44 +0000 http://www.unzeen.com/?p=1916 – CMS (Content Management System) คือ ระบบที่พัฒนาขึ้นมาเพื่อช่วยให้จัดการข้อมูลต่างๆได้สะดวกยิ่งขึ้น โดยที่ผู้ใช้ไม่จำเป็นต้องเรียนรู้วิธีการเขียนโปรแกรม ตัวอย่าง CMS ที่นิยมก็เช่น WordPress, Joomla, Drupal ทั้งนี้เราสามารถที่จะเขียน plugin เพื่อเพิ่มส่วนต่างๆที่ต้องใช้เข้าไปเองได้ แต่ต้องทำผ่าน framework ของ CMS นั้นๆ

– Library คือ function หรือ class ที่เขียนไว้ให้สามารถทำงานได้อย่างใดอย่างหนึ่ง เช่น PHPMailler, ADOdb, FFMPEG, GD Library โดยเราต้องเรียก function หรือ class นั้นๆ มาใช้ในโปรแกรมของเรา

– Framework คือ กรอบที่เราใช้ในการพัฒนาโปรแกรม ซึ่งจะประกอบไปด้วย function หรือ class หลายๆตัว เราจำเป็นที่จะต้องเขียนโปรแกรมให้อยู่ในกรอบของ framework นั้นๆ จะเขียนแบบตามใจตัวเองไม่ได้ เช่นถ้าจะสร้างหน้าที่ใช้แสดงผลข้อมูลเราจะ query ข้อมูลและนำมาแสดงผลตรงๆไม่ได้ จะต้อง query ใน model และนำมาแสดงผลใน view เท่านั้น (framework หลายตัวสั่ง query และแสดงผลใน controller ได้เลย แต่นั้นไม่ควร) ตัวอย่างของ framework ก็ได้แก่ CodeIgniter, CakePHP, Zend, symfony

– API (Application Programing Interface) คือ วิธีเรียกใช้งานหรือติดต่อสื่อสารเพื่อรับส่งข้อมูลระหว่างโปรแกรมของเรา กับโปรแกรมปลายทาง อาจจะอยู่ในเครื่องเดียวกัน หรือคนละเครื่องก็ได้ ตัวอย่างเช่น เราต้องเขียนโปรแกรมชุดหนึ่งเพื่อทำการส่งค่าไปยังโปรแกรมอีกชุดหนึ่งเพื่อการประมวลผลบางอย่าง

]]>
https://www.unzeen.com/article/1916/feed/ 0
ทำโปรแกรมเครื่องคิดเลข Android StackCalculator ทบทวนความรู้สมัยเรียน https://www.unzeen.com/article/1059/ https://www.unzeen.com/article/1059/#comments Fri, 15 Oct 2010 14:46:53 +0000 http://www.unzeen.com/?p=1059 จากครั้งที่แล้วได้ลองสร้าง web browser แบบง่ายๆไปแล้ว คราวนี้เรามาต่อกันที่การทดลองสร้างโปรแกรมเครื่องคิดเลขกันอีกสักโปรแกรม แต่โปรแกรมเครื่องคิดเลขของเราจะมา + – * / กันง่ายๆด้วยเลขสองจำนวนคงไม่ได้เดียวไม่เทพพอ ฉะนั้นเราก็ต้องทำให้มันสามารถ + – * / ได้ทีละหลายๆจำนวน และสามารถที่จะใส่ () วงเล็บเปิด-ปิด เพื่อระบุความสำคัญของนิพจน์ได้ด้วย ซึ่งมันก็จะยากก็ตรงนี้หละที่ต้องไปทบทวนเรื่องการแปลงนิพจน์ Infix เป็น Postfix เพราะลืมไปหมดแล้ว จากนั้นก็จะทำการคำนวนจาก Stack เพื่อให้ได้คำตอบที่ต้องการ ร่ายซะยาวเริ่มเลยดีกว่า

เริ่มแรกทำการสร้างโปรเจ็คชื่อ “StackCalculator”
Andrid-Java-StackCalculator

ต่อไปทำการเพิ่ม Object ต่างๆลงใน Layout main.xml โดย Object ต่างที่ใช้ก็มี LinearLayout , EditText , Button ส่วน Object ไหนใช้กี่ตัว มี properties เป็นอะไรบ้างก็ดูจาก Code เอาเองเน้อ คงไม่ต้องอธิบายความหมายของ properties ต่างๆ ที่ใช้เพราะได้เขียนไปบ้างแล้วในบทความก่อนๆ

# main.xml




	
		
	
	
		
	
	
		

จากนั้นทำการแก้ไข StackCalculator.java เป็นดังนี้ (คำอธิบายดูจาก comment ใน code เลยครับ) โดยการทำงานของโปรแกรมเครื่องคิดเลขนี้ก็คือ จะทำการรับค่านิพจน์แบบ Infix (Infix ก็คือนิพจน์ที่มีเครื่องหมายอยู่ตรงกลาง คนเราอ่านนิพจน์นี้เข้าใจ แต่เครื่องคอมฯ ไม่เข้าใจ) จากนั้นทำการแปลงจาก Infix เป็น Postfix (Postfix คือนิพจน์ที่มีเครื่องหมายอยู่ข้างหลัง คนอ่านไม่ค่อยเข้าใจ เครื่องคอมฯ เข้าใจ) จากนั้นจึงทำการนำค่า Postfix ที่ได้ใส่ลงใน Stack แล้วนำค่าออกมาคำนวน

# StackCalculator.java

package com.LookHin.StackCalculator;

import java.util.Stack;
import java.util.StringTokenizer;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class StackCalculator extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
    // ตรวจจับการคลิกปุ่มต่างๆ
    public void ButtonClickHandler(View v){
    	EditText text1 = (EditText) findViewById(R.id.EditText01);
    	EditText text2 = (EditText) findViewById(R.id.EditText02);
    	
    	switch(v.getId()){
    		case R.id.ButtonNumber00:
    			 text1.append("0");
    			 break;
    		case R.id.ButtonNumber01:
	   			 text1.append("1");
	   			 break;
    		case R.id.ButtonNumber02:
	   			 text1.append("2");
	   			 break;
    		case R.id.ButtonNumber03:
	   			 text1.append("3");
	   			 break;
    		case R.id.ButtonNumber04:
	   			 text1.append("4");
	   			 break;
    		case R.id.ButtonNumber05:
	   			 text1.append("5");
	   			 break;
    		case R.id.ButtonNumber06:
	   			 text1.append("6");
	   			 break;
    		case R.id.ButtonNumber07:
	   			 text1.append("7");
	   			 break;
    		case R.id.ButtonNumber08:
	   			 text1.append("8");
	   			 break;
    		case R.id.ButtonNumber09:
	   			 text1.append("9");
	   			 break;
    		case R.id.ButtonSymbolDot:
	   			 text1.append(".");
	   			 break;
    		case R.id.ButtonSymbolBracketLeft:
	   			 text1.append("(");
	   			 break;
    		case R.id.ButtonSymbolBracketRight:
	   			 text1.append(")");
	   			 break;
    		case R.id.ButtonSymbolDivide:
	   			 text1.append("/");
	   			 break;
    		case R.id.ButtonSymbolMultiply:
	   			 text1.append("*");
	   			 break;
    		case R.id.ButtonSymbolSubtract:
	   			 text1.append("-");
	   			 break;
    		case R.id.ButtonSymbolAdd:
	   			 text1.append("+");
	   			 break;
    		case R.id.ButtonSymbolDel:
    			 if(text1.getText().toString().length() > 0){
	    			 String strText1Tmp = text1.getText().toString().substring(0, text1.getText().toString().length()-1);
		   			 
	    			 text1.setText("");
	    			 text1.append(strText1Tmp);
    			 }
	   			 break;
    		case R.id.ButtonSymbolClear:
	   			 text1.setText("");
	   			 text2.setText("");
	   			 break;
    		case R.id.ButtonSymbolExe:
    			 // เริ่มคำนวน
    			 String strStack = toPostfix(text1.getText().toString());
    		     float intValue = Calculator(strStack);
	   			 
    		     // นำค่าที่คำนวนได้กลับไปใส่ใน text2
	   			 text2.setText(Float.toString(intValue));
	   			 break;
    	}
    	
    }
    
    // ตรวจสอบลำดับของเครื่องหมาย * / + -
    public static int getPriority(char chaOperator){
		if(chaOperator == '+' || chaOperator == '-'){
			return 1;
		}else if(chaOperator == '*' || chaOperator == '/'){
			return 2;
		}
		
		return 0;
	}
    
    // ตรวจสอบว่าเป็นตัวเลขหรือไม่
    public static boolean isFloat(String strInput){
       try{
    	  Float.parseFloat(strInput);
          return true;
       }catch(Exception e){
          return false;
       }
    }
    
    // ทบทวนความรู้สมัยเรียนกันก่อน แปลงจาก infix เป็น postfix
    public static String toPostfix(String strInfix){
		String strExpression;
		String strPostfix = " ";

		strInfix  = strInfix.replaceAll("\\+|\\(|\\)|-|\\*|/", " $0 ");
		StringTokenizer strToken = new StringTokenizer(strInfix);
		
		Stack operatorStack = new Stack();

		while(strToken.hasMoreTokens()){
			strExpression = strToken.nextToken();
			
			if(Character.isDigit(strExpression.charAt(0))){
				strPostfix = strPostfix + " " + Float.parseFloat(strExpression);
			}else if(strExpression.equals("(")){
				Character operator = new Character('(');
				operatorStack.push(operator);
			}else if (strExpression.equals(")")){
				while(((Character) operatorStack.peek()).charValue() != '('){
					strPostfix = strPostfix + " " + operatorStack.pop();
				}
				
				operatorStack.pop();
			}else{
				
				while(!operatorStack.isEmpty() && !(operatorStack.peek()).equals("(") && getPriority(strExpression.charAt(0)) <= getPriority(((Character) operatorStack.peek()).charValue())){
					strPostfix = strPostfix + " " + operatorStack.pop();
				}

				Character operator = new Character(strExpression.charAt(0));
				operatorStack.push(operator);
			}
		}
		
		while(!operatorStack.isEmpty()){
			strPostfix = strPostfix + " " + operatorStack.pop();
		}

		return strPostfix;
	}
    
    // ทำการคำนวน  + - * / จาก postfix
    public static float Calculator(String strPostfix) {
    	float a;
    	float b;
    	float result = 0;
		
    	String[] arrPostfix = strPostfix.split(" ");
	    Stack CalStack = new Stack();

		for(int i = 0; i < arrPostfix.length; i++){
			String ch = arrPostfix[i];

			if(isFloat(ch)){
				CalStack.push(Float.parseFloat(ch));
			}else{
				
				if(ch.equals("+")){
					a = CalStack.pop();
					b = CalStack.pop();
					result = a + b;
					CalStack.push(result);
				}else if(ch.equals("-")){
					a = CalStack.pop();
					b = CalStack.pop();
					result = b - a;
					CalStack.push(result);
				}else if(ch.equals("*")){
					a = CalStack.pop();
					b = CalStack.pop();
					result = a * b;
					CalStack.push(result);
				}else if(ch.equals("/")){
					a = CalStack.pop();
					b = CalStack.pop();
					result = b / a;
					CalStack.push(result);
				}
			}
		}

		return result;
	}
}

เมื่อเสร็จแล้วก็ run โปรแกรมดู เราจะได้โปรแกรมเครื่องคิดเลขงามๆดังรูป
Andrid-Java-StackCalculator

ลองกด + - * / ดู ทำงานได้จริงๆด้วย !!!!!!!!!!! แต่ถ้าใครจะเอาไปทำส่งอาจารย์หละก็ ให้ทำการเพิ่มการตรวจสอบความถูกต้องของนิพจน์เข้าไปด้วย เรื่อง () วงเล็บเปิด-ปิด อะไรพวกนี้อะนะ ทำเอาเอง -.-'

ถ้าขี้เกียจพิมพ์ก็สามารถ Download Source Code ทั้งหมดได้จากที่นี้ https://www.unzeen.com/download/android/StackCalculator.zip

]]>
https://www.unzeen.com/article/1059/feed/ 7
php อ่าน/เขียน file ได้ในบรรทัดเดียว https://www.unzeen.com/article/705/ https://www.unzeen.com/article/705/#comments Wed, 06 Jan 2010 15:38:58 +0000 http://www.unzeen.com/?p=705 ปกติเวลาเราจะทำการ เขียนหรืออ่าน file เราจะใช้ function fopen() เพื่อทำการสร้าง pointer ที่จะใช้ในการอ่านและเขียน และจะใช้ function fgets() เพื่ออ่าน และ fwrite() สำหรับเขียน แต่ php ยังมี function file_put_contents() และ file_get_contents() ที่อำนวยความสะดวกในการอ่านและเขียน file ให้ง่ายได้ในบรรทัดเดียว

ขั้นแรกมาดูวิธีการอ่านและเขียน file โดยใช้ function ปกติๆที่เคยๆกันก่อน

# ตัวอย่างการใช้ function fwrite() ในการเขียน file


# ตัวอย่างการใช้ function fgets() ในการอ่าน file

 

function พวกนี้มีมาตั้งแต่สมัย Perl สือถอดมาจนถึง php แต่ php ก็ยังได้เพิ่มความสามารถในการ อ่าน/เขียน file ให้ง่ายขึ้นเข้าไปอีก ด้วยการใช้ function file_get_contents() สำหรับอ่าน file และ file_put_contents() สำหรับการเขียนข้อมูลลง file

ต่อไปมาดูการอ่านและเขียนโดยใช้ function เพียงบรรทัดเดียวกันบ้าง

# ตัวอย่างการใช้ function file_put_contents() ในการเขียน file


# ตัวอย่างการใช้ function file_get_contents() ในการอ่าน file

 

ปล. มันคงไม่ทำให้เขียนโปรแกรมยากหรือว่าง่ายขึ้น แต่รู้เอาไว้ก็คงไม่เป็นไรมั๊ง..

]]>
https://www.unzeen.com/article/705/feed/ 2