Download as pdf or txt
Download as pdf or txt
You are on page 1of 58

preface

ဒီတစ္လမွာေတာ့ {echo} ရဲ႕ (၁၀) အုပ္ေျမာက္လည္း ျဖစ္သလို ပရိတ္သတ္ႀကီးအတြက္


စိတ္ဝင္စားဖြယ္ရာ ေဆာင္းပါးမ်ား၊ Tutorial မ်ားျဖင့္ ထည့္သြင္းေဖာ္ျပထားပါတယ္။ ဒါ့အျပင္ လစဥ္ေဖာ္ျပေနက်ျဖစ္တဲ့
Interview က႑မွာေတာ့ ကိုဇင္မင္း (Creative Web Studio) နဲ႕ Interview အျပင္ Laravel Framework ႏွင့္
ပတ္သတ္၍ ယခင္လက ေဖာ္ျပခဲ့ေသာ “Laravel 4 Tutorial” ၏ အဆက္ကိုလည္း ဆက္လက္ထည့္သြင္းထားသလို
Cache ေတြနဲ႕ ပတ္သက္ၿပီး ရွင္းလင္းေဖာ္ျပထားေသာ ေဆာင္းပါး၊ PHP သမားမ်ား စိတ္ဝင္စားမည့္ Firephp, MySQL
data type မ်ားအေၾကာင္း အစရွိသည့္ အျခားစိတ္ဝင္စားဖြယ္ရာ ေခါင္းစဥ္မ်ားျဖင့္ ေဝေဝဆာဆာေဖာ္ျပထားပါတယ္။

တစ္လထက္တစ္လ ဖတ္ရႈသူမ်ားျပားလာသည္ႏွင့္အမွ် {echo} အဖြဲ႕သားမ်ားကလည္း


တစ္လထက္တစ္လ ပိုမိုေကာင္းမြန္ေအာင္ ႀကိဳးစား၍ စီစဥ္တင္ဆက္ထားပါတယ္။ အေၾကာင္းအမ်ိဳးမ်ိဳးေၾကာင့္
တစ္ရက္ေနာက္က်ၿပီးမွ ဒီဇင္ဘာလ issue ကို ထုတ္ျဖစ္ခဲ့တဲ့အတြက္ ေတာင္းပန္ပါတယ္။

Echo Team
table of content

Debugging PHP Code Create Note Application with


with FirePHP Laravel 4 (II)

9 16
Tips to Speed Up Your Website Creating a Laravel Package

24 28
MYSQL Data Types Interview with Ko Zin Min

34 40
First Step with PureCSS The Art of Caching

45 52
echo team

Editor Layout Designer

Thiha Hein Zaw Htet

Proof Reader Website

Echo Team echo.myanmarlinks.net

Facebook Page Email

fb.me/EchoMagazine.mm echo.emagz@gmail.com

{ echo } is the product of


MyanmarLinks Web Development Team
{echo}

echo.myanmarlinks.net 5
{echo}

echo.myanmarlinks.net 6
{echo}

echo.myanmarlinks.net 7
{echo}

echo.myanmarlinks.net 8
Debugging PHP Code with
FirePHP

P H P

Li Jia Li
A web addicted who love everything about web technology.
Arts and design enthusiast.
Core Module developer of RebornCMS.
http://dragonvirus.com
Debugging PHP code with
FirePHP

What is FirePHP ?
FirePHP ဆိုတာ က နာမည္ႀကီး debugging tools တစ္ခုျဖစ္တဲ့ Firebug ရဲ႕ extension တစ္ခုပါ။ FirePHP က အဓိက json
သို႔မဟုုတ္ xml သီးသန္႔ response ျပန္တဲ့ Ajax development ေတြမွာ အလြန္အသံုးဝင္ပါတယ္။ var_dump() ထုုတ္လို႔မရဘူးလားလို႔
ေမးစရာရွိပါတယ္။ ရပါတယ္။ ဒါေပမယ့္ json သို႔မဟုုတ္ xml သီးသန္႔ response ျပန္တဲ့ ajax development မ်ိဳးမွာဆုုိရင္ program
flow အရ အဆင္မေျပေတာ့ ပါဘူး။ FirePHP ကို သံုးတဲ့ အခါမွာ ေတာ့ ကိုယ္ debug လုုပ္ခ်င္တာကို console ထဲမွာ ထုုတ္လိုက္႐ံုပါပဲ။
ကိုယ္႔ရဲ႕ code ေတြကို လည္းဘာမွာ အေႏွာက္အယွက္မျဖစ္ပါဘူး။ Production stage ေရာက္ရင္ေတာ့ FirePHP Logging ကို disabled
လုုပ္ထားဖို႔လိုပါလိမ့္မယ္။

Installation
FirePHP က Firebug ရဲ႕ Add-on တစ္ခုျဖစ္တဲ့အတြက္ FirePHP ကို install မလုုပ္ခင္မွာ Firebug မရွိေသးဘူးဆိုရင္
Firebug ကို အရင္ install လုုပ္ထားဖို႔လိုပါလိမ့္မယ္။ Firebug ကို install လုုပ္ဖို႔ http://getfirebug.com/downloads ကိုသြားၿပီး ကိုယ့္
browser version နဲ႕ ကိုက္မယ့္ဟာကိုေရြးၿပီး install လုုပ္လိုက္ပါ။ ၿပီးသြားရင္ေတာ့ FirePHP ကို install လုုပ္ဖို႔အတြက္ https://ad-
dons.mozilla.org/en-US/firefox/addon/firephp/ ကိုသြားၿပီး install လုုပ္လိုက္ပါ။ တကယ္လို႔ chrome နဲ႕ သံုးခ်င္တယ္ဆိုရင္ေတာ့
Aaron Saray ဆိုတဲ့ PHP web developer တစ္ေယာက္ေရးထားတဲ့ FirePHP4Chrome ဆိုတဲ့ extension ရွိပါတယ္။

Integrating FirePHP to PHP projects


FirePHP ကိုသံုးဖို႔အတြက္ FirePHPCore Library ကုုိ project မွာ integrate လုုပ္ေပးဖို႔လိုပါလိမ့္မယ္။ FirePHP-
Core Library ကို FirePHP Website ကေန Download လုုပ္ႏိုင္ပါတယ္။ ဒါမွာ မဟုုတ္ PEAR ကေနလည္း install လုုပ္လို႔ ရပါတယ္။
တစ္ခ်ိဳ႕ Framework ေတြနဲ႕ CMS ေတြမွာ သက္ဆိုင္ရာ Package ေတြ Plugin ေတြရွိပါတယ္။ Support လုုပ္တဲ့ Framework List
ကို ေတာ့ FirePHP site ရဲ႕ Download Page ေအာက္ဖက္နားမွာ ေဖာ္ျပထားပါတယ္။ တကယ္လို႔ သင့္ Project က composer
သံုးထားတယ္ဆိုရင္လည္း composer package လည္းရွိပါတယ္။ composer သံုးထားတဲ့ project မွာ integrate လုုပ္မယ္ဆိုရင္ေတာ့
composer.json မွာ ေအာက္ကအတိုင္း require လုုပ္ေပးလိုက္ရင္ ရပါၿပီ။

{
“require”: {
“firephp/firephp-core”: “dev-master”
}
}
Debugging PHP code with
FirePHP

Plain PHP မွာ ဆိုရင္ေတာ့ ပံုမွန္ အတိုင္းပဲ require လုုပ္ေပးရပါမယ္။ FirePHP ကို သံုးတဲ့ အခါမွာ Object Oriented
နည္း အတိုင္းသံုးလို႔ရသလို Procedural နည္းနဲ႕လည္းသံုးလို႔ရပါတယ္။

Object Oriented နည္းအတိုင္းသံုးမယ္ဆိုရင္ FirePHP.class.php ကို require လုုပ္ရပါမယ္။

require ‘FirePHPCore/FirePHP.class.php’;

Procedural နည္းအရသံုးမယ္ဆိုရင္ေတာ့ fb.php ကို require လုုပ္ေပးရပါမယ္။ Static method call ကို
သံုးမယ္ဆိုရင္လည္း ဒီ fb.php ကုုိပဲ require လုုပ္ေပးရပါမယ္။

require ‘FirePHPCore/fb.php’;

require လုုပ္ၿပီးသြားၿပီဆိုရင္ေတာ့ စသံုးလို႔ရပါၿပီ။

How to use FirePHP


Object Oriented Way

require_once(‘FirePHPCore/FirePHP.class.php’);
$firephp = FirePHP::getInstance(true);
$firephp->log(“Log Message”);

တကယ္လို႔ static method ပံုစံနဲ႕ ေရးခ်င္တယ္ဆိုရင္ေတာ့ ေအာက္က လိုေရးရပါမယ္။

require_once(‘FirePHPCore/fb.php’);
FB::log(“Log Message”);

Procedural Way

function ပံုစံမ်ိဳးနဲ႕ဆိုရင္ေတာ့ ဒီလိုေရးပါတယ္။

require_once(‘FirePHPCore/fb.php’);
FB::log(“Log Message”);
Debugging PHP code with
FirePHP

အခုုနည္းနည္းေလာက္စမ္းၾကည့္ရေအာင္ php file အသစ္တစ္ခုလုပ္ၿပီး FirePHP ကို require လုုပ္လိုက္ပါ။ ၿပီးရင္


Log Message ေလးေတြနည္းနည္းထုုတ္ၾကည့္ရေအာင္ File ထဲမွာ ေအာက္ကအတိုင္းေရးလိုက္ပါ။ ဒီမွာေတာ့ Static method ကို
သံုးၿပီးေရးပါမယ္။

<?php
require ‘FirePHPCore/fb.php’;
FB::log(‘Log message’);
FB::info(‘Info message’);
FB::warn(‘Warn message’);
FB::error(‘Error message’);

ၿပီးရင္ Firebug console ကိုဖြင့္ထားၿပီး browser မွာ run ၾကည့္လိုက္ပါ။ ေအာက္ကအတိုင္းေတြ႕ရပါလိမ့္မယ္။

တကယ္လို႔ procedural နည္းကို သံုးတယ္ဆိုရင္ေတာ့ ေအာက္ကအတိုင္း FirePHP::LOG, FirePHP::INFO, FirePH-


P::WARN, FirePHP::ERROR ဆိုတဲ့ constant ေတြကို အေနာက္မွာထည့္ေပးရပါမယ္။ default ကေတာ့ FirePHP::LOG ေပါ့။

fb($test, FirePHP::INFO);

အခုုၿပီးသြားၿပီဆိုရင္ array variable ကို ထုုတ္ၾကည့္ရေအာင္

$test = array(
'name' => 'Li Jia Li',
'nickname' => 'DragonVirus',
'twitter' => 'EyeOfDragonLi'
);

FB::log($test);
Debugging PHP code with
FirePHP

Array ကိုထုတ္တဲ့အခါမွာ Log ေပၚမွာ mouse hover တင္လိုက္ ရင္ အေပၚကအတိုင္း အျပည့္အစံုကို ေတြ႕ရမွာျဖစ္ပါတယ္။

တကယ္လို႔ console မွာ ထုုတ္ထားတာေတြက အမ်ားႀကီး ဘယ္ ဟာက ဘာအတြက္လည္း ျပထားခ်င္ရင္ Label အေနနဲ႕
Log Item ရဲ႕ေနာက္မွာ param တစ္ခုအေနနဲ႕ ထည့္လို႔ရပါတယ္။

FB::log($test, ‘User Info’);

//Procedural
fb($test, ‘Label’, FirePHP::INFO);

Advanced Features
Grouping

Log Message ေတြကို Group အလိုက္ ထုုတ္ခ်င္ရင္ FB::group(‘group name’) ဆိုၿပီး ထုုတ္လို႔ရပါတယ္။ ဥပမာ Loop-
ing အတြင္းမွာ ထုုတ္တဲ့ ဟာမ်ိဳးေပါ့။ သူု႕ group အလိုက္ခြဲထားတဲ့ အခါက်ေတာ့ debug လုုပ္ရတာပိုၿပီး ရွင္းလင္းသြားတာေပါ့။

<?php

require ‘FirePHPCore/fb.php’;

$users = array(‘Johnathan’, ‘Kai’, ‘Robert’, ‘Leo’, ‘Kath’);

FB::group(‘User Secrect Keys’);

foreach ($users as $value) {


$secret_key = sha1($value.’s@1tk3y’);
FB::info($secret_key, ‘Key for ‘.$value);
}

FB::groupEnd();
Debugging PHP code with
FirePHP

အေပၚက code ကို run လုုိက္တဲ့ အခါက်ရင္ ေအာက္ကလိုမ်ိဳး group နဲ႕ ပံုစံကို ေတြ႕ရမွာပါ။

Tables

FirePHP မွာ data ေတြကို table ပံုစံနဲ႕ ထုုတ္ျပခ်င္တယ္ဆိုလည္းရပါတယ္။ Table ပံုစံနဲ႕ ထုုတ္ျပခ်င္တယ္ဆိုရင္ေတာ့
FB::table ကိုသံုးလို႔ရပါတယ္။ ပံုစံကုိမရွင္းျပခင္ေအာက္က code ေလးကို အရင္ တစ္ခ်က္ၾကည့္လိုက္ပါ။ အေပၚက group ထဲမွာ
သံုးထားတဲ့ data ကို ပဲ table ပံုစံနဲ႕ ထုုတ္ျပမွာျဖစ္ပါတယ္။

<?php

require ‘FirePHPCore/fb.php’;

$users = array(‘Johnathan’, ‘Kai’, ‘Robert’, ‘Leo’, ‘Kath’);

$table[] = array(‘Name’, ‘Secrect Key’);

foreach ($users as $value) {

$secret_key = sha1($value.’s@1tk3y’);
$table[] = array($value, $secret_key);
}

FB::table(‘User Secret Key’, $table);

ဒီမွာ ေနာက္ဆံုး FirePHP အလုုပ္လုပ္တာကေတာ့ FB::table ဆိုၿပီး ထုုတ္လိုက္တာပါ။ သူက table data ေတြကို array
အေနနဲ႕ ေပးရပါတယ္။ ပထမဦးဆံုး Line ကိုေတာ့ table ရဲ႕header ေတြလို႔ သတ္မွတ္ပါတယ္။ ဒါေၾကာင့္ ပထမဦးဆံုး Loop မပတ္ခင္မွာ
Table header အတြက္ ေၾကျငာေပးထားပါတယ္။ ေနာက္ေတာ့မွာ loop ထဲမွာ data row တစ္ခုစီ $table ထဲကို ထည့္သြားပါတယ္။
ေနာက္ဆံုးမွ FB::table() ကို သံုးၿပီး console ထဲမွာ ထုုတ္ေပးလိုက္ပါတယ္။
Debugging PHP code with
FirePHP

Traces

တကယ္လုိ႔ method တစ္ခု ေခၚလုုိက္တဲ့ အခါမွာ backtrace ျပန္လုိက္ၿပီး File, Line, Class, Method နဲ႕ Function
ေတြကုိ ျပေစခ်င္ရင္ trace ကို သံုးပါတယ္။

<?php

require ‘FirePHPCore/fb.php’;

function sayHello($name) {
echo “Hello,”.$name.”!”;
FB::trace(“Trace in sayHello”);
}

function greeting($name) {
sayHello($name);
}

greeting(‘John’);

console ထဲမွာေအာက္ကအတိုင္းေတြ႔ရပါမယ္။

ဒီမွာ sayHello() ဆိုတဲ့ function ထဲမွာ Trace လိုက္ထားတဲ့ အတြက္ ပထမဆံုး အလုုပ္လုပ္တဲ့ FB::trace က index.php
Line 7 မွာ စအလုုပ္လုပ္ပါတယ္။ သူ႕ကို index.php Line 11 greeting function ထဲမွာ ေခၚထားတာကို ေျပာတာပါ။ ေနာက္ဆံုးက ေတာ့
အရင္ ဦ:ဆံုးေခၚလုုိက္တဲ့ index.php Line 14 က greeting function ကိုျပပါတယ္။ ဒါက example ျဖစ္တဲ့ အတြက္ သိပ္မသိသာပါဘူး။
တကယ္လက္ေတြ႕ သံုးတဲ့ အခါမွာေတာ့ အရမ္းကို အသံုးဝင္မွာပါ။

ဒီေလာက္ဆိုရင္ေတာ့ FirePHP အေၾကာင္းေတာ္ေတာ္ေလး ျပည့္စံုသြားၿပီလို႔ထင္ပါတယ္။


Create Note Application with
Laravel 4 (II)

P H P

Nyan Lynn Htut


Myanmar Links Professional Web Development Team မွာ Web
Developer တစ္ေယာက္အေနနဲ႕ လုပ္ကိုင္ေနသူ တစ္ေယာက္၊ PHP
Open Source CMS တစ္ခုျဖစ္တဲ့ Reborn CMS ရဲ႕ Core Develop-
er တစ္ေယာက္၊ REST API နဲ႕ Frontend Javascript Application
ေတြအေၾကာင္းကို စိတ္ဝင္စားသူ။

Facebook : facebook.com/nyanlynnhtut
Twitter : @nyanlynnhtut
Github : @nyanlynnhtut
Create Note Application With Laravel 4 (II)

ၿပီးခဲ့တဲ့ {echo} issue မွာတုန္းက ကၽြန္ေတာ္တို႕ေတြ အေနနဲ႕ Laravel 4 ကို အသံုးခ်ၿပီးေတာ့ Note Application
တစ္ခုတည္ေဆာက္ခဲ့ၾကပါတယ္။ CRUD အပိုင္းေတြအထိၿပီးခဲ့ၿပီးေတာ့ အခု issue မွာေတာ့ Authentication အပိုင္းကို ဆက္ၿပီးေတာ့
သြားၾကပါမယ္။ Authentication ဆိုတာက ၾကည့္လိုက္ရင္သာ ဘာမွမဟုတ္ဘူးလို႕ ထင္စရာရွိေပမယ့္ တကယ္တန္းမွာေတာ့
ေတာ္ေတာ္ေလးကို ဂရုစိုက္ၿပီး ေရးၾကရပါတယ္။ အရင္က Framework အမ်ားစုမွာတုန္းကေတာ့ Authentication အတြက္ဆိုရင္
တစ္ျခား Third party library ေတြကို အသံုးျပဳရေလ့ရွိပါတယ္။ ဒါေပမယ့္ ေနာက္ပိုင္း Framework အမ်ားစုမွာေတာ့ Authentication
အတြက္ပါ တစ္ခါထဲ ပါဝင္လာတာကို ေတြ႕ႏိုင္ပါတယ္။ အဲ့ဒီလို Authentication ပါဝင္လာၿပီးသား Framework ေတြထဲမွာ Laravel
လဲတစ္ခုအပါအဝင္ပါပဲ။

