2015


Bài viết được dịch từ website Skilledup

Python - ngôn ngữ lập trình hiện đại và dễ học


Tất cả chúng ta đều từng được nghe những lời khuyên rằng: Đại học sẽ trang bị cho chúng ta những hành trang để tiến tới thành công, sẽ là những chiến mã đưa chúng ta những thung lũng sương mù để đến với những giấc mơ của chúng ta.

Chẳng bao giờ là quá muộn để học lập trình cả. Nhưng bạn nên bắt đầu từ đâu? Chúng tôi khuyên bạn nên bắt đầu với Python, ngôn ngữ lập trình được lấy cảm hứng từ nhóm hài Monty Python. Vậy bạn kì vọng gì vào một ngôn ngữ lập trình mang tên theo tên của một nhóm người chuyên làm mọi thứ trở nên buồn cười?
Well, Có rất nhiều lý do rõ ràng nhưng chúng tôi sẽ cung cấp cho bạn 5 lý do thuyết phục nhất về tại sao Python là ngôn ngữ mà bạn nên học đầu tiên.



    1. DỄ HỌC

Hãy đối mặt với thực tế rằng, học Python không thú vị như là một cuộc thi breakdance tổ chức trên tàu sân bay. May mắn thay, Python được thiết kế để dành cho những người mới bắt đầu. 
Ngôn ngữ Python dễ đọc như toán học Mẫu giáo, cú pháp của Python rất sáng sủa vì đã loại bỏ sự rườm rà trong việc khai báo biến tẻ nhạt và cặp dấu ngoặc xoắn. Python cũng yêu cầu viết ít code hơn để hoàn thành các tác vụ cơ bản, làm cho nó trở thành một ngôn ngữ rất tiện lợi. Code Python thường ngắn hơn 3-5 lần so với Java, và ngắn hơn 5-10 lần so với C++
Nhưng mặc dù Python dễ dàng để tự học, chúng ta đều biết được sự nguy hiểm của việc học một mình và không chuẩn bị trước. May mắn thay, sau nhiều năm phát triển, cộng đồng Python đã có một bộ sưu tập tài nguyên phong phú giúp bạn học lập trình một cách nhanh chóng và hiệu quả.

Ngôn ngữ lập trình Python được lấy tên từ nhóm hài kịch Monty Python


   2. NỀN TẢNG VỮNG CHẮC

Python có thể tạo nền tảng vững chắc để bạn tiến vào thế giới lập trình. Các nhà tuyển dụng đang tìm kiếm những lập trình viên full-stack và Python sẽ giúp bạn đáp ứng được yêu cầu đó. Python là một ngôn ngữ hướng đối tượng, giống như Javascript, C++, C#, Perl, Ruby,... và những ngôn ngữ lập trình lớn khác. Đối với những ai đang có kế hoạch để trở thành nhà phát triển phần mềm, thì việc học ngôn ngữ này sẽ giúp bạn thích nghi dễ dàng với các môi trường khác.

Cụ thể, kinh nghiệm làm việc với Python có thể là một nền tảng vững chắc bởi vì các phương thức của Python có thể được sử dụng trong một loạt các ứng dụng. Ví dụ, Tổ chức mã nguồn và cấu trúc của Python có thể hoạt đông như Rosetta Stone khi cố gắng giải mã ngôn ngữ lập trình bí ẩn hơn.
Sau đây là một so sánh ngắn của Python với hai ngôn ngữ khác: Ruby và PHP. Ruby có cấu trúc tương tự như Python trong khi PHP có cú pháp rất khác.

Vòng lặp "for" trên một danh sách [Python]:

Vòng lặp "each" với một mảng [viết bằng Ruby]:

Vòng lặp "while" trong Python:
Vòng lặp "while" trong PHP:
Nếu chưa có kinh nghiệm lập trình trước đây, bất cứ ai cũng có thể dễ dàng phát hiện những điểm tương đồng và khác biệt giữa cú pháp của Python và những ngôn ngữ khác. Dù sao đi nữa, một sự hiểu biết cơ bản về Python khiến cho việc nhảy qua Ruby dễ như trở bàn tay, và việc hiểu code PHP trở thành một nhiệm vụ dễ dàng hơn. Một khi bạn tìm hiểu về triết lý Python (Zen of Python), bạn có thể áp dụng thành công khi viết code trong bất kỳ ngôn ngữ nào.


3. THẾ LẬP TRÌNH RAPSBERRY PI THÌ SAO?

Biến công việc lập trình trở thành niềm vui là điều không hề dễ dàng chút nào, cho dù bạn là người mới bắt đầu, lập trình viên dày dặn, hoặc chỉ là trẻ em. Ngay cả những giáo viên nhiệt tình nhất cũng phải rất vất vả để cho học viên trở nên hào hứng khi học lập trình. Nhưng có một nơi mà lập trình luôn mang lại niềm vui: cầu nối thu hẹp khoảng cách giữa máy tính trừu tượng và các ứng dụng thực tế giờ đây được thực hiện dễ dàng bằng Pi.

Raspberry Pi là một máy tính siêu nhỏ giá rẻ có kích thước bằng một tấm card, đang được sử dụng rộng rãi để tạo ra những thứ thú vị như robot, ô tô điều khiển từ xa, và video game console. Với Python là ngôn ngữ lập trình chính của nó, Raspberry Pi đang được sử dụng rộng rãi ngay cả bởi trẻ em để tạo ra các radio, máy ảnh, robot đối kháng, hay cả máy cho thú cưng ăn... 
Với chứng cuồng Raspberry Pi có xu hướng ngày càng tăng, có vô số các dự án DIY, tài liệu hướng dẫn, và sách trên internet để bạn lựa chọn. Chúng sẽ giúp bạn đi từ chương trình "hello world" đến một cái gì đó mà bạn có thể thực sự tự hào. Mặc dù bạn sẽ không thể xây dựng một mini Voltron trong tương lai gần, cảm giác hài lòng khi hoàn thành một dự án DIY sẽ thúc đẩy bạn tiến xa hơn trong việc học tập.



   4. TIỀN TIỀN VÀ TIỀN

