Thứ Năm, 16 tháng 7, 2009

Sử dụng CakePHP để viết web application

Giới thiệu về cakePHP

CakePHP là một framework cho php, mục đích của nó là cung cấp một framework cho người sử dụng php phát triển những ứng dụng web nhanh, mạnh mà không mất tính linh hoạt của nó. Việc viết web trở nên đơn giản và nhanh hơn rất nhiều so với cách viết truyền thông bằng việc dựa trên các thư viện, lớp có sẵn thêm vào đó nó cũng hổ trợ Ajax, Javascript và CSS. Và điều quan trọng là CakePHP is free.Trang chủ cakephp: http://cakephp.org. Để sử dụng nó, yêu cầu người làm phải biết những kiến thức cơ bản về PHP và HTML, ... Có thể đọc nội dung chi tiết về nội dung cũng như ví dụ của nó tại http://manual.cakephp.org

Download cakephp framework

Click vao lien ket sau de download cakephp framework ve: http://cakeforge.org/frs/?group_id=23&release_id=343.

Cài đặt và cấu hình cakephp

Cài đặt

Để sử dụng nó, cần phải đáp ứng những yêu cầu sau:
  • Một HTTP Server (vd như Apache, IIS)
  • CakePHP chỉ support trong PHP ver 4 trở lên.
  • Database: cake hổ trợ các hệ cơ sở dữ liệu sau: MySql, PostgreSQL.
Trong hướng dẫn này tôi sử dụng "AppServ Version 2.5.7 for Windows" gồm
  • Apache Web Server Version 2.2.3
  • PHP Script Language Version 5.1.6
  • MySQL Database Version 5.0.24a
  • phpMyAdmin Database Manager Version 2.9.0.2
Sau khi download cakephp về các bạn extract file đó ra (.zip) và copy vào thư mục chứa Apache Server (vd: C:\AppServ\www\MyCake). VD:

Code:
     /MyCake

/app
/cake
/vendors
.htaccess
index.php
Cấu hình

Để cake có thể làm việc được với database, cần cấu hình lại trang database.php, mặc định trang này không có, để cấu hình ta làm như sau: Mở file database.php.default ở /app/config và Save As lại thành file database.php. Điều chỉnh lại các thông số:

PHP Code:
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)

Ví dụ dùng CakePHP để viết modul quản lý khách hàng

Tôi sẽ nói đến tính năng, cũng như mô hình hoạt động của CakePHP, cách viết một web application bằng cakephp tôisẽ nói dần với các bạn qua ví dụ: Sau khi cài đặt và cấu hình CakePHP, kiểm tra CakePHP đã setup chưa, bạn test thử bằng cách mở web browser lên go http://localhost/MyCake/ bạn sẽ thấy giao diện như sau

This image has been resized. Click this bar to view the full image. The original image is sized 903x679.

Cần chú ý đến 2 dòng
  • Your database configuration file is present.
  • Cake is able to connect to the database.
Xác định xem bạn đã kết nối được Cake với database của bạn hay chưa.

Tạo bảng cơ sở dữ liệu

Ta tạo bảng customers với những field như sau:

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

Code của ứng dụng Customers Manager

Mở trình soạn thảo và tạo các file và nội dung như sau lưu theo đường dẫn chỉ định

File customer.php -> C:\AppServ\www\MyCake\app\models\

PHP Code:
class Customer extends AppModel
{
var
$name = 'Customer';
}
?>
File customers_controller.php -> C:\AppServ\www\MyCake\app\controllers

PHP Code:
class CustomersController extends AppController
{
var
$name = 'Customers';
function
index()
{
$this->set('customers', $this->Customer->findAll());
}
}
?>
File index.thtml -> C:\AppServ\www\MyCake\app\views\customers\

Chú ý tạo thư mục customers trong /app/views

PHP Code:

Customer Manager






foreach ($customers as $cust): ?>