(တစ္ကယ္လို႕ Laravel က ပါလာၿပီးသား Auth System ကို အသံုးမျပဳလိုရင္လဲ တစ္ျခား Laravel Auth Packages ေတြကို
အသံုးျပဳႏိုင္ပါတယ္။ Sentry ကေတာ့ ေတာ္ေတာ္ေလးကို ေကာင္းမြန္ ျပည့္စံုတဲ့ Package တစ္ခုပါ။ တစ္ျခား Confide တို႕ Ardent
တို႕ကိုလဲ အသံုးျပဳသူမ်ားပါတယ္)

User Table
ၿပီးခဲ့တဲ့ issue တုန္းက ကၽြန္ေတာ္တို႕ေတြ user data အတြက္ table ကို ေဆာက္ခဲ့ၿပီးပါၿပီ။ ဒီအတြက္ ကၽြန္ေတာ္တို႕ user
table ရဲ႕ structure ေလာက္ပဲ ဒီထဲမွာ ျပန္ေရးေပးပါေတာ့မယ္။ (လိုအပ္ရင္ အရင္လက issue မွာ ျပန္လည္ဖတ္ရႈႏိုင္ပါတယ္)

id [pk, ai]

title [varchar]

content [text]

user_id [int]

created_at [datetime]

updated_at [datetime]

User Seed Data


Seed data ဆိုတာကေတာ့ Development လုပ္ေနတဲ့အခ်ိန္မွာ သံုးဖို႕အတြက္ dummy data ကို ဆိုလိုပါတယ္။
ဆိုၾကပါေတာ့ ကၽြန္ေတာ္တို႕ေတြ အခု Authentication ကို ေရးတဲ့အခ်ိန္မွာ login process ကို ေရးဖို႕ရာ demo user လိုပါတယ္။
အဲ့ဒီအတြက္ Register Form ကေန user create လုပ္မေနေတာ့ပဲနဲ႕ Seeder ကို အသံုးခ်ၿပီးေတာ့ User တစ္ေယာက္ဖန္တီးလိုက္ပါမယ္။
အဲ့ဒီအတြက္ လိုအပ္တဲ့ SeederClass ကို app/database/seeds folder ထဲမွာ သြားၿပီးေတာ့ ေဆာက္ေပးရပါမယ္။
Create Note Application With Laravel 4 (II)

<?php

class UserSeeder extends DatabaseSeeder


{
public function run()
{
$user = array(
‘username’ => ‘echo’,
‘password’ => Hash::make(‘password’),
‘email’ => ‘echo.emagz@gmail.com’
);

User::create($user);
}
}

အခုဆိုရင္ username echo ဆိုတဲ့ နာမည္နဲ႕ demo user တစ္ေယာက္ေဆာက္ဖို႕ရာ အတြက္ လိုအပ္တဲ့ Seeder Class ကို
ေရးၿပီးသြားပါၿပီ။ ၿပီးသြားရင္ ဒီ Class ကိုေဆာက္ထားတဲ့ folder ထဲမွာပဲ ရွိတဲ့ DatabaseSeeder ဆိုတဲ့ file မွာ အနည္းငယ္ သြားၿပီးေတာ့
ျပင္ဆင္ေပးရပါမယ္။

// $this->call(‘UserTableSeeder’);

ဒီ comment ပိတ္ထားတဲ့ line ေနရာမွာ ဒီလိုမ်ိဳး ေျပာင္းေပးလိုက္ပါတယ္။

$this->call(‘UserSeeder’);

UserSeeder ဆိုတာကေတာ့ ကၽြန္ေတာ္တို႕ လုပ္ခဲ့တဲ့ Classပါ။ ဒီေနရာမွာ ေျပာစရာတစ္ခုရွိတာကေတာ့ UserSeeder Class မွာ သံုးခဲ့တဲ့
User::create() ဆိုတာပါ။ ဒါကေတာ့ Laravel မွာ ပါလာၿပီးသားျဖစ္တဲ့ UserModel ကို အသံုးျပဳတာပဲ ျဖစ္ပါတယ္။ app/models folder
ထဲမွာ ရွိပါတယ္။ ၿပီးသြားရင္ေတာ့ လိုအပ္တဲ့ connections ေတြကို သြားၿပီးေတာ့ သတ္မွတ္ေပးပါမယ္။ app/config folder ထဲက auth.
php ကို ဖြင့္လိုက္ပါ။ အဲ့ဒီ file ထဲမွာက Laravel Authentication System အတြက္ လိုအပ္တဲ့ configuration ေတြပါပါတယ္။

ပထမတစ္ခုက driver ပါ။ ဒါကဘာအတြက္လဲ ဆိုေတာ့ Laravel Auth မွာ Driver ၂ ခုပါပါတယ္။ Eloquent နဲ႕ Database
ပါ။ Database ကေတာ့ ရိုးရိုး Query Builder ကိုပဲ သံုးထားတာျဖစ္ၿပီးေတာ့ Eloquent ကေတာ့ Eloquent ORM ကို သံုးထားပါတယ္။
ေနာက္တစ္ခုကေတာ့ model ပါ။ ဒါကေတာ့ Eloquent Driver ကို သံုးၿပီဆိုရင္ မျဖစ္မေနလိုအပ္ပါတယ္။ Default Model ကေတာ့
User ပါ။ ဒါကေတာ့ Laravel မွာ အသင့္ပါလာတဲ့ User model ပဲ ျဖစ္ပါတယ္။ အခု Application မွာေတာ့ Eloquent Driver နဲ႕
အသင့္ပါလာၿပီးသား User Model ကိုပဲ သံုးမွာ ျဖစ္တဲ့အတြက္ ဘာမွ ခ်ိန္းေပးစရာမလိုေတာ့ပါဘူး။ ေနာက္တစ္ခုကေတာ့ table ပါ။
Create Note Application With Laravel 4 (II)

ဒါကေတာ့ database table name ပါ။ Eloquent ကို သံုးမွာ ျဖစ္တဲ့အတြက္ ဒီ value ကိုေမ့ထားခဲ့လို႕ရပါတယ္။ Database Driv-
er ကို သံုးမွာသာ ဒီေနရာမွာ ကိုယ္ဖန္တီးထားတဲ့ table name ကို မွန္ကန္စြာ ျဖည့္စြက္ဖို႕လိုပါတယ္။ ၿပီးသြားရင္ေတာ့ User Mod-
el မွာအနည္းငယ္သြားျပင္ရပါမယ္။ ဘာေၾကာင့္လဲဆိုေတာ့ ကၽြန္ေတာ္တို႕က table name ကိုuser ဆိုၿပီး ေပးထားခဲ့လို႕ပါ။ Default
ပါလာတဲ့ table ကေတာ့ users ျဖစ္ေနတာေၾကာင့္ပါ။ အဲ့ဒီအတြက္ Model မွာ ဒီလို ျပင္လိုက္ပါတယ္။

protected $table = ‘users’;

အစား

protected $table = ‘user’;

ဆိုၿပီးေတာ့ ျပင္လိုက္ပါတယ္။ ဒါေတြ ျပင္ၿပီးသြားရင္ေတာ့ command line ကေန seed ကို run လို႕ရပါၿပီ။

Terminal ကေနၿပီးေတာ့ ဒီ command ေတြကို run လိုက္ပါ။

composer dump-autoload
php artisan migrate
php artisan db:seed

ၿပီးသြားရင္ ကၽြန္ေတာ္တို႕ရဲ႕ user table မွာ သြားၾကည့္ရင္ echo ဆိုတဲ့ user ကို ေတြ႕ရပါမယ္။

Start Logging In
Demo user လဲေဆာက္ၿပီးသြားၿပီဆိုေတာ့ အရင္ဆံုး Login အတြက္ စေရးၾကပါမယ္။ အဲ့ဒီအတြက္ Controller
အသစ္တစ္ခုေဆာက္ပါမယ္။ app/controllers folder ထဲမွာ UserController ဆိုၿပီးေဆာက္လိုက္ပါ။ ၿပီးသြားရင္ app/views folder
Create Note Application With Laravel 4 (II)

ထဲမွာ user ဆိုတဲ့ folder ကိုေဆာက္ပါ။ ေဆာက္ၿပီးသြားရင္ အဲ့ဒီ folder ထဲမွာ login.blade.php ဆိုၿပီး login အတြက္view
တစ္ခုေဆာက္ပါမယ္။

ဒီေနရာမွာ ၿပီးခဲ့တဲ့ issue တုန္းက bootstrap အတြက္ text နဲ႕ textarea အတြက္ helper function ေရးေပးခဲ့တာ
မွတ္မိမယ္ ထင္ပါတယ္။ အခုလဲ အဲ့ဒီလိုမ်ိဳး function တစ္ခုေရးေပးရပါမယ္။ password filed အတြက္ပါ။ ဒါေၾကာင့္မို႕လို႕႔ အရင္ဆံုး ဒီ
function ကိုေရးလိုက္ပါတယ္။

if (!function_exists(‘password_field’))
{
function password_field($name, $label)
{
$ui = ‘<div class=”form-group”>’;

$ui .= ‘<div class=”form-group”>’;


$ui .= Form::label($name, $label, array(‘class’ => ‘col-
lg-2 control-label’));
$ui .= ‘<div class=”col-lg-10”>’;
$ui .= Form::password($name, array(‘class’ => ‘form-
control’));
$ui .= ‘</div>’;
$ui .= ‘</div>’;

return $ui;
}
}

Helper function ေရးၿပီးတဲ့ေနာက္မွာေတာ့ ကၽြန္ေတာ္တို႕ေတြ login view ကိုတည္ေဆာက္ၾကပါမယ္။ ကၽြန္ေတာ္တို႕ရဲ႕


login view ပံုစံက ဒီလိုမ်ိဳးပါ။

@extends(‘layouts.master’)

@section(‘content’)

@if(Session::has(‘message’))
{{ Session::get(‘message’) }}
@endif

{{ Form::open(array(‘url’ => URL::current(), ‘class’ => ‘form-


horizontal’)) }}
<h3>User Login</h3>

{{ text_field(‘username’, ‘Username’, null) }}


Create Note Application With Laravel 4 (II)

{{ password_field(‘password’, ‘Password’) }}

<div class=”form-group”>
<div class=”col-lg-offset-2 col-lg-10”>
<button type=”submit” class=”btn btn-default”>Login</button>
</div>
</div>

{{ Form::close() }}

@stop

View ကို ဖန္တီးၿပီးသြားရင္ေတာ့ User Controller မွာ login အတြက္ေရးၾကပါမယ္။ User::login မွာ ဘာေတြပါမလဲဆိုေတာ့
ဒီ action ကို GET method နဲ႔လာရင္ေတာ့ View Response ျပန္ၿပီးေတာ့ POST method နဲ႔လာခဲ့ရင္ေတာ့ Login Process ကိုလုပ္ပါမယ္။
အရင္ဆံုး GETအတြက္ကို ေရးၾကည့္ၾကပါမယ္။

public function login()


{
$site_title = ‘Login’;

return View::make(‘user.login’, compact(‘site_title’));


}

ေနာက္တစ္ဆင့္အေနနဲ႕ Route ေရးေပးရပါမယ္။

Route::any(‘login’, ‘UserController@login’);

ၿပီးသြားရင္ Browser ကေန ဒီ URL ကို ေခၚၾကည့္မယ္ဆိုရင္ Login View ကိုေတြ႕ရပါမယ္။

ဒီအဆင့္အထိ OK တယ္ဆိုရင္ ကၽြန္ေတာ္တို႕ေတြ Login Form ကေန POST method နဲ႔ Data ပို႕လိုက္မယ့္ အပိုင္းကို
ဆက္သြားပါမယ္။ အဲ့ဒီ အတြက္ User Controller ထဲက login method မွာ လိုအပ္တဲ့ code ေတြထပ္ထည့္ပါမယ္။
Create Note Application With Laravel 4 (II)

public function login()