Nếu việc thiết kế một con robot biết hát ngẫu nhiên những bài hát của Gun N' Rose bằng Raspberry Pi và Python vẫn chưa làm bạn thấy hài lòng, vậy còn triển vọng của việc làm dày túi tiền của bạn hơn chỉ với ngôn ngữ Python thì như thế nào? Các công ty như Google, Yahoo!, Disney, Nokia, và IBM đều sử dụng Python. Trong thực tế, trong số các ngôn ngữ lập trình, Python có sự tăng trưởng lớn nhất ở số lượng việc làm - luôn ở mức 19%  - (tháng 3, 2013) 

Đáng chú ý, nhu cầu tuyển dụng chung cho các chuyên viên IT giảm 5% so với năm trước (tháng 1 - 2014), nhưng nhu cầu tuyển dụng các lập trình viên Python được tăng thêm tới 8,7%. Tại NewYork, các developers Python đứng thứ 8 trong bảng xếp hạng nhu cầu tuyển dụng nhân viên công nghệ cao, với mức lương trung bình là 106 000 $/ năm. Ở bên kia Đại Tây Dương, nhu cầu tuyển dụng lập trình viên Python cũng rất cao, như trong biểu đồ sau đây:



    5. NHIỀU WEBSITE LỚN SỬ DỤNG

Phát triển web vẫn là một mảnh đất màu mỡ, là "một nền kinh tế bùng nổ" dành cho các lập trình viên. Bạn có thể sử dụng Python trong nhiều lĩnh vực khác nhau. Django - là một web framework mã nguồn mở phổ biến được viết bằng Python - là nền tảng của các trang web lớn như Pinterest, The New York Times, The Guardian, Bit Bucket, và Instagram. Django là một framework hoàn chỉnh và khá phức tạp trong phát triển web nhưng vẫn đem lại cho bạn nhiều sự kiểm soát như bạn muốn. Là một framework mã nguồn mở, tất cả các thông tin bạn cần để bắt đầu có thể được tìm thấy tại DjangoProject.com.

Python là ngôn ngữ kịch bản duy nhất bạn cần để bắt đầu thiết kế trang web và các ứng dụng của riêng mình. Những gì là đúng với Python thì cũng đúng với Django. Phát triển web với Django có nhiều tài liệu và một cộng đồng hỗ trợ lớn, giúp bạn mất rất ít thời gian để viết code. Với Django, những ý tưởng tuyệt vời có thể trở thành sản phẩm thực tế một cách nhanh chóng, tiết kiệm hàng giờ code. 
Điều này giúp bạn có nhiều thời gian hơn đê cải thiện các concept của mình, và biến chúng trở thành các sản phẩm cao cấp và chuyên nghiệp! Hơn nữa, Django không phải là framework phát triển duy nhất dành cho các lập trình viên Python. Có rất nhiều framework Python khác mà bạn có thể khám phá.


HÃY BẮT ĐẦU HỌC VÀ LÀM VIỆC VỚI PYTHON NGAY HÔM NAY!

Tại sao lại là Python? Vì nó rất dễ học và sẽ cung cấp cho bạn một kiến thức nền tảng để bạn có thể chuyển sang các ngôn ngữ khác. Một thiết bị ngoại vi như Raspberry Pi sẽ giúp bạn nhận ra Python có thể được sử dụng theo một cách rất thú vị và vui nhộn. Cuối cùng, với các công cụ phát triển web như Django, Python có thể giúp bạn biến bất kỳ ý tưởng kiếm tiền nào trở thành hiện thực.


Nếu đã cảm thấy thích Python, minh xin trích dẫn một số công cụ và diễn đàn học tập python:
 - Cộng đồng Python Việt Namhttp://pythonvietnam.info/index.php
 - Các khóa học Python online trên CodecademyCoursera
 - Web hỗ trợ học tập Tutorialspoint: http://www.tutorialspoint.com/python/index.htm
 - Series dạy lập trình Python của anh Lê Trần Đạthttps://www.youtube.com/playlist?list=PLyiioioEJSxEh_S_XFvG0d2xKRMSWLfN_
 - Bài chỉ dẫn Python: http://www.vithon.org/tutorial/2.5/tut.html
 - Tài liệu, ebook: http://sinhvienit.net/forum/ebook-ve-lap-trinh-python.265250.html 

Trên là bài viết về 5 lý do để chọn Python làm ngôn ngữ lập trình đầu tiên được dịch lại và một số công cụ để bước đầu học lập trình Python. 
Chào các bạn, và chúc các bạn học tốt!


Chào các bạn!
Hôm nay mình xin giới thiệu với các bạn cách thêm control động hay còn gọi là dynamic control trong C# windows form.


GIỚI THIỆU

Trong nhiều chương trình, đôi khi bạn cần tạo thêm một control mới ngay trong lúc chương trình đang thực thi, hoặc xóa một control hiện có sẵn.
Vậy thì làm thế nào? Lấy đâu ra giao diện thiết kế của Visual Studio để thêm?
Khi đó ta phải sử dụng control động (Dynamic controls)

Dynamic control trong lập trình C#

Visual Studio .NET không có mảng chứa control như Visual Basic 6.0. Nhưng tin vui là bạn vẫn có thể tự thiết lập để làm những điều tương tự. Các ưu điểm của C# Dynamic controls là chúng có thể được tạo ra để phản hồi với cách mà người dùng tương tác với các ứng dụng. Các control được thêm vào trong lúc chương trình thực thi thường là textbox hoặc button. Nhưng tất nhiên, hầu như tất cả các C# control đều có thể được tạo ra như là một dynamic control


LÀM THẾ NÀO ĐỂ TẠO CONTROL ĐỘNG TRONG C#

  • Đầu tiên các bạn cần khai báo một đối tượng Control (nhớ using các namespace cần thiết cho control cần dùng)
  • Thiết lập các thuộc tính cần thiết cho đối tượng vừa khai báo như: Vị trí (top, left, bottom, right), Text, Font, Color,....
  • Thêm control vào danh sách controls của form chứa nó.

