ทำ Hot backup percona MongoDB อย่างไร? by

15
Nov
0

** Blog นี้ใช้งาน Percona Mongodb เป็นหลักนะครับซึ่งวิธีการ Backup จะต่างจาก Mongodb เวอร์ชั่นธรรมดาที่ใช้ mongodump หากต้องการทราบรายละเอียดเพิ่มเติม คลิกเพื่ออ่าน Blog เก่าได้ที่นี่

คำสั่ง Backup Percona MongoDB ง่ายมากเลยครับ ขั้นแรกให้เข้า mongo shell ก่อน แล้วใช้คำสั่งตามด้านล่าง

use admin
db.runCommand({backupStart:"/my/backup/data/path"})

โดยแก้ไขส่วนของ /my/backup/data/path เป็น path ที่เราต้องการเซฟ backup ไว้เท่านี้ก็เรียบร้อย ง่ายสุดๆ สั่ง Backup ระหว่างใช้งานโดยไม่กระทบกับผู้ใช้งานปัจจุบันได้เลยครับ แต่ถ้าหากต้องการรันผ่าน linux shell ตรงๆ โดยไม่ต้องเข้า Mongo shell ก่อนก็สั่งดังนี้ได้เลยครับ

mongo --eval "db = db.getSiblingDB('admin'); db.runCommand({backupStart:\"/my/backup/data/path\"});"
tar -cv -C /my/backup/data path | pbzip2 -cv > my_backup.tar.gz2

เพียงเท่านี้ก็จะสามารถตั้ง cron สั่ง backup รายวันได้ทันที แก้ไขตำแหน่งไฟล์ที่ backup ได้ตามสะดวก และสั่ง pbzip2 ให้รวมเป็นไฟล์เดียวเล็กๆ เรียบร้อย

สำหรับวิธี Restore ไม่มีอะไรซับซ้อน ไฟล์ที่เรา backup มานั่นแหละคือ data ของฐานข้อมูล mongodb เต็มๆ สิ่งที่ต้องทำมีเพียง stop mongodb ที่รันอยู่แล้วลบไฟล์ database mongodb ทั้งหมดออกไป (ตัวทั่วไปมักจะอยู่ที่ /var/lib/mongodb) แล้วเอาไฟล์ที่เรา backup ไว้ไปใส่แทน แล้วแก้ owner ของไฟล์เป็น mongod ผ่านคำสั่ง chown แล้วสั่ง start mongodb ขึ้นมาอีกรอบเป็นอันเรียบร้อย ง่ายมากๆ

หาว่า Code PHP ส่วนไหนทำงานช้าด้วย Xdebug PHP Extension by

31
Oct
0

เคยเจอปัญหา Code PHP ทำงานช้าโดนไม่ทราบสาเหตุไหม? แถมเราไม่รู้อีกตะหากว่าไฟล์ไหน บรรทัดที่เท่าไหร่ทำงานช้า จะให้ไปไล่ Code ด้วยมือก็ Code มีเป็นหมื่นเป็นแสนบรรทัด ไม่รู้จะเริ่มยังไงกว่าจะหาเจอ แถมดันช้าเฉพาะบน Server Production อีกตะหาก แต่ชีวิต PHP Developer ก็ไม่ได้ยากขนาดนั้นหากเรารู้จัก Tools ตัวนี้ มันชื่อว่า Xdebug ครับ เป็น PHP Extension นั่นเอง วิธีลงก็แสนง่ายดาย

sudo apt-get install php-xdebug

แค่นี้จบ (Debian/Ubuntu นะ) แต่ถ้าคุณใช้ Linux OS เก่าๆ หน่อย สั่งแล้วหา package ไม่เจอ ก็อาจจะต้อง Download มา compile ด้วย phpize เองดังนี้

  1. Download version ล่าสุดที่เว็บ Xdebug (เขียนว่า source)
  2. tar -xvzf xdebug-x.x.x.tgz (เปลี่ยนชื่อไฟล์ตามเวอร์ชั่นที่โหลดมา)
  3. cd เข้า dir ที่แกะ zip ออกมาตะกี้
  4. phpize
  5. ./configure
  6. make
  7. cp modules/xdebug.so

หลังจากลงเรียบร้อย (ไม่ว่าจะวิธีใดก็ตาม) แก้ไข php.ini โดยเพิ่มคำสั่งตามด้านล่าง (ถ้าลงผ่าน apt-get install อาจจะมีไฟล์ 20-xdebug.ini อยู่แล้ว ให้แก้ไขที่ไฟล์นั้นแทน php.ini)

