Thứ Hai, 28 tháng 12, 2009

Bánh Bèo Kon Tum


Cũng là hạt gao, nhưng dân mỗi miền lại có một cách thưởng thức khác nhau.Ra Hà Nội 5 năm càng ngày mình càng nhớ quay nhớ quắt những món ăn được chế biến từ hạt gạo của Kontum. Nói kontum là vì niềm tự hào tỉnh nhà chứ thực ra sự phong phú trong món ăn chế biến từ gạo là từ miền trung bao gồm nhiều tỉnh, rồi theo dân di cư du nhập lên Tây Nguyên lên Kon Tum.Rồi từ đó, người đầu bếp Kontum trên căn bản công thức và cách thức của miền xuôi, cộng thêm nắng thêm gió và mưa của tây nguyên mà nấu ra nhưng món bánh mang thương hiệu Kontum.Món bánh bèo sẽ mở đầu một series nhiều episodes về món bánh.

Bánh bèo trên căn bản là từ hạt gao, đem ngâm, xay với nước và rồi cái thứ bôt nước ấy cho vào cái bát con,loại bát chuyên dung để ăn bánh bèo(xem ảnh), hấp lên thế là xong.Híc nhưng cái ngon của nó không nằm ở đấy mà nằm ở nhân bánh bèo và nước chấm.Nhân thì có dăm ba loại.

Ngày bé, khi xuất ăn sáng đâu chỉ 1000vnd,thì mình đã có ngay 3 chiếc bánh bèo nhân hẹ phi với dầuvà một bát nước chấm thật ngon..Dân bắc ít biết cây hẹ, nó y chang cây hành nhưng bé hơn, trong nam ăn nhiều và đặc trưng nhất là ăn với bánh hỏi (loại bánh này sẽ có một chuyên đề sau).Bây giờ tìm bánh bèo nhân hẹ ở Kontum cũng hiếm.Còn hai loại nhân phổ biến hơn là bánh bèo nhân tôm và bánh bèo nhân lạc.Nói bánh bèo nhân lạc không thì không chính xác, phải là bánh bèo nhân lạc giã nát trộn với hẹ tươi phi dầu.Chà, ai cũng biết bột gạo hấp thì nó đơn sơ mộc mạc như thế nào nhưng mà khi ăn thứ bột gạo hấp ấy cùng với lạc và hẹ thì nó lại thành ra thứ quà vặt vô cùng hấp dẫn và không cuỡng lại được.Vị mềm mát của gạo,bùi dòn ngậy của lạc và hương thơm dịu của hẹ phi…thêm bát nước châm pha đúng cách ngon bá cháy.ĂN hoài mà không thấy chán.

Loại bánh bèo này có thể tìm thấy trên Đường Phan Chu Trinh của thị xã Kontum.

Tiếp đến là bánh bèo nhân tôm.

Mónnày dễ tưởng tượng hơn, ai vào Huế ăn bánh bèo Huế thì món bánh bèo nhân tôm ở Kontum cũng y chang.Ở HN cũng có thể kiếm bánh bèo nhân tôm ở quán Huế Ngự Bình trên đường Láng, chỉ có khác bánh bèo ở ngự bính be bé, xinh xinh,còn bánh bèo chuẩn ỏ Kontum thì to vừa bằng cái đáy bát ăn cơm. Có thể dùng bát ăn cơm đề hấp bánh bèo nhưng nó khó chín thôi . Đặc biệt ở chỗ bánh bèo nhân tôm ở Kontum nó là bánh bèo nóng,vừa thổi vừa ăn.Hàng ăn có một nồi hấp ngay cạnh,khi có khách gọi thì mới lấy từ nồi hấp ra, cho nhân tôm vào và thực khách cứ như thế cầm luôn cái bát con chuyên dụng hấp bánh bèo cho nước mắm luôn vào cái bát ấy mà nhấm nháp từng miếng con con cho nóng sốt.

Thế là đã có 3 loại bánh bèo,nếu theo cách vi von mon ngô luộc, ngô chiên và ngô nướng của ông Vũ Bằng thì bánh bèo hẹ phi là cô thôn nữ mộc mạc nhưng và dề gần,bánh bèo lạc rang quyến rũ khác thường , còn món bánh bèo tôm nóng khi ăn vào như cảm giac như gặp được người tri âm.Hàng bánh bèo tôm nóng có thể tìm thấy trên đuờng …đường gỉ nhỉ? Mà cũng đâu cần nhớ tên đường, chỉ cần bạn đặt chân đến Kontum rùi hỏi bất kì ai trong thị xã đường đến quán bánh bèo nóng thì bạn sẽ được toại nguyện. Theo trí nhớ của mình hàng bánh này đến bảng hiệu còn không có, tên Quán bánh bèo nóng là tên mà các thực khách hay đến đây đặt cho và hình như chủ quán cũng chẳng có ýđịnh mất công ngồi nghĩ ra một cái tên nữa cho quán của mình.

http://www.touristvina.com/index.php?option=com_content&view=article&id=2606:m-thc-banh-beo-kon-tum&catid=97:am-thc-kontum&Itemid=450

Chủ Nhật, 27 tháng 12, 2009

Sưu tầm

Web App
1. http://g.ho.st/
- virtual computer on web

2. http://www.eyeos.org/
- http://eyeos.org/en/downloads
- The Open Source Cloud's Web Desktop

Editor on linux
1. http://www.activestate.com/komodo_edit/features/
- Soạn thảo PHP on linux

2. http://blog.sucmanhtinhoc.vn/?p=328
Soạn thảo mã nguồn trên Ubuntu với gPHPEdit

Thứ Ba, 22 tháng 12, 2009

Giải nén file bằng lệnh!

http://www.nhan.vn/foss/2009/11/16/gi%e1%ba%a3i-nen-file-b%e1%ba%b1ng-l%e1%bb%87nh/


Có khá nhiều định dạng nén, nếu dùng Nautilus đơn giản bạn chỉ cần nhấp phải chọn Extract (có thể nhiều distro nó đặt tên khác) là được, nhưng nếu sử dụng dòng lệnh thì thế nào? Khá nhiều tùy chọn cho mỗi định dạng nén, giờ ta gom nó lại bằng bash để sử dụng gọn hơn:

extract ()
{
while (( $# ))
do
if [[ -f $1 ]] ; then
case $1 in
*.tar.bz2) tar xjf $1 ;;
*.tar.gz) tar xzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) rar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xf $1 ;;
*.tbz2) tar xjf $1 ;;
*.tgz) tar xzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z e $1 ;;
*.deb) dpkg-deb --extract $1 . ;;
*) echo "'$1' cannot be extracted via extract()" ;;
esac
else
echo "'$1' is not a valid file"
fi
shift
done
}

Cho đoạn code trên vào file .bashrc
Cách sử dụng:

extract file1 file2 .....

Cài đặt các chương trình nén và giải nén dữ liệu

http://www.nhan.vn/foss/2009/12/13/cai-d%e1%ba%b7t-cac-nen-va-gi%e1%ba%a3i-nen-d%e1%bb%af-li%e1%bb%87u/


Đối với hệ thống Linux, các định dạng sau đây được hỗ trợ mặc định:

tar, gz, bz, bz2

Tuy nhiên, trên các hệ thống khác như Windows, còn có zip, 7zip, rar… Để hiểu được các định dạng này, bạn phải cài thêm các phần mềm sau:

# sudo apt-get install p7zip-full

# sudo apt-get install rar

Như vậy là bạn đã có đủ đồ chơi với mọi loại dữ liệu nén có dạng như: 7z, zip, rar,tar, gz, bz, exe…

Chạy ứng dụng Windows trên Ubuntu

http://www.nhan.vn/foss/2009/12/18/ch%e1%ba%a1y-%e1%bb%a9ng-d%e1%bb%a5ng-windows-tren-ubuntu/

Đơn giản.

1. Applications -> Accessories -> Terminal

2. sudo wget http://deb.playonlinux.com/playonlinux_karmic.list -O /etc/apt/sources.list.d/playonlinux.list

3. sudo apt-get update

4. sudo apt-get install playonlinux

Cài xong, PlayonLinux nằm trong Applications –> Games

Bạn vào trong đó, chọn những phần mềm nào khoái để cài.

Tham khảo thêm chỗ nầy: http://www.playonlinux.com/en/download.html

Chúc thành công!

Cài đặt MySQL, Apache, PHP & phpMyadmin

http://www.nhan.vn/foss/2009/12/20/cai-d%e1%ba%b7t-mysql-apache-php-phpmyadmin/

Ngoài một số bộ đóng gói sẵn như XAMPP, chúng ta có thể cài đặt từng gói một. Cách này tương đối hay vì nó sẽ cho phép lưu dữ liêu HTML và MySQL theo cách chung của Linux server.

Bạn hãy làm theo các bước đơn giản sau:

1. Cài đặt MySQL:

sudo apt-get install mysql-server mysql-client

2. Cài đặt Apache2

sudo apt-get install apache2

Cài xong, bạn thử bằng cách vào http://localhost hoặc số IP của máy. Nó sẽ ra một thứ tương tự như sau:

3. Cài đặt PHP5

sudo apt-get install php5 libapache2-mod-php5

4. Cài đặt PHPMyAdmin

sudo apt-get install phpmyadmin

Nếu không siêng lắm, bạn có thể gom chung các lệnh trên vào một như sau:

sudo apt-get install mysql-server mysql-client apache2 php5 libapache2-mod-php5 phpmyadmin

B. Sau khi cài xong

Bạn có thể đưa dữ liệu vào các thư mục sau:

1. Dữ liệu HTML và mã nguồn PHP:

/var/www/

2. Dữ liệu Database:

/var/lib/mysql/

3. Chỉnh php.ini (dùng mc để xem tập tin và chỉnh là phương pháp dễ nhất) khi cần thiết:

/etc/php5/apache2/php.ini

4. Chạy phpmyadmin:

http://localhost/phpmyadmin và nhập vào user và password.

Bài này được lược dịch từ đây: http://www.howtoforge.com/installing-apache2-with-php5-and-mysql-support-on-ubuntu-9.10-lamp

Thắc mắc, đóng góp, chê cười… vui lòng gửi về foss@nhan.vn

Chúc các bạn thành công!

Thân!

plugin lấy giá vàng từ Tuổi trẻ Online

< ?php
/*
CREATE TABLE IF NOT EXISTS `mk_giavang` (
`code` char(5) NOT NULL,
`name` char(25) NOT NULL,
`buy` char(10) NOT NULL,
`transfer` char(10) NOT NULL,
`sell` char(10) NOT NULL,
`date_create` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
*/

function giavang() {

$ci = &get_instance();
$time = time();
$ci->load->database();

$row = $ci->db->limit(1)->get('giavang')->row_array();
if(!$row || $row['date_create']<($time-3600)) { if($data = get_giavang()) { $ci->db->empty_table('giavang');

foreach($data as $row)
{
$ci->db->insert('giavang', $row);
}
}
else if($row){
return $ci->db->get('giavang')->result_array();
}
}

return $ci->db->get('giavang')->result_array();

}