Ta thực hành thôi :D 
Đầu tiên trong trình thiết kế, ta thêm một button, và cài đặt sự kiện click cho nó, mục đích khi bấm vào nút nó sẽ tự thêm một textbox mới như hình ở đầu bài.
Sau đó sử dụng đoạn code sau, và xem kết quả xảy ra nhé :) 

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int count = 1;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            AddNewTextBox();
        }

        public System.Windows.Forms.TextBox AddNewTextBox()
        {
            System.Windows.Forms.TextBox txt = new System.Windows.Forms.TextBox();
            this.Controls.Add(txt);
            txt.Top = count * 25;
            txt.Left = 100;
            txt.Text = "Icetea Viet TextBox " + this.count.ToString();
            count = count + 1;
            return txt;
        }
    }
}

   - Vậy là xong phần tạo. Tiếp theo là thao tác hoặc xóa controls. Để xóa control xác định thì bạn cần biết được một trong các thông tin sau (thứ tự của control đó trong list Controls của form, Key của control, Name hoặc Text của control...)
   - Bạn hãy tham khảo các method sau: this.Controls.RemoveAt(int index), this.Controls.RemoveByKey(string key),...

Hoặc các bạn có thể sử dụng vòng lặp foreach, duyệt qua tất cả các control trong list Controls và xét điều kiện
foreach (TextBox txtBox in this.Controls.OfType< TextBox >())
{
        if(txtBox.Text == "IceTea Viet")
        {
               //Do something
        }

        //other condition
}
Như vậy là ta đã biết cách tạo và sử dụng một dynamic control cho mình rồi.
Chúc các bạn học tốt, và nhớ để lại bình luận của mình bên dưới nhé :)



   Chào các bạn! 

    Đã lâu không trở lại với blog mình nhỉ :D dạo này mình lười quá, đồ án và deadline cũng nhiều. Thôi không dài dòng nữa, mình sẽ đi vào vấn đề chính.

   GIỚI THIỆU
   Đã bao giờ bạn nghĩ một phần mềm khi có quá nhiều control thì làm sao để quản lý nhanh các control đó. Hoặc khi có những "nhóm" các control phục vụ các chức năng liên quan đến nhau, khi cần show, hide chúng đồng loại lại phải gọi từng control??? 
   Panel đã ra đời để giải quyết vấn đề đó
   Panel dùng để tạo nhóm các control. Là một container với dạng một khung đơn giản để chưa các sub-control (button, textbox, ...) ở trong nó.




THUỘC TÍNH CỦA PANEL

   Cũng tương tự như các control khác Panel có những thuộc tính rất cơ bản.
   Lưu ý: Các sub-control nằm trong panel, thì sẽ bị ảnh hưởng bởi thuộc tính EnableVisible của panel. Cả hai thuộc tính này đều phụ thuộc vào thuộc tính của panel chứa nó. Đây cũng là lý do dùng panel để show/hide một cụm các control

   Có lẽ các bạn đang thắc mắc khi panel có những chức năng tương tự như Groupbox, vậy thi nó khác gì với groupbox mà chúng ta đã tìm hiểu qua các bài trước. Bạn hãy mở Properties của panel, xem và kiểm tra thử nhé


   Điểm khác nhau giữa Panel và Groupbox:
 - Panel có khả năng Scrollable trong khi groupbox thì không. Panel khi chứa nhiều control có kích thước quá lớn thì thanh cuộn sẽ hỗ trợ việc hiển thị các control đó.
 - Panel còn có hỗ trợ khung viền (borders) đa dạng hơn groupbox
 - Groupbox có thuộc tính Text, dùng làm Caption hiển thị trên đầu khung, trong khi Panel không có


THÊM CONTROL VÀO PANEL

   Để thêm control vào panel bạn có thể kéo thả control đó trực tiếp vào panel chứa nó. Hoặc sử dụng code để thêm
   Ví dụ: Với hàm sau
private void btnCreate_Click(object sender, EventArgs e)
{
        Panel dynamicPanel = new Panel();
        dynamicPanel.Location = new System.Drawing.Point(26, 12);
        dynamicPanel.Name = "Panel123";
        dynamicPanel.Size = new System.Drawing.Size(228, 200);
        dynamicPanel.BackColor = Color.LightBlue;
        dynamicPanel.BorderStyle = BorderStyle.Fixed3D;

        TextBox textBox1 = new TextBox();
        textBox1.Location = new Point(10, 10);
        textBox1.Text = "Học lập trình cùng IceTea Việt";
        textBox1.Size = new Size(200, 30);

        CheckBox checkBox1 = new CheckBox();
        checkBox1.Location = new Point(10, 50);
        checkBox1.Text = "Check Me";
        checkBox1.Size = new Size(200, 30);

        dynamicPanel.Controls.Add(textBox1);
        dynamicPanel.Controls.Add(checkBox1);

        Controls.Add(dynamicPanel);
}
   Kết quả trước và sau click button sẽ là:





TỔNG KẾT

Panel control là một container hay hay là một cơ chế nhóm control trong C# WinForms, và phù hợp cho cả mục đích hình ảnh giao diện và logic chương trình. Với nhiều phong các border, bạn có thể  tổ chức giao diện các sub-control trong panel. Và vì khả năng điều khiển các thuộc tính của các sub-control bạn có thể làm giảm độ phức tạp của code cho chương trình.

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


Chào các bạn!

Hôm nay mình xin chia sẻ một số kinh nghiệm học tập của mình khi là sinh viên năm nhất. Lưu ý, với trình độ giới hạn của mình thì những chia sẽ này chỉ dành cho các bạn mới bắt đầu bước vào lập trình thôi nhé :D


   TÌM KIẾM BẠN BÈ


Các bạn nên sớm tìm kiếm cho mình một nhóm bạn cùng sở thích, tính cách để cùng nhau giúp đỡ trong việc học tập. Bởi vì môi trường và cách thức học tập ở Đại học khác rất nhiều so với phổ thông. 
Và bạn cũng không thể nào ôm trọn tất cả các môn mà học tốt được. Bạn cần thời gian để học những thứ mới, lạ, và cần thiết cho chuyên ngành mình hơn là ôm trọn các môn đại cương.

ĐI HỌC ĐẦY ĐỦ




  • Sinh viên năm nhất thì giờ tốt nhất là đi học đầy đủ, đừng bỏ bất cứ một buổi nào mặc dù kiến thức buổi đấy đã biết rồi. Bạn đừng nên chú trọng vào sách vở, cũng đừng nên ỉ lại vào quyển đề cương, vì nếu bạn không siêng thì 2 thứ đấy bạn cũng sẽ không bao giờ đụng tới đâu :)
  • Đến lớp đầy đủ cũng chưa đủ, phải rèn luyện kỹ năng mềm, giao tiếp, thuyết trình, làm nhiều bài tập, luyện tập và tự đề ra mục tiêu cho chính mình (tuần 1 học for, tuần 2 học switch - case,...) , cứ thế thì bạn sẽ nắm được cơ bản và dễ dàng đi sâu vào trong lĩnh vực.
  • Cố gắng làm cho bảng điểm càng đẹp càng tốt và vẫn có thời gian để học lập trình sẽ tốt cho CV của các bạn sau này khi đi xin việc

