Showing posts with label Tech. Show all posts
Showing posts with label Tech. Show all posts

Oct 10, 2010

Vài tip nhỏ phòng giúp chống virus máy tính

Có nhiều bạn sử dụng máy tính sau 1 thời gian thấy máy chạy rất chậm, chương trình khởi động mất thời gian hoặc khi vận hành hay bị lỗi...Dùng phần mềm quét virus để kiểm tra thì phát hiện cả ngàn con. Quét đi quét lại nhiều lần vẫn không hết. Nhiều trường hợp nghiêm trọng phải cài lại máy. Nói chung là rất tốn thời gian và công sức.

Mình đưa ra đây vài tip nhỏ, hy vọng sau khi đọc xong mọi người có thêm 1 chút ít kinh nghiệm trong việc phòng chống virus cho máy tính của mình. Đây chỉ là những tip đơn giản dành cho những ai không hiểu nhiều lắm về máy tính, dân pro thì khỏi bàn.

Các nguồn lây lan chủ yếu:

Có nhiều kịch bản để virus xâm nhập vào máy tính của bạn, mình chỉ liệt kê ra đây 1 số phương thức lây lan chủ yếu, xếp loại giảm dần theo mức độ thường gặp :

1/ Qua các phần mềm gởi nhận message: Yahoo, Google talk, Skype ...
2/ Qua USB
3/ Qua các trang web đen, các trang chia sẻ, download keygen, phần mềm bất hợp pháp. Về bản chất là 1 đường link chứa link virus, troyan, worm giống như phương thức 1.
4/ Qua việc cài đặt các phần mềm không rõ nguồn gốc, các bản vá, key gen dùng để bẻ khóa các phần mềm bất hợp pháp.

Sau khi đã biết được các nguồn lây lan chủ yếu của virus, việc phòng chống thực sự không có gì "huyền bí" cả.

Phòng chống:

Điều kiện tiên quyết là máy tính của bạn phải có một anti virus software chạy thường trú và có khả năng update thường xuyên. Hai yêu cầu này giúp chương trình duyệt virus bảo vệ máy tính của bạn mọi lúc mọi nơi và đồng thời nhận dạng được những dòng virus mới nhất..

Sau đây là cách phòng ngừa tương ứng với từng kịch bản vừa nêu ở trên:

1/ Tuyệt đối không click vào những đường link lạ trên cửa sổ messenger. Làm thế nào để phân biệt được link lạ với link không lạ ? Câu trả lời rất đơn giản, link lạ nghĩa là link vào những website không quen thuộc. Bạn có thể phân loại dựa vào kinh nghiệm lướt net và trực giác của mình. Trường hợp vẫn muốn lick vào (người ta hay chết vì tính hiếu kỳ), có thể có 2 cách giải quyết:
- Xác nhận lại với người đã gởi message về đường link đó.
-Surf gián tiếp qua 1 trang khác, chẳng hạn google translate.

2/ Trước khi cắm bất kỳ 1 thiết bị ngoại vi nào vào máy tính thông qua cổng usb, đảm bảo rằng phần mềm chống virus của máy vẫn đang chạy. Sau khi cắm vào, tốt nhất nên dùng phần mềm chống virus đó quét 1 lần trên ổ đĩa vừa cắm vào.

Tuyệt đối không bao giờ double click lên ổ đĩa ubs để truy cập vào các thư mục bên trong nó. Thay vào đó làm ơn hãy duyệt thư mục bằng tiện ích explorer của Windows.

3/ Không nên vào các trang web đen, các trang chia sẻ software lạ. Trường hợp bắt buộc phải download software hay tài liệu, tốt nhất là vào những trang đã được biết đến rộng rãi, có nhiều thành viên và có độ tin cậy. Trước khi download, nên đọc 1 lần qua các comment bên dưới. Điều này thật sự hữu ích vì nó có khả năng giúp bạn phát hiện link có virus nếu như ai đó đã phát hiện và gởi comment cảnh báo cho những người sau.

4/ Một vài người có nhu cầu down những phần mềm thương mại có chứa các bản vá (patch) hoặc file keygen tạo key để crack. Trong những bản patch hay keygen này rất có khả năng kèm theo virus. Trường hợp bất khả kháng, hãy nhớ rằng chỉ nên download ở những trang chia sẻ có độ tin cậy cao và đọc kỹ comment của những người trước. Một điều tối quan trọng là phải bảo đảm khi cài đặt, antivirus của bạn đang chạy thường trú và đã update dữ liệu virus mới nhất.

Chống ?

Dĩ nhiên đó là điều chẳng ai muốn. Nhưng rồi cũng có 1 lúc nào đó máy tính của bạn thực sự bị virus xâm nhập cho dù bạn đã thực hiện hết tất cả những phương thức phòng ngừa nêu trên. Làm gì được nữa, giặc tới nhà thì đánh thôi.

1/ Hãy update ngay antivirus của bạn để nó cập nhật dữ liệu mới nhất. Tiến hành quét. Khởi động và quét lại lần nữa.