{
$site_title = ‘Login’;

if (is_post()) {
$v = Validator::make(Input::all(), array(
‘username’ => ‘required’,
‘password’ => ‘required’
));

if ($v->passes()) {
$credentials = array(
‘username’ => Input::get(‘username’),
‘password’ => Input::get(‘password’)
);

if (Auth::attempt($credentials)) {
return Redirect::to(‘note’);
}
}

return Redirect::to(‘login’)->with(‘message’, ‘Username
/ Password is invalid!’);

return View::make(‘user.login’, compact(‘site_title’));


}

Request Method က Post ျဖစ္တဲ့အခ်ိန္မွာ အရင္ဆံုး Validation စစ္ပါတယ္။ username ေရာ password ေရာ ႏွစ္ခုလံုးက
မပါမျဖစ္ပါရမယ္လို႕ သတ္မွတ္ေပးပါတယ္။ ၿပီးေတာ့ Validation passes ျဖစ္ရင္ Auth::attempt() ဆိုၿပီးေတာ့ login အတြက္လုပ္ပါတယ္။
တကယ္လို႕ login သာ မွန္ခဲ့မယ္ဆိုရင္ေတာ့ NoteController::index action ကို သြားပါဆိုၿပီးေတာ့ Redirect လုပ္ပါတယ္။ တကယ္လို႕
မမွန္ခဲ့ရင္ေတာ့ ဒီ Login Action ကိုပဲ ျပန္ၿပီးေတာ့ Redirect လုပ္ပါတယ္။ Redirect လုပ္တဲ့ေနရာမွာလဲ Error အတြက္ Message
ပါတစ္ပါတည္း ထည့္ေပးလိုက္ပါတယ္။

Login အတြက္ရၿပီးတဲ့ေနာက္မွာ Logout အတြက္ေရးပါမယ္။ ဒီအတြက္က ဘာမွ မခက္ခဲပါဘူး။ ေအာက္ကအတိုင္း


ေရးေပးလိုက္ရင္ရပါၿပီ။

public function logout()


{
Auth::logout();

return Redirect::to(‘/’);
}
Create Note Application With Laravel 4 (II)

Login ေတြ Logout ေတြရၿပီးသြားရင္ ကၽြန္ေတာ္တို႕ရဲ႕ Note Application မွာ ဒီလိုမ်ိဳးသတ္မွတ္ခ်င္ပါတယ္။ Note::index ကိုေတာ့
ဘယ္သူမဆို ျမင္ရမယ္ေပါ့။ create/ edit/ delete ေတြကိုေတာ့ Login User ကိုပဲ ေပးလုပ္ေစခ်င္ပါတယ္။ ဒီအတြက္ ကၽြန္ေတာ္တို႕ရဲ႕
Route ကို Filter လုပ္ထားပါမယ္။ app/filters.php file မွာ route အတြက္ filter ေတြေရးလို႕ရပါတယ္။ default filter ေတြလဲ
ပါလာၿပီးသားပါ။ အဲ့ဒီထဲကမွ auth ဆိုတဲ့ filter ကို သံုးပါမယ္။ သူက User Login မဟုတ္ရင္ login page ကို သြားဆိုၿပီေတာ့ filter
လုပ္ထားတာပါ။ အဲ့ဒီအတြက္ app/routes.php file မွာ ဒါမ်ိဳးေရးလိုက္ပါမယ္။

Route::when(‘note/*’, ‘auth’);

note/* ဆိုတာကေတာ့ note/ ၿပီးရင္ဘာပဲလာလာလို႕ဆိုလိုပါတယ္။ note/create, note/edit/1 အစရွိသျဖင့္ အက်ံဳးဝင္ပါတယ္။


ဒီလို လာရင္ auth ကို filter ခံမယ္လို႕ေျပာလိုက္တာပါ။ ၿပီးသြားရင္ user logout လုပ္ၿပီးေတာ့ စမ္းၾကည့္ပါ။ note ကို သြားရင္
သြားလို႕ရေနပါမယ္။ note/edit, note/create, note/delete အစရွိတာေတြကို သြားရင္ေတာ့ User Login မျဖစ္တဲ့အတြက္ login page
ကိုပဲ ေရာက္သြားပါလိမ့္မယ္။

ကဲအဆင္ေျပသြားၿပီဆိုရင္ေတာ့ ေနာက္ဆံုးအဆင့္ကို သြားၾကပါမယ္။ ဒီအဆင္႔မွာေတာ့ Note ကို create/edit ေတြမွာ


User ID ကို Fake လုပ္ခဲ့တာကို login user ရဲ႕ ID နဲ႕ အမွန္အကန္သံုးသြားမွာပါ။

create နဲ႕ edit ထဲက user_id သတ္မွတ္တဲ့ေနရာမွာ ဒီလိုျပင္ေပးရပါမယ္။

// Oldies $note->user_id = 1;
$note->user_id = Auth::user()->id;

ဒါဆိုရင္ ကၽြန္ေတာ္တို႕ေတြ ေရးသားေနတဲ့ Application က ၿပီးဆံုးသြားၿပီျဖစ္ပါတယ္။ User Register ကိုေတာ့


ကၽြန္ေတာ္ေရးမျပေတာ့ပါဘူး။ Google ကေန ရွာမယ္ဆိုရင္ အလြယ္တစ္ကူရွာႏိုင္ပါတယ္။ အခုလက္ရွိ ေရးသားထားတဲ့ အေျခခံအဆင့္ကို
ကိုယ္ကိုတိုင္ ထပ္ၿပီးေတာ့ အဆင့္ျမင့္တင္ႏိုင္ေအာင္ ရည္ရြယ္ၿပီး ထားခဲ့လိုက္တာပါ။ Programmer တစ္ေယာက္လုပ္ၿပီဆိုရင္ Goo-
gle မွာ ရွာေဖြဖို႕နဲ႕ ကုိယ္တိုင္ထပ္မံေလ့လာဖို႕ကို ပ်င္းေနလို႕မရပါဘူး။ ဒါေၾကာင့္မို႕လို႕ ကိုယ္တိုင္ဆက္လက္ ေရးသားႏိုင္ပါေစလို႕
ဆုမြန္ေကာင္းေတာင္းေပးရင္း ဒီေနရာမွာပဲ ရပ္နားလိုက္ပါတယ္။
Tips to Speed Up Your Website

i c l e
Art

K
Facebook : /khaylay
Twitter : @khayusaki
Github : @khay
Website : http://khay.me
Tips to Speed Up Your Website

ကၽြန္ေတာ္တို႕ရဲဲ႕ Website ေတြကို ဖြင့္ၾကည့္မယ္ဆိုရင္ ေႏွးေနတာေတြ ျဖစ္ေနမယ္ဆိုရင္ေတာ့ အဲ့ဒါက


အရြယ္အစားႀကီးမားတဲ့ data ေတြကို ျပန္ေပးတဲ့ query ေတြရွိေနလို႕ပါပဲ။ ဒီေနရာမွာ အင္တာနက္ျမန္ႏႈန္းဆိုတာကို ခဏေမ့ထားပါ။
သာမန္ HTML, CSS, JavaScript တင္အသံုးျပဳထားတဲ့ Website တစ္ခုအတြက္ loading time အၾကာႀကီးယူေနရတယ္ဆိုတာက
မျဖစ္သင့္ပါဘူး။ တစ္စကၠန္႕အခ်ိန္အတြင္းမွာ website loading ၿပီးသြားတယ္ဆိုရင္ေတာ့ အဲ့ဒါေတာ္ေတာ္ေလးကို ေကာင္းမြန္တဲ့
အခ်က္လို႕ ေျပာလို႕ရပါတယ္။ ၃ စကၠန္႕ဆိုရင္ေတာင္ ေကာင္းေနေသးတယ္ေျပာလို႕ရပါတယ္။ အမ်ားဆံုး ၇ စကၠန္႕ေလာက္အထိကေတာ့
အဆင္ေျပေနေသးေပမယ့္ ၁၀ စကၠန္႕ေက်ာ္တဲ့အထိ loading လုပ္ေနေသးတဲ့ဆိုရင္ေတာ့ ဘယ္သူမွ စိတ္ရွည္ေတာ့မွာ မဟုတ္ပါဘူး။
အေရးတႀကီးလိုအပ္ေနတဲ့ ကိစၥမ်ိဳးအတြက္ကလြဲၿပီး က်န္တဲ့အခ်ိန္ေတြမွာဆိုရင္ေတာ့ အဆိုပါ website ေတြကို ဘယ္သူမွ အခ်ိန္ေပး
ေစာင့္ဆိုင္းေနမွာမဟုတ္ပါဘူး။ စီးပြားေရးအရဆိုရင္လည္း နစ္နာ ဆံုး႐ံႈးစရာ ကိစၥေတြ ျဖစ္လာပါလိမ့္မယ္။ အဲ့ဒီအတြက္ ဒီေနရာမွာ
ကၽြန္ေတာ့္အေနနဲ႕ သိထားသိအပ္တာေတြကို ရွင္းျပေပးသြားမွာပါ။

႐ုပ္ပံုမ်ားႏွင့္ ပတ္သက္၍
Wordpress တို႕ Joomla တို႕လိုမ်ိဳး Content Management System (CMS) ေတြမွာဆိုရင္ ကၽြန္ေတာ္တို႕ေတြအေနနဲ႕
image upload ျပဳလုပ္တဲ့အခါ Image Size ကို ခ်ံဳ႕ခ်ဲ႕တာေတြ ျပဳလုပ္လို႕ရတာ ေတြ႕ရပါလိမ့္မယ္။ အမ်ားအားျဖင့္ ျမင္ဖူးသေလာက္
တစ္ခ်ိဳ႕ Website ေတြမွာဆိုရင္ High Resolution ပံုေတြကို CSS ေတြနဲ႕ အရြယ္အစားေတြ ေသးၿပီး သံုးထားတာကို ေတြ႕ရပါလိမ့္မယ္။
အဲ့ဒီလို Website ကို loading လုပ္တဲ့အခါမ်ိဳးမွာ CSS ေၾကာင့္ အရြယ္အစား ေသးေနေပမယ့္ အကယ့္ အရြယ္အစားႀကီးတဲ့ ပံုကို down-
load ျပဳလုပ္ရတဲ့အတြက္ အဲ့ဒီလိုပံုေတြ အမ်ားႀကီးရွိေနတဲ့ Website ဟာဆိုရင္ ဘယ္နည္းနဲ႕မွ ျမန္ျမန္ဆန္ဆန္ တက္လာမွာ မဟုတ္ပါဘူး။
အဲ့ဒီအတြက္ ကၽြန္ေတာ္တို႕ေတြအေနနဲ႕ ႐ုပ္ပံုေတြ အသံုးျပဳမယ့္ ေနရာနဲ႕ သင့္ေတာ္တဲ့ အရြယ္အစားကို သတ္မွတ္ၿပီး အသံုးျပဳတာက
ပိုၿပီးေတာ့ သင့္ေတာ္ပါတယ္။ အဲ့ဒီအတြက္ Photoshop လိုမ်ိဳး software ကို အသံုးျပဳၿပီး pixel dimensions ေတြ ကိုက္ညႇိႏိုင္ပါတယ္။

CMS ေတြသံုးၿပီဆိုရင္ အမ်ားအားျဖင့္ကေတာ့ ရွိသမွ် ေကာင္းတဲ့ Free plugins မွန္သမွ် အကုန္သြင္းေတာ့တာပါပဲ။


အမွန္က ကိုယ့္ Website မွာ မလိုအပ္တဲ့ plugins ဆိုရင္ မသံုးတာ အေကာင္းဆံုးပါပဲ။ အဲ့ဒီလို မလိုအပ္တဲ့ plugins ေတြေၾကာင့္ ကိုယ့္
website ကို လာေရာက္ၾကည့္႐ႈတဲ့သူေတြအေနနဲ႕ အဲ့ဒီ plugins ေတြကို load လုပ္ရတဲ့အတြက္ မလိုလားအပ္ပဲ အခ်ိန္ပိုကုန္တာပဲ
အဖတ္တင္ပါတယ္။ ဒါ့အျပင္ plugins ဆိုတာေတြက ကိုယ့္အတြက္လုိအပ္တဲ့ Feature ေတြပါသလို မလိုလားအပ္တဲ့ Feature
ေတြလည္း ပါဝင္ေလ့ရွိပါတယ္။ ျဖစ္ႏိုင္သမွ်ေတာ့ အတတ္ႏိုင္ဆံုး ကိုယ္လိုအပ္တဲ့ အပိုင္းအတြက္ ကိုယ့္ရဲ႕ CMS theme မွာ ကိုယ္တိုင္
ထည့္သြင္းလိုက္တာက ပိုၿပီးေတာ့ website ကို ပိုမို ျမန္ဆန္လာပါေစလိမ့္မယ္။ ဒါ့အျပင္ CMS ေတြမွာဆိုရင္ update ေတြ အခ်ိန္နဲ႕
အမွ် ရွိတတ္ပါတယ္။ အဲ့ဒီလို အခါမ်ိဳးဆိုရင္ေတာ့ ကၽြန္ေတာ္တို႕အေနနဲ႕ version upgrade ေတြကို လိုက္လုပ္ေပးဖို႕ လိုပါလိမ့္မယ္။
Developer ေတြအေနနဲ႕ သူတို႕ရဲ႕ code ေတြကို တစ္ခါထက္တစ္ခါ ပိုေကာင္းေအာင္ ေရးသားေနတဲ့အတြက္ speed အေနနဲ႕လည္း
ပိုၿပီးတိုးတက္လာမွ ျဖစ္ပါတယ္။
Tips to Speed Up Your Website

Speed ကို ဘယ္လိုတိုင္းတာႏိုင္မလဲ?


ဘယ္သူမဆို ကိုယ့္ Website ဘယ္ေလာက္ထိ ျမန္ဆန္သလဲ ဆိုတာကို သိခ်င္ၾကတဲ့သူေတြခ်ည္း ပါပဲ။ အဲ့ဒီလို
တိုင္းတာႏိုင္ဖို႕အတြက္ tools ေတြ အဆင္သင့္ ရွိၿပီးသားပါ။

Google PageSpeed insights

Pingdom

Yahoo! Yslow

WebPageTest

အေပၚက Tools ေတြကေတာ့ အသံုးမ်ားတဲ့ Tools ေတြပဲ ျဖစ္ပါတယ္။ ဒါေပမယ့္ အဲ့ဒီမွာ score ဘယ္ေလာက္ရသလဲဆိုတာထက္ ကၽြန္ေတာ္
website ကို ဘယ္ေလာက္ျမန္ေအာင္ ျပဳလုပ္ႏိုင္သလဲဆိုတာက ပိုၿပီးေတာ့ အေရးပါပါတယ္။ အဲ့ဒီ Tools ေတြက ကၽြန္ေတာ္တုိ႕ကို
ဘယ္ေနရာမွာ ဘယ္လိုေတြရွိတယ္ဆိုတာပဲ ျပသေပးမွာပါ၊ website နဲ႕ ပတ္သတ္ၿပီး ဘယ္လို ျပဳျပင္မႈေတြ ျပဳလုပ္ရမလဲ? ဘယ္လို
ျပႆနာေတြကို ေျဖရွင္းရမလဲဆိုတာကုိေတာ့ ေျပာျပေပးမွာမဟုတ္ပါဘူး။

CSS ဖိုင္ေတြ JavaScript ဖိုင္ေတြ အမ်ားအားျဖင့္ browser ကေနၿပီးေတာ့ cache ျပဳလုပ္ေပးတဲ့အတြက္ file size
ႀကီးတာ ေသးတာက အဲ့ဒီေလာက္ႀကီး ျပႆနာမရွိဘူးလို႕ တစ္ခ်ိဳ႕ေတြက ေျပာၾကပါတယ္။ မွန္ပါတယ္၊ သို႕ေပမယ့္လည္း code
ေတြကို နည္းစနစ္တက်ေရး၊ minify ေတြ၊ compress ေတြလုပ္ၿပီး size ကို ေလ်ာ့ခ်ႏိုင္တာကို ဘာလို႕ မလိုအပ္ပဲနဲ႕ ႀကီးမားတဲ့ file
ေတြအတြက္ ကနဦး load time ကို အၾကာႀကီးျဖစ္ေစခ်င္ရတာလဲ? အဲ့ဒီအဆင့္ေတြကို အသံုးျပဳၿပီး file ကိုသာမက page load time
ကိိုလည္း သိသိသာသာ ေလ်ာ့ခ်ႏိုင္ပါတယ္။ Connection မေကာင္းတဲ့ Mobile devices ေတြကေန အသံုးျပဳၾကည့္လာႏိုင္မယ္ဆုိတဲ့
အခ်က္ကိုလည္း ေမ့ထားလို႕ မရပါဘူး။ Mobile ေတြကေနၿပီးေတာ့ ကိုယ့္ Website ကိုေခၚၾကည့္တဲ့အခါ အၾကာႀကီးေစာင့္ေနတာေတာင္
တက္မလာေသးဘူးဆိုရင္ ေယဘုယ်အားျဖင့္ အသံုးျပဳသူေတြအေနနဲ႕ ဆက္လက္ေစာင့္စားေနမွာမဟုတ္ပဲ ပိတ္ပစ္လိုက္မွာပါ။

CSS Sprite?
CSS Sprite ေတြကိုအသံုးျပဳၿပီး Image ေတြကို ေပါင္းလိုက္ျခင္းျဖင့္ website မွာ ပံုေတြ အမ်ားႀကီး load လုပ္စရာမလိုေအာင္
ျပဳလုပ္ႏိုင္ပါတယ္။ ေျပာရမယ္ဆိုရင္ CSS Sprite ဆိုတာ ပံုမွန္အားျဖင့္ ပံုအေသးေလးေတြကို ေပါင္းထားတဲ့ ႐ုပ္ပံုႀကီး တစ္ခုျဖစ္ေအာင္
ျပဳလုပ္လိုက္တာမ်ိဳးပါ။ အရင္တုန္းက ႐ုပ္ပံု ငါးခုကို load လုပ္ရမယ္ဆိုရင္ CSS sprite ကို အသံုးျပဳၿပီး ႐ုပ္ပံု တစ္ပံုပဲ load လုပ္ရေတာ့
မွာပါ။ အမ်ားအားျဖင့္ကေတာ့ ကၽြန္ေတာ္တို႕ glyphicons အတြက္ အသံုးျပဳတာမ်ားပါတယ္။

႐ုပ္ပံုေတြအတြက္ CSS Sprites ေတြျပဳလုပ္ဖို႕ အလြယ္ကူဆံုးနည္းလမ္းကေတာ့


Spritme ပါပဲ။
Tips to Speed Up Your Website

Resources ေတြအတြက္ CDN ေတြကို အသံုးျပဳပါ


CDN ဆိုတာကေတာ့ Content Delivery Network ကို အတိုေကာက္ေခၚတာျဖစ္ၿပီး အသံုးျပဳသူတစ္ေယာက္က data
ကို request လုပ္တဲ့အခါမွာ အဲ့ဒီသူနဲ႕ အနီးဆံုး ေနရာကေန server cache ျပဳလုပ္ထားတာေတြကို ဆိုလိုပါတယ္။ CDN ေတြအေနနဲ႕
လိုအပ္ခ်က္အေပၚမူတည္ၿပီး cache ျပဳလုပ္တာကလည္း အဆင့္အမ်ိဳးမ်ိဳး ကြာျခားခ်က္ေတြရွိပါတယ္။

ဥပမာ အေနနဲ႕ jQuery ကိုအသံုးျပဳမယ္ဆိုရင္ ကၽြန္ေတာ္တို႕အေနနဲ႕ ကိုယ္ပိုင္ server မွာ ေနာက္ဆံုးထြက္ရွိထားတဲ့ jQuery
version ကို ထည့္သြင္းထားမယ္၊ ေခၚယူအသံုးျပဳမယ္။ ၿပီးေတာ့ အသံုးျပဳသူရဲ႕ ကြန္ပ်ဴတာထဲကို download ျပဳလုပ္ထားမယ္၊ ေနာက္ထပ္
ေခၚယူအသံုးျပဳမယ္ဆိုရင္ ျမန္ဆန္ေအာင္အတြက္ browser ကေန cache ျပဳလုပ္ထားလိမ့္မယ္။ အကယ္၍ ကၽြန္ေတာ္တို႕အေနနဲ႕ Goo-
gle ဒါမွမဟုတ္ jQuery website ရဲ႕ CND ကိုေခၚယူအသံုးျပဳမယ္ဆိုရင္ေကာ ဘာေတြကြာျခားမလဲ? File path အေနနဲ႕ကေတာ့ http://
ajax.googleapis.com/ajax/libs/jquery/1.9.2 ဒါမွမဟုတ္ http://code.jquery.com/jquery-1.8.2.min.js ေပါ့။ အသံုးျပဳသူအေနနဲ႕
jQuery version (CDN) တူတူအသံုျပဳထားတဲ့ တျခား website တစ္ခုကိုၾကည့္႐ႈမယ္ဆိုရင္ browser ကေနၿပီးေတာ့ အဲ့ဒီ CND
ကို download ခ်၊ cache ျပဳလုပ္ေပးထားတဲ့အတြက္ ဘယ္ေလာက္ Website ေတြမ်ားမ်ား အဲ့ဒီ ဖိုင္ကို download ထပ္လုပ္ေနမွာ
မဟုတ္ေတာ့ပါဘူး။ HTTP request ကိုလည္းေလ်ာ့ခ် ႏိုင္မယ့္အတြက္ website ကလည္း ပိုၿပီးေတာ့ ျမန္ဆန္လာပါလိိမ့္မယ္။ jQue-
ry လိုမ်ိဳး code ဖိုင္ေတြမွမဟုတ္ပါဘူး။ Logo ေတြ၊ upload လုပ္ထားတဲ့ပံုေတြ၊ video ဖိုင္ေတြနဲ႕ တျခား resources ေတြကိုလည္း
CND အေနနဲ႕ အသံုးျပဳႏိုင္ပါတယ္။ ဖိုင္အေသးေလးေတြမွာရင္မသိသာႏိုင္ေပမယ့္ ဖိုင္အရြယ္အစား ႀကီးတဲ့ download ေတြ ဒါမွမဟုတ္
streaming video ေတြအတြက္ဆိုရင္ေတာ့ သိသိသာသာ ကြာျခားပါတယ္။

အၿမဲတမ္းလိုလိုက CSS နဲ႕ JavaScript ေတြကို <head> ထဲမွာ အားလံုးစုၿပီး ေရးသားထားၾကတာပါပဲ။ တကယ္တမ္း
ျဖစ္သင့္တာက CSS ေတြအားလံုးကို head ထဲမွာ ေရးသားၿပီး Script ေတြကိုေတာ့ <body> မဆံုးခင္မွာ ထည့္သြင္းသင့္ပါတယ္။ Script
ေတြကို အေပၚမွာထည့္ထားမယ္ ဆိုရင္ တစ္ခ်ိဳ႕ Script ေတြက page loading မၿပီးခင္မွာပဲ အလုပ္လုပ္သြားတဲ့အတြက္ Error တက္တာေတြ
ျဖစ္တတ္သလို loading ၾကာတာေတြလည္း ျဖစ္ပါတယ္။ အဲ့ဒီအတြက္ JavaScript, jQuery အစရွိတဲ့ script နဲ႕ပတ္သတ္တာေတြအားလံုးကုိ
Page ေနာက္ဆံုးမွ အလုပ္လုပ္ခိုင္းတာက အသံုးျပဳသူေတြအေနနဲ႕ ပိုမို ျမန္ျမန္ဆန္ဆန္နဲ႕ အသံုးျပဳလာႏိုင္မွာပဲျဖစ္ပါတယ္။

ျမန္ဆန္တဲ့ website တစ္ခုကို ပိုင္ဆိုင္ထားတယ္ဆိုတာ web ေပၚမွာေတာ့ ေအာင္ျမင္မႈတစ္ခုလို႕ေတာင္


ေျပာလို႕ရပါတယ္။ အေပၚမွာ ေျပာသြားတဲ့ အခ်က္အနည္းငယ္က ဘာမွမဟုတ္ဘူးဆိုေပမယ့္ အဲ့ဒီအခ်က္ေလးေတြကပဲ ကၽြန္ေတာ္တို႕ရဲ႕
website ရဲ႕ speed ကို ပိုမို ျမန္ဆန္ေအာင္ ေဆာင္ရြက္ေပးႏိုင္မွာပါ။ အကယ္၍ ကိုယ္Website ကို အသံုးျပဳရတာ ေႏွးလာတယ္ထင္ေတာ့
ဘာမွားယြင္းေနလဲဆိုတာကို ခ်က္ခ်င္းသိ ခ်က္ခ်င္းျပဳျပင္ႏိုင္ဖို႕ လိုအပ္ပါလိမ့္မယ္။
Creating a Laravel 4 Package

P H P

Naing Lin Aung


Anime ၾကည့္လိုက္ ၊ manga ဖတ္လုိက္ VN ေဆာ့လုိက္ နဲ ့
ဟိုေယာင္ေယာင္ ဒီေယာင္ေယာင္ otaku တစ္ေယာက္။ တခါတေလ
အားရင္ စိတ္ကူးေပါက္ရင္ သူ ့ ဘေလာ့ မွာ စာတိုေပစေလး ေရးေလ့
ရွိသူ။

Facebook : nainglinaung91
Twitter : @kelvinm0rris
Website : http://m0rris.com
Creating a Laravel 4 Package

Laravel 4 မွာေတာ့ Package အေနနဲ ့ ေျပာင္းလဲသြားပါတယ္။ Laravel 4 Package ကို workbench အသုံးျပဳျပီး Create
လုပ္ဖုိ ့အတြက္ လုိအပ္တာေတြကေတာ့ ေအာက္ပါအတိုင္း ျဖစ္ပါတယ္။

Requirement

Internet Connection

Composer

Git

Laravel 4

Laravel4 , Composer နဲ ့ Git Setup လုပ္တာနဲ ့ပတ္သတ္ျပီး Echo အေရွ ့ပိုင္း issue ေတြမွာ ထည့္သြင္းေဖာ္ျပျပီး
ျဖစ္လုိ႕ အက်ယ္ခ်ဲ ့ျပီး မေျပာေတာ့ပါ။ အရင္ဆုံး Laravel4 ရဲ app/config/workbench.php ကုိသြားျပီး ဖြင့္ပါ။ Name နဲ ့ Email ကို
ေအာက္ပါ ပုံစံအတုိင္း -

‘name’ => ‘Naing Lin Aung’,


‘email’ => ‘nainglinaungiscool@gmail.com’,

edit လုပ္လုိက္ပါ။ ထုိေနာက္ laravel4 တည္ရွိရာ directory ကုိ command line ျဖင့္သြားပါ။

php artisan workbench vendor/package --resources

ရုိက္လုိက္ပါ။ ျပီးလွ်င္ေအာက္ပါအတုိင္း Vendor ႏွင့္ Package တုိ ့ေနရာတြင္ မိမိတုိ ့ၾကိဳက္ႏွစ္သက္သလုိ ေျပာင္းလဲ ႏုိင္သည္။
ထုိေျပာင္းလဲလုိက္သည့္ အေပၚတြင္မူတည္၍ Config လုပ္ရမည့္ ပုံပါ ေျပာင္းလဲသြားမည္ ျဖစ္သည္။ Package တြင္ public , src , test ,
vendor ဟူ၍ folder ေလးခု ပါရွိမည္ ျဖစ္သည္။

public folder မွာ assets မ်ား ျဖစ္ၾကေတာ့ html, css နဲ ့javascript ဖုိင္မ်ား ထားရွိရန္ေနရာ ျဖစ္သည္။

src မွာ အမွန္တကယ္ ေရးရမည့္ Code မ်ား ထားရွိသည့္ ေနရာ ျဖစ္သည္။


Creating a Laravel 4 Package

test မွာ testing ျပဳလုပ္ရန္ျဖစ္သည္။

vendor မွာ dependency package မ်ား တည္ရွိသည္ folder ျဖစ္သည္။

ဆက္လက္အသုံးျပဳလုိသည့္ composer package မ်ားရွိပါက composer.json တြင္ မိမိၾကိဳက္ႏွစ္သက္ရာ package


မ်ားထည့္သြင္း၍ composer install ျပဳလုပ္ကာ သြင္းႏုိင္သည္

Service Provider
Service Provider မွာ Laravel4 တြင္ပါရွိသည့္ Feature တစ္ခုျဖစ္ျပီး Package မ်ားကုိ manage လုပ္ရန္
အကူအညီေပးသည္။ ယခု tutorial တြင္ Service Provider Class ကုိ -

\workbench\vendor\package\src\Vendor\Package\PackageServiceProvider.php

တြင္ ေတြ ့ရွိရမည္ ျဖစ္သည္။ ၄င္း file ကုိ ေအာက္ပါ ပုံစံအတုိင္း ျဖစ္ေအာင္ edit လုပ္လုိက္ပါ။

<?php

namespace Vendor\Package;

use Illuminate\Support\ServiceProvider;

class PackageServiceProvider extends ServiceProvider {

/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = false;

/**
* Bootstrap the application events.
*
* @return void
*/
public function boot()
{
$this->package(‘vendor/package’);
}
Creating a Laravel 4 Package

/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}

/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return array(‘package’);
}