zend_extension=xdebug.so // อันนี้สั่ง enable extension
xdebug.profiler_output_dir=<save_path> // อันนี้แก้ <save_path> เป็น path ที่เราจะเก็บไฟล์ profiler เอาไว้ write permission ต้อง write โดย user ที่รัน Process php ได้ ส่วนใหญ่จะเป็น www-data ถ้าขี้เกียจคิดมากก็ chmod 0777 <save_path> ไปเลย
xdebug.profiler_enable=0 // สั่ง enable ให้เซพไฟล์ profiler ตรงนี้ถ้ายังไม่ใช้ให้ใส่เป็น 0 ไปก่อน จะใช้เมื่อไหร่ค่อยปรับเป็น 1

** xdebug.profiler_enable นี้สำคัญมาก ไม่ควรใส่ 1 ตลอดเวลา ไม่อย่างนั้นพื้นที่ Harddisk คุณจะเต็มเร็วมาก!!

ก่อนจะใช้งานกับ Production Server ตัวจริงแนะนำให้ทดลองกับ Development Server ที่มีคนเข้าแค่คนภายในก่อน แล้วแก้ php.ini บรรทัด xdebug.profiler_enable=1 ครับ พร้อมเมื่อไหร่ก็สั่ง restart apache หรือ php-fpm (แล้วแต่ว่า server ใช้ตัวไหนอยู่) เพื่อให้ Xdebug เริ่มทำงาน แล้วให้ลองเข้าหน้าเว็บผ่าน browser สักหน้าหนึ่ง แล้วแวะไปดูที่ <save_path> ที่กำหนดเอาไว้แต่แรก หากทุกอย่างถูกต้องจะมีไฟล์ cachegrind.out.xxxx ปรากฏออกมาหลายๆ ไฟล์ ก็ให้ Download file พวกนี้แหละลงมาที่เครื่องเราให้หมด (แนะนำให้สั่ง tar -zcvf <save_zip_file_name> <save_dir> ก่อน)

ขั้นตอนสุดท้าย Download โปรแกรมดูผล Profiler ครับ มีสองตัว ใครใช้ Windows โหลด WinCacheGrind ใครใช้ Linux โหลด KCacheGrind โหลดเสร็จก็เปิดมาสั่ง File -> Open cachegrind.out.xxxx ที่พึ่ง Download มาตะกี้ก็จะดูได้แล้วดังรูปครับ

xdebug

ดูที่ช่อง Self กับ Cum. ก็จะรู้เวลาที่ใช้เรียบร้อย โดย Self ตัวเฉพาะ function นี้ที่ตัวมันเองเรียกเนี่ยใช้เวลาเท่าไหร่ และ Cum. คือรวมเวลา function ลูกที่ function นี้ไป call ต่ออีกทีทั้งหมดใช้เวลาเท่าไหร่ (- แสดงว่าน้อยมากจนแทบไม่มีผล) และจะบอกว่าไฟล์ไหน บรรทัดอะไรให้เสร็จสรรพ ดับเบิ้ลคลิกเข้าไปทีละชั้นๆ ได้เลย

ก็เท่านี้แหละครับสำหรับวิธีใช้งาน หากต้องการใช้บน Production Server หลังจากแก้ไข xdebug.profiler_enable=1 แล้ว restart php-fpm หรือ apache แล้วถ้าคนเล่น active เยอะหน่อยก็ไม่ต้องเปิดนานครับ สัก 5-10 วิพอ แล้วแก้ xdebug.profiler_enable=0 กลับ แล้วรีบ restart php-fpm หรือ apache ทันที มิฉะนั้นมันจะกินที่ไปมหาศาลครับ Download ลงเครื่องเราก็เสียเวลาเยอะอีก

ขอให้โชคดีครับ :)

การแก้ปัญหาขณะติดตั้ง PHP Agent ของ Newrelic by

5
Sep
0

วันก่อนผมเจอปัญหา process newrelic ส่วนของ PHP Monitoring ไม่ทำงาน ไม่มี Process สร้างขึ้นมาเลย และพอไปดู log ก็พบ error ดังนี้

errno=ECONNREFUSED. Failed to connect to the newrelic-daemon

ตอนสั่ง start newrelic PHP Agent แล้วปรากฏว่ารันไม่ขึ้น ซึ่งไม่เคยเจอปัญหานี้มาก่อน เลยไปค้นหาวิธีแก้ พบว่ามีทางแก้สองแบบ

