05 ธันวาคม 2552

Hotmail สนับสนุน POP3 ทั้งหมด 100% แล้ว

เมื่อต้นปี ไมโครซอฟท์ได้เริ่มเปิดบริการ POP3 ของ Hotmail ให้กับผู้ใช้ในบางประเทศ มาถึงเมื่อวานนี้ ไมโครซอฟท์ได้ประกาศว่าผู้ใช้ Hotmail ทุกคนสามารถใช้งาน POP3 ได้แล้วครับ
สำหรับผู้ที่ต้องการใช้ Hotmail POP3 ต้องใส่ค่าตามนี้
  • POP server: pop3.live.com (Port 995)
  • POP SSL required? Yes
  • User name: Your Windows Live ID, for example yourname@hotmail.com
  • Password: The password you usually use to sign in to Hotmail or Windows Live
  • SMTP server: smtp.live.com (Port 25 or 587)
  • Authentication required? Yes (this matches your POP username and password)
  • TLS/SSL required? Yes
ผมทดสอบแล้วบน Evolution ก็พบว่าใช้งานได้ ส่วน IMAP นั้นยังไม่สนับสนุน
ที่มา - Windows Live Hotmail Blog, Ars Technica



Best Regards,
ISCI(ART)


     089-509-1528


14 ตุลาคม 2552

Auto refresh webpage but maintain scroll position รีเฟรช โดยที่สกอร์อยู่ที่เดิม

Auto refresh webpage but maintain scroll position

 
Sample 01
< html>
< title>< /title>
< head>
< script language="javascript">
 
// function saves scroll position
function fScroll(val)
{
    var hidScroll = document.getElementById('hidScroll');
    hidScroll.value = val.scrollTop;
}
 
// function moves scroll position to saved value
function fScrollMove(what)
{
    var hidScroll = document.getElementById('hidScroll');
    document.getElementById(what).scrollTop = hidScroll.value;
}
< /script>
< /head>
 
< body onload="fScrollMove('div_scroll');" onunload="document.forms(0).submit()";>
< form>
< input type="text" id="hidScroll" name="a">< /br>
< div id="div_scroll" onscroll="fScroll(this);" 
style="overflow:auto;height:100px;width:100px;">
 
.. VERY LONG TEXT GOES HERE
   
< /div>
< /form>
< /body>
< /html>

 

Edited By Tanakorn inuse

                <script language="JavaScript">

                        /*Maintaining Page Scroll Position

                        By Tanakorn Kulhong

                        Amptron

                        */

            setTimeout ("refreshPage()", 1000);        

            var scrollX = 0;

            var scrollY = 0; 

            function refreshPage() {

                        //var page = window.frames['mainFrame'];            

                        var page = window.parent.frames['mainFrame'];

                        scrollX = page.document.body.scrollLeft;

                        scrollY = page.document.body.scrollTop;

                        page.document.location = "realtimedata.php";

                        setTimeout("doScroll()", 50);//Time to maintain scroll millsec

            }

 

            function doScroll() {

                        //var page = window.frames['mainFrame'];

                        var page = window.parent.frames['mainFrame'];

                        page.document.body.scrollLeft = scrollX;

                        page.document.body.scrollTop = scrollY;

                        setTimeout ("refreshPage()", 1000);

            }

</script>

 

 

 

Sample 3

 

Here is the complete PHP example:

<HTML>

<HEAD>

<TITLE>Test</TITLE>

<script>

function SaveScrollXY() {

document.Form1.ScrollX.value = document.body.scrollLeft;

document.Form1.ScrollY.value = document.body.scrollTop;

}

function ResetScrollPosition() {

var hidx, hidy;

hidx = document.Form1.ScrollX;

hidy = document.Form1.ScrollY;

if (typeof hidx != 'undefined' && typeof hidy != 'undefined') {

window.scrollTo(hidx.value, hidy.value);

}

}

</script>

</HEAD>

<BODY onload="ResetScrollPosition()">