endforeach; ?>
IdNameAgeAddress
echo $cust['Customer']['id']; ?>
echo $html->link($cust['Customer']['name'], '/customers/view/'.$cust['Customer']['id']);?>
echo $html->link(
'Delete',
"/customers/delete/{$cust['Customer']['id']}",
null,
'Are you sure?'
)?>
echo $html->link('Edit', '/customers/edit/'.$cust['Customer']['id']);?>
echo $cust['Customer']['age']; ?> echo $cust['Customer']['address']; ?>

echo $html->link("Add Customer", "/customers/add"); ?>

Xong 3 trang đó, chúng ta test chạy thử , mở webbrowser http://localhost/MyCake/customers Bạn sẽ thấy giao diện trang chính như hình sau:

This image has been resized. Click this bar to view the full image. The original image is sized 1086x421.

Như vậy là bạn đã tạo được ứng dụng đơn giản đầu tiên về việc sử dụng cakephp để viết ứng dụng web. Tiếp theo tôi sẽ giải thích cho các bạn mô hình hoạt động của CakePHP, cách viết các trang,cũng như cách sử dụng biến, hàm ...

Kiến trúc hoạt động

Như tôi đã giới thiệu CakePHP là một framework, nó hoạt động theo kiến trúc MVC (Model, View, Control). Trong Cake Model được thể hiện là một bảng dữ liệu, lưu trữ dữ liệu theo như các quy tắc mà Cake định nghĩa theo mặc định hoặc theo developer tự định nghĩa (chúng ta sẽ nói tính hợp lệ của dữ liệu qua phần Validate dữ liệu). View thể hiện các file view với code có thể là html và php. Controller sẽ thực hiện các yêu cầu từ server( ví dụ như buộc người dùng nhập dữ liệu vào input text), và sử dụng các Model để đọc, viết, hoặc thay đổi dữ liệu trong database và gởi dữ liệu đã được xử lý đến View.

Model

Trong ví dụ trên các bạn thấy trong file customer.php với cách viết code như trên, được Cake hiểu là ta muốn tạo một model tên là Customer để sử dụng trong CustomersController của chúng ta. Biến $name được chỉ định để tránh trường hợp model của chúng ta trùng với tên của các hàm của php. - Và lớp Customer sẽ được kế thừa các thuộc tính và phương thức từ lớp AppModel. Để có thể hiểu chi tiết về model và cách sử dụng các thuộc tính và hàm của model bạn có thể tham khảo tại http://manual.cakephp.org/chapter/models

Controller

Controller được sử dụng để quản lý việc giao tiếp với cơ sở dữ liệu, thiết lập các yêu cầu theo ý muốn của chúng ta để thể hiện lên view vidu như các hàm xử lý thêm, xóa, sữa và hiển thị, ..., là nơi mà tất cả các hoạt động của model ta sẽ quản lý nó được. Trong ví dụ trên (customers_controller.php)đoạn code trên được Cake hiểu rằng ta sẽ tạo một CustomersController dùng để quản lý việc sử dụng, các hoạt động của CustomerModel. Tương tự lớp CustomersController sẽ kế thừa từ lớp AppController. - Hàm index() sẽ được xử lý khi ta gọi trang index.thtml. Trong đó có phương thức set() được sử dụng để gán giá trị là một mảng được trả về từ phương thức findAll() tại của model Customer. Trong ví dụ trên thì biến $customers sẽ mang giá trị là mảng các customer được lấy từ bảng customers từ database. Để xem chi tiết về controller các bạn có thể tham khảo tại: http://manual.cakephp.org/chapter/controllers

View

View là nơi thể hiện dữ liệu đã được xử lý của chúng ta. Một view được xem như một trang template. Chúng ta có thể lấy dữ liệu từ model tương ứng. Dữ liệu được truyền qua một mãng $data. Trong ví dụ trên thì index.thtml là một view. Phần tiếp theo tôi sẽ nói đến chi tiết view thông qua ví dụ trên. Tiếp theo ta tìm hiểu đến các thuộc tính và phương thức trong index.thtml