HỌC TIẾNG ANH, ĐỌC SÁCH ĐỌC TIN TỨC CÔNG NGHỆ MỚI




  • Các bạn cũng biết thời đại hội nhập, ngoại ngữ là cần thiết cho bất kì sinh viên nào, nhất là IT. Bởi vì phần lớn thời gian chúng ta làm việc trên môi trường hoàn toàn bằng tiếng Anh, đâu có IDE nào hỗ trợ tiếng Việt đâu nhỉ :D
  • Khi bạn giỏi tiếng Anh bạn sẽ dễ dàng tiếp cận với các cộng đồng hỗ trợ lập trình, các diễn đàn nước ngoài (như stackoverflow.comhttp://www.codeproject.com/http://www.cplusplus.com/), search lỗi, tài liệu bằng tiếng Anh thì sẽ dễ tìm hơn với ngành IT chúng ta
  • Đa số công ty khi tuyển dụng IT đều cần bạn nói tốt ngoại ngữ, dù bạn lập trình không tốt nhưng vốn ngoại ngữ và giao tiếp tốt thì bạn sẽ chắc chắn thành công ngang hoặc hơn người giỏi lập trình mà ngoai ngữ lại quá tệ
  • Sách học lập trình cũng đa phần là tiếng Anh mới hay và chất, còn sách tiếng Việt thì ít thấy quyển nào thực sự là hay. Sẵn đang nói về sách mình giới thiệu luôn. Quyển C++ Primer Plus là một quyển cũng hay. Quyển Code Complete là dành cho việc thiết kế và viết code hoàn chỉnh hơn. Nếu bạn muốn đầu tư C++ thì tiếp tục đọc quyển C++ Primer Plus. Còn nếu muốn học Code một cách chung / hoàn chỉnh thì đọc Code Complete. Nó bàn luận về cách lập trình tốt hơn, giống Clean Code. Các bạn có thể tham khảo 10 quyển sách lập trình "kinh điển" mà các lập trình viên đều nên đọc
    => Vậy nên hãy cố gắng học tiếng Anh hoặc tiếng Nhật để dễ học và dễ đi làm sau này hơn nhé


QUAN TRỌNG NHẤT: TẬP TRUNG NHIỀU VÀO CÁC MÔN CHUYÊN NGÀNH




  • Các bạn nên học và thành thạo các kiến thức nhập môn - kỹ thuật lập trình. Tài liệu các bạn có thể tham khảo ở đây
  • Tập trung học tư duy, rèn luyện các thuật toán (Sắp xếp, đệ qui, qui hoạch động,...)
  • Dành nhiều thời gian nghiên cứu cơ bản. Có thể nó sẽ chán, à mà không, rất chán. Nhưng bạn sẽ có lợi về sau đấy.
  • Bất cứ khi nào cảm thấy nhàm chán vì các kiến thức quá cơ bản, cứ làm đi làm lại với những cấu trúc chán ngắc, bạn nên tự đưa ra những project nho nhỏ, và hiện thực hóa nó bằng các kiến thức đã học (Ví dụ: Học các cấu trúc, đọc ghi file xong thì làm phần mềm quản lý học sinh, thư viên bằng Console, Học các thuật toán sắp xếp thì làm phần mềm so sánh thời gian thực thi của các loại Sort, Học đệ qui - qui hoạch động xong thì làm các bài thuật toán tám hậu, Mã đi tuần,....)
  • Các bạn cũng nên dành thời gian tham gia các diễn đàn dạy lập trình như daynhauhoc.comhttp://congdongcviet.com/
  • Dành thời gian tham gia các contest trên http://codeforces.com/ sẽ rèn cho bạn tư duy thuật toán và các giải quyết vấn đề một cách nhanh nhất
  • Và lưu ý, đối với các bạn chỉ mới bước chân vào lập trình thì năm nhất chỉ nên dừng ở mức độ thành thạo về một ngôn ngữ duy nhất là  C/C++ nó sẽ làm bàn đạp vững chắc cho các bạn sau này. (Đừng xem thường C/C++ nhé, nó khó hơn các ngôn ngữ khác đấy :D nếu học Master được C/C++ thì lương cao gấp 2, 3 lần lương LTV các ngôn ngữ khác)
  • Đối với các bạn nào đã được học lập trình khá tốt từ cấp ba cũng có thể học theo hướng trên và cộng thêm việc nghiên cứu sơ qua về một ngôn ngữ mới, công nghệ mới (như Java, C# .Net, Python,...) sẽ giúp ích cho các bạn sau này

--------------------------------------------------------------------------------------------------------------------------
 


Cuối cùng, sau khi kết thúc năm nhất đồng nghĩa với việc nghỉ hè, các bạn nên dành thời gian hè đó để suy nghĩ xem mình thích cái gì, mình giỏi cái gì, mình sẽ theo hướng lập trình mobile, hay lập trình web, hay học Khoa học máy tính, trí tuệ nhân tạo (AI),... Và bắt tay vào làm - học thử một ít để xem mình thực sự hứng thú với cái gì, và đâu sẽ là con đường dành cho tương lai mình :)

Bonus cho các bạn tấm ảnh này, hãy góp ý, chia sẻ cảm nghĩ, và bình luận phía dưới để hoàn thiện cho bài viết hơn nhé




   Chào các bạn! 
   Hôm nay mình lại tiếp tục Series lập trình C# winform căn bản kèm theo ví dụ thực tế


GIỚI THIỆU
   Một phần mềm hoàn chỉnh không phải lúc nào cũng đưa ra các thông báo cho người dùng bằng MessageBox được, vì khi đó người dùng cần phải ấn vào OK, hoặc tắt MessageBox đi, rất phiền phức. Có một cách khác để thông báo mà các phần mềm khác hay dùng đó chính là dùng control mà mình sẽ giới thiệu hôm nay - NotifyIcon.



   NotifyIcon thường thông báo khi ta đóng phần mềm xuống thanh Taskbar, hoặc thông báo thông tin về update phần mềm, hoặc thông báo thời gian thực thi của một lệnh (-shutdown -s -t chẳng hạn :D ). Cũng như các Control khác, NotifyIcon có các thuộc tính và sự kiện cơ bản.


THUỘC TÍNH CỦA NOTIFYICON



   Icon mình có thể thêm Icon tùy biến ở ngoài vào theo ý thích. Vì mình dùng Win10 nên tạm thời các demo đều là hình ảnh của Win 10 nên các bạn thông cảm.
   Ví dụ: Với đoạn code sau
//Icon trên khay hệ thống
notifyIcon1.Icon = SystemIcons.WinLogo; 

//Biểu tượng xuất hiện trên thông báo
notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; 

notifyIcon1.BalloonTipText = "IceTea Việt!";
notifyIcon1.BalloonTipTitle = "Thông báo!"; 

notifyIcon1.ShowBalloonTip(1000);
Thì kết quả sẽ là:

SỰ KIỆN CỦA NOTIFYICON
   
   NotifyIcon có các sự kiện hay dùng như sự kiện Click, DoubleClick. Và thường được dùng kèm với các sự kiện khác của Form.   Ví dụ: Ta muốn làm một thông báo khi đóng (Minimize) chương trình xuống, và khi hiện chương trình lại lại thông báo thêm lần nữa, ta thực hiện với đoạn code sau, với ShowBalloonTip(int_value) là lệnh hiển thị thông báo của NotifyIcon
private void YourForm_SizeChanged(object sender, EventArgs e)
{
        if(this.WindowState == FormWindowState.Minimized)
        {
            notifyIcon1.Icon = SystemIcons.WinLogo;
            notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;

            notifyIcon1.BalloonTipText = "IceTea Việt!";
            notifyIcon1.BalloonTipTitle = "Thông báo!"; 

            //Lệnh gọi thông báo ra màn hình với 1000 là thời gian hiển thị
            notifyIcon1.ShowBalloonTip(1000);
        }
        else if(this.WindowState == FormWindowState.Normal)
        {
            notifyIcon1.BalloonTipText = "Ứng dụng đã được mở lại";

            notifyIcon1.ShowBalloonTip(1000);
        }
            
}
   Thì khi đóng chương trình xuống Taskbar sẽ hiển thị thông báo Notification với tiêu đề là "Thông báo", nội dung là "IceTea Việt". Với thời gian hiển thị là 10 giây. Và tương tự  khi mở lại.
   Trên là những thông tin cơ bản về Control NotifyIcon của C#. Các bạn tham khảo nếu thiếu hay không hiểu gì cứ viêc pm hỏi mình, hoặc comment mình sẽ trả lời ngay.
   Như thường lệ là đoạn code để đoán kết quả:
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
 public Form1()
 {
     InitializeComponent();
 }

 private void Form1_Load(object sender, EventArgs e)
 {
     // When the program begins, show the balloon on the icon for one second.
     notifyIcon1.ShowBalloonTip(1000);
 }

 private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
 {
     // When icon is double-clicked, show this message.
     MessageBox.Show("Doing something important on double-click...");
     // Then, hide the icon.
     notifyIcon1.Visible = false;
 }
    }
}

