Thứ Sáu, 22 tháng 4, 2016

Mọi chuyện bắt đầu từ nắm 2013 trong quá trình xây dựng chức năng login với Facebook, tôi đã tìm ra một cách để tấn công vào các hệ thống login với Facebook khác. Để chứng minh phương pháp tấn công của mình là hiệu quả, tôi có test thử phương pháp này với khá nhiều ứng dụng khác, và kết quả là rất nhiều ứng dụng gặp lỗi tương tự. Hai ứng dụng phổ biến nhất trong số đó là AirBnB và Kickstarter.
Read More
Cấp phát động cho mảng 2 chiều

-------------------------------------------------------------------------------------------------
#include <stdio.h>
#include<conio.h>
#include <stdlib.h>

void NhapMaTran(int **a, int dong, int cot)
{
int i, j;
for (i = 0; i < dong; i++)
for (j = 0; j < cot; j++)
{
printf("a[%d][%d] = ", i, j);
scanf("%d", &a[i][j]);
}
}

void XuatMaTran(int **a, int dong, int cot)
{
int i, j;
for (i = 0; i < dong; i++)
{
for (j = 0; j < cot; j++)
printf("%5d", a[i][j]);

printf("\n");
}
}
int main()
{
int **a = NULL, dong, cot;
int i;
printf("Nhap vao so dong: "); scanf("%d", &dong);
printf("Nhap vao so cot: "); scanf("%d", &cot);

a = (int**)malloc(dong * sizeof(int*)); 

for(i = 0; i < dong; i++)
{
a[i] = (int *)malloc(cot * sizeof(int));
}

NhapMaTran(a, dong, cot);
XuatMaTran(a, dong, cot);

for(i = 0; i < dong; i++)
{
free(a[i]);
}

// giai phong tat ca con tro quan ly dau moi dong
free(a);


getch();
return 0;
}
-------------------------------------------------------------

Thứ Tư, 20 tháng 4, 2016


Chào các bạn,
Khi chúng ta nói đến lập trình máy tính (computer programming), ta không chỉ đề cập riêng việc viết code bằng các ngôn ngữ lập trình như Java, C#, C++, Python,... mà còn là cả một quá trình phát triển phần mềm. Chỉ đơn thuần học cách viết mã nguồn bằng ngôn ngữ lập trình là KHÔNG ĐỦ để trở thành một người phát triển phần mềm (software developer) tài giỏi. Bạn cần phải nắm rõ cách thiết kế một chương trình theo phương pháp lập trình hướng đối tượng (object-oriented programming). Khi đó bạn sẽ không chỉ đơn thuần là một coder lúc nào cũng chỉ biết ôm máy tính để lập trình, mà sẽ trở thành một developer hiểu sâu và rộng kiến thức trong nhiều lĩnh vực.
Kỹ nghệ phần mềm - Xu hướng của đa số sinh viên CNTT hiện nay


VỊ TRÍ BẮT ĐẦU TRONG NGÀNH CÔNG NGHỆ PHẦN MỀM

Vậy thì coder, programmer, developer và engineer là gì? Và nó khác nhau chỗ nào?

Về cơ bản, coder (thợ code) chỉ viết các mã lệnh logic với ngôn ngữ lập trình trong phạm vi yêu cầu mà anh ấy không cần biết nhiều về logic của chương trình. Họ được cung cấp định nghĩa về các bussiness logic và flowchart hoặc dễ hiểu hơn là các vấn đề được mô tả bằng ngôn ngữ tự nhiên, mã giả,... và nhiệm vụ của họ là chuyển nó sang mã nguồn lập trình.
Còn Programmer thì cũng tương tự như coder, tuy nhiên anh này là người đề ra giải pháp giải quyết các vấn đề, cung cấp bussiness logic cho coder. 
Tôi đang trên đường trở thành một Engineer, còn bạn thì sao?
Developer là người không chỉ code mà còn tham gia vào tất cả các quá trình của SDLC (Software development life cycle). Nếu dự án có vấn đề mà bạn chưa định hình được nó và hướng giải quyết thì các developer sẽ giúp bạn phân tích vấn đề, và tìm cách giải quyết nó. Vậy developer là người vừa lập trình, vừa định hướng phát triển sản phẩm
Engineer là một thuật ngữ được sử dụng ở mức cao cấp nhất. Anh này hoạt động ở cả phần lập trình, phân tích thiết kế (bussiness level) và bảo trì. Là những developer giỏi, có khả năng phân tích và giải quyết các vấn đề phức tạp. Những anh này thường sẽ được trả lương xấp xỉ với quản lý dự án (Project Manager), tuy nhiên thiên về hướng phát triển kỹ thuật hơn.

