มาทำ PhpDoc ในลักษณะเดียวกับ JavaDoc กัน ?
Posted by up1, Feb 17 2010, 01:22 AM in php
เนื่องจากผมชอบ JavaDoc ของภาษา Java อยู่แล้ว ดังนั้นเมื่อมีโอกาสมาคึกษา php ก็ลองตั้งคำถามขึ้นมาว่า
เมื่อลองไปค้นหาดูพบว่ามี library ที่น่าสนใจคือ PHPDoctor
ใน Web ของ PHPDoctor บอกว่า
ดังนั้น จึงลองใช้งาน PHPDoctor ดูว่าเป็นยังไง
Software ที่ใช้งาน คือ
- Apache Web Server 2.x
- PHP 5.x
- PHPDoctor
การใช้งาน
1. ทำการติดตั้งและ config ทั้ง Apache Web Server และ PHP
2. ทำการ Download PHPDoctor และทำการ extract ไว้สักที่ เช่น ผมนำไป extract ไว้ที่ c:\mytest\
3. สามารถทำการ run PHPDoctor ดังนี้
- กำหนดให้สามารถ run php จาก command line ได้ด้วยการกำหนด path ดังนี้
set path=.;%php_home%;%path%
- ทำการ run PHPDoctor ดังนี้
>cd c:\mytest
>php php phpdoc.php default.ini
ผลการทำงาน
- จะสร้าง folder c:\mytest\apidocs ขึ้นมา และสามารถเปิด file index.html ใน web browser จะเห็นสิ่งที่ผมต้องการ คือ PHPDoc ในรูปแบบเดียวกับ JavaDoc นั่นเอง
แต่สิ่งที่ผมต้องการ คือ run ใน project ที่ผมต้องการ ดังนั้น ต้องแก้ไขข้อมูลใน file default.ini ดังนี้
source_path = "C:\myproject\"
default_package = "MyPackage"
...
อธิบาย
กำหนด project path ไปที่ folder C:\myproject\
กำหนด default package ของ project
ตัวอย่าง file php ที่เขียนไว้ใน folder C:\myproject\ ดังนี้
/**
* Hello Class
* @author UP1
*/
class Hello {
/**
* Constructor
*/
function Hello() {
}
/**
* Method for retrive data by id
* @param int id
*/
function get($id) {
}
/**
* Method for add data
* @param String name
* @param int status
*/
function add($name, $status) {
}
}
?>
ทำการ run คำสั่งดังนี้
>cd c:\mytest
>php php phpdoc.php default.ini
หลังจาก run คำสั่งแล้วไปที่ folder C:\myproject\apidocs จะมีการสร้าง html ดังรูป
เพียงเท่านี้ก็สามารถสร้าง PHPDoc ในรูปแบบ JavaDoc ได้แล้วครับ
CodeIgniter :: การใช้งาน XML-RPC Client
Posted by up1, Feb 12 2010, 05:38 PM in CodeIgniter
วันนี้ต้องเรียกใช้ services ผ่าน XML-RPC ดังนั้น จึงมาดูว่าใน CodeIgniter มีอะไรให้มาบ้าง ซึ่งก็พบว่ามันเตรียม libraries ของ XML-RPC ไว้ให้แล้ว ดังนั้นจึงง่ายเลย เพียงแค่ดูวิะีการใช้งานต่างๆ ที่นี่ XML-RPC Library
การใช้งาน XML-RPC Client เบื้องต้น เป็นดังนี้
1. ก่อนใช้งานจะต้องทำการ load libraries ขึ้นมาก่อน โดยสามารถทำได้ 2 วิธีเช่นเดิม คือ
- กำหนดใน file /system/application/config/autoload.php ดังนี้
- load ก่อนการใช้งาน
2. ส่ง request ไปยัง XML-RPC Service มีขั้นตอนดังนี้
- กำหนด url ของ service และ port
- กำหนด method ของ XML-RPx Service
- กำหนด Request ต่างๆ ที่จะส่งไปยัง XML-RPC Service
$this->xmlrpc->request($request);
- ส่ง request ไปยัง XML-RPC Service
echo $this->xmlrpc->display_error();
} else {
echo $this->xmlrpc->display_response();
}
เพียงเท่านี้ก็สามารถใช้งาน XML-RPC Client ใน CodeIgniter ได้แล้วครับ
ทำความเข้าใจกับแนวคิดของ Scribe
Posted by up1, Feb 11 2010, 04:03 PM in Web Technologies
ตอนนี้กำลังดูระบบ Logging ของระบบ โดยระบบที่ต้องการคือ การนำ log file ต่างๆ ที่มีในระบบงาน ซึ่งมีหลากหลายที่เหลือเกิน มารวมกันไว้ที่ตรงกลาง เพื่อให้สามารถดูและวิเคราะห์ข้อมูลต่างๆ จาก log file ให้ง่ายยิ่งขึ้น [ แต่ก้ยังคงการเก้บ log file ไว้ แต่กำหนด format มาตรฐานไว้ให้ ]
โดยมีหลากหลายแนวคิด และหนึ่งในนั้นคือ แนวคิดจาก Facebook คือ Scribe เป็นแนวคิดที่น่าศึกษาเช่นกัน โดยแนวทางหรือเป้าหมายของ scribe คือ
- ต้องการสร้าง central log ขึ้นมา
- ทำงานแบบ real time
- รองรับจำนวน servers มากๆ ได้
- มีความเสถียร
- สามารถทำงานได้ ถ้า central server ตายหรือไม่ทำงาน
โครงสร้างระบบของ Scribe นั้นทำงานดังนี้
1. ทั้ง server และ client นั้นจะมี Scribe Server ทำงานอยู่เสมอ แต่จะมีตัวที่ทำหน้าที่เป็น central ( 1 server หรือมากกว่านั้นก็ได้ ) โดยกำหนดผ่าน configuration file
2. แต่ละ server ขอเรียกว่า node โดยแต่ละ node จะมี Scribe Server ทำงาน โดยจะทำการรวม log message ต่างๆ จากระบบของตัวเอง และส่งไปยัง Central Node
3. ในกรณีที่ Central Node หยุดทำงานไป แล้ว ตัว Node อื่นๆ ที่ไม่ใช่ Central Node จะเก็บข้อมูลเป็น file ไว้ และเมื่อติดต่อกับ Central Node ได้แล้ว จึงจะส่ง log message ที่เก็บไว้ไปยัง Central Node
4. โครงสร้างของ log message ส่งกันไปมานั้นประกอบไปด้วย category และ message
- category เก้บข้อมูลต่างๆ ที่จำเป็นในการส่ง message เช่น node ของ central node เป็นต้น
- message เก็บข้อมูลของ log
5. Scribe พัฒนาด้วยภาษา C++
6. ปัจจุบัน Scribe ถูกใช้งานใน facebook โดยมี servers ในหลักพัน
เมื่อศึกษามาได้นิดหน่อย พอเห็นแนวคิดคร่าวๆ แล้ว ต่อไปก็คงนำมาลองทำ POC เล่นๆ ต่อไป
สร้าง Virtual Host ใน Apache WebServer
Posted by up1, Jan 21 2010, 04:51 PM in Apache WebServer
การ config virtual host ใน apache webserver สามารถทำได้ดังนี้
1. config/httpd.conf ทำการ include file conf/extra/httpd-vhosts.conf ดังนี้
2. ทำการ config ใน file conf/extra/httpd-vhosts.conf เพื่อเพิ่ม virtual host ที่เราต้องการสร้าง ดังนี้
ServerAdmin admin@xx.com
DocumentRoot "C:/AppServ/www/my"
ServerName my.xxx.com
ErrorLog "logs/my-error.log"
CustomLog "logs/my-access.log" common
</VirtualHost>
<Directory "C:/AppServ/www/my">
Order Deny,Allow
Allow from all
</Directory>
คำอธิบาย
DocumentRoot คือ folder root ของ project
ServerName คือ ชื่อของ virtual ที่เราต้องการสร้าง
ErrorLogม CustomLog คือ log files ต่างๆ ซึ่งจะแยกตาม virtual host
ในการใช้งานในเครื่อง dev บน windows แบบง่ายๆ ก็ไป config ใน file hosts ได้เลย เช่น
ถ้าบน linux ก็ไปกำหนดใน file /etc/hosts นะครับ
----- เพิ่มเติม ------
วันนี้เจอปัญหาบน server คือไม่สามารถ access ได้โดยตรง ซึ่งพบว่า ใน file httpd.conf นั้นไม่ได้ allow ในการ access directory ไว้ ดังนั้นวิธีการแก้ไขคือ
- ใน file conf/httpd.conf นั้นกำหนด AllowOverride All
หรือ
- ใน file conf/extra/httpd-vhosts.conf กำหนด AllowOverride All ในแต่ละ virtual host ที่กำหนด
CodeIgniter :: มาทำความรู้จัก Active Record Class กัน
Posted by up1, Jan 19 2010, 12:14 AM in CodeIgniter
มาทำความรู้จัก Active Record Class กัน
ที่มา :: Active Record Class
ในส่วน ของ model class ของ CodeIgniter นั้นสามารถ mapping table ใน database เข้าได้ โดยใช้แนวคิดของ Active Record Pattern หรืออาจจะเรียกว่า CodeIgniter นั้นมี OR-Mapping มาให้ด้วย ซึ่งทำให้การจัดการข้อมูลใน database ง่ายและสะดวกมากยิ่งขึ้น รวมทั้งยังไม่ผูกติดกับ database ด้วย
สิ่งที่เตรียมไว้ใน Active Record Class มีดังนี้
- Insert Data
- Update Data
- Delete Data
- Method Chaining
- Active Record Caching
ปล. ในบทความนี้ใช้ MySQL นะครับ
- Select Data ดึงข้อมูล
จะทำการสร้าง select statement มาให้เอง ผ่านการใช้ method/function เหล่านี้
:: $this->db->get( $table_name ); ::
เป็นการดึงข้อมูลทั้งหมด จาก table ที่กำหนด
ตัวอย่างการใช้งาน
$query = $this->db->get( 'blog' );
sql statement ที่สร้างขึ้นมาคือ select * from blog
:: $this->db->get( $table_name, $limit, $offset ); ::
เป็นการดึงข้อมูลแบบ paging จาก table ที่กำหนด
ตัวอย่างการใช้งาน
$query = $this->db->get( 'blog', 10, 20 );
sql statement ที่สร้างขึ้นมาคือ select * from blog LIMIT 20, 10
:: $this->db->get_where( $table_name, array(), $limit, $offset ); ::
เป็นการดึงข้อมูลด้วยแบบ paging จาก table ที่กำหนด
ตัวอย่างการใช้งาน
$query = $this->db->get_where('blog', array('id' => 1), 10, 20);
sql statement ที่สร้างขึ้นมาคือ
select * from blog where id = 1 LIMIT 20, 10
:: $this->db->select(); ::
สามารถเลือก columns ที่ต้องการได้
ตัวอย่างการใช้งาน
this->db->select('title, content, date');
$query = $this->db->get('blog);
sql statement ที่สร้างขึ้นมาคือ
select title, content, date from blog
:: $this->db->from(); ::
สร้าง from ใน sql statement ซึ่งจะต้องใช้งานร่วมกับ $this->db->get()
ตัวอย่างการใช้งาน
$this->db->select('title, content, date');
$this->db->from('blog');
$query = $this->db->get();
sql statement ที่สร้างขึ้นมาคือ
select title, content, date from blog
...... พักก่อน .... มันเยอะจริงๆ
Link :: Web Security: Are You Part Of The Problem?
Posted by up1, Jan 18 2010, 03:26 AM in Web TechnologiesCodeIgniter :: เริ่มต้นเกี่ยวกับ Model
Posted by up1, Jan 18 2010, 02:17 AM in CodeIgniter
ที่มา :: http://codeigniter.com/user_guide/general/models.html
Model คืออะไร
- คือ M ใน MVC model
- ใน CodeIgniter คือ PHP classes ที่ถูกออกแบบให้ทำงานกับข้อมูลที่อยู่ใน database
- ในส่วนของ Model ของ CodeIgniter นั้นจะใช้ Active Record Pattern มาช่วยเรื่องการจัดการข้อมูลต่างๆ ใน database ด้วยการเขียน script สั้นๆ
ตัวอย่างเช่น ระบบ blog ใน Model ประกอบไปด้วย functions ต่างๆ เช่น insert, update, get ข้อมูลของ
blog จาก database ดังนี้
var $title = '';
var $content = '';
var $date = '';
function Blogmodel()
{
// Call the Model constructor
parent::Model();
}
function get_last_ten_entries()
{
$query = $this->db->get('entries', 10);
return $query->result();
}
function insert_entry()
{
$this->title = $_POST['title']; // please read the below note
$this->content = $_POST['content'];
$this->date = time();
$this->db->insert('entries', $this);
}
function update_entry()
{
$this->title = $_POST['title'];
$this->content = $_POST['content'];
$this->date = time();
$this->db->update('entries', $this, array('id' => $_POST['id']));
}
}
โครงสร้างของ Model
- Model classes จะถูกเก็บไว้ใน folder /system/application/models และสามารถมี folder ย่อยๆ ได้
- Model จะมีหน้าตาดังนี้
function Model_name()
{
parent::Model();
}
}
- ชื่อของ Model จะต้องขึ้นต้นด้วยอักษรตัวใหญ่ และต้อง extends จาก Model class หรือ sub-class ของ Model class
ตัวอย่าง Blog_model
class Blog_model extends Model {
function Blog_model()
{
parent::Model();
}
}
การใช้งาน Model
- manual loading คือ จะทำการ load เมื่อจะใช้งาน ใน Controller class ดังนี้
$this->Model_name->function();
หรือถ้าต้องการใช้ชื่อ object อื่น ด้วยการ alias ดังนี้
$this->fubar->function();
ตัวอย่างการใช้งานของ Manual Loading ดังนี้
function blog()
{
$this->load->model('Blog');
$data['query'] = $this->Blog->get_last_ten_entries();
$this->load->view('blog', $data);
}
}
- auto loading ทำการ config ไว้ใน file /system/application/config/autoload.php
การติดต่อไปยัง Database
- ทำการ config database parameters ได้ใน file /system/application/config/database.php
- เมื่อทำการ load model ขึ้นมานั้น ระบบจะยังไม่ติดต่อไปยัง database ดังนั้น ถ้าต้องการให้ model ติดต่อไปยัง database สามารถทำได้ดังนี้
- ถ้าต้องการให้ติดต่อ database แบบ automatic สามารถทำการ config ใน file /system/application/config/autoload.php และเพิ่มการ load "database" ในส่วน library ดังนี้
เพิ่มเติมเกี่ยวกับการจัดการกับ Database
http://codeigniter.com/user_guide/database/index.html
CodeIgniter :: การทำ Dynamic Configuration
Posted by up1, Jan 15 2010, 06:25 PM in CodeIgniter
CodeIgniter :: Dynamic Configuration
ที่มา ::
Setting up Codeigniter with dynamic configuration variables fit for development teams
Problem
ในการพัฒนาระบบด้วย CodeIgniter นั้นจะมี environment ประมาณ 2-3 ตัวคือ
- developer
- testing/statging
- production
ดังนั้นเราจะทำอย่างไรกันดี ???
Solution
สิ่งที่จะต้องทำคือ แยกการ configuration ตาม environment ที่กำหนด เช่น development, test, production เป็นต้น โดยค่า configuration ที่ต้องเปลี่ยนไปตาม environment คือ
- การปรับแต่ง database ใน file /system/application/config/database.php
หลังจากได้เป้าหมายที่จะทำแล้ว ก็มาเริ่มกันเลย
1. ทำการกำหนดค่าคงที่ ( Constants) ของชนิด environement ที่มีในระบบใน file /system/application/config/constants.php ดังนี้
define('TEST_SERVER_NAME', 'http://test.domain.com');
define('STAGING_SERVER_NAME', 'http://statging.domain.com');
define('PRODUCTION_SERVER_NAME', 'http://live.domain.com');
2. จัดการเกี่ยวกับ $config['base_url'] ใน file /system/application/config/config.php ตามแต่ละ environment
โดยดึงค่าจาก server name มันใช้ในการตัดสินใจ
case DEVELOPMENT_SERVER_NAME:
$config['base_url'] = "http://localhost/";
break;
case TEST_SERVER_NAME:
$config['base_url'] = "http://test.domain.com";
break;
case STAGING_SERVER_NAME:
$config['base_url'] = "http://statging.domain.com";
break;
default:
$config['base_url'] = "http://live.domain.com";
break;
}
3. จัดการเกี่ยวกับ database ใน file /system/application/config/database.php ตามแต่ละ environment ได้ดังนี้
3.1 จัดการกับ active group ของ database configuration ได้ดังนี้
case DEVELOPMENT_SERVER_NAME:
$active_group = "local";
break;
case TEST_SERVER_NAME:
$config['base_url'] = "test";
break;
case STAGING_SERVER_NAME:
$active_group = "staging";
break;
default:
$active_group = "production";
break;
}
และกำหนด configuration ของแต่ละ environment ดังนี้
$db['local']['username'] = "DEV_USERNAME";
$db['local']['password'] = "DEV_PASSWORD";
$db['local']['database'] = "DEV_DATABASENAME";
$db['local']['dbdriver'] = "mysql";
$db['test']['hostname'] = "localhost";
$db['test']['username'] = "TEST_USERNAME";
$db['test']['password'] = "TEST_PASSWORD";
$db['test']['database'] = "TEST_DATABASENAME";
$db['test']['dbdriver'] = "mysql";
$db['staging]['hostname'] = "localhost";
$db['staging']['username'] = "STAGING_USERNAME";
$db['staging']['password'] = "STAGING_PASSWORD";
$db['staging']['database'] = "STAGING_DATABASENAME";
$db['staging']['dbdriver'] = "mysql";
$db['production']['hostname'] = "localhost";
$db['production']['username'] = "PRODUCTION_USERNAME";
$db['production']['password'] = "PRODUCTION_PASSWORD";
$db['production']['database'] = "PRODUCTION_DATABASENAME";
$db['production']['dbdriver'] = "mysql";
เพียงเท่านี้ก็สามารถทำ Dynamic Configuration ใน CodeIgniter ได้แล้วครับ
CodeIgniter :: การสร้าง Core System Classes
Posted by up1, Jan 14 2010, 10:04 PM in CodeIgniter
จาก entry นี้ CodeIgniter :: ใช้งาน Profiling ในระบบแบบง่ายๆ ทำให้ผมยังงงว่าทำไมต้องตั้งชื่อขึ่นต้นด้วย MY_ ?? และไม่ต้องทำการ load library ที่เขียนขึ้นมาด้วย ???
ดังนั้น จึงต้องไปหาความรู้เพิ่มเติมจาก User Guilde ของ CodeIgniter จึงเห็นหัวข้อนี้ Creating Core System Classes ซึ่งตรงกับความต้องการมาก ดังนั้นเรามาศึกาากันว่าเป็นยังไงกันบ้าง
เริ่มต้นกันเลย ...
เมื่อ CodeIgniter ทำงานนั้นจะทำการ load classes ต่างๆ ขึ้นมามากมายแบบอัตโนมัติ [ Class Loader ใน java ] โดยจะมี core system classes และ classes ที่ผู้พัฒนาทำการ extends มาจาก core system classes
มาดูว่า Core System Classes ประกอบไปด้วยอะไรบ้าง
- Core System Classes คือ classes ที่ทาง CodeIgniter เตรียมไว้ให้ใช้งานแล้ว โดยจะเก็บไว้ใน folder
/system/libraries ดังนี้
- Benchmark
- Config
- Controller
- Exceptions
- Hooks
- Input
- Language
- Loader
- Log
- Output
- Router
- URI
CodeIgniter เปิดให้เราสร้าง classes ไป replace หรือแทนที่ System Core Classes ได้ โดยทำดังนี้
- สร้าง file php ใน folder /system/application/libraries/
- php file ที่สร้างขึ้นมานั้น จะต้องมี class ที่มีชื่อขึ้นต้นด้วยคำว่า CI ดังตัวอย่าง
class CI_Input {
}
CodeIgniter ก็เปิดให้เราสร้าง SubClass จาก Core Classes เช่นกัน เพื่อเพิ่มความสามารถบางอย่างเข้าไป จะเรียกว่า Extending classes ซึ่งในการ implements จะต้องทำดังนี้
- class ที่สร้างขึ้นจะต้อง extends System Core Classes
- ชื่อของ class และ file ที่สร้างขึ้นนั้นจะต้องขึ้นต้นด้วย MY_ โดยค่านี้จะกำหนดไว้ใน file /system/application/config/config.php ดังนี้
โดยค่าของ $config['subclass_prefix'] ไม่ควรเป็น CI_ เนื่องจากเป็น prefix ของ Core System Classes ซึ่งจะทำให้สับสนได้
ตัวอย่างเช่น การ extens มาจาก Input class จะเป็นดังนี้
class MY_Input extends CI_Input {
}
หรือจากตัวอย่างในการ extends Controller มาก็เช่นกัน ทำให้ CodeIgniter นั้นมีความยึดหยุ่นมากครับ
CodeIgniter :: ใช้งาน Profiling ในระบบแบบง่ายๆ
Posted by up1, Jan 14 2010, 06:30 PM in CodeIgniter
Problem
หลังจากที่ดู Profiling ของ CodeIgniter แล้วพบว่ามันใช้งานง่ายมาก เพียงแต่ไปปิดการใช้งานใน method ของ controller ดังนี้
โดยจะแสดงข้อมูลต่างๆ เช่น
- parameter ที่ส่งมาทั้ง POST และ GET
- เวลาในการทำงานทั้งหมด
- เวลาการดึงข้อมูลจาก model, database รวมทั้ง sql query ที่ใช้ด้วย
แต่ปัญหาที่เจอคือ ต้องนำ code จากข้างต้นใส่ในทุกๆ method ที่ต้องการจะดู profiling ซึ่งไม่มีดีเลย ??? แล้วจะทำอย่างไรดี ???
Solution
วิธีการแก้ปัญหา คือ ใช้ความสามารถของ OOP ในเรื่องของ inheritance มาช่วย และเพิ่มการ config เพื่อเปิดปิดได้ตามต้องการ ดังนี้
1. เพิ่มการ config ใน file /system/application/config/config.php ดังนี้
โดยมีค่าเป็น TRUE หรือ FALSE
2. สร้าง Base Class ของ Controller ขึ้นมาชื่อว่า MY_Controller.php เก้บไว้ที่ folder /system/application/libraries/ ดังนี้
class MY_Controller extends Controller {
function __construct() {
parent::__construct();
$this->output->enable_profiler($this->config->item('debug'));
}
}
?>
คำอธิบาย
ใน constructor จะทำการเปิดหรือปิดการแสดง profiling ตามค่าที่กำหนดไว้ใน config.php
3. การใช้งาน ทำได้ด้วยการที่ทุกๆ controller จะต้อง extends My_Controller เสมอ ดังนี้
...
...
}
เพียงเท่านี้ก็สามารถดูและจัดการ profiling แบบง่ายๆ ของการทำงานในระบบได้แล้ว











on ได้เวลาของ Business Process Management ( BPM )