TỔNG KẾT
   Đối với chương trình yêu cầu thông báo liên tục, NotifyIcon có thể giúp tích hợp vào hệ điều hành chức năng này. Bằng cách kết hợp các NotifyIcon với các balloonTip, bạn có thể đưa ra những cảnh báo, attention-grabbing hoặc tin nhắn.

Chào các bạn và hẹn gặp lại vào các bài sau!





GIỚI THIỆU

   Chào các bạn!
   Hôm nay mình xin giới thiệu với các bạn GroupBox, một Container dùng để "chứa" các Control khác. GroupBox có dạng hình chữ nhật, dùng gom nhóm các Control có liên quan lại với nhau.


   Chúng ta sẽ bắt đầu vào việc tạo một GroupBox, một GroupBox có thể được tạo từ thanh công cụ ToolBox -> Container


THUỘC TÍNH CỦA GROUPBOX

   Cũng tương tự như một số Control cơ bản khác, ở đây mình xin giới thiệu thuộc tính Dock hay dùng với GroupBox. Bạn có thể scroll chuột và tự tìm hiểu vì nó cũng rất đơn giản
- Top, Bottom, Left, Right: Nó sẽ đưa Groupbox của bạn lên từng góc cụ thể.
- Center: Mở rộng Groupbox, sao cho lấp đầy hết form.
- None: Mặc định, tắt chức năng Docking



SỰ KIỆN CỦA GROUPBOX

Sự kiện mặc định của groupBox là groupBox_Enter, sự kiện này được chạy khi Control chứa trong groupBox trở thành active control của Form. Ví dụ ta có Form như sau.
   Con trỏ ban đầu ở khung textBox, Khi ta tab nó chuyển sang các Control khác, và khi chuyển đến Button1 thì sự kiện Enter sẽ chạy, và mình đã xuất ra thông báo bằng MessageBox   
   Ngoài sự kiện này ra thì Groupbox còn nhiều sự kiện khác nhưng theo mình là không đáng để bận tâm tới

   Trên là những thứ cơ bản về Groupbox, mọi thắc mắc cứ liên hệ trực tiếp với mình. Như thường lệ là đoạn code đơn giản từ cái proj của mình cho các bạn đoán kết quả
public void ShowSearchForm(MainForm mainfrm)
{
       PopupForm search = new PopupForm(mainfrm);

       search.label.Text = "TÌM KIẾM HỌC SINH";

       search.groupBoxAdd.Visible = false;
       search.groupBoxEdit.Visible = false;
       search.groupBoxSearch.Visible = true;

       search.Show();
}


public void ShowAddForm(MainForm mainfrm)
{     
       PopupForm add = new PopupForm(mainfrm);

       add.label.Text = "THÊM HỌC SINH";

       add.groupBoxAdd.Visible = true;
       add.groupBoxEdit.Visible = false;
       add.groupBoxSearch.Visible = false;

       add.Show();
}