ျပီးေနာက္ app/config/app.php ကုိဖြင့္ပါ။ မိမိ၏ ServiceProvider ကို အသစ္ျဖည့္လုိက္ပါ။

‘providers’ => array(


// --
‘Vendor\Package\PackageServiceProvider’,
),

PackageServiceProvider.php ရွိရာ Folder တြင္ Package.php ကုိ တည္ေဆာက္လုိက္ပါ။ ထုိေနာက္ ေအာက္ပါ Code
မ်ားကုိ ကူးထည့္လုိက္ပါ။

<?php

namespace Vendor\Package;

class Package {

public static function greeting(){


return “Hello World”;
}

}
Creating a Laravel 4 Package

ထုိေနာက္ PackageServiceProvider.php ထဲရွိ Register Method ကို ေအာက္ပါ အတုိင္း ျပင္လုိက္ပါ။

public function register()


{
$this->app[‘supyo’] = $this->app->share(function($app)
{
return new Supyo;
});
}

Facade တစ္ခု တည္ေဆာက္ျခင္း


ပုံမွန္အားျဖင့္ Package ထဲမွာ object မ်ားကို ေခၚယူ အသုံးျပဳရန္ object တစ္ခုတည္ေဆာက္ရမည္ ျဖစ္သည္။ သုိ ့ေသာ္
Larvel4 တြင္ Facade Class ကုိ အသုံးျပဳ ထားေသာေၾကာင့္ object တစ္ခုကုိ တည္ေဆာက္ရန္မလုိပဲ static method မ်ား ေခၚယူ
အသုံးျပဳသလုိ scope resolution operator ျဖင့္ ေခၚယူ အသုံးျပဳႏုိင္မည္ ျဖစ္သည္။ ဥပမာ -

echo Package::greeting();

သုိ ့ေသာ္ ထုိသုိ ့ျပဳလုပ္ရန္ Facade တစ္ခု တည္ေဆာက္ရန္လုိမည္။ ထုိအတြက္ Package directory ထဲတြင္ Facade ဟု အမည္ရသည့္
Folder တစ္ခု တည္ေဆာက္လုိက္ပါ။

ထုိေနာက္ Package.php ဟုေသာ file တစ္ခုကို create လုပ္လုိက္ပါ။ ျပီးပါက ေအာက္ပါ Code မ်ားကုိ ကူးထည့္လုိက္ပါ။

<?php

namespace Vendor\Package\Facades;

use Illuminate\Support\Facades\Facade;

class Package extends Facade {

/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return ‘Package’; }

}
Creating a Laravel 4 Package

ထုိေနာက္ register method ထဲတြင္ ေအာက္ပါ code ကို ေပါင္းထည့္လုိက္ပါ။

$this->app->booting(function()
{
$loader = \Illuminate\Foundation\AliasLoader::getInstance();
$loader->alias(‘Package’, ‘Vendor\Package\Facades\Package’);
});

ေနာက္ဆုံးတြင္ေတာ့ route.php တြင္

Route::get(‘/test’, function(){
echo Package::greeting();
});

ေအာက္ပါအတုိင္း ထပ္ထည့္ေပးလုိက္ပါ။ ထုိေနာက္ ထုိ test url ကုိ စမ္းေခၚလုိက္ပါက greeting method ကိုေခၚယူ အလုပ္လုပ္မည္ကုိ
ေတြ ့ရမည္ ျဖစ္သည္။
MySQL Data Types

y S Q L
M

Thet Paing
Myanmar Links Training Center မွာ Web Development အေၾကာင္းကို
စတင္ ေလ့လာကာ Web နဲ႔ ပတ္သက္တာမွန္သမွ် စိတ္ဝင္စား၍
ေလာေလာဆယ္ PHP ကိုအဓိက အသံုးျပဳေနေသာ Developer ျဖစ္ျပီး CMS
ေတြ နဲ႔ Website ေရးသားႏိုင္ကာ Reborn CMS တြင္ Module တစ္ခုစ
ႏွစ္ခုစ ပါဝင္ Develope လုပ္ေနေသာ Myanmar Links Professional Web
Development တြင္ လက္ရွိ အလုပ္လုပ္ေန သူတစ္ေယာက္ျဖစ္ပါတယ္။
MySQL Data Types

MySQL Database ကို အသံုးျပဳၿပီး ေရးသားရတဲ့ အပိုင္းေတြမွာ ထည့္သြင္းမယ့္ အေရးၾကီးတာ တစ္ခုရွိပါတယ္။ ဒါကေတာ့
ထည့္သြင္းမယ့္ Data ေတြကို သိမ္းမယ့္ Field ေတြအတြက္ Data Type ေၾကညာေပးရတာပါ။ အဲ့ဒီေနရာမွာ အသံုးျပဳမယ့္ Data Type
ေတြအေၾကာင္းကိုေတာ့ သိထားရင္ ထည့္မယ္ Data အတြက္ ဘာ Type က အဆင္ေျပဆံုးလဲ ဆိုတာ သတ္မွတ္လို႔ရမွာပါ။ ဒါေၾကာင့္
MySQL မွာ အသံုးျပဳတဲ့ Data Types ဘယ္ႏွစ္မ်ိဳးရွိတယ္၊ ဘယ္ေနရာေတြမွာ အသံုးျပဳလို႔ရတယ္ ဆိုတာကို ေလ့လာၾကည့္ပါမယ္။ Data
Types ေတြ အၾကမ္းအားျဖင့္ သံုးမ်ိဳးခဲြလို႔ရပါတယ္။

Numeric Data Types

ဒါကေတာ့ ကိန္းဂဏာန္း ေတြနဲ႔ ပတ္သတ္ၿပီး သိမ္းတဲ့ Type ေတြပါ။ Numeric Data Types ထဲမွာ ပါဝင္တဲ့ Types
ေတြကေတာ့

TINYINT

TINYINT ဆိုတဲ့ type ကေတာ့ number ေတြကို သိမ္းတဲ့ေနရမွာ အနည္းဆံုးျဖစ္ပါတယ္။ သူမွာ 1 byte data ပဲသိမ္းလို႔
ရပါတယ္။ ၿပီးေတာ့ သိမ္းလို႔ရတဲ့ range က -128 မွ 127 အထိ ပဲသိမ္းလို႔ရတာပါ။ အကယ္၍ သူ႔ရဲ႕ attributes ထဲမွာ UNSIGNED
လို႔ထည့္ထားရင္ေတာ့ 0 ကေန 255 အထိ ေျပာင္းသိမ္းေပးပါတယ္။

SMALLINT

SMALLINT ဆိုတာကေတာ့ 2 bytes data ကိုသိမ္းေပးပါတယ္။ TINYINT ထပ္ နည္းနည္းပိုၿပီး သိမ္းေပးႏိုင္ပါတယ္။


သိမ္းေပးတဲ့ range ကေတာ့ -32,768 ကေနၿပီး 32767 အထိပါ။ UNSIGNED ဆိုရင္ေတာ့ 0 ကေန 65,535 အထိသိမ္းေပးပါတယ္။
MySQL Data Types

MEDIUMINT

MEDIUMINT ကေတာ့ 3 bytes data ကိုသိမ္းေပးႏုိင္ပါတယ္။ သိမ္းေပးတဲ႔ range ကေတာ့ -8,388,608 ကေန
8,388,607 အထိပါ။ UNSIGNED ဆိုရင္ေတာ့ 0 ကေန 16,777,215 ပါ။

INT

INT ကေတာ့ Number နဲ႔ပတ္သတ္တဲ့ Data ေတြကို သိမ္းေတာ့မယ္ ဆိုရင္ မ်ားေသာအားျဖင့္ အသံုးျပဳၾကပါတယ္။ INT
ကေတာ့ 4 bytes data ကိုသိမ္းေပးပါတယ္။ သိမ္းေပးတဲ့ range ကေတာ့ -2147483648 ကေန 2147483647 အထိျဖစ္ပါတယ္။ UN-
SIGNED ဆိုရင္ေတာ့ 0 ကေန 4294967295 အထိပါ။

BIGINT

BIGINT ကေတာ့ တစ္ခါတစ္ေလ ကိုယ့္ရဲ႕ လိုအပ္ခ်က္က INT ထက္ေက်ာ္သြားတဲ့ Number ေတြကို သိမ္းခ်င္ရင္
အသံုးျပဳလို႔ရပါတယ္။ သူက 8 bytes Data ကိုသိမ္းေပးႏိုင္ပါတယ္။ range ကေတာ့ -/+9.223E+18 ပါ။ -9223372036854775808
ကေန 9223372036854775807 အထိလို႔ အဓိပၸာယ္ပါ။ UNSINGED ဆိုရင္ေတာ့ 0 ကေန 18.45E+18 အထိသိမ္းလို႔ရပါတယ္။

BIT

BIT ကေတာ့ 01 ေတြကိုသိမ္းတာပါ။ သူက 1 ကေန 64 အထိသိမ္းႏိုင္ပါတယ္။ သူက သိမ္းလိုက္တဲ့ ဂဏာန္းေတြကို 01


ေတြအေနနဲ႔ ျပန္ေျပာင္းသိမ္းေပးပါတယ္။

FLOATING POINT

FLOATING POINT Types ေတြက ေတာ့ FLOAT , DOUBLE နဲ႔ DECIMAL ဆိုၿပီးရွိပါတယ္။ အဲဒီ သံုးမ်ိဳးစလံုးက
ဒသမကိန္းေတြကို သိမ္းေပးႏိုင္ပါတယ္။ ၿပီးေတာ့ သူတို႔ရဲက ပံုစံက FLOAT (M,D), DOUBLE(M,D), DECIMAL(M,D) ဆိုၿပီးရွိပါတယ္။
အဲ့ဒါက ဘာလဲဆိုေတာ့ M ဆိုတာ အလံုးေရကို ရည္ညႊန္းတာျဖစ္ၿပီး D ဆိုတာကေတာ့ ဒသမကိန္းအေနာက္က ထည့္လို႔ရမယ့္
ဂဏာန္းအေရအတြက္ျဖစ္ပါတယ္။ သူတို႔ ေတြရဲ႕ ကြာျခားခ်က္ကေတာ့ FLOAT က DOUBLE ေလာက္ Data မသိမ္းႏိုင္ပါဘူး။ FLOAT က
4 bytes ကိုသိမ္းႏိုင္ၿပီး DOUBLE က 8 bytes ကိုသိမ္းႏိုင္ပါတယ္။ DECIMAL က DOUBLE နဲ႔ Data သိမ္းတဲ့ ပမာဏက အတူတူပါပဲ။
DECIMAL နဲ႔ တစ္ျခားႏွစ္ခုနဲ႔ ကြာျခားခ်က္ကေတာ့ တိတိက်က် တြက္ခ်က္မူေတြျပဳလုပ္ခ်င္တဲ့ အခါမွာ DECIMAL ကိုအသံုးျပဳပါတယ္။
MySQL Data Types

Date and Time Types

MySQL ထဲမွာ ေန႔ရက္ေတြ အခ်ိန္ေတြကို သိမ္းဖို႔ အတြက္ Data Types ေတြက ၄ မ်ိဳးရွိပါတယ္။ သူတို႔ရဲ႕
ကြာျခားခ်က္ကေတာ့ သိမ္းတဲ႔ပံုစံေတြပါ။

DATE

DATE ရဲ႕ သိမ္းပံုကေတာ့ YYYY-MM-DD ပံုစံအတိုင္း သိမ္းပါတယ္။ 1000-01-01 ကေန 9999-12-31 အထိ
သိမ္းႏိုင္ပါတယ္။ သူက ရက္စြဲကိုပဲ သိမ္းတာပါ။

TIME
TIME ကေတာ့ အခ်ိန္ကို သိမ္းေပးတာပါ။ သိမ္းတဲ့ ပံုစံ ကေတာ့ HH:MM:SS ပါ။ နာရီ မိနစ္ စကၠန႔္ ပါ။ 00:00:00 ကေန
23:59:59 အထိျဖစ္ပါတယ္။

ဒါဆိုရင္ DATE နဲ႔ TIME ကို ေပါင္းၿပီး သိမ္းခ်င္တယ္။ အဲ့ဒီလိုေပါင္းၿပီး သိမ္းတဲ့ ဟာလည္းရွိပါတယ္။ အဲ့ဒါက

DATETIME

DATETIME က DATE နဲ႔ TIME ကိုေပါင္းၿပီးသိမ္းတာ ျဖစ္ေတာ့ သူ႔ရဲ႕ ပံုစံက YYYY-MM-DD HH:MM:SS ဆိုၿပီး ျဖစ္ပါတယ္။

DATETIME ကိုေပါင္းၿပီးသိမ္းတာေတာ့ ရၿပီ time zone ေလးလည္းထည့္ခ်င္ေသးတယ္။ အဲ့ဒီ အတြက္လည္းရွိပါတယ္။


MySQL Data Types

TIMESTAMP

TIMESTAMP က DATETIME ရဲ႕ ပံုစံ အတိုင္းပါပဲ။ ဒါေပမယ့္ သိမ္းတဲ့ အခါမွာေတာ့ TIME zone ကိုထည့္သိမ္းေပးပါတယ္။
‘1000-01-01 00:00:00’ UTC to ‘9999-12-31 23:59:59’ UTC ဒီလိုပံုစံပါ။

YEAR