แบบแรก

แก้ไขไฟล์ 20-newrelic.ini จาก

newrelic.daemon.port = "/tmp/.newrelic.sock"

เป็น

newrelic.daemon.port = "@newrelic-daemon"

แล้วสั่ง


service php5-fpm restart
service newrelic-daemon restart

แต่ผมลองแล้วไม่ได้ผล เลยต้องหาวิธีใหม่ได้แบบที่สองคือ

แบบที่สอง

1. พิมพ์ 

getent group newrelic

จะได้ผลลัพธ์ประมาณ newrelic:x:GroupID: ออกมา ให้จำค่า GroupID ไว้สำหรับใช้ต่อไป

2. แก้ไขไฟล์ /etc/sysctl.conf โดยเพิ่ม ข้อมูลดังนี้เข้าไป

fs.proc_can_see_other_uid = 0
fs.proc_super_gid = GroupID

ข้อควรระวังคือ fs.proc_super_gid สามารถใส่ GroupID ได้เพียงอันเดียว ถ้ามี fs.proc_super_gid อยู่ก่อนแล้วให้คุณสร้าง group ใหม่ขึ้นมาแล้วใส่ users ที่ต้องการใช้งานเข้าไปใน group ให้ครบทุก user แล้วใช้ group ใหม่นั้นแทนไปเลย แต่ถ้าไม่เคยสั่ง fs.proc_super_gid มาก่อนก็ไม่ต้องสนใจส่วนนี้

3. 

sysctl -p

4. 

service php5-fpm restart
service newrelic-daemon restart

5. เสร็จเรียบร้อย

วิธีติดตั้ง/ใช้งาน Facebook SDK (PHP) v5 by

30
Aug
0

ตอนนี้ Facebook SDK ของ PHP ก็ก้าวมาสู่ version 5 กันแล้ว มีขั้นตอนติดตั้งดังนี้ (สำหรับ Linux นะ ถ้า Windows Download ตัวนี้ไปเลย)

การติดตั้ง

1. รันคำสั่งตามด้านล่างใน bash เพื่อติดตั้ง composer (Facebook เก็บตัว Code ไว้ที่นี่) ถ้าใครไม่รู้จัก composer มันคือตัวจัดการ library และ dependency ของ library ต่างๆ ของ php ถ้าใครเคยใช้ nodejs มาก่อนให้นึกถึง npm ครับคล้ายๆ กัน
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === 'e115a8dc7871f15d853148a7fbac7da27d6c0030b848d9b3dc09e2a0388afed865e6a3d6b3c0fad45c48e2b5fc1196ae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

2. รันครบเราจะได้ไฟล์ composer.phar มา ก็เอาไปเก็บไว้ไหนก็ได้ตามสะดวก

3. เพิ่มด้านล่างเข้าไฟล์ composer.json หากยังไม่เคยมีมาก่อนให้สร้างขึ้นใหม่เลย
{
"require" : {
"facebook/php-sdk-v4" : "~5.0"
}
}

4. ./composer.phar install

5. ใช้งานได้เรียบร้อย

การใช้งาน

1. ตั้งต้น code ดังนี้ โดยส่วนนี้เน้นการใช้งานกับ Canvas ของ Facebook App (directory vendor อยู่ตำแหน่งเดียวกับ composer.json)

require 'vendor/autoload.php';

use Facebook\FacebookCanvasLoginHelper;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookRequestException;

$fb = new Facebook\Facebook([
'app_id' => '{app-id}',
'app_secret' => '{app-secret}',
'default_graph_version' => 'v2.7', // แก้เวอร์ชั่นเป็นเวอร์ชั่นล่าสุด ตรวจสอบได้ที่ https://developers.facebook.com/tools/explorer ว่าเวอร์ชั่นล่าสุดเป็นอะไร
'persistent_data_handler'=>'session'
]);

$helper = $fb->getCanvasHelper();
try {
$access_token = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// There was an error communicating with Graph
die( "Error: ". $e->getMessage() );
//exit;
}
$this->setDefaultAccessToken((string) $access_token);

2. การ Redirect ไปขอ permission การใช้งาน Facebook App ครั้งแรก

$helper = $fb->getRedirectLoginHelper();
$permissions = ['email', 'user_likes']; // optional
$loginUrl = $helper->getLoginUrl('http://{your-website}/login-callback.php', $permissions);
header("Location: ".$loginUrl)
exit;

