0

Element, Component trong CakePHP

Posted by tungnd on Jul 2, 2009 in CakePHP, Khái niệm

Element :

trong CakePHP, Element được sử dụng khá giống với “include”. Nó dùng để lưu trữ 1 đoạn code được dùng đi dùng lại nhiều lần, thay vì ta phải copy/paste  đoạn code đó qua các trang thì ta chỉ việc viết 1 câu lệnh ngắn gọn :

<?php echo $this->renderElement('<elementName>');?>

chỉ như cần 1 đoạn code như vậy ta có thể thay thế việc vất vả copy rồi paste liên tục, mất thời gian lại khiến code của bạn nhìn rất tối, khó chỉnh sửa sau này !

VD cụ thể như sau :

trong controller của bạn, bạn thực hiện thêm công việc kiểm tra xem element có được gọi hay ko :

function index() {
            $posts = $this->Session->setFlash('hello world');
            if (isset($this->params['requested']))
            {
                return $posts;
            }
        }

Nếu Element được gọi, giá trị giả về sẽ là dòng text ‘hello world’. (bạn cũng có thể thay thế bằng những câu lệnh theo ý của bạn như :  find(), read() …..)

tiếp theo, trong app\views\element\ chúng ta tạo 1 file php, tên tùy ý bạn đặt. Ở ví dụ này tôi đặt tên là test.php :

<?php
$posts = $this->requestAction('posts/index');
echo $posts;

?>

Trong file này, câu lệnh  $this->requestAction(’posts/index’) là bắt buộc phải có,đây là câu lệnh lấy giá trị được trả về từ controler trên.

Cuối cùng là công việc cho hiển thị element ta vừa tạo được ra trang index, đó là câu lệnh thay thế việc copy/paste mà tôi đã nói ở trên :

<?php echo $this->renderElement('posts');?>

Nếu bạn vẫn cảm thấy khó hiểu và không biết làm thế nào để hiển thị các bản ghi trong CSDL của mình ra thay cho đoạn text ‘hello world’ thì bạn có thể tham khảo thêm bài viết của hoanbn : http://i-php.net/2008/11/s%E1%BB%AD-d%E1%BB%A5ng-element-trong-cakephp/

Component :

Component là nơi thực hiện các công việc phức tạp như upload…, nó cũng được dùng đi dung lại nhiều lần ! thay vì việc copy/paste lại công việc thực thi đó ta chỉ cần truyền dữ vào cho Component từ controller. Sau đó dữ liệu sẽ được đưa đến Component xử lý .

VD :

trong app\views\posts\ ta tạo file index.ctp (cakephp 1.2) hay index.thtml (cakePHP 1.1)

<h1>hello</h1>
<?php
    echo $form -> create('Post',array('action'=>'index'));
    echo $form -> input('text');
    echo $form -> end('save');
?>

trong app\controller\components\ ta tạo 1 file php tên j` j` đó chẳng hạn như : test.php

<?php
class TestComponent extends Object	{

	function startup(&$controller)	{
		// This method takes a reference to the controller which is loading it.
        // Perform controller initialization here.

	}
	function hello($text)	{
		return $text;
	}
}
?>

cuối cung, trong post controller ta chỉ việc truyền dữ liệu text vào để component xử lý :

function index() {
            if (!empty($this->data))
            {
                if($this->test->hello($this->data['Post']['text']))
                {
                    $this->Session->setFlash($this->test->hello($this->data['Post']['text']));
                    $this->redirect (array('action' => 'index'));
                }

            }
        }

chú ý : test là tên file component bạn tạo ở trên, hello là tên function thực thi mệnh lệnh, còn

$this->data['Post']['text'] là dữ liệu bạn nhập vào !

bây giờ bạn có thể xem kết quả mình vừa tạo ra….!

hi vọng là chạy được :D


 
0

Hướng dẫn làm web cơ bản với CakePHP

Posted by tungnd on Jul 1, 2009 in CakePHP

CakePHP là 1 trong số nhiều framework dành cho PHP. Ở đây, chúng tôi chọn CakePHP vì đó là 1 công cụ thân thiệt, dẽ sử dụng, nhanh, mạnh và rất linh hoạt. Để có thể học và sử dụng thành thạo 1 cách nhanh chóng bạn phải biết những kiến thức cơ bản về HTML và PHP.

Bây giờ ta bắt đầu thôi nhỉ, đầu tiên bạn phải download CakePHP về : Download

Cài Đặt :

Để có thể sử dụng  framework vừa download về, máy tính của bạn phải đáp ứng thêm 1 số yêu cầu sau :

- Một HTTP server (Apache, ISS). Ở đây tôi sử dụng Xampp vì nó khá phổ thông và còn kèm thêm cho bạn MySQL.

-Database : Cake hỗ trợ các hệ cơ sở dữ liệu sau : MySQL, PostgreSQL.

- Chú ý thêm là CakePHP chỉ support trong PHP ver4 trở lên.

Sau khi download thành công và đáp ứng đủ các yêu cầu trên thì bạn có thể giải nén tập tin (.zip) vừa download về và sao chép vào thư mục chứa Apache server (vd :  C:\AppServ\www\CakePHP).

Cấu Hình :

Đầu tiên, để Cake và DataBase hoạt động cùng nhau, bạn phải cấu hình lại file database.php :

-Mở file database.php.default tại /CakePHP/app/config/database.php.default

-Điều chỉnh lại các thông số liên quan :

var $default = array( 'driver' => 'mysql', 'connect' => 'mysql_connect', 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'project_name', 'prefix' => '' );