<form name="Form1″ id="Form1″ method="post"

onsubmit="SaveScrollXY()" action="index.php">

<input name="ScrollX" id="ScrollX" type="hidden"

value="<?php echo $_REQUEST['ScrollX'] ?>" />

<input name="ScrollY" id="ScrollY" type="hidden"

value="<?php echo $_REQUEST['ScrollY'] ?>" />

<p>This is just a paragraph to make a very long page.</p>

<P>This is just a paragraph to make a very long page.</P>

<P>

<input name="TextBox1″ type="text"

value="<?php $v = $_REQUEST['TextBox1']; echo $v ? $v + 1 : 1 ?>"

readonly="readonly" id="TextBox1″ /></P>

<P>

<input type="submit" name="Button1″ value="Post Form"

id="Button1″ /></P>

</form>

</BODY>

</HTML>

 

09 สิงหาคม 2552

Send data from PHP to flash

Send data from PHP to flash

จาก Entry ที่แล้ว เป็นการส่งข้อมูลจาก flash -> PHP
คราวนี้มาดูในทางกลับกัน คือส่งจาก PHP ไปยัง flash

วิธีการก็คือ ทาง PHP จะ echo string ที่อยู่ในรูปแบบ variable=value ไปให้ (ดู code ด้านล่าง)

code ใน PHP


<?php
echo"myVariable=Hello World";
?>


code ใน flash


//สร้าง textfield
this.createTextField("display_txt",1,0,0,100,20);
var hello_lv:LoadVars = new LoadVars();
//เมื่อ hello_lv ได้รับ ข้อมูลมา
hello_lv.onLoad = function(success){
if(success){
//นำ Hello World มาโชว์ใน text field
display_txt.text = this.myVariable;
}else{
trace("An error has occurred.");
}
}
//ให้ hello_lv โหลดข้อมูลจาก ไฟล์ php
hello_lv.load("sendtoflash.php");



ถ้าต้องการส่งหลายตัวก็ ส่งเป็น String "variable1=value1&variable2=value2&..."

 

Send data from flash to PHP by POST method

Send data from flash to PHP by POST method

เวลาที่จะต้องการส่ง ตัวแปร จาก flash ไปยัง PHP ก็จะทำโดยการนำตัวแปรทั้งหมด ยัดเข้าไปใส่ object ตัวนึง แล้วก็ส่งไป ทาง PHP ก็จะรับ โดย $_POST

ตัวอย่างที่ทำคือ ปุ่มกด ส่งค่าไปยัง php เพื่อ write ลง text file

code ใน flash

//สร้าง label
this.createClassObject(mx.controls.Label,"lb",4);
lb.move(20,0);
lb.autoSize = true;
lb.text = "press the button";

//สร้าง button
this.createClassObject(mx.controls.Button,"ok_bt",5,{label:"Send Data"});
ok_bt.move(20,20);

//สร้าง event เมื่อกด ปุ่มให้เรียก sendData()
var ok_listener:Object = new Object();
ok_listener.click = function(){
sendData();
}
ok_bt.addEventListener("click",ok_listener);


function sendData():Void{

var result_lv:LoadVars = new LoadVars();
result_lv.onLoad = function() {
lb.text = "Text file was written.";
};

var send_lv:LoadVars = new LoadVars();
//ยัดค่าของตัวแปร name และ website ลงไปใน send_lv
send_lv.name = "flashas";
send_lv.website = "http://flashas.exteen.com";
//ส่ง ตัวแปร name และ website ที่อยู่ใน send_lv ไปยัง print.php เมื่อเสร็จแล้วก็จะกลับมา call result_lv.onLoad
send_lv.sendAndLoad("print.php", result_lv, "POST");
}


code ใน php

<?php
$name = $_POST['name'];
$site = $_POST['website'];

$your_data = "i am ".$name.". my blog is ".$site;

//เปิด file เพื่อเขียน
$fp = fopen("textfile.txt", "w");