3. ตัวอย่างการใช้งาน graph api ที่ได้ค่ากลับมาเป็น JSON เรียบร้อย
try {
$response = $fb->get('/me');
$json_data = $response->getDecodedBody();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
}

ข้อพึงระวังคือ facebook SDK ใช้การตรวจจับว่าเว็บไซต์ของเราเป็น https หรือไม่จาก header ชื่อ SERVER_PORT (ใน php เรียกโดยผ่านตัวแปร $_SERVER['SERVER_PORT']) ดังนั้นหาก server ของคุณมีการใช้ nginx หรือ webserver ตัวอื่นๆ ในการโยน request ต่อกันหลายๆ ทอดจนทำให้ https ดันระบุ port ผ่านตัวแปรนี้เป็น 80 แทนก็ให้ระวังไว้ด้วยครับ facebook SDK ไม่ได้เช็คค่าจาก $_SERVER['HTTPS'] ดังนั้นเราอาจต้อง Hack code แก้ตรงนี้เอง

[Unity3D] เพิ่ม Game Center ลงเกมของเรา by

30
Jun
0

วิธี setup Game Center และใส่ Archivement ลงใน Game Center ตามนี้เลยครับ

Setup ที่ iTune Connect

1. เข้าไปที่ iTune Connect

2. เลือก app ของเรา (ถ้ายังไม่ใส่ app ลง iTune Connect จะทำ Game Center ไม่ได้เลย)

gamecenter1

3. กดเมนู Features ตามด้วย Game Center ดังรูปด้านบน

gamecenter2

4. กด Add Achievement ตามรูป (ถ้าอยากใส่ Leaderboard ด้วยก็ต้องใส่ข้อมูล Leaderboard ด้วยตรงนี้)

5. มีข้อมูลต้องกรอกดังนี้

  • Achievement Reference Name – ชื่อที่เอาไว้ดูในเว็บ iTune Connect เท่านั้น ไม่มีการเชื่อมต่อกับส่วนอื่น
  • Achievement ID – ชื่อที่ใช้อ้างอืงกับเกมของเรา เวลาเราสั่ง Achievement ไหนเสร็จก็จะต้องอ้าง string ตัวนี้ ใช้ได้เฉพาะตัวอักษรอังกฤษ, ตัวเลข, -, _ ห้ามมีตัวอักษรอื่นนอกเหนือจากนี้รวมถึง spacebar
  • Point Value – ถ้าทำสำเร็จจะได้กี่แต้ม ตรงนี้ต้องระวังหน่อยใส่ได้สูงสุด 100 และรวมทุก Achievement ห้ามเกิน 1000 คะแนนตรงนี้จริงๆ เกมเราไม่ได้เอาไปใช้อะไรหรอก แต่สำหรับผู้เล่น มันจะมีคะแนนที่สะสมมาจากเกมอื่นที่ไม่ใช่ของเรามารวมด้วย และจัดอันดับของทั้ง Game Center รวมกันหลายๆ เกมอีกที ในส่วนนี้สมมติตั้งว่าได้ 10 คะแนน แต่คนเล่น progress ไป 50% แล้ว แต่ยังไม่สำเร็จก็จะยังไม่ได้แต้ม (ไม่ใช่ว่าได้ 5 แต้มไปก่อนแล้ว) ต้องทำ progress ครบ 100 ถึงจะได้ 10 คะแนน
  • Hidden – แสดงให้ผู้เล่นรู้ไหมว่ามี Achievement นี้อยู่
  • Achievable More Than Once – ทำซ้ำได้มากกว่า 1 ครั้งไหม

6. ข้อมูลส่วน Add Language มีดังนี้

  • Language – ภาษา
  • Title – หัวข้อที่จะแสดงเวลาผู้เล่นทำสำเร็จครบ 100% แล้วมี status แสดงว่าสำเร็จแล้ว (Hero, Great Warrior ชื่ออะไรที่อยากให้คนเล่นเห็นก็ว่าไป)
  • Pre-earned Description – ก่อนจะได้ Achievement ให้แสดงข้อความข้างใต้ Title อย่างไร อาจใส่เป็นคำใบ้ว่าต้องทำอย่างไรถึงจะได้ Achievement นี้ก็ได้
  • Earned Description – หลังได้ Achievement ให้แสดงข้อความข้างใต้ Title ว่าอย่างไร
  • Image – รูปที่แสดง ขนาด 512×512 px หรือ 1024×1024 px โดยจะถูกตัดขอบเป็นวงกลมให้เสมอ