ဒါကေတာ့ ႏွစ္ေတြကိုပဲ သိမ္းခ်င္ရင္ အသံုးျပဳလို႔ရပါတယ္။ သူမွာ သိမ္းတဲ့ပံုစံ ႏွစ္မ်ိဳးရွိပါတယ္။ 2 လံုးပဲ သိမ္းတဲ့ ( eg.
1990 to 2019 (90 to 19)) ပံုစံရယ္ 4 လံုးသိမ္းတဲ့ ႏွစ္အျပည့္အစံု သိမ္းတဲ့ပံုစံ ရယ္ပါ။ သူ႔ကို Length ကို 2 ဒါမွမဟုတ္ 4 လို႔ေပးၿပီး
ကိုယ့္အဆင္ေျပမယ့္ ပံုစံနဲ႔ သိမ္းလို႔ ရပါတယ္။ Default ကေတာ့ 4 ပါ။

String Types

String types ေတြက ေတာ့ အလြယ္ေျပာရရင္ေတာ့ စာသားေတြ binary ေတြကို သိမ္းတာပါ။

CHAR And VARCHAR

CHAR နဲ႔ VARCHAR ကေတာ့ အနည္းငယ္တူ ညီတဲ့ ပါတယ္။ ႏွစ္ခုစလံုးက စာသား (Character) ေတြကို သိမ္းတာပါပဲ။
မတူညီတာ သိမ္းတာတို႔ ျပန္ထုတ္တာတို႔ သိမ္းစည္းႏိုင္တဲ့ပမာဏတို႔ Data သိမ္းပံုသိမ္းနည္းတို႔ျဖစ္ပါတယ္။ သိမ္းစည္းတဲ့ ပမာဏက MySQL
5.0.3 ေနာက္ပိုင္းမွာကြာသြားတာပါ။ အရင္တုန္းက ေတာ့ ႏွစ္ခုစလံုးက 0 ကေန 255 အထိျဖစ္ၿပီး MySQL 5.0.3 ေနာက္ပိုင္းမွာ VARCHAR
က 0 ကေန 65,535 အထိသိမ္းလို႔ရပါတယ္။ Data သိမ္းပံုသိမ္းနည္း ကြာတယ္ဆိုတာ CHAR နဲ႔သိမ္းရင္ သူက သတ္မွတ္ေပးထားတဲ့
Length ကို အျပည့္သိမ္းပါတယ္။ VARCHAR ကေတာ့ လိုအပ္တဲ့ ပမာဏကိုပဲသိမ္းပါတယ္။ ပံုနဲ႔ျပလိုက္ရင္ပိုျမင္သာမွာပါ။
MySQL Data Types

BINARY and VARBINARY Types

BINARY နဲ႔ VARBINARY Types ေတြကလည္း VARCHAR တို႔လိုပါပဲ။ သိမ္းႏိုင္တဲ့ range က 0 ကေန 255 အထိျဖစ္ၿပီး
MySQL 5.0.3 ေနာက္ပိုင္းမွာ VARBINARY က 0 ကေန 65,535 အထိ သိမ္းလို႔ရပါတယ္။ သူတို႔သိမ္းေပးတာကေတာ့ Binary string
ေတြျဖစ္ပါတယ္။

BLOB

BLOB ဆိုတာကေတာ့ data အမ်ားၾကီးပါတဲ့ Binary object ကို သိမ္းလို႔ရပါတယ္။ TINYBLOB တို႔ MEDIUMBLOB တို႔
LONGBLOB တို႔ကလည္း ဒီအတိုင္းပါပဲ။ Binary object ေတြကိုသိမ္းတာပါ။ ကြာျခားတာကေတာ့ သိမ္းႏိုင္တဲ့ ပမာဏပါ။ TINYBLOB က
0 ကေန 255 ျဖစ္ၿပီး BLOB က 0 ကေန 65535 bytes ပါ။ MEDIUMBLOB ကေတာ့ 0 ကေန 16777125 ျဖစ္ၿပီး LONGBLOB ကေတာ့
0 ကေန 4294967295 bytes ျဖစ္ပါတယ္။

TEXT

TEXT ကေတာ့ စာသားေတြ အမ်ားၾကီး သိမ္းတဲ့ အခါ အသံုးျပဳပါတယ္။ TINYTEXT,MEDIUMTEXT နဲ႔ LONGTEXT
ကလည္း TEXT နဲ႔ အတူတူ ပါပဲ။ သူရဲ႕ သိမ္းႏိုင္တဲ့ ပမာဏကေတာ့ BLOB နဲ႔ တူပါတယ္။

ENUM

ENUM ဆိုတာကေတာ့ select box ပံုစံနဲ႔ အတိအက် ပါမယ့္ data ကို ၾကိဳၿပီးသိမ္းထားလို႔ရေအာင္ လုပ္ေပးတဲ့ Type ပါ။
select box ျဖစ္တဲ႔ အတြက္ တစ္ခုပဲေရြးလို႔ရပါတယ္။

SET

SET ကေတာ့ လည္း ENUM လိုပါပဲ။ ဒါေပမယ့္ သူက Multi select လုပ္လုိ႔ရပါတယ္။

ဒီေလာက္ဆိုရင္ MySQL မွာသံုးျပဳတဲ့ Data types ေတြနဲ႔ ပတ္သက္ၿပီး သေဘာေပါက္ၿပီထင္ပါတယ္။ ဘယ္ Data က
ဘယ္ Type အသံုးျပဳၿပီး သိမ္းသင့္တယ္ ဆိုတာ လည္း ကိုယ့္ပါသာ ေရြးခ်ယ္လာႏိုင္လိမ့္မယ္လို႔ ေမ်ွာ္လင့္ရင္း အဆံုးသပ္လိုက္ပါမယ္။
Interview with Ko Zin Min

r v i e w
In t e

Soe Thiha Naung


Myanmar Tutorials ရဲ႕ Main Contributor တစ္ေယာက္ Myanmar
Links မွာ Web Development အေၾကာင္း သင္တဲ့ဆရာ၊
Web Development အေၾကာင္းႏွင့္ ပတ္သက္ရင္ ဘာျဖစ္ျဖစ္
စိတ္ဝင္စားၿပီး Myanmar Links Web Development Team ကို
ဦးေဆာင္လႈပ္ရွားေနတဲ့ နည္းပညာသမား တစ္ေယာက္

Facebook : /soethihanaung
Website : http://soethiha.me
Interview with
Ko Zin Min

ကိုဇင္မင္းအေနနဲ႔ Web Development ေလာကမွာ အေျပာင္းအလဲေတြ မ်ိဳးစုံကို ၾကဳံဖူးခဲ့ၿပီ ဆိုေတာ့ ျမန္မာနိုင္ငံ Web
Development ေလာကရဲ့ အနိမ့္အျမင့္ အတက္အက် အေၾကာင္းကို အက်ဥ္းခ်ဳပ္ ေျပာျပေပးပါဦးခင္ဗ်။ အားရတဲ့ အခ်က္ေတြ အားမရတဲ့
အခ်က္ေတြေရာေပါ့ခင္ဗ်။

ျမန္မာနိုင္ငံရဲ့ Web Development ေလာကအေၾကာင္းေျပာရရင္ ျမန္မာျပည္မွာ လူထူ႕ထဲအင္တာနက္ မရခင္ထဲက တခ်ိဳ႕


ကုမၸဏီေတြြ Website ရွိေနၾကပါျပီ။ အဲ့ဒါကေတာ့ IT Industry ကမဟုတ္ပဲ Travel Industry ကလုပ္ငန္းေတြပဲျဖစ္ပါတယ္။ ဥပမာ
( www.rubyland.net, www.journeysmyanmar.com, www.smmyanmar.com ) တို႕ကို Whois check ၾကည့္လိုက္ရင္သိႏိႈင္ပါတယ္။
၂၀၀၂ခု႕ႏွစ္ ေနာက္ပိုင္းမွာေတာ့ IT Company ေတြ၊ Export & Import Companyေတြ၊ Travel Companyေတြ နဲ႕ ႏိုင္ငံျခား
နဲ႕ဆက္သြယ္ရတဲ့ လုပ္ငန္းေတာ္ေတာ္မ်ားမ်ား Website ရွိလာၾကပါတယ္။ Web Development လုပ္ငန္းေတြလဲေတာ္ေတာ္ေလး
သြက္လာၾကပါတယ္။ ဒါေပမယ္ HTML, CSS ကိုသာအသုံးျပဴတဲ့ Static Website ေတြပဲျဖစ္ပါတယ္။ ထူးျခားတဲ့ Dynamic Website
ေတြကေတာ့ Web Portal အဆင့္ျဖစ္တဲ့ www.bagan.net.mm နဲ႕ www.yangoncity.com.mm ပဲျဖစ္ပါတယ္၊ Web Mail, News,
Online Radio, Member Area, Chart Room, Forum, Entertainment စတဲ့ Feature ေတြနဲ႕အမိုက္စား Website ေတြပဲျဖစ္ပါတယ္။
ေနာက္ပိုင္းမွာေတာ့ www.planet.com.mm ေပၚလာပါတယ္၊ အရမ္းေအာင္ျမင္ျပီး သူလဲပဲ Web Portal အမ်ိဳးအစားပါ။ ခန္႕မွန္းေျခ
တစ္ရက္ကို Visitor ေထာင္းဂဏန္းေက်ာ္ ရွိတဲ့ Website ေတြပါ၊ အဲ့ဒီအခ်ိန္က ျမန္မာျပည္ Internet User နဲ႕ၾကည့္ရင္ တစ္ရာ ရာခိုင္ႏႈန္း
ေအာင္ျမင္တဲ့ Website ေတြလို႕ေျပာလို႕ရပါတယ္။ Bagan Cyber Tech မရွိေတာ့တဲ့ေနာက္ပိုင္းမွာ အင္တာနက္ Speed ေႏွးေကြးျခင္း၊
အင္တာနက္လြတ္လပ္ခြင့္မရွိျခင္း နဲ႕ အေမရိကန္ရဲ့စီးပြါးေရးပိတ္ဆို႕မႈေတြေၾကာင့္ ျမန္မာျပည္ရဲ့စီးပြါးေရးက်ဆင္းလာျခင္းဟာ
Web Development ကိုအမ်ားၾကီးထိခိုက္လာပါတယ္။ Web Developerေတာ္ေတာ္မ်ားမ်ား ျမန္မာျပည္က ထြက္သြားၾကပါတယ္။
Web Portal ေတြလဲမရွိေတာ့ပါဘူး(Planet ကေတာ့ရွိေနဆဲပါ)၊ ဒါေပမယ္လဲ ဒါခဏပါ ၂၀၀၅ ေလာက္မွာ MCPA က ပထမဆုံး
Web Development ျပိဳင္ပြဲကို က်င္းပေပးခဲ့ပါတယ္။ အဲ့ဒီေနာက္ Web Development Training ေတြလဲျပန္ေပၚလာပါျပီ၊
Web Development Companyေတြလဲ ၅ခုေလာက္ျဖစ္လာပါတယ္၊ ၂၀၀၅ စက္တင္ဘာလမွာ Multimedia Website အေနနဲ႕
စိုင္းစိုင္းခမ္းလွိုင္ Website ကြၽန္ေတာ္တို႕ Micromedia Flash နဲ႕ ASP ေပါင္းျပီး တင္ဆက္ခဲ့ပါတယ္၊ ျမန္မာနိုင္ငံရဲ့ Web Development
အပိုင္းမွာ မွတ္တိုင္ တစ္ခုလို႕ ေျပာလို႕ေက်းဇူးပါအကို၊ ေနာက္ပိုင္း www.myanmartraining.com ကေတာ့ျမန္မာျပည္က
Training သင္တန္းေက်ာင္းအစုံပါဝင္တဲ့ Website တစ္ခုအေနနဲ႕ေအာင္ျမင္ခဲ့ပါတယ္။ အဲ့ဒီေနာက္ပိုင္း web 2.0 ရဲ့အစ Blog
ေတြေခတ္စားလာပါတယ္၊ Blogger ေတြလဲေတာ္ေတာ္မ်ားလာပါတယ္၊ အင္တာနက္သုံးတက္သူတိုင္း Blog တစ္ခုရွိတယ္လိုေတာင္ေျ
ပာႏိုင္ပါတယ္၊ အဲ့ဒီေနာက္ပိုင္း အေျပာင္းအလဲက Open Source CMS ေတြေပၚလာျခင္းပဲျဖစ္ပါတယ္၊ လူငယ္ေတြေတာ္ေတာ္မ်ားမ်ား
CMS ေတြသုံးျပီး Website လုပ္လာႏိုင္ျခင္းဟာလဲ ျမန္မာျပည္ျဖစ္ Website ေတြ ေတာ္ေတာ္မ်ားလာေစပါတယ္။ ျမန္မာျပည္မွာ
သိသိသာသာတို႕တက္လာတဲ့ Web Technology ကေတာ့ PHP လို႕ပဲေျပာရမွာပါ။ Web Development Firms ေတြအေနနဲ႕လည္း
ေနာက္လာမဲ့ Enterprise Level ေတြအတြက္ ၾကိဳတင္ျပင္ဆင္ထားသင့္ပါတယ္။

ျမန္မာ Web Development ေလာကမွာ ကြၽန္ေတာ္အားရတဲ့အခ်က္ေတြက လူငယ္ေတြ Web Development


ကိုစိတ္ဝင္စားလာတယ္။ ေနာက္ ေအာင္ျမင္ခဲ့တဲ့ Website ေတြရွိခဲ့တယ္၊ Website ေတြေအာင္ျမင္ျခင္းဟာ User
ေကာင္းေတြေၾကာင့္လဲပါပါတယ္။ ဒါေပမယ္အားမရတာေတြက နဲနဲထူးဆန္းတယ္ဗ် အဲ့ဒါကေတာ့ ျမန္မာျပည္က ဒိတ္ဒိတ္ႀကဲ
IT Company ၾကီး ေတြမွာ Website ေကာင္းေကာင္းေတြလုံးဝမရွိျခင္းပါပဲ။

ကိုဇင္မင္းနဲ႔ ပတ္သက္ၿပီး easypay ဆိုတဲ့ နာမည္နဲ႔ Online Payment စနစ္တစ္ခု အေကာင္အထည္


ေဖာ္ေနတယ္ၾကားပါတယ္။ ကၽြန္ေတာ္ အရမ္းစိတ္ဝင္စားတဲ့ အပိုင္းပါပဲခင္ဗ်။ ကိုဇင္မင္းအေနနဲ႔ Online payment အေၾကာင္းကို
အမ်ားႀကီး ေလ့လာဖူးၿပီဆိုတာ သိရတဲ့အတြက္ Online Payment အေၾကာင္းကို ကၽြန္ေတာ္တို႔ကို ေဝမၽွပါဦးခင္ဗ်။ သိတဲ့အတိုင္း အခုမွ
ကၽြန္ေတာ့္မွာ Master Pre-paid Card ေလး စကိုင္ခြင့္ရပါတယ္။
Interview with
Ko Zin Min

ဟုတ္ပါတယ္အကို Easy Pay နာမည္နဲ႕ Online Payment Gateway တစ္ခုတည္ေဆာက္ေနပါတယ္။


တည္ေဆာက္ရျခင္းရည္ရြယ္ခ်က္ကေတာ့ လုံျခဳံစိတ္ခ်ရတဲ့ Online ေငြေပးေခ်မႈ စံနစ္တစ္ခု ရွိလာေစခ်င္တာပဲျဖစ္ပါတယ္။ Online Pay-
ment Gateway ကိုအရွင္းဆုံးေျပာရရင္ ဘဏ္ေတြ Card Union (MPU, Visa, Master card) ေတြနဲ႕ ခ်ိတ္ဆက္ျပီး အင္တာနက္ ေပၚမွာ
ေငြေပး ေခ် ႏိုင္ေသာ၊ ေငြ လက္ခံႏိုင္ ေသာ ၾကားခံ Third Party စံနစ္ တစ္ခုျဖစ္ပါတယ္။ သူ႕အလုပ္ေတြကေတာ့ user ရဲ့ Payment in-
formation ေတြကို encrypt လုပ္ျပီး ssl လို secure layer ေပၚကေန Payment Processors & Networks ေတြကိုျဖက္ကာ သက္ဆိုင္ရာ
Acquiring Bank နဲ႕ Payment Portal ၾကားမွာ transfer လုပ္ေပးျခင္းပဲျဖစ္ပါတယ္။ ဒါေတြအားလုံးဟာ Realtime Authorisations ပါ 2
စကန္႕ေလာက္ပဲၾကာပါတယ္။ တဆက္ထဲမွာပဲ Payment Accepted ျဖစ္လား Declined ျဖစ္လားကို User ထံ message ျပန္ရပါတယ္။
International Standard ISO Messaging ေတြကိုအသုံးျပဴရပါတယ္။ ေနာက္ကြယ္မွာေတာ့ ေငြေပး ေခ်သူဘဏ္ထဲကေငြကို
ေငြလက္ခံသူဘဏ္ထဲသို႕ လႊဲေျပာင္းေပးျခင္း(Settlement) ပဲျဖစ္ပါတယ္။ Settlement ကိုေတာ့ ဘဏ္ကလုပ္ေဆာင္ေပးရမွာပါ။ Online
Payment Gateway ေတြက User ေတြအတြက္ အသုံးျပဴရလြယ္ကူတယ္၊ Cross Bank ( ေငြေပးေခ်သူ ႏွင္ ေငြလက္ခံသူဘဏ္ မတူျခင္း)
အသုံးျပဴလို႕ရတယ္၊ Security အေနျဖင့္ Two Factor Authentication (Payment ျပဴလုပ္ေတာ့မည္ဆိုပါက မိမိဖုန္းထဲသို႕SMS ျဖင့္
ေပးပို႕ေသာ Authentication Server မွ ၅မိနစ္တစ္ၾကိမ္ ေျပာင္းလဲေနတဲ့ OTP- One Time Password) ကိုသုံးထားလို႕ လုံျခဳံမႈရွိတယ္၊
ထို႕အျပင္ Advanced Fraud Detection System ေတြပါဝင္တဲ့အတြက္ အသုံးျပဳသူမ်ား၏ Account ပိုလုံျခဳံမႈရွိပါတယ္။ International
Payment Processor (Visa/Master) တို႕နဲ ခ်ိတ္ဆက္ မယ္ဆိုရင္ေတာ့ PCI Security Standards Council ရဲ့ Network Layer နဲ႕ Appli-
cation Layer ကိုစစ္ေဆးမႈကိုခံယူျပီး PCI compliance ျဖစ္မွသာ ဝင္ေရာက္ခ်ိတ္ဆက္ႏိုင္မွာျဖစ္ပါတယ္။ ျမန္မာျပည္မွာ Master Pre-paid
Card ေတြစသုံးလို႕ရလာတာေကာင္းပါတယ္။ ဒါေပမယ္ exchange rate နဲ႕ transition fee ေပါင္းရင္ ေစ်းမ်ားေနပါေသးတယ္။ ဒါေပမယ္
အခုအခ်ိန္ အင္တာနက္ေပၚက Service ေတြဝယ္ခ်င္တယ္ဆိုရင္ေတာ့ သူကအေကာင္ဆုံးေပါ့ဗ်ာ ေနာက္ၾကရင္ေတာ့ တျခားကတ္ေတြပါ
သုံးလာႏိုင္ေတာ့မွာပါ။