//เขียน ลง file ที่เปิดไว้
fwrite($fp, $your_data);

//ปิด file
fclose($fp);
?>



เมื่อเปิด textfile.txt มาก็จะมีข้อความว่า

"i am flashas. my blog is http://flashas.exteen.com"

 

Flash action script : Work with Component

ListBox Family Component

Entry นี้จะมาลองใช้ Component ถึง 3 อย่าง พร้อม ๆ กัน คือ
1.ComboBox - เลือกได้ item เดียว
2.List - เลือกหลาย item ก็ได้
3.Grid - เลือกหลาย item ก็ได้ แต่ว่า มันโชว์ในรูปแบบ ตารางได้

งั้นมาลองใช้กันเลย
1. ลาก component 3 อย่างที่จะใช้ไปใส่ไว้ที่ Library รวมทั้ง TextArea ด้วย (ไว้แสดงค่า)
2. ใส่ code ที่ frame แรกดังนี้


//สร้าง instance ของ TextArea และ กำหนด properties ต่างๆ
this.createClassObject(mx.controls.TextArea,"myTextArea",0);
myTextArea.move(20,20);
myTextArea.text = "Please select item in any components";
myTextArea.setSize(400,50);
myTextArea.wordWrap = true;
myTextArea.html = true;

//สร้าง instance ของ ComboBox และกำหนด properties ต่าง
this.createClassObject(mx.controls.ComboBox,"myComboBox",1);
myComboBox.move(20,80);
myComboBox.addItem("Mike","56");
myComboBox.addItem("Naomi","45");
myComboBox.addItem("Pugkung","80");

//สร้าง listener เพื่อรองรับ event ที่เกิดขึ้น กับ ComboBox
var cb_Listener:Object = new Object();
cb_Listener.change = function(evtObj:Object){
myTextArea.text = evtObj.target.selectedItem.label + " is "
+ evtObj.target.selectedItem.data + " kilograms";
}
myComboBox.addEventListener("change",cb_Listener);

//สร้าง instance ของ List และกำหนด properties ต่าง
this.createClassObject(mx.controls.List,"myList",2);
myList.move(20,120);
//add items to list and add thier datas
myList.addItem({label:"Mike",data1:"140",data2:"10"});
myList.addItem({label:"Naomi",data1:"160",data2:"18"});
myList.addItem({label:"Pugkung",data1:"178",data2:"24"});

//สร้าง listener เพื่อรองรับ event ที่เกิดขึ้น กับ List
var li_Listener:Object = new Object();
li_Listener.change = function(evtObj:Object){
var selectedObj:Object = evtObj.target.selectedItem;
myTextArea.text = selectedObj.label + " is "+ selectedObj.data2
+ "<br>and height is "+selectedObj.data1;
}
myList.addEventListener("change",li_Listener);

//สร้าง instance ของ DataGrid และกำหนด properties ต่าง
this.createClassObject(mx.controls.DataGrid,"myDataGrid",4);
myDataGrid.move(20,240);
myDataGrid.setSize(200,150);
//set column name เพื่อไว้ให้รู้ว่าแต่ละ column คืออะไร
myDataGrid.columnNames = ["Name","Sex","Country"];
//add item to datagrid
myDataGrid.addItem({Name:"Mike",Sex:"Male",Country:"USA",called:"man"});
myDataGrid.addItem({Name:"Naomi",Sex:"Female",Country:"Japan",called:"woman"});
myDataGrid.addItem({Name:"Pugkung",Sex:"Male",Country:"Korea",called:"man"});
//สร้าง listener เพื่อรองรับ event ที่เกิดขึ้น กับ DataGrid
var dg_Listener:Object = new Object();
dg_Listener.change = function(evtObj:Object){
var selectedObj:Object = evtObj.target.selectedItem;
myTextArea.text = selectedObj.Name + " is a " + selectedObj.called + " who lives in "
+ selectedObj.Country;
}
myDataGrid.addEventListener("change",dg_Listener);