2/ Nếu vẫn còn ? Antivirus của bạn mặc dù không thể duyệt hết nhưng ít ra nó sẽ nhận biết được tên của con virus. Hãy search trên google để có thông tin về con virus này. Rất có thể bạn sẽ có được thông tin về cách hóa giải nó bằng tay (không phải diệt tự động) hoặc là antivirus nào có thể diệt được nó. Nếu dòng virus không quá mới, bạn hầu như sẽ tìm được phương pháp diệt chúng khi search trên google.

Gợi ý nhỏ: với những virus xuất phát từ Vietnam, BKAV duyệt rất tốt. Thường thì BKIS có thể tung ra bản update để diệt virus chỉ sau khi nó vừa xuất hiện 1->3 ngày. Những virus từ nước ngoài thì ngược lại.

Bạn có thể xem link này để biết các antivirus được xếp loại như thế nào, qua đó có thể lựa chọn cho mình antivirus thích hợp. Bản thân tôi thích dùng NOD32 vì tính gọn nhẹ và tốt rất ít bộ nhớ của nó.

3/ Chỉ dành cho các Eva: nếu bạn thực sự vô phương với con virus khó chịu đang ở trong máy sau khi đã đọc là làm theo những tip của bài viết này ? Hãy tóm ngay 1 anh chàng IT nào gần nhất ! Tôi chưa thấy một gã IT nào vừa thiếu galant vừa không mê gái cả ;)

Jun 23, 2010

9:57 PM - , No comments

Sql datetime format

SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM (or PM)

SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy - 10/02/2010

SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd - 2010.10.02

SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy

SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy

SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy

SELECT convert(varchar, getdate(), 106) -- dd mon yyyy

SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy

SELECT convert(varchar, getdate(), 108) -- hh:mm:ss

SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)

SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy

SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd

SELECT convert(varchar, getdate(), 112) -- yyyymmdd

SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm

SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm

SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm

SELECT convert(varchar, getdate(), 0) -- mon dd yyyy hh:mmAM (or PM)

SELECT convert(varchar, getdate(), 1) -- mm/dd/yy

SELECT convert(varchar, getdate(), 2) -- yy.mm.dd

SELECT convert(varchar, getdate(), 3) -- dd/mm/yy

SELECT convert(varchar, getdate(), 4) -- dd.mm.yy

SELECT convert(varchar, getdate(), 5) -- dd-mm-yy

SELECT convert(varchar, getdate(), 6) -- dd mon yy

SELECT convert(varchar, getdate(), 7) -- mon dd, yy

SELECT convert(varchar, getdate(), 8) -- hh:mm:ss

SELECT convert(varchar, getdate(), 9) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)

SELECT convert(varchar, getdate(), 10) -- mm-dd-yy

SELECT convert(varchar, getdate(), 11) -- yy/mm/dd

SELECT convert(varchar, getdate(), 12) -- yymmdd

SELECT convert(varchar, getdate(), 13) -- dd mon yyyy hh:mm:ss:mmm

SELECT convert(varchar, getdate(), 14) -- hh:mm:ss:mmm(24h)

SELECT convert(varchar, getdate(), 20) -- yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar, getdate(), 21) -- yyyy-mm-dd hh:mm:ss.mmm

SELECT convert(varchar, getdate(), 22) -- mm/dd/yy hh:mm:ss AM (or PM)

SELECT convert(varchar, getdate(), 23) -- yyyy-mm-dd

SELECT convert(varchar, getdate(), 24) -- hh:mm:ss

SELECT convert(varchar, getdate(), 25) -- yyyy-mm-dd hh:mm:ss.mmm

SELECT replace(convert(varchar, getdate(), 111), '/', ' ') -- yyyy mm dd

SELECT convert(varchar(7), getdate(), 126) -- yyyy-mm

SELECT right(convert(varchar, getdate(), 106), 8) -- mon yyyy

SELECT substring(convert(varchar, getdate(), 120),6, 11) -- mm-dd hh:mm

For more, please visit this page

May 18, 2010

7:23 PM - , No comments

'Sys' is undefined

Some time you meet the error 'Sys' is undefined when you try to load your page. It occurs when you declare something like: Sys.Application.add_load(PageLoad); but your page does not recognize what Sys is.

Oke, try this:
1/ Register script (place in the top of .aspx file):
<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="asp" %>


2/ Place this snip code inside your <form> tag:

<div> <asp:toolkitscriptmanager id="ToolkitScriptManager1" runat="server">
</asp:toolkitscriptmanager></div>

Mar 30, 2010

12:38 AM - , No comments

Scroll to the bottom of textbox as default

You want your textbox auto scroll to the bottom instead of the top as default page load?

Okie, do it like this:

Winform:

txtMyText.SelStart = Len(txtMyTest.Text)

:D

Ofcouse I don't mention about Winform app, you can find variety of solutions in Google. I want to talk about asp.net. Okie, not take your time:
Place this snip code on your LoadPage (aspx, javascript, does not .cs)

var txtMyText = window.document.getElementById("<%=txtMyText.ClientID %>");
txtMyText.doScroll();
txtMyText.scrollTop = txtMyText.scrollHeight;

Hope this help :)

Feb 9, 2010

1:09 AM - 1 comment

Change Visual Studio 2008 Product Key

Today I open my Visual Studio 2008 and it throws out this message: "The evaluation period for Visual Studio trial". Of course my V.S has expired.

I google and find out this solution. Share this for who don't want to pay any pence for Gates. Yeah, he's too rich :D