PHP Code:
foreach ($customers as $cust): ?>
Biến $customers chính là biến mà ta đã thiết lập bằng phương thức set() ở CustomersController của ví dụ. Nó mang giá trị là một mãng như tôi đã nói.$html là một đối tượng của lớp helpers sẽ được đề cập trong phần tới. Phương thức link() được sử dụng để xuất ra một liên kết giống href trong HTML với tham số đầu tiên là tựa để của liên kết, tham số thứ 2 là url.

Hoàn chỉnh các chức năng của modul quản lý customer

Ta sẽ thêm các chức năng thêm, sữa, xóa, hiển thị trong view của chúng ta. Ta thêm các hàm trong customers_controller như sau:

PHP Code:
class CustomersController extends AppController
{
var
$name = 'Customers';
function
index()
{
$this->set('customers', $this->Customer->findAll());
}
function
view($id)
{
$this->Customer->id = $id;
$this->set('customers', $this->Customer->read());
}
function
add()
{
if (!empty(
$this->data))
{
if (
$this->Customer->save($this->data))
{
$this->flash('Your customer has been saved.','/customers');
}
}
}
function
delete($id)
{
$this->Customer->del($id);
$this->flash('The customer with id: '.$id.' has been deleted.', '/customers');
}
function
edit($id = null)
{
if (empty(
$this->data))
{
$this->Customer->id = $id;
$this->data = $this->Customer->read();
}
else
{
if (
$this->Customer->save($this->data['Customer']))
{
$this->flash('Your customer has been updated.','/customers');
}
}
}
}
?>
Như vậy ta đã thêm 4 function trong CustomersController của chúng ta. Function sẽ được gọi ở view. Ví dụ trên ta click vào link Add Customer view add sẽ hiện lên cho ban nhập dữ liệu và khi ta click Save thì function add sẽ được thực hiện. Bạn tạo file add.thtml với nội dung như sau:

PHP Code:

Add Customer


echo $html->url('/customers/add')?>">


Name:
echo $html->input('Customer/name', array('size' => '40'))?>
echo $html->tagErrorMsg('Customer/name', 'Name is required.') ?>



Age:
echo $html->input('Customer/age', array('size' => '40'))?>
echo $html->tagErrorMsg('Customer/age', 'Age is required.') ?>



Address:
echo $html->input('Customer/address', array('size' => '40'))?>
echo $html->tagErrorMsg('Customer/address', 'Address is required.') ?>



echo $html->submit('Save') ?>


Trong view add, dòng

PHP Code:
echo $html->input('Customer/name', array('size' => '40'))?>
sẽ xuất ra một thẻ input text. Với dòng lệnh trên thì Cake sẽ hiểu rằng ta sẽ sử dụng trường name trong model Customer.Tham số thứ 2 là thuộc tính của thẻ input trong HTML. Tương tự với thẻ submit. Hàm tagErrorMsg() sẽ thông báo lỗi ở view trong trường hợp dữ liệu nhập của ta bị lỗi. Việc xử lý lỗi sẽ được nói trong phần sau. Tương tự ta tạo các file edit.thtml, view.thtml như sau:

edit.thtml

PHP Code:

Edit Your Customer


echo $html->url('/customers/edit')?>">
echo $html->hidden('Customer/id'); ?>


Name:
echo $html->input('Customer/name', array('size' => '40'))?>
echo $html->tagErrorMsg('Customer/name', 'Name is required.') ?>



Age:
echo $html->input('Customer/age', array('size' => '40'))?>
echo $html->tagErrorMsg('Customer/age', 'Age is required.') ?>



Address:
echo $html->input('Customer/address', array('size' => '40'))?>
echo $html->tagErrorMsg('Customer/address', 'Address is required.') ?>



echo $html->submit('Save') ?>


view.thtml

PHP Code:

Your Customer


Name :echo $customers['Customer']['name']?>


Age :echo $customers['Customer']['age']?>


Address:echo $customers['Customer']['address']?>

Như vậy các chức năng của ta đã được thực hiện hoàn chỉnh. Trong phần tới chúng ta sẽ tiếp tục tìm hiểu một số phương thức và thuộc tính được sử dụng phổ biến để viết ứng dụng