Ở bài này mình chỉ nói sơ về các vị trí bắt đầu khi bước vào ngành CNPM, bởi vì kiến thức thực tế còn quá giới hạn nên các vị trí khác đành chờ phần sau vậy :D




QUY TRÌNH PHÁT TRIỂN PHẦN MỀM


Chúng ta xây một ngôi nhà với các giai đoạn được xác định rõ ràng (làm móng, xây nền, dựng cột, xây tường,...), và áp dụng các nguyên tắc kỹ thuật vào tất cả các giai đoạn đó. Làm phần mềm cũng vậy, bạn xây dựng một chương trình qua các công đoạn và áp dụng các phương pháp, qui tắc phát triển phần mềm vào từng công đoạn. Trình tự các công đoạn đó từ giai đoạn ý tưởng (conception) đến vận hành (operation) được gọi là qui trình phát triển phần mềm (Software Development Life Cycle)

Có 5 giai đoạn chính trong qui trình phát triển phần mềm: Phân tích (Analysis), Thiết kế (Design), Cài đặt mã nguồn (Coding), Kiểm thử (Testing) và Vận hành (Operation). Phần mềm ra đời dựa trên yêu cầu của người dùng.


PHÂN TÍCH


Ví dụ: một người muốn có một danh bạ online. Trong giai đoạn phân tích, chúng ta thực hiện nghiên cứu tính khả thi, chúng ta phân tích các vấn đề và xác định xem liệu giải pháp có thực sự khả thi. Và nếu giải pháp đó khả thi, thì kết quả của giai đoạn này sẽ là bảng "Đặc tả yêu cầu"  - requirement specification - để mô tả các chức năng của chương trình. Các tính năng này phải được phát biểu theo những cách có thể kiểm chứng được. Một trong những tính năng của danh bạ online là có khả năng tìm kiếm một người dựa trên first name của họ. Chúng ta có thể kiểm tra tính năng đó bằng cách chạy trực tiếp chương trình và tìm kiếm, và kiểm tra xem chương trình có hoạt đông đúng và cụ thể khi tên của một người có trong danh bạ, và người không có trong danh bạ được gõ vào khung tìm kiếm. Những việc làm đó thuộc pha Kiểm thử, thứ mà mình sẽ nói tới nó sau.


THIẾT KẾ

Trong giai đoạn thiết kế, chúng ta sẽ chuyển bảng đặc tả yêu cầu thành bảng "Thiết kế chi tiết" - detailed design của chương trình. 
Trong giai đoạn này chúng ta sẽ thiết kế các giao diện người dùng của chương trình (User Interface) -  bao gồm các bước: Lập danh sách các màn hình (view, form,...) dựa vào Use Case, vẽ sơ đồ mối quan hệ giữa các màn hình, Thiết kế các đối tượng trên mỗi màn hình (Sắp xếp vị trí các button, textbox,...) theo các qui tắc về thiết kế giao diện, cuối cùng đặc tả, giải tích cách hoạt động của các đối tượng trên từng màn hình đó.
Với một chương trình thiết kế hướng đối tượng (object-oriented design), kết quả của pha này không thể thiếu Danh sách các lớp (class) được dùng để đáp ứng yêu cầu. Chúng ta sẽ thiết kế các lớp đối tượng, dựa vào những yêu cầu cần thiết, các kiến thức về kế thừa, đa hình để thiết kế các lớp đối tượng, và mô hình hóa chung bằng các sơ đồ (ví dụ UML - Unified Modeling Language). Ví dụ: với chương trình danh bạ online ở trên thì chúng ta có thể cần các class như Person, Phone, Group,...
Thiết kế phần mềm - giai đoạn không thể thiếu trong qui trình phần mềm
Ngoài ra ở một số chương trình đặc thù, ta còn cần thiết kế các tầng dữ liệu cho chương trình. Dữ liệu ở đây có thể là hệ thông tập tin đơn giản, đến các hệ  cơ sở dữ liệu phức tạp. Sau đó vẽ sơ đồ mô hình hóa, đặc tả dữ liệu.
Cuối cùng không thể thiếu là thiết kế xử lý cho chương trình. Chi tiết hóa các kịch bản usecase, các luồng logic trong chương trình. Và sử dụng sơ đồ tuần tự để mô tả.