Go to Add/Remove and select Visual Studio, chose Change/Remove.
Change your produce key to: XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4WT

Good luck !

(:D Just a joke, in all cases, I encourage you buy a valid key for your software produce. 'Cause we're coders, right ?)

Feb 7, 2010

11:45 PM - ,, 1 comment

Disable CallOut Validator

AjaxToolkit ValidatorCalloutExtender control provides you a new (of course, a nice) way to display your validate message. Although still have some inconveniences but it's worth to try :))

One of inconveniences is when you disable your target validator control by JavaScript (4 example, call ValidatorEnable(targetValidateControl, false)) the callout validator popup still shows every time you focus to the control.

Here's the solution to fix this issuer :

1.Set CSS class for ValidatorCalloutExtender:

HTML Code:

<style id = "style1" type="text/css">
.CustomValidator
{
position: relative;
margin-left: -80px;
margin-top: 8px;
display: inherit;
}
</style>
<ajax:ValidatorCalloutExtender ID="ProductIncrementVE" runat="server"
TargetControlID="ProductIncrementValidator"
HighlightCssClass="validator"
WarningIconImageUrl="~/img/blank.gif"
CssClass="CustomValidator">


</ajax:ValidatorCalloutExtender>

2 . Use JavaScript to alter this CSS class when needed. Set display = none:

Mã:

function alterDisplay(type) {
var styleSheet, cssRule;
if (document.styleSheets) {
styleSheet = document.styleSheets[index1];
if (styleSheet) {
if (styleSheet.cssRules)
cssRule = styleSheet.cssRules[index2]; // Firefox
else if (styleSheet.rules)
cssRule = styleSheet.rules[index2]; // IE
if (cssRule) {
cssRule.style.display = type;
}
}
}
}

Note: the index1 and index2 may be difference from pages, it's up to your declaration. You can use IE debugger to find our the correctly index.
Hope they fix this problem in next release.

Feb 3, 2010

9:58 PM - , No comments

Validate with OnClientClick

Using an OnClientClick function in submit button like:

<asp:Button ID="btnFinish" runat="server" SkinID="ButtonWidth50" Text="Finish" OnClientClick="return CheckForm()"/>

maybe lets your validate controls do not work correctly.

When the CheckForm() returns a true value, your page goes thought to sever and does not execute validate functions.

Solution:
call Page_ClientValidate() function to force controls do there's validate tasks before goes to another processing.

function CheckForm() {
var result = true;
result = Page_ClientValidate();
if (result){
// Do your task here
}
return result;
}

Feb 2, 2010

10:02 PM - 9 comments

Giới thiệu về stored procedure trong MySQL (P.7)

Con trỏ trong Stored Procedures

MySQl hỗ trợ con trỏ trong cả stored procedures, hàm và triggers. Con trỏ được dùng để duyệt theo từng hàng bảng kết quả trả về từ câu truy vấn và xử lý các hàng đó. Tất cả những version sau MySQL 5.x đều hỗ trợ con trỏ với các thuộc tính sau:

* Read only: bạn không thể update con trỏ
* Non-scrollable: con trỏ chỉ có thể di chuyển theo 1 hướng và không thể bỏ qua bất cứ 1 hàng nào, trượt tới hay trượt lùi trong bản kết quả.
* Asensitive: bạn nên tránh update 1 table trong khi vẫn đang mở con trỏ trong chính table đó. Nếu không bạn sẽ nhận được những kết quả không mong đợi

MySQL hỗ trợ các phát biểu sau khi làm việc với con trỏ:

Khai báo 1 con trỏ với phát biểu DECLARE

Mã:
 DECLARE cursor_name CURSOR FOR SELECT_statement;
Mở con trỏ bằng phát biểu OPEN. Bạn phải mở con trỏ trước khi duyệt qua bất cứ dòng nào trong bảng kết quả:

Mã:
 OPEN cursor_name;
Nhận dữ liệu ở dòng hiện tại trong bản kết quả và di chuyển con trỏ đến dòng kế tiếp bằng phát biểu FETCH:

Mã:
 FETCH cursor_name INTO variable list;
Cuối cùng, đóng con trỏ để vô hiệu hóa và giải phóng bộ nhớ. Sử dụng phát biểu:

Mã:
CLOSE cursor_name;

Một điểm quan trọng khi làm việc với con trỏ là bạn nên sử dụng điều khiển NOT FOUND để tránh gặp phải lỗi “no data to fetch”. Chúng ta sử dụng 1 ví dụ nhỏ dưới đây để demo về con trỏ:

Mã:
DELIMITER $$
DROP PROCEDURE IF EXISTS CursorProc$$
CREATE PROCEDURE CursorProc()
BEGIN

DECLARE no_more_products, quantity_in_stock INT DEFAULT 0;
DECLARE prd_code VARCHAR(255);
DECLARE cur_product CURSOR FOR
SELECT productCode FROM products;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_products = 1;

/* for loggging information */
CREATE TABLE infologs (
Id int(11) NOT NULL AUTO_INCREMENT,
Msg varchar(255) NOT NULL,
PRIMARY KEY (Id)

);