public void ShowEditForm(MainForm mainfrm)
{
       if(SelectedStudentId != "0")
       {
            PopupForm edit = new PopupForm(mainfrm);

            edit.label.Text = "SỬA HỌC SINH";

            edit.groupBoxAdd.Visible = false;
            edit.groupBoxEdit.Visible = true;
            edit.groupBoxSearch.Visible = false;

            edit.Show();
       }
       else
            MessageBox.Show("Chọn sinh viên cần sửa!", "Thông báo");
                 
}

TỔNG  KẾT

Groupbox không phải là một control thú vị trong lập trình C# Winform, nhưng chắc chắn nó là một control rất hữu dụng. Nó có thể giúp tạo một giao diện rõ ràng và dễ sử dụng cho chương trình của bạn
Chào các bạn, chúc các bạn học tốt!



Chào các bạn!

Hôm nay tiếp tục series lập trình winform cơ bản với ngôn ngữ C#, mình xin giới thiệu với các bạn một control mới rất hay sử dụng trong các Form đăng ký thông tin. Chính là ComboBox. 


GIỚI THIỆU

Một ComboBox hiển thị như một Textbox kết hợp với một Listbox, cho phép người dùng lựa chọn các mục từ danh sách hoặc nhập một giá trị mới.




THUỘC TÍNH CỦA COMBOBOX

   ComboBox cũng có các thuộc tính giống như các Control cơ bản khác. Nhưng có thêm các thuộc tính mới dạng DropDown như DropDownStyle, DropDownWidth, MaxDropDownItems...
Thuộc tính cơ bản của Control

- DropDownStyle: Thuộc tính DropDownStyle xác định các mà danh sách được hiển thị. Thuộc tính DropDownStyle cũng xác định xem phần văn bản có thể được chỉnh sửa hay không.
Với:
- Simple: hiện ngay list item có sẵn.
- DropDownList: là danh sách hiện ra cố định, không thể tự nhập/chỉnh sửa item trong ComboBox.
DropDown: có thể thêm item mới bằng tay và chỉnh sửa Item đã chọn.

Các bạn hãy thử chỉnh sửa các thứ này ngay trong code của mình:
Vd: 
comboBox1.DropDownStyle = ComboBoxStyle.DropDown;

  
 - MaxDropDownItems: Xác định số lượng Item tối đa khi mở danh sách sẽ hiện ra cho các bạn


PHƯƠNG THỨC CỦA COMBOBOX

   Phương thức thường thấy nhất là các phương thức thêm/xóa/sửa dữ liệu trong ComboBox. Để thêm vào ta dùng phương thức Add, để xóa tất cả Item đã thêm ta dùng phương thức Clear, để xóa item cụ thể ta dùng phương thức Remove,...
//Thêm dữ liệu
comboBox1.Items.Add("IceTea Việt");
comboBox1.Items.Add("Lập trình cuộc sống");
comboBox1.Items.Add("Xe đạp");

//Xóa dữ liệu cụ thể bằng chính Text của dữ liệu đó
comboBox1.Items.Remove("Xe đạp");
//Ta cũng có thể xóa theo chỉ số của item đó trong List dữ liệu
comboBox1.Items.RemoveAt(2); //Xóa item thứ 3 trong dữ liệu, vì 2 là index
 
   LẤY DỮ LIỆU TỪ COMBOBOX: 
   Có thể lấy dữ liệu băng nhiều cách, tham khảo đoạn code sau
//Lấy trực tiếp từ thuộc tính Text của ComboBox
//Nhưng nếu ComboBox chưa được chọn thì sẽ không có giá trị
string var;
var = comboBox1.Text;

//Lấy giá trị qua thuộc tính SelectedItem
var item = this.comboBox1.GetItemText(this.comboBox1.SelectedItem);
//Hoặc lấy theo Text mình muốn
var item = this.comboBox1.GetItemText(this.comboBox1.FindStringExact("Xe đạp"));

SỰ KIỆN CỦA COMBOBOX
   Sự kiện của ComboBox không nhiều, sự kiện mặc định của nó là comboBox_SelectedIndexChanged, xảy ra khi chúng ta chọn một Item mới trong ComboBox.

   Bài viết về ComboBox mình đến đây là dài đối với các bạn rồi, mình còn một sô vấn đề muốn nói về ComboBox nữa, thôi thì để bài sau vậy.
Như thường lệ là một đoạn code để các bạn đoán kết quá. Đoạn này có vẻ dễ nhỉ :D
private void Form1_Load(object sender, EventArgs e)
{
        comboBox1.Items.Add("weekdays");
        comboBox1.Items.Add("year");
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
        comboBox2.Items.Clear();
        if (comboBox1.SelectedItem == "weekdays")
        {
            comboBox2.Items.Add("Sunday");
            comboBox2.Items.Add("Monday");
            comboBox2.Items.Add("Tuesday");
         }
         else if (comboBox1.SelectedItem == "year")
         {
            comboBox2.Items.Add("2012");
            comboBox2.Items.Add("2013");
            comboBox2.Items.Add("2014");
         }
}
   
TỔNG KẾT
   
Bằng cách kết hợp Textbox và một danh sách drop-down thông thường, Combobox đại diện cho một control thực sự hữu ích, một hybrid widget trong C# Winform. Nó cũng tạo ra ý tưởng về các hộp thoại dialogs, nơi mà sẽ có các gợi ý cho người dùng từ danh sách drop-down và lại chấp nhận được tất cả giá trị input bất kì

   Bài sau về ComboBox mình sẽ gửi đến các bạn cách gán một DataSource với ComboBox, AutoComplete với ComboBox, ở một cách nhìn đơn giản nhất :D Có lẽ mình sẽ viết bài đó sau khi hướng dẫn cho các bạn một chút về DataSet, DataTable

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


    
     Chào các bạn!
     Là 1 developer, nếu không học lập trình từ sách thì bạn đã bỏ lỡ 1/2 sự nghiệp của mình. Nhiều bạn cho rằng developer thì cần quái gì đọc sách, code nhiều là giỏi thôi. Vâng nó khá đúng vì các cụ xưa nay có câu "practice make perfect"! Tuy nhiên làm nhiều cũng phải có phương pháp, đúng cách mới tốt được. Nếu cứ cắm đầu cắm cổ code theo 1 kiểu mãi thì sẽ không bao giờ khá lên được đâu!
     Về sách mình đọc cũng kha khá, từ sách tiểu thuyết đến sách lập trình. Theo cuốn Code Complete thì trung bình mỗi developer đọc ít hơn 1 cuốn sách mỗi năm. Vậy nếu bạn đọc 1 quyển/năm thì bạn đã giỏi hơn 90% dev rồi đó =)). Nhân dịp Win10 vừa ra bản RTM, Icetea Việt chọn lọc 10 programming books bằng tiếng Anh về design, C, C#, C++, HTML, Cloud Computing, Java, JavaScript,.. dựa theo danh sách mình sưu tầm được từ blog Coding Honor và nhiều nguồn khác!