CÀI ĐẶT MÃ NGUỒN

Trong giai đoạn cài đặt mã nguồn, chúng ta triển khai các thiết kế thành một chương trình thực tế bằng các ngôn ngữ lập trình như Java, C#, Python, hay các hàm API,... Chúng ta đã có một bảng thiết kế cấu trúc hoàn chỉnh, thì việc triển khai thành mã nguồn không thực sự quá khó khăn.
Nhiều người hay lầm tưởng làm phần mềm chỉ là ngồi viết code!


KIỂM THỬ

Khi quá trình triển khai mã nguồn hoàn chỉnh, chúng ta sẽ đến với giai đoạn kiểm thử. Trong giai đoạn này chúng ta sẽ chạy chương trình với nhiều bộ dữ liệu để kiểm chứng là chương trình chạy đúng theo đặc tả yêu cầu. Hai loại kiểm thử dành cho các chương trình hướng đối tượng là: kiểm thử đơn vị (unit testing) và kiểm thử tích hợp (integration testing). 
Giai đoạn dễ gây "mâu thuẫn" giữa các thành viên trong team nhất!
Kiểm thử đơn vị thường do lập trình viên thực hiện, kiểm nghiệm từng class riêng biệt, từng hàm trong mã nguồn trong môi trường cô lập. Còn đối với kiểm thử tích hợp chúng ta kiểm tra các class có làm việc đúng khi ghép lại với nhau hay không, và quá trình test diễn ra ngay sau unit testing. Hành động "bất hủ" dùng để phát hiện và loại bỏ lỗi của quá trình  thiết kế và cài đặt gọi là "debugging". Nếu tìm được lỗi, chúng ta phải quay về pha trước đó để sửa chữa và hoàn thiện chương trình.

Bonus cho các bạn 1 câu nói bất hủ của Dijkstra :
"Program testing can be used to show the presence of bugs, but never to show their absence!"

VẬN HÀNH

Cuối cùng sau khi quá trình kiểm thử kết thúc thành công, chúng ta đi vào pha vận hành, khi đó chương trình sẽ được đưa vào sử dụng thực tế. Thứ quan trọng nhất và mất nhiều thời gian nhất trong pha này là bảo trì phần mềm (software maintenace). Ngay cả sau khi phần mềm được đưa vào sử dụng, chúng ta hầu như luôn phải sửa đổi nó. Bởi vì khách hàng có thể yêu cầu thêm tính năng, hoặc các lỗi mới được tìm thấy. 
Thống kê cho thấy, xấp xỉ 70% phí của phần mềm thuộc về công đoạn bảo trì. Vậy nên khi phát một phần mềm chúng ta phải nhắm vào phần mềm dễ bảo dưỡng, bỏ thời gian và công sức ra để phân tích thiết kế và lập trình cẩn thận. Ngay cả nó có mất thời gian, và chi phí giai đoạn đầu, nhưng trong qua trình hoạt động lâu dài, các phần mềm có sự chuẩn bị thiết kế chu đáo sẽ ít tốn kém hơn. Đây là một điểm rất quan trọng mà các bạn nào muốn trở thành một nhà phát triển phần mềm giỏi cần phải lưu ý!

--------------------------------------------------------------------------------------------
Giai đoạn thiết kế luôn là giai đoạn quan trọng nhất trong qui trình phần mềm!

Chào và chúc các bạn học tốt!


Thứ Hai, 18 tháng 4, 2016

Lưu ý khi sử dụng thư viện jQuery

Khác nhau giữa thư viện jQuery 1.x và 2.x

Nếu như Python có Python 2 và 3 được phát triển song song thì thư viện jQuery cũng tương tự, có phiên bản 1.x và 2.x
Read More

Thứ Bảy, 16 tháng 4, 2016