Components

Trong những trường hợp vì một lý do nào đó ta không thể viết được các hàm trong controller, thì components sẽ chúng ta giải quyết được vấn để đó, và đó cũng chính là một đặc tính rất hữu ích cho các developer trong việc kế thừa các function từ các nguồn khác.

Các files component được lưu giữ ở thư mục app/controllers/components/. Ví dụ ta tạo một file component tên là cpn.php, nội dung trang components đó sẽ tương tự như sau:

PHP Code:
class CpnComponent extends Object
{
var
$comp = null;
var
$controller = true;

function
startup(&$controller)
{
// controller initialization here.
}

function
doComp()
{
$this->comp = 'cpn';
}
}
Phương thức starup() sẽ tham chiếu đến controller mà đang sử dụng nó. Hàm startup() Dispatcher trong suốt quá trình load Cakephp. Nó là một contructor cho phép components truy xuất đến controller đó.

Để sử dụng components đó các bạn phải khai báo biến $components trong controller và gán giá trị cho nó chính là tên components. Ví dụ trong ví dụ về quản lý Customer trên bạn muốn sử dụng components cpn.php trong CustomersComtroller thì đoạn code như sau

PHP Code:
class CustomersController extends AppController{
var
$name = 'Customers';
var
$components = array('cpn');
...
}
?>
Và trong controller đó ta muốn sử dụng hàm doComp() trong components thì viết như sau: $this->Cpn->doComp();. Một ví dụ khác, nếu ai đã từng dùng json (nó là một lớp gồm các hàm để chuyển đổi định dạng dữ liệu bao gồm các phương thức chuyển đổi như encode(), decode(), ...) để sử dụng nó trong các ứng dụng, ta cũng khai báo như trên var $components = array(json); và đặt nó trong controller mà muốn sử dụng.

Thứ Năm, 8 tháng 1, 2009

Tối ưu hóa Search Engine cho Website của bạn

Dù Website của bạn là mới hay đã 10 năm tuổi thì việc quản lý sự hiện diện của nó như thế nào với các Search Engine là một vấn đề rất quan trọng cho sự thành công của một trang web. Một Website điển hình có đến 61% lưu lượng từ các kết quả search engine và 41% lưu lượng đến từ riêng Google. Việc bảo đảm thứ bậc site của công ty cao trong trang các kết quả tìm kiếm là một nhiệm vụ tối quan trọng, đó là lý do tại sao sự tối ưu hóa search engine (SEO) hiện là một lĩnh vực tiền tỉ trong CNTT.

Không ai biết chính xác sự kết hợp những cách thức nào sẽ tối đa được việc xếp thứ hạng của một Website trong trang kết quả tìm kiếm, tuy nhiên rất nhiều người đã phát triển một số phép tính xấp xỉ dựa trên history và kinh nghiệm. Chúng tôi đã hỏi ý kiến của một số chuyên gia về những mẹo nào hay những thủ thuật tối ưu hóa vấn đề tìm kiếm của một Website và dưới đây là những vấn đề được tóm tắt lại.

Biết tối ưu những từ khóa nào

Việc tối ưu hóa Search engine sẽ vô dụng nếu bạn không biết đang cố gắng tối ưu những gì. Đối với một số doanh nghiệp, việc chọn ra những từ khóa thích hợp là hoàn toàn dễ dàng: một thương gia chuyên kinh doanh các mặt hàng về kẹo sẽ chọn từ khóa là kẹo, bánh, socola hay tiếng Anh là candy, chocolate, hay các từ ngữ đại loại như vậy. Tuy nhiên với các site của các doanh nghiệp khác lại không phải lúc nào cũng dễ dàng như vậy, đối với những site này việc lựa chọn từ khóa đối với họ là cả một vấn đề. Thuật ngữ nào một cửa hàng trực tuyến có bán nhiều sản phẩm khác nhau cần phải nhấn mạnh? Và các Website với sự quan tâm chung chung bao phủ đến một số lượng lớn các chủ đề sẽ dùng những thuật ngữ tìm kiếm nào?