จะเห็นว่า ในการใช้ datagrid นั้น ตอนที่ addItem ไป เราใส่ ค่าไป 4 ค่า แต่ ค่าที่แสดงผลบน datagrid นั้นมีแค่ 3 คือ ซึ่ง 3 ค่านี้มัน map กับ columnNames ที่ set ไว้ และ ส่วนอีกค่า(called) เราก็สามารถ กำหนดไว้ตอน addItem แล้วมาเรียกใช้ได้เช่นกัน

posted by flashas, at 2006-May-29 13:08:422

RadioButton Component

Radio button นั้น ต่างกับ checkbox ตรงที่ ใน 1 group มันจะเลือกได้แค่อันเดียว เพราะฉะนั้น flash เอง จึงมี property ที่มันเป็น group ให้อยู่แล้ว ไม่ต้องมานั่งทำเหมือน checkbox ใน entry ที่แล้ว

1.ลาก component TextArea, RadioButton และ Button ไปใส่ไว้ที่ Library
2.ใส่ code ที่ frame แรก ดังนี้


//สร้าง instance ของ TextArea
this.createClassObject(mx.controls.TextArea,"myTextArea",0);
//กำหนด properties ต่าง ๆ
myTextArea.move(20,10);
myTextArea.setSize(200,30);
myTextArea.text = "Select choice";

//loop สร้าง instance ของ RadioButton
for(var i:Number=1;i<4;i++){
this.createClassObject(mx.controls.RadioButton,"myRadioButton"+i,i);
_root["myRadioButton"+i].move(20,(20*i)+40);
_root["myRadioButton"+i].label = "RadioButton"+i;
//set groupName ของ RadioButton พวกนี้
_root["myRadioButton"+i].groupName = "choiceGroup";
}

//สร้าง instance ของ button
this.createClassObject(mx.controls.Button,"myButton",10);
myButton.move(20,150);
myButton.label = "ok";

//สร้าง listener เพื่อมารับ event ของ button
var myListener:Object = new Object();
myListener.click = function(){
var selectedRadioButton = choiceGroup.selection;
myTextArea.text = "you select "+selectedRadioButton.label;
}
myButton.addEventListener("click",myListener);

posted by flashas, at 2006-May-29 01:21:150

CheckBox Component [2]

จาก Entry ที่แล้ว เราได้สร้าง checkBox component จากการวนลูป ซึ่งชื่อของ instance มันก็จะอยู่ในรูปแบบ "xxxN"

Q : แล้วทีนี้ ถ้าจะใช้ checkBox เยอะ แต่ให้มันมีชื่อในแบบฉบับของตัวเองแล้วเวลา check จะ check ยังไง ?
A : ทำเป็น group แล้วใช้ condition check group ดังนี้

1.ลาก component Label,CheckBox,Button ไปไว้ใน Library
2.ใส่ code ดังนี้ที่ Frame แรก


//create label and set its properties.
this.createClassObject(mx.controls.Label,"myLabel",10);
myLabel.move(20,0);
myLabel.autoSize = "left";
myLabel.text = "nothing is checked";

//create checkboxs and set thier properties.
this.createClassObject(mx.controls.CheckBox,"firstBox",1);
firstBox.move(20,20);
firstBox.label = "1 st checkbox";

this.createClassObject(mx.controls.CheckBox,"secondBox",2);
secondBox.move(20,40);
secondBox.label = "2 nd checkbox";

this.createClassObject(mx.controls.CheckBox,"thirdBox",3);
thirdBox.move(20,60);
thirdBox.label = "3 rd checkbox";

//create button and set its properties
this.createClassObject(mx.controls.Button,"myButton",4);
myButton.move(20,80);
myButton.label = "OK";

//set group name ของแต่ละ checkbox
var GROUP_NAME = "groupname";
firstBox.group = GROUP_NAME;
secondBox.group = GROUP_NAME;
thirdBox.group = GROUP_NAME;