Baovecho.org hacked by J2TeaM
Ngày này năm trước (16/04/2015), trang web baovecho.org xuất hiện với chiến dịch "Về đi Vàng ơi" - kêu gọi mọi người "Hãy chấm dứt nạn đánh cắp chó, buôn lậu và đối xử tàn nhẫn!".

Mục tiêu của chúng ta là 1,000,000 chữ ký để trình lên quốc hội!

Tất cả những chữ ký ủng hộ của các bạn sẽ được trình lên chính phủ Việt Nam để kêu gọi ban hành quy định về phúc lợi động vật
Việc thu thập chữ ký được thực hiện như nào? Các bạn sẽ phải điền vào một biểu mẫu với các thông tin gồm: Họ và tên, Email, thành phố và số điện thoại.
Read More

Thứ Tư, 13 tháng 4, 2016

Facebook ra mắt hệ thống quản lý bản quyền video

Facebook đang tiến hành triển khai hệ thống Copyright Management (Quản lý bản quyền), đại loại thì giống hệ thống Content ID của Youtube. Dự là một số trang chuyên (re)upload video như Lil Shady, Robbey,... sẽ bị ảnh hưởng trong thời gian tới.
Read More

Thứ Hai, 11 tháng 4, 2016

Cách khắc phục tình trạng TeamViewer bị lỗi kết nối

Gần đây, một số người sử dụng TeamViewer gặp lỗi không thể kết nối được.
Cách khắc phục tình trạng TeamViewer bị lỗi kết nối

Dưới đây là một số cách bạn có thể khắc phục TeamViewer bị lỗi kết nối.
Read More

Chủ Nhật, 10 tháng 4, 2016

Chặn Blogspot chuyển hướng sang tên miền quốc gia

Google có một danh sách các tên miền theo từng quốc gia, ví dụ như khi bạn vào Google.com từ:
  • Việt Nam sẽ thấy chuyển sang Google.com.vn
  • Nhật Bản sẽ thấy chuyển sang Google.co.jp
  • ...
Tương tự với Blogger (Blogspot), người dùng từ các quốc gia khác nhau sẽ thấy bị chuyển sang các tên miền khác nhau. Tuy nhiên, gần đây một số độc giả ở nước ngoài báo lỗi với tôi rằng truy cập vào Juno_okyo's Blog thì thấy tình trạng trang bị refresh (tải lại) liên tục, khiến không thể đọc được bài viết. Để khắc phục vấn đề này, các bạn hãy thêm /ncr (no country redirect) vào cuối tên miền blog để ngăn chặn chuyển hướng đến phiên bản blog địa phương.
Read More

Thứ Năm, 7 tháng 4, 2016

Sử dụng Composer trong CodeIgniter

Tải các thư viện PHP cần thiết

Trước tiên, tạo một tập tin composer.json trong thư mục application và chỉ định các thư viện PHP mà bạn cần dùng cho dự án của bạn. Ví dụ:
Read More

Thứ Tư, 6 tháng 4, 2016

Tình hình là sau khi tôi mua laptop mới thì nó cài sẵn Windows 8.1, mà từ phiên bản 8.1 trở lên thì cái thanh ngôn ngữ (Language Bar) nó hiển thị khác với các phiên bản trước của Windows nên không tắt được theo cách thông thường. Bài viết này sẽ hướng dẫn cách tắt thanh ngôn ngữ trong Windows 8.1/10 cho bạn nào chưa biết nhé!
Read More
Bọn mình vừa mới học xong môn Lập trình mạng. Nói thẳng ra là lúc học trên lớp không để ý mấy, bị hổng nhiều quá, nên học xong mới quyết định viết 1 cái app nho nhỏ. Chẳng biết đặt tên là gì nên cứ đặt đại là MYCHAT  :D
Về cơ bản my chat có những tính năng sau:

  • Nhắn tin qua lại trong mạng (LAN)
  • Gửi file, hỗ trợ file dung lượng lớn (chưa test max, nhưng theo lý thuyết thì khoảng 2TB :) ). Nếu file là ảnh thì sẽ hiển thị trực tiếp
  • Hỗ trợ nhiều client, server gửi đồng loạt cho các client nhưng client chỉ gửi cho server thôi, tùy chỉnh nickname, giao diện màu sắc cho từng client
  • Giao diện phẳng
  • Sau khi đóng chương trình, các file vừa nhận sẽ bị xóa, vì vậy nếu muốn giữ lại file thì phải copy ra thư mục khác trước khi đóng chương trình…