Với những người mới bắt đầu, bạn nên dựa vào những quyết định của mình về thuật ngữ nào có liên quan với doanh nghiệp để tối ưu hóa, đây là các thuật ngữ mọi người thường tìm kiếm nhất. Một cách để đánh giá tính phổ biến của thuật ngữ tìm kiếm là sử dụng một công cụ từ khóa trực tuyến được thiết kế để xem các thuật ngữ chung nào được tìm kiếm nhiều nhất. Cả Google Keyword Tool SEO Book Keyword Suggestion Tool đều có thể giúp bạn thực hiện vấn đề này, bằng một phán đoán chính xác về lượng tìm kiếm cho bất cứ thuật ngữ nào bạn chọn, công cụ này sẽ tiến cử cho bạn các thuật ngữ có liên quan để bạn không phải mất nhiều thời gian suy nghĩ.

Rốt cuộc cuối cùng thì nó cũng là cuộc chơi của các con số: Bạn cần tối ưu cho các thuật ngữ có được lưu lượng cao nhất và có liên quan nhiều nhất đối với những vấn đề trong Website của bạn cung cấp. Việc tối ưu Website của cho cho các thuật ngữ chưa ai từng đánh vào search engine sẽ không tạo được bất cứ lưu lượng gì cho site của bạn dù bạn có tận tình theo đuổi sự tối ưu hóa đó như thế nào. Chính vì vậy, trước khi bạn thực hiện bất cứ thứ gì, hãy cẩn thận chọn ra một số các thuật ngữ quan trọng cho việc tối ưu.

Tập trung vào các tag tiêu đề và URL

Các tag tiêu đề cũng cần phải bổ sung thêm vào những nỗ lực về SEO của bạn. Khi nói đến việc đánh chỉ số nội dung, search engine sẽ xử lý đến các từ trong các tag này – hay nói đúng hơn là đoạn văn bản xuất hiện trong thanh bar tiêu đề trong trình duyệt – gần như thành phần quan trọng nhất trên một trang web. Với lý do đó, bạn nên load nó với các từ khóa của mình, làm cho mọi tag tiêu đề trên site mang tính duy nhất. Một lời khuyên dành cho bạn trong trường hợp này đó là, bạn nên coi các tag tồn tại giống như các tiêu đề của hàng trăm quyển sách mà bạn đã xuất bản và muốn các khách hàng có thể tìm thấy nó: “Nếu bạn đặt tất cả với cùng một tiêu đề thì không ai có thể biết họ chúng có những gì khác biệt”.

Nhiều năm cách đây, một số người đã nghĩ rằng cấu trúc URL là hoàn toàn không liên quan và chỉ có nội dung thực sự của trang mới thực sự là vấn đề cần thiết. Tuy nhiên những cố máy tìm kiếm ngày nay chỉ quan tâm đến các từ khóa trong các URL nhiều hơn những từ khóa trong bản thân các trang.

Thực sự cũng rất đáng giá nếu bạn bỏ thời gian để làm cho các từ khóa của mình như một phần của cấu trúc URL. Một đoạn Quantum of Solace (cho ví dụ như vậy) có trong URL www.quantrimang.com/quantum-of-solace thay cho vì www.quantrimang.com/11/&id=27. Các URL rõ nghĩa này không chỉ giúp cho các search engine làm việc mà còn giúp cả cho người dùng.

Cần biết về cách các thành phần khác liên kết với bạn như thế nào

Nếu thích các các độc giả liên kết đến download.com.vn, một Website chuyên cung cấp về các phần mềm download của chúng tôi, nhưng một liên kết giống như “download.com.vn” có những ảnh hưởng rất tích cực về việc xếp thứ hạng mà site của tôi nhận được từ các search engine so với một liên kết giống như “tải phần mềm tại đây”. Tại sao vậy? Điều này là vì các search engine sẽ đưa vào tài khoản cụm từ được gắn siêu liên kết để liên.