ကိုဇင္မင္း ေျပာသြားတဲ့ အခ်က္ထဲမွာ ျမန္မာနိုင္ငံမွာ Web Development မေအာင္ျမင္ရျခင္း အေၾကာင္းအခ်က္ေတြထဲမွာ


Online Payment မရျခင္းက အဓိကအခ်က္ တစ္ခ်က္ ျဖစ္တယ္လို႔ ပါပါတယ္။ အဲဒီလို အြန္လိုင္း ေငြေခ်စနစ္ မရွိျခင္းက Web Develop-
ment ေလာကအတြက္ ဘယ္လို အခက္အခဲ အတားအဆီးေတြ ျဖစ္ေစပါသလဲ။

ဒီေခတ္မွာ Website တစ္ခုျဖစ္ဖို႕လြယ္ပါတယ္။ ဒါေပမယ္ ေအာင္ျမင္တဲ့ Website တစ္ခုျဖစ္ဖို႕မလြယ္ပါဘူး။


ေအာင္ျမင္တယ္ဆိုတဲ့ေနရာမွာ ေငြးေၾကး အရေအာင္ျမင္တာရွိသလို နာမည္ၾကီးျပီး ေအာင္ျမင္သြားတာလဲရွိပါတယ္။ ျမန္မာျပည္မွာ
ေငြးေၾကး အရေအာင္ျမင္တဲ့ Website မရွိသေလာက္ရွားပါတယ္။ ဒီေန႕ Website ေတြမွာ Visitor ေတြမ်ားျပီ ပိုက္ဆံ တစ္ျပားမွမဝင္တဲ့
Website ေတြအမ်ားၾကီးပါ။ ျမန္မာျပည္မွာ Google Ads နဲ႕စီးပြါးရွာဖို႕လဲမလြယ္ပါဘူး။ ကြၽန္ေတာ္တို႕ေတြလဲ Web Development
လုပ္လာတဲ့ သက္တမ္းတေလွ်ာက္မွာ Idea တစ္ခုတစ္ခု စဥ္စားလိုက္တိုင္ အဲ့ဒီ Online Payment Gateway မွာသြားတစ္ပါတယ္။
Online Payment Gateway မရွိလို႕မလုပ္ခဲ့ရတာေတြအမ်ားၾကီးပါ။ ျမန္မာျပည္မွာ e-Commerce အေၾကာင္းၾကားလာရတာ
၂၀၀၂ေလာက္ထဲကပါ၊ ဒါေပမဲ့ e-Commerce လုံးဝမေအာင္ျမင္ရျခင္းက Online Payment Gateway မရွိလို႕ပါ၊ Online Shop ေတြ
Facebook Page နဲ႕ Online Shopping လုပ္ေနသူေတြကို အခုသုံးေနတဲ့ (COD) Cash on Delivery အစား စစ္မွန္တဲ့ Online Pay-
ment Gateway ကိုသာခ်ိတ္ဆက္ေပးႏိုင္မယ္ဆိုရင္ ဒါ့ထက္မကေအာင္ျမင္မွာပါ။ ကြၽန္ေတာ္တို႕အေနနဲ႕လည္း Myanmar Invoice ဆိုတဲ့
စံနစ္တစ္ခုလုပ္ေနပါတယ္၊ သူက Merchant Site အၾကီးၾကီးေတြမလုပ္ႏိုင္တဲ့သူေတြ၊ Outsourcing ေရးမဲ့ေက်ာင္းသားေတြ၊ Service
လုပ္ငန္းလုပ္ကိုင္သူေတြ နဲ႕Small Business လုပ္ကိုင္သူေတြကိုရည္ရြယ္ပါတယ္။ Online Payment Gateway အသုံးျပဴ႕သူ အခ်င္းခ်င္း
Invoice ပိုျပီးေငြေတာင္းခံႏိုင္ျခင္း၊ ေငြေပးေခ်ႏိုင္ျခင္း တို႕ျပဴ႕လုပ္ႏိုင္မွာျဖစ္ပါတယ္။ ဒါေၾကာင့္ Online Payment Gateway သာရွိရင္
ကြၽန္ေတာ္တို႕ Web Development ပိုေအာင္ျမင္မယ္လို႕ျမင္ပါတယ္။
Interview with
Ko Zin Min

ကၽြန္ေတာ္ ေနာက္တစ္ခု ေမးလိုတာက အြန္လိုင္း ေပးမင့္ဆိုတာ Paypal, MasterCard, Visa စတာေတြ ရလာမွ
အြန္လိုင္း ေပးမင့္ ျဖစ္တာလား၊ ျပည္တြင္းက ဘဏ္ေတြကေရာ ေဆာင္ရြက္လို႔ မရနိုင္ဘူးလား၊ Local သေဘာ Global ခ်ိတ္ဆက္မွုေတြမွာ
ဘယ္လိုပံုစံေတြနဲ႔ ခ်ိတ္ဆက္တယ္ဆိုတာ ရွင္းျပေပးပါခင္ဗ်။ ကၽြန္ေတာ္ မွတ္မိတာ တစ္ခုရွိပါတယ္၊ အာရွဓန ဘဏ္က အြန္လိုင္း
ေငြေခ်စနစ္ ရေတာ့မယ္ဆိုတာ သတင္းၾကားလိုက္ေပမယ့္ ေနာက္ပိုင္း အာရွဓနဘဏ္ ပ်က္သြားေတာ့ သတင္းလည္း ေပ်ာက္သြားပါတယ္။

Visa, Master မွ မဟုတ္ပါဘူး Payment Gateway ေတြအမ်ားၾကီးရွိပါတယ္။ သူတို႕က International မွာပါ


သုံးလို႕ရတဲ့အတြက္ ပိုျပီးနာမည္ၾကီးတာပါ၊ ေနာက္တခုက သူတို႕ Card Network ကိုသုံးတဲ့ user မ်ားလို႕ပါ။ Visa, Master ကလဲ
သူ႕ရဲ့ network ကိုျဖန္႕ၾကပ္ဖို႕ဆိုရင္ ျပည္တြင္းဘဏ္ေတြနဲ႕ေပါင္းရပါတယ္၊ ျပည္တြင္းဘဏ္ေတြက Issuing နဲ႕ Acquiring မလု
ပ္ပဲနဲ႕ျပည္တြင္းမွာသုံးလို႕မရပါဘူး။ ႏိုင္ငံတိုင္းမွာ Local Payment Gateway ေတြအမ်ားၾကီးရွိပါတယ္။ ျမန္မာျပည္မွာဆို Local
ဘဏ္ေတြအမ်ားၾကီးပါဝင္ထားတဲ့ MPU - Myanmar Payment Union ရွိပါတယ္ ၂၀၁၄မွာ online သုံးလို႕ရေတာ့မွာပါ။ China မွာဆို
China UnionPayရွိပါတယ္။ Local Payment Gateway ေတြတည္ေဆာက္ရျခင္း ရည္ရြယ္ခ်က္ကေတာ့ ျပည္တြင္း Transition Fee
ေတြျပည္ပကို ထြက္မသြားေအာင္လုပ္ေဆာင္ ျခင္းပဲျဖစ္ပါတယ္။ ထိုင္းႏိုင္ငံမွာဆိုရင္ တစ္ႏိုင္ငံလုံး Visa, Master Card သုံးၾကပါတယ္၊
တစ္ေန႕တစ္ေန႕ ျပည္တြင္းသုံးေနတဲ့ Transition တိုင္းအတြက္ Visa, Master ကို Transition Fee ေတြေပးေနရပါတယ္။ အဲဒီေတာ့
ျပည္တြင္းမွာ ေငြေပးေခ်သူေတြအေနနဲ႕ Local Market မွာ MPU Card ကိုပဲသုံးသင့္ပါတယ္။ ဒါမွျမန္မာျပည္က (Local Transition)
အသုံးျပဳေငြေတြ ျပည္ပကိုထြက္မသြားမွာျဖစ္ပါတယ္။ ဘဏ္ေတြကေတာ့ Card Issuing နဲ႕ Settlement ေတာ့လုပ္ေပးရပါမယ္။ Global
ခ်ိတ္ဆက္မႈကေတာ့ International Payment ရဖို႕အတြက္ဆိုရင္ Visa, Master တို႕လို Card network ေတြကို Lcoal ဘဏ္ေတြက
သြားေရာက္ ခ်ိတ္ဆက္ရမွာပါ။

၂၀၁၄ အတြက္ အြန္လိုင္း ေငြေခ်စနစ္နဲ႔ ပတ္သက္တဲ့ ကိုဇင္မင္းရဲ့ ေမၽွာ္လင့္ခ်က္၊ လုပ္ေဆာင္ဖို႔ ႀကံစည္ထားတာေတြကို


သိခ်င္ပါတယ္ခင္ဗ်။ ေနာက္တစ္ခု အြန္လိုင္း ေငြေခ်စနစ္ ျဖစ္လာတဲ့အခါ ျပည္ပကေနလဲ ဝင္လာေတာ့မယ္ ထင္တယ္ဗ်။ အဲဒီလို
ဝင္လာတဲ့အခါ ျပည္တြင္းက လုပ္ကိုင္ေဆာင္ရြက္ေနတဲ့ သူေတြအေနနဲ႔ ဘယ္လို ယွဥ္ၿပိဳင္ရင္ဆိုင္သင့္တယ္ဆိုတာေတြပါ
သိခ်င္ပါတယ္ခင္ဗ်။

လက္ရွိ ျမန္မာႏိုင္ငံရဲ့ Online Payment အေျခအေနက YPay နဲ႕ Yatanarpon Teleport ရဲ့ Online Phone
Billing System တို႕ပဲျဖစ္ပါတယ္။ ဒီစံနစ္ ႏွစ္ခုစလုံးက မိမိဘဏ္ Account နဲ႕တိုက္႐ိုက္ခ်ိတ္ဆက္ အသုံးျပဴႏိုင္ေနပါျပီ။ YPay မွာေတာ့
လာမယ္၂၀၁၄မွာ MPU Card ထဲက ေငြကို အင္တာနက္ေပၚမွာ အသုံးျပဴႏိုင္ေတာ့မွာပါ။ Mobile Payments လဲပါပါတယ္။ ဒါေၾကာင့္
e-Government ရဲ့ တစ္စိတ္တစ္ေဒသ ျဖစ္တဲ့ Online Billing ေတြလဲဖြင့္ျဖိဳးလာမွာပါ၊ e-Commerce Site ေတြလဲမ်ားလာမွာပါ၊ On-
line ေငြေပးေခ်ျခင္းဆိုင္ရာ လုပ္ငန္းမ်ိဳးစုံ ေအာင္ျမင္လာမယ္လို႕ျမင္မိပါတယ္။ ကြၽန္ေတာ္တို႕ကိုယ္တိုင္လည္း Merchant Site
ေတြအမ်ားၾကီးလုပ္ေပးေနပါတယ္္။ ေနာက္ Myanmar Invoice ကိုလည္းေအာင္ျမင္မယ္လို႕မွန္းထားပါတယ္။ ေနာက္ပိုင္းမွာ Mobile
Payment လို႕ေခၚတဲ့ Mobile ေပၚက ေငြေပး ေခ် ႏိုင္တဲ့စံနစ္ကိုလည္း အသုံးျပဴ႕ႏိုင္ေတာ့မွာပါ။ ဒါမွကြၽန္ေတာ္တို႕ႏိုင္ငံမွာ သူမ်ားနည္းတူ
Online Payment ဖြင့္ျဖိဳးတို႕တက္လာမွာပါ။ ႏိုင္ငံတကာမွာလဲ Online Payment ကတဟုန္ထိုးတိုးတက္ေနပါတယ္။ အေမရိကန္ရဲ့ ၂၀၁၂
ခုႏွစ္ Online Sales က US$ Billions ၂၃၀ ကေန ၂၀၁၇ၾကရင္ US$ Billions ၃၇၀ ထိရွိလာမယ္လို႕ခန္႕မွန္းထားၾကပါတယ္။ အာရွရဲ့
Online Retail Forecast ကလည္းေတာ္ေတာ္တက္လာပါျပီ။ ကြၽန္ေတာ္တို႕ႏိုင္ငံမွာလည္း Online Payment ေအာင္ျမင္လာေတာ့မွာပါ။
ျပည္ပကေနလာတဲ့ Payment System ေတြကိုယွဥ္ျပိဳင္ရာမွာ ႏိုင္ငံေတာ္ဗဟိုဘဏ္ကဦးစီးျပီးေတာ့ ႏိုင္ငံသားအက်ိဳးစီးပြါးကာကြယ္ႏို
င္ရန္အတြက္ စည္းမ်ဥ္း စည္းကမ္းေတြနဲ႕ ထိမ္းေက်ာင္းသင့္ပါတယ္။ ဒီလုပ္ငန္းေတြက တိုင္းျပည္ဘ႑ာေငြ ဖြံ႔ၿဖိဳးတိုးတက္မႈနဲ႔လည္း
သက္ဆိုင္ေနလို႕ပါ။ Online Payment Gateway မွာေငြေပးသူက Transition Fee ေပးစရာမလိုပါဘူး၊ ေငြလက္ခံသူကသာေပးရမွာ
ျဖစ္ပါတယ္။ Merchant ေတြကပဲေပးရမွာပါ။ ကြၽန္ေတာ္တို႕ကေတာ့ Merchant ေတြကို႕ပဲအေကာင္းဆုံးစြဲေဆာင္ျပီးယွဥ္ျပိဳင္သြားမွာပါ။
Interview with
Ko Zin Min

ေနာက္ ကြၽန္ေတာ္တို႕ဘက္ကလည္း ကိုယ္ Service ကို Reliable ျဖစ္ေအာင္၊ လံုျခဳံေရးစံနစ္ အားေကာင္းေအာင္၊ Fraud
Detection ေတြေကာင္းသည္ထက္ေအာင္းလာေအာင္ ၊ PCI compliance ျဖစ္ေအာင္၊ User ေတြအသုံးျပဴ႕ရလြယ္ကူေအာင္ Interna-
tional Payment ရဖို႕အတြက္ဆိုရင္ လုပ္ေဆာင္ေပးသြားမွာျဖစ္ပါတယ္။ ၂၀၁၄ကေတာ့ ျမန္မာႏိုင္ငံမွာ online ေငြေပးေခ်မႈရဲ့မွတ္တိုင္
တစ္ခုျဖစ္လာမယ္လို႕ျမင္မိပါတယ္ခင္ဗ်ာ။

အခုလို ေမးျမန္းေပးတဲ့ အတြက္ Echo မွတာဝန္ရွိသူမ်ားအားလုံးကို ေက်းဇူးတင္ပါတယ္။


First Step with
PureCSS

C S S

Hein Zaw Htet


ကၽြန္ေတာ္ကေတာ့ ဟိန္းေဇာ္ထက္ပါ။ MyanmarWebDev.com နဲ႔
Echo မွာ စာပံုမွန္ေရးပါတယ္။ Myanmar Links မွာ Web Designer/
Developer တစ္ေယာက္အျဖစ္ လုပ္ကိုင္ေနပါတယ္။
First Step with
PureCSS

Pure CSS ဆိုတာကေတာ့ Yahoo ကထုတ္တဲ့ CSS Framework တစ္ခုျဖစ္ပါတယ္။ Lightweight ျဖစ္ၿပီးေတာ့ Modular
CSS Framework တစ္ခုလည္းျဖစ္ပါတယ္။ Modular ဆိုတဲ့အတိုင္း ကိုယ့္ Project မွာ Table ေတြ သံုးစရာမလိုဘူးဆိုရင္ Table Module
ကို ျဖဳတ္ထားႏုိင္ပါတယ္။ Module ေတြအားလံုးေပါင္းမွ Pure ရဲ႕ CSS File Size ဟာ 4.4 KB သာရွိပါတယ္။

Pure ကို အသံုးျပဳဖို႔အတြက္ဆိုရင္ CSS File တစ္ခုပဲ ခ်ိတ္ေပးဖို႔လိုအပ္ပါတယ္။

<link rel=”stylesheet” href=” http://yui.yahooapis.com/pure/0.3.0/pure-min.css”>

Pure နဲ႔ Home Page တစ္ခု တည္ေဆာက္က်ပါမယ္။ Project Folder ထဲမွာ index.html နဲ႔ style.css ေဆာက္လိုက္ပါမယ္။
index.html မွာ ေအာက္ကအတိုင္း အေျခခံ HTML Structure ေရးလိုက္ပါမယ္။

<!DOCTYPE html>
<html>
<head>
<meta name=”viewport” content=”width=device-width,initial-scale=1”>

<title>Pure CSS</title>

<link rel=”stylesheet” href=”http://yui.yahooapis.com/pure/0.3.0/pure-min.css”>


<link rel=”stylesheet” href=”style.css”>
</head>
<body>

</body>
</html>

အေပၚကအတိုင္းဆို <meta> နဲ႔ viewport သက္မွတ္ေပးထားပါတယ္။ ဒါမွဖုန္းေတြမွာ Responsive အေနနဲ႔


အလုပ္လုပ္မွာပါ။ ေနာက္တစ္ဆင့္က pure css နဲ႔ ကၽြန္ေတာ္တို႔ ကိုယ္ပိုင္ Style ေတြေရးမယ့္ style.css ခ်ိတ္ထားပါတယ္။