Trong chương trình đã sử dụng
  • Truyền tin qua socket TCP, sử dụng StreamWriter, StreamReader
  • Đa tiểu trình, đồng bộ hóa, delegate
  • FileStream, FlashWindow
  • HTML, JS, Uri,…
Giao diện chương trình
Giao diện khởi chạy, sẽ có lựa chọn là server hoặc client, nếu chạy là client thì bạn phải nhập địa chỉ IP của server vào ô
Giao diện phía client
Giao diện phía server, cột bên phải là danh sách các client đã kết nối

=> DOWNLOAD <=

Thứ Ba, 5 tháng 4, 2016

Bắt đầu từ tháng 9/2015, Google đã ra thông báo chính thức hỗ trợ HTTPS cho Blogger. Tuy nhiên vẫn cho phép người dùng sử dụng cả hai giao thức cùng lúc, tức là có thể truy cập bằng cả HTTP và HTTPS. Theo tôi nghĩ thì Google đã cho người dùng thời gian để khắc phục vấn đề Mixed Content nên cho tới tận bây giờ (4/2016) thì Google mới bắt đầu thông báo HTTPS sẽ là giao thức mặc định.
Read More
Bài viết này ghi lại quá trình mà tôi hỗ trợ xử lý một fan-page ngăn chặn các bình luận spam. Tôi đã sử dụng những công cụ nào và ngăn chặn spam ra sao? Cùng theo dõi nhé!
Read More

Chào các bạn!

Nhiều bạn thắc mắc muốn thao tác với ảnh bằng C# Winform thì làm như thế nào, hôm nay mình sẽ hướng dẫn các bạn cách kết hợp hai control cơ bản là PictureBox OpenFileDialog để làm một chương trình "Picture Viewer" trong C#
Đầu tiên các bạn tìm hiểu sơ lược về hai control này nhé.




PICTURE BOX TRONG C#

PictureBox là một control khá hữu dụng của C# .NET. Nó cung cấp một vùng hình chữ nhật để chèn ảnh bất kỳ và kích cỡ có thể tùy chỉnh bằng nhiều cách khác nhau.
Picturebox hỗ trợ nhiều định dạng ảnh: BMP, GIF, JPEG, EXIF, PNG và TIFF, ICO... (các định dạng được GDI+ hỗ trợ)
PictureBox có thể lấy ảnh từ ổ cứng của bạn hoặc từ Internet

Đầu tiên mình sẽ hướng dẫn các bạn chèn ảnh từ ổ cứng:
Mình sẽ dùng ảnh PNG trong ví dụ bên dưới, các định dạng khác cũng làm tương tự.

Tại sao chúng ta lại phải thiết lập thuộc tính Width và Height? Vì ảnh của chúng ta và kích cỡ của PictureBox có thể khác nhau rất nhiều, nếu như không thiết lập thì ảnh có thể sẽ bị crop. Ngược lại muốn crop ảnh theo kích cỡ mong muốn thì cứ thiết lập thuộc tính Width, Height của PictureBox

Picturebox cũng có các thuộc tính tương tự như các control cơ bản khác, tuy nhiên có một số thuộc tính mới cần nói như SizeMode.
Thay vì thiết lập thuộc tính Width và Height của PictureBox, hoặc hình ảnh. Chúng ta có thể thiết lập nhanh bằng một số tùy chọn .NET cung cấp sẵn:

Chúng ta còn các SizeMode khác như (Normal, Zoom: căng ảnh nhưng duy trì tỉ lệ aspect ratioAutoSize: tự thiết lập size của pictureBox bằng với size của ảnh, CenterImage: Center ảnh vào trung tâm PictureBox, StretchImage: căng ảnh lên theo 2 chiều cho vừa với khung pictureBox)

Tiếp theo là chèn ảnh từ Internet. Ví dụ trên mình đã dùng thuộc tính ImageLocation để chèn ảnh bằng địa chỉ của nó. Vậy thì địa chỉ hình ảnh trên Internet thì sao nhỉ?
Chúng ta thử gán nhanh cho thuộc tính ImageLocation trong cửa sổ properties với giá trị: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_4AjKZmor_E-j353JRuB0l1GGX47HwNwZLHCzfjmwP9QpvTLE80Z-c9D5nmhcmaRP3O1Z_dNYmEyC2DY8Zw3VUZ8yFtrs50LGOG1lgLXnSugYDxLeKlb3Mt0h0s4YD7EKGmgH3Rr9mpg/s1600/cooltext125983511023412.png. Sau đó chạy thử chương trình lên và kết quả sẽ là:


Về phần sự kiện của PictureBox thì chúng ta cũng có các sự kiện cơ bản như các control khác (Click, Mouse Hover,...). Vậy là xong phần PictureBox, chúng ta cùng sang control thứ hai cần thiết để hoàn thành chương trình này.


OPEN FILE DIALOG TRONG C#

OpenFileDialog (OFD) cho phép người dùng browse một thư mục hoặc tệp tin. Là control thường thấy trong rất nhiều ứng dụng. Nhất là các gói cài đặt thường cho bạn chọn thư mục để cài.

Để cài đặt một OFD các bạn kéo nó ra từ thanh Toolbox, nhóm Dialogs.
Thường thì chúng ta sẽ thiết lập các thuộc tính cho OFD ở ngay trong khung Properties. OFD cũng có thuộc tính Name, Title, Tag,.. như các control khác. Tuy nhiên một số thuộc tính mới như:
- FileName: Tên mặc định của File. Nếu các bạn gõ vào đây "fileName1" thì khi mở hộp thoại "fileName1" sẽ đặt mặc định trong ô FileName. Vậy nên các bạn nên xóa và để trống thuộc tính này
- Filter: Bộ lọc file. Thông thường ta chỉ cần một số loại file nhất định, nhưng nếu thư mục có quá nhiều file khác nhau thì việc tìm kiếm sẽ mất nhiều thời gian. Nên chúng ta có thể thiết lập thuộc tính Filter để lọc ra các loại file mong muốn.
Ví dụ: ofd.Filter = "Windows Bitmaps|*.bmp|JPEG Files|*.jpg"
Cứ theo định dạng mô tả | *.đuôi tệp tin. Giữa những loại tệp tin với nhau cũng là một dấu gạch đứng |.
- CheckFileExist, CheckPathExist: Các bạn để mặc định là true để OFD kiểm tra file và đường dẫn có hợp lệ, tồn tại không.
- InitialDirectory: Thư mục mặc định mà khi OFD được show ra sẽ nằm ở đó.
- MultiSelect: Nếu các bạn muốn chọn nhiều file một lúc thì cho bằng true.
- ...

Để mở hộp thoại OFD, chúng ta cần một button và thiết lập cho nó sự kiện Click để chạy code show OFD.

DIALOG RESULT

DialogResult là một biến kiểu Enum, dùng để nhận giá trị trả về của var.ShowDialog(). Để kiểm tra xem người dùng vừa click nút nào, dự định làm gì.
DialogResult chứa các giá trị như: OK, Cancle, Ignore, Try, Yes, No,...

Vậy thì tiếp theo làm sao để ta lấy được hình ảnh từ OFD? Chung ta sẽ lấy đường dẫn của ảnh vừa chọn bằng thuộc tính FileName của OFD.

 Image img = Image.FromFile(openFileDialog1.FileName); 

Vậy là chúng ta đã học xong được tất cả các chức năng chính của PictureBox và OpenFileDialog rồi. Giờ chỉ còn kết hợp nó để làm chương trình xem ảnh thôi :D

Mình sẽ cung cấp code mẫu ở đây luôn. Ai có gì không hiểu thì bình luận hoặc pm trực tiếp mình qua facebook/email nhé

Chúc các bạn học tốt! Chào và hẹn gặp lại


Chủ Nhật, 3 tháng 4, 2016

Bài viết này nói về Karmi Phúc - tác giả của Facebook Favorite - một người bạn đặc biệt, người khiến tôi trở thành Chrome Extension Developer.
Read More

Thứ Bảy, 2 tháng 4, 2016

Juno_okyo's Blog - Fastest Blogger Template


Xin chào! Chắc các bạn cũng đã nhận ra Juno_okyo's Blog có giao diện mới rồi nhỉ?

Đây là template Blogger đầu tiên do tôi tự làm, convert dựa trên template Clean Blog được cung cấp miễn phí bởi Start Bootstrap. Và dưới đây là những gì tôi đạt được khi tự tay làm một template thay vì dùng hàng sẵn có.