Nếu muốn tăng bậc trong xếp hạng bằng một từ khóa hay một cụm từ nào đó, bạn cần khuyến khích những người khác sử dụng các từ khóa đó trong những đoạn có chứa siêu liên kết đến site của bạn, thay cho chỉ sử dụng tên site. Để thực hiện điều này được dễ dàng, bạn có thể cung cấp một đoạn mã HTML mà bạn thích site liên kết sử dụng: Nhiều người liên kết chỉ copy một cách đơn giản và paste nó vào Website của họ thay vì phải bỏ thời gian để điều chỉnh.

Chính tả phải rõ ràng

Site của bạn (và đặc biệt là các từ khóa của bạn) cần phải rõ ràng và không mắc lỗi chính tả. Kinh nghiệm đã cho thấy, từ “Typos” đã gây ra một vấn đề lớn cho những người bán hàng của eBay, và sự thực mà mãi sau này họ mới biết là tại sao không ai trả giá về sản phẩm vòng xuyến mang tên "Tiffanny" của họ.

Để ý đến Flash

Các Website Flash trông có hình thức khá bắt mắt, tuy nhiên các cỗ máy tìm kiếm lại không quan tâm đến điều đó. Các nội dung trong site của bạn càng gần gũi với văn bản thô (dạng plain text) hơn thì các cỗ máy tìm kiếm lại thực hiện công việc của nó tốt hơn. Ngày nay tuy các Search engine đang dần tỏ ra làm việc tốt hơn với Flash nhưng nếu bạn muốn có các kết quả thấy được trong trang tìm kiếm, văn bản và HTML vẫn là cách tốt nhất.

Chống ăn cắp và nhân bản nội dung

Một trong những vấn đề SEO khó khăn nhất cần phải chữa trị là vấn đề nhân bản nội dung – xu hướng các site khác đánh cắp những bài viết của bạn sau đó xuất bản lại như của chính họ. Tất cả các cỗ máy tìm kiếm đều khó khăn trong việc nhận ra phiên bản nào là phiên bản gốc, chính vì đó bạn có thể bị đối xử bất công bằng như một trang nhân bản nếu engine thất bại trong việc nhận ra ai copy của ai. Các site nhân bản sẽ hiện lên trong các trang kết quả tìm kiếm từ khi người tìm kiếm kích vào liên kết của search engine: "repeat the search with the omitted results included," tuy nhiên lại không mấy người dùng thực hiện như vậy.

Để xử lý với các trường hợp nhân bản nội dung này, nhiều Web host đã có các cơ chế cho việc báo cáo sự lạm dụng này như một sự xâm phạm bản quyền. (Cho ví dụ, dịch vụ Google Blogger có một hệ thống thông báo như vậy). Quá trình có thể là rất phức tạp nhưng những cố gắng của bạn sẽ được đền đáp nếu chúng giúp bạn ngăn chặn những điểm bất lợi mà những kẻ chơi không đẹp làm ảnh hưởng đến bạn.

Phép thử với OnlyWire

OnlyWire cho phép bạn tự động đệ trình một trang nội dung đến hơn 20 trang bookmark có tính chất xã hội với một kích chuột. OnlyWire cũng cho phép bạn nhúng một liên kết "bookmark & share" trên các trang của mình để cho phép khách ghé thăm khác thực hiện giống như vậy. Để có được kết quả tốt nhất, những cá nhân nên bookmark các trang chủ của riêng họ và các trang nhỏ mỗi lần trong tháng”. Việc đệ trình nội dung lựa chọn đến các site tin tức xã hội lớn có thể làm quá tải về lưu lượng, nhưng đây thực sự là một chiến lược rất “hit-or-miss”.

Sử dụng các cụm từ liên kết giữa các trang

Nếu bạn sử dụng các cụm từ có siêu liên kết nội bộ trong trang chủ của mình, việc liên kết các nội dung bên trong là do chính bạn phải thực hiện, liên kết từ một trang này đến một trang khác bên trong Website của bạn sẽ giúp cải thiện được thứ hạng trong trang kết quả tìm kiếm.