OPEN cur_product;
FETCH cur_product INTO prd_code;
REPEAT
SELECT quantityInStock INTO quantity_in_stock
FROM products
WHERE productCode = prd_code;
IF quantity_in_stock < 100 THEN
INSERT INTO infologs(msg)
VALUES (prd_code);
END IF;
FETCH cur_product INTO prd_code;
UNTIL no_more_products = 1
END REPEAT;
CLOSE cur_product;
SELECT * FROM infologs;
DROP TABLE infologs;
END$$
DELIMITER;

Stored procedure này khá đơn giản và có thể thay bằng truy vấn SQL. Chúng ta chỉ sử dụng cho mục đích demo cách thức làm việc của con trỏ

Ta dùng con trỏ để làm việc với table products. Nếu số lượng trong kho của product nhỏ hơn 100, tiến hành ghi lại log trong 1 bảng tạm và sau đó select tất cả các sản phẩm để in ra trong 1 màn hình.

Nhớ là bạn phải khai báo con trỏ trước tiên và sau đó khai báo điều khiển NOT FOUND, nếu không bạn sẽ gặp phải lỗi.

10:00 PM - No comments

Giới thiệu về stored procedure trong MySQL (P.6)

Vòng lặp trong Stored Procedures

Ngôn ngữ lập trình MySQl stored hỗ trợ phát biểu vòng lặp cho phép bạn thực hiện các lệnh lặp. Các kiểu vòng lặp được mô tả lần lượt dưới đây:

Vòng lặp while

Cú pháp của vòng lặp while:

Mã:
WHILE expression DO
Statements
END WHILE
Đầu tiên, vòng lặp while kiểm tra biểu thức điều kiện, nếu điều kiện có giá trị true thì chương trình sẽ thực thi các lệnh trong vòng lặp. Vòng lặp while kiểm tra biểu thức trước khi thực thi các dòng lệnh. Dưới đây là 1 ví dụ về việc sử dụng vòng lặp while trong stored procedure:

Mã:
 DELIMITER $$
DROP PROCEDURE IF EXISTS WhileLoopProc$$
CREATE PROCEDURE WhileLoopProc()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
SET x = 1;
SET str = '';
WHILE x <= 5 DO SET str = CONCAT(str,x,','); SET x = x + 1; END WHILE; SELECT str; END$$ DELIMITER ;
Stored procedures trên tạo 1 chuỗi thông qua biến x cho đến khi x lớn hơn 5 và sau đó in chuỗi này ra màng hình bằng phát biểu select. 1 trong những lỗi mà lập trình viên hay mắc phải là biến x được dùng mà chưa được khởi tạo, giá trị của x lúc đó là NULL, vì vậy điều kiện lặp luôn luôn đúng, kết quả là đoạn mã bên trong vòng lặp while thực thi liên tục cho đến khi database của bạn bị crashed.

Vòng lặp repeat

Cú pháp của vòng lặp repeat:

Mã:
REPEAT
Statements;
UNTIL expression
END REPEAT
Dòng lệnh đầu tiên được thực thi, sau đó chương trình mới kiểm tra tới biểu thức logic. Nếu biểu thức logic có giá trị true, các dòng lệnh bên trong sẽ được lập lại liên tục cho đến khi biểu thức logic có giá trị false. Vì vòng lặp repeat kiểm tra biểu thức logic sau khi đã thực thi 1 lần dòng lệnh nên repeat được biết như vòng lặp tiền kiểm tra (post-test loop). Chúng ta có thể viết lại stored procedure trên bằng vòng lặp repeat như sau:

Mã:
 DELIMITER $$
DROP PROCEDURE IF EXISTS RepeatLoopProc$$
CREATE PROCEDURE RepeatLoopProc()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
SET x = 1;
SET str = '';
REPEAT
SET str = CONCAT(str,x,',');
SET x = x + 1;
UNTIL x > 5
END REPEAT;
SELECT str;
END$$
DELIMITER ;
Chú ký không có delimiter (;) sau phát biểu UNTIL

Vòng lặp loop, leave và iterate

Phát biểu leave cho phép bạn rời vòng lặp. Nó gần giống với phát biểu break trong các ngôn ngữ khác như Java, C#...
Phát biểu Iterate cho phép bạn bắt đầu vòng lặp trở lại. Nó gần giống như phát biểu continue trong Java hay C#.
MySql cũng hỗ trợ vòng lặp loop cho phép bạn thực thi dòng lệnh lặp 1 cách cơ động. Một ví dụ về vòng lặp loop

Mã:
 DELIMITER $$
DROP PROCEDURE IF EXISTS LOOPLoopProc$$
CREATE PROCEDURE LOOPLoopProc()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
SET x = 1;
SET str = '';
loop_label: LOOP
IF x > 10 THEN
LEAVE loop_label;
END IF;
SET x = x + 1;
IF (x mod 2) THEN
ITERATE loop_label;
ELSE
SET str = CONCAT(str,x,',');
END IF;

END LOOP;
SELECT str;
END$$
Store procedure trên tạo dựng 1 chuỗi với các số chẵn. Đầu tiên, ta định nghĩa một nhãn loop, nếu biến x lớn hơn 10 thì vòng lặp kết thúc thông qua phát biểu leave. Nếu x lẻ, iterate sẽ bỏ qua các dòng lệnh bên dưới nó và tiếp tục vòng lặp mới, ngược lại, block code trong phát biểu else sẽ thực thi để tạo chuỗi với các số chẵn.
___________