var myForm = this;

//create Listener for listen events
var myListener:Object = new Object();

//listener listen event "click"
myListener.click = function(){
var showText:String = "";
var hasCheck:Boolean = false;
//loop throught in myForm
for(var i in myForm){
var current_Item = myForm[i];

//check group ของ item ปัจจุบัน ที่ถูกเลือก ว่า มี grop เป็น "groupname" หรือไม่
if(current_Item.group == GROUP_NAME && current_Item.selected){
showText += current_Item.label+" ";
hasCheck = true;
}
}
if(hasCheck){
myLabel.text = showText+" is checked";
}else{
myLabel.text = "nothing is checked";
}
}

//addEventListener to myButton
myButton.addEventListener("click",myListener);

 

25 กรกฎาคม 2552

จัดการภาษาไทย (UTF-8) ด้วย Multibyte String Functions

จัดการภาษาไทย (UTF-8) ด้วย Multibyte String Functions

UTF-8 ใช้พื้นที่ 3 ไบต์ ในการเก็บข้อมูลภาษาไทย 1 อักขระ ดังนั้นจึงไม่สามารถใช้ฟังก์ชัน เช่น strlen() และ substr() กับภาษาไทยที่เป็น UTF-8 ได้ เช่น

$string = "ที่นี่abcd1234";

echo 'strlen() return: '.strlen($string);

ผลลัพธ์ที่ได้คือ

strlen() return: 26

ตัวเลข 26 มาจาก ภาษาไทย 6×3 = 18, ภาษาอังกฤษ 4 และตัวเลข 4 ตัว

ดังนั้นเพื่อให้นับจำนวนตัวอักขระได้อย่างถูกต้องจะต้องใช้ฟังก์ชัน multibyte string เช่น จากตัวอย่างข้างต้น จะต้องใช้ฟังก์ชัน mb_strlen() แทน strlen()

$string = "ที่นี่abcd1234";

echo 'mb_strlen() return: '.mb_strlen($string, 'utf-8');

ผลลัพธ์ที่ได้คือ:

strlen() return: 14

จะเห็นว่าได้ผลลัพธ์ตามที่ควรจะเป็นคือ ภาษาไทย 6, ภาษาอังกฤษ 4 และ ตัวเลข 4 ตัว

ในทำนองเดียวกัน เมื่อต้องการตัดประโยคให้สั้นลง เช่น ต้องการเลือกมาเพียง 3 ตัวอักษรแรก เราจะไม่สามารถใช้ substr() กับภาษาไทยที่ encode ด้วย UTF-8 ได้

$new_string = substr($string, 0, 3);

echo $new_string;

ผลลัพท์ที่ได้คือ:

เพื่อให้ได้ผลลัพธ์ถูกต้องตามที่ต้องการ เราจึงต้องใช้ mb_substr() แทน substr()

$new_string = mb_substr($string, 0, 3,'utf-8');

echo $new_string;

ผลลัพท์ที่ได้คือ:

ที่

จากตัวอย่างข้างต้น จะเห็นว่าจะต้องระบุพารามิเตอร์ตัวที่ 4 คือ encoding เป็น UTF-8 เข้าไปด้วย เพื่อป้องกันไม่ให้เกิดความผิดพลาดในการใช้งาน เราจึงควรใช้ฟังก์ชัน mb_internal_enconde() กำหนดให้การ encode เป็น UTF-8 ในบรรทัดแรกๆ ของโปรแกรมเลย เช่น

echo mb_internal_encoding();

mb_internal_encoding('utf-8');

echo "<br />";

echo mb_internal_encoding();

ผลลัพธ์ทีได้คือ

ISO-8859-1

UTF-8

นอกจากนี้ เราสามารถใช้ฟังก์ชัน iconv_substr() ในการตัดคำด้วยเช่นกัน

$new_string = iconv_substr($string, 0, 3,'utf-8');

echo $new_string;