Chất lượng là hàng đầu

Điều này rõ ràng là quá hiển nhiên cho vấn đề tối ưu, chất lượng của nội dung Website của bạn phải là thứ đầu tiên trong bất cứ chiến lược SEO nào. Các kết quả của Search-engine bị ảnh hưởng bởi một phạm vi rộng, đó là số lượng liên kết gửi đến nôi dung của bạn, dù các liên kết này đến từ các blog, các câu chuyện về tin tức hoặc các site tin tức xã hội khác. Trừ khi bạn cho phép các khách ghé thăm một lý do hấp dẫn để liên kết với trang của bạn, bằng không bạn sẽ không có được các liên kết này và sẽ không tăng được thứ hạng của mình trong trang tìm kiếm – dù từ khóa của bạn có thường xuyên xuất hiện trong trang chủ của bạn đến mấy đi nữa. Viết các blog có post các nội dung kích thích. Tạo copy thú vị cho hàng hóa thuộc hạng mục của bạn. Gồm có cả ảnh và video trên các trang. Thực hiện bất cứ thứ gì bạn có thể tự thiết lập từ hàng triệu Website khác trên Web.

Không để SEO đi theo một lối mòn cố định

Phần cuối cùng dành cho lời khuyên của Fishkin: “SEO chưa bao giờ phải tính đến kinh nghiệm hoặc khả năng sử dụng của người dùng. Những gì là tốt cho người dùng sẽ luôn là cách tốt nhất cho các engine, chính vì vậy việc xây dựng Web site tốt nhất trong khả năng của bạn – với nội dung tốt nhất, thiết kế tốt nhất và kiến trúc tốt nhất – sẽ mang đến cho bạn sự thành công trong việc xếp thứ hạng của search engine. Hãy bảo đảm rằng bất cứ thứ gì bạn xây dựng, search engine đều có thể truy cập một cách dễ dàng và khi đó thành công sẽ đến với bạn.”

Tôi nên làm gì đây? buồn quá!!!!!!!!!!!!!!!!!!!!!!!!!!!

Chúng tôi quen nhau từ những ngày đầu tiên bước lên giảng đường đại học.Nhớ những ngày đầu tiên đó thật ngây thơ với tôi.Tôi nhìn ngôi trường mới, bạn bè mới trong lớp với ánh mắt tò mò và tìm hiểu họ như thế nào.Năm đó tôi được làm lớp trưởng nhiệm vụ của lớp trưởng trong những ngày đầu năm học là điểm danh lớp.Trong lớp tôi có tên bạn nữ kia rất dễ nhớ đó lên của một ca sĩ rất nổi tiếng lúc bây giờ nên chỉ đọc qua vài lần là tôi có thể nhớ mặt và nhớ tên ngay.
Sau khi nhớ mặt rồi thì t không điểm danh nữa và bạn đó nhắc tôi:"còn tôi sao bạn chưa điểm danh" lúc đó tôi cũng không để ý lời nói đó chỉ trả lời là "tôi thấy bạn rồi nên không điểm danh". Nhưng có ai ngờ chính câu hỏi đó đã đưa tôi đến một mối tình với cô ấy nhưng chỉ là mối tình đơn phương thôi.
Sau đó vài ngày cô ấy bắt đầu nói chuyện với tôi và rủ tôi đi ăn kem.Lúc đó tôi mới dám nói chuyện với cô ấy.lúc mới lên tôi nhác lắm đâu dám nói chuyện với nữ đâu.Sau khi tiếp xúc với cô ấy một vài lần thì tôi đã yêu cô ấy từ lúc nào không hay nữa.
Cô ấy là một cô gái rất có cá tính và trông rất dễ thương.Sau đó tôi bắt đầu chủ động tiếp xúc với cô ấy.Chúng tôi cùng học bài, làm bài tập chung rất vui, tôi cũng thường rủ cô ấy đi uống nước đi ăn kem, một vài lần đầu thì cô ấy đồng ý sau đó cô ấy từ chối không nhận lời mời của tôi nữa.lúc đó tôi chỉ nghĩ là có thể cô ấy là nữ nên chãnh một tí mình chỉ cần kiên nhẫn thì sẽ được.
Cũng vì suy nghĩ như vậy mà suốt học kỳ 1 tôi đeo đuổi cô ấy bằng cách cùng cô ấy học bài, làm bài tập và không quên tranh thủ những lúc cô ấy vui để nói lên suy nghĩ của mình.Nhưng tôi đã thất bại, cô ấy vẫn không có gì thay đổi về tình cảm đối với tôi so với lúc đầu.
Bước qua học kỳ hai tôi thấy cứ bày tỏ một cách thầm lặng như vậy không hiệu quả và vào một ngày đẹp trời nọ tôi đã bày tỏ tình cảm thật lòng với cô ấy và kết quả tôi nhận được thật buồn.Cô ấy từ chối tôi không một phút suy nghĩ.Cô ấy nói tôi và cô ấy có rất nhiều điểm không hợp nhau nên không thể có tính cảm được.Lúc đó tôi buồn và quê lắm vì lần đầu tiên mình bày tỏ tình cảm mà bị từ chối như vậy.Hôm đó tôi ở lại phòng cô ấy rất lâu tôi cố gắng giải thích cho cô ấy hiểu là tôi yêu cô ấy thật lòng.Nhưng cũng vô vọng.Thế là tôi đành ra về trong nỗi buồn vô tận!!!!!!!!!!!!!!!!!