Basic Style
Document Body အတြက္ Background Color, Font Color အစရွိသျဖင့္ အရင္ဆံုးသက္မွတ္ေပးခ်င္တဲ့အတြက္
ေအာက္ကအတိုင္း အရင္ေရးလိုက္ပါမယ္။
First Step with
PureCSS

body {
background: #fcfcfc;
font-family: Arial;
color: #333;
}
.container {
max-width: 980px;
margin: 0 auto;
padding: 10px;
}

Header and Menu


Pure မွာ Menu Module ရွိၿပီးသားဆိုေတာ့ အဲဒါကိုအလြယ္တကူယူသံုးၿပီးေတာ့ Style ေလးနည္းနည္းျပင္ေရးယံုပါပဲ။
<body> အဖြင့္စစခ်င္းမွာ ေအာက္ကအတိုင္း ေရးလိုက္ပါ။

<div class=”main-header”>
<div class=”container pure-g”>
<div class=”pure-u-1”>
<div class=”pure-menu pure-menu-open pure-menu-horizontal”>
<a href=”#” class=”pure-menu-heading”>Pure CSS</a>
<ul>
<li class=”pure-menu-selected”><a href=”#”>Home</a></
li>
<li><a href=”#”>Download</a></li>
<li><a href=”#”>Documentation</a></li>
</ul>
</div>
</div>
</div>
</div>

style.css ထဲမွာေတာ့ ေအာက္ကအတိုင္းေလးပဲေရးယံုပါပဲ။

.main-header {
box-shadow: 0 0 3px #ccc;
background: #fff;
}
First Step with
PureCSS

Masthead
Masthead ဆိုတာက ေအာက္ကပံုမွာျပထားတဲ့ေနရာကို ဆိုလိုတာပါ။ အဲဒီအပိုင္းကို ဆက္ေရးၾကပါမယ္။

<div class=”main-masthead container”>


<h1>A set of small, responsive CSS modules that you can use in every web
project</h1>
<a class=”pure-button pure-button-primary” href=”#”>Download</a>
<a class=”pure-button” href=”#”>Documentation</a>
</div>

style.css မွာေတာ့ ေအာက္ကအတိုငး္ ေရးလိုက္ရင္ အေပၚကပံုစံအတိုင္း ျဖစ္ပါၿပီ။


First Step with
PureCSS

.main-masthead {
text-align: center;
font-size: 30px;
}
.main-masthead a {
margin: 10px 0;
border-radius: 30px;
}
.main-masthead h1 {
color: #666666;
margin: 60px 0 30px;
}

Feature List
Feature ေတြ စီျပဖို႔ အတြက္ကေတာ့ Pure ရဲ႕ Grid ကိုအသံုးျပဳပါမယ္။ Grid က Column ႏွစ္ခုျဖစ္တဲ့အတြက္ေၾကာင့္
class - pure-u-1-2 ကိုအသံုးျပဳရပါမယ္။

HTML က ေအာက္ကအတုိင္းေရးလိုက္ပါ။
First Step with
PureCSS

<div class=”main-features container”>


<div class=”pure-g-r”>
<div class=”pure-u-1-2”>
<div class=”l-box”>
<h3>Fast</h3>
<p>
YUI’s lightweight core and modular architecture make
it scalable, fast, and robust. Built by frontend engineers at Yahoo!, YUI powers the
most popular websites in the world.
</p>
</div>
</div>

<div class=”pure-u-1-2”>
<div class=”l-box”>
<h3>Complete</h3>
<p>
YUI’s intuitive and well-documented API takes you from
basic DOM handling to building performant and maintainable applications on desktop
browsers, mobile devices, and servers.
</p>
</div>
</div>

<div class=”pure-u-1-2”>
<div class=”l-box”>
<h3>Industrial Strength</h3>
<p>
A thriving community, a carefully architected
infrastructure, and a comprehensive suite of tools help you code like a pro, from
simple web pages to complex web applications.
</p>
</div>
</div>

<div class=”pure-u-1-2”>
<div class=”l-box”>
<h3>Free and Open</h3>
<p>
YUI is free for all uses and is developed in the open
on GitHub. Core team members can always be found in the forums and the #yui IRC channel
on Freenode. Pull requests welcome!
</p>
</div>
</div>
</div>
</div>

ဒီ Feature ေတြကို အေပၚနဲ႔ေအာက္ ခြာေနေအာင္လို႔ Margin ကန္ေပးခ်င္တဲ့အတြက္ေၾကာင့္ style.css မွာ ေအာက္ကအတိုင္း

ေရးလိုက္ပါမယ္။
First Step with
PureCSS

.main-features {
margin: 40px auto;
}

Footer
Footer ကေတာ့ရိုးရိုးေလးပါပဲ။ HTML ကေတာ့ ေအာက္ကအတုိင္းပါ။

<div class=”main-footer”>
<p>copyright &copy; 2014 Pure</p>
</div>

CSS ကေတာ့ ေအာက္ကအတိုင္းပါ။

.main-footer {
border-top: 1px solid #e3e3e3;
text-align: center;
}

အခုဆိုရင္ေတာ့ Home Page တစ္ခုကို လြယ္လြယ္ကူကူနဲ႔ တည္ေဆာက္လုိက္ႏိုင္ပါၿပီ။ ဒါကလည္း CSS Frame-


work ေတြသံုးျပဳတဲ့အခါ ရရွိႏိုင္တဲ့ အက်ိဳးေက်းဇူးတစ္ခုပဲျဖစ္ပါတယ္။ Pure CSS နဲ႔ပတ္သက္ၿပီး purecss.io က Documentation မွာ
အျပည့္အစံုရွိပါတယ္။
The Art of Caching

P H P

Yan Naing
All I Know is I Know Nothing
The Art of Caching

ဟာကြာ ဒီ Website ႀကီးကလည္း ေလးလုိက္တာ။ ဒီ Connection နဲ႔ပဲသံုးေနတာကို ဒီ Website ႀကီးက တျခား


ဟာေတြထက္ ပိုၿပီး ၾကာေနတယ္ ဆိုတဲ့စကားမ်ိဳးေတြ ေျပာဖူးၾက ညည္းဖူးၾကမယ္ထင္ပါတယ္။ ဒါမွမဟုတ္ ကိုယ္ေရးထားတဲ့
Website က အဲလို ေလးေကြးေႏွးေနတာမ်ိဳး ျဖစ္ဖူးမယ္ထင္ပါတယ္။ ဟုတ္ပါတယ္ တခ်ိဳ႕ Website ေတြက သာမန္ Website
ေတြထက္ ပိုေႏွးေနတာမ်ိဳးေတြ ရွိပါတယ္။ ဘာေၾကာင့္ အဲလိုေႏွးေနလဲဆိုတဲ့ အေၾကာင္းအရင္းေတြကေတာ့ အမ်ားႀကီးရွိပါတယ္။
ေျဖရွင္းနည္းေတြလည္း အမ်ားႀကီးရွိပါတယ္။ အဲဒီထဲကမွ လြယ္ကူၿပီး ထိေရာက္တဲ့ အခ်က္တစ္ခု ျဖစ္တဲ့ Cache အေၾကာင္းကို
ေလ့လာမိသေလာက္ အက်ယ္တဝင့္ ေျပာျပေဆြးေႏြးခ်င္ပါတယ္။

What is Cache?
Cache ဆိုတာဘာလဲဆိုတဲ့ ေခါင္းစဥ္ကေန စသင့္တယ္လုိ႔ထင္ပါတယ္။ ဒါေၾကာင့္ Cache ဆိုတာကို နားလည္ေအာင္
ေရခဲေခ်ာင္းသည္ တစ္ေယာက္နဲ႔ ဥပမာျပဳၿပီး ေျပာျပခ်င္ပါတယ္။ လူတစ္ေယာက္က “Michael ေရခဲေခ်ာင္းရမယ္လုိ႔၊ Michael
ေရခဲေခ်ာင္းရမယ္” ဆိုၿပီး ေအာ္ေရာင္းေနပါတယ္။ ဒီေတာ့ ဝယ္ခ်င္တဲ့ ကေလးတစ္ေယာက္က ေရာက္လာတယ္။ ဘယ္လုိေရာင္းလဲ
ဘာအရသာေတြပါလဲဆိုၿပီး ေမးပါတယ္။ ဒီေတာ့ ေရခဲေခ်ာင္းေရာင္းတဲ့သူကလည္း ေခ်ာကလက္၊ ႏို႔၊ စေတာ္ဘယ္ရီ၊ နာနတ္
စသည္ျဖင့္ပါေၾကာင္း ျပန္ေျဖပါတယ္။ ၿပီးေတာ့ ေစ်းႏႈန္းကလည္း ၁၀၊ ၂၀၊ ၅၀ စသည္ျဖင့္ ရွိေၾကာင္းျပန္ေျဖတာေပါ့။ ေနာက္တစ္ေယာက္
လာေမးေတာ့လည္း ဒီလုိပဲ ျပန္ေျဖတယ္။ ေရခဲေခ်ာင္းမကုန္မခ်င္း ဒီစကား ဒီအေျဖေတြကိုပဲ ထပ္ခါထပ္ခါ ေျဖေနရ ေျပာေနရပါတယ္။

အဲလုိ ထပ္ခါထပ္ခါ ျပန္ျပန္ေျဖေနရတဲ့ ကိစၥႀကီးကို ဘယ္လုိေျဖရွင္းလုိက္လဲဆိုေတာ့။ ကက္ဆက္ေခြ တစ္ခုထဲမွာ


သူထပ္ခါထပ္ခါ ေျဖေနရတဲ့ အေျဖေတြကို အသံသြင္းလုိက္ပါတယ္။ ၿပီးေတာ့ Speaker ေလးနဲ႔ အဲဒါကိုပဲ ျပန္ဖြင့္ျပလုိက္ပါတယ္။ “Michael
ေရခဲေခ်ာင္း၊ တစ္ေခ်ာင္း တစ္ဆယ္၊ ႏွစ္ဆယ္၊ ငါးဆယ္။ Michael မွ သံုးေဆာင္ႏိုင္ေသာ အရသာမ်ားမွာ မန္က်ီး၊ သာကူ၊ ေခ်ာ့ကလက္၊
အုန္းေခ်ာင္း၊ ပဲေခ်ာင္း၊ …..” ဆိုၿပီး ပါးစပ္ကမေျပာေတာ့ဘဲ ကက္ဆက္နဲ႔ပဲဖြင့္ျပလုိက္ေတာ့တယ္။ Cache ဆိုတာ အဲဒီအတိုင္းပါပဲ။
ထပ္ခါထပ္ခါ Process လုပ္ေနရမယ့္ ကိစၥေတြ၊ Query လုပ္ေနရမယ့္ ကိစၥေတြကို ျပန္ျပန္လုပ္ေနမယ့္အစား Cache ရိုက္ၿပီး Cache ကိုပဲ
ျပန္ထုတ္ျပလုိက္တာမ်ိဳးပါ။ အဲဒီ Cache ေတြကိုသာ ေကာင္းေကာင္း ကိုင္တြယ္၊ သံုးတတ္မယ္ဆိုရင္ ကိုယ့္ရဲ႕ Website ေတြ Web Appli-
cation ေတြမွာ Performance ပိုင္း အမ်ားႀကီး ေကာင္းမြန္လာမွာ ျဖစ္ပါတယ္။

အခုေလာက္ဆိုရင္ေတာ့ ငါ့ရဲ႕ Website ႀကီး၊ Web Application ႀကီးမွာ Cache ေတြသံုးသင့္တယ္လုိ႔ ေတြးေနေလာက္ၿပီ
ထင္ပါတယ္။ ဒီလုိဆိုရင္ Php caching technique ေတြကို ဆက္ၿပီး ေဖာ္ျပသြားပါမယ္။ ေအာက္မွာ List လုပ္ထားတဲ့အတိုင္း PHP cach-
ing technique ၄ မ်ိဳးရွိပါတယ္။

Opcode Cache Memcache Filecache Webcache

Opcode cache
Opcode cache ကို စၿပီး ေျပာေတာ့မယ္ဆိုရင္ PHP ရဲ႕ ေနာက္ကြယ္ကို နည္းနည္းေလာက္ေတာ့ သိဖုိ႔လိုပါလိမ့္မယ္။ PHP
code ေတြကို ေရးၿပီး Browser မွာ ျပန္ run တဲ့အခါ ေနာက္ကြယ္မွာ ကၽြန္ေတာ္တို႔ ေရးလိုက္တဲ့ code ေတြကို opcode ေတြအျဖစ္ com-
pile လုပ္ၿပီးမွ အဲဒီ Opcode ေတြကို Run တာပါ။ ေရးထားတဲ့ Process ေတြကို တစ္ခါ Run တိုင္း တစ္ခါ Compile လုပ္ၿပီး ထြက္လာတဲ့
Opcode ေတြကိုမွ Run ပါတယ္။
The Art of Caching

ဒီလိုဆိုရင္ Webpage တစ္ခု Generate လုပ္ဖုိ႔အတြက္ Process ေတြ အႀကီးႀကီးေတြေရာ၊ ခပ္ေသးေသးေတြေရာ


အမ်ားႀကီးလုပ္ရပါတယ္။ အဲဒါအျပင္မွာမွ အဲဒီ Process တစ္ခု တစ္ခါ Run တိုင္း Compile တစ္ခါလုပ္ၿပီး Opcode ေတြတစ္ခါ ထုတ္ပါတယ္။
ဒါေတာင္ ကုိယ့္ရဲ႕ Website ကို သံုးတဲ့ Visitor တစ္ေယာက္တည္းရဲ႕ Process ပဲ ရွိပါတယ္။ Visitor ေတြသာ မ်ားလာခဲ့မယ္ဆိုရင္
ပိုၿပီးေတာ့ Process ေတြ မ်ားလာမွာပါ။

ဒါဆိုရင္ အဲလုိ ထပ္ခါထပ္ခါ Compile လုပ္ေနတဲ့ ကိစၥႀကီးကို ေဘးဖယ္လုိက္ၿပီး Compile လုပ္ထားတဲ့ opcode ေတြကို
တိုက္ရိုက္ Run မယ္ဆိုရင္ အမ်ားႀကီးပိုၿပီး ျမန္ႏိုင္တာေပါ့။ အဲဒါကို Opcode cache လုိ႔ေခၚပါတယ္။ Opcode cache အတြက္ Op-
code caching tool ေတြကိုအသံုးျပဳရပါမယ္။ အဲဒီ Opcode caching tool ေတြက ကိုယ္ေရးထားတဲ့ PHP code ေတြရဲ႕ execution
lifecycle ထဲမွာ inject လုပ္ပါတယ္။ ၿပီးေတာ့ PHP က compile လုပ္ၿပီး ထုတ္လုိက္တဲ့ Opcode ေတြကို Memory ေပၚမွာ cache
အေနနဲ႔ မွတ္ထားလုိက္ပါတယ္။ ၿပီးေတာ့ ေနာက္တစ္ခါ အဲဒီ Process ကို အလုပ္လုပ္တဲ့အခါ Memory ေပၚမွာရွိတဲ့ Opcode cache ကိုပဲ
တိုက္ရိုက္ Run ပါတယ္။ Opcode cache ကိုသံုးျခင္းအားျဖင့္ ကိုယ့္ Application ရဲ႕ Performance ကို ၃ ဆ ပိုၿပီးေတာ့ ျမန္ေစတယ္လုိ႔
တခ်ိဳ႕ Website ေတြမွာ ေဖာ္ျပထားပါတယ္။

Side effect of Opcode cache


PHP က compile လုပ္လုိက္တဲ့ Opcode ေတြကို Memory ေပၚမွာ သိမ္းတာျဖစ္တဲ့အတြက္ေၾကာင့္ Side effect အေနနဲ႔
သာမန္ထက္ Memory သံုးစြမႈပိုမ်ားႏိုင္ပါတယ္။

Memcache
Website တစ္ခု သို႔မဟုတ္ Web Application တစ္ခုကို တည္ေဆာက္တဲ့အခါမွာ Website မွာျပမယ့္ Content ေတြေရာ၊ ဒီ
Website နဲ႔ သက္ဆိုင္တဲ့ အခ်က္အလက္ေတြေရာ အားလံုးကို Database ထဲမွာ သိမ္းဆည္းၾကပါတယ္။ အဲဒီ Data ေတြ အားလံုးကိုလည္း
လုိအပ္တဲ့အခါမွာ လုိအပ္သလုိ ျပန္ၿပီး Query လုပ္ၾကပါတယ္။ အဲလုိ Database ကို တစ္ခါ Query လုပ္ဖို႔အတြက္ အရင္ဆံုး Database
နဲ႔ Connection ေဆာက္ရပါမယ္။ ၿပီးရင္ Query လုပ္ၿပီး Connection ကို ျပန္ပိတ္ရပါမယ္။ Query တစ္ခါလုပ္တိုင္း ဒီအဆင့္ ၃ ဆင့္ကို
အၿမဲလုပ္ရတယ္ဆိုတာကို Developer တိုင္းသိၿပီး ျဖစ္ပါတယ္။

ပ်မ္းမွ်အားျဖင့္ Webpage တစ္ခုကို Generate လုပ္ဖုိ႔အတြက္ Database Query အနည္းဆံုး ၈ ခုေလာက္ရွိႏိုင္ပါတယ္။


ဒီထက္လည္း မ်ားႏုိင္ပါတယ္။ Data မ်ားရင္မ်ားသလို Query လုပ္တဲ့အခ်ိန္ကလည္း ၾကာႏိုင္ပါတယ္။ ေနာက္ၿပီး ဒီ Query ေတြက ကိုယ့္ရဲ႕
Website ကို ဝင္တဲ့ Visitor အေရအတြက္ေပၚမူတည္ၿပီး ဆတိုးနဲ႔ မ်ားသြားဦးမွာပါ။ ဒါေၾကာင့္ ကိုယ့္ရဲ႕ Website မွာ Data ကလည္း မ်ား၊
Webpage တစ္ခုအတြက္ Query အေရအတြက္ကလည္းမ်ား၊ ဝင္တဲ့ Visitor အေရအတြက္ကလည္း မ်ားဆိုရင္ေတာ့ Database over-
load ေတြျဖစ္လာႏိုင္သလုိ Webpage တစ္ခုကို Generate လုပ္ၿပီး Response ျပန္မယ့္အခ်ိန္ကလည္း ပိုၿပီး ၾကာျမင့္လာမွာပါ။