ผลลัพท์ที่ได้คือ:

ที่

20 กุมภาพันธ์ 2552

subdomain บน localhost

subdomain คืออะไร? subdomain คือ domain name ย่อยๆของเว็บไซต์หลักอีกทีครับเช่น http://www.goragod.com หรือ http://goragod.com อาจมี subdomain เป็น http://chat.goragod.com ซึ่งหมายถึง url ของ chat หรือ http://blog.goragod.com ซึ่งหมายถึง url ของ blog ครับ โดยทั่วๆไปเรามักกำหนดให้ subdomain เป็นไดเร็คทอรี่หนึ่งๆของเว็บไซต์ เช่นอาจเป็น http://www.goragod.com/chat แต่เพื่อให้เรียกใช้ง่ายขึ้นก็เลยทำเป็น subdomain ในชื่อ http://chat.goragod.com แทน ซึ่งก็จะทำให้ url จดจำได้ง่ายขึ้นครับ และก็ไม่ต้องเสียตั้งจดทะเบียนหลายๆโดเมนด้วย

การสร้าง subdomain บน server สร้างยังไงผมคงไม่พูดถึงแหละครับ แต่ละ server ก็คงมีการสร้างแตกต่างกันออกไป แต่สำหรับผู้ใช้ Appserver สิครับ อยากทดสอบเว็บในรูปของ subdomain จะทำไงดีหนอ ?

ปกติ บน localhost เมื่อติดตั้ง Appserver เราจะได้ server ในชื่อ http://localhost หากเราจะเพิ่ม subdomain เป็น http://blog.localhost โดยที่เมื่อเรียก url นี้แล้วจะไปทำการเปิดเว็บที่ C:/AppServ/www/blog ขึ้นมาทำงาน ทำได้ดังนี้ครับ

1.เปิดไฟล์ C:\windows\system32\drivers\etc\hosts ด้วย text editor ทั่วไปครับ ในนั้นจะพบข้อความประมาณนี้

# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#102.54.94.97 rhino.acme.com # source server
#38.25.63.10 x.acme.com # x client host
127.0.0.1 localhost

 

ให้แทรก

127.0.0.1 blog.localhost


ลงในข้อความบรรทัดต่อจาก

127.0.0.1 localhost


ครับจะได้เป็นประมาณว่า

# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
127.0.0.1 localhost
127.0.0.1 blog.localhost


แล้วก็ save

บรรทัดที่เพิ่มขึ้นมาเป็นการกำหนด host ที่เราต้องการครับ อยากเปลี่ยนเป็นชื่ออื่นก็ตามใจ หรือหากต้องการหลายๆ subdomain ก็เขียนเพิ่มเติมเข้าไปแต่ละบรรทัดครับ

2.ทำให้ Appserver รู้จัก host ที่สร้างขึ้นและรู้ว่าต้องไปที่ไหนครับ

เปิดไฟล์ httpd.conf ของ Appserver ครับไม่รู้ว่าอยู่ที่ไหนดูในเมนูของ Appserver ก็ได้ครับ คลิกที่ Apache Edit the httpd.conf Configuration File เพิ่มเติม

<VirtualHost *:80>
ServerName localhost
DocumentRoot C:/AppServ/www
</VirtualHost>

<VirtualHost *:80>
ServerName blog.localhost
DocumentRoot C:/AppServ/www/blog
</VirtualHost>


ลงบนส่วนต้นๆของไฟล์ก็ได้ครับ

ส่วนแรก เป็นการบอกให้ Appserver รู้จัก localhost ตามปกติแหละครับ
ServerName localhost <== ชื่อ host http://localhost
DocumentRoot C:/AppServ/www <== ไดเร็คทอรี่ที่เก็บไฟล์

ส่วนที่ 2 ก็สำหรับ blog ที่สร้างขึ้นใหม่ครับ