function get_giavang()
{
$data = array();
$time = time();

if(!$content = file_get_contents('http://www3.tuoitre.com.vn/transweb/giavang.htm'))
return $data;

$content = substr($content, strpos($content, ''));
$text = trim(substr($content, 0, strpos($content, '
')+8));

$xml = simplexml_load_string($text);
foreach($xml as $a=>$b){
$row['code'] = trim((string)$b->td[0]);
$row['buy'] = trim((string)$b->td[1]);
$row['sell'] = trim((string)$b->td[2]);
$row['date_create'] = $time;
$data[] = $row;
}

unset($data[0]);

return $data;
}

Thứ Sáu, 18 tháng 12, 2009

Upload large file size

.htaccess
php_value upload_max_filesize 100M
php_value max_execution_time 800
php_value post_max_size 100M
php_value max_input_time 100
php_value memory_limit 120M

.php
ini_set('post_max_size', 128M);

Thứ Năm, 17 tháng 12, 2009

include() with JavaScript

http://www.blogger.com/post-create.g?blogID=6926476941115672672

< type="text/javascript">

function include(file) {
if (document.createElement && document.getElementsByTagName) {
var head = document.getElementsByTagName('head')[0];

var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', file);

head.appendChild(script);
} else {
alert('Your browser can\'t deal with the DOM standard. That means it\'s old. Go fix it!');
}
}

< /script>

To include included.js with the above code just use:

< type="text/javascript">

include('included.js');

< /script>

Thứ Hai, 7 tháng 12, 2009

OpenDNS & Google DNS

Lâu nay dùng OpenDNS đã sướng rồi. Nay có thêm chú Google DNS còn ngon hơn.

OpenDNS:

208.67.222.222
208.67.220.220

Google DNS:

8.8.8.8

8.8.4.4

Quá gấu! Chạy nhanh hơn OpenDNS, không bị quảng cáo khi gõ sai địa chỉ web.

Đăng nhập nhiều tài khoản GUI vào Ubuntu

Hổm rày cứ loay hoay tìm cách đăng nhập cùng một lúc nhiều tài khoản vào hệ thống Ubuntu với giao diện đồ họa (Gnome). Mò mẫm từ Remote Desktop Viewer, Grdc (Remote Desktop client), Gnome-RDP, VNC viewer… mà vẫn không phải là thứ cần dùng.

Tối hôm qua, lang thang trên Google, tìm ra được giải pháp cực hay, cực dễ.

1. Bước 1 – Cài đặt OpenSSH server.
# sudo apt-get isntall openssh-server

2. Bước 2 – Cài đặt FreeNX:
2.a. # sudo add-apt-repository ppa:freenx-team
2.b. # sudo apt-get update
2.c. # sudo apt-get install freenx

3. Bước 3 – Cấu hình FreeNX:
# sudo /usr/lib/nx/nxsetup –install

4. Bước 4 – - Tạo tài khoản.
Bước này nói thêm thôi chứ cũng dư. Vì tạo thêm tài khoản thì ai mà không biết và nếu không tạo thêm thì làm sao mà dùng cho nhiều người.

5. Bước 5 – Cài đặt phần client cho những máy nhánh (trạm):
Bạn vào http://www.nomachine.com/select-package-client.php để tải NXclient về máy và cài vào máy. Sau khi cài xong, nó sẽ năm trong Applications – Internet.

Bạn có thể dùng FreeNX được rồi đó.

Thứ Ba, 17 tháng 11, 2009

Bảy kỳ quan

Một nhóm học sinh đang học cách viết luận về chủ đề 7 kỳ quan thế giới. Cuối giờ mỗi em phải liệt kê được 7 kỳ quan theo suy nghĩ của riêng mình. Học sinh ngồi ríu rít bàn bạc rằng những công trình nào nên là kỳ quan thế giới. Tháp nghiêng Pisa, Kim tự tháp Ai Cập... đều được chọn lựa.
Cuối giờ khi thu bài, một cô bé băn khoăn cầm bài viết để trắng. Cô bé giải thích:
- Em vẫn chưa liệt kê xong vì có nhiều kỳ quan quá ạ!
- Em hãy kể những kỳ quan theo ý em để các bạn và cô xem có thể giúp em được không? Cô giáo nhiệt tình hướng dẫn.
Cô bé do dự:
- Em nghĩ bảy kỳ quan thế giới nên là: xúc giác, vị giác, thị giác, thính giác, khả năng đi lại được, nụ cười và sự yêu thương.
Bạn thân mến, bạn không phản đối cô bạn nhỏ của chúng ta chứ? Thật vậy, chúng ta vẫn có thể sống vui nếu không có tháp nghiêng Pisa, không có tháp Ep-phen và Kim tự tháp Ai Cập... nhưng chúng ta sẽ khó khăn biết bao nếu thiếu một trong bảy kỳ quan của cuộc sống mà cô bạn đã kể. Hơn nữa, nhiều tỷ người trên trái đất mới có một kỳ quan kiểu như Kim tự tháp, trong khi mỗi người chúng ta lại có cho riêng mình những bảy kỳ quan. Chúng ta thật giàu có biết bao. Đó mới chính là những kỳ quan chúng ta cần yêu quý và trân trọng nhất
(Hãy nắm lấy tay tôi - Tủ sách hành trang vào đời - NXBVHTT)

Thứ Ba, 10 tháng 11, 2009

Lỡ tay chạm ngực con gái

Giới thiệu về nội dung:

Và tôi hôn...
Và tôi cởi lại toàn bộ những vải vóc của chị, và của tôi...
Trong lòng tôi chỉ còn một ý nghĩ đau đớn: Tôi nhất định phải có được chị ấy!
Tôi nhất định phải có được chị ấy! Tôi nhất định phải có được chị ấy!
Cho dù chị ấy sắp rời bỏ tôi mà đi, tôi nhất định phải có được chị ấy!
Và tôi bắt đầu hôn triền miên...

Oni viết “Lỡ tay chạm ngực con gái” trên mạng nội bộ PTT của trường Đại học Đạm Giang (Đài Loan) vào mùa hè năm 2006, khi đó, Oni đã sắp bước vào năm thứ tư đại học và câu chuyện trong “Lỡ tay chạm ngực con gái” đã kết thúc, để lại một kỷ niệm luyến tiếc và khao khát về cuộc sống.

Ban đầu, “Lỡ tay chạm ngực con gái” được tác giả post lên trang sex của mạng PTT nội bộ. Mục đích của tác giả cũng chỉ đơn thuần là chia sẻ một kinh nghiệm về sex với các sinh viên khác. Vì vậy, Oni chọn phân loại bài viết là “sex” cùng một cái tên khiêu khích dung tục “Lỡ đụng phải ngực của sinh viên nữ”.

Không ngờ, sau bài viết đó, người đọc rất hiếu kỳ thắc mắc kết thúc của “Lỡ tay…” là gì? Sau khi “lỡ tay” hai người đã ra sao? Oni bất đắc dĩ phải kể tiếp câu chuyện tình yêu sinh viên của mình, và từ đó, câu chuyện lỡ tay hoàn toàn thoát ra khỏi cái vỏ sex của nó, lý giải được những tình huống gợi dục của nó để đạt tới một giá trị nhân văn, rất đời và rất người nên rất buồn.

Trong bản chuyển ngữ này, các nhân vật dùng sex để giao tiếp, dùng cảm nhận về sex để hiểu nhau, yêu nhau, giữ nhau, và dùng sex để biểu đạt sự đau đớn thất vọng. Tuy nhiên, bạn đọc có lẽ sẽ khấp khởi mãi vì tưởng cái chữ sex mà mình hiểu, hình như nó chỉ đến câu sau là diễn ra thôi, chờ ở câu sau, câu sau rồi câu sau nữa, chờ mãi nhưng...

Truyện hấp dẫn bởi tính chân thật của câu chuyện và sự tường thuật cảm xúc một cách rất chân tình của tác giả. Những miêu tả về tâm lý nam giới trước các ám thị về tính dục rất thật.

“Lỡ tay chạm ngực con gái” được viết online thu hút hàng nghìn bạn trẻ theo dõi đồng thời, khiến mạng PTT gần như bùng nổ sôi sục. Thực tế không chỉ nội dung bài viết thú vị, những comments của bạn đọc kèm theo cũng vô cùng hấp dẫn. Người đọc cãi cọ trong khi Oni viết, chửi tác giả và nịnh tác giả, đấu khẩu với nhau, suy đoán các tình huống, có người ra rả miệt thị trò câu khách rẻ tiền của người viết nhưng đồng thời vẫn say sưa ôm máy tính nuốt từng chữ của “Lỡ tay chạm ngực con gái” v.v… Sự tương tác giữa người viết và độc giả mạng thú vị tới mức, sau này khi chuyển đăng loạt bài viết của Oni, tất cả các website đều đồng thời đăng kèm hàng vạn comments của bạn đọc gửi lên trong thời gian tác phẩm được viết online.

Trong truyện có nhân vật David đi xe Fiat, sau khi đọc “Lỡ tay…”, những nick trên mạng chỉ cần tình cờ có chữ David và Fiat, đều bị cư dân mạng gửi thư chửi bới, bị ném đá. Tác giả Oni đã từng phải đứng ra xin lỗi những nick bị chửi oan, chỉ vì bị cư dân mạng đoán có thể là nick của David trong “Lỡ tay chạm ngực…”

“Lỡ tay chạm ngực con gái” là một điển hình của văn học mạng, nơi bạn đọc quyết định tác phẩm chứ không phải người viết có quyền đó. Bạn đọc chán, truyện ngắn hay những tiểu luận của bạn chả ai copy về xem, bạn đọc muốn, một cái "lỡ tay chạm ngực bạn gái" sẽ phải kéo dài ra, có thể trở thành một câu chuyện kinh điển khắp các mạng.
(Theo www.saharavn.com)

Lỡ tay chạm ngực con gái- Trang Hạ dịch


Lỡ tay chạm ngực con gái (1)

Có lẽ rất nhiều người đã gặp phải trường hợp này
đang nói chuyện với bạn
vô ý tay vung phải ngực cô đứng đằng trước hay bên cạnh
nói chung thì có thể tha thứ được, ai chả biết mình ko cố tình.

Chuyện xảy ra thế này ~_~y-~~~
bốn năm trước tôi mới vào đại học, tham gia nhóm hoạt động ngoại khoá của khoa
đó là vì các chị khoá trên… dụ dỗ ~~~
mà trong đó có một chị vô cùng xinh
đúng loại gái tớ thích
tuy ngực chị này chỉ cỡ B thui (cup B)
tôi nghĩ, vào nhóm hoạt động ngoại khoá có cơ hội tiếp cận người đẹp này
tuần thứ 2 sau ngày nhập học, các chị khoá trên đang chuẩn bị buổi lễ đón tiếp sinh viên mới
mọi người đang họp trong văn phòng khoa về việc tổ chức kế hoạch hoạt động
tôi cố ý nói cũng sẽ đến giúp
cho nên hôm đó chỉ có mỗi tôi là sinh viên năm 1
thảo luận cả buổi chiều
tôi thấy nhạt phèo.

Hôm đó, chị ấy mặc một cái áo bó sát người màu be và váy bò ngắn
làm nét ngực nhìn rõ
trời… ngồi bên cạnh chị ấy
Đúng ở vị trí có thể thấy rõ ràng bộ ngực
Mà chị ấy lại mặc chiếc váy ngắn…
tôi sợ nếu nhìn chị ấy chăm chú, chị ấy phát hiện thì mất mặt lắm
nên cứ ngắm chút ngắm chút
thế mà mấy lần vẫn bắt gặp chị ấy nhìn tôi cười
làm tôi xấu hổ…
thảo luận xong thì phân tổ 4 người, mỗi tổ phải nhận một tiết mục
May mắn làm sao, tôi lại ở trong tổ của chị ấy
Siêu vui sướng!!!
tổ có tôi, chị ấy, 2 chị lo hậu cần
Không ngờ còn có việc khiến tôi bất ngờ hơn
Hai chị hậu cần bảo, 2 chị bây giờ phải đi chợ mua thực phẩm cho ngày mai đã
vì thế chỉ còn tôi và chị ấy ở lại tập tiết mục

Chúng tôi đi vào vị trí ngày mai
là một góc phòng học
rồi tập một trò chơi tập thể nhàm chán
thổi một quả bóng bàn bay ra khỏi cái cốc chứa toàn bột mì =.=
chúng tôi tập 10 phút
nói thật là vì chị ấy cầm cốc quá sâu
tôi thổi mãi chả được
chị ấy bảo: để chị thổi xem nào, có khi chị thổi được
hồi đó tôi mới vào đại học, chả hiểu gì việc đời
chứ nếu bây giờ mà nghe câu đó, phải có đến 20% là nghĩ…đến việc...thổi kia
và 80% còn lại là… bị ăn tát, ha ha
rồi chị ấy thổi mãi cũng chả được
tức mình liền dùng sức thổi mạnh 1 cái
những ai chơi trò này rồi đều biết
nếu thổi mạnh, bóng không bay mà bột mì bay mù mịt trắng phớ mặt
tôi vội vã vớ chai nước suối giúp chị ấy rửa mặt
khi chị ấy rửa mặt, nước bò từ mặt xuống cổ
rồi lẳng lặng thấm ướt ngực áo…
chiếc áo màu be càng bó sát người hơn
thấp thoáng thấy được cả một chút thêu ở rìa áo lót
tôi xấu hổ kinh khủng vội quay mặt sang phía khác
chị ấy có lẽ phát hiện ra tôi có vẻ là lạ
liền sát tới hỏi tôi, em làm sao thế?
Tôi vội vã liền…

Lỡ tay chạm ngực con gái (2)

Áo chị ấy ướt một mảng ngực nhỏ
phần ướt làm chiếc áo bó bày tỏ ra một khoảng ngực đẹp tuyệt
tôi nhìn thấy thì quá… sợ, vừa xấu hổ vừa muốn nhìn thêm
nhưng lại sợ chị ấy phát hiện, tôi mới vội vã quay phắt đầu sang 1 phía
chị ấy rửa mặt xong, không phát hiện ra áo bị ướt một khoảng
mà chỉ phát hiện ra tôi đang lúng túng
chị ấy tiến đến hỏi tôi, em làm sao thế?
Tôi bảo không sao, em không sao ạ, nhưng tôi vẫn không dám quay mặt lại
chị ấy bèn kéo tay tôi hỏi em làm sao thế hả? em khó ở à?
Tôi bất ngờ bị nắm cánh tay thì… giật thót mình
vội vã giằng ra khỏi cái nắm tay của chị ấy…
và cái giằng ấy làm tay tôi đập vào ngực chị ấy
tôi chỉ cảm thấy ướt và mềm mềm, hơi đàn hồi…
tôi sợ hãi rụt tay vào
khi ấy, một sự im lặng tuyệt đối
đầu óc tôi trống rống...
nghĩ thầm, thôi chết tôi rồi, chạm phải ngực của chị khoá trên rồi
vừa mới lên đại học, đã gặp phải sự cố này rồi
nếu chị ấy cho rằng tôi là yêu râu xanh, chuyện này lọt ra ngoài
sau này tôi…biết sống ra sao?
rồi tôi nghĩ đến việc chị ấy có thể gọi cảnh sát tới bắt tôi nữa
tôi càng nghĩ càng… hình dung ra những khả năng đáng sợ nhất…
chị ấy chạm nhẹ vào vai tôi
tôi quay hẳn lưng lại phía chị ấy, chị ấy bảo: “Xin lỗi, chị không cố ý”
tôi sững cả người, quay lại nhìn chị ấy nghi ngờ
chị ấy: “Chị vừa kéo tay làm em giật mình sợ à?”
thế mà tôi cứ tưởng chị ấy sẽ trách việc tôi vừa… chạm phải ngực
chị ấy vẫn chưa phát hiện ra hay chị ấy đang nói lảng đi cho đỡ ngượng?...
tôi càng lúc càng lo lắng
làm sao mà tự dưng lại buột mồm: “Xin lỗi, lúc nãy không phải em cố ý giằng tay ra”
chị ấy bảo: “Có gì đâu…”
tôi bảo: “Lúc nãy em vô tình chạm phải ngực chị, em xin lỗi”
chị ấy: “Hả???????????????” cúi đầu nhìn xuống áo, thấy áo trong suốt
bây giờ mới phát hiện ra, vội vã quay quay người đi giấu.
Tôi lúng túng mở ba lô của tôi
tìm xem có giấy ăn không để đưa chị ấy
tìm mãi chả thấy

Tôi bảo chị ấy, em đi toa-lét mua gói giấy lau áo

chị ấy im lặng...
Tôi nghĩ, chết mẹ tôi không cơ chứ, lúc nãy chị ấy không biết thì thôi, sao lại tự dưng lạy ông con ở bụi này
Chạy vội ra toa-lét
Điên, đến nơi mới nghĩ ra là quên không mang tiền
lại chạy vào phòng học lấy ví
gặp mắt chị ấy, tôi ngượng bảo “Em quên lấy tiền xu”
Chị ấy bỗng cười…
Chị ấy cười đẹp cực, làm tôi hơi xao xuyến
chị đi tới vỗ vai tôi: “Đi nào, chị có tiền”
Thế là… hai chúng tôi cùng đi vào toa-lét!
Sau, chị ấy sửa sang xong, đi ra
Chúng tôi quay về phòng học lấy đồ rồi lên Văn phòng khoa
Ai ngờ, văn phòng khoa đã khoá cửa
mà áo và chìa khoá nhà của chị ấy đều để trong văn phòng rồi
Tôi lúc ấy chả biết làm thế nào
Chị ấy hỏi tôi có xe không?
Tôi gật đầu
Thế thì chúng ta đi dạo tí đi, muộn một chút quay về xem có ai không
Tôi vừa đến Cao Hùng, chỗ nào cũng lạ
Chị ấy bảo, thế để chị đưa em đi giới thiệu Cao Hùng nhé
Tôi lái xe theo chỉ dẫn của chị
Lúc đi đường rất ít nói chuyện, vì chúng tôi không thân, lại chả có đề tài gì
Tôi nghĩ mãi có nên mở lời trước không
Nhưng mà, vừa nãy đụng vào ngực người ta, ngại quá
Ai dám mở mồm?
Chúng tôi cứ đi như thế đến tận Đại học Trung Sơn
Tôi dắt xe lên phà
hù…


Thế thôi, tôi vốn ban đầu chỉ định kể lại chuyện, tôi đã vô ý chạm phải ngực con gái thế nào thôi
ngực thì…đã chạm rồi
câu chuyện đến đây là hết!


(Xin lỗi bà con thì đấy, ngực thì đã chạm rồi chuyện hết rồi
còn lại... chỉ là mối tình đầu của tôi những năm đại học)


(Trang Hạ dịch)

"Ai mun xem thi down ve xem http://www.mediafire.com/?zvkki3z4thn. Bây giờ 360 dẹp blog rùi, chả bít link tới đâu đây, sorry dịch giả Trang Hạ 1 cái nha."

Nghiện thuốc lá

Nghiện thuốc lá suốt nhiều năm, anh không tài nào bỏ được. Chỉ còn cách giấu người yêu hút vụng trộm. Cô đành bỏ qua, vờ như không biết người yêuvẫn lén lút "hôn môi" với những chiếc đầu lọc thuốc lá.
Có lúc bực quá, cô cũng cằn nhằn:
- Hút thuốc lá ngon không? - Cô nhíu mày hỏi.
- Không ngon lành gì cả, nhưng không thể không hút.
- Em và thuốc lá, anh chọn ai?
- Cả hai. Em có cằn nhằn anh thì anh cũng không thể ngừng yêu em.
Cònnhớ hồi mới quen nhau, anh hút thuốc nhiều kinh khủng. Cứ rảnh ngón tayra là lại thấy điếu thuốc kẹp giữa ngón trỏ và ngón giữa. Lúc thức đêmviết báo cáo thì càng khỏi nói, hút như đang tham gia cuộc thi hútthuốc lá nào đó. Cô thường ngạt thở, rát họng vì khói thuốc của ngườiyêu.
Sau khi yêu nhau, anh mới bắt đầu bớt dần thuốc lá, nhữnglúc vui vẻ ngồi quán với bạn bè, thường lẻn ra ngoài toa-lét một lúcchâm điếu thuốc rồi vào ngay. Có lần vẫn bị bắt quả tang khi ai cũngngửi thấy trên người anh mùi thuốc lá trộn với mùi nước hoa và nướctiểu của toa-lét công cộng, họ khẽ nhăn mặt.
Lần ấy, cô giận người yêu ghê lắm, cãi nhau to, chiến tranh lạnh suốt mấy ngày.
Cótối trời đẹp, trăng sao sáng lấp lánh, hai người bên nhau tận hưởngnhững giây phút lãng mạn của tình yêu, cô ngả vào lòng anh rồi... imbặt.
Anh cúi đầu xuống hỏi:
- Sao em tự dưng im ắng thế?
- Lúc nãy anh vừa hút thuốc lá à?
- Anh... à ừ... - Anh ấp úng.
Cô lập tức đẩy anh ra, đứng lánh sang một bên.
- Có một điếu thôi mà... anh không nói dối em! - Anh khổ sở cầu hoà.
- Sao anh không thể vì em mà bỏ thuốc lá đi? - Cô giận dỗi, và xen lẫn cả thất vọng.
- Em hãy cho anh một thời gian nữa được không?
- Em chỉ muốn tốt cho anh thôi, anh có biết không hả?
Kỷniệm ba năm yêu nhau, họ hẹn nhau ra bãi biển kỷ niệm. Trên xe ô tô,bất ngờ cô sờ tay thấy một bao thuốc hút dở dưới khe ghế ngồi.
Côkhông giận, như thể đã quen với việc ấy, nhưng cô giữ luôn bao thuốc.Anh sợ hãi nhìn người yêu, cô không có ý định trả bao thuốc cho anh.
- Anh hứa với em đi, anh hút nốt ba điếu cuối cùng trong bao thuốc này, rồi đừng hút nữa nhé!
Không nói nên lời, có điều gì cảm động dâng lên ăm ắp quanh đó. Anh chỉ biết cười ngượng nghịu, gật đầu.
Lúc ấy cho dù bắt anh lên rừng gươm, xuống biển lửa, anh cũng sẵn lòng.
Côcũng biết bỏ thuốc lá đâu phải một sớm một chiều. Chỉ có điều, thấyngười yêu không quyết tâm làm việc đó, cô muốn nghĩ cách giúp người yêumình bỏ thuốc. Nào kẹo cai thuốc, thuốc đặc trị dứt cơn nghiện thuốclá... cô đều cố mọi cách mà chẳng mang lại kết quả gì.
- Hay là em cũng học hút thuốc là, rồi em nghiện thuốc, rồi em sẽ cai thuốc làm gương cho anh?
- Ngốc lắm, có ai làm thế bao giờ!
- Biết đâu sẽ có tác dụng?
- Tại sao em lại phải ép mình làm cái điều chính em không muốn?
- Vậy làm thế nào để anh cai thuốc đây? - Cô lo lắng hỏi.
- Anh đã cố hết sức rồi! Ngốc ạ!
Vàogiữa chợ đêm trung tâm thành phố, cô kéo anh vào hàng chụp ảnh HànQuốc, nhét đồng xu vào máy ảnh, rồi dán tấm ảnh nhỏ của mình vào ví anh:
- Lúc nào anh định bật diêm châm thuốc lá, anh hãy nhìn hình em!
---
Giằngco nhiều năm, anh phát chán vì việc cai thuốc như một bóng ma lởn vởnbao quanh họ, làm họ xung đột, giằng co, coi thường nhau, trách mócnhau, rốt cuộc, anh đề nghị chia tay nhau!
Họ cùng để nước mắtrơi suốt một đêm, sau khi gác máy điện thoại, tối hôm ấy. Anh chờ cô bỏmáy trước, rồi mới gác máy, kết thúc cuộc tình suốt mấy năm.
Côsống nhẹ nhõm, nhưng cứ cảm thấy như cuộc sống đã thiếu đi thứ gì đó.Dường như anh đã tan biến đi trong cuộc đời cô, những vấn đề khó khănquanh việc cai thuốc cũng tan biến đi. Nhưng giờ đây, cứ mỗi khi có aihút thuốc, ngửi thấy hơi khói ấy, cô lại nhớ người yêu cũ da diết. Cônhớ mùi thuốc lá trên người anh.
Nhớ tha thiết những giây phútngả đầu lên vai anh, vai anh có mùi khói thuốc. Nhớ những lần anh tìmtrăm phương nghìn kế để xua đi mùi khói thuốc ám quanh mình.
Cô bắt đầu điếu thuốc đầu tiên của mình như thế. Lúc ấy, nỗi nhớ anh trở nên mãnh liệt hơn bao giờ hết.
Côbắt đầu điếu thuốc thứ hai trong căn phòng, khói mờ bao phủ khắp, cảđệm ga giường có mùi khói thuốc, cũng như đã biến thành những chăn gốiám khói của anh ngày xưa mà cô từng căm ghét.
Ngửi thấy hơi thuốc phảng phất đâu đây, cô mới an tâm chìm vào giấc ngủ.
Ngàynối ngày qua, cô không thể xa điếu thuốc lá nữa. Là nghiện thuốc, làyêu cơn ghiền ấy, tất cả cảm xúc không còn rõ rệt nữa. Cô chỉ biết làmình đã nghiện.
Một năm sau, họ gặp nhau bất ngờ ở góc phố. Nhưnhững người bạn cũ đã lâu không gặp gỡ, họ ra bờ biển ngồi hàn huyên.Cô đã gầy xanh đi rất nhiều, anh nhìn cô thương xót, đó có lẽ là vì lỗilầm của anh.
Cô châm lên một điếu thuốc.
- Em hút thuốc? - Anh kinh ngạc nhìn cô.
- Vâng. Anh hút không? - Cô rít một hơi thật sâu, đưa cả gói thuốc cho anh.
- Không, anh bỏ thuốc lá rồi!
- Hả? Anh bỏ thuốc hồi nào? - Cô kinh ngạc nhìn anh.
- Nửa năm trước, vì một người anh yêu.
Cô lặng đi. Điếu thuốc giữa ngón tay run rẩy. Bao năm yêu nhau, tha thiết như thế, chỉ hy vọng người yêu bỏ thuốc lá, vậy mà không mạnh bằng mộtngười yêu gặp sau đó nửa năm.
Cô cảm thấy mình đã thất bại hoàn toàn, trong đời, trong tình cảm.
Và cô im lặng ngồi hút hết những điếu thuốc còn lại.
- Và em, vì sao bây giờ em lại nghiện thuốc lá?
- Từ một năm trước, vì một người em yêu.
-Vậy... có phải vì em muốn giúp anh ta cai thuốc không? - Anh nghĩ đếnmột người nào đó đã đến thế chỗ mình trong đời cô. Hay đó là mình, mộtnăm trước là lúc anh đòi chia tay.
Anh mở ví ra, đưa cô xem tấm ảnh nhỏ nhoi còn trong đó.
- Đây là người đã giúp anh cai thuốc, vì anh muốn được quay trở lại bên người đó!
Cô nhìn nhoà đi trong nước mắt, những giọt nước mắt to lăn xuống dọc theo gò má.
- Anh đã bỏ thuốc lá rồi. Giờ hãy để anh giúp em bỏ thuốc, có được không?
Trang Hạ dịch (theo mạng Saycoo)

Thứ Hai, 3 tháng 8, 2009

Khi tình yêu thành nỗi ám ảnh

Nhận dạng một mối quan hệ không lành mạnh.

- Ghét việc bạn trò chuyện với người khác.
- Khó chịu khi bạn có nhiều bạn bè và khuyên bạn dành ít thời gian cho họ thôi.
- Tính khí lên xuống thất thường.
- Luôn có ý kiến về quần áo trang phục của bạn.
- Mặc dù yêu anh ấy/cô ấy, nhưng bạn luôn có nỗi sợ mơ hồ đối với người kia.
- Anh ấy/cô ấy không bao giờ lắng nghe ý kiến, quan điểm của bạn.
- Bạn thấy mình không hề là mình khi ở bên cạnh anh ấy/ cô ấy.
- Người yêu điều tra kỹ càng profile của bạn bè và những mối quan hệ xung quanh bạn.
- Gọi bạn bằng những từ khó nghe, "thượng cẳng chân, hạ cẳng tay" với bạn.
- La mắng và nạt nộ bạn vô cớ.
- Hạ thấp giá trị của bạn trước mặt mọi người.
2!(140)

Thứ Hai, 27 tháng 7, 2009

Hướng dẫn sử dụng Hosting Yahoo

1. Vào File Manage, bạn sẽ thấy bên trái màn hình chức năng MySQL Database.
2. Bạn vào Open database utilities để thiết đặt data thì sẽ có trang khác chạy đến đề nghị bạn Credit Username and pass của phpmyadmin (cái này để đăng nhập vào phpmyadmin sau này). Bạn hãy vào đó để credit và bấm vào I Agree To.... để tạo user and pass. Bạn gõ user và pass bạn muốn credit để sau này vào phpmyadmin vào rồi bấm vào Submit.
3. Sau khi bạn tạo xong account phpmyadmin rồi thì hệ thống đề nghị bạn install phpmyadmin bạn bấm vào Install phpmyadmin Now.
4. Sẽ có một trang hiện ra tiếp và yêu cầu bạn bạn tạo một thư mục để chứa phpmyadmin (đây là thư mục trên host mà bạn vào phpmyadmin, tôi tạo là phpmyadmin). Sau khi bạn tạo xong thư mục rồi thì bấm vào install phpmyadmin bên tay phải.
5. Sau khi install phpmyadmin xong thì bạn vào phpmyadmin để tạo database cho mình.
6. Sẽ có một cửa sổ đăng nhập hiên ra, bạn đăng nhập user, pass lúc nãy bạn credit rồi đăng nhập vào.
7. Đăng nhập xong rồi thì bạn tạo một database name , tôi tạo là forum.
Vậy là xong bạn đã tạo được database cho mình, khi khai báo trong phần config bạn khai báo như sau:

Server host: mysql (những host khác là localhost)
Database name: tên data bạn vào phpmyadmin credit, tôi vừa tạo là forum.
database user_name: tên user khi ban install phpmyadmin.
Pass: pass khi bạn install phpmyadmin.

Bạn nên nhớ khi upload trong hosting yahoo nhớ là đăng nhập phần host name phải có chữ ftp phía trước mới đăng nhập được ví dụ:
Server : ftp.itvnclub.org
User: user@itvnclub.org
Pass: pass đăng nhập của bạn

Thứ Ba, 12 tháng 5, 2009

fix fixed positioning and fixed backgrounds in IE/Win

// fixed.js: fix fixed positioning and fixed backgrounds in IE/Win

// version 1.8, 08-Aug-2003

// written by Andrew Clover <and@doxdesk.com>, use freely


@if (@_win32 && @_jscript_version>4)


var fixed_positions= new Array();

var fixed_backgrounds= new Array();

var fixed_viewport;


// Initialisation. Called when the <body> tag arrives. Set up viewport so the

// rest of the script knows we're going, and add a measurer div, used to detect

// font size changes and measure image sizes for backgrounds later


function fixed_init() {

fixed_viewport= (document.compatMode=='CSS1Compat') ?

document.documentElement : document.body;

var el= document.createElement('div');

el.setAttribute('id', 'fixed-measure');

el.style.position= 'absolute';

el.style.top= '0'; el.style.left= '0';

el.style.overflow= 'hidden'; el.style.visibility= 'hidden';

el.style.fontSize= 'xx-large'; el.style.height= '5em';

el.style.setExpression('width', 'fixed_measureFont()');

document.body.insertBefore(el, document.body.firstChild);

}


// Binding. Called every time an element is added to the document, check it

// for fixed features, if found add to our lists and set initial props


function fixed_bind(el) {

var needLayout= false;

var tag= el.tagName.toLowerCase();

var st= el.style;

var cst= el.currentStyle;

var anc;


// find fixed-position elements

if (cst.position=='fixed') {

needLayout= true;

fixed_positions[fixed_positions.length]= el;

// store original positioning as we'll overwrite it

st.position= 'absolute';

st.fixedPLeft= cst.left;

st.fixedPTop= cst.top;

st.fixedPRight= cst.right;

st.fixedPBottom= cst.bottom;

st.fixedPWidth= fixed_parseLength(cst.width);

st.fixedPHeight= fixed_parseLength(cst.height);

// find element that will act as containing box, for convenience later

st.fixedCB= null;

for (anc= el; (anc= anc.parentElement).parentElement;) {

if (anc.currentStyle.position!='static') {

st.fixedCB= anc;

break;

} }

// detect nested fixed positioning (only ancestor need move)

st.fixedNest= false;

for (anc= el; anc= anc.parentElement;) {

if (anc.style.fixedNest!=null)

st.fixedNest= true;

break;

}

}


// find fixed-background elements (not body/html which IE already gets right)

if (cst.backgroundAttachment=='fixed' && tag!='body' && tag!='html') {

needLayout= true;

fixed_backgrounds[fixed_backgrounds.length]= el;

// get background offset, converting from keyword if necessary

st.fixedBLeft= fixed_parseLength(cst.backgroundPositionX);

st.fixedBTop= fixed_parseLength(cst.backgroundPositionY);

// if it's a non-zero %age, need to know size of image for layout

if (st.fixedBLeft[1]=='%' || st.fixedBTop[1]=='%') {

st.fixedBWidth= 0; st.fixedBHeight= 0;

fixed_measureBack(el);

}

}

if (needLayout) fixed_layout();

}


// Layout. On every window or font size change, recalculate positioning


// Request re-layout at next free moment

var fixed_delaying= false;

function fixed_delayout() {

if (fixed_delaying) return;

fixed_delaying= true;

window.setTimeout(fixed_layout, 0);

}


var fixed_ARBITRARY= 200;


function fixed_layout() {

fixed_delaying= false;

if (!fixed_viewport) return;

var i, el, st, j, pr, tmp, A= 'auto';

var cb, cbLeft, cbTop, cbRight, cbBottom, oLeft, oTop, oRight, oBottom;

var vpWidth=fixed_viewport.clientWidth, vpHeight=fixed_viewport.clientHeight;


// calculate initial position for fixed-position elements [black magic]

for (i= fixed_positions.length; i-->0;) {

el= fixed_positions[i]; st= el.style;

// find positioning of containing block

cb= st.fixedCB; if (!cb) cb= fixed_viewport;

cbLeft= fixed_pageLeft(cb); cbTop= fixed_pageTop(cb);

if (cb!=fixed_viewport) { cbLeft+= cb.clientLeft; cbTop+= cb.clientTop; }

cbRight= fixed_viewport.clientWidth-cbLeft-cb.clientWidth;

cbBottom= fixed_viewport.clientHeight-cbTop-cb.clientHeight;

// if size is in %, must recalculate relative to viewport

if (st.fixedPWidth[1]=='%')

st.width= Math.round(vpWidth*st.fixedPWidth[0]/100)+'px';

if (st.fixedPHeight[1]=='%')

st.height= Math.round(vpHeight*st.fixedPHeight[0]/100)+'px';

// find out offset values at max size, to account for margins

st.left= A; st.right= '0'; st.top= A; st.bottom= '0';

oRight= el.offsetLeft+el.offsetWidth; oBottom= el.offsetTop+el.offsetHeight;

st.left= '0'; st.right= A; st.top= '0'; st.bottom= A;

oLeft= el.offsetLeft; oTop= el.offsetTop;

// use this to convert all edges to pixels

st.left= A; st.right= st.fixedPRight;

st.top= A; st.bottom= st.fixedPBottom;

oRight-= el.offsetLeft+el.offsetWidth;

oBottom-= el.offsetTop+el.offsetHeight;

st.left= st.fixedPLeft; st.top= st.fixedPTop;

oLeft= el.offsetLeft-oLeft; oTop= el.offsetTop-oTop;

// edge positioning fix

if (st.fixedPWidth[1]==A && st.fixedPLeft!=A && st.fixedPRight!=A) {

tmp= el.offsetLeft; st.left= A; st.width= fixed_ARBITRARY+'px';

tmp= fixed_ARBITRARY+el.offsetLeft-tmp+cbLeft+cbRight;

st.left= st.fixedPLeft; st.width= ((tmp<1)?1:tmp)+'px';

}

if (st.fixedPHeight[1]==A && st.fixedPTop!=A && st.fixedPBottom!=A) {

tmp= el.offsetTop; st.top= A; st.height= fixed_ARBITRARY+'px';

tmp= fixed_ARBITRARY+el.offsetTop-tmp+cbTop+cbBottom;

st.top= st.fixedPTop; st.height= ((tmp<1)?1:tmp)+'px';

}

// move all non-auto edges relative to the viewport

st.fixedCLeft= (st.fixedPLeft=='auto') ? oLeft : oLeft-cbLeft;

st.fixedCTop= (st.fixedPTop=='auto') ? oTop : oTop-cbTop;

st.fixedCRight= (st.fixedPRight=='auto') ? oRight : oRight-cbRight;

st.fixedCBottom= (st.fixedPBottom=='auto') ? oBottom : oBottom-cbBottom;

// remove left-positioning of right-positioned elements

if (st.fixedPLeft=='auto' && st.fixedPRight!='auto') st.fixedCLeft= 'auto';

if (st.fixedPTop=='auto' && st.fixedPBottom!='auto') st.fixedCTop= 'auto';

}


// calculate initial positioning of fixed backgrounds

for (i= fixed_backgrounds.length; i-->0;) {

el= fixed_backgrounds[i]; st= el.style;

tmp= st.fixedBImage;

if (tmp) {

if (tmp.readyState!='uninitialized') {

st.fixedBWidth= tmp.offsetWidth;

st.fixedBHeight= tmp.offsetHeight;

st.fixedBImage= window.undefined;

}

}

st.fixedBX= fixed_length(el, st.fixedBLeft, vpWidth-st.fixedBWidth);

st.fixedBY= fixed_length(el, st.fixedBTop, vpHeight-st.fixedBHeight);

}


// now call scroll() to set the positions from the values just calculated

fixed_scroll();

}


// Scrolling. Offset fixed elements relative to viewport scrollness


var fixed_lastX, fixed_lastY;

var fixed_PATCHDELAY= 300;

var fixed_patching= false;


// callback function after a scroll, because incorrect scroll position is

// often reported first go!

function fixed_patch() {

fixed_patching= false;

var scrollX= fixed_viewport.scrollLeft, scrollY= fixed_viewport.scrollTop;

if (scrollX!=fixed_lastX && scrollY!=fixed_lastY) fixed_scroll();

}


function fixed_scroll() {

if (!fixed_viewport) return;

var i, el, st, viewportX, viewportY;

var scrollX= fixed_viewport.scrollLeft, scrollY= fixed_viewport.scrollTop;

fixed_lastX= scrollX; fixed_lastY= scrollY;


// move non-nested fixed-position elements

for (i= fixed_positions.length; i-->0;) {

st= fixed_positions[i].style;

viewportX= (st.fixedNest) ? 0 : scrollX;

viewportY= (st.fixedNest) ? 0 : scrollY;

if (st.fixedCLeft!='auto') st.left= (st.fixedCLeft+viewportX)+'px';

if (st.fixedCTop!='auto') st.top= (st.fixedCTop+viewportY)+'px';

viewportX= (st.fixedCB==null || st.fixedCB==fixed_viewport) ? 0 : viewportX;

viewportY= (st.fixedCB==null || st.fixedCB==fixed_viewport) ? 0 : viewportY;

st.right= (st.fixedCRight-viewportX+1)+'px'; st.right= (st.fixedCRight-viewportX)+'px';

st.bottom= (st.fixedCBottom-viewportY+1)+'px'; st.bottom= (st.fixedCBottom-viewportY)+'px';

}


// align fixed backgrounds to viewport

for (i= fixed_backgrounds.length; i-->0;) {

el= fixed_backgrounds[i]; st= el.style;

viewportX= scrollX;

viewportY= scrollY;

while (el.offsetParent) {

viewportX-= el.offsetLeft+el.clientLeft;

viewportY-= el.offsetTop +el.clientTop;

el= el.offsetParent;

}

st.backgroundPositionX= (st.fixedBX+viewportX)+'px';

st.backgroundPositionY= (st.fixedBY+viewportY)+'px';

}


// call back again in a tic

if (!fixed_patching) {

fixed_patching= true;

window.setTimeout(fixed_patch, fixed_PATCHDELAY);

}

}


// Measurement. Load bg-image into an invisible element on the page, when

// loaded write the width/height to an element's style for layout use; detect

// when font size changes


function fixed_measureBack(el) {

var measure= document.getElementById('fixed-measure');

var img= document.createElement('img');

img.setAttribute('src', fixed_parseURL(el.currentStyle.backgroundImage));

measure.appendChild(img);

el.style.fixedBImage= img;

if (img.readyState=='uninitialized')

img.attachEvent('onreadystatechange', fixed_measureBackImage_ready);

}


function fixed_measureBackImage_ready() {

var img= event.srcElement;

if (img && img.readyState!='uninitialized') {

img.detachEvent('onreadystatechange', fixed_measureBackImage_ready);

fixed_layout();

}

}


var fixed_fontsize= 0;

function fixed_measureFont() {

var fs= document.getElementById('fixed-measure').offsetHeight;

if (fixed_fontsize!=fs && fixed_fontsize!=0)

fixed_delayout();

fixed_fontsize= fs;

return '5em';

}


// Utility. General-purpose functions


// parse url() to get value inside


function fixed_parseURL(v) {

v= v.substring(4, v.length-1);

if (v.charAt(0)=='"' && v.charAt(v.length-1)=='"' ||

v.charAt(0)=="'" && v.charAt(v.length-1)=="'")

return v.substring(1, v.length-1);

else return v;

}


// parse length or auto or background-position keyword into number and unit


var fixed_numberChars= '+-0123456789.';

var fixed_ZERO= new Array(0, 'px');

var fixed_50PC= new Array(50, '%');

var fixed_100PC= new Array(100, '%');

var fixed_AUTO= new Array(0, 'auto');


function fixed_parseLength(v) {

var num, i;

if (v=='left' || v=='top') return fixed_ZERO;

if (v=='right' || v=='bottom') return fixed_100PC;

if (v=='center') return fixed_50PC;

if (v=='auto') return fixed_AUTO;

i= 0;

while (i<v.length && fixed_numberChars.indexOf(v.charAt(i))!=-1)

i++;

num= parseFloat(v.substring(0, i));

if (num==0) return fixed_ZERO;

else return new Array(num, v.substring(i));

}


// convert parsed (number, unit) into a number of pixels


function fixed_length(el, l, full) {

var tmp, x;

if (l[1]=='px') return l[0];

if (l[1]=='%') return Math.round(full*l[0]/100);

// other units - measure by setting position; this is rather inefficient

// but then these units are used for background-position so seldom...

tmp= el.currentStyle.left;

el.style.left= '0';

x= el.offsetLeft;

el.style.left= l[0]+l[1];

x= el.offsetLeft-x;

el.style.left= tmp;

return x;

}


// convert stupid IE offsetLeft/Top to page-relative values


function fixed_pageLeft(el) {

var v= 0;

while (el.offsetParent) {

v+= el.offsetLeft;

el= el.offsetParent;

}

return v;

}

function fixed_pageTop(el) {

var v= 0;

while (el.offsetParent) {

v+= el.offsetTop;

el= el.offsetParent;

}

return v;

}


// Scanning. Check document every so often until it has finished loading. Do

// nothing until <body> arrives, then call main init. Pass any new elements

// found on each scan to be bound


var fixed_SCANDELAY= 500;


function fixed_scan() {

if (!document.body) return;

if (!fixed_viewport) fixed_init();

var el;

for (var i= 0; i<document.all.length; i++) {

el= document.all[i];

if (!el.fixed_bound) {

el.fixed_bound= true;

fixed_bind(el);

} }

}


var fixed_scanner;

function fixed_stop() {

window.clearInterval(fixed_scanner);

fixed_scan();

}


fixed_scan();

fixed_scanner= window.setInterval(fixed_scan, fixed_SCANDELAY);

window.attachEvent('onload', fixed_stop);

window.attachEvent('onresize', fixed_delayout);

window.attachEvent('onscroll', fixed_scroll);


@end

Fixed Positioning in IE6

<body>
<style type="text/css">
* {
margin: 0;
}
html, body {
height: 100%;
overflow: auto;
}
/*------------------------------*/
.bottom {
position: fixed;
bottom: 0px;
}
* html .bottom {
position: absolute;
}
/*------------------------------*/
.top {
position: fixed;
top: 0px;
}
* html .top {
position: absolute;
}
</style>

<div style="background:#99CC99; height:1000px">

</div>

<div class="bottom">
bottom here
</div>
<div class="top">
top here
</div>

</body>

Thứ Hai, 27 tháng 4, 2009

Một bài viết hay(nên đọc)

Ngày xưa, có một câu chuyện về người cha trong ngày sinh nhật của đứa con 3 tuổi. Đứa con khư khư giữ những quà tặng, không cho các bạn chơi cùng. Người cha quyết định dạy con mình biết chia sẻ bằng cách giật đồ chơi khỏi tay đứa con cho những đứa khác. Có một điều mà người cha đó quên: trước khi học cách chia sẻ, đứa bé phải học cách sở hữu. Người ta không thể cho đi cái gì người ta không có. Cũng vậy, người ta không thể thoát khỏi bức tường mà người ta không nhìn thấy.

... Bạn sẽ cảm thấy rất đau khi bạn thât sự thương yêu một người mà người ấy lại không yêu bạn. Nhưng cái ấy còn chưa đau bằng nếu bạn thật sự thương yêu một người nhưng lại không có can đảm để nói cho người đó biết. Có thể là Thượng Đế, ngài muốn chúng ta quen trước những người mà không phải thuộc về mình trước khi cho mình gặp được “người bạn trăm năm” để cuối cùng mình sẽ biết quý trọng người đó hơn.

Con người sinh ra không phải để tan biến đi như một hạt cát vô danh

Họ sinh ra để in dấu lại trên mặt đất, in dấu lại trong trái tim người khác. Bạn có thể bị tổn thương nếu yêu một người một cách say đắm, nhưng nó là phương pháp duy nhất khiến con người bạn trở nên toàn diện. Đừng che giấu tình yêu và sự dịu dàng của mình cho đến khi bạn lìa đời. Hãy làm cuộc đời bạn tràn đầy sự ngọt ngào. Hãy nói những lời nói thân thương khi bạn còn nghe được và khi tim bạn còn rung động

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (46)

Đổi server name là̀ localhost -> mysql

Using Multiple JavaScript Onload Functions

function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
addLoadEvent(function() {
/* more code to run on page load */
});

Thứ Năm, 23 tháng 4, 2009

ob_start()

<?php
ob_start();
?>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<th colspan="2">Tư vấn - Chăm sóc khách hàng</th>
</tr>
<tr>
<th>Họ tên: </th><td><?=$_POST['hoten']?></td>
</tr>
<tr>
<th>Địa chỉ: </th><td><?=$_POST['diachi']?></td>
</tr>
<tr>
<th>Email: </th><td><?=$_POST['email']?></td>
</tr>
<tr>
<th>Công ty: </th><td><?=$_POST['congty']?></td>
</tr>
<tr>
<th>Điện thoại: </th><td><?=$_POST['dienthoai']?></td>
</tr>
<tr>
<th>Tiêu đề: </th><td><?=$_POST['tieude']?></td>
</tr>
<tr>
<th>Nội dung: </th><td><?=$_POST['noidung']?></td>
</tr>
</table>
<?php
$buffer = ob_get_contents();
ob_end_clean();
?>

Thứ Tư, 15 tháng 4, 2009

Mở rộng quan hệ, mở lối thành công

From: http://advice.vietnamworks.com.vn/vi/print/548

Bạn rất ngại tham gia những cuộc gặp gỡ? Bạn cảm thấy khó khăn trong việc xây dựng các mối quan hệ xã hội?

Xây dựng mối quan hệ xã hội không có nghĩa là ngay lập tức hỏi thăm ai đó về cơ hội việc làm tại các ngày hội nghề nghiệp. Theo nghĩa chính xác nhất của từ này, xây dựng quan hệ xã hội chính là kết bạn và giao tiếp.

Gia đình, bạn bè, hàng xóm, đồng nghiệp cũ và mới đều là những nhân tố trong mạng lưới quan hệ xã hội của bạn. Tương tự cho bất cứ đối tượng nào bạn đang có quan hệ và thực sự quan tâm về họ.

Sự quan tâm – Chìa khóa để xây dựng quan hệ
Để có một mối quan hệ xã hội tốt, bạn phải là người biết quan tâm đến người khác. Sự quan tâm này có thể được thể hiện bằng nhiều cách khác nhau. Chẳng hạn, bạn nhớ ngày sinh nhật, những ngày kỷ niệm quan trọng khác của bạn bè, thể hiện sự cảm kích với những thành công bạn bè đạt được hay gửi thư cảm ơn họ vì đã giới thiệu bạn với ai hoặc giúp bạn việc gì.

Ngoài ra, bạn cần giữ liên lạc thường xuyên với bạn bè qua email, điện thoại và các buổi họp mặt thân mật. Mỗi tuần, bạn nên đặt mục tiêu gửi email hỏi thăm cho một người bạn quen (hoặc một người bạn muốn thiết lập quan hệ) và gọi điện ít nhất một lần cho một người bạn khác. Ngoài ra, hãy hẹn bạn bè ăn trưa mỗi tháng ít nhất một lần, hoặc chỉ đơn giản là uống cà phê. Nếu bạn không quen với những việc này, hãy ưu tiên ghi chúng vào danh sách những việc cần làm để dễ nhớ.

Hãy là người khởi xướng các hoạt động!
Một cách tuyệt vời để xây dựng các mối quan hệ xã hội là tham gia các sự kiện. Tuy nhiên, bạn hãy rủ mọi người tham gia những hoạt động vui chơi thân mật, hơn là tham dự các sự kiện mang tính trang trọng nhưng vô bổ.

Bạn có thể thành lập câu lạc bộ những người mê đọc sách, thích nấu ăn hay một nhóm đi bộ trong công ty; cùng đồng nghiệp ăn trưa hoặc tổ chức một đi chơi toàn công ty. Bạn cũng có thể rủ bạn bè đến nhà chơi, ăn tiệc tối hay tiệc nướng ngoài trời. Hãy khuyến khích mỗi người khách đến dự tiệc đi cùng với một người bạn mới. Việc khởi xướng những hoạt động tập thể như thế sẽ giúp bạn thiết lập quan hệ xã hội một cách dễ dàng mà không kém phần vui nhộn.

Chủ động kết nối với những người “đồng điệu”
Việc tích cực tham gia các hoạt động cũng quan trọng như khởi xướng. Tận dụng sở thích của bản thân cũng là một cách để mở rộng các mối quan hệ [2]. Chẳng hạn, nếu thích chơi golf, bạn đừng rủ người quen đi cùng mà hãy đến sân một mình rồi kiếm 3 người lạ để mời họ cùng chơi. Mỗi lần như vậy, bạn lại có thêm 3 người bạn mới. Nếu thích làm đồ gốm hoặc học ngôn ngữ ký hiệu (sign language), bạn hãy tham gia một khóa học sau giờ làm việc để có có hội tiếp xúc với những người “đồng điệu”. Chắc chắn sau khóa học, bạn sẽ kết bạn được với ít nhất một hay hai người.

Ngoài ra, rèn luyện thân thể tại các trung tâm thể dục hoặc tham gia vào các hoạt động chính trị - xã hội ở địa phương cũng là những cách lý tưởng khác để giao tiếp và kết bạn.

Trở thành “cầu nối” đáng tin cậy
Một trong những cách hay nhất để trở thành một người bạn tốt và một người xã giao giỏi là trở thành “cầu nối” của các mối quan hệ. Thay vì chỉ chú tâm vào việc những người quen và bạn bè có thể giúp bạn ra sao, hãy suy nghĩ xem bạn có thể giúp họ như thế nào. Chú ý khi ai đó nói với bạn rằng họ đang muốn mở rộng hoạt động kinh doanh sang một ngành nào đó hoặc họ đang tìm kiếm nhân sự với những kỹ năng chuyên sâu. Sau đó, bạn hãy nhớ lại xem có ai bạn quen có thể giúp họ không? Có ai thân với bạn có thể nắm bắt được cơ hội này không?

Trở thành cầu nối như thế, có thể bạn sẽ không thấy được lợi ích ngay tức thì cho bản thân và những tham vọng nghề nghiệp của bạn. Nhưng đến khi có việc cần, bạn sẽ thấy rõ giá trị của mạng lưới quan hệ xã hội [3]rộng.

(Theo Hotjobs.yahoo.com)

Thứ Ba, 14 tháng 4, 2009

Large File Downloads Issue Solved

//From: http://codeigniter.com/forums/viewthread/109798/

//CONTROLLER
// DOWNLOAD FILE
function download() {
// LOAD FILE SIZE PLUGIN
$this->load->plugin('filesize');
// GRAB FILE NAME
$file_name = $this->uri->segment(3);
// SET DIRECT PATH TO FILE
$file_path = "securefiles/".$file_namee;
// GRAB THE FILE SIZE
$file_size = get_filesize($file_path);
// CHOOSE WHICH DOWNLOAD METHOD BASED FILE SIZE
if ($file_size >= 45) {
// BEGIN DOWNLOAD
force_download($file_name, $file_path, 'large');
} else {
// READ FILE CONTENTS
$file_data = file_get_contents("securefiles/".$file_name);
// BEGIN DOWNLOAD
force_download($file_name, $file_data, 'small');
}
}

//DOWNLOAD HELPER PORTION MODIFIED
//Added Parameter: $type - Line 44
function force_download($filename = '', $data = '', $type = '')
//Added IF / ELSE statement - Line 75
// Generate the server headers
if ($type == 'small')
{
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
{
header('Content-Type: "'.$mime.'"');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-Transfer-Encoding: binary");
header('Pragma: public');
header("Content-Length: ".strlen($data));
}
else
{
header('Content-Type: "'.$mime.'"');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header("Content-Transfer-Encoding: binary");
header('Expires: 0');
header('Pragma: no-cache');
header("Content-Length: ".strlen($data));
}
} else {
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
{
header('Content-Type: "'.$mime.'"');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-Transfer-Encoding: binary");
header('Pragma: public');
//header("Content-Length: ".strlen($data));
readfile($data);
}
else
{
header('Content-Type: "'.$mime.'"');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header("Content-Transfer-Encoding: binary");
header('Expires: 0');
header('Pragma: no-cache');
//header("Content-Length: ".strlen($data));
readfile($data);
}
}
?>

A Base Model Template

class MY_Model extends Model
{
var $use_dbconfig = 'default';
var
$id = null;
var
$data = array();
var
$table;
var
$primary_key = 'id';
var
$fields = array();
var
$__insert_id = null;
var
$__num_rows = null;
var
$__affected_rows = null;
var
$return_array = TRUE;
var
$debug = FALSE;
var
$queries = array();
var
$_parent_name = '';

function
MY_Model()
{
parent
::Model();

$this->_assign_libraries( (method_exists($this, '__get') OR method_exists($this, '__set')) ? FALSE : TRUE );

// We don't want to assign the model object to itself when using the
// assign_libraries function below so we'll grab the name of the model parent
$this->_parent_name = ucfirst(get_class($this));

log_message('debug', "Model Class Initialized");
}

/**
* Assign Libraries
*
* Creates local references to all currently instantiated objects
* so that any syntax that can be legally used in a controller
* can be used within models.
*
* @access private
*/
function _assign_libraries($use_reference = TRUE)
{
$CI
=& get_instance();
foreach (
array_keys(get_object_vars($CI)) as $key)
{
if ( ! isset($this->$key) AND $key != $this->_parent_name)
{
// In some cases using references can cause
// problems so we'll conditionally use them
if ($use_reference == TRUE)
{
// Needed to prevent reference errors with some configurations
$this->$key = '';
$this->$key =& $CI->$key;
}
else
{
$this
->$key = $CI->$key;
}
}
}
}

/**
* Load the associated database table.
*
* @author md emran hasan
* @access public
*/

function load_table($table, $config = 'default')
{
if ($this->debug) log_message('debug', "Loading model table: $table");

$this->table = $table;
$this->use_dbconfig = $config;

$this->load->database($config);
$this->fields = $this->db->list_fields($table);

if (
$this->debug)
{
log_message
('debug', "Successfull Loaded model table: $table");
}
}

/**
* Returns a resultset array with specified fields from database matching given conditions.
*
* @author md emran hasan
* @return query result either in array or in object based on model config
* @access public
*/

function find_all($conditions = NULL, $fields = '*', $order = NULL, $start = 0, $limit = NULL)
{
if ($conditions != NULL)
{
$this
->db->where($conditions);
}

if ($fields != NULL)
{
$this
->db->select($fields, FALSE);
}

if ($order != NULL)
{
$this
->db->orderby($order);
}

if ($limit != NULL)
{
$this
->db->limit($limit, $start);
}

$query
= $this->db->get($this->table);
$this->__num_rows = $query->num_rows();

if (
$this->debug)
{
$this
->queries[] = $this->db->last_query();
}

return ($this->return_array) ? $query->result_array() : $query->result();
}

/**
* Return a single row as a resultset array with specified fields from database matching given conditions.
*
* @author md emran hasan
* @return single row either in array or in object based on model config
* @access public
*/

function find($conditions = NULL, $fields = '*', $order = 'id ASC')
{
$data
= $this->find_all($conditions, $fields, $order, 0, 1);

if (
$data)
{
return $data[0];
}
else
{
return false;
}
}

/**
* Returns contents of a field in a query matching given conditions.
*
* @author md emran hasan
* @return string the value of the field specified of the first row
* @access public
*/

function field($conditions = null, $name, $fields = '*', $order = 'id ASC')
{
$data
= $this->find_all($conditions, $fields, $order, 0, 1);

if (
$data)
{
$row
= $data[0];

if (isset(
$row[$name]))
{
return $row[$name];
}
else
{
return false;
}
}
else
{
return false;
}

}

/**
* Returns number of rows matching given SQL condition.
*
* @author md emran hasan
* @return integer the number of records returned by the condition
* @access public
*/

function find_count($conditions = null)
{
$data
= $this->find_all($conditions, 'COUNT(*) AS count', null, 0, 1);

if (
$data)
{
return $data[0]['count'];
}
else
{
return false;
}
}

/**
* Returns a key value pair array from database matching given conditions.
*
* Example use: generateList(null, '', 0. 10, 'id', 'username');
* Returns: array('10' => 'emran', '11' => 'hasan')
*
* @author md emran hasan
* @return array a list of key val ue pairs given criteria
* @access public
*/

function generate_list($conditions = null, $order = 'id ASC', $start = 0, $limit = NULL, $key = null, $value = null, $first_key = '-1', $first_value = 'Inget valt')
{
$data
= $this->find_all($conditions, "$key, $value", $order, $start, $limit);

if (
$data)
{

if($first_key != NULL)
{
$keys[]
= $first_key;
$vals[] = $first_value;
}

foreach ($data as $row)
{
$keys[]
= ($this->return_array) ? $row[$key] : $row->$key;
$vals[] = ($this->return_array) ? $row[$value] : $row->$value;
}

if (!empty($keys) && !empty($vals))
{
$return
= array_combine($keys, $vals);
return
$return;
}
}
else
{
return false;
}
}

/**
* Returns an array of the values of a specific column from database matching given conditions.
*
* Example use: generateSingleArray(null, 'name');
*
* @author md emran hasan
* @return array a list of key value pairs given criteria
* @access public
*/

function generate_single_array($conditions = null, $field = null, $order = 'id ASC', $start = 0, $limit = NULL)
{
$data
= $this->find_all($conditions, "$field", $order, $start, $limit);

if (
$data)
{
foreach ($data as $row)
{
$arr[]
= ($this->return_array) ? $row[$field] : $row->$field;
}

return $arr;
}
else
{
return false;
}
}

/**
* Initializes the model for writing a new record.
*
* @author md emran hasan
* @return boolean True
* @access public
*/

function create()
{
$this
->id = false;
unset (
$this->data);

$this->data = array();
return
true;
}

/**
* Returns a list of fields from the database and saves in the model
*
* @author md emran hasan
* @return array Array of database fields
* @access public
*/

function read($id = null, $fields = null)
{
if ($id != null)
{
$this
->id = $id;
}

$id
= $this->id;

if (
$this->id !== null && $this->id !== false)
{
$this
->data = $this->find($this->primary_key . ' = ' . $id, $fields);
return
$this->data;
}
else
{
return false;
}
}

/**
* Inserts a new record in the database.
*
* @author md emran hasan
* @return boolean success
* @access public
*/

function insert($data = null)
{
if ($data == null)
{
return FALSE;
}

$this
->data = $data;
$this->data['create_date'] = date("Y-m-d H:i:s");

foreach (
$this->data as $key => $value)
{
if (array_search($key, $this->fields) === FALSE)
{
unset($this->data[$key]);
}
}

$this
->db->insert($this->table, $this->data);

if (
$this->debug)
{
$this
->queries[] = $this->db->last_query();
}

$this
->__insert_id = $this->db->insert_id();
return
$this->__insert_id;
}

/**
* Saves model data to the database.
*
* @author md emran hasan
* @return boolean success
* @access public
*/

function save($data = null, $id = null, $xss = TRUE)
{
if ($data)
{
$this
->data = $data;
}

foreach ($this->data as $key => $value)
{

if (array_search($key, $this->fields) === FALSE)
{
unset($this->data[$key]);
}
}

if($xss)
{
$this
->data = $this->input->xss_clean($this->data);
}

if ($id != null)
{
$this
->id = $id;
}

$id
= $this->id;

if (
$this->id !== null && $this->id !== false)
{
$this
->db->where($this->primary_key, $id);
$this->db->update($this->table, $this->data);

if (
$this->debug)
{
$this
->queries[] = $this->db->last_query();
}

$this
->__affected_rows = $this->db->affected_rows();
return
$this->id;
}
else
{
$this
->db->insert($this->table, $this->data);

if (
$this->debug)
{
$this
->queries[] = $this->db->last_query();
}

$this
->__insert_id = $this->db->insert_id();
return
$this->__insert_id;
}
}

/**
* Removes record for given id. If no id is given, the current id is used. Returns true on success.
*
* @author md emran hasan
* @return boolean True on success
* @access public
*/

function remove($id = null)
{
if ($id != null)
{
$this
->id = $id;
}

$id
= $this->id;

if (
$this->id !== null && $this->id !== false)
{
if ($this->db->delete($this->table, array($this->primary_key => $id)))
{
$this
->id = null;
$this->data = array();

if (
$this->debug)
{
$this
->queries[] = $this->db->last_query();
}

return true;
}
else
{
return false;
}
}
else
{
return false;
}
}

/**
* Returns a resultset for given SQL statement. Generic SQL queries should be made with this method.
*
* @author md emran hasan
* @return array Resultset
* @access public
*/

function query($sql)
{
$ret
= $this->db->query($sql);

if (
$this->debug)
{
$this
->queries[] = $this->db->last_query();
}

return $ret;
}

/**
* Returns the last query that was run (the query string, not the result).
*
* @author md emran hasan
* @return string SQL statement
* @access public
*/

function last_query()
{
return $this->db->last_query();
}

/**
* Returns the list of all queries peformed (if debug is TRUE)
*
* @author md emran hasan
* @return array list of SQL statements
* @access public
*/

function debug_queries()
{
$queries
= array_reverse($this->queries);
return
$queries;
}

/**
* This function simplifies the process of writing database inserts. It returns a correctly formatted SQL insert string.
*
* @author md emran hasan
* @return string SQL statement
* @access public
*/

function insert_string($data)
{
return $this->db->insert_string($this->table, $data);
}

/**
* Returns the current record's ID.
*
* @author md emran hasan
* @return integer The ID of the current record
* @access public
*/

function get_id()
{
return $this->id;
}

/**
* Returns the ID of the last record this Model inserted.
*
* @author md emran hasan
* @return int
* @access public
*/

function get_insert_id()
{
return $this->__insert_id;
}

/**
* Returns the number of rows returned from the last query.
*
* @author md emran hasan
* @return int
* @access public
*/

function get_num_rows()
{
return $this->__num_rows;
}

/**
* Returns the number of rows affected by the last query
*
* @author md emran hasan
* @return int
* @access public
*/

function get_affected_rows()
{
return $this->__affected_rows;
}
}