Tuy cô ấy không hề có tình cảm với tôi những giữa chúng tôi phân chia rất rõ ràng giữa học tập và tình cảm.Tuy cô ấy từ chối tình cảm của tôi nhưng chúng tôi vẫn hợp tác học với nhau bình thường mà hok hề bị ảnh hưởng bởi tình cảm.Có thể đây là đều an ủi lớn nhất với tôi!!!!!!!!
Chúng tôi hợp tác nhau trong học tập ngày càng chặt chẽ hơn.Đồ án môn học, đề tài nào tôi cũng làm chung với cô ấy và trong những lúc làm chung như vậy tôi vẫn cố gắng thể hiện tình cảm của mình và hy vọng thời gian dài trôi qua cô ấy sẽ hiểu dần tình cảm của tôi.
Chúng tôi đã trải qua 7 học kỳ trong tình trạng như thế.Cô ấy vẫn chưa có bạn trai, tôi thì không quen cô gái nào khác cô ấy.Tôi vẫn luôn chờ đợi cô ấy chờ đến khi nào cô ấy hiểu là tôi yêu cô ấy thật sự và trên thế gian này không có ai yêu cô ấy nhiều hơn tôi.
Chúng tôi chỉ còn vài tháng nữa là tốt nghiệp rồi.Tôi không muốn khi ra trường rồi tôi lại mất tất cả mất luôn cô ấy vì ra trường rồi mỗi người một nơi với tình cảm bạn bè tôi không thể giữ chân cô ấy ở bên tôi được.Gần đây tôi thường bày tỏ tình cảm với cô ấy một cách gián tiếp qua những dòng tin nhắn, những câu chuyện về tượng lại.tôi không dám nói yêu cô ấy vì tôi sợ cô ấy lại từ chối tôi một lần nữa.tôi không thể chấp nhận thất bại lần thứ hai và cũng là lần cuối cùng này được.
Chúng tôi sẽ làm luận văn chung do đó tôi không muốn vì chuyện tình cảm mà bỏ dỡ công việc làm LVTN.
Chúng tôi hàng ngày đều đi học chung, làm đề tài chung.mấy thằng bạn tôi bảo tôi " sao mày không thử bỏ rơi nó(cô ấy) một khoảng thời gian thử xem nó có nhớ mày hok" nhưng tôi làm hok được.tôi không có can đảm để thử như vậy.Tôi sợ tôi sẽ mất cô ấy.
Chẳng lẽ tình yêu đơn phương lại có kết quả như vậy sao?