TẠI SAO PHẢI ĐỌC SÁCH

     Khi lần đầu tiên chọn lọc danh sách này, bạn biết mình nghĩ gì không ạ? Lúc đó mình nghĩ rằng đúng là chết tiệt thật, giá như mình biết được danh sách này sớm hơn. Bởi trước đó vì không ai bày cho nên đọc sách gì, nên mình đã cắm cổ đọc sách về một công nghệ nhất định nào đó như là ASP.NET, JAVA, PHP,... như điên. Mình thức cả đêm để download hàng trăm cuốn sách, hàng chục GB tài liệu rồi cuối cùng bỏ đó. Và cách đọc sách của mình cũng sai nữa, vớ được cuốn nào là mình đọc hùng hục từ đầu đến cuối, có khi hứng lên còn đọc luôn cả phần lời cảm ơn nữa! :)
     Sau này mình mới biết có những cuốn kinh điển như “Code Complete 2″ là sách gối đầu giường của các lập trình viên Âu Mỹ cho đến Ấn Độ, Họ hay đọc các quyển sách về tư duy, giải thuật, phong cách lập trình. Mình nghĩ cuốn này nên dịch ra để làm giáo trình cho sinh viên đại học CNTT ở Việt Nam thì tốt biết mấy.
Bạn đã có cuốn sách để đầu giường cho riêng mình?

1. Code Complete 2 – Steve McConnell


     Cuốn sách Code Complete 2 của tác giả Steve McConnell đối với các nhà phát triển phần mềm thì cũng nổi tiếng như cuốn Joy of Cooking dành cho các chuyên gia đầu bếp vậy. Đọc nó nghĩa là bạn yêu thích công việc của mình, bạn có thái độ nghiêm túc về cái bạn làm, và bạn muốn làm cho nó trở nên tốt hơn. Trong Code Complete, tác giả Steve ghi chú rằng lập trình viên trung bình đọc ít hơn một cuốn sách kỹ thuật mỗi năm. Và với việc đọc cuốn sách này thì đã giúp kéo bạn ra xa khỏi 90% các đồng nghiệp của còn lại. Dĩ nhiên là theo hướng tốt hơn.
     Nếu bạn muốn trở thành một dev chuyên nghiệp thì nên đọc quyển này, vì nó dạy cho bạn tư duy xử lý vấn đề. Từ cách thiết kế class, đến cách đặt tên biến, method,...     

2Advanced Linux Programming – CodeSourcery LLC , Mark L. Mitchell, Alex Samuel, Jeffrey Oldham


     “Advanced Linux Programming có đầy đủ thông tin từ thread management, interprocess communication, shared memory, devices, cho đến implementing inline assembly code… Đây là một quyển sách PHẢI ĐỌC dành cho người muốn biết về Linux
     “Quyển sách này đúng là đáng kinh ngạc. Mọi thông tin và ví dụ thực tế đều được chứa đựng trong hơn 300 trang sách. Tôi được hướng dẫn từng bước căn bản từ tạo basic applications, shared & static libraries, sockets, pipes & security, forks/threads đến nhiều ví dụ cụ thể về synchronization mechanisms.”

3. The Mythical Man-Month: Essays on Software Engineering, Anniversary Edition (2nd Edition)


     Có nhiều ý kiến cho rằng đây là cuốn sách “kinh điển” duy nhất trong lĩnh vực phát triển phần mềm của chúng ta. Nó như là "Kinh Thánh" trong giới dev và PM. Nếu bạn vẫn chưa đọc nó, thì thật đáng hổ thẹn.
Tôi thách thức bất kỳ lập trình viên nào đọc cuốn The Mythical Man Month mà lại không tìm thấy câu chuyện về một hệ điều hành không tồn tại nữa, và nhóm người đã phát triển ra nó, rất đáng ngạc nhiên là chúng lại rất liên quan đến vấn đề của bạn ngày nay. Cuốn sách 30 năm tuổi đã minh họa sâu sắc một quan điểm rằng: máy tính có thể thay đổi, nhưng con người thì không. Bằng chứng là những gì quyển sách đã nói cách đây 30 năm đến giờ vẫn còn chính xác!
     Đọc cuốn sách kinh điển này chắc chắn sẽ tốt hơn rất nhiều việc bạn sử dụng thời gian để nghiền ngẫm trên hàng ngàn trang tài liệu kỹ thuật mới nhất hiện nay. Tuy không giúp bạn code giỏi hơn, nhưng giúp bạn có cái nhìn tổng quan về ngành Công nghệ phần mềm!

4. C# Yellow Book – Rob Miles

     “Nếu bạn chưa bao giờ lập trình thì đây là cuốn sách dành cho bạn – beginner – với nhiều hướng dẫn cực kỳ dễ theo dõi… Phần lớn topic về C# đều được tác giả đề cập đến trong C# Yellow Book nhưng những vấn đề “khó nhằn” nhất thì lại bị bỏ qua.”
     “Quyển sách này không chỉ dạy bạn những điều căn bản về C# programming mà còn nhiều lý thuyết lập trình khác. Nếu bạn muốn học lập trình thì đây là 1 khởi đầu đúng đắn dành cho bạn.

5. Clean Code: A Handbook of Agile Software Craftsmanship – Robert C. Martin


     Tất cả ví dụ trong sách là của Java, nhưng phần hướng dẫn có thể được áp dụng trong hầu hết các trường hợp, ngôn ngữ khác nhau.”
“Chương khó nhất và cũng giá trị nhất là ‘Refactoring of the class SerialDate’ (từ thư viện JCommon.) Nó là một ví dụ thực tế và tác giả đã mô tả từng bước refactoring để người đọc dễ nắm bắt hơn. Chương cuối cùng, ‘Smells và Heuristics’ là 1 kết thúc tốt trình nêu nhiều vấn đề tiềm năng và đề xuất cách giải quyết /giảm thiểu chúng.”