7. หลังกด Save แล้วก็ Add Achievement อื่นๆ วนซ้ำไปเรื่อยๆ จนกว่าจะครบตามต้องการ

8. เข้าเมนู App Store

gamecenter3

9. กดเพิ่ม version เกมอันใหม่แล้วเลือก Enable Game Center ตามรูปซะ และ Select All Achievement หรือ Leaderboard ที่สร้างมาให้ครบเพื่อรับการ Review

10. Submit App ตัวใหม่ที่ implement Game Center แล้วเรียบร้อยขึ้น Store

Unity Coding

สำหรับด้าน Coding ของ Unity ไม่จำเป็นต้องติดตั้ง Library ใดๆ เพิ่ม สามารถใช้งานได้เลยโดยมีเพียงเล็กน้อยดังนี้

using UnityEngine;
using UnityEngine.SocialPlatforms;
public class GameCenter : MonoBehaviour {
public static GameCenter instance;
public bool IsLogin = false;
void Awake() {
instance = this;
}
// Use this for initialization
void Start () {
// Authenticate and register a ProcessAuthentication callback
// This call needs to be made before we can proceed to other calls in the Social API
#if UNITY_IOS
GameCenterPlatform.ShowDefaultAchievementCompletionBanner(true);
Social.localUser.Authenticate(ProcessAuthentication);
#endif
}
// This function gets called when Authenticate completes
// Note that if the operation is successful, Social.localUser will contain data from the server.
void ProcessAuthentication(bool success)
{
if (success)
{
IsLogin = true;
}
}
}

Copy ไปสร้างไฟล์ใหม่ชื่อ Game Center แล้วลาก Script ไปแปะที่ Scene แรกสุดได้เลย ในส่วนนี้คือคำสั่ง Login user เข้า Game Center สำหรับคำสั่งที่จะส่ง progress ไปยัง Game Center ใช้แค่ดังนี้

Social.ReportProgress(achievementId, 100f, delegate(bool result) {
if (result)
Debug.Log("Successfully reported achievement progress");
});

ง่ายดายมากๆ เพียงส่ง string ตัวแปร achievementId ไปให้ตรงกับที่สร้างไว้บน iTune Connect และ parameter ตัวที่สองคือ progress ซึ่งจะมีได้ตั้งแต่ 0-100 เท่านั้น (ไม่ว่า Point Value จะเป็นเท่าไรก็ตาม) ถ้าทำสำเร็จจะมี popup เลื่อนมาแสดงว่าสำเร็จแล้ว

ในส่วนของการแสดง Game Center Interface ภายในเกมของเราทำได้โดยสั่ง

Social.ShowAchievementsUI() หรือ Social.ShowLeaderboardUI() ตามแต่ต้องการว่าจะแสดงอะไร

หากต้องการ Reset Achievement ที่ทำไปแล้วทั้งหมดทำได้โดยสั่งดังนี้

GameCenterPlatform.ResetAllAchievements( (resetResult) => {
Debug.Log( (resetResult) ? "Reset done." : "Reset failed." );
});

การทดสอบ

IMG_0152

สำหรับ iOS ตั้งแต่เวอร์ชั่น 9 เป็นต้นไป ไม่ต้องทำอะไรก็สามารถทดสอบได้เลย แต่หากเป็น iOS เวอร์ชั่นตำกว่า 9 จะต้องเข้าหน้า Setting -> Game Center เพื่อปรับ Sandbox ให้เป็น Enable ก่อนดังภาพ และต้อง Sign Out account game center เพื่อใช้งาน Account Sandbox ตอนเข้าเกม (ถ้ายังไม่มีต้องสร้างที่ iTune Connect เข้าเมนู Users and Roles -> Sandbox Testers) เมื่อเตรียมการเรียบร้อยก็เข้าเกมเราไปทดสอบ ลองดูเลย ถ้าเจอ popup Welcome to Game Center โผล่มาก็แสดงว่าสำเร็จ ถ้าไม่มีก็ต้องตรวจสอบขั้นตอนใหม่ว่ามีอะไรผิดพลาดบ้าง ขอให้โชคดีครับทุกท่าน :)

กู้เงิน | เศรษฐกิจพอเพียง | สินเชื่อบุคคล | สมัครบัตรกดเงินสด | สินเชื่อ | เงินกู้ด่วน | ยืมเงินทรูมูฟ | เงินด่วนนอกระบบ