Với user, password, database lần lượt là: tên user, password và database ở trong MySql. Quy ước về đặt tên bảng trong database

  • Tên bảng trong cake nên ở dạng tiếng Anh số nhiều (vd: users, customers, students, … )
  • Bảng phải có primary key tên là ‘id’
  • Nếu có sử dụng quan hệ trong các bảng vd: user_id (user không có s và dấu _ cộng id)

-Tiếp đến bạn thay đổi tên file thành database.php -Cuối cùng, mở file core.php tại /CakePHP/app/config/core.php. Thay đổi security theo ý của bạn : Configure::write(’Security.salt’, ‘8rnc4ry438tc34jchcyu34cu5cbn4u’);  => Configure::write(’Security.salt’, ‘<tùy bạn>’);

Hướng dẫn sử dụng :

Để kiểm tra xem khâu cài đặt có hoàn thành hay không, bạn mở đường dẫn :  http://localhost/CakePHP/ Ở đây tôi không tiện chụp ảnh lại nên bạn chịu khó nhìn giao diện, nếu không thấy đỏ lòm hay vàng khè j` thì cứ yên tâm là đã ok ! Yên tâm hơn nữa thì hãy tìm 2 dòng Your database configuration file is present.  và Cake is able to connect to the database. Nếu tìm tháy thì cùng tôi bắt đầu tiếp. Còn nếu có 2 màu đặc biệt đấy thì bạn nên xem lại các bước đã làm ! Tạo bảng Cơ Sở Dữ Liệu : tạo bảng customers như sau :

id: INT, AUTO_INCREMENT, PRIMARY KEY
name: NVARCHAR
age: INT
address: VARCHAR

Code :