6. Don’t Make Me Think: A Common Sense Approach to Web Usability

     Một cuốn sách rất hay về thiết kế giao diện. Sách viết về usability (tính dễ sử dụng của phần mềm). Tác giả Steve Krug đã bao quát mọi khái niệm quan trọng về usability trong cuốn sách này, và ông làm công việc đó rất tốt. Sách không dạy các bạn thiết kế giao diện sao cho đẹp, nhưng nó dạy chúng ta cách thiết kế đơn giản, dễ sử dụng, không gây khó khăn cho người dùng. Đọc cuốn sách này thì rất vui. Nếu bạn chọn đọc chỉ một cuốn sách về usability, thì hãy lựa chọn cuốn này. Nó chứa rất nhiều thông tin tuyệt vời, và hình thức trình bày thì ngắn gọn súc tích, dễ áp dụng theo. Nó phù hợp với bất kỳ độc giả nào: dân kỹ thuật, không phải dân kỹ thuật, người dùng bình thường, lập trình viên, nhà quản lý v.v…
     Nó đưa ra một qui tắc rất đơn giản khi thiết kế giao diện: người dùng rất lười, hãy thiết kế sao cho người dùng ít phải suy nghĩ nhất. Và về sự đắt giá của giao diện người dùng, chỉ cần thay đổi 1 button có thể tăng doanh thu lên đến 500 000$ trong 1 năm!

7. Core HTML5 Canvas: Graphics, Animation, and Game Development (Core Series) –David Geary


Flash hiện đang chết - và bây giờ là thời đại của HTML5??? 
     Như chúng ta đều biết thì dạo này Flash rất hay bị tấn công, lỗi và bị chặn trên đa số trình duyệt, các ông lớn là Facebook và Google cũng đang dần chuyển sang HTML5, vậy dại gì mà chúng ta không thử tìm hiểu 1 chút về các lợi ích của chúng?
     “Cuốn sách này cực kỳ chi tiết và hướng dẫn của tác giả cũng đúng vào những điều trọng tâm nhất.” Chương 1 bao gồm các yếu tố cần thiết của canvas element như event handling, sử dụng HTML element trong canvas element, in canvas. Chương 2 giới thiệu cách vẽ canvas. David bắt đầu với những điều cơ bản như vẽ hình học căn bản và từng bước nâng kỹ thuật lên bằng cách sử dụng bezier curves, path manipulation, và transformations.”
     “David hướng dẫn người đọc qua nhiều ví dụ bằng hình ảnh, video, animation, sprites, game physics và mobile development. Code trong ví dụ của ông rõ ràng và được trình bày theo thứ tự với nhiều màu sắc khác nhau… Mặc dù Core HTML 5 Canvas tập trung vào game development nhưng mọi thông tin trong sách đều có ích cho mọi application developer.”

8. C++ GUI Programming With Qt 3 – Jasmin Blanchette và Mark Summerfield


     “6 chương đầu tiên cung cấp một nền tảng rất vững chắc về Qt. Các chương nổi bật gồm: chương 1 cung cấp kiến thức nền tảng vững chắc về Qt, chương 3 nói về modeless application development với nhiều ví dụ dễ hiểu, và chương 6 nói về layout management.”
    “Qt là 1 application framework đòi hỏi bạn phải đối mặt với vấn đề về files, sockets, và network programming. Quyển sách này giúp bạn giải quyết tất cả những vấn đề đó.”

9. JavaScript: The Good Parts – Douglas Crockford

     “Đây là quyển sách dành cho người có nhiều năm kinh nghiệm lập trình, muốn tìm hiểu cách tốt nhất để tạo và sử dụng objects, arrays, types, v.v… Kinh nghiệm của Crockford về JavaScript hướng dẫn tôi nhiều kỹ thuật, style coding thực tế.”
     “Quyển sách mỏng nhưng cực kỳ đầy đủ thông tin với nhiều lời khuyên hữu ích đến từ vô số developer có kinh nghiệm lập trình JavaScript trong nhiều năm. Tôi đồng ý và không đồng ý với Crockford ở một vài quan điểm, nhưng những quan điểm của ông đáng để đọc và suy ngẫm rồi rút ra ý kiến của riêng mình.“

10. The Design of Everyday Things - Donald A Norman

     Công việc phát triển phần mềm có thể làm bạn nản lòng đến mức khó tin, bởi vì có quá nhiều thứ có thể trở nên sai sót. Có rất nhiều thứ chúng ta làm là để phòng thủ: cố gắng đoán trước điều gì sẽ trở nên sai trước khi nó xảy ra. Nó là nguyên nhân làm bạn kiệt sức về tinh thần, và thậm chí có thể biểu lộ bản thân theo một số cách khá tiêu cực. Đôi khi tôi mô tả công việc này với những người không chuyên về kỹ thuật như thể tôi đang tạo ra một cái đồng hồ với hàng ngàn chi tiết nhỏ, tất cả chúng có thể hỏng một cách ngẫu nhiên vì những kích thích nhỏ nhất.



Sau khi xem qua danh sách này thì chúng ta hãy cùng đọc lại một đoạn trong bài viết của một lập trình viên khá nổi tiếng tại Ấn Độ nhé:
“Cũng giống như ngoài đại dương bao la kia, phía trên bề mặt thì sóng rất dữ dội nhưng ở mực nước sâu thì mọi thứ tương đối yên tĩnh, phẳng lặng và hầu hết các sinh vật sống và phát triển tại đây. Vì thế, hãy tự cảm nhận rằng mình đang ở mực nước sâu và tiến gần với những công nghệ cốt lõi. Bạn hãy dành nhiều thời gian để học về những khái niệm cốt lõi hơn là cứ ngồi đó mà lo lắng về những framework và công cụ luôn thay đổi xoành xoạch xung quanh nó. Cùng với nền tảng vững chắc của những kiến thức cốt lõi, bạn sẽ luôn dễ dàng học được những framework, công cụ và các API mới.”
Chào các bạn và chúc các bạn học tốt! 


Contact Form

Name

Email *

Message *

Powered by Blogger.
Javascript DisablePlease Enable Javascript To See All Widget