เสร็จแล้ว save แล้วก็ Restart Appserver ใหม่ครับ ทดสอบโดยการพิมพ์ http://localhost จะต้องไปเปิดเพจตามปกติ แต่ถ้าพิมพ์ http://blog.localhost จะต้องไปเปิด blog ครับ เราสามารถเพิ่มเติมได้หลาย subdomain ตามที่กำหนดไว้ในข้อ 1 โดยเพิ่มแต่ละ section ลงไปนะครับ

 

สร้างหลายโดเมน บน localhost (APACHE)

ปกติแล้วเมื่อเราติดตั้ง Appserver เราจะได้โดเมนเนมเป็น http://localhost หากเราต้องการเปลี่ยนเป็นชื่ออื่น เช่น http://project หรือเมื่อต้องการมีหลายๆ โดเมน เพื่อใช้กับหลายโปรเจ็ค จะทำไงดี

ยกตัวอย่างเช่น http://project1 เก็บไฟล์ไว้ที่ ไดเร็คทอรี่ project1 และ http://project2 เก็บไฟล์ไว้ใน project2 การจัดการหรือทดสอบคงง่ายขึ้นเยอะ ยิ่งถ้ามีหลายๆโปรเจ็คด้วยแล้วละก็งานคงง่ายขึ้นเยอะ

หลักการเบื้องต้นก็คล้ายๆกับ การทำ subdomain บน localhost คือ

1.เปิดไฟล์ C:\windows\system32\drivers\etc\hosts ด้วย text editor ทั่วไปครับ แล้วเพิ่ม โดเมนที่ต้องการลงไป เช่น

127.0.0.1    project1
127.0.0.1    project2


แล้วก็ save ครับ

สามารถเพิ่มได้ตามจำนวนโปรเจ็คที่ต้องการ และชื่อที่ต้องการ (รวมถึงสามารถทำ subdomain ได้ด้วยครับ)

2.เปิดไฟล์ httpd.conf ของ Appserver ครับไม่รู้ว่าอยู่ที่ไหนดูในเมนูของ Appserver ก็ได้ครับ คลิกที่ Apache Edit the httpd.conf Configuration File 

กำหนด ServerName ซึ่งปกติจะถูกกำหนดเป็น localhost ให้เป็น IP Address ครับ

ServerName localhost:80

เปลี่ยนเป็น

ServerName 127.0.0.1:80


3.กำหนด ไดเร็คทอรี่ให้กับ domain ที่สร้างขึ้นด้วย VirtualHost ซึ่งก่อนอื่นเราต้องกำหนด NameVirtualHost ก่อนที่จะกำหนด VirtualHost นะครับ

NameVirtualHost *:80

<VirtualHost *:80>

ServerName localhost

DocumentRoot "C:/AppServ/www"

</VirtualHost>

 

<VirtualHost *:80>

ServerName project

DocumentRoot "C:/AppServ/www/project1"

</VirtualHost>

 

<VirtualHost *:80>

ServerName project2

DocumentRoot "C:/AppServ/www/project2"
</VirtualHost>

เราสามารถแทรกโค้ดนี้ไว้ตั้งแต่บรรทัดแรกของไฟล์ที่เปิดขึ้นมาได้เลยครับ

ความสำคัญของการกำหนดไดเร็คทอรี่ คือ ไดเร็คทอรี่ที่ต้องการต้องอยู่ภายใต้ DocumentRoot ของ Appserver เช่นปกติ มันจะถูกกำหนดไว้ที่ C:/AppServ/www เราก็ต้องกำหนด sub directory ภายใต้โฟลเดอร์นี้เท่านั้นเช่น C:/AppServ/www/project1


4.หลังจากนั้นก็ทำการสร้างไดเร็คทอรี่ที่จะใช้เก็บไฟล์ต่างๆ แล้วก็ Restart Apache ใหม่เป็นอันเสร็จครับ

ทีนี้การทดสอบก็ง่ายขึ้นแล้วครับ

 

ปัญหาการส่งเมล์ แล้วเป็นภาษาขอม UTF8