ဒါေၾကာင့္ ခဏခဏ Query လုပ္ရမယ့္ Data ေတြကို Database ထဲမွာသာမကဘဲ Memory ေပၚမွာပါ
ဆြဲတင္ထားလုိက္ပါတယ္။ အဲဒီ Data ေတြကို Query လုပ္ဖုိ႔လုိလာရင္ Database ထဲမွာသြားၿပီး Query မလုပ္ေတာ့ဘဲ Memory
ေပၚမွာရွိေနတဲ့ Data ကိုပဲ ဆြဲထုတ္ျပလုိက္ပါတယ္။ အဲဒါကို Memcache လုိ႔ေခၚပါတယ္။ Memcache ကို သံုးလိုက္တဲ့အတြက္ေၾကာင့္
Database မွာ Query လုပ္သလုိ သံုးဆင့္လုပ္စရာ မလုိပါဘူး။ ၿပီးေတာ့ Memory ေပၚကေန Read လုပ္တာက Database ကေန
Query လုပ္တာထက္ အမ်ားႀကီး ပိုၿပီးေတာ့ ျမန္ပါတယ္။ ဒါေၾကာင့္ ကုိယ့္ Website ရဲ႕ ေႏွးေကြးေလးလံမႈကို ေျဖရွင္းႏိုင္မယ့္
နည္းလမ္းတစ္ခုျဖစ္ပါတယ္။ Memcache က ကိုယ့္ Website ရဲ႕ Performance ပိုင္းမွာ ဘယ္ေလာက္ အကူအညီေပးႏိုင္လဲဆိုတာ Face-
book ကို ၾကည့္ရင္သိႏိုင္ပါတယ္။
The Art of Caching

Side effect of Memcache


Database ထဲက Data ေတြကို Memory ေပၚမွာ သိမ္းလုိက္တာျဖစ္လုိ႔ Opcode cache လုိပဲ တျခား သာမန္ Website
ေတြထက္ Memory ပိုစားႏိုင္ပါတယ္။

File cache
HTML ခ်ည္း သက္သက္ေရးထားတဲ့ Static Page နဲ႔ Dynamic Webpage တစ္ခုကို ယွဥ္ၿပီး Load လုပ္တဲ့အခါမွာ Static
Page ေတြကပိုၿပီး ျမန္ဆန္ေလ့ ရွိပါတယ္။ Dynamic က Flexible က်ေအာင္ လုပ္ထားတာျဖစ္တဲ့အတြက္ Process လုပ္ရတာေတြ Data
ဆြဲထုတ္ရတာေတြနဲ႔ေၾကာင့္ ပိုၿပီးေတာ့ ၾကာပါတယ္။ အဲဒီကိစၥကို ေျဖရွင္းဖုိ႔အတြက္ File cache ကိုသံုးပါတယ္။

Client ကေန webpage တစ္ခုကို Request လုပ္တဲ့အခါ အဲဒီ Webpage အတြက္ လုိအပ္မယ့္ Data ေတြကို Data-
base ထဲက ဆြဲထုတ္မယ္။ ၿပီးရင္ အဲဒီ Data ေတြကို Website Template ထဲမွာ ျဖည့္။ ၿပီးမွ အဲဒီ Webpage ကို Client ဆီ Response
ျပန္ပါတယ္။ ေနာက္တစ္ခါ ဒီ URL ကိုေခၚလည္း ဒီအဆင့္ေတြအတိုင္းပဲ လုပ္ေနဦးမွာပါပဲ။ ဒီေတာ့ အေပၚမွာ ေျပာခဲ့တဲ့အဆင့္ေတြကို
ထပ္ခါထပ္ခါ လုပ္မေနေတာ့ဘဲ HTML file အျဖစ္ cache ရိုက္လုိက္ပါတယ္။ ေနာက္တစ္ခါ ဒီ URL ကို Request လာရင္ HTML အျဖစ္
cache ရိုက္ထားတဲ့ File ကို Response ျပန္ေပးလုိက္ပါတယ္။ ဒီေတာ့ သူ႔ရဲ႕ အလုပ္လုပ္ရမယ့္ အဆင့္ေတြက ရိုးရိုး Static webpage
ေလာက္ပဲရွိေတာ့တာေပါ့။ ဒါေၾကာင့္ ကိုယ့္ရဲ႕ Website ရဲ႕ Page loading ေတြက ပိုၿပီး ျမန္ဆန္လာမွာ ျဖစ္ပါတယ္။

File cache ကို ေအာက္မွာ ျပထားတဲ့အတိုင္း

Full File Cache Partial File Cache

ရယ္ဆိုၿပီး ပံုစံႏွစ္မ်ိဳးနဲ႔ သံုးေလ့ရွိပါတယ္။

Full file cache


Full file cache ကေတာ့ ရွင္းပါတယ္။ ဒီ Webpage တစ္ခုလံုးကို HTML အျဖစ္ cache ရိုက္လုိက္ၿပီး အဲဒီ HTML file ရဲ႕
သက္တမ္းမကုန္မခ်င္း၊ ဒါမွမဟုတ္ အေျပာင္းအလဲမရွိမခ်င္း ဒီ HTML ကိုသာ Response ျပန္ေပးတာျဖစ္ပါတယ္။

Partial file cache


Partial file cache ကေတာ့ full file cache နဲ႔ ေျပာင္းျပန္ေပါ့။ Webpage တစ္ခုလံုးကို cache ရိုက္တာမ်ိဳးမဟုတ္ပါဘူး။
သာမန္အားျဖင့္ Webpage ေတြမွာက Update လံုးဝနီးပါး မျဖစ္တဲ့ အပိုင္းေတြနဲ႔ Update ျဖစ္တဲ့အပိုင္းေတြ ေရာေနေလ့ရွိပါတယ္။
ဒါေၾကာင့္ Partial file cache ဆိုၿပီး Update မျဖစ္တဲ့အပိုင္းေတြကို ေရြးၿပီး cache ရိုက္လုိက္တာပါ။

File cache နဲ႔ပတ္သက္ၿပီး Webpage ေတြကို HTML အျဖစ္ cache ရိုက္ၿပီး ျပန္သံုးတာကိုပဲ ေျပာခဲ့တယ္ဆိုေပမယ့္ Da-
tabase ထဲက Query လုပ္မယ့္ Data ေတြကိုလည္း File ထဲမွာ Key value array ပံုစံနဲ႔ cache ရိုက္ၿပီး သံုးေလ့ရွိပါတယ္။
The Art of Caching

Side effect of file cache


File cache အေနနဲ႔ ထူးထူးျခားျခား Side effect ေတာ့မရွိပါဘူး။ ဒါေပမယ့္ ဒီ cache လုပ္ထားတဲ့ file ေတြအတြက္
သက္တမ္းရွိသင့္ပါတယ္။ ဘယ္အခ်ိန္မွာ Refresh လုပ္မယ္ဆိုတာမ်ိဳးေပါ့။ ၿပီးေတာ့ ကိုယ့္ရဲ႕ အခ်က္အလက္ တစ္ခုခုမွာ အေျပာင္းအလဲရွိရင္
ကိုယ္ cache ရိုက္တားတဲ့ file ကိုပါ ျပန္ၿပီး update လုပ္ေပးဖို႔အတြက္ ကိုယ့္ရဲ႕ Application ထဲမွာ ထည့္ေရးထားမွရပါမယ္။

Webcache
Webcache ဆိုတာကေတာ့ Webpage ေတြကို မူရင္း Server မဟုတ္တဲ့ တျခား Server ေတြ ေပၚမွာ ဒါမွမဟုတ္ Client
စက္ေတြမွာ Copy ပြားထားတဲ့ သေဘာမ်ိဳးပါ။ ဥပမာ - Client တစ္ခုကေနၿပီးေတာ့ URL တစ္ခုကို Request လုပ္လုိက္တယ္ဆိုပါစို႔။ အဲဒီ Re-
quest အတြက္ HTML ေတြ၊ Image ေတြ စတာေတြကို အဲဒီ Client နဲ႔ အနီးဆံုးမွာ ရွိတဲ့ Server ေတြမွာ Copy သေဘာမ်ိဳးထားထားေပးပါတယ္။
အဲဒီ Client၊ ဒါမွမဟုတ္ အနီးအနားက Client ေတြက ဒီ URL ကို လွမ္းေခၚတဲ့အခါ မူရင္း Server ဆီက အခ်က္အလက္ေတြကို
သြားယူမယ့္အစား အနီးဆံုးမွာ ရွိတဲ့ Server မွာ Cache ရိုက္ထားတာကိုပဲ လွမ္းေခၚေပးလုိက္ပါတယ္။ ကိုယ္နဲ႔အနီးဆံုးမွာ ရွိတဲ့ Server
ကေန Response ျပန္တာျဖစ္တဲ့အတြက္ေၾကာင့္ မူရင္း Server အထိသြားၿပီး Request လုပ္ရတာထက္စာရင္ ပိုၿပီးေတာ့ ျမန္ပါတယ္။
Webcache မွာရွိတဲ့

Browser Cache Proxy Cache Gateway Cache

သံုးမ်ိဳးအေၾကာင္းကို ဆက္ဖတ္ၾကည့္ရင္ ပိုၿပီးေတာ့ နားလည္သြားမွာပါ။

Browser Cache
ႀကံဳဖူးမလားေတာ့မသိဘူးဗ် တခါတေလက်ရင္ ကိုယ္က Website တစ္ခုကို ၾကည့္ေနရင္းနဲ႔ Link တစ္ခုကို မွားၿပီးေတာ့
သြားႏွိပ္မိတယ္။ ဒါနဲ႔ Back button ကို ျပန္ႏွိပ္လုိက္တဲ့အခါက်ရင္ ခ်က္ခ်င္း ျပန္တက္လာပါတယ္။ Refresh ျပန္ျဖစ္ၿပီး Server ကေန
ျပန္သြားဆြဲတာမ်ိဳးမဟုတ္ဘဲ နဂိုအတိုင္း ခ်က္ခ်င္းျပန္တက္လာတာပါ။ တခ်ိဳ႕အခါေတြမွာဆိုရင္ internet မရေတာ့ရင္ေတာင္ Back ကို
ျပန္သြားလုိက္တဲ့အခါမွာ အဲဒီ Page ကို ပံုမွန္အတိုင္း ျပန္ျမင္ရပါတယ္။ အဲဒါက Browser cache ရဲ႕ စြမ္းေဆာင္ခ်က္ပဲ ျဖစ္ပါတယ္။
ကိုယ္ၾကည့္ခဲ့တဲ့ Webpage ေတြကို ကိုယ့္ရဲ႕စက္ (Harddisk) ထဲမွာ သိမ္းထားတာျဖစ္ပါတယ္။ Browser ေတာ္ေတာ္မ်ားမ်ားမွာ Cache
setting ဆိုတာ ပါဝင္ပါတယ္။ ကိုယ္အဆင္ေျပသလိုလည္း ခ်ိန္ညႇိလုိ႔ရပါတယ္။

Proxy Cache
စာဖတ္သူအေနနဲ႔ Proxy server ေတြကို အသံုးျပဳဖူးမွာပါ။ အဲဒီအခ်ိန္မွာ URL တစ္ခုကို Request လုပ္လုိက္တယ္ဆိုရင္
အဲဒီ URL ကေန Response ျပန္လာတဲ့ အခ်က္အလက္ေတြကို (ဥပမာ - ပံုေတြ၊ Webpage ေတြ) Proxy Server ထဲမွာ Cache
လုပ္လုိက္ပါတယ္။ အဲလုိ Cache လုပ္လုိက္တဲ့အတြက္ ဒီ Proxy ကိုသံုးထားတဲ့ ဘယ္ Client ကပဲျဖစ္ျဖစ္ ဒီ URL ကို Request လုပ္ရင္
မူရင္း Server ထိမသြားေတာ့ဘဲ Proxy server ထဲမွာရွိတဲ့ Cache ကို Response ျပန္ေပးလုိက္ပါတယ္။ ဒါေၾကာင့္ Response time က
ပိုၿပီးေတာ့ ျမန္ဆန္ပါတယ္။
The Art of Caching

တစ္ခုသတိထားစရာရွိတာက အဲဒီ Brower Cache နဲ႔၊ Proxy cache ကို Web Administrator က လုပ္တာမဟုတ္ပါဘူး။
Network Administrator ကလုပ္တာပါ။ ဘာအတြက္လုပ္တာလဲ ဘာအတြက္ သံုးတာလဲဆိုေတာ့ ပထမတစ္ခ်က္ကေတာ့ Response
time ျမန္ဖို႔အတြက္ပါ။ ေနာက္တစ္ခ်က္ကေတာ့ Bandwid ကိုေလွ်ာ့ခ်ခ်င္လုိ႔ပါ။ ျမန္မာႏိုင္ငံမွာဆိုရင္ Redlink က bandwid ေပၚမူတည္ၿပီး
လစဥ္ေၾကးေပးေဆာင္ရပါတယ္။ အဲလုိအခါမ်ိဳးေတြဆိုရင္ ကုိယ့္ရဲ႕ စက္ထဲမွာ ဒါမွမဟုတ္ Proxy Server ထဲမွာ Cache လုပ္ထားတာျဖစ္ၿပီး
အဲဒီ Cache ကိုျပန္သံုးတာျဖစ္တဲ့အတြက္ Bandwid ကိုေလွ်ာ့ခ်ႏိုင္ပါတယ္။

Gateway Cache
Gateway cache က အေပၚက Web cache ႏွစ္ခုလုိ Network Admin က configuration ခ်ထားတာမဟုတ္ဘဲ Web
Admin က Configuration ခ်ထားတာျဖစ္ပါတယ္။ Reverse proxy cache ဒါမွမဟုတ္ Surrogate cache လုိ႔လည္း ေခၚပါတယ္။ Con-
tent Delivery Network (CDN) ေတြက Gateway cache ေတြျဖစ္ပါတယ္။

Side effect of Webcache


Web Admin ေတြအေနနဲ႔ Web cache နဲ႔ပတ္သက္ၿပီး ဘာကိုေၾကာက္ၾကသလဲဆိုရင္ ကုိယ့္ရဲ႕ Website ကို ဝင္တဲ့
Client ေတြနဲ႔ ပတ္သက္တဲ့ Statistics ကို ျပန္ေကာက္ဖုိ႔ ခက္ခဲတာကိုပါ။ Proxy Server လုိမ်ိဳးထဲမွာ Cache ထားၿပီး အဲဒီကေန Re-
sponse ျပန္တဲ့အခါက်ေတာ့ ကိုယ့္ရဲ႕ Website နဲ႔ Client နဲ႔ကို အဆက္ျဖတ္ထားသလို ျဖစ္ေနတာပါ။ ဒါေပမယ့္ အဲဒီ ျပႆနာကို
ေျဖရွင္းလုိ႔ရပါတယ္။

ေနာက္ဆံုးအေနနဲ႔ ေျပာခ်င္တာကေတာ့ Caching ကို ကိုယ့္ရဲ႕ Website ဒါမွမဟုတ္ Web Application ေတြမွာ အပို
Feature အေနနဲ႔ထည့္ေပးတာထက္ သံုးကိုသံုးသင့္တယ္လုိ႔ ေတြးေစခ်င္ပါတယ္။ Website ေတြ Web Application ေတြမွာ Caching
ေတြက လိုအပ္ပါတယ္။ The Art of Caching ကို ဒီမွာပဲ အဆံုးသတ္လုိက္ပါမယ္။ Caching နဲ႔ပတ္သက္တဲ့ Tutorial ေတြကိုေတာ့
ေနာက္လမ်ားမွာ အလ်ဥ္းသင့္သလုိ ေဖာ္ျပေပးသြားပါမယ္။
{echo}

Thank You
ယေန႔ေခတ္မွာ Web Industry ရဲ႕ ေျပာင္းလဲမႈေတြဟာ အရမ္းကို ျမန္ဆန္လြန္းလွပါတယ္။ {echo} အေနနဲ႔ Web Design, Web De-
velopment နဲ႔ပတ္သက္တဲ့ ေဆာင္းပါးေတြ ၊ Tutorial ေတြကို ရႈေထာင့္ေပါင္းစံုကေန အစြမ္းကုန္ႀကိဳးစား ေဖာ္ျပေပးသြားမွာျဖစ္ပါတယ္။
Web Design, Web Development နဲ႔ပတ္သက္ၿပီး အသက္ေမြးဝမ္းေက်ာင္း ျပဳလိုသူေတြအတြက္ တစ္ဖက္တစ္လမ္းက
အေထာက္အကူျပဳေစဖို႔ ရည္ရြယ္ပါတယ္။။

သင့္ရဲ႕တန္ဖိုးရွိတဲ့အခ်ိန္ ခဏတစ္ျဖဳတ္ကို {echo} နဲ႔ ျဖတ္သန္းေပးလို႔ ေက်းဇူးတင္ပါတယ္။

{echo} Magazine ၏ စာမူမ်ား၏ မူပိုင္ခြင့္မ်ားသည္ မူရင္းစာေရးသူမ်ားသာ ပိုင္ဆိုင္ပါသည္။ စာေရးသူ၏


ခြင့္ျပဳခ်က္မရရွိဘဲ ထိုစာမူမ်ား (သို႔မဟုတ္) ထိုစာမူမ်ား၏ တစိတ္တပိုင္းကို Printed Document အေနျဖင့္
ျဖစ္ေစ၊ နဂိုမူလ {echo} ၏ PDF ကို ပံုစံေျပာင္းလဲ၍ ျဖစ္ေစ ၊ တစိတ္တပိုင္းအား ျဖတ္ေတာက္၍
ျဖစ္ေစ၊ အျခား Magazine မ်ားအတြင္း ေပါင္းစပ္၍ ျဖစ္ေစ ၊ ျပန္လည္ေဝမွ်ခြင့္ ၊ ျပန္လည္ထုတ္ေဝခြင့္
မရွိပါ။ အြန္လိုင္းေပၚတြင္ ျပန္လည္ေဝမွ်မည္ ဆိုပါက နဂိုမူလ Download Link အတိုင္း ေဝမွ်ၾကပါရန္
ေမတၱာရပ္ခံအပ္ပါသည္။

{ echo } © 2013 . http://echo.myanmarlinks.net

echo.myanmarlinks.net 58

You might also like