Quên mất, bạn đã biết mô hình MVC (Models-Controller-View) là j` chưa nhỉ, nếu chưa thì bạn cứ hiểu nôm na như sau : Mô hình MVC trong lập trình hướng đối tượng hoạt động theo 3 tầng, tầng trên cùng là View, tiếp theo là Controller và tầng dưới cùng là Models.

- Models : dùng để giao tiếp với Cơ Sở Dữ Liệu của bạn.

-Controller : dùng để tạo các function để viết các yêu cầu theo ý muốn, lấy dữ liệu từ Cơ Sở Dữ Liệu thông qua Models và hiển thị ra tại View.

-View : là nơi thể hiện dữ liệu đã được xử, hoặc từ đây ta có thể nhập dữ liệu mới, sau đó Controller sẽ lấy dự liệu từ View chuyển về cho Models để lưu vào Cơ Sở Dữ Liệu. Nói nhanh cho vuông thì View cũng có thể coi là 1 trang template.

*Để hiểu thêm về mô hình MVC thì bạn hãy search google và tìm hiểu thêm, còn bây giờ tôi phải vào mục chính là làm việc với CakePHP.

Chúng ta bắt đầu làm việc theo thứ tự 3 tầng MVC từ thấp đến cao.

Đâu tiên là Model : mở trình soạn, tạo file customer.php tại \CakePHP\app\models\customer.php

<?php
class Customer extends AppModel
{
   var $name = 'Customer';
}
?>

Tiếp đến là Controller : tạo file custermers_controller.php tại \CakePHP\app\controllers\custermers_controleller.php

<?php
class CustomersController extends AppController
{
    var $name = 'Customers';
    function index()
    {
        $this->set('customers', $this->Customer->findAll());
    }
}
?>

Cuối cùng là View : file index.ctp tại \CakePHP\app\view\custermers\index.ctp

<h1>Customer Manager</h1>
   <table>
       <tr>
           <th>Id</th>
           <th>Name</th>
           <th>Age</th>
           <th>Address</th>
       </tr>
       <?php foreach ($customers as $cust): ?>
       <tr>
           <td><?php echo $cust['Customer']['id']; ?></td>
           <td>
               <?php echo $html->link($cust['Customer']['name'], '/customers/view/'.$cust['Customer']['id']);?>
               <?php echo $html->link('Delete',"/customers/delete/{$cust['Customer']['id']}",null,'Are you sure?')?>
               <?php echo $html->link('Edit', '/customers/edit/'.$cust['Customer']['id']);?>
           </td>
           </td>
           <td><?php echo $cust['Customer']['age']; ?></td>
           <td><?php echo $cust['Customer']['address']; ?></td>
       </tr>
       <?php endforeach; ?>
   </table>

Có vẻ ổn rồi, bạn hãy thử mở đường dẫn http://localhost/CakePHP/custermers để xem kết quả của chương trình bạn vừa viết. Và sau đó tìm hiểu thêm nhiều tính năng nữa của Cake nhé, khi đó bạn sẽ rất “sướng” cho mà xem.

Còn tôi thì phải đi làm tách trà đá cái đã !







Tags: , ,

 
2

MỘT NGÀY PHẢI KHÁC MỌI NGÀY

Posted by ngocbd on Jun 20, 2009 in Uncategorized

MỘT NGÀY PHẢI KHÁC MỌI NGÀY

(Sau một ngày thống kê một cách khách quan những bi hài kịch thời sự nóng hổi)

Chào một ngày giống hệt mọi ngày

Sóng truyền hình phủ toàn phim Trung Quốc

Từ HTV, VTV, BTV, Đồng Nai, Long An, Bà Rịa Vũng Tàu, Cà Mau… cho đến “cáp”

Hết “Triều Đại Mãn Thanh” đến “Đại Tống Truyền Kỳ”

Chào một ngày giống hệt mọi ngày

Đọc báo thấy cha ông mất hút

Thấy thiên hạ quỳ mọp dưới tượng đài Binh Pháp Mặc Công, Ngọa Hổ Tàng Long, Họa Bì, Xích Bích…

Con nít thuộc lòng Hoắc Nguyên Giáp, Hoàng Phi Hồng, Diệp Vấn, Diệp tùm lum hơn thuộc sử Tiên Rồng

Chào một ngày đất nước tự lưu vong

Cội rễ văn hiến 4000 năm trốc gốc

Tuổi teen gối đầu giường Lý An, Ngô Vũ Sâm, Trương Nghệ Mưu, Trần Khải Ca lạ hoắc

Pano giăng khắp nơi hình ảnh Củng Lợi, Chương Tử Di, Thành Long phơi phới toét miệng cười

Chào một ngày phát triển giống đười ươi

Đi trên xã tắc thấy người thua xa khỉ

Thấy lô cốt ngáng đường, thấy nước ngập tận mông, thấy thánh hiền sợ quỷ

Thấy truyền thống chống ngoại xâm co rúm lại vì… tiền

Chào một ngày vong bản vì… hèn

Sống chết mặc bây, túi thầy vô cảm

Ải Nam Quan nằm ngoài ranh giới Việt Nam, xưa rồi Diễm…

Nước mắt Nguyễn Trãi khóc Nguyễn Phi Khanh rơi ở tận… nước Tàu

Chào một ngày bãi biển hóa nương dâu

Thác Bản Giốc rời Cao Bằng như có cánh

Thắng cảnh để lại của tiền nhân bị cháu con ghẻ lạnh

Các di tích, kỳ quan cứ mất tích đều đều

Chào một ngày hình chữ S tong teo

Tài nguyên bôxit bị bới đào như… bọ xít

Nhôm và đô la chẳng thấy đâu, chỉ thấy đất Tây Nguyên rên xiết

Ô nhiễm mạch ngầm, nước sông làm nghẹt thở Chín Con Rồng

Chào một ngày long mạch bị xới tung

Máu bầm đất đỏ bazan, máu tràn ra hải đảo

Ai cho phép Hoàng Sa Trường Sa thành Tam Sa lếu láo

Tội nghiệp rừng cọc nhọn của Hưng Đạo Đại Vương trên sóng Bạch Đằng

Chào một ngày giống hệt cõi âm

Những xác chết anh hùng bật dậy

Máu trả máu, đầu trả đầu. Nhớ đấy

Mãi quốc cầu vinh tất quả báo nhãn tiền

Chào một ngày soi rõ mặt anh em!

21 – 4 – 2009

BÙI CHÍ VINH

 
1

Giải thử vài câu đề thi tốt nghiệp ptth môn toán

Posted by ngocbd on May 30, 2009 in Uncategorized

Xem đề thị tại đây : http://www.thanhnien.com.vn/News/Documents/GiaoDuc/PTTH/2009/Dapan/DeToan_GDTHPT.pdf

Tất nhiên là giải theo cách thông thường thì các bạn xem trong đáp án :P

Ở đây là phương pháp  giải “khác” :D .

Câu 1:
1.

Khảo sát và vẽ đồ thị hàm số :
http://www57.wolframalpha.com/input/?i=(2x%2B1)%2Fx-2
Câu 2
2.1.

Giải phương trình :
http://www57.wolframalpha.com/input/?i=25^x-6*5^x%2B5%3D0
2.2.

Tính tích phân :

http://www57.wolframalpha.com/input/?i=integral+[x(1%2Bcos(x))%2C0%2Cpi]
2.3.

Tìm max - min trên một đoạn .
min :

http://www57.wolframalpha.com/input/?i=minimize+x^2-ln(1-2x)+over+[-2%2C0]
max :
http://www57.wolframalpha.com/input/?i=maximize+x^2-ln(1-2x)+over+[-2%2C0]

Câu 4

4.a.1

Tính toạn độ tâm và bán kính của hình cầu

(x-1)^2+(y-2)^2+(z-2)^2 = 36

http://www61.wolframalpha.com/input/?i=(x-1)^2%2B+(y-2)^2%2B(z-2)^2%3D36

vậy

tâm S(T) : (1,2,2)
bán kính :6

Câu 5
5.a.

Giải phương trình trên tập số phức
http://www57.wolframalpha.com/input/?i=8x^2+-4x+%2B1+%3D0
5.b.
Giải phương trình trên tập số phức

http://www57.wolframalpha.com/input/?i=2x^2+-+i+x+%2B++1+%3D0

Tạm vậy đã các , các câu khác ai có cách  giải thì commnet nhé  !

 
0

Funny web2.0

Posted by hoangnd on May 28, 2009 in Uncategorized

 
0

IE webrender - Công cụ kiểm tra web design trên IE

Posted by ngocbd on May 26, 2009 in Uncategorized

http://ipinfo.info/netrenderer/

Với công cụ trên không những kiểm tra đựoc thiết kế , mà còn có thể xem trực tiếp sự sai khác giữa các phiên bản IE (6-7)

Công cụ khủng hơn :D

http://browsershots.org
Demo

http://browsershots.org/http://khuvuc.com/

hay http://www.browsercam.com

 
0

Skype and Facebook plugin for Pidgin

Posted by ngocbd on May 26, 2009 in Uncategorized

http://code.google.com/p/skype4pidgin/
http://code.google.com/p/pidgin-facebookchat/

Tags: , ,

 
0

[Note] Sinh lại RSA Key cho ssh client

Posted by ngocbd on May 19, 2009 in Uncategorized

Hôm nay cài lại server ssh lên không thiêng .
Lỗi là tại RSA key ở client đã cũ (do ssh server được cài lại).
gõ lệnh sau để gen lại ssh key cho client

“ssh-keygen -R ip_addressInConflict”

Tags: ,

 
0

TUT Làm bản đồ đại lý

Posted by habogay on May 18, 2009 in Uncategorized

Công việc này có thể làm bạn nghĩ đến giải pháp google maps nhưng theo tôi   dùng google map và maker api của nó là quá phức tạp . Thôi thì tự làm một cái vậy .

Yêu cầu của bài toán là vẽ một bàn đồ nước việt nam , trên đó vị trí các tỉnh thành phố có đại lý của công ty XYZ thì xuất hiện maker (Dùng hình ngôi sao hoặc chấm tròn) và tên tỉnh thành pố có đại lý đo .

Nếu người dùng click vào tỉnh thành phố nào thì xuất hiện chi tiết danh sách các đại lý trực thuộc tỉnh thành phố đó .

Các đồ nghề cần sài : Flash IDE  (CS2) , PHP 5 , Mysql 5 , GIMP (Hoặc PS)

Đầu tiên là làm một cái flash có hiển thị tên các tỉnh thành .

B1 Kiếm một cái bản đồ việt nam (dạng khung) :

google nào

Tôi chọn cái ảnh thứ 2 :

Giờ là lúc dùng đến GIMP để sửa sang nó

Kết quả :D

Cũng không tệ lắm

B2. Tạo flash document có kích thước lớn hơn bức anh một chút : 325×680

Import bản đồ vào .Kéo bản đồ từ lib vào stage nếu bạn import nó vào lib . Đặt tên cho instance là map .

Xong .

B3. Vẽ hình ngôi sao :D

Convert ngôi sao thành Moviclip (nhớ chọn option Export for Actionscript) . Đặt tên cho Class là ” Star”  .

B4. Tạo file chứa tên tỉnh thành và tọa độ của chúng . Tất nhiên cái này phải lấy từ  csdl nhưng trước mắt cứ lấy đại một cái file tĩnh đã , sau này chỉ cần sửa lại url trỏ vào file php là xong .

tạo một file data.txt để giả lập dữ liệu lấy ta từ  csdl . giả sử file này đặt ở http://localhost:81/data.txt

data.txt:
Hanoi=30-20&Saigon=40-50

Tôi lưu file theo cấu trúc : “tên tinht thành=tọa độ x- tọa độ y”

tiếp theo mở actionscript code thẳng vào frame 1 .

import flash.net.*;
var myLoader:URLLoader = new URLLoader()
//the data will come as URL-encoded variables
myLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
//Load using an URLRequest, even beeing local
myLoader.load(new URLRequest(”http://localhost:81/data.txt”));
//add a listener for the complete event
myLoader.addEventListener(Event.COMPLETE, onLoadHandle);
function onLoadHandle(ev:Event):void{

for (var name in myLoader.data){
trace(name+”:”+myLoader.data[name]);

}
}

Chạy thử đoạn code trên :

kq:

Hanoi
30-20
Saigon
40-50

Tiếp theo là thay vì trace ta sẽ add các ngôi sao lên các vị trí tương tứng :

var mc:Star = new Star();
var valuePair:String=String(myLoader.data[name]);
var arr=         valuePair.split(”-”);
mc.name=name;
mc.x=arr[0];
mc.y=arr[1];
addChild(mc);

Thay đoạn code này vào trong vòng for .

Ta sẽ thấy xuất hiện 2 ngôi sao ở vị trí 30-20 và 40-50 .

Giờ là lúc tìm vị trí chính xác cho 2 ngôi sao này (Dùng GIMP đo tọa độ trên ảnh )

Đây là kết quả của tôi :D (chắc chắn là chưa chính xác vì tôi áng khoảng thôi , bạn phải khớp với bản đồ thật)

Hanoi=137-108&Saigon=179-570

Chạy lại : Hai ngôi sao đã phù hợp với vị trí các tinht thành , nếu muốn có thêm các tỉnh thành khác bạn chỉ việc thêm vào file data.txt .

B5. Xử lý tên tỉnh thành nằm cạnh ngôi sao :

import flash.net.*;
import flash.text.TextField;
var myLoader:URLLoader = new URLLoader()
//the data will come as URL-encoded variables
myLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
//Load using an URLRequest, even beeing local
myLoader.load(new URLRequest(”http://localhost:81/data.txt”));
//add a listener for the complete event
myLoader.addEventListener(Event.COMPLETE, onLoadHandle);
function onLoadHandle(ev:Event):void{

for (var name:String in myLoader.data){

var mc:Star = new Star();

var valuePair:String=String(myLoader.data[name]);
var arr=         valuePair.split(”-”);
mc.name=name;
var txt:TextField = new TextField();
txt.text=mc.name;

mc.x=arr[0];
mc.y=arr[1];
mc.addChild(txt);
addChild(mc);

}
}

Tạm thế đã . :D

 
4

Sự tàn lụi của PHP

Posted by hoangnd on Apr 29, 2009 in CakePHP, Drupal, Khái niệm, flex, php, ria, web server

Mặc định rằng các bạn đang đọc bài này là những người làm trong ngành nên tôi sẽ không giải thích hay ghi chú những khái niệm phổ thông. Mặt khác, lý lẽ trong bài viết này chỉ phản ánh quan điểm của cá nhân tôi, không đại diện cho ai hay tổ chức nào khác.

Lịch sử ngành công nghiệp máy tính & mạng đã chứng minh PHP là một trong số những ngôn ngữ mạnh & linh động nhất trên nền Web và cũng không quá khó để thành thục ở mức phổ thông. Được phát triển và biết đến từ những năm cuối của thập kỷ trước, PHP đã đạt được sự tăng trưởng đáng kinh ngạc so với các ngôn ngữ lập trình khác.

 

PHP Timeline

PHP Timeline

 

 

Nhìn biểu đồ trên, ta thấy con đường đi lên của PHP là theo hướng phát triển truyền thống, tức là Thiết kế -> sử dụng -> chỉnh sửa -> lớn mạnh -> phát triển. Điều thú vị là cho đến nay, rất nhiều các sản phẩm được phổ biến rộng rãi cũng đi theo con đường trên như các nền tảng .NET, Java hay Linux.

Ta lần lượt điểm qua một số điểm mẫu chốt sau

Vòng đời

Một lần nữa, nhắc lại thế mạnh của PHP trên nền web chính là tốc độ (phát triển & thực thi), nhẹ & dễ học. Bên cạnh đó, do đặc tính mã nguồn mở (theo giấy phép PHP) cũng như sự đổi mới về phong cách khi ra đời, PHP sở hữu rất nhiều thứ quý giá

 

  • Cộng đồng lớn. Khoản này vô đối. Luôn có những guru sẵn sàng chia sẻ kinh nghiệm & kiến thức, hướng dẫn những người mới và giải đáp thắc mắc.
  • Thư viện, cả nội tại và mở rộng của PHP, có chứa số lượng function cực lớn được đóng góp bởi những người tình nguyện. Con số vào khoảng 700 buit-in functions và uncountable external functions (hoangnd tính toán).
  • Framework đa dạng về số lượng cũng như chất lượng, thậm chí đa dạng cả về mô hìnhmục đích sử dụng.

 

Sự mở rộng và phát triển

 

  • Khái niệm về namespace. .NET đã có từ lâu, Java cũng có khái niệm package gần tương đương, và bây giờ chúng ta chứng kiến PHP. Đành rằng namespace ra đời với mục đích cơ bản là giúp lập trình viên dễ tổ chức và quản lý code hơn, nhưng với PHP thì tôi cho rằng là một sự ôm đồm. Mặc dù có rất nhiều những giải thích về cách gõ namespace trong PHP, nhưng thực sự là rất khó chấp nhận ký tự “\” để phân cách.  Thứ nhất  là hơi va chạm với tư tưởng chạy đa nền của PHP vì ký tự “\” được dùng phổ biến trong windows để phân tách đường dẫn. Thứ hai là có vẻ như PHP đã sử dụng cạn kiệt tài nguyên bàn phím. 
  • PHP cho đến nay đã quá rộng lớn và các lập trình viên dễ dàng tìm được nhiều giải pháp khác nhau cho cùng một bài toán. Điều này thể hiện rất rõ ràng tư tưởng “open and share” mà nhờ nó, nhân loại mới có được kho tri thức khổng lồ (không chỉ trong ngành khoa học máy tính mà còn ở tất cả các lĩnh vực khác). Tuy nhiên, hãy nhìn Python làm, bạn có rất ít những cách để xử lý một vấn đề và thường thì những cách đó luôn là cách tốt nhất và dễ dàng nhất cho bạn, đến nỗi bạn chả buồn nghĩ tới hướng khác :P. Ở phía đối diện, .NET độc quyền gắn chặt với hệ điều hành Window$ của Micro$oft nhưng có sự thống nhất, rõ ràng và ổn định cực tốt (nếu bạn chọn phát triển trên nền tảng này).

 

Yahoo và facebook xài PHP

Quá đúng, bỏ qua phần backend thì chính những đoạn mã  PHP đã dựng lên bộ mặt yahoo & facebook như bây giờ. Và nó đã chứng minh giá trị của mình khi cả Yahoo & facebook đều đã hoặc đang trở thành những đế chế internet với danh tiếng, lợi nhuận & lượng người dùng cực lớn, chưa kể đến số lượng các dịch vụ kèm theo.

Thế nhưng, trong các đăng báo tuyển dụng, họ luôn muốn ưu tiên những ứng viên biết thêm Perl hoặc Python bên cạnh thành thạo PHP (bỏ qua các yêu cầu khác). Câu hỏi đặt ra là, họ (yahoo & facebook) định cho những ứng viên này làm cả ở nền tảng trên & dưới của hệ thống web application? hay họ muốn những ứng viên đó có được tư duy ngôn ngữ của perl, python? hay nữa là họ muốn dự phòng và sẵn sàng chuyển đổi sang perl, python? (lol)

Đặc điểm

Một chút hình dung


Có nghĩa lý gì? Ai cũng biết .NET là một nền tảng còn PHP là một ngôn ngữ lập trình, tất nhiên sẽ là không hợp lý nếu so sánh chúng với nhau. Cái tôi muốn đề cập là, với .NET chúng ta có thể sử dụng để lập trình web, windows application, mobile, embedded, cloud … với sự tách biệt không quá lớn dành cho lập trình viên (tất nhiên môi trường triển khai thì không nói). Còn PHP không thể đứng một mình, nó sẽ kết hợp với các công nghệ khác tạo thành những nền tảng thực thi bài toán, mà chất lượng kết quả bài toán đó phụ thuộc rất nhiều vào kinh nghiệm & kiến thức của kiến trúc sư trưởng dự án. Sợi dây liên kết này tôi cho rằng là kém vững trãi hơn so với .NET

Ngoài ra, mô hình trên còn thể hiện một nội dung khác. Nếu coi mỗi ngôn ngữ là một tập thông tin thì chúng liên kết với nhau qua giao của những tập đó. Có nghĩa là PHP sẽ đứng chung với python, perl, ruby … Và cũng có nghĩa là tôi sẽ chọn python thay vì PHP để kết hợp với flex. Tức là PHP đã mất đi một người dùng là tôi, ít nhất là trong dự án nào đó.

Buồn ngủ quá nên đoạn này viết hơi sơ sài và lung tung, sẽ cập nhật lại sớm thôi

Tuy nhiên

Các lập trình viên PHP đừng quá buồn và suy nghĩ nhiều làm gì, PHP đã, đang và sẽ luôn làm rất tốt trong phân khúc thị trường của nó. Và trong 1, 2, 3 năm nữa có thể ta có PHP phiên bản 6.0, 6.1, 6.2 … nhưng rồi nó sẽ phát triển tiếp thành cái gì? Cộng đồng không có nhiều người biết, tôi cá là bạn không biết, còn tất nhiên là tôi không biết roài. :D

(just my cent at 3 a.m)

Tags: , , , , ,

 
1

Project Dark Star – start Server: Helloworld

Posted by dungbk on Mar 19, 2009 in projectdarkstar

Quay trở lại vấn đề Start Server & làm cho Server chào Helloworld – điều mà không phải ai cũng đủ kiên trì làm được với bài tut trước. Bài tut này sẽ trình bày lại một cách đơn giản cách Start Server, bỏ qua việc giới thiệu & quảng cáo về PDS.

C      Công việc sẽ chia thành mấy bước thế này:

- Build Path cho các file .jar trong thư viện của PDS vào project

- Tạo class HelloWorld

- Tạo thư mục conf

- Viết hello.xml

Trước hết, muốn làm việc với PDS thì phải down nó về đã. Down ở đây:

http://www.projectdarkstar.com/current-distribution.html

download và giải nén 2 gói Project Darkstar Server, source & binary Project Darkstar Java Client SDK, source & binary là đủ dùng.

Bây giờ tạo một project Java, ví dụ tên là PDSHelloServer.

1.    1. Build Path: (lấy thư viện của PDS Server)

Chuột phải vào System library-> Build Patch -> Configure Build Path -> Add External Jars. Sau đó chỉ đường dẫn vào sgs-server-dist->lib, chọn tất cả file đuôi jar -> ok . Sẽ xuất hiện thư mục Referenced Library.

2.    2. Tạo 1 package tên là helloServer trong project, copy class HelloWorld trong sgs-server-dist-0.9.8\tutorial\src\com\sun\sgs\tutorial\server\lesson1, nhớ đổi tên package

3.   3. Tạo thư mục conf trong Project copy các file Helloworld.boot , Helloworld.properties , logging.properties trong sgs-server-dist-0.9.8/tutorial/conf vào thư mục conf.

Chỉnh sửa một số thông tin trong các file này như sau:

File HelloWorld.boot:

SGS_PROPERTIES=${SGS_HOME}/HelloWorld/conf/HelloWorld.properties

SGS_LOGGING=${SGS_HOME}/HelloWorld/conf/logging.properties

- Fi   File  HelloWorld.properties:

com.sun.sgs.app.name=HelloWorld

com.sun.sgs.app.root=HelloWorld/data/HelloWorld

com.sun.sgs.app.port=1139

com.sun.sgs.app.listener=helloServer.HelloWorld => package chứa class HelloWorld

4.  4. Viết hello.xml

Tạo ra 1 file hello.xml trong project, nội dung như sau:

<project default=“jar”>

<!–bắt buộc phải có target clean trong mỗi ant –>

<target name=“clean”>

<delete dir=“jar”></delete>

</target>

<!– nén file từ basedir thành destfile (trong thư mục project của minh)–>

<target name=“jar”>

<mkdir dir=“jar”/>

<jar destfile=“jar/HelloWorld.jar” basedir=“bin”/>

<!–copy file jar–>

<!–ở đây folder sgs-server-dist-0.9.8 được đặt ở địa chỉ E:/mydata/projectdarkstar, để chạy được phải sửa đường dẫn tương ứng trên máy cá nhân –>

<copyfile dest=“E:/my data/projectdarkstar/sgs-server-dist-0.9.8/lib/HelloWorld.jar” src=“jar/HelloWorld.jar”/>

<copydir dest=“E:/my data/projectdarkstar/sgs-server-dist-0.9.8/HelloWorld/conf” src=“conf”></copydir>

<!–delete để có thể chạy lại application–>

<delete dir=“E:/my data/projectdarkstar/sgs-server-dist-0.9.8/HelloWorld/data”></delete>

<!–start application với tham số bên dưới–>

<java fork=“true” jar=“E:/my data/projectdarkstar/sgs-server-dist-0.9.8/bin/sgs-boot.jar” >

<arg value=“E:/my data/projectdarkstar/sgs-server-dist-0.9.8/HelloWorld/conf/HelloWorld.boot”></arg>

</java>

</target>

</project>

Right click vào file hello.xml này, chọn Run As –> Ant Build, trên màn hình console sẽ log lại dòng Hello World!

Lưu ý, khi start lại Server lần 2, nếu gặp lỗi không xóa được /sgs-server-dist-0.9.8/HelloWorld/data

thì vào task manager và kill bớt mấy process từ lần chạy trước. Good luck!

 
0

Copy and paste Programming VIA Copy and paste Writing

Posted by ngocbd on Mar 19, 2009 in Uncategorized

I was always against Copy and Paste programming. I condemned people who use this practice as discrediting the honorable profession of The Programmer. This evil activity inflates application code without adding anything useful. This shameful practice causes various complications - more code, more things to remember, needless complexity, and difficulty to manage and synchronize related changes in the future. But at some point, I admitted to myself - things are not so black and white. I do Copy and Paste in my code, it is difficult to resist this seductive activity.

The only indulgence is that I’m very keen to eliminate bad effects of Copy and Paste before finishing my task.

I use two main approaches for writing new code. The first is Top-Down - I have clear design ideas how I should program and I know what classes and components to use. I go ahead and write code from scratch using my memory and power of intellect :). There are few problems with this approach. Unfortunately, my memory is not so great and knowledge is not so vast. Regularly I have new tasks that I don’t know or don’t remember how to program. Sometimes I don’t get immediately what other people programmed without debugging. And often I want to save time and avoid re-implementing the same idea again. And that is why I also use the second approach - Bottom-Up. I copy and paste code first. And after I figure out how this code works, how to use, fit and improve it.

When is Copy and Paste approach useful?

Shamelessly, I can come up with few cases:
1. Work by example - you found new code through search and want to  use it immediately to solve your problems.
2. Quick start - you copy code (including your old code) to save time.
3. Test in the new context - you want to quickly assess if code will be correctly running in the context of your application
4. Too hard to reuse - if you cannot reuse, just copy code. For example, you don’t have time to build common framework with separate application or another team owns code and don’t want you to touch and spoil it.
5. Series of experiments - you try to find the best way to solve a problem and copy code to try if it solves a problem well.

How to eliminate bad effects of Copy and Paste

Now I’m going to return to canonical view on evilness of Copy and Paste. Even if you have legitimate reason to use Copy and Paste, it is acceptable only on temporary basis before you commit your code or your team granted absolution (probably for very short time) :).
Therefore, after committing Copy and Paste scandalous act, do following:
1. Understand what have you done - any code that you don’t understand is ineffective for future use, and potentially excessive, wasteful and dangerous.
2. Clean, minimize and shape - remove all useless, over-engineered and questionable pieces; consider yourself as a jeweler, who is converting rough crystals in beautiful diamonds that fit well into solid code and concepts in your program.
3. Refactor and Integrate - use refactoring techniques to integrate new cleaned code into existing application: improve design, simplify and increase power of your code.
4. Learn - the best outcome of this sinful activity is gained knowledge and experience that will make Copy and Paste unnecessary next time.

With age and experience of harsh programming reality, I’m becoming less purist and more pragmatic. I have started to accept everything what makes me effective. The only rule - I shouldn’t be ashamed of my code after the finish… even if I did Copy and Paste couple times ;)

What do you think?

source  : http://softwarecreation.org/2008/a-few-words-in-defense-of-copy-and-paste-programming/

Tags: , ,

 
0

Project Dark Star - connecting server and client

Posted by dungbk on Mar 19, 2009 in projectdarkstar

Ở bài tut trước đã hướng dẫn cách để làm cho Server “chạy”. Mục tiêu tiếp theo sẽ là làm sao để Server nói chuyện với Client, phức tạp hơn là làm cho các Client nói chuyện với nhau thông qua Server. Bài tut này sẽ hướng dẫn cách làm cho Server & Client nói chuyện với nhau.

Cụ tỉ sẽ gồm các công việc sau:

- Start Server

- Login: Start Client & client login vào server, Server cho client login vào

- Echo : Client gửi cho Server 1 chuỗi bất kì, Server gửi trả cho Client đúng chuỗi đó

1. Start Server : xem bài tut trước hoặc bài này

2. Login:

- Tạo một project mới quản lý Client, ví dụ tên là PDSHelloClient.

o Add các file .jar trong \sgs-client-0.9.8\lib theo cách tương tự như đã làm với Server

o Tạo 1 package mới và copy file HelloUserClient.java trong \sgs-client-0.9.8\tutorial\src\com\sun\sgs\tutorial\client\lesson1 vào.

- Quay về project Server:

o Copy class HelloUserSessionListener ở \sgs-server-dist-0.9.8\tutorial\src\com\sun\sgs\tutorial\server\lesson5.

o Trong class của Server:

- Thêm khai báo logger:

/** The {@link Logger} for this class. */
private static final Logger logger =
Logger.getLogger(HelloWorld.class.getName());

- đổi phương thức loggedIn thành:

public ClientSessionListener loggedIn(ClientSession session) {

// User has logged in

logger.log(Level.INFO, “User {0} has logged in”, session.getName());

// Return a valid listener

return new HelloUserSessionListener(session);

}

Để server cho phép Client login và log lại thông tin. Phương thức này sẽ trả về một instance của HelloUserSessionListener.

(Hoặc copy Class HelloEcho trong \sgs-server-dist-0.9.8\tutorial\src\com\sun\sgs\tutorial\server\lesson5 )

- Bây giờ Run lại Server & Run Client, xong nhiệm vụ 2

3. Echo:

- Phía Server:

o Copy class HelloEchoSessionListener từ \sgs-server-dist-0.9.8\tutorial\src\com\sun\sgs\tutorial\server\lesson5.

o Trong class của Server: đổi phương thức loggedIn thành:

public ClientSessionListener loggedIn(ClientSession session) {

// User has logged in

logger.log(Level.INFO, “User {0} has logged in”, session.getName());

// Return a valid listener

return new HelloEchoSessionListener(session);

}

Khác biệt duy nhất ở đây so với phương thức loggedIn cũ là phương thức này trả về một instance của HelloEchoSessionListener

o Bây giờ Run Server đi.

- Phía Client: Run Client và type vào text box một string bất kì, sẽ nhận được phản hồi từ phía Server.

Xong. Bây giờ tìm cách để Client trò chuyện với Client đi :D.

Tags:

 
1

DarkStar Project

Posted by xuanhung on Mar 13, 2009 in projectdarkstar

1. DarkStar là gì ?
Project DarkStar (PDS) là  một dự án mã nguồn mở viết bằng java được phát triển nhằm đơn giản hóa việc phát triển các dự án như  game trực tuyến trên qui mô lớn, xây dựng một thế giới ảo, hoặc các ứng dụng mạng xã hội. Thay vì phải mất thời gian code, thì nay tất cả đều có sẵn trong PDS.
2.Cụ thể PDS dùng để làm gì ?
-PDS dùng để xây dựng Server và Client cho ứng dụng.
-Tạo một mạng Game lớn, đồ sộ, đáng tin cậy, ổn định, quan trọng là không bị đứt khi gặp lỗi .
3.Cài đặt và chạy Darkstar :
Dowload Project tại trang chủ  http://www.projectdarkstar.com/ để có phiên bản mới nhất (có 2 gói, một là sgs-server-dist dùng cho server  và sgs-client-dist cho client, ở đây sẽ lấy ví dụ ở sgs-server-client) .
Sau khi giải nén, ta được thư mục sgs-server-dist. Trong thư mục này có những hướng dẫn cụ thể, những bài thực hành của PDS trong mục tutorial. Dưới đây là hướng dẫn để áp dụng PDS vào dự án của mình.
4. Áp dụng: (Lesson 1 : Hellowolrd)
- Vào Eclipse, tạo Project java.
- Trong thư  mục src : tạo package chứa class HelloListener (copy từ  /sgs-server-dist-0.9.8/tutorial/src/com/sun/sgs/tutorial/server/lesson1)
- Lấy thư viện của sgs-server-dist : Chuột phải vào System library-> Build Patch -> Configure Build Path -> Add External Jars. Sau đó chỉ đường dẫn vào sgs-server-dist->lib, chọn tất cả file đuôi jar -> ok . Sẽ xuất hiện thư mục Referenced Library.
- Tạo thư mục conf trong Project, copy các file Helloworld.boot , Helloworld.properties , logging.properties trong sgs-server-dist-0.9.8/tutorial/conf vào thư mục conf.
- Cuối cùng, tạo một file.xml (dùng ant xml để chạy vì đơn giản hơn  so với việc viết bằng ngôn ngữ  khác các chức năng). File có nội dung như sau :

<!--Dùng ant thay cho code java, khả năng tương thích cao, được dịch ngay khi compile,
đây là phương pháp đơn giản, dễ sử dụng -->
<project default="jar">
<!--bắt buộc phải có target clean trong mỗi ant -->
<target name="clean">
<delete dir="jar"></delete>
</target>
<!-- nén file từ basedir thành destfile (trong thư mục project của minh)-->
<target name="jar">
<mkdir dir="jar"/>
<jar destfile="jar/phom.jar" basedir="bin"/>
<!--copy file jar-->
<copyfile dest="/home/legend/Desktop/sgs-server-dist-0.9.8/lib/phom.jar" src="jar/phom.jar"/>
<copydir dest="/home/legend/Desktop/sgs-server-dist-0.9.8/phom/conf" src="conf"></copydir>
<!--delete để có thể chạy lại application-->
<delete dir="/home/legend/Desktop/sgs-server-dist-0.9.8/phom/data"></delete>
<!--start application với tham số bên dưới-->
<java fork="true" jar="/home/legend/Desktop/sgs-server-dist-0.9.8/bin/sgs-boot.jar" >
<arg value="/home/legend/Desktop/sgs-server-dist-0.9.8/phom/conf/Phom.boot"></arg>
</java>
</target>
</project>

- Chạy file.xml này ( chuột phải -> run as -> ant build)

 
1

Cách viết Module, Hook trong Drupal

Posted by chaubl on Feb 7, 2009 in Drupal

1. Module trong Drupal :

Cấu trúc của một module có thể gồm nhiều tập tin khác nhau, nhưng phải có ít nhất một tập tin tên_module.info và một tập tin tên_module.module, tên này không được trùng với các module đã tồn tại trong hệ thống.
Tạo file *.info:
Cấu trúc của một tập tin *.info có dạng:
- Name = tên của module, bắt buộc phải có.
- Description = mô tả các chức năng của module, bắt buộc phải có.
- Version = phiên bản của module.
- Package = nhóm các chức năng của module, nếu không khai báo package thì module được đưa vào nhóm “other”.

- Dependencies = các module phụ thuộc, cách nhau bằng khoảng trống. Nếu module được yêu cầu chưa được bật trên hệ thống thì module này không thể bật được.

Tạo file *.module:
+ Bắt đầu và kết thúc với thẻ <?php ?>
+ Chúng ta có thể ghi chú thích cho nhiều dòng sau dấu ‘/*’ và kết thúc ghi chú dùng dấu ‘*/’, chú thích cho một dòng dùng dấu ‘//’.
+ Viết code: viết các hook mà chúng ta cần xử lý.

2. Hook trong Drupal :

Hook được xem như là các sự kiện (event) bên trong bộ nhân Drupal. Hook được gọi là các hàm callbacks, đây là cách phổ biến nhất để tương tác với nhân Drupal. Module sử dụng hook để tương tác với hệ thống. Mỗi hook có tham số và giá trị trả về nhất định. Một hook là một hàm PHP được đặt tên theo dạng: codepro_user(), trong đó codepro là tên của module còn user là tên của hook. Mỗi hook sẽ có những thông số đầu vào khác nhau và trả về các kết quả khác nhau.
Tùy theo chức năng và mức độ phức tạp của module mà người thiết kế có thể sử dụng các hook thích hợp.

http://api.drupal.org/api/group/hooks/6

VD: Tạo module demo, viết hook bắt sự kiện login, logout .

- Tạo folder demo trong folder modules.

-  Tạo 2 file demo.info, demo.module.

-  Viết function hook_user() trong demo.module.

<?php
function hook_user($op, &$edit, &$account, $category = NULL)
{
if ($op == 'login' )
{
die("hook user login");
}
if ($op == 'logout' )
{
die("hook user logout ");
}
}
?>

Tags: , ,

Copyright © 2009 $i->php(); All rights reserved. Theme by Laptop Geek.