หากเว็บไซต์ของท่านทำการส่งเมล์ ด้วย UTF-8 อาจพบกับปัญหาภาษาขอม อันเนื่องมาจากภาษาหลักของเว็บที่อ่าน อีเมล์ก็ได้ครับ ยกตัวอย่างการส่งเมล์ที่เป็น UTF-8 ไปยัง hotmail มักเกิดเป็น ภาษาขอมเสมอ

แต่กับเจ้าอื่นอย่าง yahoo ไม่เป็นปัญหาครับ มันสามารถอ่าน email ที่เป็นภาษาไทยได้ถูกต้อง แต่โดยปกติแล้ว ปัญหานี้จะเกิดกับหน้า Inbox เท่านั้น ในส่วนของหน้า อ่านอีเมล์ มักจะไม่เป็นปัญหา แต่ถ้าในหน้าอ่านอีเมล์ของคุณก็อ่านไม่ออกเช่นกันให้ลองส่งเมล์เป็น HTML ครับ

ปัญหานี้ ถ้าแก้ที่ปลายเหตุ ก็คงต้องอาศัยการเปลี่ยน encoding ของ Browser เอาเอง เปลี่ยนให้เป็น UTF-8 ซะมันก็อ่านออก สำหรับ user บางคนที่ไม่รู้วิธีนี้ ก็อาจใช้วิธี มีข้อความภาษาอังกฤษ แจ้งให้ user ทำการเปลี่ยนภาษา

if you cannot read this email, please change your browser encoding to UTF-8

อันนี้เป็นการแก้ที่ปลายเหตุครับ

ส่วนถ้าจะแก้กันที่ต้นเหตุ ก็คงต้องไปเปลี่ยนการเข้ารหัสเมล์ ให้เป็น Ansi แทน UTF-8 ด้วยการใช้ ฟังก์ชั่นแปลงให้เป็น TIS-620 ก่อนส่ง

mail( $mailto , iconv( 'UTF-8' , 'TIS-620' , $subject ) , iconv( 'UTF-8' , 'TIS-620' , $msg ) , $Headers );


แปลงทั้ง 2 ส่วนนะครับ ทั้ง subject และ msg โดยใช้ร่วมกับเมล์แบบ HTML ที่ผมกล่าวถึงข้างบน นอกจากนี้ วิธีเหล่านี้จะทำให้ email ของคุณหลุดจาก ถังขยะ ได้อีกด้วย

class Timer สำหรับการทำ Bench Mark

class Timer เป็น class สำหรับอ่านค่าเวลาเป็น ไมโครวินาที เพื่อการตรวจสอบหรือการทำ Bench Mark โค้ด PHP ด้วยฟังก์ชั่น getMicrotime()

<?php
class Timer{
    private $elapsedTime;

   
// start timer
    public function start()
    {
        if( !$this->elapsedTime = $this->getMicrotime() )
        {
            throw new Exception( 'Error obtaining start time!' );
        };
    }

   
// stop timer
    public function stop()
    {
        if( !$this->elapsedTime = round( $this->getMicrotime() - $this->elapsedTime , 10 ) )
        {
            throw new Exception( 'Error obtaining stop time!' );
        };
        return $this->elapsedTime;
    }

   
// define private 'getMicrotime()' method
    private function getMicrotime()
    {
        list( $useg , $seg ) = explode( ' ' , microtime() );
        return ( (float)$useg + (float)$seg );
    }
};
?>


ตัวอย่างการใช้งาน

<?php
$val = range( '0' , '1000' );
// แอเรย์ที่กำหนด

$a = '';
$bm = new Timer;
// เรียกใช้งาน class
$bm->start();
// เริ่มต้นจับเวลา
// ประมวลผลการทดสอบ
for( $i = 0 ; $i < count($val) ; $i++ )
{
    $a .= $val[$i];
}
echo $bm->stop();
// แสดงเวลาที่ใช้ไป
?>