Professional Documents
Culture Documents
December
December
Echo Team
table of content
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
fb.me/EchoMagazine.mm echo.emagz@gmail.com
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 ရွိပါတယ္။
{
“require”: {
“firephp/firephp-core”: “dev-master”
}
}
Debugging PHP code with
FirePHP
Plain PHP မွာ ဆိုရင္ေတာ့ ပံုမွန္ အတိုင္းပဲ require လုုပ္ေပးရပါမယ္။ FirePHP ကို သံုးတဲ့ အခါမွာ Object Oriented
နည္း အတိုင္းသံုးလို႔ရသလို Procedural နည္းနဲ႕လည္းသံုးလို႔ရပါတယ္။
require ‘FirePHPCore/FirePHP.class.php’;
Procedural နည္းအရသံုးမယ္ဆိုရင္ေတာ့ fb.php ကို require လုုပ္ေပးရပါမယ္။ Static method call ကို
သံုးမယ္ဆိုရင္လည္း ဒီ fb.php ကုုိပဲ require လုုပ္ေပးရပါမယ္။
require ‘FirePHPCore/fb.php’;
require_once(‘FirePHPCore/FirePHP.class.php’);
$firephp = FirePHP::getInstance(true);
$firephp->log(“Log Message”);
require_once(‘FirePHPCore/fb.php’);
FB::log(“Log Message”);
Procedural Way
require_once(‘FirePHPCore/fb.php’);
FB::log(“Log Message”);
Debugging PHP code with
FirePHP
<?php
require ‘FirePHPCore/fb.php’;
FB::log(‘Log message’);
FB::info(‘Info message’);
FB::warn(‘Warn message’);
FB::error(‘Error message’);
fb($test, FirePHP::INFO);
$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 တစ္ခုအေနနဲ႕ ထည့္လို႔ရပါတယ္။
//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’;
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’;
$secret_key = sha1($value.’s@1tk3y’);
$table[] = array($value, $secret_key);
}
ဒီမွာ ေနာက္ဆံုး 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 ျဖစ္တဲ့ အတြက္ သိပ္မသိသာပါဘူး။
တကယ္လက္ေတြ႕ သံုးတဲ့ အခါမွာေတာ့ အရမ္းကို အသံုးဝင္မွာပါ။
P H P
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]
<?php
User::create($user);
}
}
အခုဆိုရင္ username echo ဆိုတဲ့ နာမည္နဲ႕ demo user တစ္ေယာက္ေဆာက္ဖို႕ရာ အတြက္ လိုအပ္တဲ့ Seeder Class ကို
ေရးၿပီးသြားပါၿပီ။ ၿပီးသြားရင္ ဒီ Class ကိုေဆာက္ထားတဲ့ folder ထဲမွာပဲ ရွိတဲ့ DatabaseSeeder ဆိုတဲ့ file မွာ အနည္းငယ္ သြားၿပီးေတာ့
ျပင္ဆင္ေပးရပါမယ္။
// $this->call(‘UserTableSeeder’);
$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 မွာ ဒီလို ျပင္လိုက္ပါတယ္။
အစား
ဆိုၿပီးေတာ့ ျပင္လိုက္ပါတယ္။ ဒါေတြ ျပင္ၿပီးသြားရင္ေတာ့ command line ကေန seed ကို 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”>’;
return $ui;
}
}
@extends(‘layouts.master’)
@section(‘content’)
@if(Session::has(‘message’))
{{ Session::get(‘message’) }}
@endif
{{ 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အတြက္ကို ေရးၾကည့္ၾကပါမယ္။
Route::any(‘login’, ‘UserController@login’);
ဒီအဆင့္အထိ OK တယ္ဆိုရင္ ကၽြန္ေတာ္တို႕ေတြ Login Form ကေန POST method နဲ႔ Data ပို႕လိုက္မယ့္ အပိုင္းကို
ဆက္သြားပါမယ္။ အဲ့ဒီ အတြက္ User Controller ထဲက login method မွာ လိုအပ္တဲ့ code ေတြထပ္ထည့္ပါမယ္။
Create Note Application With Laravel 4 (II)
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!’);
Request Method က Post ျဖစ္တဲ့အခ်ိန္မွာ အရင္ဆံုး Validation စစ္ပါတယ္။ username ေရာ password ေရာ ႏွစ္ခုလံုးက
မပါမျဖစ္ပါရမယ္လို႕ သတ္မွတ္ေပးပါတယ္။ ၿပီးေတာ့ Validation passes ျဖစ္ရင္ Auth::attempt() ဆိုၿပီးေတာ့ login အတြက္လုပ္ပါတယ္။
တကယ္လို႕ login သာ မွန္ခဲ့မယ္ဆိုရင္ေတာ့ NoteController::index action ကို သြားပါဆိုၿပီးေတာ့ Redirect လုပ္ပါတယ္။ တကယ္လို႕
မမွန္ခဲ့ရင္ေတာ့ ဒီ Login Action ကိုပဲ ျပန္ၿပီးေတာ့ Redirect လုပ္ပါတယ္။ Redirect လုပ္တဲ့ေနရာမွာလဲ Error အတြက္ Message
ပါတစ္ပါတည္း ထည့္ေပးလိုက္ပါတယ္။
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’);
// Oldies $note->user_id = 1;
$note->user_id = Auth::user()->id;
i c l e
Art
K
Facebook : /khaylay
Twitter : @khayusaki
Github : @khay
Website : http://khay.me
Tips to Speed Up Your 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 ေတြ ကိုက္ညႇိႏိုင္ပါတယ္။
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 အတြက္ အသံုးျပဳတာမ်ားပါတယ္။
ဥပမာ အေနနဲ႕ 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 ေနာက္ဆံုးမွ အလုပ္လုပ္ခိုင္းတာက အသံုးျပဳသူေတြအေနနဲ႕ ပိုမို ျမန္ျမန္ဆန္ဆန္နဲ႕ အသံုးျပဳလာႏိုင္မွာပဲျဖစ္ပါတယ္။
P H P
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 ကို
ေအာက္ပါ ပုံစံအတုိင္း -
edit လုပ္လုိက္ပါ။ ထုိေနာက္ laravel4 တည္ရွိရာ directory ကုိ command line ျဖင့္သြားပါ။
ရုိက္လုိက္ပါ။ ျပီးလွ်င္ေအာက္ပါအတုိင္း Vendor ႏွင့္ Package တုိ ့ေနရာတြင္ မိမိတုိ ့ၾကိဳက္ႏွစ္သက္သလုိ ေျပာင္းလဲ ႏုိင္သည္။
ထုိေျပာင္းလဲလုိက္သည့္ အေပၚတြင္မူတည္၍ Config လုပ္ရမည့္ ပုံပါ ေျပာင္းလဲသြားမည္ ျဖစ္သည္။ Package တြင္ public , src , test ,
vendor ဟူ၍ folder ေလးခု ပါရွိမည္ ျဖစ္သည္။
public folder မွာ assets မ်ား ျဖစ္ၾကေတာ့ html, css နဲ ့javascript ဖုိင္မ်ား ထားရွိရန္ေနရာ ျဖစ္သည္။
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;
/**
* 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’);
}
PackageServiceProvider.php ရွိရာ Folder တြင္ Package.php ကုိ တည္ေဆာက္လုိက္ပါ။ ထုိေနာက္ ေအာက္ပါ Code
မ်ားကုိ ကူးထည့္လုိက္ပါ။
<?php
namespace Vendor\Package;
class Package {
}
Creating a Laravel 4 Package
echo Package::greeting();
သုိ ့ေသာ္ ထုိသုိ ့ျပဳလုပ္ရန္ Facade တစ္ခု တည္ေဆာက္ရန္လုိမည္။ ထုိအတြက္ Package directory ထဲတြင္ Facade ဟု အမည္ရသည့္
Folder တစ္ခု တည္ေဆာက္လုိက္ပါ။
ထုိေနာက္ Package.php ဟုေသာ file တစ္ခုကို create လုပ္လုိက္ပါ။ ျပီးပါက ေအာက္ပါ Code မ်ားကုိ ကူးထည့္လုိက္ပါ။
<?php
namespace Vendor\Package\Facades;
use Illuminate\Support\Facades\Facade;
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return ‘Package’; }
}
Creating a Laravel 4 Package
$this->app->booting(function()
{
$loader = \Illuminate\Foundation\AliasLoader::getInstance();
$loader->alias(‘Package’, ‘Vendor\Package\Facades\Package’);
});
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 ေတြ အၾကမ္းအားျဖင့္ သံုးမ်ိဳးခဲြလို႔ရပါတယ္။
ဒါကေတာ့ ကိန္းဂဏာန္း ေတြနဲ႔ ပတ္သတ္ၿပီး သိမ္းတဲ့ Type ေတြပါ။ Numeric Data Types ထဲမွာ ပါဝင္တဲ့ Types
ေတြကေတာ့
TINYINT
TINYINT ဆိုတဲ့ type ကေတာ့ number ေတြကို သိမ္းတဲ့ေနရမွာ အနည္းဆံုးျဖစ္ပါတယ္။ သူမွာ 1 byte data ပဲသိမ္းလို႔
ရပါတယ္။ ၿပီးေတာ့ သိမ္းလို႔ရတဲ့ range က -128 မွ 127 အထိ ပဲသိမ္းလို႔ရတာပါ။ အကယ္၍ သူ႔ရဲ႕ attributes ထဲမွာ UNSIGNED
လို႔ထည့္ထားရင္ေတာ့ 0 ကေန 255 အထိ ေျပာင္းသိမ္းေပးပါတယ္။
SMALLINT
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
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
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 ဆိုၿပီး ျဖစ္ပါတယ္။
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
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 နဲ႔ 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
Facebook : /soethihanaung
Website : http://soethiha.me
Interview with
Ko Zin Min
ကိုဇင္မင္းအေနနဲ႔ Web Development ေလာကမွာ အေျပာင္းအလဲေတြ မ်ိဳးစုံကို ၾကဳံဖူးခဲ့ၿပီ ဆိုေတာ့ ျမန္မာနိုင္ငံ Web
Development ေလာကရဲ့ အနိမ့္အျမင့္ အတက္အက် အေၾကာင္းကို အက်ဥ္းခ်ဳပ္ ေျပာျပေပးပါဦးခင္ဗ်။ အားရတဲ့ အခ်က္ေတြ အားမရတဲ့
အခ်က္ေတြေရာေပါ့ခင္ဗ်။
ကၽြန္ေတာ္ ေနာက္တစ္ခု ေမးလိုတာက အြန္လိုင္း ေပးမင့္ဆိုတာ Paypal, MasterCard, Visa စတာေတြ ရလာမွ
အြန္လိုင္း ေပးမင့္ ျဖစ္တာလား၊ ျပည္တြင္းက ဘဏ္ေတြကေရာ ေဆာင္ရြက္လို႔ မရနိုင္ဘူးလား၊ Local သေဘာ Global ခ်ိတ္ဆက္မွုေတြမွာ
ဘယ္လိုပံုစံေတြနဲ႔ ခ်ိတ္ဆက္တယ္ဆိုတာ ရွင္းျပေပးပါခင္ဗ်။ ကၽြန္ေတာ္ မွတ္မိတာ တစ္ခုရွိပါတယ္၊ အာရွဓန ဘဏ္က အြန္လိုင္း
ေငြေခ်စနစ္ ရေတာ့မယ္ဆိုတာ သတင္းၾကားလိုက္ေပမယ့္ ေနာက္ပိုင္း အာရွဓနဘဏ္ ပ်က္သြားေတာ့ သတင္းလည္း ေပ်ာက္သြားပါတယ္။
လက္ရွိ ျမန္မာႏိုင္ငံရဲ့ 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 ေငြေပးေခ်မႈရဲ့မွတ္တိုင္
တစ္ခုျဖစ္လာမယ္လို႕ျမင္မိပါတယ္ခင္ဗ်ာ။
C S S
Pure CSS ဆိုတာကေတာ့ Yahoo ကထုတ္တဲ့ CSS Framework တစ္ခုျဖစ္ပါတယ္။ Lightweight ျဖစ္ၿပီးေတာ့ Modular
CSS Framework တစ္ခုလည္းျဖစ္ပါတယ္။ Modular ဆိုတဲ့အတိုင္း ကိုယ့္ Project မွာ Table ေတြ သံုးစရာမလိုဘူးဆိုရင္ Table Module
ကို ျဖဳတ္ထားႏုိင္ပါတယ္။ Module ေတြအားလံုးေပါင္းမွ Pure ရဲ႕ CSS File Size ဟာ 4.4 KB သာရွိပါတယ္။
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>
</body>
</html>
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;
}
<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>
.main-header {
box-shadow: 0 0 3px #ccc;
background: #fff;
}
First Step with
PureCSS
Masthead
Masthead ဆိုတာက ေအာက္ကပံုမွာျပထားတဲ့ေနရာကို ဆိုလိုတာပါ။ အဲဒီအပိုင္းကို ဆက္ေရးၾကပါမယ္။
.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=”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>
ေရးလိုက္ပါမယ္။
First Step with
PureCSS
.main-features {
margin: 40px auto;
}
Footer
Footer ကေတာ့ရိုးရိုးေလးပါပဲ။ HTML ကေတာ့ ေအာက္ကအတုိင္းပါ။
<div class=”main-footer”>
<p>copyright © 2014 Pure</p>
</div>
.main-footer {
border-top: 1px solid #e3e3e3;
text-align: center;
}
P H P
Yan Naing
All I Know is I Know Nothing
The Art of Caching
What is Cache?
Cache ဆိုတာဘာလဲဆိုတဲ့ ေခါင္းစဥ္ကေန စသင့္တယ္လုိ႔ထင္ပါတယ္။ ဒါေၾကာင့္ Cache ဆိုတာကို နားလည္ေအာင္
ေရခဲေခ်ာင္းသည္ တစ္ေယာက္နဲ႔ ဥပမာျပဳၿပီး ေျပာျပခ်င္ပါတယ္။ လူတစ္ေယာက္က “Michael ေရခဲေခ်ာင္းရမယ္လုိ႔၊ Michael
ေရခဲေခ်ာင္းရမယ္” ဆိုၿပီး ေအာ္ေရာင္းေနပါတယ္။ ဒီေတာ့ ဝယ္ခ်င္တဲ့ ကေလးတစ္ေယာက္က ေရာက္လာတယ္။ ဘယ္လုိေရာင္းလဲ
ဘာအရသာေတြပါလဲဆိုၿပီး ေမးပါတယ္။ ဒီေတာ့ ေရခဲေခ်ာင္းေရာင္းတဲ့သူကလည္း ေခ်ာကလက္၊ ႏို႔၊ စေတာ္ဘယ္ရီ၊ နာနတ္
စသည္ျဖင့္ပါေၾကာင္း ျပန္ေျဖပါတယ္။ ၿပီးေတာ့ ေစ်းႏႈန္းကလည္း ၁၀၊ ၂၀၊ ၅၀ စသည္ျဖင့္ ရွိေၾကာင္းျပန္ေျဖတာေပါ့။ ေနာက္တစ္ေယာက္
လာေမးေတာ့လည္း ဒီလုိပဲ ျပန္ေျဖတယ္။ ေရခဲေခ်ာင္းမကုန္မခ်င္း ဒီစကား ဒီအေျဖေတြကိုပဲ ထပ္ခါထပ္ခါ ေျဖေနရ ေျပာေနရပါတယ္။
အခုေလာက္ဆိုရင္ေတာ့ ငါ့ရဲ႕ Website ႀကီး၊ Web Application ႀကီးမွာ Cache ေတြသံုးသင့္တယ္လုိ႔ ေတြးေနေလာက္ၿပီ
ထင္ပါတယ္။ ဒီလုိဆိုရင္ Php caching technique ေတြကို ဆက္ၿပီး ေဖာ္ျပသြားပါမယ္။ ေအာက္မွာ List လုပ္ထားတဲ့အတိုင္း PHP cach-
ing technique ၄ မ်ိဳးရွိပါတယ္။
Opcode cache
Opcode cache ကို စၿပီး ေျပာေတာ့မယ္ဆိုရင္ PHP ရဲ႕ ေနာက္ကြယ္ကို နည္းနည္းေလာက္ေတာ့ သိဖုိ႔လိုပါလိမ့္မယ္။ PHP
code ေတြကို ေရးၿပီး Browser မွာ ျပန္ run တဲ့အခါ ေနာက္ကြယ္မွာ ကၽြန္ေတာ္တို႔ ေရးလိုက္တဲ့ code ေတြကို opcode ေတြအျဖစ္ com-
pile လုပ္ၿပီးမွ အဲဒီ Opcode ေတြကို Run တာပါ။ ေရးထားတဲ့ Process ေတြကို တစ္ခါ Run တိုင္း တစ္ခါ Compile လုပ္ၿပီး ထြက္လာတဲ့
Opcode ေတြကိုမွ Run ပါတယ္။
The Art of Caching
ဒါဆိုရင္ အဲလုိ ထပ္ခါထပ္ခါ 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 ေတြမွာ ေဖာ္ျပထားပါတယ္။
Memcache
Website တစ္ခု သို႔မဟုတ္ Web Application တစ္ခုကို တည္ေဆာက္တဲ့အခါမွာ Website မွာျပမယ့္ Content ေတြေရာ၊ ဒီ
Website နဲ႔ သက္ဆိုင္တဲ့ အခ်က္အလက္ေတြေရာ အားလံုးကို Database ထဲမွာ သိမ္းဆည္းၾကပါတယ္။ အဲဒီ Data ေတြ အားလံုးကိုလည္း
လုိအပ္တဲ့အခါမွာ လုိအပ္သလုိ ျပန္ၿပီး Query လုပ္ၾကပါတယ္။ အဲလုိ Database ကို တစ္ခါ Query လုပ္ဖို႔အတြက္ အရင္ဆံုး Database
နဲ႔ Connection ေဆာက္ရပါမယ္။ ၿပီးရင္ Query လုပ္ၿပီး Connection ကို ျပန္ပိတ္ရပါမယ္။ Query တစ္ခါလုပ္တိုင္း ဒီအဆင့္ ၃ ဆင့္ကို
အၿမဲလုပ္ရတယ္ဆိုတာကို Developer တိုင္းသိၿပီး ျဖစ္ပါတယ္။
ဒါေၾကာင့္ ခဏခဏ 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
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 နဲ႔ပတ္သက္ၿပီး Webpage ေတြကို HTML အျဖစ္ cache ရိုက္ၿပီး ျပန္သံုးတာကိုပဲ ေျပာခဲ့တယ္ဆိုေပမယ့္ Da-
tabase ထဲက Query လုပ္မယ့္ Data ေတြကိုလည္း File ထဲမွာ Key value array ပံုစံနဲ႔ cache ရိုက္ၿပီး သံုးေလ့ရွိပါတယ္။
The Art of Caching
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
ႀကံဳဖူးမလားေတာ့မသိဘူးဗ် တခါတေလက်ရင္ ကိုယ္က 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 ေတြျဖစ္ပါတယ္။
ေနာက္ဆံုးအေနနဲ႔ ေျပာခ်င္တာကေတာ့ 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.myanmarlinks.net 58