Đạt điểm tối đa của PageSpeed Insights


Khó có thể kiếm được một template Blogger nào đạt 100/100 điểm trên PageSpeed Insights (công cụ đo tốc độ tải trang uy tín của Google). Và một điều nữa có thể khiến bạn ngạc nhiên đó là template gốc mà tôi convert sang thì chỉ đạt 87/100 điểm.

Clean Blog Template

Giao diện thân thiện với thiết bị di động


Điều này khá dễ hiểu vì template này được dựng trên Bootstrap - một CSS Framework đã quá nổi tiếng, đặc biệt là về khả năng responsive (tương thích đa thiết bị).

Fastest Blogger Template

Không những thân thiện mà template này còn đạt điểm gần như tuyệt đối về trải nghiệm người dùng.

Fastest Blogger Template

Hỗ trợ đầy đủ SEO tag và Rich Snippet


Đây là kết quả kiểm tra bằng công cụ của Google.

Juno_okyo Fastest Blogger Template

Lý do chọn Clean Blog để convert thành Blogger Template?


Đơn giản là vì đây là template có phong cách giống với Ghost và Medium - 2 nền tảng viết blog mà tôi rất thích. Và việc quyết định tự làm một template với mục đích chính là để tìm hiểu thêm và core của Blogger, nền tảng blog mà tôi đã gắn bó được một thời gian dài.

Bạn có muốn biết tôi đã học được những gì sau khi tạo ra template này? Hay muốn biết làm thế nào mà tôi có thể đạt được điểm tối đa trên Google PageSpeed Insights? Hãy đón đọc trong bài viết tiếp theo nhé!

Thứ Sáu, 1 tháng 4, 2016


Chào các bạn!

Chắc hẳn qua một thời gian dài học C# cùng với blog các bạn cũng đã từng nhiều lần sử dụng event trong chương trình của mình nhỉ?
Ví dụ cơ bản với một sự kiện nhận biết chuột vừa được click xuống
private void btn_MouseDown(object sender, MouseEventArgs e)
{
//Do something...
}

Các bạn có bao giờ thắc mắc các tham số object senderMouseEventArgs e là gì không?
Đó là những tham số của event, được tạo và gán giá trị bởi Visual C#. 

THAM SỐ ĐẦU TIÊN: object sender
Sender mang kiểu dữ liệu object dùng chung, tổng quát.
Sender chứa một tham chiếu tới control/object đã gây ra event. Chúng ta có thể ép kiểu sender lại trở thành control/object để xử lý
Ví dụ: 
//Thay đổi text của button được click

protected void btn_Click (object sender, EventArgs ea)
{

Button btn = sender as Button;
if(btn != null)
{
btn.Text = "I was clicked!";
}
}

THAM SỐ THỨ HAI: MouseEventArgs e
Tham số này là nơi hành động thực sự xảy ra, tham số e cũng chứa một đối tượng, nhưng là kiểu cụ thể của một loại các tham số của mouse event, chứa các dữ liệu của event
Vậy thì MouseEventArgs sẽ chứa gì?
Bạn có thể tham khảo EventArgs Class từ MSDN hoặc các nguồn khác để xem thông tin, hoặc gọi biến e ra, rồi ấn dấu chấm "." để xem các thuộc tính/phương thức của e.





Trong đó:
 - Clicks: trả về số lần người dùng đã click chuột vào control đó
 - Button: trả về nút đã được nhấp (trái, giữa, phải)
 - X, Y: trả về tọa độ x,y mà con trỏ đang ở lúc sự kiện khởi chạy
 - ...

Mỗi event handler đều có các tham số riêng cho nó. Ví dụ btn_Clickbtn_MouseClick sẽ có hai tham số EventArgs và MouseEventArgs khác nhau. Nên tùy theo nhu cầu sử dụng mà ta sẽ gọi sự kiện cho hợp lý

Trên là những gì cơ bản về tham số của event, các bạn có thắc mắc thì bình luận mình sẽ giải đáp. 
Chào và chúc các bạn học tốt!!


Categories

Sample Text

Được tạo bởi Blogger.

Must Read

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Popular Posts

Video

Popular Posts

Our Facebook Page