9:59 PM - No comments

Giới thiệu về stored procedure trong MySQL (P.5)

Các mệnh đề điều kiện trong Stored Procedures

Mệnh đề điều kiện cho phép bạn thực thi các đoạn mã (code) dựa trên giá trị của một hoặc nhiều biểu thức logic kết hợp. MySQL hỗ trợ 2 mệnh đề điều kiện là IF và CASE.

Mệnh đề IF

Cú pháp của mệnh đề IF:

Mã:
IF expression THEN commands
[ELSEIF expression THEN commands]
[ELSE commands]
END IF;
Các lệnh nằm trong khối IF, ELSEIF hoặc ELSE chỉ được thực thi khi mệnh đề có chân trị là TRUE. Một trong những cái "bẫy" hay mắc phải là biểu thức của mệnh đề IF có giá trị NULL, khi 1 biểu thức logic có giá trị NULL, nó không được xem là TRUE hay FALSE. Dưới đây là 1 số ví dụ của mệnh đề IF:

Mã:
IF expression THEN commands
END IF;
IF expression THEN commands
ELSE commands
END IF;
IF expression THEN commands
ELSEIF expression THEN commands
ELSE commands
END IF;
Bạn có thể thấy các mệnh đề IF có thể lồng vào nhau.

Mệnh đề CASE

Khi có nhiều biểu thức logic được sử dụng với mệnh đề IF, mã chương trình của bạn sẽ rất khó đọc. Trong tình huống này, bạn có thể sử dụng mệnh đề CASE để làm cho chương trình trông sáng sủa hơn.

Cú pháp của mệnh đề CASE:

Mã:
CASE
WHEN expression THEN commands
…
WHEN expression THEN commands
ELSE commands
END CASE;
__________________

9:58 PM - No comments

Giới thiệu về stored procedure trong MySQL (P.4)

Parameters trong Stored Procedures

Trong phần này, bạn sẽ học cách viết 1 stored procedures với parameter. Tôi cũng sẽ cung cấp cho bạn 1 vài ví dụ về stored procedure, qua đó giúp bạn hiểu sâu hơn về parameter trong stored procudes.

Hầu hết các stored procedures đều có param. Param làm cho stored procedure trở nên linh động và hữu dụng hơn. Trong MySQL, 1 param thuộc 1 trong 3 mode sau: IN, OUT và INOUT.
IN: bất cứ sự thay đổi giá trị nào lên param này bên trong stored procedure đều không có kết quả. Nghĩa là param vẫn giữ nguyên giá trị của nó sau khi ra khỏi stored procedure. Ví dụ, bạn truyền vào stored procedure GetAll 1 param có tên Id với giá trị là 10. Ngay cả khi trong stored procedure GetAll, bạn có cố tình thay đổi giá trị của param Id thì giá trị của nó sau khi thực thi stored procedure vẫn là 10.
OUT: cho phép stored procedure thay đổi giá trị của param và trả nó về chương trình gọi.
INOUT: kết hợp giữa 2 mode trên. Bạn có thể truyền 1 param dạng này vào stored procedure và nhận lại 1 giá trị mới.
Cú pháp để khai báo param trong stored procedure:

Mã:
MODE param_name param_type(param_size)
MODE có thể là IN, OUT hay INOUT tùy thuộc vào mục đích sử dụng của bạn.
Param_name là tên của param. Tên của param không nên trùng với tên của column hay table và phải tuân theo quy tắt đặt tên cho param. Theo sau tên param là kiểu param và kích cỡ của nó.

Mỗi param được ngăn cách bởi dấu “,” nếu stored procedure có nhiều hơn 1 param.
Trong ví dụ này, stored procedure có nhiệm vụ lấy các thông tin của tất cả các office ở 1 country nào đó.

Mã:
DELIMITER //
CREATE PROCEDURE GetOfficeByCountry(IN countryName VARCHAR(255))
BEGIN
SELECT city, phone
FROM offices
WHERE country = countryName;
END //
DELIMITER ;
Bạn có thể thấy, countryName được dùng như 1 param kiểu IN. Kiểu dữ liệu của countryName là varchar và kích thước là 255. Trong phần thân của stored procedure, ta nhận được thông tin của tất cả các office trong country được xác định bởi param countryName.

Giả sử bạn muốn nhận được thông tin về các office ở USA, bạn gọi stored procedure như sau:

Mã:
CALL GetOfficeByCountry('USA')
Tương tự, nếu muốn lấy thông tin của tất cả các văn phòng nằm ở France, gán giá trị của countryName=”France”

Mã:
CALL GetOfficeByCountry(‘France’)
Ví dụ thứ 2, ta sẽ viết 1 stored procedure để tính số lượng các order theo theo từng loại order riêng biệt được xác định bằng chính trạng thái của order đó, ví dụ : shipped, resolverd, cancelled, on hold, disputed hay in process

Mã:
 DELIMITER $$
CREATE PROCEDURE CountOrderByStatus(
IN orderStatus VARCHAR(25),
OUT total INT)
BEGIN
SELECT count(orderNumber)
INTO total
FROM orders
WHERE status = orderStatus;
END$$
DELIMITER ;
Stored procedure CountOrderByStatus có 2 param:
orderStatus param có kiểu IN,.
Total param có kiểu OUT.
Để lấy số lượng order theo trạng thái shipped, ta sử dụng phát biểu:

Mã:
CALL  CountOrderByStatus('Shipped',@total);
SELECT @total AS total_shipped;
Lấy số lượng order ở trạng thái “in process”:

Mã:
CALL CountOrderByStatus('in  process',@total);
SELECT @total AS total_in_process;
Store procedure thứ 3 dùng để minh họa cho trường hợp param là INOUT. Store procedure này có chức năng in hoa (capitalize) các ký tự đầu tiên của 1 từ trong chuỗi, sau đó trả về cho chương trình gọi thông qua chính param vừa được truyền vào:

Mã:
 DELIMITER $$
CREATE PROCEDURE `Capitalize`(INOUT str VARCHAR(1024))
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE myc, pc CHAR(1);
DECLARE outstr VARCHAR(1000) DEFAULT str;
WHILE i <= CHAR_LENGTH(str) DO SET myc = SUBSTRING(str, i, 1); SET pc = CASE WHEN i = 1 THEN ' ' ELSE SUBSTRING(str, i - 1, 1) END; IF pc IN (' ', '&', '''', '_', '?', ';', ':', '!', ',', '-', '/', '(', '.') THEN SET outstr = INSERT(outstr, i, 1, UPPER(myc)); END IF; SET i = i + 1; END WHILE; SET str = outstr; END$$ DELIMITER ;
Cách gọi capitalize trong stored procedure:

Mã:
SET @str = 'mysql stored procedure tutorial';
CALL Capitalize(@str);
SELECT @str;
Chuỗi trả về thông qua @str: ‘Mysql Stored Procedure Tutorial’

9:56 PM - No comments

Giới thiệu về stored procedure trong MySQL (P.3)

Biến trong stored procedure

Khai báo biến

Biến trong stored procedure được sử dụng để lưu trữ kết quả tức thời. Cú pháp khai báo biến:

Mã:
DECLARE variable_name datatype(size) DEFAULT default_value;
Như bạn thấy, ngay sau từ khóa DECLARE là tên biến. Bạn nên tuân theo qui ước đặt tên biến. Tên biến không nên trùng với tên của table hay colume trong database.

Tiếp theo là xác định kiểu dữ liệu của biến, đó là 1 trong những kiểu dữ liệu mà MySQL hỗ trợ sẵn: Int, varchar, datetime...Kế đến là kích cỡ của biến. Khi bạn khai báo 1 biến, nó được tự động khởi tạo giá trị mặc định là null. Bạn có thể thay đổi giá trị mặc định cho biến bằng cách sử dụng phát biểu DEFAULT. Ví dụ, cú pháp khởi tạo 1 biến có tên total_sale với kiểu dữ liệu là int, giá trị mặc định là 0 như sau:

Mã:
DECLARE total_sale INT DEFAULT 0
Có thể dùng 1 từ khóa DECLARE để khai báo 2 hay nhiều biến có cùng kiểu dữ liệu:

Mã:
DECLARE x, y INT DEFAULT 0
2 biến x và y với cùng kiểu dữ liệu int, giá trị mặc định (của cả 2) là 0.

Gán giá trị cho 1 biến

Sau khi khai báo biến, bạn có thể sử dụng chúng. Để gán 1 giá trị cho 1 biến, bạn dung phát biểu SET như sau:

Mã:
 DECLARE total_count INT DEFAULT 0
SET total_count = 10;
Biến total_count lúc này có giá trị là 10.
Ngoài cách dùng phát biểu SET, chúng ta cũng có thể sử dụng SELECT … INTO để gán kết quả của 1 truy vấn cho 1 biến:

Mã:
 DECLARE total_products INT DEFAULT 0
SELECT COUNT(*) INTO total_products
FROM products
Ở ví dụ trên, chúng ta khai báo 1 biến total_product và khởi tạo giá trị ban đầu bằng 0, sau đó sử dụng phát biểu SELECT … INTO để gán giá trị cho biến total_products bằng tổng số sản phầm (products) trong bảng products.

Phạm vi của 1 biến

Mỗi một biến có phạm vi hoạt động của nó. Nếu bạn khai báo biến bên trong 1 stored procedure, biến đó sẽ còn hiệu lực cho đến khi nào gặp từ khóa END của stored procedure. Nếu bạn khai báo biến bên trong block BEGIN/END của stored procedure, biến sẽ hết hiệu lực khi gặp từ khóa END của block BEGIN/END này.

Bạn có thế khai báo 2 hay nhiều biến cùng tên trong các phạm vi (scope) khác nhau, các biến này sẽ có hiệu lực trong phạm vi riêng của chúng. Dĩ nhiên điều này được khuyến cáo là không nên làm.

Một biến với ký tự “@” làm tiền tố được xem là biến thuộc phạm vi session. Nó sẽ tồn tại dến khi nào session còn tồn tại.

4:54 AM - 6 comments

Giới thiệu về stored procedure trong MySQL (P. 2)

Trong phần này, bạn sẽ được hướng dẫn cách viết 1 stored procedure đơn giản và cách thức triệu gọi stored procedure này từ MySQL command line.

Viết stored procedure đầu tiên

Stored procedure đầu tiên khá đơn giản. Nó chỉ có chức năng duy nhất là lấy thông tin về tất cả các sản phẩm được lưu trong bảng products. Hãy xem xét đoạn mã dưới đây:

Mã:
 DELIMITER //
CREATE PROCEDURE GetAllProducts()
BEGIN
SELECT * FROM products;
END //
DELIMITER ;
Dòng đầu tiên bạn thấy là DELIMITER//. Dòng lệnh này thực sự không liện quan đến stored procedure. Phát biểu DELIMITER được dùng để thay đổi cú pháp phân cách chuẩn từ dấu “;” thành một dấu khác, trong trường hợp này là dấu “//”. Với việc làm này, bạn có thể viết được nhiều dòng SQL trong 1 stored procedure bằng việc sử dụng dấu “;” làm dấu phân cách dòng.

Sau từ khóa END, bạn lại sử dụng dấu phân cách // để ra hiệu cho trình biên dịch biết là đã hết stored procedure. Dòng cuối cùng, đưa cú pháp phân cách trở về trạng thái “nguyên thủy”, tức dấu “;”.

Để tạo 1 stored procedure mới, bạn sử dụng phát biểu CREATE PROCEDURE. Sau phát biểu CREATE PROCEDURE là tên của stored procedure mà bạn muốn đặt, trong ví dụ trên là GetAllProducts. Dĩ nhiên, tên của stored procedure ít nhiều mang tính gợi nhớ.

Phần thân của stored procedure được bắt đầu bởi cặp từ khóa BEGIN và END. Các câu lệnh SQL được đặt trong block này. Chúng ta sẽ phân tích chi tiết trong các phần sau. Đến đây, bạn đã hoàn tất việc tạo 1 stored procedure. Tiếp theo, chúng ta cần biết cách thức để triệu gọi 1 stored procedure trong 1 ứng dụng hay trong command line của MySQL.

Triệu gọi stored procedure

Để triệu gọi 1 stored procedure, chúng ta sử dụng câu lệnh SQL sau:

Mã:
CALL STORED_PROCEDURE_NAME()
Ví dụ với stored procedure vừa tạo ở trên:
Mã:
CALL GetAllProducts();
Bạn sẽ lấy được thông tin về tất cả các sản phẩm trong bảng products.

Sơ luận

Trong phần này, bạn đã được giới thiệu về cách thức thay đổi dấu phân cách chuẩn bằng việc sử dụng phát biểu DELIMITER. Việc làm này cho phép bạn có thể gõ nhiều dòng lệnh SQL bên trong 1 stored procedure. Bạn cũng được học cách viết 1 stored procedure đơn giản thông qua việc sử dụng phát biểu CREATE PROCEDURE và sau đó, triệu gọi từ command line với phát biểu CALL.

4:47 AM - 1 comment

Giới thiệu về stored procedure trong MySQL (P.1)

Định nghĩa stored procedure

Stored procedure được định nghĩa như một tập các khai báo sql được lưu trữ ngay trong cơ sở dữ liệu (database) và sau đó, được triệu gọi bởi một program, một trigger hay thậm chí là một stored procedure khác.

Một stored procudure, như chính định nghĩa của nó, có tính đệ qui. Hầu hết các RDMBS (Relational database management system - hệ quản trị cơ sở dữ liệu quan hệ) đều hỗ trợ stored procedure đệ qui, tuy nhiên MySql lại không hỗ trợ tốt tính năng này. Vì vậy, chú ý kiểm tra phiên bản của MySql trước khi bạn có ý định dùng stored procedure theo kiểu đệ qui.

Stored procedure trong MySQL

Hiện tại, MySql là 1 RMBSM mã nguồn mở (open source) được sử dụng rộng rãi trong cộng đồng phát triển cũng như cho mục đích thương mại. Tuy nhiên, từ “thuở sơ khai”, MySql không hỗ trợ stored procedure, trigger hay event…Từ phiên bản 5.0 trở lện, những chức năng này mới được thêm vào MySql data base engine với mục đích đem lại tính linh động và mạnh mẽ hơn cho MySQL.

Nếu hứng thú với loạt bài về stored procedure này, bạn nên cài MySQL phiên bản 5.x trên máy tính

Những ưu điểm của stored procudure

Stored procedure làm tăng khả năng thực thi của ứng dụng. Sau khi được tạo, stored procedure sẽ được biên dịch (compile) và lưu trữ ngay trong database. Lẽ dĩ nhiên, nó sẽ chạy nhanh hơn là một lệnh sql chưa compile được gởi trực tiếp từ ứng dụng.

Stored procedure làm giảm lưu lượng thông tin giao tiếp giữa ứng dụng và database server, thay vì gởi những câu lệnh sql chưa complile dài lằng ngoằn, ứng dụng chỉ việc gởi tên của stored procedure và lấy lại kết quả

Stored procedure có thể được tái sử dụng và chuyển sang bất cứ ứng dụng nào muốn sử dụng chúng. Stored procedure có thể “trưng ra” giao diện database cho tất cả các ứng dụng, vì vậy lập trình viên không cần viết lại các chức năng đã hỗ trợ sẵn trong stored procedure trong tất cả các chương trình.

Stored procedure cũng rất an toàn. Quản trị viên cơ sở dữ liệu có thể gán quyền cho ứng dụng truy xuất vào các stored procedures được chỉ định mà không cho phép truy cập đến các bảng (table) ở phía dưới.
Bên cạch những tiện lợi như trên, stored procedure vẫn có 1 số bất tiện dưới đây:

Những nhược điểm của stored procudure

Stored procedure làm cho database server phải tốn nhiều tài nguyên về cả bộ nhớ lẫn xử lý. Thay vì tập trung vào tính năng lưu trữ và nhận dữ liệu, bạn còn phải yêu cầu database server thực hiện 1 loạt các tính toán logic hay các thao tác xử lý phức tạp vốn không thuộc “sở trường” của database server.

Stored procedure chỉ chứa đựng các khai báo sql, vì vậy rất khó có thể viết 1 procedure nhằm thực hiện các thao tác xử lý phức tạp như các ngôn ngữ khác làm được ở tần ứng dụng như C#, Java, C++…

Bạn cũng không thể debug stored procedure trong hầu hết các RDMBS và trong cả MySQL. Có 1 vài cách để khắc phục nhược điểm này, tuy nhiên vẫn chưa hoàn hảo lắm.

Việc viết và bảo trì (maintain) stored procedure thường yêu cầu 1 loạt các kỹ năng chuyên biệt nhiều khi không phải là kỹ năng của lập trình viên. Điều này dẫn đến các vấn đề trong cả khía cạnh phát triển ứng dụng và bảo trì sản phẩm.

Sơ luận

Stored procedure có những thuận tiện cũng như bất lợi như đã đề cập ở trên. Khi phát triển ứng dụng, bạn nên đánh giá giữa những ưu và nhược điểm để quyết định có nên sử dụng stored procude hay không. Các tutorial tiếp theo sẽ hướng dẫn bạn cách sử dụng store procedure trong lập trình database với 1 vài ví dụ thực tế.

4:17 AM - No comments

Javascript confirm box with yes/no option

This's a nice, brilliant piece of code from http://www.delphifaq.com.
It makes a yes/no option confirm instead of ok/cancel. Work fine in IE.
<script language=javascript>
/*@cc_on @*/
/*@if (@_win32 && @_jscript_version>=5)

function window.confirm(str)
{
execScript('n = msgbox("'+str+'","4132","my title")', "vbscript");
return(n == 6);
}
@end @*/
var r = confirm("Can you do it?");
alert(r);
</script>

Jan 18, 2010

2:14 AM - No comments

A deadly node in asp DropDownList

Suppose that you want to use java script to manipulate an asp drowpdown list instance.
Okie, it seems nothing simpler than that. Do a search (in case you do not remember the client functions name), you have a list of functions name like this page: http://www.dotnetfunda.com/tutorials/controls/dropdownlist.aspx
Make a simple code in your page:
var drpValuationName = FindSelectBoxByID("drpValuationName");
drpValuationName.SelectedIndex = 0;
alert(drpValuationName.SelectedValue);
But your dropdown never fires as you want it be ! Why ? Just a silly syntax error, try to replace "SelectedIndex" by "selectedIndex" :))
I dont know why javascript distinguishs uppercase from lowercase in this case. I'm using .NET Framworks 3.5. Anyway, it swallows me a couple of houses before I discover it. It's a bloody experience :D

Jul 19, 2009

11:57 PM - No comments

Remove System Security

From Neitcouq's blog

System Security là một rogue anti-spyware (phần mềm giả danh anti-spyware) nguy hiểm. Một khi máy tính của bạn bị nhiễm SS, nó sẽ tự chạy khi bạn khởi động Windows, tự động scan và báo rằng máy tính của bạn bị nhiễm rất nhiều virus, spyware ... sau đó cảnh báo rằng bạn không thể remove chúng nếu chưa active SS (bằng cách mua licence). SS chạy thường trú trên taskbar và liên tục xuất hiện các cảnh báo. Điều ghê gớm là SS không cho bạn cài thêm bất cứ 1 chương trình duyệt virus nào vào máy để duyệt nó. Thậm chí bạn không thể dùng lệnh msconfig, regedit hay và Task Manager...

Cách remove System Security:

1. Download Process Explorer tại đây
2. Đổi tên file vừa download thành explorer.exe. Tiến hành cài đặt.
3. Chạy Process Explorer, tìm đến process của System Security và kill nó. Thông thường tiến trình của SS là một dãy số có dạng 13279294.exe, hoặc bạn cũng có thể nhận dạng tiến trình của SS qua Icon của nó.
4. Download phần mềm Malwarebytes. Cài đặt ở chế độ mặc định. Update lên phiên bản mới nhất, sau đó scan ở chế độ Quick Scan.
5. Remove tất cả các file bị nhiễm spyware.

Tham khảo thêm tại đây

Jul 15, 2009

10:13 PM - No comments

Best free software downloads

From Neitcouq's blog

According to http://www.webuser.co.uk , there are the best free software downloads in 2009. It is grouped in to 5 sections: Music and Video, Imaging and Editing, Browser and Add-On, Communication and Chat, Security and System, and the last: Desktop and Productivity. You can find almost softwares you need for your computer (Windows XP, Vista, Windows 7 and even Mac) in this list.

They're free, useful, effective and they're even better than the commercial colleagues. Now you can try them.